shadow-claw 1.59.6 → 1.59.7
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 +12 -4
- package/.well-known/mcp.json +12 -4
- package/dist/cli/build/build.js +1 -1
- package/dist/cli/{chunk-DM4xsTry.js → chunk-3vNYrs_L.js} +1 -1
- package/dist/cli/{chunk-Ctg5L55n.js → chunk-66BvqAV0.js} +1 -1
- package/dist/cli/{chunk-Bq38OubR.js → chunk-B0qusANw.js} +1 -1
- package/dist/cli/{chunk-yiVdvGCJ.js → chunk-B3TrWbca.js} +7 -7
- package/dist/cli/{chunk-C8DBACtx.js → chunk-B88Z8T_9.js} +1 -1
- package/dist/cli/chunk-BCjL0JXf.js +1 -0
- package/dist/cli/chunk-BNcu1oiT.js +1 -0
- package/dist/cli/{chunk-gvNsvav0.js → chunk-C5ypckWC.js} +7 -7
- package/dist/cli/{chunk-Dw8GndPD.js → chunk-CAAeGOdy.js} +1 -1
- package/dist/cli/chunk-CFxww5Yz.js +1 -0
- package/dist/cli/chunk-CGIgtL6R.js +1 -0
- package/dist/cli/{chunk-DJqHK-qS.js → chunk-CQaCgswD.js} +7 -7
- package/dist/cli/chunk-CZdCRqNe.js +7 -0
- package/dist/cli/chunk-CafdvLx-.js +1 -0
- package/dist/cli/{chunk-Bc_weULz.js → chunk-CncW6_WL.js} +1 -1
- package/dist/cli/chunk-DDvuLVfW.js +1 -0
- package/dist/cli/{chunk-Cq_kQohv.js → chunk-DMs7kREC.js} +1 -1
- package/dist/cli/{chunk-CX2itile.js → chunk-D_te8ufL.js} +1 -1
- package/dist/cli/{chunk-3wTukVof.js → chunk-DhOU6GYX.js} +1 -1
- package/dist/cli/chunk-Dhap1VwA.js +1 -0
- package/dist/cli/chunk-DwvavohW.js +1 -0
- package/dist/cli/{chunk-DLde6nuO.js → chunk-SRBRVorc.js} +1 -1
- package/dist/cli/{chunk-D3y7h9Xe.js → chunk-SxK79JmB.js} +1 -1
- package/dist/cli/chunk-_a0CkUNS.js +139 -0
- package/dist/cli/{chunk-C9o6lXP3.js → chunk-hVf839t7.js} +1 -1
- package/dist/cli/chunk-iB8OoMmW.js +7 -0
- package/dist/cli/cli.js +1 -1
- package/dist/headless-agent.js +1 -1
- package/dist/lib/{app-routes-DJdIjp2V.js → app-routes-BXiRvlNl.js} +7 -25
- package/dist/lib/{app-routes-DJdIjp2V.js.map → app-routes-BXiRvlNl.js.map} +1 -1
- package/dist/lib/{attachment-capabilities-Dbb-4ZP5.js → attachment-capabilities-BjkEPip8.js} +2 -2
- package/dist/lib/{attachment-capabilities-Dbb-4ZP5.js.map → attachment-capabilities-BjkEPip8.js.map} +1 -1
- package/dist/lib/{channel-Dlru5ofR.js → channel-mmdGzPkT.js} +3 -3
- package/dist/lib/{channel-Dlru5ofR.js.map → channel-mmdGzPkT.js.map} +1 -1
- package/dist/lib/{chat-template-BuuLY8l7.js → chat-template-DPEKGJhB.js} +2 -2
- package/dist/lib/{chat-template-BuuLY8l7.js.map → chat-template-DPEKGJhB.js.map} +1 -1
- package/dist/lib/{compact-context-BtR55YPU.js → compact-context-CY9BBlUQ.js} +19 -19
- package/dist/lib/{compact-context-BtR55YPU.js.map → compact-context-CY9BBlUQ.js.map} +1 -1
- package/dist/lib/components/common/shadow-claw-provider-model-picker.js +1 -1
- package/dist/lib/components/index.js +27 -27
- package/dist/lib/components/settings/shadow-claw-accounts.js +1 -1
- package/dist/lib/components/settings/shadow-claw-channel-config.js +1 -1
- package/dist/lib/components/settings/shadow-claw-control-plane.js +1 -1
- package/dist/lib/components/settings/shadow-claw-git.js +1 -1
- package/dist/lib/components/settings/shadow-claw-integrations.js +1 -1
- package/dist/lib/components/settings/shadow-claw-llm.js +1 -1
- package/dist/lib/components/settings/shadow-claw-mcp-remote.js +1 -1
- package/dist/lib/components/settings/shadow-claw-networking.js +1 -1
- package/dist/lib/components/settings/shadow-claw-notifications.js +1 -1
- package/dist/lib/components/settings/shadow-claw-peerjs.js +1 -1
- package/dist/lib/components/settings/shadow-claw-storage.js +1 -1
- package/dist/lib/components/settings/shadow-claw-task-server.js +1 -1
- package/dist/lib/components/settings/shadow-claw-webvm.js +1 -1
- package/dist/lib/components/shadow-claw-a2ui.js +1 -1
- package/dist/lib/components/shadow-claw-accounts.js +1 -1
- package/dist/lib/components/shadow-claw-channel-config.js +1 -1
- package/dist/lib/components/shadow-claw-channels.js +1 -1
- package/dist/lib/components/shadow-claw-chat.js +1 -1
- package/dist/lib/components/shadow-claw-control-plane.js +1 -1
- package/dist/lib/components/shadow-claw-conversations.js +1 -1
- package/dist/lib/components/shadow-claw-file-viewer.js +1 -1
- package/dist/lib/components/shadow-claw-files.js +1 -1
- package/dist/lib/components/shadow-claw-git.js +1 -1
- package/dist/lib/components/shadow-claw-integrations.js +1 -1
- package/dist/lib/components/shadow-claw-llm.js +1 -1
- package/dist/lib/components/shadow-claw-mcp-remote.js +1 -1
- package/dist/lib/components/shadow-claw-networking.js +1 -1
- package/dist/lib/components/shadow-claw-notifications.js +1 -1
- package/dist/lib/components/shadow-claw-page-header.js +1 -1
- package/dist/lib/components/shadow-claw-pages.js +1 -1
- package/dist/lib/components/shadow-claw-peerjs.js +1 -1
- package/dist/lib/components/shadow-claw-provider-model-picker.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-DxNI3TlW.js → config-BrHR97zt.js} +2 -2
- package/dist/lib/{config-DxNI3TlW.js.map → config-BrHR97zt.js.map} +1 -1
- package/dist/lib/{configure-peer-js-ChDhOZU4.js → configure-peer-js-ccNvax2N.js} +3 -3
- package/dist/lib/{configure-peer-js-ChDhOZU4.js.map → configure-peer-js-ccNvax2N.js.map} +1 -1
- package/dist/lib/{connections-DC4NZkJE.js → connections-C1FWsBsE.js} +2 -2
- package/dist/lib/{connections-DC4NZkJE.js.map → connections-C1FWsBsE.js.map} +1 -1
- package/dist/lib/{credentials-5vpz0XPk.js → credentials-CZbngHXW.js} +2 -2
- package/dist/lib/{credentials-5vpz0XPk.js.map → credentials-CZbngHXW.js.map} +1 -1
- package/dist/lib/{discover-skills-CD0sKvAI.js → discover-skills-OwlQ2sXA.js} +13 -13
- package/dist/lib/{discover-skills-CD0sKvAI.js.map → discover-skills-OwlQ2sXA.js.map} +1 -1
- package/dist/lib/{download-group-file-Dk3qaxhJ.js → download-group-file-D0wgg10Q.js} +2 -2
- package/dist/lib/{download-group-file-Dk3qaxhJ.js.map → download-group-file-D0wgg10Q.js.map} +1 -1
- package/dist/lib/{file-viewer-B4pRW-_G.js → file-viewer-DOfvX6yy.js} +5 -5
- package/dist/lib/{file-viewer-B4pRW-_G.js.map → file-viewer-DOfvX6yy.js.map} +1 -1
- package/dist/lib/{get-or-create-subscriber-id-HCcgDEPz.js → get-or-create-subscriber-id-wyzaML7Z.js} +2 -2
- package/dist/lib/{get-or-create-subscriber-id-HCcgDEPz.js.map → get-or-create-subscriber-id-wyzaML7Z.js.map} +1 -1
- package/dist/lib/{git-B3Q1euc5.js → git-D2J_j9X9.js} +5 -5
- package/dist/lib/{git-B3Q1euc5.js.map → git-D2J_j9X9.js.map} +1 -1
- package/dist/lib/{iframe-bridge-scripts-D8iuFhUk.js → iframe-bridge-scripts-Dx825LLG.js} +2 -2
- package/dist/lib/{iframe-bridge-scripts-D8iuFhUk.js.map → iframe-bridge-scripts-Dx825LLG.js.map} +1 -1
- package/dist/lib/index.js +28 -28
- package/dist/lib/{init-chat-split-resize-B0ODULx9.js → init-chat-split-resize-Cc0bd2z9.js} +2 -2
- package/dist/lib/{init-chat-split-resize-B0ODULx9.js.map → init-chat-split-resize-Cc0bd2z9.js.map} +1 -1
- package/dist/lib/{init-control-plane-C1FRRmjC.js → init-control-plane-B7blDVIE.js} +15 -15
- package/dist/lib/{init-control-plane-C1FRRmjC.js.map → init-control-plane-B7blDVIE.js.map} +1 -1
- package/dist/lib/{invoke-agent-CzN7sVh-.js → invoke-agent-SxvudiDT.js} +11 -11
- package/dist/lib/{invoke-agent-CzN7sVh-.js.map → invoke-agent-SxvudiDT.js.map} +1 -1
- package/dist/lib/{markdown-mbNo7cV3.js → markdown--6vTAPEH.js} +2 -2
- package/dist/lib/{markdown-mbNo7cV3.js.map → markdown--6vTAPEH.js.map} +1 -1
- package/dist/lib/{mcp-reconnect-3T7yWGEY.js → mcp-reconnect-BeqQvNWO.js} +3 -3
- package/dist/lib/{mcp-reconnect-3T7yWGEY.js.map → mcp-reconnect-BeqQvNWO.js.map} +1 -1
- package/dist/lib/{model-ranking-DGNSWYwN.js → model-ranking-BhsJV7vb.js} +2 -2
- package/dist/lib/{model-ranking-DGNSWYwN.js.map → model-ranking-BhsJV7vb.js.map} +1 -1
- package/dist/lib/{move-group-entry-NMTJ59M9.js → move-group-entry-DDpjxa10.js} +5 -5
- package/dist/lib/{move-group-entry-NMTJ59M9.js.map → move-group-entry-DDpjxa10.js.map} +1 -1
- package/dist/lib/{orchestrator-B8FV1V7x.js → orchestrator-C7fkh7T7.js} +24 -24
- package/dist/lib/{orchestrator-B8FV1V7x.js.map → orchestrator-C7fkh7T7.js.map} +1 -1
- package/dist/lib/{orchestrator-i_QJ-o22.js → orchestrator-CCARkxQC.js} +11 -11
- package/dist/lib/orchestrator-CCARkxQC.js.map +1 -0
- package/dist/lib/{parse-path-DPCn-HwI.js → parse-path-BOHQP_IQ.js} +3 -3
- package/dist/lib/{parse-path-DPCn-HwI.js.map → parse-path-BOHQP_IQ.js.map} +1 -1
- package/dist/lib/{peerjs-z5zeioPV.js → peerjs-Bfw_FWLB.js} +8 -8
- package/dist/lib/{peerjs-z5zeioPV.js.map → peerjs-Bfw_FWLB.js.map} +1 -1
- package/dist/lib/{process-peer-query-param-CJp7w7AU.js → process-peer-query-param-BxYiZNdf.js} +5 -5
- package/dist/lib/{process-peer-query-param-CJp7w7AU.js.map → process-peer-query-param-BxYiZNdf.js.map} +1 -1
- package/dist/lib/{process-pending-shared-payloads-B6_TlBFA.js → process-pending-shared-payloads-DPIbwRb3.js} +4 -4
- package/dist/lib/{process-pending-shared-payloads-B6_TlBFA.js.map → process-pending-shared-payloads-DPIbwRb3.js.map} +1 -1
- package/dist/lib/{process-room-query-param-C3FFGGn6.js → process-room-query-param-B2_d50nE.js} +4 -4
- package/dist/lib/{process-room-query-param-C3FFGGn6.js.map → process-room-query-param-B2_d50nE.js.map} +1 -1
- package/dist/lib/{provider-DcQZypu5.js → provider-BC9KPI14.js} +3 -3
- package/dist/lib/{provider-DcQZypu5.js.map → provider-BC9KPI14.js.map} +1 -1
- package/dist/lib/{push-client-Cx5rMs6J.js → push-client-rrjTdc-U.js} +5 -5
- package/dist/lib/{push-client-Cx5rMs6J.js.map → push-client-rrjTdc-U.js.map} +1 -1
- package/dist/lib/{read-group-file-bytes-CXOG_YyM.js → read-group-file-bytes-UQIk1eJG.js} +2 -2
- package/dist/lib/{read-group-file-bytes-CXOG_YyM.js.map → read-group-file-bytes-UQIk1eJG.js.map} +1 -1
- package/dist/lib/{rooms-CwlkYLDU.js → rooms-bwGoYb1q.js} +2 -2
- package/dist/lib/{rooms-CwlkYLDU.js.map → rooms-bwGoYb1q.js.map} +1 -1
- package/dist/lib/{shadow-claw-DoQ7fgl5.js → shadow-claw-CypGVlVO.js} +17 -20
- package/dist/lib/shadow-claw-CypGVlVO.js.map +1 -0
- package/dist/lib/{shadow-claw-a2ui-Br6qJMs1.js → shadow-claw-a2ui-lG0vQbW8.js} +2 -2
- package/dist/lib/{shadow-claw-a2ui-Br6qJMs1.js.map → shadow-claw-a2ui-lG0vQbW8.js.map} +1 -1
- package/dist/lib/{shadow-claw-accounts-BTDILfWw.js → shadow-claw-accounts-CkqyCxwp.js} +3 -3
- package/dist/lib/{shadow-claw-accounts-BTDILfWw.js.map → shadow-claw-accounts-CkqyCxwp.js.map} +1 -1
- package/dist/lib/{shadow-claw-channel-config-IKiL34tI.js → shadow-claw-channel-config-DJpDovkF.js} +4 -4
- package/dist/lib/{shadow-claw-channel-config-IKiL34tI.js.map → shadow-claw-channel-config-DJpDovkF.js.map} +1 -1
- package/dist/lib/{shadow-claw-channels-JgEzuHWK.js → shadow-claw-channels-DJLwRovH.js} +3 -3
- package/dist/lib/{shadow-claw-channels-JgEzuHWK.js.map → shadow-claw-channels-DJLwRovH.js.map} +1 -1
- package/dist/lib/{shadow-claw-chat-SGUDT31r.js → shadow-claw-chat-B92cPaft.js} +15 -15
- package/dist/lib/{shadow-claw-chat-SGUDT31r.js.map → shadow-claw-chat-B92cPaft.js.map} +1 -1
- package/dist/lib/{shadow-claw-control-plane-CRWFZ3vD.js → shadow-claw-control-plane-fvn-qyHj.js} +7 -7
- package/dist/lib/{shadow-claw-control-plane-CRWFZ3vD.js.map → shadow-claw-control-plane-fvn-qyHj.js.map} +1 -1
- package/dist/lib/{shadow-claw-conversations-D23GJ7qo.js → shadow-claw-conversations-CsVyDOny.js} +7 -7
- package/dist/lib/{shadow-claw-conversations-D23GJ7qo.js.map → shadow-claw-conversations-CsVyDOny.js.map} +1 -1
- package/dist/lib/{shadow-claw-file-viewer-C1V8WTiU.js → shadow-claw-file-viewer-DFfyP7s5.js} +10 -10
- package/dist/lib/{shadow-claw-file-viewer-C1V8WTiU.js.map → shadow-claw-file-viewer-DFfyP7s5.js.map} +1 -1
- package/dist/lib/{shadow-claw-files-DN7irmE1.js → shadow-claw-files-cT6HL7ye.js} +11 -11
- package/dist/lib/{shadow-claw-files-DN7irmE1.js.map → shadow-claw-files-cT6HL7ye.js.map} +1 -1
- package/dist/lib/{shadow-claw-git-D-1oIh65.js → shadow-claw-git-Cv9mQgTx.js} +6 -6
- package/dist/lib/{shadow-claw-git-D-1oIh65.js.map → shadow-claw-git-Cv9mQgTx.js.map} +1 -1
- package/dist/lib/{shadow-claw-integrations-CZjnm7cM.js → shadow-claw-integrations-RZZ-m-Id.js} +4 -4
- package/dist/lib/{shadow-claw-integrations-CZjnm7cM.js.map → shadow-claw-integrations-RZZ-m-Id.js.map} +1 -1
- package/dist/lib/{shadow-claw-llm-4Gefh5FN.js → shadow-claw-llm-CKOYzPDp.js} +9 -9
- package/dist/lib/{shadow-claw-llm-4Gefh5FN.js.map → shadow-claw-llm-CKOYzPDp.js.map} +1 -1
- package/dist/lib/{shadow-claw-mcp-remote-B9ssb3YV.js → shadow-claw-mcp-remote-BKFROurv.js} +4 -4
- package/dist/lib/{shadow-claw-mcp-remote-B9ssb3YV.js.map → shadow-claw-mcp-remote-BKFROurv.js.map} +1 -1
- package/dist/lib/{shadow-claw-networking-BN5BB4hb.js → shadow-claw-networking-DYfiUQaH.js} +2 -2
- package/dist/lib/{shadow-claw-networking-BN5BB4hb.js.map → shadow-claw-networking-DYfiUQaH.js.map} +1 -1
- package/dist/lib/{shadow-claw-notifications-71KARtkY.js → shadow-claw-notifications-JJlzriuX.js} +3 -3
- package/dist/lib/{shadow-claw-notifications-71KARtkY.js.map → shadow-claw-notifications-JJlzriuX.js.map} +1 -1
- package/dist/lib/{shadow-claw-page-header-DMGO-TSe.js → shadow-claw-page-header-C_Qr3xZM.js} +2 -2
- package/dist/lib/{shadow-claw-page-header-DMGO-TSe.js.map → shadow-claw-page-header-C_Qr3xZM.js.map} +1 -1
- package/dist/lib/{shadow-claw-pages-BiRM6qiA.js → shadow-claw-pages-BCo3ihZI.js} +11 -11
- package/dist/lib/{shadow-claw-pages-BiRM6qiA.js.map → shadow-claw-pages-BCo3ihZI.js.map} +1 -1
- package/dist/lib/{shadow-claw-peerjs-BZu7jNSe.js → shadow-claw-peerjs-CFNjfrY5.js} +6 -6
- package/dist/lib/{shadow-claw-peerjs-BZu7jNSe.js.map → shadow-claw-peerjs-CFNjfrY5.js.map} +1 -1
- package/dist/lib/{shadow-claw-provider-model-picker-BXYXEobD.js → shadow-claw-provider-model-picker-B-Ct4yW-.js} +2 -2
- package/dist/lib/{shadow-claw-provider-model-picker-BXYXEobD.js.map → shadow-claw-provider-model-picker-B-Ct4yW-.js.map} +1 -1
- package/dist/lib/{shadow-claw-settings-CcT5EK08.js → shadow-claw-settings-BMwne0bh.js} +7 -7
- package/dist/lib/{shadow-claw-settings-CcT5EK08.js.map → shadow-claw-settings-BMwne0bh.js.map} +1 -1
- package/dist/lib/{shadow-claw-storage-eTOpbvpi.js → shadow-claw-storage-DUY8B9m-.js} +5 -5
- package/dist/lib/{shadow-claw-storage-eTOpbvpi.js.map → shadow-claw-storage-DUY8B9m-.js.map} +1 -1
- package/dist/lib/{shadow-claw-task-server-DFImTUbw.js → shadow-claw-task-server-yWeoA3eL.js} +2 -2
- package/dist/lib/{shadow-claw-task-server-DFImTUbw.js.map → shadow-claw-task-server-yWeoA3eL.js.map} +1 -1
- package/dist/lib/{shadow-claw-tasks-BjaxsmUx.js → shadow-claw-tasks-Bg0uM15I.js} +9 -9
- package/dist/lib/{shadow-claw-tasks-BjaxsmUx.js.map → shadow-claw-tasks-Bg0uM15I.js.map} +1 -1
- package/dist/lib/{shadow-claw-terminal-C-4wreFe.js → shadow-claw-terminal-fyJPppY_.js} +2 -2
- package/dist/lib/{shadow-claw-terminal-C-4wreFe.js.map → shadow-claw-terminal-fyJPppY_.js.map} +1 -1
- package/dist/lib/{shadow-claw-tools-COdrGZJk.js → shadow-claw-tools-D0T8m3go.js} +7 -7
- package/dist/lib/{shadow-claw-tools-COdrGZJk.js.map → shadow-claw-tools-D0T8m3go.js.map} +1 -1
- package/dist/lib/{shadow-claw-webvm-sxqVjO0L.js → shadow-claw-webvm-CQvzJwKI.js} +3 -3
- package/dist/lib/{shadow-claw-webvm-sxqVjO0L.js.map → shadow-claw-webvm-CQvzJwKI.js.map} +1 -1
- package/dist/lib/{sync-web-mcp-registration-D4hdUwtv.js → sync-web-mcp-registration-BFtG_4kx.js} +6 -6
- package/dist/lib/{sync-web-mcp-registration-D4hdUwtv.js.map → sync-web-mcp-registration-BFtG_4kx.js.map} +1 -1
- package/dist/lib/{system-prompt-DT_KeYaL.js → system-prompt-bhGRLoL2.js} +7 -7
- package/dist/lib/{system-prompt-DT_KeYaL.js.map → system-prompt-bhGRLoL2.js.map} +1 -1
- package/dist/lib/{tools-Beuyh8y1.js → tools-B8OJ4sMF.js} +4 -4
- package/dist/lib/{tools-Beuyh8y1.js.map → tools-B8OJ4sMF.js.map} +1 -1
- package/dist/lib/{transformers-DydnReu4.js → transformers-BMURofG6.js} +2 -2
- package/dist/lib/{transformers-DydnReu4.js.map → transformers-BMURofG6.js.map} +1 -1
- package/dist/lib/{trusted-types-CfwZl_rr.js → trusted-types-HwsGS5Nj.js} +19 -17
- package/dist/lib/{trusted-types-CfwZl_rr.js.map → trusted-types-HwsGS5Nj.js.map} +1 -1
- package/dist/lib/{upload-group-file-BbBzjTcN.js → upload-group-file-CJpoNjEb.js} +3 -3
- package/dist/lib/{upload-group-file-BbBzjTcN.js.map → upload-group-file-CJpoNjEb.js.map} +1 -1
- package/dist/lib/utils/index.js +1 -1
- package/dist/lib/utils/namespaced-storage.js +1 -1
- package/dist/lib/utils/runtime-assets.js +1 -1
- package/dist/lib/utils/utils.js +1 -1
- package/dist/lib/{webmcp-DCfAFiIO.js → webmcp-BoMTvgmX.js} +3 -3
- package/dist/lib/{webmcp-DCfAFiIO.js.map → webmcp-BoMTvgmX.js.map} +1 -1
- package/dist/lib/{write-group-file-bytes-Ccn-VFUU.js → write-group-file-bytes-CNT7DqOZ.js} +3 -3
- package/dist/lib/{write-group-file-bytes-Ccn-VFUU.js.map → write-group-file-bytes-CNT7DqOZ.js.map} +1 -1
- package/dist/public/.well-known/mcp/server-card.json +12 -4
- package/dist/public/.well-known/mcp.json +12 -4
- package/dist/public/agent.worker.js +1 -1
- package/dist/public/attachment-capabilities-AdwXt3--.js +1 -0
- package/dist/public/{channel-BylT3rJC.js → channel-Dk7wl-Av.js} +1 -1
- package/dist/public/{chat-template-DPHJy7tr.js → chat-template-BwAnTFKf.js} +1 -1
- package/dist/public/{compact-context-BINQh64w.js → compact-context-fOTqwKF6.js} +2 -2
- package/dist/public/config-C16fFWtP.js +1 -0
- package/dist/public/{configure-peer-js-DChhcOfe.js → configure-peer-js-BOV0tR6G.js} +1 -1
- package/dist/public/{connections-CHaw0VqP.js → connections-Dxwj8yK_.js} +1 -1
- package/dist/public/{create-model-cache-fetch-DQebkoPL.js → create-model-cache-fetch-DSAFjOwc.js} +1 -1
- package/dist/public/{credentials-CgVqS119.js → credentials-CJUQ5Ep2.js} +1 -1
- package/dist/public/{custom-element-security-kiDhPfb8.js → custom-element-security-B2daIE5r.js} +2 -2
- package/dist/public/{discover-skills-Cvmx5I9V.js → discover-skills-D1sNTy2r.js} +6 -6
- package/dist/public/docs/example/article/index.html +28 -29
- package/dist/public/docs/example/article.html +28 -29
- package/dist/public/docs/publishing/index.html +28 -29
- package/dist/public/docs/publishing.html +28 -29
- package/dist/public/docs/skill-creator/index.html +28 -29
- package/dist/public/docs/skill-creator.html +28 -29
- package/dist/public/{download-group-file-BapoRgfU.js → download-group-file-BkMH-JKi.js} +1 -1
- package/dist/public/{e2e-bridge-C0g8vZKr.js → e2e-bridge-Cz95DLlb.js} +1 -1
- package/dist/public/get-group-dir-D--BiEyk.js +1 -0
- package/dist/public/{get-or-create-subscriber-id-GvRZYXwA.js → get-or-create-subscriber-id-jVHnQfbr.js} +1 -1
- package/dist/public/{git-CaAAZfVd.js → git-BmMlwIMP.js} +2 -2
- package/dist/public/{iframe-bridge-scripts-BnqtKhE4.js → iframe-bridge-scripts-Cibg0m6A.js} +1 -1
- package/dist/public/index.html +28 -29
- package/dist/public/index.js +1 -1
- package/dist/public/{init-chat-split-resize-Btonoy8u.js → init-chat-split-resize-C8AqCCiK.js} +1 -1
- package/dist/public/init-control-plane-Cb31yLTY.js +1 -0
- package/dist/public/{invoke-agent-B3Osw6K7.js → invoke-agent-CN7mSV0Z.js} +1 -1
- package/dist/public/main/index.html +28 -29
- package/dist/public/main/memory/index.html +28 -29
- package/dist/public/main/memory.html +28 -29
- package/dist/public/main.html +28 -29
- package/dist/public/{markdown-CPbU4r1U.js → markdown-CDSb5Hrl.js} +1 -1
- package/dist/public/{mcp-reconnect-CzROVsXG.js → mcp-reconnect-iPZPihwX.js} +1 -1
- package/dist/public/{memory-storage-BkoMlxOr.js → memory-storage-2m7KZ-aP.js} +1 -1
- package/dist/public/{model-ranking-CK0iBo3Z.js → model-ranking-BgOSaNIy.js} +1 -1
- package/dist/public/{move-group-entry-CTxoq7lw.js → move-group-entry-CXneuNVa.js} +1 -1
- package/dist/public/orchestrator-DBO4NZqd.js +63 -0
- package/dist/public/{orchestrator-BrDjQbGf.js → orchestrator-Dyylc8IU.js} +2 -2
- package/dist/public/{peerjs-CgF4Iz5W.js → peerjs-l0jiBoh6.js} +1 -1
- package/dist/public/{process-peer-query-param-BL2k0Hu-.js → process-peer-query-param-s-aSP1Rq.js} +1 -1
- package/dist/public/{process-pending-shared-payloads-C1AgGvn8.js → process-pending-shared-payloads-BN3GigPT.js} +1 -1
- package/dist/public/{process-room-query-param-DM0QCq3_.js → process-room-query-param-B2Qe0F0M.js} +1 -1
- package/dist/public/provider-YPZmsuHR.js +1 -0
- package/dist/public/{push-client-DJEOz7bi.js → push-client-B2LC8Qp9.js} +1 -1
- package/dist/public/{rooms-C6LXIJl4.js → rooms-ChCEOvkw.js} +1 -1
- package/dist/public/service-worker.js +1 -1
- package/dist/public/shadow-claw-Br8mWDUx.js +1176 -0
- package/dist/public/{shadow-claw-accounts--4hd_oCz.js → shadow-claw-accounts-Dm6G7KMP.js} +1 -1
- package/dist/public/{shadow-claw-card-IbNlZAdK.js → shadow-claw-card-CggS8uSa.js} +1 -1
- package/dist/public/{shadow-claw-channels-Vq_pPGa2.js → shadow-claw-channels-088vhuWO.js} +1 -1
- package/dist/public/{shadow-claw-chat-D7_GS25e.js → shadow-claw-chat-BRwRlq-n.js} +3 -3
- package/dist/public/{shadow-claw-control-plane-WTMEV8_p.js → shadow-claw-control-plane-rhKACK85.js} +2 -2
- package/dist/public/{shadow-claw-conversations-CLQgU1IT.js → shadow-claw-conversations-CF_yUfKl.js} +1 -1
- package/dist/public/{shadow-claw-empty-state-D4CrFGsN.js → shadow-claw-empty-state-CkpOSXCS.js} +1 -1
- package/dist/public/{shadow-claw-file-viewer-BhqiqLWQ.js → shadow-claw-file-viewer-DWCejuY3.js} +4 -4
- package/dist/public/{shadow-claw-files-senDiG9l.js → shadow-claw-files-L6_ioyzh.js} +2 -2
- package/dist/public/{shadow-claw-git-DOOCqY23.js → shadow-claw-git-DsdkwLqQ.js} +2 -2
- package/dist/public/{shadow-claw-integrations-Bsvc3Agq.js → shadow-claw-integrations-CSbRTOm3.js} +1 -1
- package/dist/public/{shadow-claw-llm-actYICAk.js → shadow-claw-llm-BitaeAVc.js} +2 -2
- package/dist/public/{shadow-claw-mcp-remote-BYUgrK3v.js → shadow-claw-mcp-remote-gSbV5riy.js} +1 -1
- package/dist/public/{shadow-claw-networking-Dk3p5Ny_.js → shadow-claw-networking-Dn_y6Cl9.js} +1 -1
- package/dist/public/{shadow-claw-notifications-CzPAlay8.js → shadow-claw-notifications-Cj4Lqx8U.js} +1 -1
- package/dist/public/{shadow-claw-page-header-CjJpVkyL.js → shadow-claw-page-header-DR4OZFt2.js} +1 -1
- package/dist/public/{shadow-claw-page-header-action-button-2DH5O1TD.js → shadow-claw-page-header-action-button-BnCV_2Kb.js} +1 -1
- package/dist/public/{shadow-claw-pages-3r5I-wI8.js → shadow-claw-pages-mpDOtNYj.js} +6 -6
- package/dist/public/{shadow-claw-pdf-viewer-BiCEwsoY.js → shadow-claw-pdf-viewer-DZ_84qJH.js} +1 -1
- package/dist/public/{shadow-claw-settings-DgB9RSZN.js → shadow-claw-settings-CfFTYTEy.js} +2 -2
- package/dist/public/{shadow-claw-storage-JB_43nd8.js → shadow-claw-storage-DLmiT4bG.js} +1 -1
- package/dist/public/{shadow-claw-task-server-oi5UIxdA.js → shadow-claw-task-server-BoMBCsiS.js} +1 -1
- package/dist/public/{shadow-claw-tasks-CnyiOt81.js → shadow-claw-tasks-ChEp1j7x.js} +3 -3
- package/dist/public/{shadow-claw-terminal-BC3RynHt.js → shadow-claw-terminal-BaoVbOda.js} +1 -1
- package/dist/public/{shadow-claw-toast-YjG--2Za.js → shadow-claw-toast-e8oz7z6Z.js} +1 -1
- package/dist/public/{shadow-claw-tools-Bbwk4vlT.js → shadow-claw-tools-BYjUBiJz.js} +1 -1
- package/dist/public/{shadow-claw-webvm-HZqzl2H5.js → shadow-claw-webvm-xGb13TME.js} +1 -1
- package/dist/public/{sync-web-mcp-registration-BaH2nAP0.js → sync-web-mcp-registration-CQluj-Kz.js} +1 -1
- package/dist/public/{system-prompt-Dck3N8T0.js → system-prompt-CTJn0tK-.js} +1 -1
- package/dist/public/{tools-DHA1dK2I.js → tools-D-52Zmfc.js} +1 -1
- package/dist/public/{transformers-C-DuTM2K.js → transformers-CQ9ss9rD.js} +1 -1
- package/dist/public/{upload-group-file-Cejr3zo1.js → upload-group-file-A8kB7lvO.js} +1 -1
- package/dist/public/{webmcp-CMRtu57-.js → webmcp-DIUZjVF5.js} +1 -1
- package/dist/public/{write-group-file-CmJuVQNO.js → write-group-file-R67DjJ-q.js} +1 -1
- package/dist/public/{write-group-file-bytes-Cejr3zo1.js → write-group-file-bytes-A8kB7lvO.js} +1 -1
- package/dist/public/{zip-reader-CuQ13eLe.js → zip-reader-DN7FB-Q0.js} +1 -1
- package/dist/server.js +1 -1
- package/package.json +1 -1
- package/dist/cli/chunk-BFziiMKt.js +0 -7
- package/dist/cli/chunk-BM3llsxb.js +0 -1
- package/dist/cli/chunk-Bj5qFsDi.js +0 -7
- package/dist/cli/chunk-Bj95zm-y.js +0 -1
- package/dist/cli/chunk-BpyP-esT.js +0 -1
- package/dist/cli/chunk-CX696s3_.js +0 -1
- package/dist/cli/chunk-DRxCrCAA.js +0 -139
- package/dist/cli/chunk-DjbCHa0h.js +0 -1
- package/dist/cli/chunk-DsQhAF31.js +0 -1
- package/dist/cli/chunk-VM-dECyG.js +0 -1
- package/dist/cli/chunk-heu2xRw1.js +0 -1
- package/dist/lib/orchestrator-i_QJ-o22.js.map +0 -1
- package/dist/lib/shadow-claw-DoQ7fgl5.js.map +0 -1
- package/dist/public/app-routes-V_-URXc5.js +0 -1
- package/dist/public/attachment-capabilities-B6ibLwQB.js +0 -1
- package/dist/public/config-C-YdSFZB.js +0 -1
- package/dist/public/get-group-dir-DL44kvqW.js +0 -1
- package/dist/public/init-control-plane-BoJijVtf.js +0 -1
- package/dist/public/orchestrator-CaUpEVkQ.js +0 -63
- package/dist/public/provider-DNIL4-Hw.js +0 -1
- package/dist/public/shadow-claw-DdgeYPg5.js +0 -1176
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import{i as e,n as t,r as n,t as r}from"./chunk-4-QO2z6r.js";import{i,n as a,r as o,t as s}from"./chunk-DnR17T-6.js";import{t as c}from"./chunk-BChOKoxf.js";import{c as l,f as u,i as d,l as f,m as p,n as m,o as h,p as g,r as _,s as ee,t as v,u as te}from"./chunk-DKAtC-O0.js";import{o as y,r as b}from"./chunk-DZyBXNgc.js";import{t as x}from"./chunk-Dl4zTOqg.js";import{t as S}from"./chunk-DjKQO7aV.js";import{n as C,t as w}from"./chunk-IVWoxOkm.js";import{c as T,l as E,s as D,u as O}from"./chunk-CsZlU6GT.js";import{i as k,r as A,t as j}from"./chunk-ByA6Dh5i.js";import{t as ne}from"./chunk-BhCmCUGL.js";function M(e){if(!e)return``;let t=e.match(/^\r?\n([ \t]+)/);if(t){let n=t[1],r=RegExp(`^[ \\t]{1,${n.length}}`,`gm`);return e.replace(/^\r?\n/,``).replace(r,``).replace(/\r?\n[ \t]*$/,`
|
|
2
|
+
`)}if(/^(?:\r?\n)+[ \t]*---/.test(e))return e.replace(/^(?:\r?\n)+/,``);if(/^[ \t]+---/.test(e)){let t=e.match(/^[ \t]+/);if(t){let n=t[0],r=RegExp(`^[ \\t]{1,${n.length}}`,`gm`);return e.replace(r,``)}}return e}let N=/* @__PURE__ */ new Map;function re(e){if(typeof document>`u`)return null;let t=`shadow-claw-site-config`;if(e){let n=e.getAttribute(`config`)?.trim();n&&(t=n.replace(/^#/,``))}let n=document.getElementById(t);if(!n?.textContent)return N.delete(t),null;let r=N.get(t);if(r&&r.rawText===n.textContent)return r.config;try{let e=JSON.parse(n.textContent);if(!e||typeof e!=`object`)return N.delete(t),null;let r={...e};return N.set(t,{rawText:n.textContent,config:r}),r}catch(e){return console.warn(`[ShadowClaw] Failed to parse site configuration from #${t}:`,e),null}}function ie(e,t,n){let r=null,i,a;return typeof e==`string`?(i=e,a=t):(r=e,i=t,a=n??50),r&&S(r)?Promise.resolve().then(()=>(r.db.prepare(`SELECT * FROM messages WHERE groupId = ? ORDER BY timestamp DESC LIMIT ?`).all(i,a)??[]).reverse().map(ae)):new Promise(async(e,t)=>{try{let n=r??await x();if(!n)return t(/* @__PURE__ */ Error(`failed to get transaction, cannot get recent messages.`));let o=n.transaction(`messages`,`readonly`);if(!o)return t(/* @__PURE__ */ Error(`failed to get transaction`));let s=o.objectStore(`messages`).index(`by-group-time`),c=IDBKeyRange.bound([i,0],[i,1/0]),l=s.openCursor(c,`prev`),u=[];l.onsuccess=()=>{let t=l.result;t&&u.length<a?(u.push(t.value),t.continue()):e(u.reverse())},l.onerror=()=>t(l.error)}catch(e){t(e)}})}function ae(e){return{...e,isFromMe:!!e.isFromMe,isTrigger:!!e.isTrigger,attachments:e.attachments?JSON.parse(e.attachments):void 0,a2uiAction:e.a2uiAction?JSON.parse(e.a2uiAction):void 0,a2uiEnvelopes:e.a2uiEnvelopes?JSON.parse(e.a2uiEnvelopes):void 0}}const oe=`group_metadata`;async function P(e){let t=await w(e,oe);if(!t)return[];try{return JSON.parse(t)}catch{return[]}}async function F(e,t){await O(e,oe,JSON.stringify(t))}async function se(e,t,n=`br:`,r){let i=await P(e),a={groupId:`${n}${r??c()}`,name:t,createdAt:Date.now()};return i.push(a),await F(e,i),a}async function ce(e,t,n){let r=await P(e),i=r.find(e=>e.groupId===t);i&&(i.name=n),await F(e,r)}async function le(e,t,n){let r=await P(e),i=r.find(e=>e.groupId===t);i&&(n&&n.length>0?i.toolTags=n:delete i.toolTags),await F(e,r)}async function ue(e,t){await F(e,(await P(e)).filter(e=>e.groupId!==t))}async function I(e){let t=await P(e);if(t.length===0){let t={groupId:y,name:`Main`,createdAt:0};return await F(e,[t]),[t]}return t}async function de(e,t){let n=await P(e),r=new Map(n.map(e=>[e.groupId,e])),i=[];for(let e of t){let t=r.get(e);t&&(i.push(t),r.delete(e))}for(let e of n)r.has(e.groupId)&&i.push(e);await F(e,i)}async function fe(e,t){let n=await P(e),r=n.find(e=>e.groupId===t);if(!r)return null;let i=t.indexOf(`:`),a={groupId:`${i>=0?t.slice(0,i+1):`br:`}${c()}`,name:`${r.name} (copy)`,createdAt:Date.now(),pinnedMaxTokens:r.pinnedMaxTokens,providerRuntimeOverrides:r.providerRuntimeOverrides?JSON.parse(JSON.stringify(r.providerRuntimeOverrides)):void 0,subagentModelSelectionMode:r.subagentModelSelectionMode,subagentMaxTokens:r.subagentMaxTokens,subagentPinnedProvider:r.subagentPinnedProvider,subagentPinnedModel:r.subagentPinnedModel,subagentFastProvider:r.subagentFastProvider,subagentFastModel:r.subagentFastModel,subagentSmartProvider:r.subagentSmartProvider,subagentSmartModel:r.subagentSmartModel,subagentPowerfulProvider:r.subagentPowerfulProvider,subagentPowerfulModel:r.subagentPowerfulModel,toolTags:r.toolTags?[...r.toolTags]:void 0};return n.push(a),await F(e,n),a}async function pe(e,t,n,r,i){let a=await P(e),o=a.find(e=>e.groupId===t);o&&(n?o.pinnedProvider=n:delete o.pinnedProvider,r?o.pinnedModel=r:delete o.pinnedModel,typeof i==`number`&&Number.isFinite(i)&&i>0?o.pinnedMaxTokens=Math.floor(i):delete o.pinnedMaxTokens),await F(e,a)}async function me(e,t,n,r,i,a){let o=await P(e),s=o.find(e=>e.groupId===t);s&&(s.subagentModelSelectionMode=n,n===`manual`?(r?s.subagentPinnedProvider=r:delete s.subagentPinnedProvider,i?s.subagentPinnedModel=i:delete s.subagentPinnedModel):(delete s.subagentPinnedProvider,delete s.subagentPinnedModel),typeof a==`number`&&Number.isFinite(a)&&a>0?s.subagentMaxTokens=Math.floor(a):delete s.subagentMaxTokens),await F(e,o)}async function he(e,t,n){let r=await P(e),i=r.find(e=>e.groupId===t);i&&(n&&Object.keys(n).length>0?i.providerRuntimeOverrides=JSON.parse(JSON.stringify(n)):delete i.providerRuntimeOverrides),await F(e,r)}function ge(e,t,n,r){let i=t*2**e,a=Math.min(i,n),o=a*r*Math.random();return Math.max(0,a-o)}function _e(e,t){return new Promise((n,r)=>{if(t?.aborted){r(t.reason??new DOMException(`Aborted`,`AbortError`));return}let i=setTimeout(n,e);if(t){let e=()=>{clearTimeout(i),r(t.reason??new DOMException(`Aborted`,`AbortError`))};t.addEventListener(`abort`,e,{once:!0});let a=n;n=(n=>{t.removeEventListener(`abort`,e),a(n)})}})}async function L(){let e=typeof globalThis<`u`?globalThis:void 0;e?.scheduler&&typeof e.scheduler.yield==`function`?await e.scheduler.yield():await new Promise(e=>setTimeout(e,0))}function ve(e,t=y){e.agentWorker?.postMessage({payload:{groupId:t},type:`vm-workspace-sync`})}function ye(e,t=y){e.agentWorker?.postMessage({payload:{groupId:t},type:`vm-workspace-flush`})}function be(e){`serviceWorker`in navigator&&navigator.serviceWorker?.controller&&navigator.serviceWorker.controller.postMessage({type:`set-proxy-config`,payload:{useProxy:e.useProxy,proxyUrl:e.proxyUrl}})}async function xe(e,t,n,r=O){e.gitProxyUrl=n||`/git-proxy`,await r(t,b.GIT_PROXY_URL,e.gitProxyUrl)}async function Se(e,t,n,r=O){e.proxyUrl=n||`/proxy`,await r(t,b.PROXY_URL,e.proxyUrl),be(e)}async function Ce(e,t,n,r=O){e.useProxy=!!n,await r(t,b.USE_PROXY,e.useProxy?`true`:`false`),be(e)}async function we(e,t,n,r=O){e.vmBashFullInternetAccess=!!n,await r(t,b.VM_BASH_FULL_INTERNET_ACCESS,e.vmBashFullInternetAccess?`true`:`false`)}function Te(e,t,n){if(e&&S(e)){let r=e.db,i=r.prepare(`SELECT * FROM messages WHERE groupId = ?`).all(t),a=r.prepare(`INSERT INTO messages
|
|
3
|
+
(id, groupId, timestamp, content, sender, channel, isFromMe, isTrigger, attachments, a2uiAction, a2uiEnvelopes, freshContext, subagent)
|
|
4
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);for(let e of i)a.run(c(),n,e.timestamp,e.content,e.sender,e.channel??`chat`,e.isFromMe,e.isTrigger,e.attachments,e.a2uiAction,e.a2uiEnvelopes,e.freshContext,e.subagent);return Promise.resolve(i.length)}return new Promise((r,i)=>{let a=e?.transaction(`messages`,`readwrite`);if(!a)throw Error(`failed to get transaction, cannot clone messages.`);let o=a.objectStore(`messages`),s=o.index(`by-group`).openCursor(t),l=0;s.onsuccess=()=>{let e=s.result;if(e){let t={...e.value,id:c(),groupId:n};o.put(t),l++,e.continue()}else r(l)},s.onerror=()=>i(s.error)})}function Ee(e,t,n){if(e&&S(e)){let r=e.db,i=r.prepare(`SELECT * FROM tasks WHERE groupId = ?`).all(t),a=r.prepare(`INSERT INTO tasks
|
|
5
|
+
(id, groupId, enabled, schedule, prompt, tools, lastRun, createdAt, type, freshContext, subagent, name, task_order, pushNotifications)
|
|
6
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);for(let e of i)a.run(c(),n,+!!e.enabled,e.schedule??null,e.prompt??``,e.tools??null,e.lastRun??null,e.createdAt,e.type??null,e.freshContext?1:null,e.subagent?1:null,e.name??null,e.task_order??null,e.pushNotifications?1:null);return Promise.resolve(i.length)}return new Promise((r,i)=>{let a=e?.transaction(`tasks`,`readwrite`);if(!a)throw Error(`failed to get transaction, cannot clone tasks.`);let o=a.objectStore(`tasks`),s=o.index(`by-group`).openCursor(t),l=0;s.onsuccess=()=>{let e=s.result;if(e){let t={...e.value,id:c(),groupId:n};o.put(t),l++,e.continue()}else r(l)},s.onerror=()=>i(s.error)})}function De(e,t){return C(e,`messages`,`readwrite`,e=>e.delete(t)).then(()=>void 0)}function R(e,t){return t?C(e,`tasks`,`readwrite`,e=>e.delete(t)).then(()=>void 0):Promise.reject(/* @__PURE__ */ Error(`Task ID is required for deletion.`))}function Oe(){return typeof crypto<`u`&&typeof crypto.randomUUID==`function`?crypto.randomUUID():`sub-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`}async function ke(e){if(!e)return Oe();let t=await w(e,b.SUBSCRIBER_ID);if(typeof t==`string`&&t.trim().length>0)return t;let n=Oe();return await O(e,b.SUBSCRIBER_ID,n),n}function z(e,t){return C(e,`messages`,`readwrite`,e=>e.put(t)).then(()=>void 0)}function B(e,t){let n={...t,enabled:+!!t.enabled};return C(e,`tasks`,`readwrite`,e=>e.put(n)).then(()=>void 0)}function Ae(e,t,n){let r=null,i,a;return typeof e==`string`?(i=e,a=t):(r=e,i=t,a=n),r&&S(r)?Promise.resolve().then(()=>{r.db.prepare(`UPDATE tasks SET lastRun = ? WHERE id = ?`).run(a,i)}):new Promise(async(e,t)=>{try{let n=r??await x();if(!n)return t(/* @__PURE__ */ Error(`failed to get transaction, cannot update task last run.`));let o=n.transaction(`tasks`,`readwrite`);if(!o)return t(/* @__PURE__ */ Error(`failed to get transaction`));let s=o.objectStore(`tasks`),c=s.get(i);c.onsuccess=()=>{let n=c.result;if(!n){e();return}n.lastRun=a;let r=s.put(n);r.onsuccess=()=>e(),r.onerror=()=>t(r.error)},c.onerror=()=>t(c.error)}catch(e){t(e)}})}async function je(e,t,n){let r=(await A(e)).filter(e=>e.groupId===t),i=new Map(r.map(e=>[e.id,e])),a=[],o=0;for(let t of n){let n=i.get(t);n&&(n.order=o++,await B(e,n),a.push(n),i.delete(t))}let s=Array.from(i.values()).sort((e,t)=>{let n=e.order??0,r=t.order??0;return n===r?e.createdAt-t.createdAt:n-r});for(let t of s)t.order=o++,await B(e,t),a.push(t);return a}async function Me(e,t,n,r){let i=await f(e,t),a=await f(e,n),o=r.replace(/\\/g,`/`).replace(/^\/+/,``).split(`/`).filter(Boolean),s=i,c=a;for(let e of o)s=await s.getDirectoryHandle(e),c=await c.getDirectoryHandle(e,{create:!0});let l=n.replace(/:/g,`-`),u=[te(),`groups`,l,...o];try{await Ne(e,n,s,c,u)}catch(e){throw o.length>0&&await a.removeEntry(o[0],{recursive:!0}).catch(()=>void 0),e}}async function Ne(e,t,n,r,i){for await(let[a,o]of n.entries()){if(o.kind===`directory`){await Ne(e,t,o,await r.getDirectoryHandle(a,{create:!0}),[...i,a]);continue}let n=await o.getFile(),s=await r.getFileHandle(a,{create:!0});try{await v(s,n)}catch(t){if(!((t instanceof Error?t.message:String(t)).includes(`Writable file streams are not supported`)&&(await u(e)).type===`opfs`))throw t;await m([...i,a],n)}}}function Pe(){let e=s(`/static-main/index.html`);if(typeof window<`u`&&window.location?.origin)try{return new URL(e,window.location.origin).toString()}catch{return e}return e}async function Fe(e){let t=await w(e,b.MAIN_GROUP_INDEX_SUPPRESSED);return t===!0||t===`true`}async function Ie(e,t){await O(e,b.MAIN_GROUP_INDEX_SUPPRESSED,t)}async function Le(t,n=y,r){try{if(await T(t,n,`index.html`)){if(n===`br:main`)try{let i=await E(t,n,`index.html`);typeof i==`string`&&(i.includes(`<shadow-claw`)||i.includes(`data-shadow-claw-dsd`))&&await D(t,n,`index.html`,r??e)}catch{}return!0}if(n===`br:main`&&await Fe(t))return!1;let i=r;if(i===void 0&&typeof fetch==`function`)try{let e=await fetch(Pe());if(e.ok){let t=await e.text();!t.includes(`<shadow-claw`)&&!t.includes(`data-shadow-claw-dsd`)&&(i=t)}}catch{}return i??=e,await D(t,n,`index.html`,i),!0}catch(e){return console.warn(`Failed to ensure main workspace Memory:`,e),!1}}const V=`MEMORY.md`;function Re(){let e=s(`/static-main/MEMORY.md`);if(typeof window<`u`&&window.location?.origin)try{return new URL(e,window.location.origin).toString()}catch{return e}return e}async function H(e){let t=await w(e,b.MAIN_GROUP_README_SUPPRESSED);return t===!0||t===`true`}async function U(e,t){await O(e,b.MAIN_GROUP_README_SUPPRESSED,t)}async function W(e,t=y,r){try{if(await T(e,t,`MEMORY.md`)){if(t===`br:main`)try{let i=await E(e,t,V);typeof i==`string`&&(i.includes(`<shadow-claw`)||i.includes(`data-shadow-claw-dsd`))&&await D(e,t,V,r??n)}catch{}return!0}if(t===`br:main`&&await H(e))return!1;let i=r;if(i===void 0&&typeof fetch==`function`)try{let e=await fetch(Re());if(e.ok){let t=await e.text();!t.includes(`<shadow-claw`)&&!t.includes(`data-shadow-claw-dsd`)&&(i=t)}}catch{}return i??=n,await D(e,t,V,i),!0}catch(e){return console.warn(`Failed to ensure main workspace Memory:`,e),!1}}async function G(e,t,n=`.`){for(let r=0;r<2;r++)try{let r=await f(e,t);if(n&&n!==`.`){let e=n.replace(/\\/g,`/`).replace(/^\/home\/user\//,`/`).replace(/^\/+/,``).split(`/`).filter(Boolean);for(let t of e){let e=await r.getDirectoryHandle(t);if(typeof r.isSameEntry==`function`&&await r.isSameEntry(e))throw Error(`Directory navigation stuck at "${r.name}" for segment "${t}" — the stored directory handle may be stale.`);r=e}}let i=[];for await(let[e,t]of r.entries())i.push(t.kind===`directory`?`${e}/`:e);return i.sort()}catch(e){if(r===0&&p(e)){g();continue}throw e}return[]}function ze(e){if(!e||typeof e!=`object`)return!1;let t=globalThis.FileSystemDirectoryHandle;return t!==void 0&&e instanceof t||typeof e.getDirectoryHandle==`function`&&typeof e.getFileHandle==`function`&&typeof e.requestPermission==`function`}async function Be(e){let t=await w(e,b.STORAGE_HANDLE);return!ze(t)||await t.requestPermission({mode:`readwrite`})===`granted`}function Ve(e){let t=o();return t?`shadowclaw:${t}:${e}`:e}function He(e){if(typeof localStorage>`u`)return null;let t=Ve(e);try{let n=localStorage.getItem(t);if(n!==null)return n;if(t===e)return null;let r=localStorage.getItem(e);if(r!==null)return localStorage.setItem(t,r),r}catch(e){console.warn(`Unable to read from localStorage:`,e)}return null}function K(e,t){if(typeof localStorage>`u`)return;let n=Ve(e);try{localStorage.setItem(n,t)}catch(e){console.warn(`Unable to write to localStorage:`,e)}}async function Ue(e,t){let n=await f(e,t);for await(let[e]of n.entries())await n.removeEntry(e,{recursive:!0})}async function q(e,t,n){let r=await f(e,t),{dirs:i,filename:a}=l(n.replace(/\/$/,``)),o=r;for(let e of i)o=await o.getDirectoryHandle(e);await o.removeEntry(a,{recursive:!0})}function J(e,t){return`${e}:${t}`}async function We(e){let t=await w(e,b.SUPPRESSED_PAGES_LIST);if(!t||typeof t!=`string`)return[];try{let e=JSON.parse(t);if(Array.isArray(e))return e}catch{}return[]}async function Ge(e,t,n){let r=await We(e),i=J(t,n);return r.some(e=>J(e.groupId,e.path)===i)}async function Ke(e,t,n){let r=await We(e),i=J(t,n);if(!r.some(e=>J(e.groupId,e.path)===i)){let i=[...r,{groupId:t,path:n}];await O(e,b.SUPPRESSED_PAGES_LIST,JSON.stringify(i))}}async function qe(e,t,n){let r=await We(e),i=J(t,n),a=r.filter(e=>J(e.groupId,e.path)!==i);a.length!==r.length&&await O(e,b.SUPPRESSED_PAGES_LIST,JSON.stringify(a))}function Je(e=y){return e===`br:main`?b.STATIC_MAIN_SITE_SEEDED:`${b.STATIC_MAIN_SITE_SEEDED}:${e}`}async function Ye(e,t=y){let n=Je(t),r=await w(e,n);return r===!0||r===`true`}async function Xe(e,t=y,n=!0){let r=Je(t);await O(e,r,n)}function Ze(){let e=s(`/static-main-manifest.json`);if(typeof window<`u`&&window.location?.origin)try{return new URL(e,window.location.origin).toString()}catch{return e}return e}function Qe(e){let t=e.replace(/^\/+/,``),n=`static-main`;if(typeof document<`u`)try{let e=document.getElementById(`shadow-claw-site-config`);if(e?.textContent){let t=JSON.parse(e.textContent);typeof t?.pages?.baseUrl==`string`&&(n=t.pages.baseUrl.replace(/^\/+/,``).replace(/\/+$/,``))}}catch{}let r=s(n?`/${n}/${t}`:`/${t}`);if(typeof window<`u`&&window.location?.origin)try{return new URL(r,window.location.origin).toString()}catch{return r}return r}async function $e(){if(typeof fetch!=`function`)return null;try{let e=Ze(),t=await fetch(e);if(t.ok){if((t.headers?.get?.(`content-type`)||``).includes(`text/html`))return null;let e=await t.json();if(e&&Array.isArray(e.pages))return e}}catch{}return null}async function et(e){if(typeof fetch!=`function`)return null;try{let t=Qe(e),n=await fetch(t);if(n.ok){let t=n.headers?.get?.(`content-type`)||``;if((e.endsWith(`.md`)||e.endsWith(`.markdown`)||e.endsWith(`.json`))&&t.includes(`text/html`))return null;let r=await n.text();return r.includes(`<shadow-claw`)||r.includes(`data-shadow-claw-dsd`)?null:r}}catch{}return null}function tt(e){if(typeof document>`u`)return null;let t=t=>{if(!t||!(t instanceof HTMLElement))return!1;if(!e)return!0;let n=t.getAttribute(`data-initial-path`)?.trim();return!n||n===e},n=document.querySelector(e?`[data-pages-rendered][data-initial-path="${e}"]`:`[data-pages-rendered]`);if(t(n))return n;let r=document.querySelector(`shadow-claw`)?.shadowRoot,i=(r?.querySelector(`shadow-claw-pages`)?.shadowRoot)?.querySelector(e?`[data-pages-rendered][data-initial-path="${e}"]`:`[data-pages-rendered]`)||r?.querySelector(e?`[data-pages-rendered][data-initial-path="${e}"]`:`[data-pages-rendered]`);if(t(i))return i;let a=document.querySelectorAll(`template`);for(let n of Array.from(a)){let r=n.content?.querySelector(e?`[data-pages-rendered][data-initial-path="${e}"]`:`[data-pages-rendered]`);if(t(r))return r;let i=n.content?.querySelectorAll(`template`);if(i)for(let n of Array.from(i)){let r=n.content?.querySelector(e?`[data-pages-rendered][data-initial-path="${e}"]`:`[data-pages-rendered]`);if(t(r))return r}}return null}function Y(e=`index.html`){let t=tt(e);if(!t)return null;let n=t.getAttribute(`data-initial-path`)?.trim();if(n&&n!==e)return null;let r=t.querySelector(`[data-markdown-frontmatter]`),i=null;if(r){let e=r.getAttribute(`data-frontmatter`);if(e)try{i=JSON.parse(e)}catch{}}let a=t.cloneNode(!0),o=a.querySelector(`[data-markdown-frontmatter]`);o&&o.remove();let s=a.innerHTML.trim();if(!s&&!i)return null;if(i&&Object.keys(i).length>0){let e=[`---`];for(let[t,n]of Object.entries(i))typeof n==`string`?e.push(`${t}: ${JSON.stringify(n)}`):typeof n==`number`||typeof n==`boolean`?e.push(`${t}: ${n}`):e.push(`${t}: ${JSON.stringify(n)}`);return e.push(`---`,``),`${e.join(`
|
|
7
|
+
`)}\n${s}`}return s}async function nt(t={}){let r=()=>{let t=null;if(typeof document<`u`){let r=document.getElementById(`shadow-claw-static-manifest`);if(r&&r.textContent)try{let e=JSON.parse(r.textContent);e&&Array.isArray(e.pages)&&(t={...e,pages:[...e.pages]})}catch(e){console.warn(`Failed to parse embedded static main manifest:`,e)}let i=document.querySelectorAll(`script[type="text/markdown"][data-shadow-claw-page]`);if(i.length>0){t||={pages:[]};for(let r of Array.from(i)){let i=r.getAttribute(`data-shadow-claw-page`)?.trim();if(i){let a=r.textContent||``;a=M(a),!a.trim()&&/^memory\.(md|markdown)$/iu.test(i)&&(a=n),!a.trim()&&(i===`index.html`||/^index\.(html?|xhtml)$/iu.test(i))&&(a=Y(i)??e);let o=t.pages.findIndex(e=>e.displayPath===i);o>=0?t.pages[o].content=a:t.pages.push({displayPath:i,content:a})}}}let a=document.getElementById(`shadow-claw-site-config`);if(a?.textContent)try{let r=JSON.parse(a.textContent);if(Array.isArray(r?.pages?.files)){t||={pages:[]};for(let i of r.pages.files)if(typeof i==`string`&&i.trim()){let r=i.trim(),a=``;/^memory\.(md|markdown)$/iu.test(r)?a=n:(r===`index.html`||/^index\.(html?|xhtml)$/iu.test(r))&&(a=Y(r)??e),t.pages.some(e=>e.displayPath===r)||t.pages.push({displayPath:r,content:a})}}}catch{}let o=tt();if(o){t||={pages:[]};let r=o.getAttribute(`data-initial-path`)?.trim()||`index.html`;if(!t.pages.some(e=>e.displayPath===r)){let n=Y(r)??e;t.pages.push({displayPath:r,content:n})}t.pages.some(e=>/^memory\.(md|markdown)$/iu.test(e.displayPath))||t.pages.push({displayPath:`MEMORY.md`,content:n})}}return t};if(t.preferEmbedded!==!1){let e=r();if(e&&e.pages.length>0)return e}if(t.fetchFallback!==!1){let e=await $e();if(e&&e.pages.length>0)return e}if(t.preferEmbedded===!1){let e=r();if(e&&e.pages.length>0)return e}return{pages:[{displayPath:`index.html`,content:e},{displayPath:`MEMORY.md`,content:n}]}}async function rt(e,t,n=[]){for(let[r,i]of Object.entries(t))if(r===`purgePreRenderedStaticPages`&&i===!0){if(n.length>0){let t=n[0],r=n.slice(1).join(`/`);try{r?await q(e,t,r):await Ue(e,t)}catch(e){console.warn(`Failed to purge pre-rendered static pages for ${t}/${r}:`,e)}}}else typeof i==`object`&&i&&await rt(e,i,[...n,r])}function it(){if(typeof document<`u`)try{let e=document.getElementById(`shadow-claw-site-config`);if(e?.textContent){let t=JSON.parse(e.textContent);if(t?.pages?.sortOrder===`desc`)return`desc`;if(t?.pages?.sortOrder===`asc`)return`asc`}}catch{}return`desc`}function at(){if(typeof document<`u`)try{let e=document.getElementById(`shadow-claw-site-config`);if(e?.textContent){let t=JSON.parse(e.textContent)?.pages?.defaultPinnedPage;if(typeof t==`string`&&t.trim().length>0)return t.trim()}}catch{}return null}function ot(){if(typeof document<`u`)try{let e=document.getElementById(`shadow-claw-site-config`);if(e?.textContent){let n=JSON.parse(e.textContent);return{allowList:t(n?.pages?.allowList??n?.pages?.allowlist??n?.allowList??n?.allowlist??[]),denyList:t(n?.pages?.denyList??n?.pages?.denylist??n?.denyList??n?.denylist??[])}}}catch{}return{allowList:[],denyList:[]}}function st(e,t){let n=t??it();return[...e].sort((e,t)=>{let r=e.path,i=t.path,a=r.split(`/`).pop()||``,o=i.split(`/`).pop()||``,s=/^index\.(html?|xhtml)$/iu.test(a),c=/^index\.(html?|xhtml)$/iu.test(o);if(s&&!c)return-1;if(!s&&c)return 1;let l=/^memory\.(md|markdown)$/iu.test(a),u=/^memory\.(md|markdown)$/iu.test(o);return l&&!u?1:!l&&u?-1:n===`asc`?r.localeCompare(i,void 0,{numeric:!0,sensitivity:`base`}):i.localeCompare(r,void 0,{numeric:!0,sensitivity:`base`})})}async function X(e,t,n=`sc:purge-id`,r=`static_main_site_purge_id`){let i=t??`__legacy_purge_pages__`;try{if(He(n)===i)return!0}catch{}try{if(await w(e,r)===i){try{K(n,i)}catch{}return!0}await O(e,r,i);try{K(n,i)}catch{}}catch{try{K(n,i)}catch{}}return!1}async function ct(t,i=y,a=[],o={}){await Le(t,i);let s=await nt(o),c=!1;s.preRenderedStaticPages&&(await X(t,s.purgeId)||(c=!0,await rt(t,s.preRenderedStaticPages)));let l=!1;if(i===`br:main`&&s.skillsPurgeId!==void 0&&!await X(t,s.skillsPurgeId,`sc:skills-purge-id`,`static_main_skills_purge_id`)){l=!0;try{await q(t,i,`.agents/skills/main`)}catch(e){if(!(e&&typeof e==`object`&&`name`in e&&e.name===`NotFoundError`))throw e}try{await q(t,i,`.agents/tools/main`)}catch(e){if(!(e&&typeof e==`object`&&`name`in e&&e.name===`NotFoundError`))throw e}}for(let e of s.pages)if(e.content?.includes(`slug: "shadow-claw--purge-pages"`)){!c&&!await X(t,s.purgeId)&&(c=!0,await Ue(t,i));break}let u=i===`br:main`&&await H(t),d=new Set(s.pages.map(e=>J(i,e.displayPath))),f=c?a.filter(e=>e.groupId!==i||d.has(J(e.groupId,e.path))):[...a],{allowList:p,denyList:m}=ot(),h=0;for(let a of s.pages)if(h++,h%5==0&&await new Promise(e=>setTimeout(e,0)),!a.content?.includes(`slug: "shadow-claw--purge-pages"`)&&r(a.displayPath,{allowList:p,denyList:m,groupId:i})){if(/^memory\.(md|markdown)$/iu.test(a.displayPath)){if(u)continue;let e=typeof a.content==`string`&&a.content.trim().length>0&&a.content!==n?a.content:void 0;if(e===void 0?await W(t,i):await W(t,i,e)){let e=J(i,a.displayPath);f.some(t=>J(t.groupId,t.path)===e)||f.push({groupId:i,path:a.displayPath})}}else if(!await Ge(t,i,a.displayPath))try{if(!await T(t,i,a.displayPath)){let n=a.content;(typeof n!=`string`||!n.trim())&&(n=a.displayPath===`index.html`?Y(`index.html`)??e:await et(a.displayPath)??``),await D(t,i,a.displayPath,n)}let n=J(i,a.displayPath);f.some(e=>J(e.groupId,e.path)===n)||f.push({groupId:i,path:a.displayPath})}catch(e){console.warn(`Failed to seed static page file ${a.displayPath}:`,e)}}if(i===`br:main`){for(let e of s.skills||[]){let n=`.agents/skills/main/${e.displayPath}`;try{await T(t,i,n)||await D(t,i,n,e.content)}catch(e){console.warn(`Failed to seed skill file ${n}:`,e)}}for(let e of s.tools||[]){let n=`.agents/tools/main/${e.displayPath}`;try{(l||!await T(t,i,n))&&await D(t,i,n,e.content)}catch(e){console.warn(`Failed to seed tool file ${n}:`,e)}}}let g=typeof document<`u`&&(document.getElementById(`shadow-claw-static-manifest`)!==null||document.querySelector(`script[type="text/markdown"][data-shadow-claw-page]`)!==null||tt()!==null);o.preferEmbedded!==!1&&g||await Xe(t,i,!0);let _=f.filter(e=>r(e.path,{allowList:p,denyList:m,groupId:e.groupId}));return Object.defineProperty(_,"didPurge",{value:c,enumerable:!1,writable:!0,configurable:!0}),Object.defineProperty(_,"didPurgeSkills",{value:l,enumerable:!1,writable:!0,configurable:!0}),st(_)}var lt=class{_events;_handlers=[];_runs=/* @__PURE__ */ new Map;constructor(e){this._events=e}start(){this._listen(`streaming-start`,this._onStreamingStart),this._listen(`streaming-chunk`,this._onStreamingChunk),this._listen(`streaming-end`,this._onStreamingEnd),this._listen(`streaming-done`,this._onStreamingDone),this._listen(`streaming-error`,this._onStreamingError),this._listen(`tool-activity`,this._onToolActivity)}stop(){for(let{event:e,handler:t}of this._handlers)this._events.off(e,t);this._handlers=[],this._runs.clear()}_emit(e,t){window.dispatchEvent(new CustomEvent(`shadow-claw-agui-event`,{detail:{groupId:e,event:t}}))}_listen(e,t){this._events.on(e,t),this._handlers.push({event:e,handler:t})}_onStreamingChunk=({groupId:e,text:t})=>{let n=this._runs.get(e);n&&n.messageId&&this._emit(e,{type:`TEXT_MESSAGE_CONTENT`,messageId:n.messageId,delta:t,timestamp:Date.now()})};_onStreamingDone=({groupId:e})=>{let t=this._runs.get(e);t&&(t.messageId&&this._emit(e,{type:`TEXT_MESSAGE_END`,messageId:t.messageId,timestamp:Date.now()}),this._emit(e,{type:`RUN_FINISHED`,threadId:t.threadId,runId:t.runId,timestamp:Date.now()}),this._runs.delete(e))};_onStreamingEnd=({groupId:e})=>{let t=this._runs.get(e);t&&t.messageId&&(this._emit(e,{type:`TEXT_MESSAGE_END`,messageId:t.messageId,timestamp:Date.now()}),t.messageId=null)};_onStreamingError=({groupId:e,error:t})=>{let n=this._runs.get(e);n&&(n.messageId&&this._emit(e,{type:`TEXT_MESSAGE_END`,messageId:n.messageId,timestamp:Date.now()}),this._emit(e,{type:`RUN_ERROR`,message:t||`Unknown streaming error`,timestamp:Date.now()}),this._runs.delete(e))};_onStreamingStart=({groupId:e})=>{let t=c(),n=e,r=c();this._runs.set(e,{runId:t,threadId:n,messageId:r,activeToolCallIds:/* @__PURE__ */ new Set}),this._emit(e,{type:`RUN_STARTED`,threadId:n,runId:t,timestamp:Date.now()}),this._emit(e,{type:`TEXT_MESSAGE_START`,messageId:r,role:`assistant`,timestamp:Date.now()})};_onToolActivity=({groupId:e,tool:t,status:n})=>{let r=this._runs.get(e);if(r){if(n===`running`){let n=c();r.activeToolCallIds.add(n),this._emit(e,{type:`TOOL_CALL_START`,toolCallId:n,toolCallName:t,timestamp:Date.now()}),r._lastToolCallId=n}else if(n===`done`||n===`error`){let t=r._lastToolCallId;t&&(r.activeToolCallIds.delete(t),this._emit(e,{type:`TOOL_CALL_END`,toolCallId:t,timestamp:Date.now()}))}}}};const ut=new class{#e=new k.State(0);#t=/* @__PURE__ */ new Map;#n=new k.State([]);clear(){this.#t.forEach((e,t)=>this.clearTimer(t)),this.#t.clear(),this.#n.set([])}clearTimer(e){let t=this.#t.get(e);t?.timeoutId&&clearTimeout(t.timeoutId),this.#t.delete(e)}dismiss(e){this.clearTimer(e),this.#n.set(this.#n.get().filter(t=>t.id!==e))}pause(e){let t=this.#t.get(e);t&&t.timeoutId&&(clearTimeout(t.timeoutId),t.timeoutId=void 0,t.remaining=Math.max(0,t.remaining-(Date.now()-t.startedAt)),this.#t.set(e,t))}resolveAction(e){if(e&&typeof e.label==`string`&&typeof e.onClick==`function`)return e}resolveDuration(e){return typeof e!=`number`||Number.isNaN(e)||e<0?4e3:e}resolveType(e){return e&&[`success`,`warning`,`error`,`info`].includes(e)?e:`info`}resume(e){let t=this.#t.get(e);!t||t.timeoutId||t.remaining<=0||this.scheduleDismiss(e,t.remaining)}scheduleDismiss(e,t){this.clearTimer(e);let n=globalThis.setTimeout(()=>{this.dismiss(e)},t);this.#t.set(e,{timeoutId:n,remaining:t,startedAt:Date.now()})}show(e,t={}){let n=this.#e.get()+1;this.#e.set(n);let r={id:n,message:e,type:this.resolveType(t.type),duration:this.resolveDuration(t.duration),action:this.resolveAction(t.action),createdAt:Date.now()},i=[...this.#n.get(),r];if(i.length>5){let e=i[0];this.clearTimer(e.id),this.#n.set(i.slice(1))}else this.#n.set(i);return r.duration>0&&this.scheduleDismiss(r.id,r.duration),r.id}get toasts(){return this.#n.get()}async runAction(e){let t=this.#n.get().find(t=>t.id===e);t?.action&&await t.action.onClick()}};function dt(e,t={}){return ut.show(e,t)}function ft(e,t=4e3){return ut.show(e,{type:`success`,duration:t})}function Z(e,t=5e3){return ut.show(e,{type:`error`,duration:t})}function pt(e,t){if(!e||typeof e!=`object`)return e;let n=JSON.parse(JSON.stringify(e));for(let e of t)mt(n,e);return n}function mt(e,t){let{op:n,path:r,value:i}=t;if(!r||!r.startsWith(`/`))return;let a=r.split(`/`).slice(1).map(e=>e.replace(/~1/g,`/`).replace(/~0/g,`~`)),o=a.pop();if(o===void 0)return;let s=e;for(let e of a){if(typeof s!=`object`||!s)return;s=s[e]}typeof s==`object`&&s&&(Array.isArray(s)?ht(s,o,n,i):gt(s,o,n,i))}function ht(e,t,n,r){if(n===`add`){if(t===`-`)e.push(r);else{let n=parseInt(t,10);!isNaN(n)&&n>=0&&n<=e.length&&e.splice(n,0,r)}}else if(n===`replace`){let n=parseInt(t,10);!isNaN(n)&&n>=0&&n<e.length&&(e[n]=r)}else if(n===`remove`){let n=parseInt(t,10);!isNaN(n)&&n>=0&&n<e.length&&e.splice(n,1)}}function gt(e,t,n,r){n===`add`||n===`replace`?e[t]=r:n===`remove`&&delete e[t]}function _t(e){if(e==null)return null;let t=String(e).trim().toLowerCase();return[`1`,`true`,`yes`,`on`].includes(t)?!0:![`0`,`false`,`no`,`off`].includes(t)&&null}function vt(e,t=!1){if(e==null)return t;if(typeof e==`boolean`)return e;if(typeof e==`number`)return e===1;if(typeof e==`string`){let t=e.trim().toLowerCase();return t===`true`||t===`1`}return!1}function yt(e){if(!e)return[];try{let n=JSON.parse(e);if(Array.isArray(n))return t(n.map(e=>String(e)))}catch{}return t(e.split(`,`))}function bt(e){if(e){if(Array.isArray(e))return e;if(typeof e==`string`)try{let t=JSON.parse(e);return Array.isArray(t)?t:void 0}catch{return}}}function xt(e){if(typeof e==`boolean`)return e;if(typeof e==`string`){let t=e.trim().toLowerCase();return t===`true`||t===`1`}return typeof e==`number`&&e===1}function St(e){return!!e}async function Q(e,t,n,r){if(!St(r))return!0;if(!e.schedule)return await $(e.id,t,n,r)!==`failed`;try{let r=t.replace(/\/$/,``);return(await fetch(`${r}/tasks`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({...e,subscriberId:n})})).ok}catch{return!1}}async function $(e,t,n,r){if(!St(r))return`missing`;try{let r=t.replace(/\/$/,``),i=`subscriberId=${encodeURIComponent(n)}`,a=await fetch(`${r}/tasks/${encodeURIComponent(e)}?${i}`,{method:`DELETE`});return a.ok?`deleted`:a.status===404||a.status===405?`missing`:`failed`}catch{return`failed`}}async function Ct(e,t,n,r){if(!St(r))return null;try{let r=t.replace(/\/$/,``),i=await fetch(`${r}/tasks?groupId=${encodeURIComponent(e)}&subscriberId=${encodeURIComponent(n)}`,{method:`GET`});if(!i.ok||typeof i.json!=`function`)return null;let a=await i.json();return Array.isArray(a)?a.filter(e=>!!e&&typeof e==`object`&&typeof e.id==`string`&&typeof e.schedule==`string`&&typeof e.prompt==`string`).map(t=>({id:t.id,groupId:t.group_id||t.groupId||e,schedule:t.schedule,type:t.type,prompt:t.prompt,tools:bt(t.tools),channel:typeof t.channel==`string`?t.channel:void 0,enabled:t.enabled===!0||t.enabled===1,lastRun:typeof t.lastRun==`number`?t.lastRun:typeof t.last_run==`number`?t.last_run:null,createdAt:typeof t.createdAt==`number`?t.createdAt:typeof t.created_at==`number`?t.created_at:Date.now(),name:typeof t.name==`string`?t.name:void 0,order:typeof t.order==`number`?t.order:typeof t.task_order==`number`?t.task_order:void 0})):null}catch{return null}}function wt(e,t){let n=(e?.inputTokens??0)+(t.inputTokens??0),r=(e?.outputTokens??0)+(t.outputTokens??0),i=(e?.cacheReadTokens??0)+(t.cacheReadTokens??0),a=(e?.cacheCreationTokens??0)+(t.cacheCreationTokens??0);return{groupId:t.groupId||e?.groupId||``,inputTokens:n,outputTokens:r,cacheReadTokens:i,cacheCreationTokens:a,totalTokens:n+r+i+a,contextLimit:t.contextLimit||e?.contextLimit||0}}var Tt=class e{static DEFAULT_PAGE_PATH=`MEMORY.md`;orchestrator;_activeGroupId;_activePage;_activePinnedPage;_defaultPinnedPage;_activityLog;_activityLogSessionStartedAtByGroup;_aguiAdapter;_aguiEvent;_contextUsage;_currentPath;_db;_error;_files;_gitProxyUrl;_groups;_hadPersistedActivePage;_initResolve;_isTyping;_lastOrchestratorDisplayState=`idle`;_messages;_modelDownloadProgress;_onlineReplayHandler;_pages;_pagesAllowList;_pagesDenyList;_peerStateByGroup;_proxyUrl;_ready;_remoteAgentStatusByGroup;_remoteAgentTypingByGroup;_replayingTaskSyncOutbox;_subscriberId;_sidebarDefaultPage;_state;_storageStatus;_streamingText;_tasks;_taskSyncOutbox;_tokenUsage;_tokenUsageAccumulator=null;_toolActivity;_unreadGroupIds;_useProxy;_vmBashFullInternetAccess;_whenInitialized;_whenReady;_readyResolve;constructor(){this._messages=new k.State([]),this._isTyping=new k.State(!1),this._storageStatus=new k.State(null),this._toolActivity=new k.State(null),this._modelDownloadProgress=new k.State(null),this._activityLog=new k.State([]),this._state=new k.State(`idle`),this._tokenUsage=new k.State(null),this._error=new k.State(null),this._activeGroupId=new k.State(y),this._ready=new k.State(!1),this._tasks=new k.State([]),this._files=new k.State([]),this._currentPath=new k.State(`.`),this._groups=new k.State([]),this._unreadGroupIds=new k.State(/* @__PURE__ */ new Set),this._streamingText=new k.State(null),this._aguiEvent=new k.State(null),this._contextUsage=new k.State(null),this._useProxy=new k.State(!1),this._proxyUrl=new k.State(`/proxy`),this._gitProxyUrl=new k.State(`/git-proxy`),this._vmBashFullInternetAccess=new k.State(!1),this._activePage=new k.State(`pages`);let e=re()?.sidebar?.defaultPage,t=e===`pages`||e===`chat`||e===`tasks`||e===`files`?e:`chat`;this._sidebarDefaultPage=new k.State(t),this._pages=new k.State([]),this._pagesAllowList=new k.State([]),this._pagesDenyList=new k.State([]),this._activePinnedPage=new k.State(null),this._defaultPinnedPage=new k.State(null),this._remoteAgentStatusByGroup=new k.State(/* @__PURE__ */ new Map),this._remoteAgentTypingByGroup=new k.State(/* @__PURE__ */ new Map),this._peerStateByGroup=new k.State(/* @__PURE__ */ new Map),this._hadPersistedActivePage=!1,this._initResolve=null,this._whenInitialized=new Promise(e=>{this._initResolve=e}),this._readyResolve=null,this._whenReady=new Promise(e=>{this._readyResolve=e}),this.orchestrator=null,this._db=null,this._activityLogSessionStartedAtByGroup=/* @__PURE__ */ new Map,this._taskSyncOutbox=[],this._replayingTaskSyncOutbox=!1,this._subscriberId=null,this._onlineReplayHandler=null,this._aguiAdapter=null}get activeGroupId(){return this._activeGroupId.get()}get activePage(){return this._activePage.get()}get activePinnedPage(){return this._activePinnedPage.get()}get defaultPinnedPage(){return this._defaultPinnedPage.get()}get pagesAllowList(){return this._pagesAllowList.get()}get pagesDenyList(){return this._pagesDenyList.get()}isPageAllowed(e,t){return r(e,{allowList:this._pagesAllowList.get(),denyList:this._pagesDenyList.get(),groupId:t??this._activeGroupId.get()})}get effectiveDefaultPage(){let e=this._defaultPinnedPage.get();return e&&this.isPageAllowed(e.path,e.groupId)?e:this._pages.get()[0]||null}get activityLog(){return this._activityLog.get()}get taskServerEnabled(){return this.orchestrator?.taskServerEnabled??!1}get aguiEvent(){return this._aguiEvent.get()}clearError(){this._error.set(null),this._state.get()===`error`&&this._state.set(`idle`)}get contextUsage(){return this._contextUsage.get()}get tokenUsageAccumulator(){return this._tokenUsageAccumulator}get currentPath(){return this._currentPath.get()}get error(){return this._error.get()}get files(){return this._files.get()}getPeerState(e){return this._peerStateByGroup.get().get(e)||null}getRemoteAgentStatus(e){return this._remoteAgentStatusByGroup.get().get(e)||`idle`}getState(){return{messages:this.messages,isTyping:this.isTyping,toolActivity:this.toolActivity,activityLog:this.activityLog,state:this.state,tokenUsage:this.tokenUsage,modelDownloadProgress:this.modelDownloadProgress,error:this.error,activeGroupId:this.activeGroupId,pages:this.pages,ready:this.ready,files:this.files,currentPath:this.currentPath,streamingText:this.streamingText,contextUsage:this.contextUsage}}getTasksForBackup(){return this._tasks.get()}get gitProxyUrl(){return this._gitProxyUrl.get()}get groups(){return this._groups.get()}get hadPersistedActivePage(){return this._hadPersistedActivePage}isRemoteAgentTyping(e){return this._remoteAgentTypingByGroup.get().get(e)||!1}get isTyping(){return this._isTyping.get()}get messages(){return this._messages.get()}get modelDownloadProgress(){return this._modelDownloadProgress.get()}get pages(){return this._pages.get()}get proxyUrl(){return this._proxyUrl.get()}get ready(){return this._ready.get()}sendMessage(e,t=[],n){n===void 0?this.orchestrator?.browserChat?.submit(e,this._activeGroupId.get(),t):this.orchestrator?.browserChat?.submit(e,this._activeGroupId.get(),t,n)}async sendFileToPeer(e,t=this._activeGroupId.get(),n){let r=t.startsWith(`peer:`),i=t.startsWith(`room:`);if(!r&&!i){let e=`Can only send files to peers in a peer or room conversation.`;throw Z(e,4500),Error(e)}let a=this.orchestrator?.router;if(!a){let e=`Network router is not initialized.`;throw Z(e,4500),Error(e)}let o=n?.fileName||e.split(`/`).pop()||e,s=n?.mimeType||`application/octet-stream`,l=n?.size||0;a.setTyping(t,!0);try{let n={path:e,fileName:o,mimeType:s,size:l};if(await a.send(t,``,[n]),this._db){let e={id:c(),groupId:t,sender:`You`,content:``,timestamp:Date.now(),channel:i?`room`:`peerjs`,attachments:[n],isFromMe:!1,isTrigger:!1};await z(this._db,e),this.orchestrator?.events.emit(`message`,e)}ft(`Sent ${o} to ${i?`room peers`:`peer`}`,2500)}catch(e){let t=e instanceof Error?e.message:String(e);throw console.error(`sendFileToPeer error:`,e),Z(`Failed to send file: ${t}`,6e3),e}finally{a.setTyping(t,!1)}}setActiveGroup(e,t,n=this._activePage.get()===`chat`){if(this._activeGroupId.set(t),this._messages.set([]),this._activityLog.set([]),this._error.set(null),this._isTyping.set(!1),this._toolActivity.set(null),this._modelDownloadProgress.set(null),this._streamingText.set(null),this._currentPath.set(`.`),n){let e=new Set(this._unreadGroupIds.get());e.delete(t)&&this._unreadGroupIds.set(e)}this.loadHistory(),this.loadTasks(e),this.loadFiles(e)}setReady(e=!0){this._ready.set(e),e&&this._readyResolve&&this._readyResolve()}setRemoteAgentStatus(e,t){let n=this._remoteAgentStatusByGroup.get(),r=new Map(n);r.set(e,t),this._remoteAgentStatusByGroup.set(r)}setRemoteAgentTyping(e,t){let n=this._remoteAgentTypingByGroup.get(),r=new Map(n);t?r.set(e,!0):r.delete(e),this._remoteAgentTypingByGroup.set(r)}get sidebarDefaultPage(){return this._sidebarDefaultPage.get()}get state(){return this._state.get()}stopCurrentRequest(){this.orchestrator?.stopCurrentRequest?.(this._activeGroupId.get())}get storageStatus(){return this._storageStatus.get()}get streamingText(){return this._streamingText.get()}syncHostWorkspaceToVM(){ve(this.orchestrator,this._activeGroupId.get())}syncVMWorkspaceToHost(){ye(this.orchestrator,this._activeGroupId.get())}get tasks(){return this._tasks.get()}get tokenUsage(){return this._tokenUsage.get()}get toolActivity(){return this._toolActivity.get()}get unreadGroupIds(){return this._unreadGroupIds.get()}get useProxy(){return this._useProxy.get()}get vmBashFullInternetAccess(){return this._vmBashFullInternetAccess.get()}get whenInitialized(){return this._whenInitialized}async resetSiteConfigSeed(e){await O(e,b.SITE_CONFIG_SEEDED,!1)}get whenReady(){return this._whenReady}async addPage(e,t,n=this._activeGroupId.get()){let r=n===`br:main`?this.normalizePagePath(t):t.trim();if(!r||!this.isPageAllowed(r,n))return;let i=this._pages.get();i.some(e=>e.path===r&&e.groupId===n)||(this.setPages([...i,{groupId:n,path:r}]),await qe(e,n,r),n===`br:main`&&r===`MEMORY.md`&&await U(e,!1),await this.persistPages(e))}async clearAllTasks(e){let t=await A(e),n=this._activeGroupId.get(),r=t.filter(e=>e.groupId===n),i=await this.getSubscriberId(e);for(let t of r)await $(t.id,this.getTaskServerBaseUrl(),i,this.orchestrator?.taskServerEnabled??!1)===`failed`?(console.warn(`Failed to delete task "${t.id}" from server — queued for replay.`),await this.queueTaskSyncOutboxOperation(e,{type:`delete`,id:t.id,queuedAt:Date.now()})):await R(e,t.id);await this.loadTasks(e)}async cloneConversation(e,t){let n=await fe(e,t);if(!n)return null;await Te(e,t,n.groupId),await Ee(e,t,n.groupId);try{let r=await E(e,t,`MEMORY.md`);r&&await D(e,n.groupId,`MEMORY.md`,r)}catch{}try{await Me(e,t,n.groupId,`attachments`)}catch{}return this.setActiveGroup(e,n.groupId),await this.loadGroups(e),n}async compactContext(e){if(!this.orchestrator)return;let{compactContext:t}=await import(`./chunk-DMs7kREC.js`);return t(this.orchestrator,e,this._activeGroupId.get())}async createConversation(e,t){let n=await se(e,t);return this.setActiveGroup(e,n.groupId),await this.loadGroups(e),n}async deleteConversation(e,t){if(!(this._groups.get().length<=1)&&(await ue(e,t),await ne(e,t),await this.loadGroups(e),this._activeGroupId.get()===t)){let t=this._groups.get()[0]?.groupId||`br:main`;this.setActiveGroup(e,t)}}async deleteMessage(e,t){await De(e,t),await this.loadHistory(),this.orchestrator?.refreshContextUsage&&await this.orchestrator.refreshContextUsage(e,this._activeGroupId.get())}async deleteTask(e,t){let n=await this.getSubscriberId(e);if(await $(t,this.getTaskServerBaseUrl(),n,this.orchestrator?.taskServerEnabled??!1)===`failed`)throw console.warn(`Failed to delete task from server — queued for replay.`),await this.queueTaskSyncOutboxOperation(e,{type:`delete`,id:t,queuedAt:Date.now()}),Error(`Failed to delete scheduled task on server; task kept locally.`);await R(e,t),await this.loadTasks(e)}async ensurePeerConversation(e,t){let n=`peer:${t}`,r=await I(e);if(!r.find(e=>e.groupId===n)){let i=[...r],a=``;if(this.orchestrator?.peerjsPeerAliases){for(let[e,n]of Object.entries(this.orchestrator.peerjsPeerAliases))if(n===t){a=e;break}}i.push({groupId:n,name:`Peer: ${a||t.substring(0,8)}`,createdAt:Date.now()}),await F(e,i),await this.loadGroups(e)}return n}async grantStorageAccess(e){try{await Be(e),await this.loadFiles(e)}catch(e){console.error(`Failed to grant storage access:`,e)}}async init(e,t){this._db=e,this.orchestrator=t,this._taskSyncOutbox=this.parseTaskSyncOutbox(await w(e,b.TASK_SYNC_OUTBOX)),await this.replayTaskSyncOutbox(e),typeof window<`u`&&!this._onlineReplayHandler&&(this._onlineReplayHandler=()=>{this._db&&this.replayTaskSyncOutbox(this._db)},window.addEventListener(`online`,this._onlineReplayHandler)),t.events.on(`a2ui-surface`,async({groupId:t,envelope:n})=>{t&&this.ensureGroupExists(e,t);let r=this._messages.get(),i=r.findIndex(e=>e.a2uiEnvelopes?.some(e=>e.surfaceId===n.surfaceId));if(i!==-1){let t=r[i],a=[...t.a2uiEnvelopes||[],n],o={...t,a2uiEnvelopes:a},s=[...r];s[i]=o,this._messages.set(s),await z(e,o)}else{let i=!t.startsWith(`peer:`),a={id:c(),groupId:t,sender:i?`agent`:t.replace(/^peer:/,``),content:``,timestamp:Date.now(),channel:t.startsWith(`peer:`)?`peerjs`:`browser`,isFromMe:i,isTrigger:!1,a2uiEnvelopes:[n]};t===this._activeGroupId.get()&&this._messages.set([...r,a]),await z(e,a)}}),t.events.on(`message`,t=>{if(t.groupId&&this.ensureGroupExists(e,t.groupId,t.timestamp),t.groupId&&t.groupId!==this._activeGroupId.get()){let e=new Set(this._unreadGroupIds.get());e.add(t.groupId),this._unreadGroupIds.set(e)}else t.isFromMe&&this._streamingText.get()!==null&&this._streamingText.set(null),this._messages.set([...this._messages.get(),t])}),t.events.on(`typing`,({groupId:e,typing:t})=>{e&&e!==this._activeGroupId.get()||this._isTyping.set(t)}),t.events.on(`tool-activity`,({groupId:e,tool:t,status:n})=>{e&&e!==this._activeGroupId.get()||this._toolActivity.set(n===`running`?{tool:t,status:n}:null)}),t.events.on(`model-download-progress`,e=>{this._modelDownloadProgress.set(e.status===`done`?null:e)}),t.events.on(`thinking-log`,e=>{e.groupId&&e.groupId!==this._activeGroupId.get()||(e.level===`info`&&e.label===`Starting`?this._activityLog.set([e]):this._activityLog.set([...this._activityLog.get(),e]),this.forwardActivityLogEntryToServer(e))}),t.events.on(`state-change`,e=>{let t=typeof e==`string`?e:e.state,n=typeof e==`string`?void 0:e.groupId;if(n&&n!==this._activeGroupId.get())return;let r=this._lastOrchestratorDisplayState;this._lastOrchestratorDisplayState=t,this._state.set(t),t===`idle`&&(this._toolActivity.set(null),this._modelDownloadProgress.set(null),this._streamingText.set(null)),t===`thinking`&&r!==`thinking`&&r!==`responding`&&(this._tokenUsageAccumulator=null)}),t.events.on(`error`,({error:e})=>{console.error(`[Orchestrator Error Event]`,e),this._error.set(e),this._state.set(`error`)}),t.events.on(`session-reset`,()=>{this._messages.set([]),this._activityLog.set([]),this._tokenUsageAccumulator=null,this._tokenUsage.set(null),this._contextUsage.set(null),this._toolActivity.set(null),this._modelDownloadProgress.set(null),this._streamingText.set(null),this._isTyping.set(!1),this._state.set(`idle`)}),t.events.on(`context-compacted`,e=>{e?.groupId&&e.groupId!==this._activeGroupId.get()||(this._tokenUsage.set(null),this.loadHistory())}),t.events.on(`token-usage`,e=>{if(!e||e.groupId&&e.groupId!==this._activeGroupId.get())return;let t=wt(this._tokenUsageAccumulator,e);this._tokenUsageAccumulator=t,this._tokenUsage.set(t),this.orchestrator?.refreshContextUsage&&this._db&&this.orchestrator.refreshContextUsage(this._db,this._activeGroupId.get())}),t.events.on(`context-usage`,e=>{this._contextUsage.set(e)}),t.events.on(`ready`,()=>{this._ready.set(!0)}),t.events.on(`task-change`,()=>{this.loadTasks(e)}),t.events.on(`file-change`,()=>{this.loadFiles(e)}),t.events.on(`streaming-start`,({groupId:e})=>{e===this._activeGroupId.get()&&this._streamingText.set(``)}),t.events.on(`streaming-chunk`,({groupId:e,text:t})=>{if(e!==this._activeGroupId.get())return;let n=this._streamingText.get();this._streamingText.set((n||``)+t)}),t.events.on(`streaming-end`,({groupId:e})=>{e===this._activeGroupId.get()&&this._streamingText.set(null)}),t.events.on(`streaming-done`,({groupId:e})=>{this._activeGroupId.get()}),t.events.on(`streaming-error`,({groupId:e})=>{this._activeGroupId.get()}),this._aguiAdapter=new lt(t.events),this._aguiAdapter.start(),typeof window<`u`&&window.addEventListener(`shadow-claw-agui-event`,(e=>{e.detail.groupId===this._activeGroupId.get()&&this._aguiEvent.set(e.detail);let t=e.detail.event;if(t){if(t.type===`STATE_SNAPSHOT`){let n=new Map(this._peerStateByGroup.get());n.set(e.detail.groupId,t.snapshot||{}),this._peerStateByGroup.set(n)}else if(t.type===`STATE_DELTA`){let n=new Map(this._peerStateByGroup.get()),r=pt(n.get(e.detail.groupId)||{},t.delta||[]);n.set(e.detail.groupId,r),this._peerStateByGroup.set(n)}}})),await d(e),ee(),h(),await L();let n=await w(e,b.PAGES_ALLOW_LIST),r=await w(e,b.PAGES_DENY_LIST);n&&this._pagesAllowList.set(yt(String(n))),r&&this._pagesDenyList.set(yt(String(r))),await L();let o=typeof document<`u`&&document.getElementById(`shadow-claw-static-routing`)!==null,s=await w(e,b.PAGES_LIST),l=s==null?[]:this.parsePagesList(s),u=await ct(e,y,l);u.length>0?(this.setPages(u),await this.persistPages(e)):await this.ensureDefaultPage(e),await L(),await this.applySiteConfigDefaults(e),await L(),await this.loadGroups(e);let f=await w(e,b.LAST_ACTIVE_GROUP);f&&f!==this._activeGroupId.get()&&this._activeGroupId.set(f),await L();let p=await w(e,b.LAST_ACTIVE_PAGE);p&&(this._activePage.set(p),this._hadPersistedActivePage=!0);let m=await w(e,b.SIDEBAR_DEFAULT_PAGE);this._sidebarDefaultPage.set(this.normalizeSidebarDefaultPage(m));let g=at(),_=null;if(g&&(_=i(g)),!_){let t=await w(e,b.DEFAULT_PINNED_PAGE);t&&(_=i(t))}_&&this.isPageAllowed(_.path,_.groupId)&&this._defaultPinnedPage.set(_),await L();let v=typeof window<`u`&&window.history?window.history.state:null,te=!!(v?.inFeedScroll||v?.scrollSpy||v?.suppressRouter)||typeof window<`u`&&window.location&&(()=>{let e=window.location.pathname||`/`,t=a();t!==`/`&&e.startsWith(t)&&(e=`/`+e.slice(t.length));let n=e.split(`/`).filter(Boolean);return n.length===0||n.length===1&&n[0]===`index.html`})(),x=!1;if(te&&_&&this.isPageAllowed(_.path,_.groupId)&&(this._activePinnedPage.set(_),x=!0),!x){let t=await w(e,b.LAST_SELECTED_PINNED_PAGE);if(t)try{let e=JSON.parse(t);e&&typeof e.path==`string`&&typeof e.groupId==`string`&&this.isPageAllowed(e.path,e.groupId)&&(this._activePinnedPage.set(e),x=!0)}catch{}}!x&&te&&this.effectiveDefaultPage&&this.isPageAllowed(this.effectiveDefaultPage.path,this.effectiveDefaultPage.groupId)&&(this._activePinnedPage.set(this.effectiveDefaultPage),x=!0),this.orchestrator&&(this._useProxy.set(this.orchestrator.useProxy),this._proxyUrl.set(this.orchestrator.proxyUrl),this._gitProxyUrl.set(this.orchestrator.gitProxyUrl),this._vmBashFullInternetAccess.set(this.orchestrator.vmBashFullInternetAccess));let[S,C,T]=await Promise.all([w(e,b.SIDEBAR_CHAT_HIDDEN),w(e,b.SIDEBAR_TASKS_HIDDEN),w(e,b.SIDEBAR_FILES_HIDDEN)]),E=re(),D=E?.sidebar?.chatHidden,O=E?.sidebar?.tasksHidden,k=E?.sidebar?.filesHidden,A=S==null?!!D:vt(S),j=C==null?!!O:vt(C),ne=T==null?!!k:vt(T),M=()=>{let t=[];(!A||this.activePage===`chat`)&&t.push(this.loadHistory()),(!j||this.activePage===`tasks`)&&t.push(this.loadTasks(e)),(!ne||this.activePage===`files`)&&t.push(this.loadFiles(e)),Promise.all(t).catch(e=>{console.warn(`Secondary background store loads failed:`,e)})};if(o)typeof window.requestIdleCallback==`function`?window.requestIdleCallback(M,{timeout:2e3}):setTimeout(M,100);else{let t=[];(!A||this.activePage===`chat`)&&t.push(this.loadHistory()),(!j||this.activePage===`tasks`)&&t.push(this.loadTasks(e)),(!ne||this.activePage===`files`)&&t.push(this.loadFiles(e)),await Promise.all(t)}await L(),this._initResolve?.(),this.scheduleBackgroundStaticMainSiteSeeding(e)}async loadFiles(e){let t=this._activeGroupId.get(),n=this._currentPath.get();try{this._storageStatus.set(await u(e));let r=await G(e,t,n);this._files.set(r)}catch(e){console.error(`Failed to load files in store:`,e)}}async loadGroups(e){let t=await I(e);this._groups.set(t)}async loadHistory(){let e=this._activeGroupId.get(),t=await ie(e,200);this._activeGroupId.get()===e&&this._messages.set(t)}async loadTasks(e){let t=this._activeGroupId.get(),n=await A(e),r=n.filter(e=>e.groupId===t);r.sort((e,t)=>{let n=e.order??0,r=t.order??0;return n===r?e.createdAt-t.createdAt:n-r}),this._tasks.set(r);let i=await this.getSubscriberId(e),a=await Ct(t,this.getTaskServerBaseUrl(),i,this.orchestrator?.taskServerEnabled??!1);if(!a)return;let o=new Set(n.map(e=>e.id)),s=a.filter(e=>!o.has(e.id));if(s.length===0)return;for(let t of s)await B(e,t);let c=[...r,...s];c.sort((e,t)=>{let n=e.order??0,r=t.order??0;return n===r?e.createdAt-t.createdAt:n-r}),this._tasks.set(c)}async navigateBackFolder(e){let t=this._currentPath.get();if(t===`.`)return;let n=t.split(`/`).filter(Boolean);n.pop();let r=n.length===0?`.`:n.join(`/`);await this.setCurrentPath(e,r)}async navigateIntoFolder(e,t){let n=this._currentPath.get(),r=n===`.`?t.replace(/\/$/,``):`${n}/${t.replace(/\/$/,``)}`;try{await this.setCurrentPath(e,r)}catch(t){console.error(`Failed to navigate into folder in store:`,t),Z(`Folder not found: ${r}`,4500),await this.loadFiles(e)}}async newSession(e){await this.orchestrator?.newSession?.(e,this._activeGroupId.get()),await this.loadHistory()}async removePage(t,n,r=this._activeGroupId.get()){let i=this.normalizePagePath(n);if(!i)return;let a=this._pages.get();if(!a.some(e=>e.path===i&&e.groupId===r))return;let o=a.filter(e=>e.path!==i||e.groupId!==r);await Ke(t,r,i);let s=r===`br:main`&&i===`MEMORY.md`;s&&await U(t,!0);let c=s||await H(t);if(o.length===0&&!c){if(await W(t,`br:main`))o.push({groupId:y,path:e.DEFAULT_PAGE_PATH});else return}this.setPages(o);let l=this._defaultPinnedPage.get();l&&l.path===i&&l.groupId===r&&await this.setDefaultPinnedPage(t,null),await this.persistPages(t)}async removeAllPages(e){let t=[...this._pages.get()];for(let n of t)await Ke(e,n.groupId,n.path),n.groupId===`br:main`&&n.path===`MEMORY.md`&&await U(e,!0);this.setPages([]),await this.setDefaultPinnedPage(e,null),await this.setActivePinnedPage(e,null),await this.persistPages(e)}async renameConversation(e,t,n){await ce(e,t,n),await this.loadGroups(e)}async reorderConversations(e,t){await de(e,t),await this.loadGroups(e)}async reorderTasks(e,t,n){let r=await je(e,t,n);await this.loadTasks(e);let i=await this.getSubscriberId(e);for(let t of r)await Q(t,this.getTaskServerBaseUrl(),i,this.orchestrator?.taskServerEnabled??!1)||(console.warn(`Failed to sync reordered task "${t.id}" to server — queued for replay.`),await this.queueTaskSyncOutboxOperation(e,{type:`upsert`,id:t.id,task:t,queuedAt:Date.now()}))}async replayTaskSyncOutbox(e){if(!(this._replayingTaskSyncOutbox||this._taskSyncOutbox.length===0)){this._replayingTaskSyncOutbox=!0;try{let t=await this.getSubscriberId(e),n=[];for(let e of this._taskSyncOutbox){let r=this.getTaskServerBaseUrl();(e.type===`upsert`?await Q(e.task,r,t,this.orchestrator?.taskServerEnabled??!1):await $(e.id,r,t,this.orchestrator?.taskServerEnabled??!1))||n.push(e)}this._taskSyncOutbox=this.compactTaskSyncOutbox(n),await this.persistTaskSyncOutbox(e)}finally{this._replayingTaskSyncOutbox=!1}}}async resetToRootFolder(e){await this.setCurrentPath(e,`.`)}async restartCurrentRequest(){return this.orchestrator?.restartCurrentRequest?this.orchestrator.restartCurrentRequest(this._activeGroupId.get()):!1}async restoreTasksFromBackup(e,t){await this.clearAllTasks(e);let n=this._activeGroupId.get();for(let r of t){let t={...r,groupId:n,id:crypto.randomUUID?crypto.randomUUID():`task-${Date.now()}-${Math.random()}`};await this.upsertTask(e,t,{reloadTasks:!1})}await this.loadTasks(e)}async runTask(e,t=!1){let n=this._db;if(t&&n&&(await Ae(e.id,Date.now()),await this.loadTasks(n)),e.type===`tools`&&Array.isArray(e.tools)&&e.tools.length>0){if(this.orchestrator?.agentWorker){let n=e.subagent?`subagent:${c()}`:e.groupId;this.orchestrator.agentWorker.postMessage({type:`execute-task-tools`,payload:{groupId:n,tools:e.tools,isManual:t}})}else console.error(`Agent worker not available to execute tool task.`)}else{if(!e.groupId){console.error(`Task ${e.id} has no groupId - refusing to execute in active conversation to prevent context pollution.`);return}this.orchestrator?.browserChat?.submit(e.prompt,e.groupId,[],void 0,e.freshContext,e.subagent)}}async setActivePage(e,t){this._activePage.set(t),await O(e,b.LAST_ACTIVE_PAGE,t);let n=this.resolveSidebarDefaultPageForActivePage(t);n!==this._sidebarDefaultPage.get()&&(this._sidebarDefaultPage.set(n),await O(e,b.SIDEBAR_DEFAULT_PAGE,n))}async setActivePinnedPage(e,t){t&&!this.isPageAllowed(t.path,t.groupId)&&(t=this.effectiveDefaultPage),this._activePinnedPage.set(t),t?await O(e,b.LAST_SELECTED_PINNED_PAGE,JSON.stringify(t)):await O(e,b.LAST_SELECTED_PINNED_PAGE,null)}async setDefaultPinnedPage(e,t){if(t&&!this.isPageAllowed(t.path,t.groupId))return;let n=this._defaultPinnedPage.get(),r=n&&t&&n.path===t.path&&n.groupId===t.groupId?null:t;this._defaultPinnedPage.set(r),r?await O(e,b.DEFAULT_PINNED_PAGE,JSON.stringify(r)):await O(e,b.DEFAULT_PINNED_PAGE,null)}async reorderPages(e,t){this.setPages(t),await this.persistPages(e)}async setCurrentPath(e,t){let n=t.replace(/^\/+|\/+$/g,``)||`.`,r=this._activeGroupId.get();this._storageStatus.set(await u(e));let i=await G(e,r,n);this._currentPath.set(n),this._files.set(i)}async setGitProxyUrl(e,t){this.orchestrator&&(await xe(this.orchestrator,e,t),this._gitProxyUrl.set(this.orchestrator.gitProxyUrl))}async setProxyUrl(e,t){this.orchestrator&&(await Se(this.orchestrator,e,t),this._proxyUrl.set(this.orchestrator.proxyUrl))}async setUseProxy(e,t){this.orchestrator&&(await Ce(this.orchestrator,e,t),this._useProxy.set(this.orchestrator.useProxy))}async setVMBashFullInternetAccess(e,t){this.orchestrator&&(await we(this.orchestrator,e,t),this._vmBashFullInternetAccess.set(this.orchestrator.vmBashFullInternetAccess))}async switchConversation(e,t,n){this.setActiveGroup(e,t,n??this._activePage.get()===`chat`),await O(e,b.LAST_ACTIVE_GROUP,t)}async toggleTask(e,t,n){let r={...t,enabled:n};await B(e,r),await this.loadTasks(e),await Q(r,this.getTaskServerBaseUrl(),await this.getSubscriberId(e),this.orchestrator?.taskServerEnabled??!1)||(console.warn(`Failed to update task on server — queued for replay.`),await this.queueTaskSyncOutboxOperation(e,{type:`upsert`,id:r.id,task:r,queuedAt:Date.now()}))}async updateConversationPinnedProvider(e,t,n,r,i){await pe(e,t,n,r,i),await this.loadGroups(e)}async updateConversationProviderRuntimeOverrides(e,t,n){await he(e,t,n),await this.loadGroups(e)}async updateConversationSubagentSettings(e,t,n,r,i,a){await me(e,t,n,r,i,a),await this.loadGroups(e)}async updateConversationToolTags(e,t,n){await le(e,t,n),await this.loadGroups(e)}async upsertTask(e,t,n){let r=n?.reloadTasks!==!1;await B(e,t),r&&await this.loadTasks(e);let i=await this.getSubscriberId(e);await Q(t,this.getTaskServerBaseUrl(),i,this.orchestrator?.taskServerEnabled??!1)||(console.warn(`Failed to sync task to server — queued for replay.`),await this.queueTaskSyncOutboxOperation(e,{type:`upsert`,id:t.id,task:t,queuedAt:Date.now()}))}compactTaskSyncOutbox(e){let t=/* @__PURE__ */ new Map;return e.forEach((e,n)=>{t.set(e.id,n)}),e.filter((e,n)=>t.get(e.id)===n)}deriveGroupName(e){return e.startsWith(`tg:`)?`Telegram ${e.slice(3)}`:e.startsWith(`im:`)?`iMessage ${e.slice(3)}`:e.startsWith(`br:`)?e===`br:main`?`Main`:`Browser Conversation`:`Conversation`}getActivityLogSessionStartedAt(e){let t=this._activityLogSessionStartedAtByGroup.get(e);if(t)return t;let n=(/* @__PURE__ */ new Date()).toISOString();return this._activityLogSessionStartedAtByGroup.set(e,n),n}getTaskServerBaseUrl(){return this.orchestrator?.taskServerUrl??`/schedule`}async getSubscriberId(e){if(this._subscriberId)return this._subscriberId;let t=await ke(e);return this._subscriberId=t,t}normalizePagePath(t){let n=t.trim().replace(/^\/+/,``).replace(/\/+/g,`/`);return n===`main/memory.md`?e.DEFAULT_PAGE_PATH:n}normalizeSidebarDefaultPage(e){return e===`pages`||e===`chat`||e===`tasks`||e===`files`?e:`chat`}parsePagesList(e){if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t)?t.map(e=>{if(typeof e==`string`)return{groupId:y,path:this.normalizePagePath(e)};if(!e||typeof e!=`object`)return null;let t=e;if(typeof t.path!=`string`)return null;let n=typeof t.groupId==`string`&&t.groupId.trim().length>0?t.groupId:y,r=n===`br:main`?this.normalizePagePath(t.path):t.path.trim();return r?{groupId:n,path:r}:null}).filter(e=>!!e).filter((e,t,n)=>{let r=`${e.groupId}\u0000${e.path}`;return t===n.findIndex(e=>`${e.groupId}\u0000${e.path}`===r)}):[]}catch{return[]}}parseTaskSyncOutbox(e){if(!e)return[];try{let t=JSON.parse(e);if(!Array.isArray(t))return[];let n=t.filter(e=>!!e&&typeof e==`object`).filter(e=>e.type===`upsert`||e.type===`delete`).filter(e=>typeof e.id==`string`&&e.id.length>0).map(e=>({...e,queuedAt:typeof e.queuedAt==`number`?e.queuedAt:Date.now()}));return this.compactTaskSyncOutbox(n)}catch{return[]}}resolveSidebarDefaultPageForActivePage(e){return e===`pages`||e===`chat`||e===`tasks`||e===`files`?e:this._sidebarDefaultPage.get()}setPages(e){let t=e.filter(e=>this.isPageAllowed(e.path,e.groupId)),n=t.filter(e=>e.path.toLowerCase()===`memory.md`),r=t.filter(e=>e.path.toLowerCase()!==`memory.md`);this._pages.set([...r,...n])}async ensureDefaultPage(t){if(await H(t))return;let n=await W(t,y);await Le(t,y),!(!n||this._pages.get().length>0)&&(this.setPages([{groupId:y,path:e.DEFAULT_PAGE_PATH}]),await this.persistPages(t))}async ensureGroupExists(e,t,n){let r=this._groups.get();if(r.some(e=>e.groupId===t))return;let i=[...r,{groupId:t,name:this.deriveGroupName(t),createdAt:n||Date.now()}];this._groups.set(i);try{await F(e,i)}catch(e){console.error(`Failed to persist new conversation metadata:`,e)}}async forwardActivityLogEntryToServer(e){if(!this._db||!xt(await w(this._db,b.ACTIVITY_LOG_DISK_LOGGING_ENABLED)))return;let t=typeof e.groupId==`string`&&e.groupId?e.groupId:this._activeGroupId.get();if(!t)return;let n=typeof e.message==`string`?e.message.trim():``;if(!n)return;e.level===`info`&&e.label===`Starting`&&this._activityLogSessionStartedAtByGroup.set(t,(/* @__PURE__ */ new Date()).toISOString());let r=this.getActivityLogSessionStartedAt(t);try{await fetch(`/activity-log`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({groupId:t,level:e.level,label:e.label,message:n,timestamp:(/* @__PURE__ */ new Date()).toISOString(),sessionStartedAt:r})})}catch(e){console.warn(`Failed to persist activity log entry to server:`,e)}}scheduleBackgroundStaticMainSiteSeeding(e){if(typeof window>`u`)return;let t=async()=>{try{if(await Ye(e,`br:main`))return;let t=await w(e,b.PAGES_LIST),n=t==null?[]:this.parsePagesList(t),r=await ct(e,y,n,{preferEmbedded:!1});r&&r.length>0&&(this.setPages(r),await this.persistPages(e))}catch(e){console.warn(`Background static main site seeding failed:`,e)}};typeof window.requestIdleCallback==`function`?window.requestIdleCallback(()=>void t(),{timeout:3e3}):setTimeout(()=>void t(),100)}async persistPages(e){await O(e,b.PAGES_LIST,JSON.stringify(this._pages.get()))}async persistTaskSyncOutbox(e){await O(e,b.TASK_SYNC_OUTBOX,JSON.stringify(this._taskSyncOutbox))}async queueTaskSyncOutboxOperation(e,t){this._taskSyncOutbox=this.compactTaskSyncOutbox([...this._taskSyncOutbox,t]),await this.persistTaskSyncOutbox(e)}async applySiteConfigDefaults(e){if(typeof document<`u`)try{let n=re();if(!n||typeof n!=`object`)return;_(n),ee(),h();let r=n.customElements;if((await I(e)).find(e=>e.groupId===`br:main`)?.toolTags&&await le(e,y,void 0),(n.settings?.internetAccess??n.settings?.vm_bash_full_internet_access??n.settings?.fullInternetAccess??n.internetAccess)===!0&&await w(e,b.VM_BASH_FULL_INTERNET_ACCESS)!==`true`&&(await O(e,b.VM_BASH_FULL_INTERNET_ACCESS,`true`),this.orchestrator&&(this.orchestrator.vmBashFullInternetAccess=!0),this._vmBashFullInternetAccess.set(!0)),n.pages&&typeof n.pages==`object`){let{defaultPinnedPage:t}=n.pages;if(t&&typeof t==`string`){let n=i(t);n&&this.isPageAllowed(n.path,n.groupId)&&(this._defaultPinnedPage.set(n),await O(e,b.DEFAULT_PINNED_PAGE,JSON.stringify(n)))}}let a=n.allowedCustomElements||(typeof r==`object`&&!Array.isArray(r)?r.allowedElements:void 0);a!==void 0&&(await w(e,b.ALLOWED_CUSTOM_ELEMENTS)??await O(e,b.ALLOWED_CUSTOM_ELEMENTS,JSON.stringify(a)));let o=n.allowedCustomElementDomains||(typeof r==`object`&&!Array.isArray(r)?r.allowedDomains:void 0);if(o!==void 0&&(await w(e,b.ALLOWED_CUSTOM_ELEMENT_HOST_PATTERNS)??await O(e,b.ALLOWED_CUSTOM_ELEMENT_HOST_PATTERNS,JSON.stringify(o))),n.sidebar&&typeof n.sidebar==`object`){let{pagesHidden:t,chatHidden:r,tasksHidden:i,filesHidden:a,defaultPage:o}=n.sidebar;if(t!==void 0&&(await w(e,b.SIDEBAR_PAGES_HIDDEN)??await O(e,b.SIDEBAR_PAGES_HIDDEN,String(!!t))),r!==void 0&&(await w(e,b.SIDEBAR_CHAT_HIDDEN)??await O(e,b.SIDEBAR_CHAT_HIDDEN,String(!!r))),i!==void 0&&(await w(e,b.SIDEBAR_TASKS_HIDDEN)??await O(e,b.SIDEBAR_TASKS_HIDDEN,String(!!i))),a!==void 0&&(await w(e,b.SIDEBAR_FILES_HIDDEN)??await O(e,b.SIDEBAR_FILES_HIDDEN,String(!!a))),o&&typeof o==`string`){let t=this.normalizeSidebarDefaultPage(o);this._sidebarDefaultPage.set(t),await w(e,b.SIDEBAR_DEFAULT_PAGE)||await O(e,b.SIDEBAR_DEFAULT_PAGE,o)}}if(n.settings&&typeof n.settings==`object`){let{assistantName:t,defaultProvider:r,provider:i,defaultModel:a,model:o}=n.settings;t&&typeof t==`string`&&(await w(e,b.ASSISTANT_NAME)||await O(e,b.ASSISTANT_NAME,t));let s=r??i;if(typeof s==`string`&&s.trim().length>0&&!await w(e,b.PROVIDER)){let t=s.trim();await O(e,b.PROVIDER,t),this.orchestrator&&(this.orchestrator.provider=t)}let c=a??o;if(typeof c==`string`&&c.trim().length>0&&!await w(e,b.MODEL)){let t=c.trim();await O(e,b.MODEL,t),this.orchestrator&&(this.orchestrator.model=t)}let l=n.settings.internetAccess??n.settings.vm_bash_full_internet_access??n.settings.fullInternetAccess??n.internetAccess;typeof l==`boolean`&&(await w(e,b.VM_BASH_FULL_INTERNET_ACCESS)??(await O(e,b.VM_BASH_FULL_INTERNET_ACCESS,String(l)),this.orchestrator&&(this.orchestrator.vmBashFullInternetAccess=l),this._vmBashFullInternetAccess.set(l)))}let s=(n.settings&&typeof n.settings==`object`?n.settings.defaultToolsProfile:void 0)??n.defaultToolsProfile;if(typeof s==`string`&&s.trim().length>0&&!await w(e,b.ACTIVE_TOOL_PROFILE)){let t=s.trim();if(t.toLowerCase()===`none`)await j.deactivateProfile(e);else{let n=j.profiles.find(e=>e.id.toLowerCase()===t.toLowerCase()||e.name.toLowerCase()===t.toLowerCase());n?await j.activateProfile(e,n.id):console.warn(`Default tools profile "${t}" specified in site-config was not found.`)}}if(n.pages&&typeof n.pages==`object`){let{defaultPinnedPage:t}=n.pages;t&&typeof t==`string`&&(await w(e,b.DEFAULT_PINNED_PAGE)||await O(e,b.DEFAULT_PINNED_PAGE,t))}let c=n.pages?.allowList??n.pages?.allowlist??n.allowList??n.allowlist,l=n.pages?.denyList??n.pages?.denylist??n.denyList??n.denylist;if(Array.isArray(c)&&await w(e,b.PAGES_ALLOW_LIST)==null){let n=t(c.map(String));this._pagesAllowList.set(n),await O(e,b.PAGES_ALLOW_LIST,JSON.stringify(n))}if(Array.isArray(l)&&await w(e,b.PAGES_DENY_LIST)==null){let n=t(l.map(String));this._pagesDenyList.set(n),await O(e,b.PAGES_DENY_LIST,JSON.stringify(n))}await O(e,b.SITE_CONFIG_SEEDED,`true`);let u=this._pages.get(),d=u.filter(e=>this.isPageAllowed(e.path,e.groupId));d.length!==u.length&&(this.setPages(d),await this.persistPages(e));let f=this._activePinnedPage.get();f&&!this.isPageAllowed(f.path,f.groupId)&&await this.setActivePinnedPage(e,this.effectiveDefaultPage);let p=this._defaultPinnedPage.get();if(p&&!this.isPageAllowed(p.path,p.groupId)&&await this.setDefaultPinnedPage(e,null),Array.isArray(n.enabledTools)){let t=n.enabledTools.filter(e=>typeof e==`string`&&e.trim().length>0);await j.setAllEnabled(e,t),await j.setAllDeclarativeEnabled(e,t)}await O(e,b.SITE_CONFIG_SEEDED,`true`)}catch(e){console.warn(`Failed to apply site-config defaults:`,e)}}};const Et=new Tt;export{I as _,dt as a,G as c,B as d,z as f,_e as g,ge as h,_t as i,U as l,R as m,wt as n,Ke as o,ke as p,Et as r,q as s,Tt as t,Ie as u,ie as v};
|
package/dist/cli/cli.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{t as e}from"./chunk-uAI_Zi6n.js";import{g as t,h as n,i as r}from"./chunk-yiVdvGCJ.js";import{t as i}from"./chunk-gvNsvav0.js";import{c as a,i as o,o as s,s as c}from"./chunk-YrgA1KKk.js";import{t as l}from"./chunk-sC-eQ-Nh.js";import{t as u}from"./chunk-Cpdoq2Nw.js";import{n as d}from"./chunk-CX2itile.js";import{t as f}from"./chunk-C8DBACtx.js";import{i as p}from"./chunk-C8KihxBF.js";import m from"node:fs";import h from"node:path";import{fileURLToPath as g}from"node:url";import _ from"node:process";import{exec as v}from"node:child_process";import{mkdir as y,mkdtemp as b,readFile as x,stat as S,writeFile as C}from"node:fs/promises";import{Command as w}from"commander";import T from"process";import E from"node:http";import{tmpdir as D}from"node:os";import ee from"node:readline";async function O(e={}){let t=new l(e);try{let e=await t.listClients();if(!e||e.length===0){console.log(`No clients currently registered or connected.`);return}console.log(`Connected / registered clients (${e.length}):\n`),e.forEach((e,t)=>{let n=Math.max(0,Math.floor((Date.now()-e.lastSeen)/1e3)),r=n<60?`${n}s ago`:`${Math.floor(n/60)}m ago`;console.log(` ${t+1}. ${e.deviceLabel} (id: ${e.clientId})`),e.peerId&&console.log(` Peer ID: ${e.peerId}`),console.log(` Capabilities: ${e.capabilities.join(`, `)||`none`}`),console.log(` Version: ${e.version}`),console.log(` Last seen: ${r}\n`)})}catch(e){console.error(`Error fetching clients: ${e.message}`),T.exitCode=1}}async function te(e,t={}){if(!e||typeof e!=`string`||!e.trim()){console.error(`Error: Message cannot be empty.`),T.exitCode=1;return}let n=new l(t);try{let r=t.client;if(!r){let e=await n.listClients();if(!e||e.length===0){console.error(`Error: No clients are connected.`),T.exitCode=1;return}r=e[0].clientId,console.log(`Targeting client: ${e[0].deviceLabel||r} (${r})`)}let i=r||``,a=t.timeout?Number(t.timeout)*1e3:12e4,o;if(t.file?(console.log(`Sending message with file "${t.file}" to ${i}...`),o=await n.sendFile(i,t.file,{prompt:e.trim(),groupId:t.group,timeoutMs:a})):(console.log(`Sending message to ${i}...`),o=await n.sendCommand(i,`send-message`,{text:e.trim(),groupId:t.group},a)),o.success){if(console.log(`Message successfully dispatched.`),o.data?.reply||o.data?.text){let e=o.data.reply||o.data.text;console.log(``),console.log(`Response from ${i}:`),console.log(`----------------------------------------`),console.log(e),console.log(`----------------------------------------`)}else o.data&&(t.json,console.log(JSON.stringify(o.data,null,2)))}else console.error(`Error from client: ${o.error||`Unknown error`}`),T.exitCode=1}catch(e){console.error(`Error sending message: ${e.message}`),T.exitCode=1}}async function k(e,t={}){if(!e||typeof e!=`string`||!e.trim()){console.error(`Error: File path cannot be empty.`),T.exitCode=1;return}let n=h.resolve(e.trim());if(!m.existsSync(n)){console.error(`Error: File not found: ${e}`),T.exitCode=1;return}let r=m.statSync(n);if(r.isDirectory()){console.error(`Error: Cannot send directory: ${e}`),T.exitCode=1;return}let i=new l(t);try{let e=t.client;if(!e){let t=await i.listClients();if(!t||t.length===0){console.error(`Error: No clients are connected.`),T.exitCode=1;return}e=t[0].clientId,console.log(`Targeting client: ${t[0].deviceLabel||e} (${e})`)}let a=e||``,o=t.name||h.basename(n);console.log(`Sending "${o}" (${r.size} bytes) to ${a}...`);let s=t.timeout?Number(t.timeout)*1e3:12e4,c=await i.sendFile(a,n,{prompt:t.prompt,name:t.name,groupId:t.group,timeoutMs:s});if(c.success){if(console.log(`File "${o}" successfully transferred to ${a}.`),c.data?.path&&console.log(`Remote location: ${c.data.path}`),c.data?.reply||c.data?.text){let e=c.data.reply||c.data.text;console.log(``),console.log(`Response from ${a}:`),console.log(`----------------------------------------`),console.log(e),console.log(`----------------------------------------`)}else t.json&&c.data&&console.log(JSON.stringify(c.data,null,2))}else console.error(`Error from client: ${c.error||`Unknown error`}`),T.exitCode=1}catch(e){console.error(`Error sending file: ${e.message}`),T.exitCode=1}}async function A(e=`trigger`,t={}){let n=new l(t);try{if(e===`list`){let e=await n.listBackups(t.client);if(!e||e.length===0){console.log(`No backups found.`);return}console.log(`Available backups (${e.length}):\n`),e.forEach((e,t)=>{let n=new Date(e.timestamp).toISOString(),r=(e.totalBytes/1048576).toFixed(2);console.log(` ${t+1}. [${e.id}] Client: ${e.clientId}`),console.log(` Date: ${n}`),console.log(` Files: ${e.fileCount} (${r} MB)\n`)});return}if(e===`delete`){if(!t.backupId){console.error(`Error: --backup-id is required for delete action.`),T.exitCode=1;return}await n.deleteBackup(t.backupId,t.client),console.log(`Backup ${t.backupId} deleted.`);return}let r=t.client;if(!r){let e=await n.listClients();if(!e||e.length===0){console.error(`Error: No clients are connected to back up.`),T.exitCode=1;return}r=e[0].clientId}let i=r||``;console.log(`Requesting backup from client ${i}...`);let a=await n.sendCommand(i,`trigger-backup`,{groupId:t.group,token:n.token});a.success?(console.log(`Backup completed successfully.`),console.log(JSON.stringify(a.data,null,2))):(console.error(`Backup failed: ${a.error}`),T.exitCode=1)}catch(e){console.error(`Error executing backup command: ${e.message}`),T.exitCode=1}}async function j(e={}){let t=new l(e);try{let n=e.client;if(!n){let e=await t.listClients();if(!e||e.length===0){console.error(`Error: No clients connected.`),T.exitCode=1;return}n=e[0].clientId}let r=n||``;console.log(`Fetching tasks from client ${r}${e.group?` (group: ${e.group})`:``}...`);let i=await t.sendCommand(r,`list-tasks`,{groupId:e.group});if(i.success){let t=i.data?.tasks||[];if(t.length===0){console.log(e.group?`No tasks configured on client for group "${e.group}".`:`No tasks configured on client.`);return}console.log(`Tasks on ${n}${e.group?` (group: ${e.group})`:``} (${t.length}):\n`),t.forEach((e,t)=>{let n=e.enabled?`[enabled]`:`[disabled]`,r=e.name||e.prompt?.slice(0,30)||`Untitled task`;console.log(` ${t+1}. ${n} ${r} (${e.schedule||`manual`})`)})}else console.error(`Failed to list tasks: ${i.error}`),T.exitCode=1}catch(e){console.error(`Error executing tasks command: ${e.message}`),T.exitCode=1}}async function M(e=`get`,t={}){let n=t.cacheDir,r=o(n),i=!!(t.renew||e===`renew`||e===`generate`||e===`new`),l=t.set||(e===`set`&&t.id?t.id:null),u=``,d=!1;if(l)u=a(l,n),d=!0;else if(i)u=a(void 0,n),d=!0;else{let e=c(n);e?(u=e,d=!1):(u=s(void 0,n),d=!0)}return t.quiet?(console.log(u),{peerId:u,filePath:r,isRenewed:d}):t.json?(console.log(JSON.stringify({peerId:u,filePath:r,renewed:d},null,2)),{peerId:u,filePath:r,isRenewed:d}):(console.log(l?`WebRTC CLI Peer ID set to: ${u}`:d?`WebRTC CLI Peer ID created/renewed: ${u}`:`WebRTC CLI Peer ID: ${u}`),console.log(`Stored in: ${r}`),{peerId:u,filePath:r,isRenewed:d})}function N(e,t){return typeof e==`string`?t===`raw`?e.startsWith(`shadowclaw_client_`)?e.slice(18):e:e.startsWith(`shadowclaw_client_`)?e:`shadowclaw_client_${e}`:e}function P(e){return N(e,`raw`)}function F(e){return N(e,`exposed`)}const I=[{name:`shadowclaw_server_list_clients`,description:`List connected browser and Electron clients, including device type, ID, and active capabilities.`,inputSchema:{type:`object`,properties:{}}},{name:`shadowclaw_server_send_message`,description:`Send a message or prompt to a connected ShadowClaw client's active AI orchestrator queue.`,inputSchema:{type:`object`,properties:{text:{type:`string`,description:`The prompt or message text to dispatch.`},clientId:{type:`string`,description:`Target client ID. If omitted, targets the first available connected client.`},groupId:{type:`string`,description:`Target conversation group ID (e.g. 'br:main'). If omitted, targets the active group.`}},required:[`text`]}},{name:`shadowclaw_server_read_state`,description:`Read the current orchestrator state (idle, responding, etc.), active group ID, and capabilities from a connected client.`,inputSchema:{type:`object`,properties:{clientId:{type:`string`,description:`Target client ID (defaults to first available connected client).`}}}},{name:`shadowclaw_server_list_tasks`,description:`List scheduled background tasks configured on a connected client (optionally filtered by conversation group).`,inputSchema:{type:`object`,properties:{clientId:{type:`string`,description:`Target client ID (defaults to first available connected client).`},groupId:{type:`string`,description:`Optional conversation group ID filter.`}}}},{name:`shadowclaw_server_set_active_client`,description:`Set the active default connected client used when no clientId is explicitly provided in tool calls.`,inputSchema:{type:`object`,properties:{clientId:{type:`string`,description:`Target client ID (or index '0', '1', prefix, or device label) to make active.`}},required:[`clientId`]}},{name:`shadowclaw_server_manage_backup`,description:`Trigger or manage OPFS workspace file backups for a connected client (trigger, list, or delete).`,inputSchema:{type:`object`,properties:{action:{type:`string`,enum:[`trigger`,`list`,`delete`],description:`Backup action to perform (default: 'trigger').`,default:`trigger`},clientId:{type:`string`,description:`Target client ID.`},backupId:{type:`string`,description:`Backup snapshot ID (required for 'delete').`},groupId:{type:`string`,description:`Optional workspace conversation group ID.`}}}},{name:`shadowclaw_server_status`,description:`Query ShadowClaw Node server status, version, and active client count.`,inputSchema:{type:`object`,properties:{}}},{name:`shadowclaw_server_send_notification`,description:`Broadcast an OS-level push notification to subscribed devices via Web Push (VAPID), or send to a specific registered client. Works even when the client browser tab is closed, asleep, or running in the background.`,inputSchema:{type:`object`,properties:{title:{type:`string`,description:`Notification title (default: 'ShadowClaw').`},body:{type:`string`,description:`The notification body message text.`},clientId:{type:`string`,description:`Target client ID, prefix, or device label of a specific client that has registered in the past. If omitted, broadcasts to all subscribed devices.`}},required:[`body`]}}];function L(e,t){try{let n=typeof e.getConnectedClients==`function`?e.getConnectedClients():typeof e.listClients==`function`?e.listClients():[];if(Array.isArray(n)&&n.length>0){if(typeof t==`string`&&t.trim()){let e=t.trim(),r=n.find(t=>(t.clientId||t.id)===e);if(r)return r.clientId||r.id||``;let i=parseInt(e,10);if(!isNaN(i)&&i>=0&&i<n.length)return n[i].clientId||n[i].id||``;let a=n.find(t=>(t.clientId||t.id||``).startsWith(e)||(t.clientId||t.id||``).replace(/^client-/,``).startsWith(e));if(a)return a.clientId||a.id||``;let o=n.find(t=>t.deviceLabel?.toLowerCase().includes(e.toLowerCase()));return o?o.clientId||o.id||``:e}if(typeof e.getActiveClientId==`function`){let t=e.getActiveClientId();if(t)return t}return n[0].clientId||n[0].id||``}}catch{}return typeof t==`string`?t.trim():``}const ne=h.dirname(g(import.meta.url));function re(){try{let e=h.resolve(ne,`../../../package.json`);if(m.existsSync(e)){let t=JSON.parse(m.readFileSync(e,`utf8`));if(t.version)return t.version}}catch{}return`1.27.1`}const R=`shadowclaw_local_`,ie=I;function z(e,t=R){let n=e.inputSchema||e.input_schema,r=n&&typeof n==`object`?{...n,type:n.type||`object`,properties:n.properties||{}}:{type:`object`,properties:{}};return{name:t?`${t}${e.name}`:e.name,description:e.description||`CLI agent tool: ${e.name}`,inputSchema:r,annotations:e.annotations}}function B(e,t,n){let r=!1,i=[];return Array.isArray(e)?i=e.map(e=>e&&typeof e==`object`?e.type===`image`?{type:`image`,data:e.data||``,mimeType:e.media_type||e.mimeType||`image/png`}:e.type===`text`?{type:`text`,text:String(e.text??``)}:{type:`text`,text:JSON.stringify(e,null,2)}:{type:`text`,text:String(e??``)}):typeof e==`string`?((e.toLowerCase().startsWith(`error`)||e.toLowerCase().startsWith(`tool error`)||e.includes(`SecurityError`)||e.startsWith(`Tool "`)&&e.includes(`is not allowed`)||e.startsWith(`Tool "`)&&e.includes(`is not available`))&&(r=!0),i=[{type:`text`,text:e}]):e&&typeof e==`object`?((e.error||e.success===!1)&&(r=!0),i=[{type:`text`,text:JSON.stringify(e,null,2)}]):i=[{type:`text`,text:String(e??``)}],{jsonrpc:`2.0`,id:n,result:{resultType:`complete`,isError:r,content:i,_meta:{"io.modelcontextprotocol/serverInfo":t}}}}function V(e={}){let t=e.client||new l(e),r=e.relayClientTools!==!1,i=e.targetClientId||e.clientTarget,a=i||``,o={name:`shadow-claw`,version:e.version||re()},s={tools:{listChanged:!0},extensions:{"io.modelcontextprotocol/tasks":{}}};async function c(e){let n=e||a||i;try{let e=await t.listClients();return L({getConnectedClients:()=>e},n)}catch{}return L(t,n)}let d=/* @__PURE__ */ new Map,p=/* @__PURE__ */ new Map,m=e.localTools!==!1,g=e.toolPrefix??`local`,_=g===`none`||g===``?``:g===`shadowclaw`?`shadowclaw_`:R,v=/* @__PURE__ */ new Map,x=null;async function S(){return x||=(async()=>{if(e.core&&e.db){let t;if(e.workspaceDir||e.workspace)t=e.workspaceDir||e.workspace;else{let e=h.join(D(),`shadow-claw`);await y(e,{recursive:!0}),t=await b(h.join(e,`workspace-`))}return{db:e.db,workspaceDir:t,core:e.core}}let t=e.core||await f(),r=e.workspaceDir||e.workspace,i=null,a=null,o=null;if(r)i=h.resolve(r),a=e.cacheDir?h.resolve(e.cacheDir):h.join(i,`.cache`),o=e.databaseDir?h.resolve(e.databaseDir):h.join(a,`database`);else try{let t=h.join(D(),`shadow-claw`);await y(t,{recursive:!0}),i=await b(h.join(t,`workspace-`)),a=e.cacheDir?h.resolve(e.cacheDir):await b(h.join(t,`cache-`)),o=e.databaseDir?h.resolve(e.databaseDir):h.join(a,`database`),await y(a,{recursive:!0}),await y(o,{recursive:!0})}catch(e){return console.error(`[ShadowClaw MCP] Warning: No --workspace provided and failed to initialize temporary fallback workspace (${e.message}). Local workspace tools are disabled.`),null}try{let r=await n({...e,workspace:i,cacheDir:a,databaseDir:o,yes:!0,quiet:!0,isTTY:!1,core:t});return{db:r.db,workspaceDir:r.workspaceDir,core:r.core}}catch(e){return console.error(`[ShadowClaw MCP] Warning: Failed to bootstrap headless agent context (${e.message}). Local workspace tools are disabled.`),null}})(),x}async function C(){if(!m)return[];let t;try{t=await S()}catch(e){return console.error(`[ShadowClaw MCP] Failed to initialize local agent context: ${e.message}`),[]}if(!t)return[];let{db:n,core:r}=t,i=e.group||r.DEFAULT_SERVER_GROUP_ID||`server:main`,a=null;if(e.toolsProfile||e.profile){let t=String(e.toolsProfile||e.profile).trim().toLowerCase(),i=r.DEFAULT_BUILTIN_PROFILE||null,o=[];if(typeof r.getConfig==`function`)try{let e=await r.getConfig(n,r.CONFIG_KEYS?.TOOL_PROFILES||`tool_profiles`);typeof e==`string`?o=JSON.parse(e):Array.isArray(e)&&(o=e)}catch{}let s=[i,...o].filter(Boolean).find(e=>e.id&&String(e.id).toLowerCase()===t||e.name&&String(e.name).toLowerCase()===t);s&&(a=new Set(s.enabledToolNames||[]))}let o=null;if(e.tools&&typeof e.tools==`string`&&e.tools.trim()){let t=e.tools.split(`,`).map(e=>e.trim()).filter(Boolean);o=new Set(t)}let s=[...r.TOOL_DEFINITIONS||[]];if(typeof r.loadDeclarativeTools==`function`)try{let e=await r.loadDeclarativeTools(n,i);if(e&&Array.isArray(e.tools))for(let t of e.tools)s.some(e=>e.name===t.name)||s.push(t)}catch{}let c=r.BROWSER_ONLY_TOOLS||u;v.clear();let l=[];for(let e of s){if(!e||!e.name||c&&c.has(e.name)||o&&!o.has(e.name)||a&&!a.has(e.name))continue;let t=z(e,_);v.set(e.name,e),v.set(`shadowclaw_local_${e.name}`,e),v.set(`shadowclaw_${e.name}`,e),l.push(t)}return l}async function w(t,n,r){try{let i=await S();if(!i)return{jsonrpc:`2.0`,id:r,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error: Local workspace tools are not initialized.`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}};let a=e.group||i.core.DEFAULT_SERVER_GROUP_ID||`server:main`,s;try{let{resolveAgentProvider:t}=await import(`./chunk-heu2xRw1.js`),n=await t(i.db,i.core,i.workspaceDir,{...e,interactive:!1});s={db:i.db,provider:n.providerId,model:n.model,apiKey:n.apiKey}}catch{}return console.error(`[ShadowClaw MCP] Executing local tool '${t.name}' in workspace: ${i.workspaceDir}`),B(await i.core.executeTool(i.db,t.name,n,a,{invokeContext:s}),o,r)}catch(e){return{jsonrpc:`2.0`,id:r,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error executing local tool '${t.name}': ${e.message||String(e)}`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}}async function T(){if(!r)return[];let e=[];try{e=await t.listClients()}catch{}if(!Array.isArray(e)||e.length===0)return d.clear(),p.clear(),[];d.clear(),p.clear();for(let n of e){let e=n.clientId||n.id;if(e)try{let r=await t.sendCommand(e,`list-tools`,{});if(r&&r.success&&r.data?.tools&&Array.isArray(r.data.tools))for(let e of r.data.tools){let t=P(e.name);t===`send_notification`||t.startsWith(`shadowclaw_`)&&!t.startsWith(`shadowclaw_client_`)||(p.has(t)||(p.set(t,e),d.set(t,[])),d.get(t).push(n))}}catch{}}let n=await c(),i=[];for(let[t,r]of p.entries()){let a=d.get(t)||[],o=a.map(e=>e.clientId||e.id).filter(Boolean),s=a.find(e=>(e.clientId||e.id)===n)||a[0],c=s?.clientId||s?.id||``,l=s?.deviceLabel||`Client`,u=r.inputSchema&&typeof r.inputSchema==`object`?r.inputSchema:{type:`object`,properties:{}},f={...u.properties||{},clientId:{type:`string`,description:`Target ShadowClaw client ID (optional; defaults to ${c} [${l}]). Available on: ${a.map(e=>`${e.clientId||e.id} (${e.deviceLabel||`Client`})`).join(`, `)}`,enum:o}},p=e.length>1?a.length>1?` [Default: ${l} (${c.slice(0,14)}...)]`:` [Client: ${l} (${c.slice(0,14)}...)]`:``,m=F(t);i.push({name:m,description:(r.description||`Relayed tool '${t}' from connected client.`)+p,inputSchema:{...u,type:`object`,properties:f},annotations:r.annotations})}return i}async function E(e,n={}){let i=e.id===void 0||e.id===null,l=e.id??null;if(n[`mcp-method`]&&n[`mcp-method`]!==e.method)return{jsonrpc:`2.0`,id:l,error:{code:-32020,message:`Mcp-Method header '${n[`mcp-method`]}' does not match '${e.method}'`}};switch(e.method){case`server/discover`:return{jsonrpc:`2.0`,id:l,result:{protocolVersion:`2026-07-28`,supportedProtocolVersions:[`2026-07-28`,`2025-11-25`,`2024-11-05`],capabilities:s,serverInfo:o,_meta:{"io.modelcontextprotocol/serverInfo":o}}};case`initialize`:return{jsonrpc:`2.0`,id:l,result:{protocolVersion:e.params?.protocolVersion||`2024-11-05`,capabilities:s,serverInfo:o}};case`notifications/initialized`:return null;case`tools/list`:{let e=[];try{if(typeof t.listPushClients==`function`)e=await t.listPushClients();else if(typeof t.listPushSubscriptions==`function`){let n=await t.listPushSubscriptions();if(Array.isArray(n)){let t=/* @__PURE__ */ new Map;for(let e of n){let n=(e.client_id||``).trim()||(e.id?String(e.id):``);n&&!t.has(n)&&t.set(n,{clientId:n,deviceLabel:e.device_label||void 0})}e=Array.from(t.values())}}}catch{}let n=Array.isArray(e)?[...e].sort((e,t)=>(e.clientId||``).localeCompare(t.clientId||``)):[],r=n.map(e=>e.clientId).filter(Boolean),i=await T(),a=await C(),s=/* @__PURE__ */ new Map;for(let e of ie)s.set(e.name,e);for(let e of a)s.has(e.name)||s.set(e.name,e);for(let e of i)s.has(e.name)||s.set(e.name,e);if(r.length>0)for(let e of[`shadowclaw_server_send_notification`,`shadowclaw_send_notification`]){let t=s.get(e);t&&s.set(e,{...t,inputSchema:{...t.inputSchema,type:`object`,properties:{...t.inputSchema?.properties||{},clientId:{type:`string`,description:`Target client ID, prefix, or device label of a specific client registered for push notifications (optional; if omitted, broadcasts to all subscribed devices). Available on: ${n.map(e=>`${e.clientId} (${e.deviceLabel||`Client`})`).join(`, `)}`,enum:r}}}})}return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,ttlMs:5e3,cacheScope:`private`,tools:Array.from(s.values()).sort((e,t)=>e.name.localeCompare(t.name)),_meta:{"io.modelcontextprotocol/serverInfo":o}}}}case`tools/call`:{let n=e.params?.name,i=e.params?.arguments||{},s=e.params?.inputResponses;if(!n)return{jsonrpc:`2.0`,id:l,error:{code:-32602,message:`Missing required parameter 'name'`}};if(n===`shadowclaw_server_list_clients`||n===`shadowclaw_list_clients`)try{let e=await t.listClients();return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,content:[{type:`text`,text:JSON.stringify({clients:e},null,2)}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}catch(e){return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error listing clients: ${e.message}`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}if(n===`shadowclaw_server_set_active_client`||n===`shadowclaw_set_active_client`){let e=await c(i.clientId);return e?(a=e,console.error(`[ShadowClaw MCP] Active default client set to: ${a}`),{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,content:[{type:`text`,text:`Active default client set to: ${a}`}],_meta:{activeClientId:a,"io.modelcontextprotocol/serverInfo":o}}}):{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error: Client '${i.clientId}' not found among connected clients.`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}if(n===`shadowclaw_server_send_message`||n===`shadowclaw_send_message`){let e=await c(i.clientId);if(!e)return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error: No connected client available.`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}};try{let n=await t.sendCommand(e,`send-message`,{text:i.text,groupId:i.groupId});return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!n.success,content:[{type:`text`,text:JSON.stringify(n.data||n,null,2)}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}catch(e){return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error sending message: ${e.message}`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}}if(n===`shadowclaw_server_read_state`||n===`shadowclaw_read_state`){let e=await c(i.clientId);try{let n=await t.sendCommand(e,`read-state`,{});return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!n.success,content:[{type:`text`,text:JSON.stringify(n.data||n,null,2)}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}catch(e){return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error reading state: ${e.message}`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}}if(n===`shadowclaw_server_list_tasks`||n===`shadowclaw_list_tasks`){let e=await c(i.clientId);try{let n=await t.sendCommand(e,`list-tasks`,{groupId:i.groupId});return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!n.success,content:[{type:`text`,text:JSON.stringify(n.data||n,null,2)}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}catch(e){return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error listing tasks: ${e.message}`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}}if(n===`shadowclaw_server_manage_backup`||n===`shadowclaw_manage_backup`){let e=i.action||`trigger`,n=await c(i.clientId);try{if(e===`list`){let e=await t.listBackups(n);return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,content:[{type:`text`,text:JSON.stringify({backups:e},null,2)}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}if(e===`delete`){let e=await t.deleteBackup(i.backupId,n);return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,content:[{type:`text`,text:JSON.stringify(e,null,2)}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}let r=await t.sendCommand(n,`trigger-backup`,{groupId:i.groupId});return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!r.success,content:[{type:`text`,text:JSON.stringify(r.data||r,null,2)}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}catch(e){return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error managing backup: ${e.message}`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}}if(n===`shadowclaw_server_status`||n===`shadowclaw_status`)try{let e=await t.listClients();return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,content:[{type:`text`,text:JSON.stringify({server:`ShadowClaw`,version:o.version,connectedClients:e.length,status:`healthy`},null,2)}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}catch(e){return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error querying server status: ${e.message}`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}if(n===`shadowclaw_server_send_notification`||n===`shadowclaw_send_notification`||n===`send_notification`){let e=String(i.body||``).trim();if(!e)return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error: Notification 'body' parameter cannot be empty.`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}};let n=String(i.title||`ShadowClaw`).trim(),r=typeof i.clientId==`string`&&i.clientId.trim()?i.clientId.trim():void 0;try{let i=await t.broadcastNotification({title:n,body:e,...r?{clientId:r}:{}}),a=i?.sent??0,s=i?.failed??0,c;return c=i?.notFound?`Warning: No push subscriptions found for client '${r}'. Ensure push notifications were registered by this client in ShadowClaw Settings.`:i?.noSubscribers?`Warning: Push notification broadcast completed, but no devices are currently subscribed to push notifications. Ensure push notifications are enabled in ShadowClaw Settings on the client first.`:r?`Push notification sent to client '${r}': ${a} recipient(s) delivered, ${s} failed.`:`Push notification broadcast sent: ${a} recipient(s) delivered, ${s} failed.`,{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!1,content:[{type:`text`,text:c}],_meta:{...i,...r?{targetClientId:r}:{},"io.modelcontextprotocol/serverInfo":o}}}}catch(e){return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Failed to send push notification: ${e.message}`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}}let u=P(n);if((u===`ask_user`||n===`ask_user`)&&s&&s.response)return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,content:[{type:`text`,text:String(s.response)}],_meta:{"io.modelcontextprotocol/serverInfo":o}}};m&&v.size===0&&await C();let f=n.startsWith(R),h=n.startsWith(`shadowclaw_client_`),_=v.get(n);if(!_&&f&&(_=v.get(n.slice(17))),!_&&n.startsWith(`shadowclaw_`)&&!h&&(_=v.get(n.slice(11))),f&&_){let e={...i};return delete e.clientId,await w(_,e,l)}r&&p.size===0&&await T();let y=(d.get(u)||d.get(n)||[]).map(e=>e.clientId||e.id).filter(Boolean),b=[];try{b=await t.listClients()}catch{}if(!h&&_&&(g===`none`&&!i.clientId||!r||!Array.isArray(b)||b.length===0)){let e={...i};return delete e.clientId,await w(_,e,l)}let x=``;if(i.clientId)x=await c(i.clientId);else{let e=await c();x=y.includes(e)?e:y.length>0?y[0]:e}if(!x)return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error: No connected client available.`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}};if(y.length>0&&!y.includes(x))return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error: Tool '${n}' is not enabled or available on client '${x}'. (Available on: ${y.join(`, `)})`}],_meta:{clientId:x,"io.modelcontextprotocol/serverInfo":o}}};try{console.error(`[ShadowClaw MCP] Executing '${u}' on client: ${x}`);let e={...i};delete e.clientId;let n=u===`ask_user`?await t.sendCommand(x,`invoke-tool`,{toolName:u,input:e},3e5):await t.sendCommand(x,`invoke-tool`,{toolName:u,input:e}),r=n.data?.result===void 0?n.data:n.data.result,a=typeof r==`string`?r:JSON.stringify(r,null,2),s=n.error||n.data&&n.data.error||`Unknown tool execution error`;return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!n.success,content:[{type:`text`,text:n.success?a||``:a&&a!==`null`&&a!==`{}`?`${a}\n${s}`:`Tool execution error: ${s}`}],_meta:{clientId:x,"io.modelcontextprotocol/serverInfo":o}}}}catch(e){return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Tool error: ${e.message}`}],_meta:{clientId:x,"io.modelcontextprotocol/serverInfo":o}}}}}case`tasks/get`:return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,task:{taskId:e.params?.taskId||`task-1`,status:`completed`},_meta:{"io.modelcontextprotocol/serverInfo":o}}};default:return i?null:{jsonrpc:`2.0`,id:l,error:{code:-32601,message:`Method not found: '${e.method}'`}}}}return{handleMessage:E,getActiveClientId:()=>a,setActiveClientId:e=>{a=e},close:async()=>{if(x)try{let e=await x;typeof e?.core?.closeSqliteDatabase==`function`&&e.core.closeSqliteDatabase()}catch{}}}}async function H(e={}){if((e.mcpTransport||(e.http?`http`:`stdio`))===`http`){let t=parseInt(String(e.port||T.env.MCP_PORT||`8888`),10),n=e.host||`127.0.0.1`,r=V(e);E.createServer(async(e,t)=>{if(e.method!==`POST`||e.url?.split(`?`)[0]!==`/mcp`){t.writeHead(404,{"Content-Type":`application/json`}),t.end(JSON.stringify({error:`Not found`}));return}let n=``;e.on(`data`,e=>n+=e),e.on(`end`,async()=>{let i;try{i=JSON.parse(n)}catch{t.writeHead(400,{"Content-Type":`application/json`}),t.end(JSON.stringify({jsonrpc:`2.0`,id:null,error:{code:-32700,message:`Parse error`}}));return}try{let n={"mcp-protocol-version":e.headers[`mcp-protocol-version`],"mcp-method":e.headers[`mcp-method`],"mcp-name":e.headers[`mcp-name`]},a=await r.handleMessage(i,n);if(a===null){t.writeHead(202),t.end();return}t.writeHead(200,{"Content-Type":`application/json`,"MCP-Protocol-Version":`2026-07-28`}),t.end(JSON.stringify(a))}catch(e){t.writeHead(500,{"Content-Type":`application/json`}),t.end(JSON.stringify({jsonrpc:`2.0`,id:i?.id??null,error:{code:-32603,message:e?.message||`Internal error`}}))}})}).listen(t,n,()=>{console.error(`[ShadowClaw MCP] HTTP MCP server listening at http://${n}:${t}/mcp (2026-07-28)`)});return}console.log=(...e)=>console.error(...e),console.info=(...e)=>console.error(...e);let t=V(e),n=ee.createInterface({input:T.stdin,output:T.stdout,terminal:!1});n.on(`line`,async e=>{let n=e.trim();if(!n)return;let r;try{r=JSON.parse(n)}catch{T.stdout.write(JSON.stringify({jsonrpc:`2.0`,id:null,error:{code:-32700,message:`Parse error`}})+`
|
|
1
|
+
import{t as e}from"./chunk-uAI_Zi6n.js";import{g as t,h as n,i as r}from"./chunk-B3TrWbca.js";import{t as i}from"./chunk-C5ypckWC.js";import{c as a,i as o,o as s,s as c}from"./chunk-YrgA1KKk.js";import{t as l}from"./chunk-sC-eQ-Nh.js";import{t as u}from"./chunk-Cpdoq2Nw.js";import{n as d}from"./chunk-D_te8ufL.js";import{t as f}from"./chunk-CncW6_WL.js";import{i as p}from"./chunk-C8KihxBF.js";import m from"node:fs";import h from"node:path";import{fileURLToPath as g}from"node:url";import _ from"node:process";import{exec as v}from"node:child_process";import{mkdir as y,mkdtemp as b,readFile as x,stat as S,writeFile as C}from"node:fs/promises";import{Command as w}from"commander";import T from"process";import E from"node:http";import{tmpdir as D}from"node:os";import ee from"node:readline";async function O(e={}){let t=new l(e);try{let e=await t.listClients();if(!e||e.length===0){console.log(`No clients currently registered or connected.`);return}console.log(`Connected / registered clients (${e.length}):\n`),e.forEach((e,t)=>{let n=Math.max(0,Math.floor((Date.now()-e.lastSeen)/1e3)),r=n<60?`${n}s ago`:`${Math.floor(n/60)}m ago`;console.log(` ${t+1}. ${e.deviceLabel} (id: ${e.clientId})`),e.peerId&&console.log(` Peer ID: ${e.peerId}`),console.log(` Capabilities: ${e.capabilities.join(`, `)||`none`}`),console.log(` Version: ${e.version}`),console.log(` Last seen: ${r}\n`)})}catch(e){console.error(`Error fetching clients: ${e.message}`),T.exitCode=1}}async function te(e,t={}){if(!e||typeof e!=`string`||!e.trim()){console.error(`Error: Message cannot be empty.`),T.exitCode=1;return}let n=new l(t);try{let r=t.client;if(!r){let e=await n.listClients();if(!e||e.length===0){console.error(`Error: No clients are connected.`),T.exitCode=1;return}r=e[0].clientId,console.log(`Targeting client: ${e[0].deviceLabel||r} (${r})`)}let i=r||``,a=t.timeout?Number(t.timeout)*1e3:12e4,o;if(t.file?(console.log(`Sending message with file "${t.file}" to ${i}...`),o=await n.sendFile(i,t.file,{prompt:e.trim(),groupId:t.group,timeoutMs:a})):(console.log(`Sending message to ${i}...`),o=await n.sendCommand(i,`send-message`,{text:e.trim(),groupId:t.group},a)),o.success){if(console.log(`Message successfully dispatched.`),o.data?.reply||o.data?.text){let e=o.data.reply||o.data.text;console.log(``),console.log(`Response from ${i}:`),console.log(`----------------------------------------`),console.log(e),console.log(`----------------------------------------`)}else o.data&&(t.json,console.log(JSON.stringify(o.data,null,2)))}else console.error(`Error from client: ${o.error||`Unknown error`}`),T.exitCode=1}catch(e){console.error(`Error sending message: ${e.message}`),T.exitCode=1}}async function k(e,t={}){if(!e||typeof e!=`string`||!e.trim()){console.error(`Error: File path cannot be empty.`),T.exitCode=1;return}let n=h.resolve(e.trim());if(!m.existsSync(n)){console.error(`Error: File not found: ${e}`),T.exitCode=1;return}let r=m.statSync(n);if(r.isDirectory()){console.error(`Error: Cannot send directory: ${e}`),T.exitCode=1;return}let i=new l(t);try{let e=t.client;if(!e){let t=await i.listClients();if(!t||t.length===0){console.error(`Error: No clients are connected.`),T.exitCode=1;return}e=t[0].clientId,console.log(`Targeting client: ${t[0].deviceLabel||e} (${e})`)}let a=e||``,o=t.name||h.basename(n);console.log(`Sending "${o}" (${r.size} bytes) to ${a}...`);let s=t.timeout?Number(t.timeout)*1e3:12e4,c=await i.sendFile(a,n,{prompt:t.prompt,name:t.name,groupId:t.group,timeoutMs:s});if(c.success){if(console.log(`File "${o}" successfully transferred to ${a}.`),c.data?.path&&console.log(`Remote location: ${c.data.path}`),c.data?.reply||c.data?.text){let e=c.data.reply||c.data.text;console.log(``),console.log(`Response from ${a}:`),console.log(`----------------------------------------`),console.log(e),console.log(`----------------------------------------`)}else t.json&&c.data&&console.log(JSON.stringify(c.data,null,2))}else console.error(`Error from client: ${c.error||`Unknown error`}`),T.exitCode=1}catch(e){console.error(`Error sending file: ${e.message}`),T.exitCode=1}}async function A(e=`trigger`,t={}){let n=new l(t);try{if(e===`list`){let e=await n.listBackups(t.client);if(!e||e.length===0){console.log(`No backups found.`);return}console.log(`Available backups (${e.length}):\n`),e.forEach((e,t)=>{let n=new Date(e.timestamp).toISOString(),r=(e.totalBytes/1048576).toFixed(2);console.log(` ${t+1}. [${e.id}] Client: ${e.clientId}`),console.log(` Date: ${n}`),console.log(` Files: ${e.fileCount} (${r} MB)\n`)});return}if(e===`delete`){if(!t.backupId){console.error(`Error: --backup-id is required for delete action.`),T.exitCode=1;return}await n.deleteBackup(t.backupId,t.client),console.log(`Backup ${t.backupId} deleted.`);return}let r=t.client;if(!r){let e=await n.listClients();if(!e||e.length===0){console.error(`Error: No clients are connected to back up.`),T.exitCode=1;return}r=e[0].clientId}let i=r||``;console.log(`Requesting backup from client ${i}...`);let a=await n.sendCommand(i,`trigger-backup`,{groupId:t.group,token:n.token});a.success?(console.log(`Backup completed successfully.`),console.log(JSON.stringify(a.data,null,2))):(console.error(`Backup failed: ${a.error}`),T.exitCode=1)}catch(e){console.error(`Error executing backup command: ${e.message}`),T.exitCode=1}}async function j(e={}){let t=new l(e);try{let n=e.client;if(!n){let e=await t.listClients();if(!e||e.length===0){console.error(`Error: No clients connected.`),T.exitCode=1;return}n=e[0].clientId}let r=n||``;console.log(`Fetching tasks from client ${r}${e.group?` (group: ${e.group})`:``}...`);let i=await t.sendCommand(r,`list-tasks`,{groupId:e.group});if(i.success){let t=i.data?.tasks||[];if(t.length===0){console.log(e.group?`No tasks configured on client for group "${e.group}".`:`No tasks configured on client.`);return}console.log(`Tasks on ${n}${e.group?` (group: ${e.group})`:``} (${t.length}):\n`),t.forEach((e,t)=>{let n=e.enabled?`[enabled]`:`[disabled]`,r=e.name||e.prompt?.slice(0,30)||`Untitled task`;console.log(` ${t+1}. ${n} ${r} (${e.schedule||`manual`})`)})}else console.error(`Failed to list tasks: ${i.error}`),T.exitCode=1}catch(e){console.error(`Error executing tasks command: ${e.message}`),T.exitCode=1}}async function M(e=`get`,t={}){let n=t.cacheDir,r=o(n),i=!!(t.renew||e===`renew`||e===`generate`||e===`new`),l=t.set||(e===`set`&&t.id?t.id:null),u=``,d=!1;if(l)u=a(l,n),d=!0;else if(i)u=a(void 0,n),d=!0;else{let e=c(n);e?(u=e,d=!1):(u=s(void 0,n),d=!0)}return t.quiet?(console.log(u),{peerId:u,filePath:r,isRenewed:d}):t.json?(console.log(JSON.stringify({peerId:u,filePath:r,renewed:d},null,2)),{peerId:u,filePath:r,isRenewed:d}):(console.log(l?`WebRTC CLI Peer ID set to: ${u}`:d?`WebRTC CLI Peer ID created/renewed: ${u}`:`WebRTC CLI Peer ID: ${u}`),console.log(`Stored in: ${r}`),{peerId:u,filePath:r,isRenewed:d})}function N(e,t){return typeof e==`string`?t===`raw`?e.startsWith(`shadowclaw_client_`)?e.slice(18):e:e.startsWith(`shadowclaw_client_`)?e:`shadowclaw_client_${e}`:e}function P(e){return N(e,`raw`)}function F(e){return N(e,`exposed`)}const I=[{name:`shadowclaw_server_list_clients`,description:`List connected browser and Electron clients, including device type, ID, and active capabilities.`,inputSchema:{type:`object`,properties:{}}},{name:`shadowclaw_server_send_message`,description:`Send a message or prompt to a connected ShadowClaw client's active AI orchestrator queue.`,inputSchema:{type:`object`,properties:{text:{type:`string`,description:`The prompt or message text to dispatch.`},clientId:{type:`string`,description:`Target client ID. If omitted, targets the first available connected client.`},groupId:{type:`string`,description:`Target conversation group ID (e.g. 'br:main'). If omitted, targets the active group.`}},required:[`text`]}},{name:`shadowclaw_server_read_state`,description:`Read the current orchestrator state (idle, responding, etc.), active group ID, and capabilities from a connected client.`,inputSchema:{type:`object`,properties:{clientId:{type:`string`,description:`Target client ID (defaults to first available connected client).`}}}},{name:`shadowclaw_server_list_tasks`,description:`List scheduled background tasks configured on a connected client (optionally filtered by conversation group).`,inputSchema:{type:`object`,properties:{clientId:{type:`string`,description:`Target client ID (defaults to first available connected client).`},groupId:{type:`string`,description:`Optional conversation group ID filter.`}}}},{name:`shadowclaw_server_set_active_client`,description:`Set the active default connected client used when no clientId is explicitly provided in tool calls.`,inputSchema:{type:`object`,properties:{clientId:{type:`string`,description:`Target client ID (or index '0', '1', prefix, or device label) to make active.`}},required:[`clientId`]}},{name:`shadowclaw_server_manage_backup`,description:`Trigger or manage OPFS workspace file backups for a connected client (trigger, list, or delete).`,inputSchema:{type:`object`,properties:{action:{type:`string`,enum:[`trigger`,`list`,`delete`],description:`Backup action to perform (default: 'trigger').`,default:`trigger`},clientId:{type:`string`,description:`Target client ID.`},backupId:{type:`string`,description:`Backup snapshot ID (required for 'delete').`},groupId:{type:`string`,description:`Optional workspace conversation group ID.`}}}},{name:`shadowclaw_server_status`,description:`Query ShadowClaw Node server status, version, and active client count.`,inputSchema:{type:`object`,properties:{}}},{name:`shadowclaw_server_send_notification`,description:`Broadcast an OS-level push notification to subscribed devices via Web Push (VAPID), or send to a specific registered client. Works even when the client browser tab is closed, asleep, or running in the background.`,inputSchema:{type:`object`,properties:{title:{type:`string`,description:`Notification title (default: 'ShadowClaw').`},body:{type:`string`,description:`The notification body message text.`},clientId:{type:`string`,description:`Target client ID, prefix, or device label of a specific client that has registered in the past. If omitted, broadcasts to all subscribed devices.`}},required:[`body`]}}];function L(e,t){try{let n=typeof e.getConnectedClients==`function`?e.getConnectedClients():typeof e.listClients==`function`?e.listClients():[];if(Array.isArray(n)&&n.length>0){if(typeof t==`string`&&t.trim()){let e=t.trim(),r=n.find(t=>(t.clientId||t.id)===e);if(r)return r.clientId||r.id||``;let i=parseInt(e,10);if(!isNaN(i)&&i>=0&&i<n.length)return n[i].clientId||n[i].id||``;let a=n.find(t=>(t.clientId||t.id||``).startsWith(e)||(t.clientId||t.id||``).replace(/^client-/,``).startsWith(e));if(a)return a.clientId||a.id||``;let o=n.find(t=>t.deviceLabel?.toLowerCase().includes(e.toLowerCase()));return o?o.clientId||o.id||``:e}if(typeof e.getActiveClientId==`function`){let t=e.getActiveClientId();if(t)return t}return n[0].clientId||n[0].id||``}}catch{}return typeof t==`string`?t.trim():``}const ne=h.dirname(g(import.meta.url));function re(){try{let e=h.resolve(ne,`../../../package.json`);if(m.existsSync(e)){let t=JSON.parse(m.readFileSync(e,`utf8`));if(t.version)return t.version}}catch{}return`1.27.1`}const R=`shadowclaw_local_`,ie=I;function z(e,t=R){let n=e.inputSchema||e.input_schema,r=n&&typeof n==`object`?{...n,type:n.type||`object`,properties:n.properties||{}}:{type:`object`,properties:{}};return{name:t?`${t}${e.name}`:e.name,description:e.description||`CLI agent tool: ${e.name}`,inputSchema:r,annotations:e.annotations}}function B(e,t,n){let r=!1,i=[];return Array.isArray(e)?i=e.map(e=>e&&typeof e==`object`?e.type===`image`?{type:`image`,data:e.data||``,mimeType:e.media_type||e.mimeType||`image/png`}:e.type===`text`?{type:`text`,text:String(e.text??``)}:{type:`text`,text:JSON.stringify(e,null,2)}:{type:`text`,text:String(e??``)}):typeof e==`string`?((e.toLowerCase().startsWith(`error`)||e.toLowerCase().startsWith(`tool error`)||e.includes(`SecurityError`)||e.startsWith(`Tool "`)&&e.includes(`is not allowed`)||e.startsWith(`Tool "`)&&e.includes(`is not available`))&&(r=!0),i=[{type:`text`,text:e}]):e&&typeof e==`object`?((e.error||e.success===!1)&&(r=!0),i=[{type:`text`,text:JSON.stringify(e,null,2)}]):i=[{type:`text`,text:String(e??``)}],{jsonrpc:`2.0`,id:n,result:{resultType:`complete`,isError:r,content:i,_meta:{"io.modelcontextprotocol/serverInfo":t}}}}function V(e={}){let t=e.client||new l(e),r=e.relayClientTools!==!1,i=e.targetClientId||e.clientTarget,a=i||``,o={name:`shadow-claw`,version:e.version||re()},s={tools:{listChanged:!0},extensions:{"io.modelcontextprotocol/tasks":{}}};async function c(e){let n=e||a||i;try{let e=await t.listClients();return L({getConnectedClients:()=>e},n)}catch{}return L(t,n)}let d=/* @__PURE__ */ new Map,p=/* @__PURE__ */ new Map,m=e.localTools!==!1,g=e.toolPrefix??`local`,_=g===`none`||g===``?``:g===`shadowclaw`?`shadowclaw_`:R,v=/* @__PURE__ */ new Map,x=null;async function S(){return x||=(async()=>{if(e.core&&e.db){let t;if(e.workspaceDir||e.workspace)t=e.workspaceDir||e.workspace;else{let e=h.join(D(),`shadow-claw`);await y(e,{recursive:!0}),t=await b(h.join(e,`workspace-`))}return{db:e.db,workspaceDir:t,core:e.core}}let t=e.core||await f(),r=e.workspaceDir||e.workspace,i=null,a=null,o=null;if(r)i=h.resolve(r),a=e.cacheDir?h.resolve(e.cacheDir):h.join(i,`.cache`),o=e.databaseDir?h.resolve(e.databaseDir):h.join(a,`database`);else try{let t=h.join(D(),`shadow-claw`);await y(t,{recursive:!0}),i=await b(h.join(t,`workspace-`)),a=e.cacheDir?h.resolve(e.cacheDir):await b(h.join(t,`cache-`)),o=e.databaseDir?h.resolve(e.databaseDir):h.join(a,`database`),await y(a,{recursive:!0}),await y(o,{recursive:!0})}catch(e){return console.error(`[ShadowClaw MCP] Warning: No --workspace provided and failed to initialize temporary fallback workspace (${e.message}). Local workspace tools are disabled.`),null}try{let r=await n({...e,workspace:i,cacheDir:a,databaseDir:o,yes:!0,quiet:!0,isTTY:!1,core:t});return{db:r.db,workspaceDir:r.workspaceDir,core:r.core}}catch(e){return console.error(`[ShadowClaw MCP] Warning: Failed to bootstrap headless agent context (${e.message}). Local workspace tools are disabled.`),null}})(),x}async function C(){if(!m)return[];let t;try{t=await S()}catch(e){return console.error(`[ShadowClaw MCP] Failed to initialize local agent context: ${e.message}`),[]}if(!t)return[];let{db:n,core:r}=t,i=e.group||r.DEFAULT_SERVER_GROUP_ID||`server:main`,a=null;if(e.toolsProfile||e.profile){let t=String(e.toolsProfile||e.profile).trim().toLowerCase(),i=r.DEFAULT_BUILTIN_PROFILE||null,o=[];if(typeof r.getConfig==`function`)try{let e=await r.getConfig(n,r.CONFIG_KEYS?.TOOL_PROFILES||`tool_profiles`);typeof e==`string`?o=JSON.parse(e):Array.isArray(e)&&(o=e)}catch{}let s=[i,...o].filter(Boolean).find(e=>e.id&&String(e.id).toLowerCase()===t||e.name&&String(e.name).toLowerCase()===t);s&&(a=new Set(s.enabledToolNames||[]))}let o=null;if(e.tools&&typeof e.tools==`string`&&e.tools.trim()){let t=e.tools.split(`,`).map(e=>e.trim()).filter(Boolean);o=new Set(t)}let s=[...r.TOOL_DEFINITIONS||[]];if(typeof r.loadDeclarativeTools==`function`)try{let e=await r.loadDeclarativeTools(n,i);if(e&&Array.isArray(e.tools))for(let t of e.tools)s.some(e=>e.name===t.name)||s.push(t)}catch{}let c=r.BROWSER_ONLY_TOOLS||u;v.clear();let l=[];for(let e of s){if(!e||!e.name||c&&c.has(e.name)||o&&!o.has(e.name)||a&&!a.has(e.name))continue;let t=z(e,_);v.set(e.name,e),v.set(`shadowclaw_local_${e.name}`,e),v.set(`shadowclaw_${e.name}`,e),l.push(t)}return l}async function w(t,n,r){try{let i=await S();if(!i)return{jsonrpc:`2.0`,id:r,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error: Local workspace tools are not initialized.`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}};let a=e.group||i.core.DEFAULT_SERVER_GROUP_ID||`server:main`,s;try{let{resolveAgentProvider:t}=await import(`./chunk-DDvuLVfW.js`),n=await t(i.db,i.core,i.workspaceDir,{...e,interactive:!1});s={db:i.db,provider:n.providerId,model:n.model,apiKey:n.apiKey}}catch{}return console.error(`[ShadowClaw MCP] Executing local tool '${t.name}' in workspace: ${i.workspaceDir}`),B(await i.core.executeTool(i.db,t.name,n,a,{invokeContext:s}),o,r)}catch(e){return{jsonrpc:`2.0`,id:r,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error executing local tool '${t.name}': ${e.message||String(e)}`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}}async function T(){if(!r)return[];let e=[];try{e=await t.listClients()}catch{}if(!Array.isArray(e)||e.length===0)return d.clear(),p.clear(),[];d.clear(),p.clear();for(let n of e){let e=n.clientId||n.id;if(e)try{let r=await t.sendCommand(e,`list-tools`,{});if(r&&r.success&&r.data?.tools&&Array.isArray(r.data.tools))for(let e of r.data.tools){let t=P(e.name);t===`send_notification`||t.startsWith(`shadowclaw_`)&&!t.startsWith(`shadowclaw_client_`)||(p.has(t)||(p.set(t,e),d.set(t,[])),d.get(t).push(n))}}catch{}}let n=await c(),i=[];for(let[t,r]of p.entries()){let a=d.get(t)||[],o=a.map(e=>e.clientId||e.id).filter(Boolean),s=a.find(e=>(e.clientId||e.id)===n)||a[0],c=s?.clientId||s?.id||``,l=s?.deviceLabel||`Client`,u=r.inputSchema&&typeof r.inputSchema==`object`?r.inputSchema:{type:`object`,properties:{}},f={...u.properties||{},clientId:{type:`string`,description:`Target ShadowClaw client ID (optional; defaults to ${c} [${l}]). Available on: ${a.map(e=>`${e.clientId||e.id} (${e.deviceLabel||`Client`})`).join(`, `)}`,enum:o}},p=e.length>1?a.length>1?` [Default: ${l} (${c.slice(0,14)}...)]`:` [Client: ${l} (${c.slice(0,14)}...)]`:``,m=F(t);i.push({name:m,description:(r.description||`Relayed tool '${t}' from connected client.`)+p,inputSchema:{...u,type:`object`,properties:f},annotations:r.annotations})}return i}async function E(e,n={}){let i=e.id===void 0||e.id===null,l=e.id??null;if(n[`mcp-method`]&&n[`mcp-method`]!==e.method)return{jsonrpc:`2.0`,id:l,error:{code:-32020,message:`Mcp-Method header '${n[`mcp-method`]}' does not match '${e.method}'`}};switch(e.method){case`server/discover`:return{jsonrpc:`2.0`,id:l,result:{protocolVersion:`2026-07-28`,supportedProtocolVersions:[`2026-07-28`,`2025-11-25`,`2024-11-05`],capabilities:s,serverInfo:o,_meta:{"io.modelcontextprotocol/serverInfo":o}}};case`initialize`:return{jsonrpc:`2.0`,id:l,result:{protocolVersion:e.params?.protocolVersion||`2024-11-05`,capabilities:s,serverInfo:o}};case`notifications/initialized`:return null;case`tools/list`:{let e=[];try{if(typeof t.listPushClients==`function`)e=await t.listPushClients();else if(typeof t.listPushSubscriptions==`function`){let n=await t.listPushSubscriptions();if(Array.isArray(n)){let t=/* @__PURE__ */ new Map;for(let e of n){let n=(e.client_id||``).trim()||(e.id?String(e.id):``);n&&!t.has(n)&&t.set(n,{clientId:n,deviceLabel:e.device_label||void 0})}e=Array.from(t.values())}}}catch{}let n=Array.isArray(e)?[...e].sort((e,t)=>(e.clientId||``).localeCompare(t.clientId||``)):[],r=n.map(e=>e.clientId).filter(Boolean),i=await T(),a=await C(),s=/* @__PURE__ */ new Map;for(let e of ie)s.set(e.name,e);for(let e of a)s.has(e.name)||s.set(e.name,e);for(let e of i)s.has(e.name)||s.set(e.name,e);if(r.length>0)for(let e of[`shadowclaw_server_send_notification`,`shadowclaw_send_notification`]){let t=s.get(e);t&&s.set(e,{...t,inputSchema:{...t.inputSchema,type:`object`,properties:{...t.inputSchema?.properties||{},clientId:{type:`string`,description:`Target client ID, prefix, or device label of a specific client registered for push notifications (optional; if omitted, broadcasts to all subscribed devices). Available on: ${n.map(e=>`${e.clientId} (${e.deviceLabel||`Client`})`).join(`, `)}`,enum:r}}}})}return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,ttlMs:5e3,cacheScope:`private`,tools:Array.from(s.values()).sort((e,t)=>e.name.localeCompare(t.name)),_meta:{"io.modelcontextprotocol/serverInfo":o}}}}case`tools/call`:{let n=e.params?.name,i=e.params?.arguments||{},s=e.params?.inputResponses;if(!n)return{jsonrpc:`2.0`,id:l,error:{code:-32602,message:`Missing required parameter 'name'`}};if(n===`shadowclaw_server_list_clients`||n===`shadowclaw_list_clients`)try{let e=await t.listClients();return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,content:[{type:`text`,text:JSON.stringify({clients:e},null,2)}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}catch(e){return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error listing clients: ${e.message}`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}if(n===`shadowclaw_server_set_active_client`||n===`shadowclaw_set_active_client`){let e=await c(i.clientId);return e?(a=e,console.error(`[ShadowClaw MCP] Active default client set to: ${a}`),{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,content:[{type:`text`,text:`Active default client set to: ${a}`}],_meta:{activeClientId:a,"io.modelcontextprotocol/serverInfo":o}}}):{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error: Client '${i.clientId}' not found among connected clients.`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}if(n===`shadowclaw_server_send_message`||n===`shadowclaw_send_message`){let e=await c(i.clientId);if(!e)return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error: No connected client available.`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}};try{let n=await t.sendCommand(e,`send-message`,{text:i.text,groupId:i.groupId});return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!n.success,content:[{type:`text`,text:JSON.stringify(n.data||n,null,2)}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}catch(e){return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error sending message: ${e.message}`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}}if(n===`shadowclaw_server_read_state`||n===`shadowclaw_read_state`){let e=await c(i.clientId);try{let n=await t.sendCommand(e,`read-state`,{});return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!n.success,content:[{type:`text`,text:JSON.stringify(n.data||n,null,2)}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}catch(e){return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error reading state: ${e.message}`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}}if(n===`shadowclaw_server_list_tasks`||n===`shadowclaw_list_tasks`){let e=await c(i.clientId);try{let n=await t.sendCommand(e,`list-tasks`,{groupId:i.groupId});return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!n.success,content:[{type:`text`,text:JSON.stringify(n.data||n,null,2)}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}catch(e){return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error listing tasks: ${e.message}`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}}if(n===`shadowclaw_server_manage_backup`||n===`shadowclaw_manage_backup`){let e=i.action||`trigger`,n=await c(i.clientId);try{if(e===`list`){let e=await t.listBackups(n);return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,content:[{type:`text`,text:JSON.stringify({backups:e},null,2)}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}if(e===`delete`){let e=await t.deleteBackup(i.backupId,n);return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,content:[{type:`text`,text:JSON.stringify(e,null,2)}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}let r=await t.sendCommand(n,`trigger-backup`,{groupId:i.groupId});return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!r.success,content:[{type:`text`,text:JSON.stringify(r.data||r,null,2)}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}catch(e){return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error managing backup: ${e.message}`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}}if(n===`shadowclaw_server_status`||n===`shadowclaw_status`)try{let e=await t.listClients();return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,content:[{type:`text`,text:JSON.stringify({server:`ShadowClaw`,version:o.version,connectedClients:e.length,status:`healthy`},null,2)}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}catch(e){return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error querying server status: ${e.message}`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}if(n===`shadowclaw_server_send_notification`||n===`shadowclaw_send_notification`||n===`send_notification`){let e=String(i.body||``).trim();if(!e)return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error: Notification 'body' parameter cannot be empty.`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}};let n=String(i.title||`ShadowClaw`).trim(),r=typeof i.clientId==`string`&&i.clientId.trim()?i.clientId.trim():void 0;try{let i=await t.broadcastNotification({title:n,body:e,...r?{clientId:r}:{}}),a=i?.sent??0,s=i?.failed??0,c;return c=i?.notFound?`Warning: No push subscriptions found for client '${r}'. Ensure push notifications were registered by this client in ShadowClaw Settings.`:i?.noSubscribers?`Warning: Push notification broadcast completed, but no devices are currently subscribed to push notifications. Ensure push notifications are enabled in ShadowClaw Settings on the client first.`:r?`Push notification sent to client '${r}': ${a} recipient(s) delivered, ${s} failed.`:`Push notification broadcast sent: ${a} recipient(s) delivered, ${s} failed.`,{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!1,content:[{type:`text`,text:c}],_meta:{...i,...r?{targetClientId:r}:{},"io.modelcontextprotocol/serverInfo":o}}}}catch(e){return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Failed to send push notification: ${e.message}`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}}let u=P(n);if((u===`ask_user`||n===`ask_user`)&&s&&s.response)return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,content:[{type:`text`,text:String(s.response)}],_meta:{"io.modelcontextprotocol/serverInfo":o}}};m&&v.size===0&&await C();let f=n.startsWith(R),h=n.startsWith(`shadowclaw_client_`),_=v.get(n);if(!_&&f&&(_=v.get(n.slice(17))),!_&&n.startsWith(`shadowclaw_`)&&!h&&(_=v.get(n.slice(11))),f&&_){let e={...i};return delete e.clientId,await w(_,e,l)}r&&p.size===0&&await T();let y=(d.get(u)||d.get(n)||[]).map(e=>e.clientId||e.id).filter(Boolean),b=[];try{b=await t.listClients()}catch{}if(!h&&_&&(g===`none`&&!i.clientId||!r||!Array.isArray(b)||b.length===0)){let e={...i};return delete e.clientId,await w(_,e,l)}let x=``;if(i.clientId)x=await c(i.clientId);else{let e=await c();x=y.includes(e)?e:y.length>0?y[0]:e}if(!x)return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error: No connected client available.`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}};if(y.length>0&&!y.includes(x))return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error: Tool '${n}' is not enabled or available on client '${x}'. (Available on: ${y.join(`, `)})`}],_meta:{clientId:x,"io.modelcontextprotocol/serverInfo":o}}};try{console.error(`[ShadowClaw MCP] Executing '${u}' on client: ${x}`);let e={...i};delete e.clientId;let n=u===`ask_user`?await t.sendCommand(x,`invoke-tool`,{toolName:u,input:e},3e5):await t.sendCommand(x,`invoke-tool`,{toolName:u,input:e}),r=n.data?.result===void 0?n.data:n.data.result,a=typeof r==`string`?r:JSON.stringify(r,null,2),s=n.error||n.data&&n.data.error||`Unknown tool execution error`;return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!n.success,content:[{type:`text`,text:n.success?a||``:a&&a!==`null`&&a!==`{}`?`${a}\n${s}`:`Tool execution error: ${s}`}],_meta:{clientId:x,"io.modelcontextprotocol/serverInfo":o}}}}catch(e){return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Tool error: ${e.message}`}],_meta:{clientId:x,"io.modelcontextprotocol/serverInfo":o}}}}}case`tasks/get`:return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,task:{taskId:e.params?.taskId||`task-1`,status:`completed`},_meta:{"io.modelcontextprotocol/serverInfo":o}}};default:return i?null:{jsonrpc:`2.0`,id:l,error:{code:-32601,message:`Method not found: '${e.method}'`}}}}return{handleMessage:E,getActiveClientId:()=>a,setActiveClientId:e=>{a=e},close:async()=>{if(x)try{let e=await x;typeof e?.core?.closeSqliteDatabase==`function`&&e.core.closeSqliteDatabase()}catch{}}}}async function H(e={}){if((e.mcpTransport||(e.http?`http`:`stdio`))===`http`){let t=parseInt(String(e.port||T.env.MCP_PORT||`8888`),10),n=e.host||`127.0.0.1`,r=V(e);E.createServer(async(e,t)=>{if(e.method!==`POST`||e.url?.split(`?`)[0]!==`/mcp`){t.writeHead(404,{"Content-Type":`application/json`}),t.end(JSON.stringify({error:`Not found`}));return}let n=``;e.on(`data`,e=>n+=e),e.on(`end`,async()=>{let i;try{i=JSON.parse(n)}catch{t.writeHead(400,{"Content-Type":`application/json`}),t.end(JSON.stringify({jsonrpc:`2.0`,id:null,error:{code:-32700,message:`Parse error`}}));return}try{let n={"mcp-protocol-version":e.headers[`mcp-protocol-version`],"mcp-method":e.headers[`mcp-method`],"mcp-name":e.headers[`mcp-name`]},a=await r.handleMessage(i,n);if(a===null){t.writeHead(202),t.end();return}t.writeHead(200,{"Content-Type":`application/json`,"MCP-Protocol-Version":`2026-07-28`}),t.end(JSON.stringify(a))}catch(e){t.writeHead(500,{"Content-Type":`application/json`}),t.end(JSON.stringify({jsonrpc:`2.0`,id:i?.id??null,error:{code:-32603,message:e?.message||`Internal error`}}))}})}).listen(t,n,()=>{console.error(`[ShadowClaw MCP] HTTP MCP server listening at http://${n}:${t}/mcp (2026-07-28)`)});return}console.log=(...e)=>console.error(...e),console.info=(...e)=>console.error(...e);let t=V(e),n=ee.createInterface({input:T.stdin,output:T.stdout,terminal:!1});n.on(`line`,async e=>{let n=e.trim();if(!n)return;let r;try{r=JSON.parse(n)}catch{T.stdout.write(JSON.stringify({jsonrpc:`2.0`,id:null,error:{code:-32700,message:`Parse error`}})+`
|
|
2
2
|
`);return}try{let e=await t.handleMessage(r);e!==null&&T.stdout.write(JSON.stringify(e)+`
|
|
3
3
|
`)}catch(e){let t={jsonrpc:`2.0`,id:r?.id??null,error:{code:-32603,message:e?.message||`Internal error`}};T.stdout.write(JSON.stringify(t)+`
|
|
4
4
|
`)}}),n.on(`close`,async()=>{await t.close?.()}),console.error(`[ShadowClaw MCP] STDIO MCP server active (2026-07-28)`)}const U=e(import.meta.url),W=/* @__PURE__ */ new Set;function G(e){return typeof e==`function`?(W.add(e),()=>W.delete(e)):()=>!1}let K=!1;const q=(e,t)=>{K&&_.exit(t),K=!0;for(let t of W)try{t(e)}catch{}_.stderr.write(`\nProcess interrupted (${e}).\n`),_.exit(t)};_.on(`SIGINT`,()=>q(`SIGINT`,130)),_.on(`SIGTERM`,()=>q(`SIGTERM`,143)),_.on(`exit`,()=>{for(let e of W)try{e(`exit`)}catch{}});async function J(){try{let e=h.join(U,`package.json`),t=await x(e,`utf8`);return JSON.parse(t).version||`1.0.0`}catch{return`1.0.0`}}async function Y(e){try{return await S(e),!0}catch{return!1}}function X(e){return!!(e.a2a||[`1`,`true`,`yes`].includes((_.env.SHADOWCLAW_A2A||``).toLowerCase().trim()))}function Z(e){let t=_.platform===`darwin`?`open`:_.platform===`win32`?`start`:`xdg-open`;try{v(`${t} ${e}`)}catch{}}const ae=await J(),Q=new w;Q.name(`shadow-claw`).description(`Multi-runtime AI assistant and static site publisher`).version(ae,`-V, --version`,`Output the current version`),Q.commandsGroup(`Development:`),Q.command(`build`).description(`Build the static site bundle for production or staging`).optionsGroup(`Build Mode Options:`).option(`--prod, --production`,`Build in production mode with minification and optimizations`,!1).option(`--prerender-pages <mode>`,`Prerender page mode (all, auto, none)`,`auto`).option(`--copy-all-assets`,`Copy entire assets/ directory into output`,!1).option(`--single-file`,`Bundle static pages, configuration, and theme into a standalone single-file index.html`,!1).option(`--cdn <url>`,`Base CDN URL to load runtime assets from for single-file builds (default: https://cdn.jsdelivr.net/npm/shadow-claw@<version>)`).optionsGroup(`Path & Routing Options:`).option(`--origin <url>`,`Canonical origin URL (e.g. https://user.github.io/repo/)`).option(`--base-path <path>`,`URL base path prefix (e.g. /repo/)`).option(`--out-dir <dir>`,`Output directory relative to content root`,`dist/public`).option(`--content-root <dir>`,`Content root directory`,_.cwd()).action(async e=>{try{let t=h.resolve(e.contentRoot||_.cwd()),n=!!(e.prod||e.production||_.env.NODE_ENV===`production`);console.log(`Building ShadowClaw site from ${t}...`),await i({contentRoot:t,toolchainRoot:U,outDir:e.outDir||`dist/public`,isProduction:n,pagesOrigin:e.origin||_.env.PAGES_ORIGIN,basePath:e.basePath||_.env.PAGES_BASE_PATH,prerenderPages:e.prerenderPages,copyAllAssets:e.copyAllAssets,singleFile:!!e.singleFile,cdn:e.cdn||_.env.SHADOWCLAW_CDN})}catch(e){console.error(`Build failed:`,e),_.exit(1)}});async function $(e,n){try{let r=h.resolve(n.contentRoot||_.cwd()),a=parseInt(e||n.port||_.env.PORT||`8888`,10),o=n.host||n.ip||_.env.SHADOWCLAW_DEV_IP||`127.0.0.1`,s=n.outDir||`dist/public`,c=h.resolve(r,s),l=await t({contentRoot:r,cacheDir:n.cacheDir,databaseDir:n.databaseDir,tmp:n.tmp||n.temp,yes:n.yes}),u=l.cacheDir,d=l.databaseDir;console.log(`Preparing ShadowClaw dev build for ${r}...`),await i({contentRoot:r,toolchainRoot:U,outDir:s,isProduction:!1,pagesOrigin:n.origin||_.env.PAGES_ORIGIN,basePath:n.basePath||_.env.PAGES_BASE_PATH,prerenderPages:n.prerenderPages||`auto`,copyAllAssets:n.copyAllAssets});let f=await Y(h.join(U,`dist/server.js`))?h.join(U,`dist/server.js`):h.join(U,`src/server/server.ts`);_.env.SHADOWCLAW_ROOT_PATH=c,_.env.SHADOWCLAW_CACHE_DIR=u,_.env.SHADOWCLAW_DATABASE_DIR=d,_.env.SHADOWCLAW_DEV_IP=o;let{startServer:p}=await import(f),m=new Set((n.corsAllowOrigin||_.env.SHADOWCLAW_CORS_ALLOWED_ORIGINS||`https://xt-ml.github.io`).split(`,`).map(e=>e.trim()).filter(Boolean)),g=!!(n.https||[`1`,`true`,`yes`].includes((_.env.SHADOWCLAW_HTTPS||``).toLowerCase().trim())),v=n.cert||(_.env.SHADOWCLAW_TLS_CERT||_.env.SHADOWCLAW_CERT||``).trim()||void 0,y=n.key||(_.env.SHADOWCLAW_TLS_KEY||_.env.SHADOWCLAW_KEY||``).trim()||void 0,b=h.resolve(r,n.sslDir||_.env.SHADOWCLAW_SSL_DIR||_.env.SHADOWCLAW_TLS_DIR||h.join(u,`tls`));await p({port:a,bindHost:o,corsMode:n.corsMode||`localhost`,allowedOrigins:m,verbose:!!n.verbose,peerjs:!!n.peerjs,a2aEnabled:X(n),rootPath:c,cacheDir:u,databaseDir:d,allowPrivateProxy:!!n.allowPrivateProxy,https:g,certPath:v,keyPath:y,sslDir:b});let x=`${g?`https`:`http`}://${o}:${a}`;n.open&&Z(x)}catch(e){console.error(`Dev server error:`,e),_.exit(1)}}Q.command(`dev [port]`).description(`Build and launch the development server`).optionsGroup(`Server & Network Options:`).option(`-p, --port <port>`,`Port to listen on (default: 8888)`).option(`--host <host>`,`Bind host/IP`,`127.0.0.1`).option(`--ip <host>`,`Bind host/IP (alias)`).option(`--open`,`Automatically open default browser`,!1).option(`-v, --verbose`,`Enable verbose request/proxy logging`,!1).optionsGroup(`Site & Build Options:`).option(`--content-root <dir>`,`Content root directory`,_.cwd()).option(`--out-dir <dir>`,`Output directory relative to content root`,`dist/public`).optionsGroup(`Security & Proxy Options:`).option(`--cors-mode <mode>`,`CORS policy: localhost | private | all`,`localhost`).option(`--allow-private-proxy`,`Allow proxy to reach private/loopback addresses`,!1).option(`--peerjs`,`Enable built-in PeerJS signaling server`,!1).option(`--a2a`,`Enable A2A v1.0 agent card, JSON-RPC, and SSE endpoints`,!1).optionsGroup(`TLS / HTTPS Options:`).option(`--https`,`Enable HTTPS dev server`,!1).option(`--cert <path>`,`Path to existing TLS certificate file`).option(`--key <path>`,`Path to existing TLS private key file`).option(`--ssl-dir <path>`,`Directory for TLS certificate generation/storage`).optionsGroup(`Storage & Database Options:`).option(`--database-dir <dir>`,`Directory where SQLite databases are stored`).option(`--cache-dir <dir>`,`Custom cache directory for databases, tokens, and logs`).option(`--tmp, --temp`,`Store cache and databases in system temporary directory`,!1).option(`-y, --yes`,`Skip interactive cache directory prompt and use default .cache`,!1).action($),Q.command(`run [port]`).description(`Alias for dev: build and launch the development server`).optionsGroup(`Server & Network Options:`).option(`-p, --port <port>`,`Port to listen on (default: 8888)`).option(`--host <host>`,`Bind host/IP`,`127.0.0.1`).option(`--ip <host>`,`Bind host/IP (alias)`).option(`--open`,`Automatically open default browser`,!1).option(`-v, --verbose`,`Enable verbose request/proxy logging`,!1).optionsGroup(`Site & Build Options:`).option(`--content-root <dir>`,`Content root directory`,_.cwd()).option(`--out-dir <dir>`,`Output directory relative to content root`,`dist/public`).optionsGroup(`Security & Proxy Options:`).option(`--cors-mode <mode>`,`CORS policy: localhost | private | all`,`localhost`).option(`--allow-private-proxy`,`Allow proxy to reach private/loopback addresses`,!1).option(`--peerjs`,`Enable built-in PeerJS signaling server`,!1).option(`--a2a`,`Enable A2A v1.0 agent card, JSON-RPC, and SSE endpoints`,!1).optionsGroup(`TLS / HTTPS Options:`).option(`--https`,`Enable HTTPS dev server`,!1).option(`--cert <path>`,`Path to existing TLS certificate file`).option(`--key <path>`,`Path to existing TLS private key file`).option(`--ssl-dir <path>`,`Directory for TLS certificate generation/storage`).optionsGroup(`Storage & Database Options:`).option(`--database-dir <dir>`,`Directory where SQLite databases are stored`).option(`--cache-dir <dir>`,`Custom cache directory for databases, tokens, and logs`).option(`--tmp, --temp`,`Store cache and databases in system temporary directory`,!1).option(`-y, --yes`,`Skip interactive cache directory prompt and use default .cache`,!1).action($),Q.commandsGroup(`Server:`),Q.command(`serve [port]`).description(`Serve static files and start backend services (optional: --peerjs, --a2a)`).optionsGroup(`Server & Network Options:`).option(`-p, --port <port>`,`Port to listen on (default: 8888)`).option(`--host <host>`,`Bind host/IP`,`127.0.0.1`).option(`--no-static`,`Disable static file and UI serving (services-only mode)`).option(`--open`,`Automatically open default browser`,!1).option(`-v, --verbose`,`Enable verbose request/proxy logging`,!1).optionsGroup(`Site Options:`).option(`--content-root <dir>`,`Content root directory`,_.cwd()).option(`--out-dir <dir>`,`Output directory relative to content root`,`dist/public`).optionsGroup(`Security & Proxy Options:`).option(`--cors-mode <mode>`,`CORS policy: localhost | private | all`,`localhost`).option(`--allow-private-proxy`,`Allow proxy to reach private/loopback addresses`,!1).option(`--peerjs`,`Enable built-in PeerJS signaling server`,!1).option(`--a2a`,`Enable A2A v1.0 agent card, JSON-RPC, and SSE endpoints`,!1).optionsGroup(`TLS / HTTPS Options:`).option(`--https`,`Enable HTTPS dev server`,!1).option(`--cert <path>`,`Path to existing TLS certificate file`).option(`--key <path>`,`Path to existing TLS private key file`).option(`--ssl-dir <path>`,`Directory for TLS certificate generation/storage`).optionsGroup(`Storage & Database Options:`).option(`--database-dir <dir>`,`Directory where SQLite databases are stored`).option(`--cache-dir <dir>`,`Custom cache directory for databases, tokens, and logs`).option(`--tmp, --temp`,`Store cache and databases in system temporary directory`,!1).option(`-y, --yes`,`Skip interactive cache directory prompt and use default .cache`,!1).action(async(e,n)=>{try{let r=h.resolve(n.contentRoot||_.cwd()),i=parseInt(e||n.port||_.env.PORT||`8888`,10),a=n.host||n.ip||_.env.SHADOWCLAW_DEV_IP||`127.0.0.1`,o=n.outDir||`dist/public`,s=h.resolve(r,o),c=await t({contentRoot:r,cacheDir:n.cacheDir,databaseDir:n.databaseDir,tmp:n.tmp||n.temp,yes:n.yes}),l=c.cacheDir,u=c.databaseDir,d=n.static!==!1;d&&!await Y(h.join(s,`index.html`))&&(console.error(`Error: No index.html found in ${s}. Run "shadow-claw build" first.`),_.exit(1));let f=await Y(h.join(U,`dist/server.js`))?h.join(U,`dist/server.js`):h.join(U,`src/server/server.ts`);_.env.SHADOWCLAW_ROOT_PATH=s,_.env.SHADOWCLAW_CACHE_DIR=l,_.env.SHADOWCLAW_DATABASE_DIR=u,_.env.SHADOWCLAW_DEV_IP=a;let{startServer:p}=await import(f),m=new Set((n.corsAllowOrigin||_.env.SHADOWCLAW_CORS_ALLOWED_ORIGINS||`https://xt-ml.github.io`).split(`,`).map(e=>e.trim()).filter(Boolean)),g=!!(n.https||[`1`,`true`,`yes`].includes((_.env.SHADOWCLAW_HTTPS||``).toLowerCase().trim())),v=n.cert||(_.env.SHADOWCLAW_TLS_CERT||_.env.SHADOWCLAW_CERT||``).trim()||void 0,y=n.key||(_.env.SHADOWCLAW_TLS_KEY||_.env.SHADOWCLAW_KEY||``).trim()||void 0,b=h.resolve(r,n.sslDir||_.env.SHADOWCLAW_SSL_DIR||_.env.SHADOWCLAW_TLS_DIR||h.join(l,`tls`));await p({port:i,bindHost:a,corsMode:n.corsMode||`localhost`,allowedOrigins:m,verbose:!!n.verbose,peerjs:!!n.peerjs,a2aEnabled:X(n),rootPath:s,cacheDir:l,databaseDir:u,allowPrivateProxy:!!n.allowPrivateProxy,https:g,certPath:v,keyPath:y,sslDir:b,serveStatic:d});let x=`${g?`https`:`http`}://${a}:${i}`;d&&n.open&&Z(x)}catch(e){console.error(`Serve error:`,e),_.exit(1)}});async function oe(e,n){try{let r=h.resolve(n.contentRoot||_.cwd()),i=parseInt(e||n.port||_.env.PORT||`8888`,10),a=n.host||n.ip||_.env.SHADOWCLAW_DEV_IP||`127.0.0.1`,o=await t({contentRoot:r,cacheDir:n.cacheDir,databaseDir:n.databaseDir,tmp:n.tmp||n.temp,yes:n.yes}),s=o.cacheDir,c=o.databaseDir,l=await Y(h.join(U,`dist/server.js`))?h.join(U,`dist/server.js`):h.join(U,`src/server/server.ts`);_.env.SHADOWCLAW_CACHE_DIR=s,_.env.SHADOWCLAW_DATABASE_DIR=c,_.env.SHADOWCLAW_DEV_IP=a,_.env.SHADOWCLAW_SERVE_STATIC=`false`;let{startServer:u}=await import(l),d=new Set((n.corsAllowOrigin||_.env.SHADOWCLAW_CORS_ALLOWED_ORIGINS||`https://xt-ml.github.io`).split(`,`).map(e=>e.trim()).filter(Boolean)),f=!!(n.https||[`1`,`true`,`yes`].includes((_.env.SHADOWCLAW_HTTPS||``).toLowerCase().trim())),p=n.cert||(_.env.SHADOWCLAW_TLS_CERT||_.env.SHADOWCLAW_CERT||``).trim()||void 0,m=n.key||(_.env.SHADOWCLAW_TLS_KEY||_.env.SHADOWCLAW_KEY||``).trim()||void 0,g=h.resolve(r,n.sslDir||_.env.SHADOWCLAW_SSL_DIR||_.env.SHADOWCLAW_TLS_DIR||h.join(s,`tls`));await u({port:i,bindHost:a,corsMode:n.corsMode||`localhost`,allowedOrigins:d,verbose:!!n.verbose,peerjs:!!n.peerjs,a2aEnabled:X(n),rootPath:``,cacheDir:s,databaseDir:c,controlToken:n.controlToken||_.env.SHADOWCLAW_CONTROL_TOKEN||void 0,allowPrivateProxy:!!n.allowPrivateProxy,https:f,certPath:p,keyPath:m,sslDir:g,serveStatic:!1})}catch(e){console.error(`Server error:`,e),_.exit(1)}}Q.command(`server [port]`).aliases([`services`,`api`]).description(`Start backend services (HTTP MCP, control plane, scheduler, and proxy) without serving static files (optional: --peerjs, --a2a; aliases: services, api)`).optionsGroup(`Server & Network Options:`).option(`-p, --port <port>`,`Port to listen on (default: 8888)`).option(`--host <host>`,`Bind host/IP`,`127.0.0.1`).option(`--ip <host>`,`Bind host/IP (alias)`).option(`-v, --verbose`,`Enable verbose request/proxy logging`,!1).optionsGroup(`Security & Proxy Options:`).option(`--cors-mode <mode>`,`CORS policy: localhost | private | all`,`localhost`).option(`--cors-allow-origin <origin>`,`Explicit allowed origins (comma-separated)`).option(`--control-token <token>`,`Secret token for control-plane authentication`).option(`--peerjs`,`Enable built-in PeerJS signaling server`,!1).option(`--a2a`,`Enable A2A v1.0 agent card, JSON-RPC, and SSE endpoints`,!1).option(`--allow-private-proxy`,`Allow proxy to reach private/loopback addresses`,!1).optionsGroup(`TLS / HTTPS Options:`).option(`--https`,`Enable HTTPS server`,!1).option(`--cert <path>`,`Path to existing TLS certificate file`).option(`--key <path>`,`Path to existing TLS private key file`).option(`--ssl-dir <path>`,`Directory for TLS certificate generation/storage`).optionsGroup(`Storage & Database Options:`).option(`--content-root <dir>`,`Content root directory`,_.cwd()).option(`--database-dir <dir>`,`Directory where SQLite databases are stored`).option(`--cache-dir <dir>`,`Custom cache directory for databases, tokens, and logs`).option(`--tmp, --temp`,`Store cache and databases in system temporary directory`,!1).option(`-y, --yes`,`Skip interactive cache directory prompt and use default .cache`,!1).action(oe),Q.command(`mcp`).description(`Start the standalone MCP server only (does not start backend services, PeerJS, or A2A)`).optionsGroup(`MCP Protocol Options:`).option(`--mcp-transport <transport>`,`MCP transport: stdio | http`,`stdio`).option(`--relay-client-tools`,`Discover and relay tools from connected browser clients`,!0).option(`--no-relay-client-tools`,`Disable relaying browser client tools`).optionsGroup(`Target Client Options:`).option(`--client <id>`,`Target client ID (defaults to first active client)`).optionsGroup(`Control Plane Connection Options:`).option(`--host <host>`,`Control plane host`).option(`--port <port>`,`Control plane port or HTTP MCP port`).option(`--token <token>`,`Control token`).option(`--https`,`Connect to server via HTTPS`,!1).option(`-k, --insecure`,`Allow self-signed TLS certificates`,!0).optionsGroup(`Transport & Peer Options:`).option(`--transport <transport>`,`Control plane client transport: http | webrtc`,`http`).option(`--peer-id <id>`,`Custom WebRTC CLI peer ID`).option(`--local-tools`,`Expose headless CLI agent tools (read_file, write_file, bash, git_*, etc.)`,!0).option(`--no-local-tools`,`Disable exposing headless CLI agent tools`).option(`--tool-prefix <prefix>`,`Tool prefix style for local tools: local | none | shadowclaw (default: local)`,`local`).optionsGroup(`Workspace & Local Agent Tools Options:`).option(`--workspace <dir>`,`Workspace directory for local tools (default: current working directory)`).option(`--database-dir <dir>`,`Directory where SQLite databases are stored`).option(`--group <groupId>`,`Conversation group ID for local tools (default: server:main)`).option(`--tools <tools>`,`Comma-separated list of local agent tools to expose (default: all headless-safe tools)`).option(`--tools-profile <name>`,`Tools profile to activate for local tools`).option(`--allow-internet, --internet-access`,`Allow full internet access for local Bash and JavaScript tools`).action(async e=>{await H(e)}),Q.commandsGroup(`Control Plane & Client Bridge:`),Q.command(`clients`).description(`List connected / registered browser and Electron clients`).optionsGroup(`Control Plane Connection Options:`).option(`--host <host>`,`Control plane host`).option(`--port <port>`,`Control plane port`).option(`--token <token>`,`Control token`).option(`--https`,`Connect to server via HTTPS`,!1).option(`-k, --insecure`,`Allow self-signed TLS certificates`,!0).optionsGroup(`Transport & Peer Options:`).option(`--transport <transport>`,`Transport to use: http | webrtc`,`http`).option(`--peer-id <id>`,`Custom WebRTC CLI peer ID`).option(`--renew-peer-id`,`Renew WebRTC CLI peer ID before connecting`,!1).option(`--cache-dir <dir>`,`Custom cache directory`).action(async e=>{await O(e)}),Q.command(`send <message>`).description(`Send a message/prompt to a connected client or peer agent`).optionsGroup(`Target Options:`).option(`--client <id>`,`Target client ID (defaults to first available)`).option(`--group <groupId>`,`Target conversation group ID`).option(`-f, --file <path>`,`Attach a local file to send with the message`).optionsGroup(`Control Plane Connection Options:`).option(`--host <host>`,`Control plane host`).option(`--port <port>`,`Control plane port`).option(`--token <token>`,`Control token`).option(`--https`,`Connect to server via HTTPS`,!1).option(`-k, --insecure`,`Allow self-signed TLS certificates`,!0).optionsGroup(`Transport & Peer Options:`).option(`--transport <transport>`,`Transport to use: http | webrtc`,`http`).option(`--peer-id <id>`,`Custom WebRTC CLI peer ID`).option(`--renew-peer-id`,`Renew WebRTC CLI peer ID before sending`,!1).option(`--cache-dir <dir>`,`Custom cache directory`).option(`--timeout <seconds>`,`Timeout in seconds to wait for response`,`120`).option(`--json`,`Output response payload as JSON`,!1).action(async(e,t)=>{await te(e,t)}),Q.command(`send-file <file>`).description(`Transfer a file to a connected peer or client over WebRTC or HTTP`).optionsGroup(`Target Options:`).option(`--client <id>`,`Target client ID (defaults to first available)`).option(`--prompt <prompt>`,`Accompanying prompt or instructions for the receiving agent`).option(`--name <fileName>`,`Override remote file name`).option(`--group <groupId>`,`Target conversation group ID`).optionsGroup(`Control Plane Connection Options:`).option(`--host <host>`,`Control plane host`).option(`--port <port>`,`Control plane port`).option(`--token <token>`,`Control token`).option(`--https`,`Connect to server via HTTPS`,!1).option(`-k, --insecure`,`Allow self-signed TLS certificates`,!0).optionsGroup(`Transport & Peer Options:`).option(`--transport <transport>`,`Transport to use: http | webrtc`,`webrtc`).option(`--peer-id <id>`,`Custom WebRTC CLI peer ID`).option(`--renew-peer-id`,`Renew WebRTC CLI peer ID before sending`,!1).option(`--cache-dir <dir>`,`Custom cache directory`).option(`--timeout <seconds>`,`Transfer and execution timeout in seconds`,`120`).option(`--json`,`Output response payload as JSON`,!1).action(async(e,t)=>{await k(e,t)}),Q.command(`tasks`).description(`List scheduled tasks on a connected client`).optionsGroup(`Target Options:`).option(`--client <id>`,`Target client ID`).option(`--group <groupId>`,`Filter tasks by conversation group ID`).optionsGroup(`Control Plane Connection Options:`).option(`--host <host>`,`Control plane host`).option(`--port <port>`,`Control plane port`).option(`--token <token>`,`Control token`).option(`--https`,`Connect to server via HTTPS`,!1).option(`-k, --insecure`,`Allow self-signed TLS certificates`,!0).optionsGroup(`Transport & Peer Options:`).option(`--transport <transport>`,`Transport to use: http | webrtc`,`http`).option(`--peer-id <id>`,`Custom WebRTC CLI peer ID`).option(`--renew-peer-id`,`Renew WebRTC CLI peer ID before connecting`,!1).option(`--cache-dir <dir>`,`Custom cache directory`).action(async e=>{await j(e)}),Q.command(`backup [action]`).description(`Trigger or manage client workspace backups (trigger | list | delete)`).optionsGroup(`Target Options:`).option(`--client <id>`,`Client ID`).option(`--backup-id <id>`,`Backup ID (for delete)`).option(`--group <groupId>`,`Specific workspace group ID`).optionsGroup(`Control Plane Connection Options:`).option(`--host <host>`,`Control plane host`).option(`--port <port>`,`Control plane port`).option(`--token <token>`,`Control token`).option(`--https`,`Connect to server via HTTPS`,!1).option(`-k, --insecure`,`Allow self-signed TLS certificates`,!0).optionsGroup(`Transport & Peer Options:`).option(`--transport <transport>`,`Transport to use: http | webrtc`,`http`).option(`--peer-id <id>`,`Custom WebRTC CLI peer ID`).option(`--renew-peer-id`,`Renew WebRTC CLI peer ID before connecting`,!1).option(`--cache-dir <dir>`,`Custom cache directory`).action(async(e,t)=>{await A(e||`trigger`,t)}),Q.commandsGroup(`WebRTC:`),Q.command(`webrtc [action] [customId]`).summary(`Manage WebRTC CLI configuration and peer identity (.cache/cli-peer-id)`).description(`Manage WebRTC CLI configuration and peer identity (.cache/cli-peer-id)
|
package/dist/headless-agent.js
CHANGED
|
@@ -138,7 +138,7 @@ As=Object.defineProperty,js=(e,t,n)=>t in e?As(e,t,{enumerable:!0,configurable:!
|
|
|
138
138
|
(id, groupId, enabled, schedule, prompt, tools, lastRun, createdAt, type, freshContext, subagent, name, task_order, pushNotifications)
|
|
139
139
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);for(let e of i)a.run(cc(),n,+!!e.enabled,e.schedule??null,e.prompt??``,e.tools??null,e.lastRun??null,e.createdAt,e.type??null,e.freshContext?1:null,e.subagent?1:null,e.name??null,e.task_order??null,e.pushNotifications?1:null);return Promise.resolve(i.length)}return new Promise((r,i)=>{let a=e?.transaction(`tasks`,`readwrite`);if(!a)throw Error(`failed to get transaction, cannot clone tasks.`);let o=a.objectStore(`tasks`),s=o.index(`by-group`).openCursor(t),c=0;s.onsuccess=()=>{let e=s.result;if(e){let t={...e.value,id:cc(),groupId:n};o.put(t),c++,e.continue()}else r(c)},s.onerror=()=>i(s.error)})}var Eee=k((()=>{hc(),zt()}));function gc(e,t){return Ht(e,`messages`,`readwrite`,e=>e.delete(t)).then(()=>void 0)}var _c=k((()=>{Ut()}));function vc(e,t){return t?Ht(e,`tasks`,`readwrite`,e=>e.delete(t)).then(()=>void 0):Promise.reject(/* @__PURE__ */ Error(`Task ID is required for deletion.`))}var yc=k((()=>{Ut()}));function bc(e){return Ht(e,`tasks`,`readonly`,e=>e.getAll()).then(e=>e.map(e=>({...e,enabled:!!e.enabled})))}var xc=k((()=>{Ut()}));function Sc(){return typeof crypto<`u`&&typeof crypto.randomUUID==`function`?crypto.randomUUID():`sub-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`}async function Cc(e){if(!e)return Sc();let t=await R(e,L.SUBSCRIBER_ID);if(typeof t==`string`&&t.trim().length>0)return t;let n=Sc();return await B(e,L.SUBSCRIBER_ID,n),n}var wc=k((()=>{Ot(),Gt(),Wo()}));function Tc(e,t,n){let r=null,i,a;return typeof e==`string`?(i=e,a=t):(r=e,i=t,a=n??50),r&&Lt(r)?Promise.resolve().then(()=>(r.db.prepare(`SELECT * FROM messages WHERE groupId = ? ORDER BY timestamp DESC LIMIT ?`).all(i,a)??[]).reverse().map(Ec)):new Promise(async(e,t)=>{try{let n=r??await At();if(!n)return t(/* @__PURE__ */ Error(`failed to get transaction, cannot get recent messages.`));let o=n.transaction(`messages`,`readonly`);if(!o)return t(/* @__PURE__ */ Error(`failed to get transaction`));let s=o.objectStore(`messages`).index(`by-group-time`),c=IDBKeyRange.bound([i,0],[i,1/0]),l=s.openCursor(c,`prev`),u=[];l.onsuccess=()=>{let t=l.result;t&&u.length<a?(u.push(t.value),t.continue()):e(u.reverse())},l.onerror=()=>t(l.error)}catch(e){t(e)}})}function Ec(e){return{...e,isFromMe:!!e.isFromMe,isTrigger:!!e.isTrigger,attachments:e.attachments?JSON.parse(e.attachments):void 0,a2uiAction:e.a2uiAction?JSON.parse(e.a2uiAction):void 0,a2uiEnvelopes:e.a2uiEnvelopes?JSON.parse(e.a2uiEnvelopes):void 0}}var Dc=k((()=>{It(),zt()}));async function Oc(e){let t=await R(e,Bc);if(!t)return[];try{return JSON.parse(t)}catch{return[]}}async function kc(e,t){await B(e,Bc,JSON.stringify(t))}async function Ac(e,t,n=`br:`,r){let i=await Oc(e),a={groupId:`${n}${r??cc()}`,name:t,createdAt:Date.now()};return i.push(a),await kc(e,i),a}async function jc(e,t,n){let r=await Oc(e),i=r.find(e=>e.groupId===t);i&&(i.name=n),await kc(e,r)}async function Mc(e,t,n){let r=await Oc(e),i=r.find(e=>e.groupId===t);i&&(n&&n.length>0?i.toolTags=n:delete i.toolTags),await kc(e,r)}async function Nc(e,t){await kc(e,(await Oc(e)).filter(e=>e.groupId!==t))}async function Pc(e){let t=await Oc(e);if(t.length===0){let t={groupId:dt,name:`Main`,createdAt:0};return await kc(e,[t]),[t]}return t}async function Fc(e,t){let n=await Oc(e),r=new Map(n.map(e=>[e.groupId,e])),i=[];for(let e of t){let t=r.get(e);t&&(i.push(t),r.delete(e))}for(let e of n)r.has(e.groupId)&&i.push(e);await kc(e,i)}async function Ic(e,t){let n=await Oc(e),r=n.find(e=>e.groupId===t);if(!r)return null;let i=t.indexOf(`:`),a={groupId:`${i>=0?t.slice(0,i+1):`br:`}${cc()}`,name:`${r.name} (copy)`,createdAt:Date.now(),pinnedMaxTokens:r.pinnedMaxTokens,providerRuntimeOverrides:r.providerRuntimeOverrides?JSON.parse(JSON.stringify(r.providerRuntimeOverrides)):void 0,subagentModelSelectionMode:r.subagentModelSelectionMode,subagentMaxTokens:r.subagentMaxTokens,subagentPinnedProvider:r.subagentPinnedProvider,subagentPinnedModel:r.subagentPinnedModel,subagentFastProvider:r.subagentFastProvider,subagentFastModel:r.subagentFastModel,subagentSmartProvider:r.subagentSmartProvider,subagentSmartModel:r.subagentSmartModel,subagentPowerfulProvider:r.subagentPowerfulProvider,subagentPowerfulModel:r.subagentPowerfulModel,toolTags:r.toolTags?[...r.toolTags]:void 0};return n.push(a),await kc(e,n),a}async function Lc(e,t,n,r,i){let a=await Oc(e),o=a.find(e=>e.groupId===t);o&&(n?o.pinnedProvider=n:delete o.pinnedProvider,r?o.pinnedModel=r:delete o.pinnedModel,typeof i==`number`&&Number.isFinite(i)&&i>0?o.pinnedMaxTokens=Math.floor(i):delete o.pinnedMaxTokens),await kc(e,a)}async function Rc(e,t,n,r,i,a){let o=await Oc(e),s=o.find(e=>e.groupId===t);s&&(s.subagentModelSelectionMode=n,n===`manual`?(r?s.subagentPinnedProvider=r:delete s.subagentPinnedProvider,i?s.subagentPinnedModel=i:delete s.subagentPinnedModel):(delete s.subagentPinnedProvider,delete s.subagentPinnedModel),typeof a==`number`&&Number.isFinite(a)&&a>0?s.subagentMaxTokens=Math.floor(a):delete s.subagentMaxTokens),await kc(e,o)}async function zc(e,t,n){let r=await Oc(e),i=r.find(e=>e.groupId===t);i&&(n&&Object.keys(n).length>0?i.providerRuntimeOverrides=JSON.parse(JSON.stringify(n)):delete i.providerRuntimeOverrides),await kc(e,r)}var Bc,Vc=k((()=>{Ot(),Gt(),Wo(),hc(),Bc=`group_metadata`}));function Hc(e,t){return Ht(e,`messages`,`readwrite`,e=>e.put(t)).then(()=>void 0)}var Uc=k((()=>{Ut()}));function Wc(e,t){let n={...t,enabled:+!!t.enabled};return Ht(e,`tasks`,`readwrite`,e=>e.put(n)).then(()=>void 0)}var Gc=k((()=>{Ut()}));function Kc(e,t,n){let r=null,i,a;return typeof e==`string`?(i=e,a=t):(r=e,i=t,a=n),r&&Lt(r)?Promise.resolve().then(()=>{r.db.prepare(`UPDATE tasks SET lastRun = ? WHERE id = ?`).run(a,i)}):new Promise(async(e,t)=>{try{let n=r??await At();if(!n)return t(/* @__PURE__ */ Error(`failed to get transaction, cannot update task last run.`));let o=n.transaction(`tasks`,`readwrite`);if(!o)return t(/* @__PURE__ */ Error(`failed to get transaction`));let s=o.objectStore(`tasks`),c=s.get(i);c.onsuccess=()=>{let n=c.result;if(!n){e();return}n.lastRun=a;let r=s.put(n);r.onsuccess=()=>e(),r.onerror=()=>t(r.error)},c.onerror=()=>t(c.error)}catch(e){t(e)}})}var Dee=k((()=>{It(),zt()}));async function Oee(e,t,n){let r=(await bc(e)).filter(e=>e.groupId===t),i=new Map(r.map(e=>[e.id,e])),a=[],o=0;for(let t of n){let n=i.get(t);n&&(n.order=o++,await Wc(e,n),a.push(n),i.delete(t))}let s=Array.from(i.values()).sort((e,t)=>{let n=e.order??0,r=t.order??0;return n===r?e.createdAt-t.createdAt:n-r});for(let t of s)t.order=o++,await Wc(e,t),a.push(t);return a}var kee=k((()=>{xc(),Gc()}));async function Aee(e,t,n,r){let i=await En(e,t),a=await En(e,n),o=r.replace(/\\/g,`/`).replace(/^\/+/,``).split(`/`).filter(Boolean),s=i,c=a;for(let e of o)s=await s.getDirectoryHandle(e),c=await c.getDirectoryHandle(e,{create:!0});let l=n.replace(/:/g,`-`),u=[gn(),`groups`,l,...o];try{await qc(e,n,s,c,u)}catch(e){throw o.length>0&&await a.removeEntry(o[0],{recursive:!0}).catch(()=>void 0),e}}async function qc(e,t,n,r,i){for await(let[a,o]of n.entries()){if(o.kind===`directory`){await qc(e,t,o,await r.getDirectoryHandle(a,{create:!0}),[...i,a]);continue}let n=await o.getFile(),s=await r.getFileHandle(a,{create:!0});try{await Ro(s,n)}catch(t){if(!((t instanceof Error?t.message:String(t)).includes(`Writable file streams are not supported`)&&(await Cn(e)).type===`opfs`))throw t;await zo([...i,a],n)}}}var jee=k((()=>{Dn(),Tn(),Vo()}));async function Jc(e,t,n=`.`){for(let r=0;r<2;r++)try{let r=await En(e,t);if(n&&n!==`.`){let e=n.replace(/\\/g,`/`).replace(/^\/home\/user\//,`/`).replace(/^\/+/,``).split(`/`).filter(Boolean);for(let t of e){let e=await r.getDirectoryHandle(t);if(typeof r.isSameEntry==`function`&&await r.isSameEntry(e))throw Error(`Directory navigation stuck at "${r.name}" for segment "${t}" — the stored directory handle may be stale.`);r=e}}let i=[];for await(let[e,t]of r.entries())i.push(t.kind===`directory`?`${e}/`:e);return i.sort()}catch(e){if(r===0&&Sn(e)){xn();continue}throw e}return[]}var Yc=k((()=>{Dn(),Tn()}));function Mee(e){if(!e||typeof e!=`object`)return!1;let t=globalThis.FileSystemDirectoryHandle;return t!==void 0&&e instanceof t||typeof e.getDirectoryHandle==`function`&&typeof e.getFileHandle==`function`&&typeof e.requestPermission==`function`}async function Nee(e){let t=await R(e,L.STORAGE_HANDLE);return!Mee(t)||await t.requestPermission({mode:`readwrite`})===`granted`}var Pee=k((()=>{Ot(),Gt()}));function Xc(e){let t=j();return t?`shadowclaw:${t}:${e}`:e}function Fee(e){if(typeof localStorage>`u`)return null;let t=Xc(e);try{let n=localStorage.getItem(t);if(n!==null)return n;if(t===e)return null;let r=localStorage.getItem(e);if(r!==null)return localStorage.setItem(t,r),r}catch(e){console.warn(`Unable to read from localStorage:`,e)}return null}function Zc(e,t){if(typeof localStorage>`u`)return;let n=Xc(e);try{localStorage.setItem(n,t)}catch(e){console.warn(`Unable to write to localStorage:`,e)}}var Iee=k((()=>{Ye()}));async function Qc(e,t){let n=await En(e,t);for await(let[e]of n.entries())await n.removeEntry(e,{recursive:!0})}var Lee=k((()=>{Dn()}));async function $c(e,t,n){let r=await En(e,t),{dirs:i,filename:a}=ii(n.replace(/\/$/,``)),o=r;for(let e of i)o=await o.getDirectoryHandle(e);await o.removeEntry(a,{recursive:!0})}var el=k((()=>{Dn(),ai()}));function tl(e,t){return`${e}:${t}`}async function nl(e){let t=await R(e,L.SUPPRESSED_PAGES_LIST);if(!t||typeof t!=`string`)return[];try{let e=JSON.parse(t);if(Array.isArray(e))return e}catch{}return[]}async function rl(e,t,n){let r=await nl(e),i=tl(t,n);return r.some(e=>tl(e.groupId,e.path)===i)}async function il(e,t,n){let r=await nl(e),i=tl(t,n);if(!r.some(e=>tl(e.groupId,e.path)===i)){let i=[...r,{groupId:t,path:n}];await B(e,L.SUPPRESSED_PAGES_LIST,JSON.stringify(i))}}async function al(e,t,n){let r=await nl(e),i=tl(t,n),a=r.filter(e=>tl(e.groupId,e.path)!==i);a.length!==r.length&&await B(e,L.SUPPRESSED_PAGES_LIST,JSON.stringify(a))}var ol=k((()=>{Ot(),Gt(),Wo()}));function sl(e){return Array.from(new Set(e.map(e=>e.trim()).filter(Boolean)))}var cl=k((()=>{}));function ll(e){let t=e.trim().replace(/\\/g,`/`);return t===`/`||/^\/+$/.test(t)?`/`:t.replace(/^\/+/,``).replace(/\/+$/,``)}function ul(e){return e===`/`?`/`:e.replace(vl,``)}function dl(e){let t=e.trim().replace(/\\/g,`/`);return t===`/`||/^\/+$/.test(t)?`/`:t.replace(/^\/+/,``).replace(/\/+$/,``)}function fl(e){return e?e.replace(/^br:/i,``).replace(/^br-/i,``).trim():`main`}function pl(e,t){let n=dl(t);if(!n)return;e.add(n);let r=ul(n);r&&r!==n&&e.add(r)}function ml(e,t,n){let r=/* @__PURE__ */ new Set;if(!e)return r;let i=fl(t);if(e===`/`){if(r.add(`/`),pl(r,`index.html`),n){let e=ll(n);e&&e!==`/`&&pl(r,`${e}/index.html`)}return pl(r,`pages/index.html`),pl(r,`pages/${i}/index.html`),pl(r,`${i}/index.html`),r}if(pl(r,e),n){let t=ll(n);t&&t!==`/`&&pl(r,`${t}/${e}`)}if(e.startsWith(`pages/`)){let t=e.slice(6);pl(r,t),t.startsWith(`${i}/`)?pl(r,t.slice(`${i}/`.length)):pl(r,t.replace(/^[^/]+\//,``))}else pl(r,`pages/${e}`),pl(r,`pages/${i}/${e}`),pl(r,`${i}/${e}`);for(let e of Array.from(r)){let t=ul(e);if(e===`index.html`||t===`index`){r.add(`/`);break}}return r}function hl(e,t){let n=t.toLowerCase(),r=ul(t).toLowerCase(),i=n===r?[n]:[n,r];for(let t of e){let e=t.toLowerCase(),n=ul(e);for(let t of i)if(t&&(e===t||n===t||t!==`/`&&(e.startsWith(`${t}/`)||n.startsWith(`${t}/`)||e.endsWith(`/${t}`)||n.endsWith(`/${t}`)||e.includes(`/${t}/`)||n.includes(`/${t}/`))))return!0}return!1}function gl(e,t){for(let n of t){let t=ll(n);if(t&&hl(e,t))return!0}return!1}function _l(e,t,n,r){if(!e||typeof e!=`string`)return!1;let i=dl(e);if(!i)return!1;let a=[],o=[],s,c;if(t&&typeof t==`object`&&!Array.isArray(t)){let e=t,n=e.allowList??e.allowlist??[],r=e.denyList??e.denylist??[];a=sl(Array.from(n||[])),o=sl(Array.from(r||[])),s=e.groupId,c=e.basePathPrefix}else a=sl(Array.from(t||[])),o=sl(Array.from(n||[])),s=r?.groupId,c=r?.basePathPrefix;let l=ml(i,s,c);return o.length>0&&gl(l,o)?!1:a.length>0?gl(l,a):!0}var vl,yl=k((()=>{cl(),vl=/\.(md|markdown|html|xhtml|txt)$/i}));function bl(e){if(!e)return``;let t=e.match(/^\r?\n([ \t]+)/);if(t){let n=t[1],r=RegExp(`^[ \\t]{1,${n.length}}`,`gm`);return e.replace(/^\r?\n/,``).replace(r,``).replace(/\r?\n[ \t]*$/,`
|
|
140
140
|
`)}if(/^(?:\r?\n)+[ \t]*---/.test(e))return e.replace(/^(?:\r?\n)+/,``);if(/^[ \t]+---/.test(e)){let t=e.match(/^[ \t]+/);if(t){let n=t[0],r=RegExp(`^[ \\t]{1,${n.length}}`,`gm`);return e.replace(r,``)}}return e}var xl=k((()=>{}));function Sl(e=dt){return e===`br:main`?L.STATIC_MAIN_SITE_SEEDED:`${L.STATIC_MAIN_SITE_SEEDED}:${e}`}async function Cl(e,t=dt){let n=await R(e,Sl(t));return n===!0||n===`true`}async function wl(e,t=dt,n=!0){await B(e,Sl(t),n)}function Tl(){let e=Ge(`/${Hl}`);if(typeof window<`u`&&window.location?.origin)try{return new URL(e,window.location.origin).toString()}catch{return e}return e}function El(e){let t=e.replace(/^\/+/,``),n=Ul;if(typeof document<`u`)try{let e=document.getElementById(`shadow-claw-site-config`);if(e?.textContent){let t=JSON.parse(e.textContent);typeof t?.pages?.baseUrl==`string`&&(n=t.pages.baseUrl.replace(/^\/+/,``).replace(/\/+$/,``))}}catch{}let r=Ge(n?`/${n}/${t}`:`/${t}`);if(typeof window<`u`&&window.location?.origin)try{return new URL(r,window.location.origin).toString()}catch{return r}return r}async function Dl(){if(typeof fetch!=`function`)return null;try{let e=Tl(),t=await fetch(e);if(t.ok){if((t.headers?.get?.(`content-type`)||``).includes(`text/html`))return null;let e=await t.json();if(e&&Array.isArray(e.pages))return e}}catch{}return null}async function Ol(e){if(typeof fetch!=`function`)return null;try{let t=El(e),n=await fetch(t);if(n.ok){let t=n.headers?.get?.(`content-type`)||``;if((e.endsWith(`.md`)||e.endsWith(`.markdown`)||e.endsWith(`.json`))&&t.includes(`text/html`))return null;let r=await n.text();return r.includes(`<shadow-claw`)||r.includes(`data-shadow-claw-dsd`)?null:r}}catch{}return null}function kl(e){if(typeof document>`u`)return null;let t=t=>{if(!t||!(t instanceof HTMLElement))return!1;if(!e)return!0;let n=t.getAttribute(`data-initial-path`)?.trim();return!n||n===e},n=document.querySelector(e?`[data-pages-rendered][data-initial-path="${e}"]`:`[data-pages-rendered]`);if(t(n))return n;let r=document.querySelector(`shadow-claw`)?.shadowRoot,i=(r?.querySelector(`shadow-claw-pages`)?.shadowRoot)?.querySelector(e?`[data-pages-rendered][data-initial-path="${e}"]`:`[data-pages-rendered]`)||r?.querySelector(e?`[data-pages-rendered][data-initial-path="${e}"]`:`[data-pages-rendered]`);if(t(i))return i;let a=document.querySelectorAll(`template`);for(let n of Array.from(a)){let r=n.content?.querySelector(e?`[data-pages-rendered][data-initial-path="${e}"]`:`[data-pages-rendered]`);if(t(r))return r;let i=n.content?.querySelectorAll(`template`);if(i)for(let n of Array.from(i)){let r=n.content?.querySelector(e?`[data-pages-rendered][data-initial-path="${e}"]`:`[data-pages-rendered]`);if(t(r))return r}}return null}function Al(e=`index.html`){let t=kl(e);if(!t)return null;let n=t.getAttribute(`data-initial-path`)?.trim();if(n&&n!==e)return null;let r=t.querySelector(`[data-markdown-frontmatter]`),i=null;if(r){let e=r.getAttribute(`data-frontmatter`);if(e)try{i=JSON.parse(e)}catch{}}let a=t.cloneNode(!0),o=a.querySelector(`[data-markdown-frontmatter]`);o&&o.remove();let s=a.innerHTML.trim();if(!s&&!i)return null;if(i&&Object.keys(i).length>0){let e=[`---`];for(let[t,n]of Object.entries(i))typeof n==`string`?e.push(`${t}: ${JSON.stringify(n)}`):typeof n==`number`||typeof n==`boolean`?e.push(`${t}: ${n}`):e.push(`${t}: ${JSON.stringify(n)}`);return e.push(`---`,``),`${e.join(`
|
|
141
|
-
`)}\n${s}`}return s}async function jl(e={}){let t=()=>{let e=null;if(typeof document<`u`){let t=document.getElementById(`shadow-claw-static-manifest`);if(t&&t.textContent)try{let n=JSON.parse(t.textContent);n&&Array.isArray(n.pages)&&(e={...n,pages:[...n.pages]})}catch(e){console.warn(`Failed to parse embedded static main manifest:`,e)}let n=document.querySelectorAll(`script[type="text/markdown"][data-shadow-claw-page]`);if(n.length>0){e||={pages:[]};for(let t of Array.from(n)){let n=t.getAttribute(`data-shadow-claw-page`)?.trim();if(n){let r=t.textContent||``;r=bl(r),!r.trim()&&/^memory\.(md|markdown)$/iu.test(n)&&(r=Go),!r.trim()&&(n===`index.html`||/^index\.(html?|xhtml)$/iu.test(n))&&(r=Al(n)??is);let i=e.pages.findIndex(e=>e.displayPath===n);i>=0?e.pages[i].content=r:e.pages.push({displayPath:n,content:r})}}}let r=document.getElementById(`shadow-claw-site-config`);if(r?.textContent)try{let t=JSON.parse(r.textContent);if(Array.isArray(t?.pages?.files)){e||={pages:[]};for(let n of t.pages.files)if(typeof n==`string`&&n.trim()){let t=n.trim(),r=``;/^memory\.(md|markdown)$/iu.test(t)?r=Go:(t===`index.html`||/^index\.(html?|xhtml)$/iu.test(t))&&(r=Al(t)??is),e.pages.some(e=>e.displayPath===t)||e.pages.push({displayPath:t,content:r})}}}catch{}let i=kl();if(i){e||={pages:[]};let t=i.getAttribute(`data-initial-path`)?.trim()||`index.html`;if(!e.pages.some(e=>e.displayPath===t)){let n=Al(t)??is;e.pages.push({displayPath:t,content:n})}e.pages.some(e=>/^memory\.(md|markdown)$/iu.test(e.displayPath))||e.pages.push({displayPath:`MEMORY.md`,content:Go})}}return e};if(e.preferEmbedded!==!1){let e=t();if(e)return e}if(e.fetchFallback!==!1){let e=await Dl();if(e)return e}if(e.preferEmbedded===!1){let e=t();if(e)return e}return{pages:[{displayPath:`index.html`,content:is},{displayPath:`MEMORY.md`,content:Go}]}}async function Ml(e,t,n=[]){for(let[r,i]of Object.entries(t))if(r===`purgePreRenderedStaticPages`&&i===!0){if(n.length>0){let t=n[0],r=n.slice(1).join(`/`);try{r?await $c(e,t,r):await Qc(e,t)}catch(e){console.warn(`Failed to purge pre-rendered static pages for ${t}/${r}:`,e)}}}else typeof i==`object`&&i&&await Ml(e,i,[...n,r])}function Nl(){if(typeof document<`u`)try{let e=document.getElementById(`shadow-claw-site-config`);if(e?.textContent){let t=JSON.parse(e.textContent);if(t?.pages?.sortOrder===`desc`)return`desc`;if(t?.pages?.sortOrder===`asc`)return`asc`}}catch{}return`desc`}function Pl(){if(typeof document<`u`)try{let e=document.getElementById(`shadow-claw-site-config`);if(e?.textContent){let t=JSON.parse(e.textContent)?.pages?.defaultPinnedPage;if(typeof t==`string`&&t.trim().length>0)return t.trim()}}catch{}return null}function Fl(){if(typeof document<`u`)try{let e=document.getElementById(`shadow-claw-site-config`);if(e?.textContent){let t=JSON.parse(e.textContent);return{allowList:sl(t?.pages?.allowList??t?.pages?.allowlist??t?.allowList??t?.allowlist??[]),denyList:sl(t?.pages?.denyList??t?.pages?.denylist??t?.denyList??t?.denylist??[])}}}catch{}return{allowList:[],denyList:[]}}function Il(e,t){let n=t??Nl();return[...e].sort((e,t)=>{let r=e.path,i=t.path,a=r.split(`/`).pop()||``,o=i.split(`/`).pop()||``,s=/^index\.(html?|xhtml)$/iu.test(a),c=/^index\.(html?|xhtml)$/iu.test(o);if(s&&!c)return-1;if(!s&&c)return 1;let l=/^memory\.(md|markdown)$/iu.test(a),u=/^memory\.(md|markdown)$/iu.test(o);return l&&!u?1:!l&&u?-1:n===`asc`?r.localeCompare(i,void 0,{numeric:!0,sensitivity:`base`}):i.localeCompare(r,void 0,{numeric:!0,sensitivity:`base`})})}async function Ll(e,t,n=zl,r=Bl){let i=t??Vl;try{if(Fee(n)===i)return!0}catch{}try{if(await R(e,r)===i){try{Zc(n,i)}catch{}return!0}await B(e,r,i);try{Zc(n,i)}catch{}}catch{try{Zc(n,i)}catch{}}return!1}async function Rl(e,t=dt,n=[],r={}){await ls(e,t);let i=await jl(r),a=!1;i.preRenderedStaticPages&&(await Ll(e,i.purgeId)||(a=!0,await Ml(e,i.preRenderedStaticPages)));let o=!1;if(t===`br:main`&&i.skillsPurgeId!==void 0&&!await Ll(e,i.skillsPurgeId,`sc:skills-purge-id`,`static_main_skills_purge_id`)){o=!0;try{await $c(e,t,`.agents/skills/main`)}catch(e){if(!(e&&typeof e==`object`&&`name`in e&&e.name===`NotFoundError`))throw e}try{await $c(e,t,`.agents/tools/main`)}catch(e){if(!(e&&typeof e==`object`&&`name`in e&&e.name===`NotFoundError`))throw e}}for(let n of i.pages)if(n.content?.includes(`slug: "shadow-claw--purge-pages"`)){!a&&!await Ll(e,i.purgeId)&&(a=!0,await Qc(e,t));break}let s=t===`br:main`&&await Qo(e),c=new Set(i.pages.map(e=>tl(t,e.displayPath))),l=a?n.filter(e=>e.groupId!==t||c.has(tl(e.groupId,e.path))):[...n],{allowList:u,denyList:d}=Fl(),f=0;for(let n of i.pages)if(f++,f%5==0&&await new Promise(e=>setTimeout(e,0)),!n.content?.includes(`slug: "shadow-claw--purge-pages"`)&&_l(n.displayPath,{allowList:u,denyList:d,groupId:t})){if(/^memory\.(md|markdown)$/iu.test(n.displayPath)){if(s)continue;let r=typeof n.content==`string`&&n.content.trim().length>0&&n.content!==Go?n.content:void 0;if(r===void 0?await es(e,t):await es(e,t,r)){let e=tl(t,n.displayPath);l.some(t=>tl(t.groupId,t.path)===e)||l.push({groupId:t,path:n.displayPath})}}else if(!await rl(e,t,n.displayPath))try{if(!await Yo(e,t,n.displayPath)){let r=n.content;(typeof r!=`string`||!r.trim())&&(r=n.displayPath===`index.html`?Al(`index.html`)??is:await Ol(n.displayPath)??``),await Ho(e,t,n.displayPath,r)}let r=tl(t,n.displayPath);l.some(e=>tl(e.groupId,e.path)===r)||l.push({groupId:t,path:n.displayPath})}catch(e){console.warn(`Failed to seed static page file ${n.displayPath}:`,e)}}if(t===`br:main`){for(let n of i.skills||[]){let r=`.agents/skills/main/${n.displayPath}`;try{await Yo(e,t,r)||await Ho(e,t,r,n.content)}catch(e){console.warn(`Failed to seed skill file ${r}:`,e)}}for(let n of i.tools||[]){let r=`.agents/tools/main/${n.displayPath}`;try{(o||!await Yo(e,t,r))&&await Ho(e,t,r,n.content)}catch(e){console.warn(`Failed to seed tool file ${r}:`,e)}}}let p=typeof document<`u`&&(document.getElementById(`shadow-claw-static-manifest`)!==null||document.querySelector(`script[type="text/markdown"][data-shadow-claw-page]`)!==null||kl()!==null);r.preferEmbedded!==!1&&p||await wl(e,t,!0);let m=l.filter(e=>_l(e.path,{allowList:u,denyList:d,groupId:e.groupId}));return Object.defineProperty(m,"didPurge",{value:a,enumerable:!1,writable:!0,configurable:!0}),Object.defineProperty(m,"didPurgeSkills",{value:o,enumerable:!1,writable:!0,configurable:!0}),Il(m)}var zl,Bl,Vl,Hl,Ul,Wl=k((()=>{Ot(),Iee(),as(),Ko(),Ye(),Gt(),Wo(),Lee(),el(),ds(),rs(),Xo(),ol(),Uo(),yl(),cl(),xl(),zl=`sc:purge-id`,Bl=`static_main_site_purge_id`,Vl=`__legacy_purge_pages__`,Hl=`static-main-manifest.json`,Ul=`static-main`})),Gl,Ree=k((()=>{hc(),Gl=class{_events;_handlers=[];_runs=/* @__PURE__ */ new Map;constructor(e){this._events=e}start(){this._listen(`streaming-start`,this._onStreamingStart),this._listen(`streaming-chunk`,this._onStreamingChunk),this._listen(`streaming-end`,this._onStreamingEnd),this._listen(`streaming-done`,this._onStreamingDone),this._listen(`streaming-error`,this._onStreamingError),this._listen(`tool-activity`,this._onToolActivity)}stop(){for(let{event:e,handler:t}of this._handlers)this._events.off(e,t);this._handlers=[],this._runs.clear()}_emit(e,t){window.dispatchEvent(new CustomEvent(`shadow-claw-agui-event`,{detail:{groupId:e,event:t}}))}_listen(e,t){this._events.on(e,t),this._handlers.push({event:e,handler:t})}_onStreamingChunk=({groupId:e,text:t})=>{let n=this._runs.get(e);n&&n.messageId&&this._emit(e,{type:`TEXT_MESSAGE_CONTENT`,messageId:n.messageId,delta:t,timestamp:Date.now()})};_onStreamingDone=({groupId:e})=>{let t=this._runs.get(e);t&&(t.messageId&&this._emit(e,{type:`TEXT_MESSAGE_END`,messageId:t.messageId,timestamp:Date.now()}),this._emit(e,{type:`RUN_FINISHED`,threadId:t.threadId,runId:t.runId,timestamp:Date.now()}),this._runs.delete(e))};_onStreamingEnd=({groupId:e})=>{let t=this._runs.get(e);t&&t.messageId&&(this._emit(e,{type:`TEXT_MESSAGE_END`,messageId:t.messageId,timestamp:Date.now()}),t.messageId=null)};_onStreamingError=({groupId:e,error:t})=>{let n=this._runs.get(e);n&&(n.messageId&&this._emit(e,{type:`TEXT_MESSAGE_END`,messageId:n.messageId,timestamp:Date.now()}),this._emit(e,{type:`RUN_ERROR`,message:t||`Unknown streaming error`,timestamp:Date.now()}),this._runs.delete(e))};_onStreamingStart=({groupId:e})=>{let t=cc(),n=e,r=cc();this._runs.set(e,{runId:t,threadId:n,messageId:r,activeToolCallIds:/* @__PURE__ */ new Set}),this._emit(e,{type:`RUN_STARTED`,threadId:n,runId:t,timestamp:Date.now()}),this._emit(e,{type:`TEXT_MESSAGE_START`,messageId:r,role:`assistant`,timestamp:Date.now()})};_onToolActivity=({groupId:e,tool:t,status:n})=>{let r=this._runs.get(e);if(r){if(n===`running`){let n=cc();r.activeToolCallIds.add(n),this._emit(e,{type:`TOOL_CALL_START`,toolCallId:n,toolCallName:t,timestamp:Date.now()}),r._lastToolCallId=n}else if(n===`done`||n===`error`){let t=r._lastToolCallId;t&&(r.activeToolCallIds.delete(t),this._emit(e,{type:`TOOL_CALL_END`,toolCallId:t,timestamp:Date.now()}))}}}}})),Kl,ql,Jl,zee=k((()=>{Xs(),Kl=5,ql=class{#e=new Ys.State(0);#t=/* @__PURE__ */ new Map;#n=new Ys.State([]);clear(){this.#t.forEach((e,t)=>this.clearTimer(t)),this.#t.clear(),this.#n.set([])}clearTimer(e){let t=this.#t.get(e);t?.timeoutId&&clearTimeout(t.timeoutId),this.#t.delete(e)}dismiss(e){this.clearTimer(e),this.#n.set(this.#n.get().filter(t=>t.id!==e))}pause(e){let t=this.#t.get(e);t&&t.timeoutId&&(clearTimeout(t.timeoutId),t.timeoutId=void 0,t.remaining=Math.max(0,t.remaining-(Date.now()-t.startedAt)),this.#t.set(e,t))}resolveAction(e){if(e&&typeof e.label==`string`&&typeof e.onClick==`function`)return e}resolveDuration(e){return typeof e!=`number`||Number.isNaN(e)||e<0?4e3:e}resolveType(e){return e&&[`success`,`warning`,`error`,`info`].includes(e)?e:`info`}resume(e){let t=this.#t.get(e);!t||t.timeoutId||t.remaining<=0||this.scheduleDismiss(e,t.remaining)}scheduleDismiss(e,t){this.clearTimer(e);let n=globalThis.setTimeout(()=>{this.dismiss(e)},t);this.#t.set(e,{timeoutId:n,remaining:t,startedAt:Date.now()})}show(e,t={}){let n=this.#e.get()+1;this.#e.set(n);let r={id:n,message:e,type:this.resolveType(t.type),duration:this.resolveDuration(t.duration),action:this.resolveAction(t.action),createdAt:Date.now()},i=[...this.#n.get(),r];if(i.length>Kl){let e=i[0];this.clearTimer(e.id),this.#n.set(i.slice(1))}else this.#n.set(i);return r.duration>0&&this.scheduleDismiss(r.id,r.duration),r.id}get toasts(){return this.#n.get()}async runAction(e){let t=this.#n.get().find(t=>t.id===e);t?.action&&await t.action.onClick()}},Jl=new ql}));function Yl(e,t={}){return Jl.show(e,t)}function Bee(e,t=4e3){return Jl.show(e,{type:`success`,duration:t})}function Xl(e,t=5e3){return Jl.show(e,{type:`error`,duration:t})}var Zl=k((()=>{zee()}));function Vee(e,t){if(!e||typeof e!=`object`)return e;let n=JSON.parse(JSON.stringify(e));for(let e of t)Hee(n,e);return n}function Hee(e,t){let{op:n,path:r,value:i}=t;if(!r||!r.startsWith(`/`))return;let a=r.split(`/`).slice(1).map(e=>e.replace(/~1/g,`/`).replace(/~0/g,`~`)),o=a.pop();if(o===void 0)return;let s=e;for(let e of a){if(typeof s!=`object`||!s)return;s=s[e]}typeof s==`object`&&s&&(Array.isArray(s)?Uee(s,o,n,i):Wee(s,o,n,i))}function Uee(e,t,n,r){if(n===`add`){if(t===`-`)e.push(r);else{let n=parseInt(t,10);!isNaN(n)&&n>=0&&n<=e.length&&e.splice(n,0,r)}}else if(n===`replace`){let n=parseInt(t,10);!isNaN(n)&&n>=0&&n<e.length&&(e[n]=r)}else if(n===`remove`){let n=parseInt(t,10);!isNaN(n)&&n>=0&&n<e.length&&e.splice(n,1)}}function Wee(e,t,n,r){n===`add`||n===`replace`?e[t]=r:n===`remove`&&delete e[t]}var Gee=k((()=>{}));function Kee(e){if(e==null)return null;let t=String(e).trim().toLowerCase();return[`1`,`true`,`yes`,`on`].includes(t)?!0:![`0`,`false`,`no`,`off`].includes(t)&&null}function Ql(e,t=!1){if(e==null)return t;if(typeof e==`boolean`)return e;if(typeof e==`number`)return e===1;if(typeof e==`string`){let t=e.trim().toLowerCase();return t===`true`||t===`1`}return!1}var $l=k((()=>{}));function eu(e){if(!e)return[];try{let t=JSON.parse(e);if(Array.isArray(t))return sl(t.map(e=>String(e)))}catch{}return sl(e.split(`,`))}var qee=k((()=>{cl()}));function tu(e){if(typeof document>`u`)return null;let t=`shadow-claw-site-config`;if(e){let n=e.getAttribute(`config`)?.trim();n&&(t=n.replace(/^#/,``))}let n=document.getElementById(t);if(!n?.textContent)return nu.delete(t),null;let r=nu.get(t);if(r&&r.rawText===n.textContent)return r.config;try{let e=JSON.parse(n.textContent);if(!e||typeof e!=`object`)return nu.delete(t),null;let r={...e};return nu.set(t,{rawText:n.textContent,config:r}),r}catch(e){return console.warn(`[ShadowClaw] Failed to parse site configuration from #${t}:`,e),null}}var nu,Jee=k((()=>{nu=/* @__PURE__ */ new Map})),ru,Yee=k((()=>{ru={name:`bash`,description:`Execute a shell command. When WebVM is available, runs in a full Alpine Linux VM (x86) with all standard Linux commands. When WebVM is disabled or unavailable, falls back to a lightweight JavaScript shell emulator with 83 commands: alias, awk, base64, basename, bash, cat, cd, chmod, clear, column, comm, command, cp, curl, cut, date, diff, dirname, du, echo, egrep, env, expand, export, expr, false, fgrep, file, find, fold, grep, gunzip, gzip, head, help, html-to-markdown, join, jq, ln, ls, md5sum, mkdir, mv, nl, od, paste, printenv, printf, pwd, readlink, realpath, rev, rg, rm, rmdir, sed, seq, sh, sha1sum, sha256sum, sha384sum, sha512sum, sleep, sort, split, stat, strings, tac, tail, tar, tee, test, timeout, touch, tr, tree, true, unalias, uniq, wc, which, xargs, yes, zcat. Commands NOT available in fallback mode: node, npm, npx, git, apk, python, wget.Supports pipes (|), redirects (> >>), operators (&& || ;), newlines, and # comments. Prefer read_file/write_file for file inspection and edits — they are faster and more reliable than shell commands for that purpose.`,input_schema:{type:`object`,properties:{command:{type:`string`,description:`The bash command to execute`},stdin:{type:`string`,description:`Optional standard input (stdin) to pass to the command`},timeout:{type:`number`,description:`Timeout in seconds (default from Settings, initially 120; max: 1800)`}},required:[`command`]}}})),iu,au,Xee=k((()=>{iu={name:`clear_chat`,description:`Clear the current chat history and start a new session. Useful for scheduled tasks to prevent context from growing indefinitely.`,input_schema:{type:`object`,properties:{}}},au={name:`ask_user`,description:`Pause execution to ask the user a question or request confirmation. This halts the agent's work until the user provides an answer. Use this for human-in-the-loop checkpoints before taking destructive actions or when you need clarification to proceed.`,input_schema:{type:`object`,properties:{question:{type:`string`,description:`The question or confirmation message to present to the user.`},options:{type:`array`,items:{type:`string`},description:`Optional list of predefined choices for the user to select from.`}},required:[`question`]}}})),ou,su,cu,Zee=k((()=>{ou={name:`manage_email`,description:`Manage email connection settings for IMAP/SMTP workflows. Supports status, connect/configure, enable/disable, delete, read_messages, send_message, mark_as_read, mark_as_unread, delete_messages, download_attachments, list available connection types, and lightweight test actions.`,input_schema:{type:`object`,properties:{action:{type:`string`,enum:[`status`,`list_plugins`,`list_connections`,`connect`,`configure`,`enable`,`disable`,`delete`,`test`,`read_messages`,`send_message`,`mark_as_read`,`mark_as_unread`,`delete_messages`,`download_attachments`],description:`Email management action to perform.`},plugin_id:{type:`string`,description:`Optional connection type ID for connect operations (default: imap).`},connection_id:{type:`string`,description:`Connection ID or label for configure, enable, disable, delete, and test actions. For read_messages/send_message, it may be omitted when there is exactly one enabled IMAP connection.`},label:{type:`string`,description:`Human-readable connection label for new connections.`},enabled:{type:`boolean`,description:`Optional enabled flag used during connect/configure actions.`},config:{type:`object`,properties:{},description:`Email config object (host, port, secure, mailboxPath, smtpHost, smtpPort, smtpSecure, etc.).`},mailbox_path:{type:`string`,description:`Optional mailbox path override for read_messages (default: INBOX).`},limit:{type:`number`,description:`Optional max messages to fetch for read_messages (default 10, range 1-50).`},unread_only:{type:`boolean`,description:`If true, read_messages returns only unread messages.`},message_uids:{type:`array`,items:{type:`number`},description:`Message UIDs for mark_as_read, mark_as_unread, and delete_messages actions.`},message_uid:{type:`number`,description:`Single message UID used by download_attachments action.`},attachment_parts:{type:`array`,items:{type:`string`},description:`Optional IMAP MIME part IDs to download (for example: 2, 3.1). If omitted, all attachments in the message are downloaded.`},save_directory:{type:`string`,description:`Optional workspace directory for downloaded attachments (default: downloads/email).`},attachments:{type:`array`,items:{anyOf:[{type:`string`},{type:`object`,properties:{path:{type:`string`},filename:{type:`string`},content_type:{type:`string`}},required:[`path`]}]},description:`Optional workspace file attachments for send_message. Provide paths or objects with path/filename/content_type.`},to:{type:`array`,items:{type:`string`},description:`Recipient email addresses for send_message.`},cc:{type:`array`,items:{type:`string`},description:`Optional CC recipient addresses for send_message.`},bcc:{type:`array`,items:{type:`string`},description:`Optional BCC recipient addresses for send_message.`},subject:{type:`string`,description:`Message subject for send_message.`},body:{type:`string`,description:`Plaintext message body for send_message.`},html:{type:`string`,description:`Optional HTML body for send_message.`},from:{type:`string`,description:`Optional from address override for send_message.`},reply_to:{type:`string`,description:`Optional reply-to address for send_message.`},username:{type:`string`,description:`Optional username override for connect/configure/read_messages/send_message.`},password:{type:`string`,description:`Optional password override for connect/configure/read_messages/send_message.`}},required:[`action`]}},su={name:`email_read_messages`,description:`Read recent messages from a configured email connection (IMAP). Use this to check inbox mail from an agent workflow. Results include attachment metadata when available.`,input_schema:{type:`object`,properties:{connection_id:{type:`string`,description:`Email connection ID or label.`},mailbox_path:{type:`string`,description:`Optional mailbox path override (default: INBOX).`},limit:{type:`number`,description:`Optional max messages to fetch (default 10, range 1-50).`},unread_only:{type:`boolean`,description:`If true, only unread messages are returned.`}},required:[`connection_id`]}},cu={name:`email_send_message`,description:`Send an email message through a configured email connection (SMTP).`,input_schema:{type:`object`,properties:{connection_id:{type:`string`,description:`Email connection ID or label.`},to:{type:`array`,items:{type:`string`},description:`Recipient email addresses.`},cc:{type:`array`,items:{type:`string`},description:`Optional CC recipient addresses.`},bcc:{type:`array`,items:{type:`string`},description:`Optional BCC recipient addresses.`},subject:{type:`string`,description:`Message subject.`},body:{type:`string`,description:`Plaintext message body.`},html:{type:`string`,description:`Optional HTML message body.`},from:{type:`string`,description:`Optional from address override.`},reply_to:{type:`string`,description:`Optional reply-to address.`}},required:[`connection_id`,`to`,`subject`]}}})),lu,uu,du,Qee=k((()=>{lu={name:`fetch_url`,description:`Fetch a URL via HTTP and return the response body. Subject to browser CORS restrictions — works with most public APIs. Response is truncated to 100KB. Set use_git_auth to true to automatically inject the saved Git PAT as an Authorization header (supports GitHub, Azure DevOps, GitLab, and other providers — auth format is auto-detected from the URL's host). If include_headers is true, the response will include both request and response headers.`,input_schema:{type:`object`,properties:{url:{type:`string`,description:`The URL to fetch`},method:{type:`string`,description:`HTTP method (default: GET)`},headers:{type:`object`,properties:{},description:`Request headers as key-value pairs`},body:{type:`string`,description:`Request body (for POST/PUT/PATCH)`},use_git_auth:{type:`boolean`,description:`If true, inject the saved Git credentials as an Authorization header. Auth format is auto-detected from the URL host: GitHub (token), Azure DevOps (Basic), GitLab (Bearer), or generic Bearer.`},git_account_id:{type:`string`,description:`Optional explicit Git account ID to use when use_git_auth is true. If omitted, account resolution uses hostPattern/default matching.`},use_account_auth:{type:`boolean`,description:`If true, inject a saved service account PAT as a Bearer Authorization header. The account is matched by hostPattern against the URL (longest match wins), then falls back to the default service account. Use this for non-Git services like Figma, Notion, or any other service whose PAT is stored under Settings → Accounts.`},account_id:{type:`string`,description:`Optional explicit service account ID to use when use_account_auth is true. If omitted, account resolution uses hostPattern/default matching.`},auth_mode:{type:`string`,enum:[`pat`,`oauth`],description:`Optional preferred credential mode when multiple accounts match. Valid values: pat or oauth.`},include_headers:{type:`boolean`,description:`If true, include request and response headers in the output.`}},required:[`url`]}},uu={name:`fetch_file`,description:`Fetch a URL and save the response body directly to the workspace in one step. Equivalent to fetch_url + write_file but atomic. Text responses are saved as UTF-8; binary responses (images, PDFs, audio, video, zip, application/octet-stream) are saved as raw bytes. The destination path within the workspace is required. Supports the same authentication options as fetch_url (use_git_auth, use_account_auth, etc.). Returns the workspace path the file was saved to and the number of bytes written.`,input_schema:{type:`object`,properties:{url:{type:`string`,description:`The URL to fetch`},path:{type:`string`,description:`Destination path within the workspace (e.g. 'data/response.json'). Parent directories are created automatically. Must not contain '..' segments.`},method:{type:`string`,description:`HTTP method (default: GET)`},headers:{type:`object`,properties:{},description:`Request headers as key-value pairs`},body:{type:`string`,description:`Request body (for POST/PUT/PATCH)`},use_git_auth:{type:`boolean`,description:`If true, inject the saved Git credentials as an Authorization header. Auth format is auto-detected from the URL host: GitHub (token), Azure DevOps (Basic), GitLab (Bearer), or generic Bearer.`},git_account_id:{type:`string`,description:`Optional explicit Git account ID to use when use_git_auth is true. If omitted, account resolution uses hostPattern/default matching.`},use_account_auth:{type:`boolean`,description:`If true, inject a saved service account PAT as a Bearer Authorization header. The account is matched by hostPattern against the URL (longest match wins), then falls back to the default service account.`},account_id:{type:`string`,description:`Optional explicit service account ID to use when use_account_auth is true. If omitted, account resolution uses hostPattern/default matching.`},auth_mode:{type:`string`,enum:[`pat`,`oauth`],description:`Optional preferred credential mode when multiple accounts match. Valid values: pat or oauth.`}},required:[`url`,`path`]}},du={name:`web_search`,description:`Perform a web search using a search engine to discover information. Returns a plain-text summary of the top search results including titles, URLs, and snippets. Use this when you need to find information but don't know the exact URL to fetch.`,input_schema:{type:`object`,properties:{query:{type:`string`,description:`The search query to look up.`}},required:[`query`]}}})),fu,$ee=k((()=>{fu={name:`javascript`,description:`Execute JavaScript code in a sandboxed Worker and return the result. Lighter than bash — no VM boot required. Use for calculations, data transformations, JSON processing, string analysis, etc. Runs in strict mode. No access to DOM, eval(), Function(), self, postMessage, importScripts, navigator, or indexedDB — these are all undefined. fetch availability is controlled by Tool Configuration -> Internet Access (shared with bash). setTimeout is available but setInterval is blocked. IMPORTANT: You CANNOT call other agent tools (like read_file, write_file, or bash) from inside this sandbox. If you need to process file contents or tool outputs, you must fetch them in a previous turn and pass the data into this tool via the $PIPE_DATA variable. Write plain JavaScript expressions and statements — the return value of the last expression is captured as the result.`,input_schema:{type:`object`,properties:{code:{type:`string`,description:`JavaScript code to execute. The return value of the last expression is captured.`},data:{type:`string`,description:"Optional input data string. Accessible inside the code sandbox via the global constant `$PIPE_DATA`."}},required:[`code`]}}})),pu,mu,ete=k((()=>{pu={name:`remote_mcp_list_tools`,description:`List available tools from a configured Remote MCP connection by connection ID or label.`,input_schema:{type:`object`,properties:{connection_id:{type:`string`,description:`Remote MCP connection ID or label`}},required:[`connection_id`]}},mu={name:`remote_mcp_call_tool`,description:`Call a tool exposed by a configured Remote MCP connection.`,input_schema:{type:`object`,properties:{connection_id:{type:`string`,description:`Remote MCP connection ID or label`},tool_name:{type:`string`,description:`Remote MCP tool name`},arguments:{type:`object`,properties:{},description:`Arguments object passed to the remote MCP tool`}},required:[`connection_id`,`tool_name`]}}})),hu,gu,tte=k((()=>{hu={name:`manage_tools`,description:`Enable or disable specific tools, or activate a predefined tool profile. Use list_tool_profiles to see available profiles before activating one. This helps optimize the context window and focus capabilities. Changes take effect on the NEXT turn, not immediately within the current tool-use loop.`,input_schema:{type:`object`,properties:{action:{type:`string`,enum:[`enable`,`disable`,`activate_profile`],description:`The management action to perform.`},tool_names:{type:`array`,items:{type:`string`},description:`List of tool names to enable or disable. Required for 'enable' and 'disable' actions.`},profile_id:{type:`string`,description:`The unique ID of the tool profile to activate. Required for 'activate_profile' action.`}},required:[`action`]}},gu={name:`list_tool_profiles`,description:`List all available tool profiles that can be activated using manage_tools. Returns a list of profiles with their IDs, names, and the tools they contain.`,input_schema:{type:`object`,properties:{}}}})),_u,vu=k((()=>{_u={name:`update_memory`,description:`Update the MEMORY.md memory file for this group. Use this to persist important context, user preferences, project state, and anything the agent should remember across conversations. This file is loaded as system context on every invocation.`,input_schema:{type:`object`,properties:{content:{type:`string`,description:`New content for the MEMORY.md memory file`}},required:[`content`]}}})),yu,bu,xu=k((()=>{yu={name:`show_toast`,description:`Show a toast notification to the user. Toasts are non-blocking, auto-dismissing notifications that appear in the bottom-right corner. Use for: operation status (success/failure), warnings, informational messages, progress updates. Avoid for: critical errors requiring acknowledgment (use clear error messages instead), lengthy content (keep messages concise).`,input_schema:{type:`object`,properties:{message:{type:`string`,description:`The message to display in the toast (keep concise)`},type:{type:`string`,description:`Type of toast: 'success', 'error', 'warning', or 'info' (default: 'info')`,enum:[`success`,`error`,`warning`,`info`]},duration:{type:`number`,description:`Auto-dismiss duration in milliseconds (default: 5000 for info/success, 8000 for warning/error). Set to 0 to disable auto-dismiss.`}},required:[`message`]}},bu={name:`send_notification`,description:`Send an OS-level push notification to the user via Web Push. Unlike toasts (in-app only), push notifications appear even when the app is not focused or the tab is in the background. Use for: important alerts, long-running task completion, time-sensitive information. Requires the user to have enabled push notifications in Settings.`,input_schema:{type:`object`,properties:{title:{type:`string`,description:`Notification title (default: 'ShadowClaw')`},body:{type:`string`,description:`The notification body text`}},required:[`body`]}}})),Su,Cu,wu=k((()=>{Su=`https://a2ui.org/specification/v1_0/catalogs/basic/catalog.json`,Cu=`A2UI Basic Catalog — Component & Function Reference
|
|
141
|
+
`)}\n${s}`}return s}async function jl(e={}){let t=()=>{let e=null;if(typeof document<`u`){let t=document.getElementById(`shadow-claw-static-manifest`);if(t&&t.textContent)try{let n=JSON.parse(t.textContent);n&&Array.isArray(n.pages)&&(e={...n,pages:[...n.pages]})}catch(e){console.warn(`Failed to parse embedded static main manifest:`,e)}let n=document.querySelectorAll(`script[type="text/markdown"][data-shadow-claw-page]`);if(n.length>0){e||={pages:[]};for(let t of Array.from(n)){let n=t.getAttribute(`data-shadow-claw-page`)?.trim();if(n){let r=t.textContent||``;r=bl(r),!r.trim()&&/^memory\.(md|markdown)$/iu.test(n)&&(r=Go),!r.trim()&&(n===`index.html`||/^index\.(html?|xhtml)$/iu.test(n))&&(r=Al(n)??is);let i=e.pages.findIndex(e=>e.displayPath===n);i>=0?e.pages[i].content=r:e.pages.push({displayPath:n,content:r})}}}let r=document.getElementById(`shadow-claw-site-config`);if(r?.textContent)try{let t=JSON.parse(r.textContent);if(Array.isArray(t?.pages?.files)){e||={pages:[]};for(let n of t.pages.files)if(typeof n==`string`&&n.trim()){let t=n.trim(),r=``;/^memory\.(md|markdown)$/iu.test(t)?r=Go:(t===`index.html`||/^index\.(html?|xhtml)$/iu.test(t))&&(r=Al(t)??is),e.pages.some(e=>e.displayPath===t)||e.pages.push({displayPath:t,content:r})}}}catch{}let i=kl();if(i){e||={pages:[]};let t=i.getAttribute(`data-initial-path`)?.trim()||`index.html`;if(!e.pages.some(e=>e.displayPath===t)){let n=Al(t)??is;e.pages.push({displayPath:t,content:n})}e.pages.some(e=>/^memory\.(md|markdown)$/iu.test(e.displayPath))||e.pages.push({displayPath:`MEMORY.md`,content:Go})}}return e};if(e.preferEmbedded!==!1){let e=t();if(e&&e.pages.length>0)return e}if(e.fetchFallback!==!1){let e=await Dl();if(e&&e.pages.length>0)return e}if(e.preferEmbedded===!1){let e=t();if(e&&e.pages.length>0)return e}return{pages:[{displayPath:`index.html`,content:is},{displayPath:`MEMORY.md`,content:Go}]}}async function Ml(e,t,n=[]){for(let[r,i]of Object.entries(t))if(r===`purgePreRenderedStaticPages`&&i===!0){if(n.length>0){let t=n[0],r=n.slice(1).join(`/`);try{r?await $c(e,t,r):await Qc(e,t)}catch(e){console.warn(`Failed to purge pre-rendered static pages for ${t}/${r}:`,e)}}}else typeof i==`object`&&i&&await Ml(e,i,[...n,r])}function Nl(){if(typeof document<`u`)try{let e=document.getElementById(`shadow-claw-site-config`);if(e?.textContent){let t=JSON.parse(e.textContent);if(t?.pages?.sortOrder===`desc`)return`desc`;if(t?.pages?.sortOrder===`asc`)return`asc`}}catch{}return`desc`}function Pl(){if(typeof document<`u`)try{let e=document.getElementById(`shadow-claw-site-config`);if(e?.textContent){let t=JSON.parse(e.textContent)?.pages?.defaultPinnedPage;if(typeof t==`string`&&t.trim().length>0)return t.trim()}}catch{}return null}function Fl(){if(typeof document<`u`)try{let e=document.getElementById(`shadow-claw-site-config`);if(e?.textContent){let t=JSON.parse(e.textContent);return{allowList:sl(t?.pages?.allowList??t?.pages?.allowlist??t?.allowList??t?.allowlist??[]),denyList:sl(t?.pages?.denyList??t?.pages?.denylist??t?.denyList??t?.denylist??[])}}}catch{}return{allowList:[],denyList:[]}}function Il(e,t){let n=t??Nl();return[...e].sort((e,t)=>{let r=e.path,i=t.path,a=r.split(`/`).pop()||``,o=i.split(`/`).pop()||``,s=/^index\.(html?|xhtml)$/iu.test(a),c=/^index\.(html?|xhtml)$/iu.test(o);if(s&&!c)return-1;if(!s&&c)return 1;let l=/^memory\.(md|markdown)$/iu.test(a),u=/^memory\.(md|markdown)$/iu.test(o);return l&&!u?1:!l&&u?-1:n===`asc`?r.localeCompare(i,void 0,{numeric:!0,sensitivity:`base`}):i.localeCompare(r,void 0,{numeric:!0,sensitivity:`base`})})}async function Ll(e,t,n=zl,r=Bl){let i=t??Vl;try{if(Fee(n)===i)return!0}catch{}try{if(await R(e,r)===i){try{Zc(n,i)}catch{}return!0}await B(e,r,i);try{Zc(n,i)}catch{}}catch{try{Zc(n,i)}catch{}}return!1}async function Rl(e,t=dt,n=[],r={}){await ls(e,t);let i=await jl(r),a=!1;i.preRenderedStaticPages&&(await Ll(e,i.purgeId)||(a=!0,await Ml(e,i.preRenderedStaticPages)));let o=!1;if(t===`br:main`&&i.skillsPurgeId!==void 0&&!await Ll(e,i.skillsPurgeId,`sc:skills-purge-id`,`static_main_skills_purge_id`)){o=!0;try{await $c(e,t,`.agents/skills/main`)}catch(e){if(!(e&&typeof e==`object`&&`name`in e&&e.name===`NotFoundError`))throw e}try{await $c(e,t,`.agents/tools/main`)}catch(e){if(!(e&&typeof e==`object`&&`name`in e&&e.name===`NotFoundError`))throw e}}for(let n of i.pages)if(n.content?.includes(`slug: "shadow-claw--purge-pages"`)){!a&&!await Ll(e,i.purgeId)&&(a=!0,await Qc(e,t));break}let s=t===`br:main`&&await Qo(e),c=new Set(i.pages.map(e=>tl(t,e.displayPath))),l=a?n.filter(e=>e.groupId!==t||c.has(tl(e.groupId,e.path))):[...n],{allowList:u,denyList:d}=Fl(),f=0;for(let n of i.pages)if(f++,f%5==0&&await new Promise(e=>setTimeout(e,0)),!n.content?.includes(`slug: "shadow-claw--purge-pages"`)&&_l(n.displayPath,{allowList:u,denyList:d,groupId:t})){if(/^memory\.(md|markdown)$/iu.test(n.displayPath)){if(s)continue;let r=typeof n.content==`string`&&n.content.trim().length>0&&n.content!==Go?n.content:void 0;if(r===void 0?await es(e,t):await es(e,t,r)){let e=tl(t,n.displayPath);l.some(t=>tl(t.groupId,t.path)===e)||l.push({groupId:t,path:n.displayPath})}}else if(!await rl(e,t,n.displayPath))try{if(!await Yo(e,t,n.displayPath)){let r=n.content;(typeof r!=`string`||!r.trim())&&(r=n.displayPath===`index.html`?Al(`index.html`)??is:await Ol(n.displayPath)??``),await Ho(e,t,n.displayPath,r)}let r=tl(t,n.displayPath);l.some(e=>tl(e.groupId,e.path)===r)||l.push({groupId:t,path:n.displayPath})}catch(e){console.warn(`Failed to seed static page file ${n.displayPath}:`,e)}}if(t===`br:main`){for(let n of i.skills||[]){let r=`.agents/skills/main/${n.displayPath}`;try{await Yo(e,t,r)||await Ho(e,t,r,n.content)}catch(e){console.warn(`Failed to seed skill file ${r}:`,e)}}for(let n of i.tools||[]){let r=`.agents/tools/main/${n.displayPath}`;try{(o||!await Yo(e,t,r))&&await Ho(e,t,r,n.content)}catch(e){console.warn(`Failed to seed tool file ${r}:`,e)}}}let p=typeof document<`u`&&(document.getElementById(`shadow-claw-static-manifest`)!==null||document.querySelector(`script[type="text/markdown"][data-shadow-claw-page]`)!==null||kl()!==null);r.preferEmbedded!==!1&&p||await wl(e,t,!0);let m=l.filter(e=>_l(e.path,{allowList:u,denyList:d,groupId:e.groupId}));return Object.defineProperty(m,"didPurge",{value:a,enumerable:!1,writable:!0,configurable:!0}),Object.defineProperty(m,"didPurgeSkills",{value:o,enumerable:!1,writable:!0,configurable:!0}),Il(m)}var zl,Bl,Vl,Hl,Ul,Wl=k((()=>{Ot(),Iee(),as(),Ko(),Ye(),Gt(),Wo(),Lee(),el(),ds(),rs(),Xo(),ol(),Uo(),yl(),cl(),xl(),zl=`sc:purge-id`,Bl=`static_main_site_purge_id`,Vl=`__legacy_purge_pages__`,Hl=`static-main-manifest.json`,Ul=`static-main`})),Gl,Ree=k((()=>{hc(),Gl=class{_events;_handlers=[];_runs=/* @__PURE__ */ new Map;constructor(e){this._events=e}start(){this._listen(`streaming-start`,this._onStreamingStart),this._listen(`streaming-chunk`,this._onStreamingChunk),this._listen(`streaming-end`,this._onStreamingEnd),this._listen(`streaming-done`,this._onStreamingDone),this._listen(`streaming-error`,this._onStreamingError),this._listen(`tool-activity`,this._onToolActivity)}stop(){for(let{event:e,handler:t}of this._handlers)this._events.off(e,t);this._handlers=[],this._runs.clear()}_emit(e,t){window.dispatchEvent(new CustomEvent(`shadow-claw-agui-event`,{detail:{groupId:e,event:t}}))}_listen(e,t){this._events.on(e,t),this._handlers.push({event:e,handler:t})}_onStreamingChunk=({groupId:e,text:t})=>{let n=this._runs.get(e);n&&n.messageId&&this._emit(e,{type:`TEXT_MESSAGE_CONTENT`,messageId:n.messageId,delta:t,timestamp:Date.now()})};_onStreamingDone=({groupId:e})=>{let t=this._runs.get(e);t&&(t.messageId&&this._emit(e,{type:`TEXT_MESSAGE_END`,messageId:t.messageId,timestamp:Date.now()}),this._emit(e,{type:`RUN_FINISHED`,threadId:t.threadId,runId:t.runId,timestamp:Date.now()}),this._runs.delete(e))};_onStreamingEnd=({groupId:e})=>{let t=this._runs.get(e);t&&t.messageId&&(this._emit(e,{type:`TEXT_MESSAGE_END`,messageId:t.messageId,timestamp:Date.now()}),t.messageId=null)};_onStreamingError=({groupId:e,error:t})=>{let n=this._runs.get(e);n&&(n.messageId&&this._emit(e,{type:`TEXT_MESSAGE_END`,messageId:n.messageId,timestamp:Date.now()}),this._emit(e,{type:`RUN_ERROR`,message:t||`Unknown streaming error`,timestamp:Date.now()}),this._runs.delete(e))};_onStreamingStart=({groupId:e})=>{let t=cc(),n=e,r=cc();this._runs.set(e,{runId:t,threadId:n,messageId:r,activeToolCallIds:/* @__PURE__ */ new Set}),this._emit(e,{type:`RUN_STARTED`,threadId:n,runId:t,timestamp:Date.now()}),this._emit(e,{type:`TEXT_MESSAGE_START`,messageId:r,role:`assistant`,timestamp:Date.now()})};_onToolActivity=({groupId:e,tool:t,status:n})=>{let r=this._runs.get(e);if(r){if(n===`running`){let n=cc();r.activeToolCallIds.add(n),this._emit(e,{type:`TOOL_CALL_START`,toolCallId:n,toolCallName:t,timestamp:Date.now()}),r._lastToolCallId=n}else if(n===`done`||n===`error`){let t=r._lastToolCallId;t&&(r.activeToolCallIds.delete(t),this._emit(e,{type:`TOOL_CALL_END`,toolCallId:t,timestamp:Date.now()}))}}}}})),Kl,ql,Jl,zee=k((()=>{Xs(),Kl=5,ql=class{#e=new Ys.State(0);#t=/* @__PURE__ */ new Map;#n=new Ys.State([]);clear(){this.#t.forEach((e,t)=>this.clearTimer(t)),this.#t.clear(),this.#n.set([])}clearTimer(e){let t=this.#t.get(e);t?.timeoutId&&clearTimeout(t.timeoutId),this.#t.delete(e)}dismiss(e){this.clearTimer(e),this.#n.set(this.#n.get().filter(t=>t.id!==e))}pause(e){let t=this.#t.get(e);t&&t.timeoutId&&(clearTimeout(t.timeoutId),t.timeoutId=void 0,t.remaining=Math.max(0,t.remaining-(Date.now()-t.startedAt)),this.#t.set(e,t))}resolveAction(e){if(e&&typeof e.label==`string`&&typeof e.onClick==`function`)return e}resolveDuration(e){return typeof e!=`number`||Number.isNaN(e)||e<0?4e3:e}resolveType(e){return e&&[`success`,`warning`,`error`,`info`].includes(e)?e:`info`}resume(e){let t=this.#t.get(e);!t||t.timeoutId||t.remaining<=0||this.scheduleDismiss(e,t.remaining)}scheduleDismiss(e,t){this.clearTimer(e);let n=globalThis.setTimeout(()=>{this.dismiss(e)},t);this.#t.set(e,{timeoutId:n,remaining:t,startedAt:Date.now()})}show(e,t={}){let n=this.#e.get()+1;this.#e.set(n);let r={id:n,message:e,type:this.resolveType(t.type),duration:this.resolveDuration(t.duration),action:this.resolveAction(t.action),createdAt:Date.now()},i=[...this.#n.get(),r];if(i.length>Kl){let e=i[0];this.clearTimer(e.id),this.#n.set(i.slice(1))}else this.#n.set(i);return r.duration>0&&this.scheduleDismiss(r.id,r.duration),r.id}get toasts(){return this.#n.get()}async runAction(e){let t=this.#n.get().find(t=>t.id===e);t?.action&&await t.action.onClick()}},Jl=new ql}));function Yl(e,t={}){return Jl.show(e,t)}function Bee(e,t=4e3){return Jl.show(e,{type:`success`,duration:t})}function Xl(e,t=5e3){return Jl.show(e,{type:`error`,duration:t})}var Zl=k((()=>{zee()}));function Vee(e,t){if(!e||typeof e!=`object`)return e;let n=JSON.parse(JSON.stringify(e));for(let e of t)Hee(n,e);return n}function Hee(e,t){let{op:n,path:r,value:i}=t;if(!r||!r.startsWith(`/`))return;let a=r.split(`/`).slice(1).map(e=>e.replace(/~1/g,`/`).replace(/~0/g,`~`)),o=a.pop();if(o===void 0)return;let s=e;for(let e of a){if(typeof s!=`object`||!s)return;s=s[e]}typeof s==`object`&&s&&(Array.isArray(s)?Uee(s,o,n,i):Wee(s,o,n,i))}function Uee(e,t,n,r){if(n===`add`){if(t===`-`)e.push(r);else{let n=parseInt(t,10);!isNaN(n)&&n>=0&&n<=e.length&&e.splice(n,0,r)}}else if(n===`replace`){let n=parseInt(t,10);!isNaN(n)&&n>=0&&n<e.length&&(e[n]=r)}else if(n===`remove`){let n=parseInt(t,10);!isNaN(n)&&n>=0&&n<e.length&&e.splice(n,1)}}function Wee(e,t,n,r){n===`add`||n===`replace`?e[t]=r:n===`remove`&&delete e[t]}var Gee=k((()=>{}));function Kee(e){if(e==null)return null;let t=String(e).trim().toLowerCase();return[`1`,`true`,`yes`,`on`].includes(t)?!0:![`0`,`false`,`no`,`off`].includes(t)&&null}function Ql(e,t=!1){if(e==null)return t;if(typeof e==`boolean`)return e;if(typeof e==`number`)return e===1;if(typeof e==`string`){let t=e.trim().toLowerCase();return t===`true`||t===`1`}return!1}var $l=k((()=>{}));function eu(e){if(!e)return[];try{let t=JSON.parse(e);if(Array.isArray(t))return sl(t.map(e=>String(e)))}catch{}return sl(e.split(`,`))}var qee=k((()=>{cl()}));function tu(e){if(typeof document>`u`)return null;let t=`shadow-claw-site-config`;if(e){let n=e.getAttribute(`config`)?.trim();n&&(t=n.replace(/^#/,``))}let n=document.getElementById(t);if(!n?.textContent)return nu.delete(t),null;let r=nu.get(t);if(r&&r.rawText===n.textContent)return r.config;try{let e=JSON.parse(n.textContent);if(!e||typeof e!=`object`)return nu.delete(t),null;let r={...e};return nu.set(t,{rawText:n.textContent,config:r}),r}catch(e){return console.warn(`[ShadowClaw] Failed to parse site configuration from #${t}:`,e),null}}var nu,Jee=k((()=>{nu=/* @__PURE__ */ new Map})),ru,Yee=k((()=>{ru={name:`bash`,description:`Execute a shell command. When WebVM is available, runs in a full Alpine Linux VM (x86) with all standard Linux commands. When WebVM is disabled or unavailable, falls back to a lightweight JavaScript shell emulator with 83 commands: alias, awk, base64, basename, bash, cat, cd, chmod, clear, column, comm, command, cp, curl, cut, date, diff, dirname, du, echo, egrep, env, expand, export, expr, false, fgrep, file, find, fold, grep, gunzip, gzip, head, help, html-to-markdown, join, jq, ln, ls, md5sum, mkdir, mv, nl, od, paste, printenv, printf, pwd, readlink, realpath, rev, rg, rm, rmdir, sed, seq, sh, sha1sum, sha256sum, sha384sum, sha512sum, sleep, sort, split, stat, strings, tac, tail, tar, tee, test, timeout, touch, tr, tree, true, unalias, uniq, wc, which, xargs, yes, zcat. Commands NOT available in fallback mode: node, npm, npx, git, apk, python, wget.Supports pipes (|), redirects (> >>), operators (&& || ;), newlines, and # comments. Prefer read_file/write_file for file inspection and edits — they are faster and more reliable than shell commands for that purpose.`,input_schema:{type:`object`,properties:{command:{type:`string`,description:`The bash command to execute`},stdin:{type:`string`,description:`Optional standard input (stdin) to pass to the command`},timeout:{type:`number`,description:`Timeout in seconds (default from Settings, initially 120; max: 1800)`}},required:[`command`]}}})),iu,au,Xee=k((()=>{iu={name:`clear_chat`,description:`Clear the current chat history and start a new session. Useful for scheduled tasks to prevent context from growing indefinitely.`,input_schema:{type:`object`,properties:{}}},au={name:`ask_user`,description:`Pause execution to ask the user a question or request confirmation. This halts the agent's work until the user provides an answer. Use this for human-in-the-loop checkpoints before taking destructive actions or when you need clarification to proceed.`,input_schema:{type:`object`,properties:{question:{type:`string`,description:`The question or confirmation message to present to the user.`},options:{type:`array`,items:{type:`string`},description:`Optional list of predefined choices for the user to select from.`}},required:[`question`]}}})),ou,su,cu,Zee=k((()=>{ou={name:`manage_email`,description:`Manage email connection settings for IMAP/SMTP workflows. Supports status, connect/configure, enable/disable, delete, read_messages, send_message, mark_as_read, mark_as_unread, delete_messages, download_attachments, list available connection types, and lightweight test actions.`,input_schema:{type:`object`,properties:{action:{type:`string`,enum:[`status`,`list_plugins`,`list_connections`,`connect`,`configure`,`enable`,`disable`,`delete`,`test`,`read_messages`,`send_message`,`mark_as_read`,`mark_as_unread`,`delete_messages`,`download_attachments`],description:`Email management action to perform.`},plugin_id:{type:`string`,description:`Optional connection type ID for connect operations (default: imap).`},connection_id:{type:`string`,description:`Connection ID or label for configure, enable, disable, delete, and test actions. For read_messages/send_message, it may be omitted when there is exactly one enabled IMAP connection.`},label:{type:`string`,description:`Human-readable connection label for new connections.`},enabled:{type:`boolean`,description:`Optional enabled flag used during connect/configure actions.`},config:{type:`object`,properties:{},description:`Email config object (host, port, secure, mailboxPath, smtpHost, smtpPort, smtpSecure, etc.).`},mailbox_path:{type:`string`,description:`Optional mailbox path override for read_messages (default: INBOX).`},limit:{type:`number`,description:`Optional max messages to fetch for read_messages (default 10, range 1-50).`},unread_only:{type:`boolean`,description:`If true, read_messages returns only unread messages.`},message_uids:{type:`array`,items:{type:`number`},description:`Message UIDs for mark_as_read, mark_as_unread, and delete_messages actions.`},message_uid:{type:`number`,description:`Single message UID used by download_attachments action.`},attachment_parts:{type:`array`,items:{type:`string`},description:`Optional IMAP MIME part IDs to download (for example: 2, 3.1). If omitted, all attachments in the message are downloaded.`},save_directory:{type:`string`,description:`Optional workspace directory for downloaded attachments (default: downloads/email).`},attachments:{type:`array`,items:{anyOf:[{type:`string`},{type:`object`,properties:{path:{type:`string`},filename:{type:`string`},content_type:{type:`string`}},required:[`path`]}]},description:`Optional workspace file attachments for send_message. Provide paths or objects with path/filename/content_type.`},to:{type:`array`,items:{type:`string`},description:`Recipient email addresses for send_message.`},cc:{type:`array`,items:{type:`string`},description:`Optional CC recipient addresses for send_message.`},bcc:{type:`array`,items:{type:`string`},description:`Optional BCC recipient addresses for send_message.`},subject:{type:`string`,description:`Message subject for send_message.`},body:{type:`string`,description:`Plaintext message body for send_message.`},html:{type:`string`,description:`Optional HTML body for send_message.`},from:{type:`string`,description:`Optional from address override for send_message.`},reply_to:{type:`string`,description:`Optional reply-to address for send_message.`},username:{type:`string`,description:`Optional username override for connect/configure/read_messages/send_message.`},password:{type:`string`,description:`Optional password override for connect/configure/read_messages/send_message.`}},required:[`action`]}},su={name:`email_read_messages`,description:`Read recent messages from a configured email connection (IMAP). Use this to check inbox mail from an agent workflow. Results include attachment metadata when available.`,input_schema:{type:`object`,properties:{connection_id:{type:`string`,description:`Email connection ID or label.`},mailbox_path:{type:`string`,description:`Optional mailbox path override (default: INBOX).`},limit:{type:`number`,description:`Optional max messages to fetch (default 10, range 1-50).`},unread_only:{type:`boolean`,description:`If true, only unread messages are returned.`}},required:[`connection_id`]}},cu={name:`email_send_message`,description:`Send an email message through a configured email connection (SMTP).`,input_schema:{type:`object`,properties:{connection_id:{type:`string`,description:`Email connection ID or label.`},to:{type:`array`,items:{type:`string`},description:`Recipient email addresses.`},cc:{type:`array`,items:{type:`string`},description:`Optional CC recipient addresses.`},bcc:{type:`array`,items:{type:`string`},description:`Optional BCC recipient addresses.`},subject:{type:`string`,description:`Message subject.`},body:{type:`string`,description:`Plaintext message body.`},html:{type:`string`,description:`Optional HTML message body.`},from:{type:`string`,description:`Optional from address override.`},reply_to:{type:`string`,description:`Optional reply-to address.`}},required:[`connection_id`,`to`,`subject`]}}})),lu,uu,du,Qee=k((()=>{lu={name:`fetch_url`,description:`Fetch a URL via HTTP and return the response body. Subject to browser CORS restrictions — works with most public APIs. Response is truncated to 100KB. Set use_git_auth to true to automatically inject the saved Git PAT as an Authorization header (supports GitHub, Azure DevOps, GitLab, and other providers — auth format is auto-detected from the URL's host). If include_headers is true, the response will include both request and response headers.`,input_schema:{type:`object`,properties:{url:{type:`string`,description:`The URL to fetch`},method:{type:`string`,description:`HTTP method (default: GET)`},headers:{type:`object`,properties:{},description:`Request headers as key-value pairs`},body:{type:`string`,description:`Request body (for POST/PUT/PATCH)`},use_git_auth:{type:`boolean`,description:`If true, inject the saved Git credentials as an Authorization header. Auth format is auto-detected from the URL host: GitHub (token), Azure DevOps (Basic), GitLab (Bearer), or generic Bearer.`},git_account_id:{type:`string`,description:`Optional explicit Git account ID to use when use_git_auth is true. If omitted, account resolution uses hostPattern/default matching.`},use_account_auth:{type:`boolean`,description:`If true, inject a saved service account PAT as a Bearer Authorization header. The account is matched by hostPattern against the URL (longest match wins), then falls back to the default service account. Use this for non-Git services like Figma, Notion, or any other service whose PAT is stored under Settings → Accounts.`},account_id:{type:`string`,description:`Optional explicit service account ID to use when use_account_auth is true. If omitted, account resolution uses hostPattern/default matching.`},auth_mode:{type:`string`,enum:[`pat`,`oauth`],description:`Optional preferred credential mode when multiple accounts match. Valid values: pat or oauth.`},include_headers:{type:`boolean`,description:`If true, include request and response headers in the output.`}},required:[`url`]}},uu={name:`fetch_file`,description:`Fetch a URL and save the response body directly to the workspace in one step. Equivalent to fetch_url + write_file but atomic. Text responses are saved as UTF-8; binary responses (images, PDFs, audio, video, zip, application/octet-stream) are saved as raw bytes. The destination path within the workspace is required. Supports the same authentication options as fetch_url (use_git_auth, use_account_auth, etc.). Returns the workspace path the file was saved to and the number of bytes written.`,input_schema:{type:`object`,properties:{url:{type:`string`,description:`The URL to fetch`},path:{type:`string`,description:`Destination path within the workspace (e.g. 'data/response.json'). Parent directories are created automatically. Must not contain '..' segments.`},method:{type:`string`,description:`HTTP method (default: GET)`},headers:{type:`object`,properties:{},description:`Request headers as key-value pairs`},body:{type:`string`,description:`Request body (for POST/PUT/PATCH)`},use_git_auth:{type:`boolean`,description:`If true, inject the saved Git credentials as an Authorization header. Auth format is auto-detected from the URL host: GitHub (token), Azure DevOps (Basic), GitLab (Bearer), or generic Bearer.`},git_account_id:{type:`string`,description:`Optional explicit Git account ID to use when use_git_auth is true. If omitted, account resolution uses hostPattern/default matching.`},use_account_auth:{type:`boolean`,description:`If true, inject a saved service account PAT as a Bearer Authorization header. The account is matched by hostPattern against the URL (longest match wins), then falls back to the default service account.`},account_id:{type:`string`,description:`Optional explicit service account ID to use when use_account_auth is true. If omitted, account resolution uses hostPattern/default matching.`},auth_mode:{type:`string`,enum:[`pat`,`oauth`],description:`Optional preferred credential mode when multiple accounts match. Valid values: pat or oauth.`}},required:[`url`,`path`]}},du={name:`web_search`,description:`Perform a web search using a search engine to discover information. Returns a plain-text summary of the top search results including titles, URLs, and snippets. Use this when you need to find information but don't know the exact URL to fetch.`,input_schema:{type:`object`,properties:{query:{type:`string`,description:`The search query to look up.`}},required:[`query`]}}})),fu,$ee=k((()=>{fu={name:`javascript`,description:`Execute JavaScript code in a sandboxed Worker and return the result. Lighter than bash — no VM boot required. Use for calculations, data transformations, JSON processing, string analysis, etc. Runs in strict mode. No access to DOM, eval(), Function(), self, postMessage, importScripts, navigator, or indexedDB — these are all undefined. fetch availability is controlled by Tool Configuration -> Internet Access (shared with bash). setTimeout is available but setInterval is blocked. IMPORTANT: You CANNOT call other agent tools (like read_file, write_file, or bash) from inside this sandbox. If you need to process file contents or tool outputs, you must fetch them in a previous turn and pass the data into this tool via the $PIPE_DATA variable. Write plain JavaScript expressions and statements — the return value of the last expression is captured as the result.`,input_schema:{type:`object`,properties:{code:{type:`string`,description:`JavaScript code to execute. The return value of the last expression is captured.`},data:{type:`string`,description:"Optional input data string. Accessible inside the code sandbox via the global constant `$PIPE_DATA`."}},required:[`code`]}}})),pu,mu,ete=k((()=>{pu={name:`remote_mcp_list_tools`,description:`List available tools from a configured Remote MCP connection by connection ID or label.`,input_schema:{type:`object`,properties:{connection_id:{type:`string`,description:`Remote MCP connection ID or label`}},required:[`connection_id`]}},mu={name:`remote_mcp_call_tool`,description:`Call a tool exposed by a configured Remote MCP connection.`,input_schema:{type:`object`,properties:{connection_id:{type:`string`,description:`Remote MCP connection ID or label`},tool_name:{type:`string`,description:`Remote MCP tool name`},arguments:{type:`object`,properties:{},description:`Arguments object passed to the remote MCP tool`}},required:[`connection_id`,`tool_name`]}}})),hu,gu,tte=k((()=>{hu={name:`manage_tools`,description:`Enable or disable specific tools, or activate a predefined tool profile. Use list_tool_profiles to see available profiles before activating one. This helps optimize the context window and focus capabilities. Changes take effect on the NEXT turn, not immediately within the current tool-use loop.`,input_schema:{type:`object`,properties:{action:{type:`string`,enum:[`enable`,`disable`,`activate_profile`],description:`The management action to perform.`},tool_names:{type:`array`,items:{type:`string`},description:`List of tool names to enable or disable. Required for 'enable' and 'disable' actions.`},profile_id:{type:`string`,description:`The unique ID of the tool profile to activate. Required for 'activate_profile' action.`}},required:[`action`]}},gu={name:`list_tool_profiles`,description:`List all available tool profiles that can be activated using manage_tools. Returns a list of profiles with their IDs, names, and the tools they contain.`,input_schema:{type:`object`,properties:{}}}})),_u,vu=k((()=>{_u={name:`update_memory`,description:`Update the MEMORY.md memory file for this group. Use this to persist important context, user preferences, project state, and anything the agent should remember across conversations. This file is loaded as system context on every invocation.`,input_schema:{type:`object`,properties:{content:{type:`string`,description:`New content for the MEMORY.md memory file`}},required:[`content`]}}})),yu,bu,xu=k((()=>{yu={name:`show_toast`,description:`Show a toast notification to the user. Toasts are non-blocking, auto-dismissing notifications that appear in the bottom-right corner. Use for: operation status (success/failure), warnings, informational messages, progress updates. Avoid for: critical errors requiring acknowledgment (use clear error messages instead), lengthy content (keep messages concise).`,input_schema:{type:`object`,properties:{message:{type:`string`,description:`The message to display in the toast (keep concise)`},type:{type:`string`,description:`Type of toast: 'success', 'error', 'warning', or 'info' (default: 'info')`,enum:[`success`,`error`,`warning`,`info`]},duration:{type:`number`,description:`Auto-dismiss duration in milliseconds (default: 5000 for info/success, 8000 for warning/error). Set to 0 to disable auto-dismiss.`}},required:[`message`]}},bu={name:`send_notification`,description:`Send an OS-level push notification to the user via Web Push. Unlike toasts (in-app only), push notifications appear even when the app is not focused or the tab is in the background. Use for: important alerts, long-running task completion, time-sensitive information. Requires the user to have enabled push notifications in Settings.`,input_schema:{type:`object`,properties:{title:{type:`string`,description:`Notification title (default: 'ShadowClaw')`},body:{type:`string`,description:`The notification body text`}},required:[`body`]}}})),Su,Cu,wu=k((()=>{Su=`https://a2ui.org/specification/v1_0/catalogs/basic/catalog.json`,Cu=`A2UI Basic Catalog — Component & Function Reference
|
|
142
142
|
=====================================================
|
|
143
143
|
|
|
144
144
|
Catalog ID: ${Su}
|