shadow-claw 1.59.6 → 1.60.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.well-known/mcp/server-card.json +1 -1
- package/.well-known/mcp.json +1 -1
- package/README.md +6 -2
- package/dist/cli/build/build.js +1 -1
- package/dist/cli/chunk-3C5izdQW.js +1 -0
- package/dist/cli/chunk-B-75h9gX.js +1 -0
- package/dist/cli/{chunk-C9o6lXP3.js → chunk-B7Kn-otm.js} +1 -1
- package/dist/cli/{chunk-YX32FcN7.js → chunk-BBczgswQ.js} +1 -1
- package/dist/cli/{chunk-DcNxjqH6.js → chunk-BE-lYWcn.js} +1 -1
- package/dist/cli/{chunk-DJqHK-qS.js → chunk-BECr0WxI.js} +11 -11
- package/dist/cli/chunk-BEz1PD1_.js +1 -0
- package/dist/cli/chunk-BLzI1Fp2.js +1 -0
- package/dist/cli/{chunk-yiVdvGCJ.js → chunk-BVSC1MNQ.js} +11 -11
- package/dist/cli/{chunk-CX2itile.js → chunk-BdWcep6o.js} +1 -1
- package/dist/cli/{chunk-DLde6nuO.js → chunk-BfTpnSS4.js} +1 -1
- package/dist/cli/{chunk-D2_eAO83.js → chunk-BgvqTf7w.js} +1 -1
- package/dist/cli/chunk-BwsJfUT3.js +1 -0
- package/dist/cli/{chunk--PFY91kE.js → chunk-C9b4b7c_.js} +1 -1
- package/dist/cli/{chunk-D3y7h9Xe.js → chunk-CAw9XYFe.js} +1 -1
- package/dist/cli/chunk-CFCcbFs2.js +396 -0
- package/dist/cli/{chunk-Cnjb8Usu.js → chunk-CTarF4FC.js} +1 -1
- package/dist/cli/{chunk-DM4xsTry.js → chunk-Cbq5hpjb.js} +4 -4
- package/dist/cli/chunk-CjTjKy_v.js +310 -0
- package/dist/cli/chunk-Cjyu4cr_.js +36 -0
- package/dist/cli/{chunk-DUGZPka_.js → chunk-ClMKygjZ.js} +1 -1
- package/dist/cli/chunk-Cppnq1KF.js +1 -0
- package/dist/cli/{chunk-DvemF16v.js → chunk-D9QCNFMO.js} +1 -1
- package/dist/cli/chunk-DB21BMqt.js +7 -0
- package/dist/cli/{chunk-_Vo-o_e3.js → chunk-DHoIWvCc.js} +1 -1
- package/dist/cli/chunk-DZEN9T5y.js +1 -0
- package/dist/cli/{chunk-5rLO4DWS.js → chunk-Dl14OyYO.js} +9 -9
- package/dist/cli/chunk-Dl_vv0dI.js +1 -0
- package/dist/cli/chunk-Dpmfhlyl.js +1 -0
- package/dist/cli/{chunk-BrR1DOBS.js → chunk-Du7Xtucq.js} +1 -1
- package/dist/cli/{chunk-Bc_weULz.js → chunk-DxcDFUi_.js} +1 -1
- package/dist/cli/{chunk-Dt7-hzJU.js → chunk-DyyEWbV7.js} +1 -1
- package/dist/cli/chunk-N0x3mXU0.js +1 -0
- package/dist/cli/{chunk-CGoE4llV.js → chunk-V-w0Bata.js} +1 -1
- package/dist/cli/{chunk-C8DBACtx.js → chunk-ZxDxSSn-.js} +1 -1
- package/dist/cli/chunk-lPvFUkd5.js +7 -0
- package/dist/cli/{chunk-Ctg5L55n.js → chunk-n5s-sCdU.js} +1 -1
- package/dist/cli/{chunk-Dw8GndPD.js → chunk-nD9VPVMq.js} +1 -1
- package/dist/cli/{chunk-Cq_kQohv.js → chunk-rFuy8aS_.js} +1 -1
- package/dist/cli/{chunk-Bq38OubR.js → chunk-wjM6JXWa.js} +1 -1
- package/dist/cli/{chunk-3wTukVof.js → chunk-zcES9rut.js} +1 -1
- package/dist/cli/cli.js +3 -3
- package/dist/headless-agent.js +2 -2
- 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-DB77spML.js} +3 -3
- package/dist/lib/{channel-Dlru5ofR.js.map → channel-DB77spML.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-Q9t9aL1e.js} +19 -19
- package/dist/lib/{compact-context-BtR55YPU.js.map → compact-context-Q9t9aL1e.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-CgFiwoxY.js} +3 -3
- package/dist/lib/{configure-peer-js-ChDhOZU4.js.map → configure-peer-js-CgFiwoxY.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/content/build-attachment-content-blocks.d.ts +2 -0
- 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-CXyaWHKi.js} +13 -13
- package/dist/lib/{discover-skills-CD0sKvAI.js.map → discover-skills-CXyaWHKi.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-CogDRlEz.js} +5 -5
- package/dist/lib/{git-B3Q1euc5.js.map → git-CogDRlEz.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-CEGdzgWX.js} +15 -15
- package/dist/lib/{init-control-plane-C1FRRmjC.js.map → init-control-plane-CEGdzgWX.js.map} +1 -1
- package/dist/lib/{invoke-agent-CzN7sVh-.js → invoke-agent-cac3gCsj.js} +11 -11
- package/dist/lib/{invoke-agent-CzN7sVh-.js.map → invoke-agent-cac3gCsj.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-D8dptMg0.js} +5 -5
- package/dist/lib/{move-group-entry-NMTJ59M9.js.map → move-group-entry-D8dptMg0.js.map} +1 -1
- package/dist/lib/{orchestrator-B8FV1V7x.js → orchestrator-BBAwy9Nm.js} +24 -24
- package/dist/lib/{orchestrator-B8FV1V7x.js.map → orchestrator-BBAwy9Nm.js.map} +1 -1
- package/dist/lib/{orchestrator-i_QJ-o22.js → orchestrator-cRBe3lhq.js} +11 -11
- package/dist/lib/orchestrator-cRBe3lhq.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-BLg8aGUj.js} +8 -8
- package/dist/lib/{peerjs-z5zeioPV.js.map → peerjs-BLg8aGUj.js.map} +1 -1
- package/dist/lib/{process-peer-query-param-CJp7w7AU.js → process-peer-query-param-BnsVnxzH.js} +5 -5
- package/dist/lib/{process-peer-query-param-CJp7w7AU.js.map → process-peer-query-param-BnsVnxzH.js.map} +1 -1
- package/dist/lib/{process-pending-shared-payloads-B6_TlBFA.js → process-pending-shared-payloads-DBZfZOOa.js} +4 -4
- package/dist/lib/{process-pending-shared-payloads-B6_TlBFA.js.map → process-pending-shared-payloads-DBZfZOOa.js.map} +1 -1
- package/dist/lib/{process-room-query-param-C3FFGGn6.js → process-room-query-param-B8EYg_-r.js} +4 -4
- package/dist/lib/{process-room-query-param-C3FFGGn6.js.map → process-room-query-param-B8EYg_-r.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-CAm6UMvE.js} +5 -5
- package/dist/lib/{push-client-Cx5rMs6J.js.map → push-client-CAm6UMvE.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-Dzphx3rK.js} +2 -2
- package/dist/lib/{rooms-CwlkYLDU.js.map → rooms-Dzphx3rK.js.map} +1 -1
- package/dist/lib/{shadow-claw-DoQ7fgl5.js → shadow-claw-CGl8tXtG.js} +17 -20
- package/dist/lib/shadow-claw-CGl8tXtG.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-BNIWCdsL.js} +4 -4
- package/dist/lib/{shadow-claw-channel-config-IKiL34tI.js.map → shadow-claw-channel-config-BNIWCdsL.js.map} +1 -1
- package/dist/lib/{shadow-claw-channels-JgEzuHWK.js → shadow-claw-channels-C2QSn4Ew.js} +3 -3
- package/dist/lib/{shadow-claw-channels-JgEzuHWK.js.map → shadow-claw-channels-C2QSn4Ew.js.map} +1 -1
- package/dist/lib/{shadow-claw-chat-SGUDT31r.js → shadow-claw-chat-Wx3y9y6c.js} +15 -15
- package/dist/lib/{shadow-claw-chat-SGUDT31r.js.map → shadow-claw-chat-Wx3y9y6c.js.map} +1 -1
- package/dist/lib/{shadow-claw-control-plane-CRWFZ3vD.js → shadow-claw-control-plane-D5E4cFGu.js} +7 -7
- package/dist/lib/{shadow-claw-control-plane-CRWFZ3vD.js.map → shadow-claw-control-plane-D5E4cFGu.js.map} +1 -1
- package/dist/lib/{shadow-claw-conversations-D23GJ7qo.js → shadow-claw-conversations-BtDv7GRW.js} +7 -7
- package/dist/lib/{shadow-claw-conversations-D23GJ7qo.js.map → shadow-claw-conversations-BtDv7GRW.js.map} +1 -1
- package/dist/lib/{shadow-claw-file-viewer-C1V8WTiU.js → shadow-claw-file-viewer-CG40kwWV.js} +10 -10
- package/dist/lib/{shadow-claw-file-viewer-C1V8WTiU.js.map → shadow-claw-file-viewer-CG40kwWV.js.map} +1 -1
- package/dist/lib/{shadow-claw-files-DN7irmE1.js → shadow-claw-files-BOUULrlX.js} +11 -11
- package/dist/lib/{shadow-claw-files-DN7irmE1.js.map → shadow-claw-files-BOUULrlX.js.map} +1 -1
- package/dist/lib/{shadow-claw-git-D-1oIh65.js → shadow-claw-git-BeHV73_9.js} +6 -6
- package/dist/lib/{shadow-claw-git-D-1oIh65.js.map → shadow-claw-git-BeHV73_9.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-KONyWKZM.js} +9 -9
- package/dist/lib/{shadow-claw-llm-4Gefh5FN.js.map → shadow-claw-llm-KONyWKZM.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-Diy3JJkc.js} +2 -2
- package/dist/lib/{shadow-claw-networking-BN5BB4hb.js.map → shadow-claw-networking-Diy3JJkc.js.map} +1 -1
- package/dist/lib/{shadow-claw-notifications-71KARtkY.js → shadow-claw-notifications-C-upPa-4.js} +3 -3
- package/dist/lib/{shadow-claw-notifications-71KARtkY.js.map → shadow-claw-notifications-C-upPa-4.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-CfAjUKgd.js} +11 -11
- package/dist/lib/{shadow-claw-pages-BiRM6qiA.js.map → shadow-claw-pages-CfAjUKgd.js.map} +1 -1
- package/dist/lib/{shadow-claw-peerjs-BZu7jNSe.js → shadow-claw-peerjs-t4YibS9s.js} +6 -6
- package/dist/lib/{shadow-claw-peerjs-BZu7jNSe.js.map → shadow-claw-peerjs-t4YibS9s.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-Cg5V0e9g.js} +7 -7
- package/dist/lib/{shadow-claw-settings-CcT5EK08.js.map → shadow-claw-settings-Cg5V0e9g.js.map} +1 -1
- package/dist/lib/{shadow-claw-storage-eTOpbvpi.js → shadow-claw-storage-C7tCnsSG.js} +5 -5
- package/dist/lib/{shadow-claw-storage-eTOpbvpi.js.map → shadow-claw-storage-C7tCnsSG.js.map} +1 -1
- package/dist/lib/{shadow-claw-task-server-DFImTUbw.js → shadow-claw-task-server-BObsRdf8.js} +2 -2
- package/dist/lib/{shadow-claw-task-server-DFImTUbw.js.map → shadow-claw-task-server-BObsRdf8.js.map} +1 -1
- package/dist/lib/{shadow-claw-tasks-BjaxsmUx.js → shadow-claw-tasks-B2EEqrcY.js} +9 -9
- package/dist/lib/{shadow-claw-tasks-BjaxsmUx.js.map → shadow-claw-tasks-B2EEqrcY.js.map} +1 -1
- package/dist/lib/{shadow-claw-terminal-C-4wreFe.js → shadow-claw-terminal-DSHfO2b9.js} +2 -2
- package/dist/lib/{shadow-claw-terminal-C-4wreFe.js.map → shadow-claw-terminal-DSHfO2b9.js.map} +1 -1
- package/dist/lib/{shadow-claw-tools-COdrGZJk.js → shadow-claw-tools-DwPBADua.js} +7 -7
- package/dist/lib/{shadow-claw-tools-COdrGZJk.js.map → shadow-claw-tools-DwPBADua.js.map} +1 -1
- package/dist/lib/{shadow-claw-webvm-sxqVjO0L.js → shadow-claw-webvm-CY4qGaMB.js} +3 -3
- package/dist/lib/{shadow-claw-webvm-sxqVjO0L.js.map → shadow-claw-webvm-CY4qGaMB.js.map} +1 -1
- package/dist/lib/{sync-web-mcp-registration-D4hdUwtv.js → sync-web-mcp-registration-BiOZvW-R.js} +6 -6
- package/dist/lib/{sync-web-mcp-registration-D4hdUwtv.js.map → sync-web-mcp-registration-BiOZvW-R.js.map} +1 -1
- package/dist/lib/{system-prompt-DT_KeYaL.js → system-prompt-CxJ3Nx4c.js} +9 -8
- package/dist/lib/system-prompt-CxJ3Nx4c.js.map +1 -0
- 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 +1 -1
- package/dist/public/.well-known/mcp.json +1 -1
- package/dist/public/AGENTS.md +3 -1
- package/dist/public/README.md +6 -2
- package/dist/public/agent.worker.js +1 -1
- package/dist/public/attachment-capabilities-AdwXt3--.js +1 -0
- package/dist/public/{channel-BylT3rJC.js → channel-DIpDQekL.js} +1 -1
- package/dist/public/{chat-template-DPHJy7tr.js → chat-template-CXKs8lFR.js} +1 -1
- package/dist/public/compact-context-BQ2ZXoAc.js +5 -0
- package/dist/public/{compact-context-BINQh64w.js → compact-context-dHitmPsV.js} +2 -2
- package/dist/public/config-C16fFWtP.js +1 -0
- package/dist/public/{configure-peer-js-DChhcOfe.js → configure-peer-js-DV1rqvFX.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-B0mSCEk6.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-BWJB8HUA.js} +6 -6
- package/dist/public/docs/architecture/overview.md +1 -1
- package/dist/public/docs/example/article/index.html +29 -30
- package/dist/public/docs/example/article.html +29 -30
- package/dist/public/docs/publishing/index.html +29 -30
- package/dist/public/docs/publishing.html +29 -30
- package/dist/public/docs/skill-creator/index.html +29 -30
- package/dist/public/docs/skill-creator.html +29 -30
- package/dist/public/docs/subsystems/attachment-capabilities.md +14 -1
- package/dist/public/docs/subsystems/cli.md +95 -51
- package/dist/public/docs/subsystems/pages.md +5 -0
- package/dist/public/{download-group-file-BapoRgfU.js → download-group-file-BkMH-JKi.js} +1 -1
- package/dist/public/e2e/README.md +1 -1
- package/dist/public/{e2e-bridge-C0g8vZKr.js → e2e-bridge-lP2qqiv3.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-DjmQ16rm.js} +2 -2
- package/dist/public/{iframe-bridge-scripts-BnqtKhE4.js → iframe-bridge-scripts-CO0izGjW.js} +1 -1
- package/dist/public/index.html +29 -30
- 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-Ctz7FI8M.js +1 -0
- package/dist/public/{invoke-agent-B3Osw6K7.js → invoke-agent-C_geruwq.js} +1 -1
- package/dist/public/llms.txt +1 -1
- package/dist/public/main/index.html +29 -30
- package/dist/public/main/memory/index.html +29 -30
- package/dist/public/main/memory.html +29 -30
- package/dist/public/main.html +29 -30
- 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-QQ9Hkk54.js} +1 -1
- package/dist/public/{orchestrator-BrDjQbGf.js → orchestrator-C1kaTltu.js} +2 -2
- package/dist/public/orchestrator-Li1UAsv7.js +63 -0
- package/dist/public/{peerjs-CgF4Iz5W.js → peerjs-DbBryE-9.js} +1 -1
- package/dist/public/{process-peer-query-param-BL2k0Hu-.js → process-peer-query-param-DQIgr3KL.js} +1 -1
- package/dist/public/{process-pending-shared-payloads-C1AgGvn8.js → process-pending-shared-payloads-Ctb-TFqB.js} +1 -1
- package/dist/public/{process-room-query-param-DM0QCq3_.js → process-room-query-param-F-XnIVoZ.js} +1 -1
- package/dist/public/provider-YPZmsuHR.js +1 -0
- package/dist/public/{push-client-DJEOz7bi.js → push-client-DRx9Eggz.js} +1 -1
- package/dist/public/{rooms-C6LXIJl4.js → rooms-BurBI7is.js} +1 -1
- package/dist/public/service-worker/init.js +1 -1
- package/dist/public/service-worker.js +1 -1
- package/dist/public/shadow-claw-Bg9AQ5x_.js +1176 -0
- package/dist/public/{shadow-claw-accounts--4hd_oCz.js → shadow-claw-accounts-B3mjYI0M.js} +1 -1
- package/dist/public/{shadow-claw-card-IbNlZAdK.js → shadow-claw-card-tcXRS1GF.js} +1 -1
- package/dist/public/{shadow-claw-channels-Vq_pPGa2.js → shadow-claw-channels-BiSfLvWv.js} +1 -1
- package/dist/public/{shadow-claw-chat-D7_GS25e.js → shadow-claw-chat-N5jMsXZZ.js} +3 -3
- package/dist/public/{shadow-claw-control-plane-WTMEV8_p.js → shadow-claw-control-plane-DFVe_Xdq.js} +2 -2
- package/dist/public/{shadow-claw-conversations-CLQgU1IT.js → shadow-claw-conversations-wAR06_ya.js} +1 -1
- package/dist/public/{shadow-claw-empty-state-D4CrFGsN.js → shadow-claw-empty-state-CnPm3NVM.js} +1 -1
- package/dist/public/{shadow-claw-file-viewer-BhqiqLWQ.js → shadow-claw-file-viewer-sZN_FCDW.js} +4 -4
- package/dist/public/{shadow-claw-files-senDiG9l.js → shadow-claw-files-CnvkCbd4.js} +2 -2
- package/dist/public/{shadow-claw-git-DOOCqY23.js → shadow-claw-git-BBHfClGk.js} +2 -2
- package/dist/public/{shadow-claw-integrations-Bsvc3Agq.js → shadow-claw-integrations-DvdBqzRJ.js} +1 -1
- package/dist/public/{shadow-claw-llm-actYICAk.js → shadow-claw-llm-YfohG519.js} +2 -2
- package/dist/public/{shadow-claw-mcp-remote-BYUgrK3v.js → shadow-claw-mcp-remote-BAVbf5pi.js} +1 -1
- package/dist/public/{shadow-claw-networking-Dk3p5Ny_.js → shadow-claw-networking-CZ4LWPW7.js} +1 -1
- package/dist/public/{shadow-claw-notifications-CzPAlay8.js → shadow-claw-notifications-BHwyREkG.js} +1 -1
- package/dist/public/{shadow-claw-page-header-CjJpVkyL.js → shadow-claw-page-header-De6Qf6eY.js} +1 -1
- package/dist/public/{shadow-claw-page-header-action-button-2DH5O1TD.js → shadow-claw-page-header-action-button-FSOhTc9z.js} +1 -1
- package/dist/public/{shadow-claw-pages-3r5I-wI8.js → shadow-claw-pages-D_oPyDca.js} +6 -6
- package/dist/public/{shadow-claw-pdf-viewer-BiCEwsoY.js → shadow-claw-pdf-viewer-CrU4wqRq.js} +1 -1
- package/dist/public/{shadow-claw-settings-DgB9RSZN.js → shadow-claw-settings-DkUhvxVr.js} +2 -2
- package/dist/public/{shadow-claw-storage-JB_43nd8.js → shadow-claw-storage-D0o56Tjw.js} +1 -1
- package/dist/public/{shadow-claw-task-server-oi5UIxdA.js → shadow-claw-task-server-4rkroO9K.js} +1 -1
- package/dist/public/{shadow-claw-tasks-CnyiOt81.js → shadow-claw-tasks-BdP7lmvu.js} +3 -3
- package/dist/public/{shadow-claw-terminal-BC3RynHt.js → shadow-claw-terminal-DVHX7Fsu.js} +1 -1
- package/dist/public/{shadow-claw-toast-YjG--2Za.js → shadow-claw-toast-B9Y9tSkW.js} +1 -1
- package/dist/public/{shadow-claw-tools-Bbwk4vlT.js → shadow-claw-tools-BwwY53Lr.js} +1 -1
- package/dist/public/{shadow-claw-webvm-HZqzl2H5.js → shadow-claw-webvm-CXGdkCNM.js} +1 -1
- package/dist/public/{sync-web-mcp-registration-BaH2nAP0.js → sync-web-mcp-registration-DVK_IhXZ.js} +1 -1
- package/dist/public/{system-prompt-Dck3N8T0.js → system-prompt-BmswoQwF.js} +2 -2
- 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/{workbox-92eae37e.js → workbox-e4022e15.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-JHoTbATw.js} +1 -1
- package/dist/server.js +6 -6
- package/package.json +1 -1
- package/dist/cli/chunk-2gZFafgY.js +0 -1
- package/dist/cli/chunk-BFziiMKt.js +0 -7
- package/dist/cli/chunk-BM3llsxb.js +0 -1
- package/dist/cli/chunk-BUNoeMKY.js +0 -36
- 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-Ds5-K-9o.js +0 -1
- package/dist/cli/chunk-DsQhAF31.js +0 -1
- package/dist/cli/chunk-VM-dECyG.js +0 -1
- package/dist/cli/chunk-gvNsvav0.js +0 -225
- 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/lib/system-prompt-DT_KeYaL.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/compact-context-CX4H8V57.js +0 -5
- 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
|
@@ -1 +1 @@
|
|
|
1
|
-
import{N as e,b as t,h as n,r}from"./config-C-YdSFZB.js";import{t as i}from"./get-config-Bkvl__ZS.js";import{t as a}from"./set-config-DSiuMe0k.js";import{t as o}from"./ulid-BSJxYh6W.js";import{i as s,r as c,t as l}from"./credentials-CgVqS119.js";import{n as u,r as d}from"./crypto-4ETeplbS.js";function f(e){if(typeof e!=`string`||!e.trim())return!1;try{let t=new URL(e);return t.protocol===`https:`||t.protocol===`http:`}catch{return!1}}function p(e,t){if(!e||typeof e!=`object`)return null;let n=e;if(!n.serviceType||!n.authType)return null;if(n.serviceType!==t)throw Error(`Credential ref serviceType must match connection serviceType`);return{serviceType:n.serviceType,authType:n.authType,providerId:n.providerId||void 0,accountId:n.accountId||void 0,gitAccountId:n.gitAccountId||void 0,headerName:n.headerName||void 0,encryptedValue:n.encryptedValue||void 0}}function m(e){if(!e||typeof e!=`object`)return null;let t=e;return!t.id||!t.label||!t.serviceType||!t.transport||typeof t.enabled!=`boolean`||typeof t.createdAt!=`number`||typeof t.updatedAt!=`number`||!f(t.serverUrl)||t.serviceType!==`mcp_remote`&&t.serviceType!==`webmcp_local`||t.transport!==`streamable_http`&&t.transport!==`sse`&&t.transport!==`websocket`?null:{id:t.id,label:t.label,serviceType:t.serviceType,serverUrl:t.serverUrl,transport:t.transport,enabled:t.enabled,autoReconnectOAuth:t.autoReconnectOAuth===!0,createdAt:t.createdAt,updatedAt:t.updatedAt,credentialRef:p(t.credentialRef,t.serviceType)}}async function h(e){let t=await i(e,r.REMOTE_MCP_CONNECTIONS);if(!Array.isArray(t))return[];let n=[];for(let e of t){let t=m(e);t&&n.push(t)}return n}async function g(e,t){await a(e,r.REMOTE_MCP_CONNECTIONS,t)}async function _(e){return h(e)}async function v(e,t){if(!t)return null;let n=await h(e);return n.find(e=>e.id===t)||n.find(e=>e.label.toLowerCase()===t.toLowerCase())||null}async function y(e,t){if(!t?.label?.trim())throw Error(`Connection label is required`);if(!f(t.serverUrl))throw Error(`Connection serverUrl must be an absolute http(s) URL`);let n=t.serviceType||`mcp_remote`;if(n!==`mcp_remote`&&n!==`webmcp_local`)throw Error(`Unsupported serviceType for remote MCP connection`);let r=await h(e),i=Date.now();if(t.id){let a=r.findIndex(e=>e.id===t.id);if(a!==-1){let o=r[a],s={...o,label:t.label.trim(),serviceType:n,serverUrl:t.serverUrl,transport:t.transport,enabled:t.enabled??o.enabled,autoReconnectOAuth:t.autoReconnectOAuth??o.autoReconnectOAuth,updatedAt:i};return r[a]=s,await g(e,r),s}}let a={id:t.id||o(),label:t.label.trim(),serviceType:n,serverUrl:t.serverUrl,transport:t.transport,enabled:t.enabled??!0,autoReconnectOAuth:t.autoReconnectOAuth??!1,createdAt:i,updatedAt:i,credentialRef:null};return r.push(a),await g(e,r),a}async function b(e,t,n){if(!t)return null;let r=await h(e),i=r.findIndex(e=>e.id===t);if(i===-1)return null;let a=r[i],o=n?p(n,a.serviceType):null,s={...a,credentialRef:o,updatedAt:Date.now()};return r[i]=s,await g(e,r),s}async function x(e,t){if(!t)return!1;let n=await h(e),r=n.filter(e=>e.id!==t);return r.length!==n.length&&(await g(e,r),!0)}function S(e){return s(e)}function C(e,t){return S(e)!==`oauth`||e.oauthReauthRequired||!e.refreshToken||!e.oauthProviderId||!e.oauthClientId?!1:t.forceRefresh?!0:e.accessTokenExpiresAt?e.accessTokenExpiresAt<=Date.now()+6e4:!1}async function w(e,t,n){if(!n.refreshToken||!n.oauthProviderId||!n.oauthClientId)return n;let i=await u(n.refreshToken);if(!i)return n;let o=n.oauthClientSecret?await u(n.oauthClientSecret):void 0,s=async i=>{let o=t.findIndex(e=>e.id===n.id);o!==-1&&(t[o]=i,await a(e,r.SERVICE_ACCOUNTS,t))},c=async()=>{let e=(n.oauthRefreshFailureCount||0)+1,t=e>=3,r={...n,oauthRefreshFailureCount:e,oauthReauthRequired:t,oauthReauthRequiredAt:t?n.oauthReauthRequiredAt||Date.now():void 0};return await s(r),r};try{let e=await fetch(`/oauth/refresh`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({providerId:n.oauthProviderId,clientId:n.oauthClientId,clientSecret:o,refreshToken:i,scope:n.scopes,tokenUrl:n.oauthCustomTokenUrl})});if(!e.ok)return c();let t=await e.json();if(!t.accessToken)return c();let r=await d(t.accessToken);if(!r)return c();let a=n.refreshToken;if(t.refreshToken){let e=await d(t.refreshToken);e&&(a=e)}let l={...n,token:r,refreshToken:a,accessTokenExpiresAt:t.expiresIn?Date.now()+t.expiresIn*1e3:n.accessTokenExpiresAt,tokenType:t.tokenType||n.tokenType,scopes:t.scope?t.scope.split(/[\s,]+/).map(e=>e.trim()).filter(Boolean):n.scopes,oauthRefreshFailureCount:0,oauthReauthRequired:!1,oauthReauthRequiredAt:void 0};return await s(l),l}catch{return c()}}function T(t,r){if(t.oauthProviderId){let n=e(t.oauthProviderId);if(n)return n}let i=[t.service,t.hostPattern,r].filter(e=>!!e).map(e=>e.toLowerCase());for(let e of Object.values(n))if([e.providerId,...e.aliases||[]].map(e=>e.toLowerCase()).some(e=>i.some(t=>t.includes(e))))return e;return null}function E(e,t){let n=S(e),r=T(e,t);if(r){let e;return e=n===`oauth`?r.tokenAuth.oauth:n===`basic`&&r.tokenAuth.basic?r.tokenAuth.basic:r.tokenAuth.token,{headerName:e.headerName,headerPrefix:e.headerPrefix||``}}return{headerName:`Authorization`,headerPrefix:n===`basic`?`Basic `:`Bearer `}}function D(e,t){let n=[],r=-1,i=t.toLowerCase();for(let t of e){if(!t.hostPattern)continue;let e=t.hostPattern.toLowerCase();i.includes(e)&&(e.length>r?(r=e.length,n.length=0,n.push(t)):e.length===r&&n.push(t))}return n}function O(e,t){return e.length?t&&e.find(e=>S(e)===t)||e[0]:void 0}async function k(e,t,n={}){let a=await i(e,r.SERVICE_ACCOUNTS),o=Array.isArray(a)?a:[];if(o.length===0)return;let s;if(n.accountId&&(s=o.find(e=>e.id===n.accountId)),!s&&t){let e=D(o,t);s=n.authMode?O(e,n.authMode):O(e,e[0]?T(e[0],t)?.defaultMode:void 0)}if(!s){let t=await i(e,r.SERVICE_DEFAULT_ACCOUNT);t&&(s=o.find(e=>e.id===t))}if(!s&&n.authMode&&(s=O(o,n.authMode)),s||=o[0],!s)return;if(C(s,n)&&(s=await w(e,o,s)),S(s)===`oauth`&&s.oauthReauthRequired)return{token:``,service:s.service,hostPattern:s.hostPattern,headerName:`Authorization`,headerValue:``,accountId:s.id,authMode:`oauth`,reauthRequired:!0};let c=``;s.token&&(c=await u(s.token)??``);let{headerName:l,headerPrefix:d}=E(s,t),f=c;S(s)===`basic`&&s.basicUsername&&(f=btoa(`${s.basicUsername}:${c}`));let p=d?`${d}${f}`:f;return{token:c,service:s.service,hostPattern:s.hostPattern,headerName:l,headerValue:p,accountId:s.id,authMode:S(s)}}function A(e){return e===`oauth`?`oauth`:`token`}async function j(e,t,n={}){let r=await v(e,t);if(!r)return null;let i=r.credentialRef;if(!i||i.authType===`none`)return{connection:r,authType:`none`,headers:{}};if(i.authType===`custom_header`){if(!i.headerName||!i.encryptedValue)return{connection:r,authType:`custom_header`,headers:{}};let e=await u(i.encryptedValue);return{connection:r,authType:`custom_header`,headers:e?{[i.headerName]:e}:{}}}let a=A(i.authType);if(i.accountId){let t=await k(e,r.serverUrl,{accountId:i.accountId,authMode:a,forceRefresh:n.forceRefresh});return t?t.reauthRequired?{connection:r,authType:i.authType,headers:{},reauthRequired:!0}:{connection:r,authType:i.authType,headers:t.headerValue?{[t.headerName]:t.headerValue}:{}}:{connection:r,authType:i.authType,headers:{}}}if(i.gitAccountId){let t=await c(e,r.serverUrl,{accountId:i.gitAccountId,authMode:a,forceRefresh:n.forceRefresh});return t.reauthRequired?{connection:r,authType:i.authType,headers:{},reauthRequired:!0}:{connection:r,authType:i.authType,headers:l(t)}}return{connection:r,authType:i.authType,headers:{}}}const M=/* @__PURE__ */ new Map;function N(e){return typeof e==`object`&&!!e&&`method`in e&&`id`in e&&!(`result`in e)&&!(`error`in e)}function P(e){let t=(e.requestedSchema||{}).properties||{},n={};for(let[e,r]of Object.entries(t))`default`in r?n[e]=r.default:r.type===`boolean`&&(n[e]=!0);return n}var F=class extends Error{constructor(e){super(e),this.name=`InvalidRemoteMcpSessionError`}},I=class extends Error{status;constructor(e,t){super(t),this.name=`HttpRemoteMcpError`,this.status=e}},L=class extends Error{connectionId;constructor(e){super(`OAuth reconnect required for remote MCP connection`),this.name=`McpReauthRequiredError`,this.connectionId=e}};function R(e,t){return!e.headers||typeof e.headers.get!=`function`?null:e.headers.get(t)}function z(e){return/no valid session id provided/i.test(e)}function B(e,t){let n=t&&`error`in t?t.error.message||`Remote MCP JSON-RPC error`:``;return z(n)?new F(n):e.ok?Error(n||`Remote MCP JSON-RPC error`):new I(e.status,n?`Remote MCP HTTP error: ${e.status} (${n})`:`Remote MCP HTTP error: ${e.status}`)}function V(e){if(!e)return null;let t=null,n=e.split(/\r?\n/);for(let e of n){let n=e.trim();if(!n.startsWith(`data:`))continue;let r=n.slice(5).trim();if(r&&r!==`[DONE]`)try{let e=JSON.parse(r);e&&typeof e==`object`&&`jsonrpc`in e&&(t=e)}catch{}}return t}function H(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function U(e,t,n){let r=await fetch(e,{method:`POST`,headers:{"content-type":`application/json`,accept:`application/json, text/event-stream`,...t},body:JSON.stringify(n)}),i=(R(r,`content-type`)||``).toLowerCase(),a=null;if(typeof r.text==`function`){let e=await r.text();a=i.includes(`text/event-stream`)?V(e):H(e)}else try{a=await r.json()}catch{a=null}return{response:r,payload:a}}async function W(e,t,n){let{response:r,payload:i}=await U(e,{...t,"mcp-session-id":n},{jsonrpc:`2.0`,method:`notifications/initialized`,params:{}});if(!r.ok||i&&`error`in i)throw B(r,i)}async function G(e,t,n){let r=M.get(e);if(r?.sessionId)return r;let{response:i,payload:a}=await U(t,n,{jsonrpc:`2.0`,id:`initialize-${Date.now().toString(36)}`,method:`initialize`,params:{protocolVersion:`2025-03-26`,capabilities:{elicitation:{}},clientInfo:{name:`shadowclaw-remote-mcp-client`,version:`1.0.0`}}});if(!i.ok||a&&`error`in a)throw B(i,a);let o=R(i,`mcp-session-id`)||`local-${Date.now()}-${Math.random().toString(36).slice(2)}`,s={sessionId:o,protocolVersion:R(i,`mcp-protocol-version`)||a?.result?.protocolVersion,lastUsedAt:Date.now()};return await W(t,n,o),M.set(e,s),s}async function K(e,t,n,r,i){let a=await G(e,t,n),o=async e=>{let a={jsonrpc:`2.0`,id:Date.now().toString(),method:r,params:i||{}},o={...n,"mcp-session-id":e},{response:s,payload:c}=await U(t,o,a),l=0;for(;N(c)&&l<5&&(l++,c.method===`elicitation/create`);){let e=P(c.params||{});({response:s,payload:c}=await U(t,o,{jsonrpc:`2.0`,id:c.id,result:{action:`accept`,content:e}}))}if(N(c))throw Error(`Unsupported server request: ${c.method}`);if(!s.ok||!c||`error`in c)throw B(s,c);return c.result};try{let t=await o(a.sessionId);return a.lastUsedAt=Date.now(),M.set(e,a),t}catch(r){if(!(r instanceof F))throw r;M.delete(e),a=await G(e,t,n);let i=await o(a.sessionId);return a.lastUsedAt=Date.now(),M.set(e,a),i}}function q(e){e&&M.delete(e)}async function J(e,t,n,r){let i=await j(e,t);if(!i)throw Error(`Remote MCP connection not found`);if(i.reauthRequired)throw new L(t);let{connection:a,authType:o,headers:s}=i;if(a.transport!==`streamable_http`)throw Error(`Unsupported remote MCP transport`);try{return await K(t,a.serverUrl,s,n,r)}catch(i){if(!(i instanceof I)||i.status!==401||o!==`oauth`)throw i;q(t);let a=await j(e,t,{forceRefresh:!0});if(!a||a.reauthRequired)throw new L(t);try{return await K(t,a.connection.serverUrl,a.headers,n,r)}catch(e){throw e instanceof I&&e.status===401?new L(t):e}}}async function Y(e,t){let n=await J(e,t,`tools/list`);return Array.isArray(n.tools)?n.tools:[]}async function X(e,t,n,r={}){return J(e,t,`tools/call`,{name:n,arguments:r})}async function Z(e,t){let n=[],r;try{r=await j(e,t)}catch(e){let t=e instanceof Error?e.message:String(e);return n.push({step:`Resolve authentication`,status:`error`,detail:t}),{success:!1,error:t,toolCount:0,toolNames:[],steps:n}}if(!r)return n.push({step:`Resolve authentication`,status:`error`,detail:`Connection not found`}),{success:!1,error:`Connection not found`,toolCount:0,toolNames:[],steps:n};if(r.reauthRequired){let e=`OAuth token expired or revoked — re-authenticate in Settings`;return n.push({step:`Resolve authentication`,status:`error`,detail:e}),{success:!1,error:e,toolCount:0,toolNames:[],steps:n}}n.push({step:`Resolve authentication`,status:`ok`,detail:`Auth type: ${r.authType}`});let{connection:i,authType:a,headers:o}=r;if(i.transport!==`streamable_http`){let e=`Unsupported transport: ${i.transport}`;return n.push({step:`Establish MCP session`,status:`error`,detail:e}),{success:!1,error:e,toolCount:0,toolNames:[],steps:n}}q(t);try{await G(t,i.serverUrl,o),n.push({step:`Establish MCP session`,status:`ok`,detail:`Session established`})}catch(r){let s=r instanceof Error?r.message:String(r);if(n.push({step:`Establish MCP session`,status:`error`,detail:s}),r instanceof I&&r.status===401&&a===`oauth`){q(t);let r=await j(e,t,{forceRefresh:!0});if(r&&!r.reauthRequired){n.push({step:`Refresh OAuth token`,status:`ok`,detail:`Token refreshed, retrying`}),i=r.connection,o=r.headers;try{await G(t,i.serverUrl,o),n.push({step:`Establish MCP session`,status:`ok`,detail:`Session established`})}catch(e){let t=e instanceof Error?e.message:String(e),r=e instanceof I&&e.status===401?`${t} — re-authorize in Settings → Accounts`:t;return n.push({step:`Establish MCP session`,status:`error`,detail:r}),{success:!1,error:r,toolCount:0,toolNames:[],steps:n}}}else return n.push({step:`Refresh OAuth token`,status:`error`,detail:`Token refresh failed — re-authenticate in Settings`}),{success:!1,error:s,toolCount:0,toolNames:[],steps:n}}else return{success:!1,error:s,toolCount:0,toolNames:[],steps:n}}try{let e=await K(t,i.serverUrl,o,`tools/list`),r=Array.isArray(e.tools)?e.tools:[],a=r.map(e=>e.name);return n.push({step:`Discover tools`,status:`ok`,detail:`${r.length} tool${r.length===1?``:`s`} available`}),{success:!0,error:null,toolCount:r.length,toolNames:a,steps:n}}catch(e){let t=e instanceof Error?e.message:String(e);return n.push({step:`Discover tools`,status:`error`,detail:t}),{success:!1,error:t,toolCount:0,toolNames:[],steps:n}}}function Q(e,t,n,r){return{accessTokenExpiresAt:e.expiresIn?Date.now()+e.expiresIn*1e3:t.accessTokenExpiresAt,oauthReauthRequired:!1,oauthReauthRequiredAt:void 0,oauthRefreshFailureCount:0,refreshToken:r,scopes:e.scope?e.scope.split(/[\s,]+/).map(e=>e.trim()).filter(Boolean):t.scopes,token:n,tokenType:e.tokenType||t.tokenType}}async function $(e,t,n,i,o,s,c){if(!t.refreshToken)return{success:!1,error:`No refresh token available.`};let l=await u(t.refreshToken);if(!l)return{success:!1,error:`Failed to decrypt refresh token.`};let f=t.oauthClientSecret?await u(t.oauthClientSecret):void 0;try{let u=await fetch(`/oauth/refresh`,{body:JSON.stringify({clientId:t.oauthClientId,clientSecret:f||void 0,providerId:t.oauthProviderId,refreshToken:l,scope:t.scopes,tokenUrl:t.oauthCustomTokenUrl}),headers:{"content-type":`application/json`},method:`POST`});if(!u.ok)return{success:!1,error:`Token refresh request failed.`};let p=await u.json();if(!p.accessToken)return{success:!1,error:`No access token in refresh response.`};let m=await d(p.accessToken);if(!m)return{success:!1,error:`Failed to encrypt access token.`};let h=t.refreshToken;if(p.refreshToken){let e=await d(p.refreshToken);e&&(h=e)}let g=Q({accessToken:p.accessToken,expiresIn:p.expiresIn,refreshToken:p.refreshToken,scope:p.scope,tokenType:p.tokenType},t,m,h);if(n===`service`&&s.accountId){let t=i.findIndex(e=>e.id===s.accountId);t!==-1&&(Object.assign(i[t],g),await a(e,r.SERVICE_ACCOUNTS,i))}else if(n===`git`&&s.gitAccountId){let t=o.findIndex(e=>e.id===s.gitAccountId);t!==-1&&(Object.assign(o[t],g),await a(e,r.GIT_ACCOUNTS,o))}return q(c),{success:!0}}catch(e){return{success:!1,error:`Silent refresh failed: ${e instanceof Error?e.message:String(e)}`}}}async function ee(e,n,o={}){let s=await v(e,n);if(!s?.credentialRef)return{success:!1,error:`Connection not found.`};let c=s.credentialRef;if(c.authType!==`oauth`)return{success:!1,error:`This connection does not use OAuth authentication.`};let l=await i(e,r.SERVICE_ACCOUNTS),f=Array.isArray(l)?l:[],p=await i(e,r.GIT_ACCOUNTS),m=Array.isArray(p)?p:[],h,g=null;if(c.accountId?(h=f.find(e=>e.id===c.accountId),g=`service`):c.gitAccountId&&(h=m.find(e=>e.id===c.gitAccountId),g=`git`),!h||!g)return{error:`Linked account not found. Edit the connection to re-configure authentication.`,success:!1};let _=h.oauthClientId,y=h.oauthProviderId;if(!y||!_)return{error:`Account is missing OAuth provider or client ID. Edit the account in Settings → Accounts to fix.`,success:!1};if(h.refreshToken){let t=await $(e,h,g,f,m,c,n);if(t.success)return t}if(o.silentOnly)return{error:`Silent token refresh failed. Use Settings → Remote MCP → Reconnect OAuth for full re-authorization.`,success:!1};let b=h.oauthClientSecret?await u(h.oauthClientSecret):void 0,x=h.scopes,S=t[y],C=y===`custom_mcp`,w=C&&h.oauthCustomRedirectUri?h.oauthCustomRedirectUri:S?.redirectUri?S.redirectUri:`${globalThis.location?.origin||``}/oauth/callback`;try{let t=await fetch(`/oauth/authorize`,{body:JSON.stringify({providerId:y,clientId:_,clientSecret:b||void 0,redirectUri:w,scope:x,...C&&h.oauthCustomAuthorizeUrl?{authorizeUrl:h.oauthCustomAuthorizeUrl}:{},...C&&h.oauthCustomTokenUrl?{tokenUrl:h.oauthCustomTokenUrl}:{},...C&&typeof h.oauthCustomUsePkce==`boolean`?{usePkce:h.oauthCustomUsePkce}:{}}),headers:{"content-type":`application/json`},method:`POST`}),i=await t.json();if(!t.ok||!i.state||!i.authorizeUrl)throw Error(i.error||`OAuth authorize failed`);let o=window.open(i.authorizeUrl,`shadowclaw-oauth`,`popup=yes,width=540,height=720`);if(!o||o.closed||o.closed===void 0)throw Error(`OAuth popup was blocked by the browser. Please enable popups for this site and try again.`);let s=i.state,l=`pending`;for(let e=0;e<60;e++){let e=await fetch(`/oauth/session/${encodeURIComponent(s)}`),t=await e.json();if(!e.ok)throw Error(t.error||`OAuth session not found`);if(l=t.status||`pending`,l===`authorized`)break;if(l===`error`)throw Error(t.error||`OAuth authorization failed`);await new Promise(e=>setTimeout(e,1e3))}if(l!==`authorized`)throw Error(`OAuth authorization timed out`);let u=await fetch(`/oauth/token`,{body:JSON.stringify({state:s}),headers:{"content-type":`application/json`},method:`POST`}),p=await u.json();if(!u.ok||!p.accessToken)throw Error(p.error||`OAuth token exchange failed`);let v=await d(p.accessToken);if(!v)throw Error(`Failed to encrypt access token`);let S=h.refreshToken;if(p.refreshToken){let e=await d(p.refreshToken);e&&(S=e)}let T=Q({accessToken:p.accessToken,expiresIn:p.expiresIn,refreshToken:p.refreshToken,scope:p.scope,tokenType:p.tokenType},h,v,S);if(g===`service`&&c.accountId){let t=f.findIndex(e=>e.id===c.accountId);t!==-1&&(Object.assign(f[t],T),await a(e,r.SERVICE_ACCOUNTS,f))}else if(g===`git`&&c.gitAccountId){let t=m.findIndex(e=>e.id===c.gitAccountId);t!==-1&&(Object.assign(m[t],T),await a(e,r.GIT_ACCOUNTS,m))}return q(n),{success:!0}}catch(e){return{success:!1,error:e instanceof Error?e.message:String(e)}}}export{Z as a,x as c,y as d,Y as i,v as l,L as n,k as o,X as r,b as s,ee as t,_ as u};
|
|
1
|
+
import{N as e,b as t,h as n,r}from"./config-C16fFWtP.js";import{t as i}from"./get-config-Bkvl__ZS.js";import{t as a}from"./set-config-DSiuMe0k.js";import{t as o}from"./ulid-BSJxYh6W.js";import{i as s,r as c,t as l}from"./credentials-CJUQ5Ep2.js";import{n as u,r as d}from"./crypto-4ETeplbS.js";function f(e){if(typeof e!=`string`||!e.trim())return!1;try{let t=new URL(e);return t.protocol===`https:`||t.protocol===`http:`}catch{return!1}}function p(e,t){if(!e||typeof e!=`object`)return null;let n=e;if(!n.serviceType||!n.authType)return null;if(n.serviceType!==t)throw Error(`Credential ref serviceType must match connection serviceType`);return{serviceType:n.serviceType,authType:n.authType,providerId:n.providerId||void 0,accountId:n.accountId||void 0,gitAccountId:n.gitAccountId||void 0,headerName:n.headerName||void 0,encryptedValue:n.encryptedValue||void 0}}function m(e){if(!e||typeof e!=`object`)return null;let t=e;return!t.id||!t.label||!t.serviceType||!t.transport||typeof t.enabled!=`boolean`||typeof t.createdAt!=`number`||typeof t.updatedAt!=`number`||!f(t.serverUrl)||t.serviceType!==`mcp_remote`&&t.serviceType!==`webmcp_local`||t.transport!==`streamable_http`&&t.transport!==`sse`&&t.transport!==`websocket`?null:{id:t.id,label:t.label,serviceType:t.serviceType,serverUrl:t.serverUrl,transport:t.transport,enabled:t.enabled,autoReconnectOAuth:t.autoReconnectOAuth===!0,createdAt:t.createdAt,updatedAt:t.updatedAt,credentialRef:p(t.credentialRef,t.serviceType)}}async function h(e){let t=await i(e,r.REMOTE_MCP_CONNECTIONS);if(!Array.isArray(t))return[];let n=[];for(let e of t){let t=m(e);t&&n.push(t)}return n}async function g(e,t){await a(e,r.REMOTE_MCP_CONNECTIONS,t)}async function _(e){return h(e)}async function v(e,t){if(!t)return null;let n=await h(e);return n.find(e=>e.id===t)||n.find(e=>e.label.toLowerCase()===t.toLowerCase())||null}async function y(e,t){if(!t?.label?.trim())throw Error(`Connection label is required`);if(!f(t.serverUrl))throw Error(`Connection serverUrl must be an absolute http(s) URL`);let n=t.serviceType||`mcp_remote`;if(n!==`mcp_remote`&&n!==`webmcp_local`)throw Error(`Unsupported serviceType for remote MCP connection`);let r=await h(e),i=Date.now();if(t.id){let a=r.findIndex(e=>e.id===t.id);if(a!==-1){let o=r[a],s={...o,label:t.label.trim(),serviceType:n,serverUrl:t.serverUrl,transport:t.transport,enabled:t.enabled??o.enabled,autoReconnectOAuth:t.autoReconnectOAuth??o.autoReconnectOAuth,updatedAt:i};return r[a]=s,await g(e,r),s}}let a={id:t.id||o(),label:t.label.trim(),serviceType:n,serverUrl:t.serverUrl,transport:t.transport,enabled:t.enabled??!0,autoReconnectOAuth:t.autoReconnectOAuth??!1,createdAt:i,updatedAt:i,credentialRef:null};return r.push(a),await g(e,r),a}async function b(e,t,n){if(!t)return null;let r=await h(e),i=r.findIndex(e=>e.id===t);if(i===-1)return null;let a=r[i],o=n?p(n,a.serviceType):null,s={...a,credentialRef:o,updatedAt:Date.now()};return r[i]=s,await g(e,r),s}async function x(e,t){if(!t)return!1;let n=await h(e),r=n.filter(e=>e.id!==t);return r.length!==n.length&&(await g(e,r),!0)}function S(e){return s(e)}function C(e,t){return S(e)!==`oauth`||e.oauthReauthRequired||!e.refreshToken||!e.oauthProviderId||!e.oauthClientId?!1:t.forceRefresh?!0:e.accessTokenExpiresAt?e.accessTokenExpiresAt<=Date.now()+6e4:!1}async function w(e,t,n){if(!n.refreshToken||!n.oauthProviderId||!n.oauthClientId)return n;let i=await u(n.refreshToken);if(!i)return n;let o=n.oauthClientSecret?await u(n.oauthClientSecret):void 0,s=async i=>{let o=t.findIndex(e=>e.id===n.id);o!==-1&&(t[o]=i,await a(e,r.SERVICE_ACCOUNTS,t))},c=async()=>{let e=(n.oauthRefreshFailureCount||0)+1,t=e>=3,r={...n,oauthRefreshFailureCount:e,oauthReauthRequired:t,oauthReauthRequiredAt:t?n.oauthReauthRequiredAt||Date.now():void 0};return await s(r),r};try{let e=await fetch(`/oauth/refresh`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({providerId:n.oauthProviderId,clientId:n.oauthClientId,clientSecret:o,refreshToken:i,scope:n.scopes,tokenUrl:n.oauthCustomTokenUrl})});if(!e.ok)return c();let t=await e.json();if(!t.accessToken)return c();let r=await d(t.accessToken);if(!r)return c();let a=n.refreshToken;if(t.refreshToken){let e=await d(t.refreshToken);e&&(a=e)}let l={...n,token:r,refreshToken:a,accessTokenExpiresAt:t.expiresIn?Date.now()+t.expiresIn*1e3:n.accessTokenExpiresAt,tokenType:t.tokenType||n.tokenType,scopes:t.scope?t.scope.split(/[\s,]+/).map(e=>e.trim()).filter(Boolean):n.scopes,oauthRefreshFailureCount:0,oauthReauthRequired:!1,oauthReauthRequiredAt:void 0};return await s(l),l}catch{return c()}}function T(t,r){if(t.oauthProviderId){let n=e(t.oauthProviderId);if(n)return n}let i=[t.service,t.hostPattern,r].filter(e=>!!e).map(e=>e.toLowerCase());for(let e of Object.values(n))if([e.providerId,...e.aliases||[]].map(e=>e.toLowerCase()).some(e=>i.some(t=>t.includes(e))))return e;return null}function E(e,t){let n=S(e),r=T(e,t);if(r){let e;return e=n===`oauth`?r.tokenAuth.oauth:n===`basic`&&r.tokenAuth.basic?r.tokenAuth.basic:r.tokenAuth.token,{headerName:e.headerName,headerPrefix:e.headerPrefix||``}}return{headerName:`Authorization`,headerPrefix:n===`basic`?`Basic `:`Bearer `}}function D(e,t){let n=[],r=-1,i=t.toLowerCase();for(let t of e){if(!t.hostPattern)continue;let e=t.hostPattern.toLowerCase();i.includes(e)&&(e.length>r?(r=e.length,n.length=0,n.push(t)):e.length===r&&n.push(t))}return n}function O(e,t){return e.length?t&&e.find(e=>S(e)===t)||e[0]:void 0}async function k(e,t,n={}){let a=await i(e,r.SERVICE_ACCOUNTS),o=Array.isArray(a)?a:[];if(o.length===0)return;let s;if(n.accountId&&(s=o.find(e=>e.id===n.accountId)),!s&&t){let e=D(o,t);s=n.authMode?O(e,n.authMode):O(e,e[0]?T(e[0],t)?.defaultMode:void 0)}if(!s){let t=await i(e,r.SERVICE_DEFAULT_ACCOUNT);t&&(s=o.find(e=>e.id===t))}if(!s&&n.authMode&&(s=O(o,n.authMode)),s||=o[0],!s)return;if(C(s,n)&&(s=await w(e,o,s)),S(s)===`oauth`&&s.oauthReauthRequired)return{token:``,service:s.service,hostPattern:s.hostPattern,headerName:`Authorization`,headerValue:``,accountId:s.id,authMode:`oauth`,reauthRequired:!0};let c=``;s.token&&(c=await u(s.token)??``);let{headerName:l,headerPrefix:d}=E(s,t),f=c;S(s)===`basic`&&s.basicUsername&&(f=btoa(`${s.basicUsername}:${c}`));let p=d?`${d}${f}`:f;return{token:c,service:s.service,hostPattern:s.hostPattern,headerName:l,headerValue:p,accountId:s.id,authMode:S(s)}}function A(e){return e===`oauth`?`oauth`:`token`}async function j(e,t,n={}){let r=await v(e,t);if(!r)return null;let i=r.credentialRef;if(!i||i.authType===`none`)return{connection:r,authType:`none`,headers:{}};if(i.authType===`custom_header`){if(!i.headerName||!i.encryptedValue)return{connection:r,authType:`custom_header`,headers:{}};let e=await u(i.encryptedValue);return{connection:r,authType:`custom_header`,headers:e?{[i.headerName]:e}:{}}}let a=A(i.authType);if(i.accountId){let t=await k(e,r.serverUrl,{accountId:i.accountId,authMode:a,forceRefresh:n.forceRefresh});return t?t.reauthRequired?{connection:r,authType:i.authType,headers:{},reauthRequired:!0}:{connection:r,authType:i.authType,headers:t.headerValue?{[t.headerName]:t.headerValue}:{}}:{connection:r,authType:i.authType,headers:{}}}if(i.gitAccountId){let t=await c(e,r.serverUrl,{accountId:i.gitAccountId,authMode:a,forceRefresh:n.forceRefresh});return t.reauthRequired?{connection:r,authType:i.authType,headers:{},reauthRequired:!0}:{connection:r,authType:i.authType,headers:l(t)}}return{connection:r,authType:i.authType,headers:{}}}const M=/* @__PURE__ */ new Map;function N(e){return typeof e==`object`&&!!e&&`method`in e&&`id`in e&&!(`result`in e)&&!(`error`in e)}function P(e){let t=(e.requestedSchema||{}).properties||{},n={};for(let[e,r]of Object.entries(t))`default`in r?n[e]=r.default:r.type===`boolean`&&(n[e]=!0);return n}var F=class extends Error{constructor(e){super(e),this.name=`InvalidRemoteMcpSessionError`}},I=class extends Error{status;constructor(e,t){super(t),this.name=`HttpRemoteMcpError`,this.status=e}},L=class extends Error{connectionId;constructor(e){super(`OAuth reconnect required for remote MCP connection`),this.name=`McpReauthRequiredError`,this.connectionId=e}};function R(e,t){return!e.headers||typeof e.headers.get!=`function`?null:e.headers.get(t)}function z(e){return/no valid session id provided/i.test(e)}function B(e,t){let n=t&&`error`in t?t.error.message||`Remote MCP JSON-RPC error`:``;return z(n)?new F(n):e.ok?Error(n||`Remote MCP JSON-RPC error`):new I(e.status,n?`Remote MCP HTTP error: ${e.status} (${n})`:`Remote MCP HTTP error: ${e.status}`)}function V(e){if(!e)return null;let t=null,n=e.split(/\r?\n/);for(let e of n){let n=e.trim();if(!n.startsWith(`data:`))continue;let r=n.slice(5).trim();if(r&&r!==`[DONE]`)try{let e=JSON.parse(r);e&&typeof e==`object`&&`jsonrpc`in e&&(t=e)}catch{}}return t}function H(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function U(e,t,n){let r=await fetch(e,{method:`POST`,headers:{"content-type":`application/json`,accept:`application/json, text/event-stream`,...t},body:JSON.stringify(n)}),i=(R(r,`content-type`)||``).toLowerCase(),a=null;if(typeof r.text==`function`){let e=await r.text();a=i.includes(`text/event-stream`)?V(e):H(e)}else try{a=await r.json()}catch{a=null}return{response:r,payload:a}}async function W(e,t,n){let{response:r,payload:i}=await U(e,{...t,"mcp-session-id":n},{jsonrpc:`2.0`,method:`notifications/initialized`,params:{}});if(!r.ok||i&&`error`in i)throw B(r,i)}async function G(e,t,n){let r=M.get(e);if(r?.sessionId)return r;let{response:i,payload:a}=await U(t,n,{jsonrpc:`2.0`,id:`initialize-${Date.now().toString(36)}`,method:`initialize`,params:{protocolVersion:`2025-03-26`,capabilities:{elicitation:{}},clientInfo:{name:`shadowclaw-remote-mcp-client`,version:`1.0.0`}}});if(!i.ok||a&&`error`in a)throw B(i,a);let o=R(i,`mcp-session-id`)||`local-${Date.now()}-${Math.random().toString(36).slice(2)}`,s={sessionId:o,protocolVersion:R(i,`mcp-protocol-version`)||a?.result?.protocolVersion,lastUsedAt:Date.now()};return await W(t,n,o),M.set(e,s),s}async function K(e,t,n,r,i){let a=await G(e,t,n),o=async e=>{let a={jsonrpc:`2.0`,id:Date.now().toString(),method:r,params:i||{}},o={...n,"mcp-session-id":e},{response:s,payload:c}=await U(t,o,a),l=0;for(;N(c)&&l<5&&(l++,c.method===`elicitation/create`);){let e=P(c.params||{});({response:s,payload:c}=await U(t,o,{jsonrpc:`2.0`,id:c.id,result:{action:`accept`,content:e}}))}if(N(c))throw Error(`Unsupported server request: ${c.method}`);if(!s.ok||!c||`error`in c)throw B(s,c);return c.result};try{let t=await o(a.sessionId);return a.lastUsedAt=Date.now(),M.set(e,a),t}catch(r){if(!(r instanceof F))throw r;M.delete(e),a=await G(e,t,n);let i=await o(a.sessionId);return a.lastUsedAt=Date.now(),M.set(e,a),i}}function q(e){e&&M.delete(e)}async function J(e,t,n,r){let i=await j(e,t);if(!i)throw Error(`Remote MCP connection not found`);if(i.reauthRequired)throw new L(t);let{connection:a,authType:o,headers:s}=i;if(a.transport!==`streamable_http`)throw Error(`Unsupported remote MCP transport`);try{return await K(t,a.serverUrl,s,n,r)}catch(i){if(!(i instanceof I)||i.status!==401||o!==`oauth`)throw i;q(t);let a=await j(e,t,{forceRefresh:!0});if(!a||a.reauthRequired)throw new L(t);try{return await K(t,a.connection.serverUrl,a.headers,n,r)}catch(e){throw e instanceof I&&e.status===401?new L(t):e}}}async function Y(e,t){let n=await J(e,t,`tools/list`);return Array.isArray(n.tools)?n.tools:[]}async function X(e,t,n,r={}){return J(e,t,`tools/call`,{name:n,arguments:r})}async function Z(e,t){let n=[],r;try{r=await j(e,t)}catch(e){let t=e instanceof Error?e.message:String(e);return n.push({step:`Resolve authentication`,status:`error`,detail:t}),{success:!1,error:t,toolCount:0,toolNames:[],steps:n}}if(!r)return n.push({step:`Resolve authentication`,status:`error`,detail:`Connection not found`}),{success:!1,error:`Connection not found`,toolCount:0,toolNames:[],steps:n};if(r.reauthRequired){let e=`OAuth token expired or revoked — re-authenticate in Settings`;return n.push({step:`Resolve authentication`,status:`error`,detail:e}),{success:!1,error:e,toolCount:0,toolNames:[],steps:n}}n.push({step:`Resolve authentication`,status:`ok`,detail:`Auth type: ${r.authType}`});let{connection:i,authType:a,headers:o}=r;if(i.transport!==`streamable_http`){let e=`Unsupported transport: ${i.transport}`;return n.push({step:`Establish MCP session`,status:`error`,detail:e}),{success:!1,error:e,toolCount:0,toolNames:[],steps:n}}q(t);try{await G(t,i.serverUrl,o),n.push({step:`Establish MCP session`,status:`ok`,detail:`Session established`})}catch(r){let s=r instanceof Error?r.message:String(r);if(n.push({step:`Establish MCP session`,status:`error`,detail:s}),r instanceof I&&r.status===401&&a===`oauth`){q(t);let r=await j(e,t,{forceRefresh:!0});if(r&&!r.reauthRequired){n.push({step:`Refresh OAuth token`,status:`ok`,detail:`Token refreshed, retrying`}),i=r.connection,o=r.headers;try{await G(t,i.serverUrl,o),n.push({step:`Establish MCP session`,status:`ok`,detail:`Session established`})}catch(e){let t=e instanceof Error?e.message:String(e),r=e instanceof I&&e.status===401?`${t} — re-authorize in Settings → Accounts`:t;return n.push({step:`Establish MCP session`,status:`error`,detail:r}),{success:!1,error:r,toolCount:0,toolNames:[],steps:n}}}else return n.push({step:`Refresh OAuth token`,status:`error`,detail:`Token refresh failed — re-authenticate in Settings`}),{success:!1,error:s,toolCount:0,toolNames:[],steps:n}}else return{success:!1,error:s,toolCount:0,toolNames:[],steps:n}}try{let e=await K(t,i.serverUrl,o,`tools/list`),r=Array.isArray(e.tools)?e.tools:[],a=r.map(e=>e.name);return n.push({step:`Discover tools`,status:`ok`,detail:`${r.length} tool${r.length===1?``:`s`} available`}),{success:!0,error:null,toolCount:r.length,toolNames:a,steps:n}}catch(e){let t=e instanceof Error?e.message:String(e);return n.push({step:`Discover tools`,status:`error`,detail:t}),{success:!1,error:t,toolCount:0,toolNames:[],steps:n}}}function Q(e,t,n,r){return{accessTokenExpiresAt:e.expiresIn?Date.now()+e.expiresIn*1e3:t.accessTokenExpiresAt,oauthReauthRequired:!1,oauthReauthRequiredAt:void 0,oauthRefreshFailureCount:0,refreshToken:r,scopes:e.scope?e.scope.split(/[\s,]+/).map(e=>e.trim()).filter(Boolean):t.scopes,token:n,tokenType:e.tokenType||t.tokenType}}async function $(e,t,n,i,o,s,c){if(!t.refreshToken)return{success:!1,error:`No refresh token available.`};let l=await u(t.refreshToken);if(!l)return{success:!1,error:`Failed to decrypt refresh token.`};let f=t.oauthClientSecret?await u(t.oauthClientSecret):void 0;try{let u=await fetch(`/oauth/refresh`,{body:JSON.stringify({clientId:t.oauthClientId,clientSecret:f||void 0,providerId:t.oauthProviderId,refreshToken:l,scope:t.scopes,tokenUrl:t.oauthCustomTokenUrl}),headers:{"content-type":`application/json`},method:`POST`});if(!u.ok)return{success:!1,error:`Token refresh request failed.`};let p=await u.json();if(!p.accessToken)return{success:!1,error:`No access token in refresh response.`};let m=await d(p.accessToken);if(!m)return{success:!1,error:`Failed to encrypt access token.`};let h=t.refreshToken;if(p.refreshToken){let e=await d(p.refreshToken);e&&(h=e)}let g=Q({accessToken:p.accessToken,expiresIn:p.expiresIn,refreshToken:p.refreshToken,scope:p.scope,tokenType:p.tokenType},t,m,h);if(n===`service`&&s.accountId){let t=i.findIndex(e=>e.id===s.accountId);t!==-1&&(Object.assign(i[t],g),await a(e,r.SERVICE_ACCOUNTS,i))}else if(n===`git`&&s.gitAccountId){let t=o.findIndex(e=>e.id===s.gitAccountId);t!==-1&&(Object.assign(o[t],g),await a(e,r.GIT_ACCOUNTS,o))}return q(c),{success:!0}}catch(e){return{success:!1,error:`Silent refresh failed: ${e instanceof Error?e.message:String(e)}`}}}async function ee(e,n,o={}){let s=await v(e,n);if(!s?.credentialRef)return{success:!1,error:`Connection not found.`};let c=s.credentialRef;if(c.authType!==`oauth`)return{success:!1,error:`This connection does not use OAuth authentication.`};let l=await i(e,r.SERVICE_ACCOUNTS),f=Array.isArray(l)?l:[],p=await i(e,r.GIT_ACCOUNTS),m=Array.isArray(p)?p:[],h,g=null;if(c.accountId?(h=f.find(e=>e.id===c.accountId),g=`service`):c.gitAccountId&&(h=m.find(e=>e.id===c.gitAccountId),g=`git`),!h||!g)return{error:`Linked account not found. Edit the connection to re-configure authentication.`,success:!1};let _=h.oauthClientId,y=h.oauthProviderId;if(!y||!_)return{error:`Account is missing OAuth provider or client ID. Edit the account in Settings → Accounts to fix.`,success:!1};if(h.refreshToken){let t=await $(e,h,g,f,m,c,n);if(t.success)return t}if(o.silentOnly)return{error:`Silent token refresh failed. Use Settings → Remote MCP → Reconnect OAuth for full re-authorization.`,success:!1};let b=h.oauthClientSecret?await u(h.oauthClientSecret):void 0,x=h.scopes,S=t[y],C=y===`custom_mcp`,w=C&&h.oauthCustomRedirectUri?h.oauthCustomRedirectUri:S?.redirectUri?S.redirectUri:`${globalThis.location?.origin||``}/oauth/callback`;try{let t=await fetch(`/oauth/authorize`,{body:JSON.stringify({providerId:y,clientId:_,clientSecret:b||void 0,redirectUri:w,scope:x,...C&&h.oauthCustomAuthorizeUrl?{authorizeUrl:h.oauthCustomAuthorizeUrl}:{},...C&&h.oauthCustomTokenUrl?{tokenUrl:h.oauthCustomTokenUrl}:{},...C&&typeof h.oauthCustomUsePkce==`boolean`?{usePkce:h.oauthCustomUsePkce}:{}}),headers:{"content-type":`application/json`},method:`POST`}),i=await t.json();if(!t.ok||!i.state||!i.authorizeUrl)throw Error(i.error||`OAuth authorize failed`);let o=window.open(i.authorizeUrl,`shadowclaw-oauth`,`popup=yes,width=540,height=720`);if(!o||o.closed||o.closed===void 0)throw Error(`OAuth popup was blocked by the browser. Please enable popups for this site and try again.`);let s=i.state,l=`pending`;for(let e=0;e<60;e++){let e=await fetch(`/oauth/session/${encodeURIComponent(s)}`),t=await e.json();if(!e.ok)throw Error(t.error||`OAuth session not found`);if(l=t.status||`pending`,l===`authorized`)break;if(l===`error`)throw Error(t.error||`OAuth authorization failed`);await new Promise(e=>setTimeout(e,1e3))}if(l!==`authorized`)throw Error(`OAuth authorization timed out`);let u=await fetch(`/oauth/token`,{body:JSON.stringify({state:s}),headers:{"content-type":`application/json`},method:`POST`}),p=await u.json();if(!u.ok||!p.accessToken)throw Error(p.error||`OAuth token exchange failed`);let v=await d(p.accessToken);if(!v)throw Error(`Failed to encrypt access token`);let S=h.refreshToken;if(p.refreshToken){let e=await d(p.refreshToken);e&&(S=e)}let T=Q({accessToken:p.accessToken,expiresIn:p.expiresIn,refreshToken:p.refreshToken,scope:p.scope,tokenType:p.tokenType},h,v,S);if(g===`service`&&c.accountId){let t=f.findIndex(e=>e.id===c.accountId);t!==-1&&(Object.assign(f[t],T),await a(e,r.SERVICE_ACCOUNTS,f))}else if(g===`git`&&c.gitAccountId){let t=m.findIndex(e=>e.id===c.gitAccountId);t!==-1&&(Object.assign(m[t],T),await a(e,r.GIT_ACCOUNTS,m))}return q(n),{success:!0}}catch(e){return{success:!1,error:e instanceof Error?e.message:String(e)}}}export{Z as a,x as c,y as d,Y as i,v as l,L as n,k as o,X as r,b as s,ee as t,_ as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DBVvNlSN.js";import{x as t}from"./config-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DBVvNlSN.js";import{x as t}from"./config-C16fFWtP.js";var n=/* @__PURE__ */ e({MemoryDirectoryHandle:()=>c,MemoryFileHandle:()=>s,MemorySyncAccessHandle:()=>a,MemoryWritableStream:()=>o,getMemoryOpfsRoot:()=>u,isMemoryStorageFallbackActive:()=>d});function r(e,t){if(typeof DOMException<`u`)try{return new DOMException(e,t)}catch{}let n=Error(e);return n.name=t,n}function i(e){let t=e();return t[Symbol.asyncDispose??Symbol.for(`Symbol.asyncDispose`)]=async()=>{},t}var a=class{_file;_closed=!1;constructor(e){this._file=e}close(){this._closed=!0}flush(){}getSize(){if(this._closed)throw r(`SyncAccessHandle is closed`,`InvalidStateError`);return this._file.getRawData().byteLength}read(e,t){if(this._closed)throw r(`SyncAccessHandle is closed`,`InvalidStateError`);let n=this._file.getRawData(),i=t?.at??0;if(i>=n.byteLength)return 0;let a=new Uint8Array(e.buffer,e.byteOffset,e.byteLength),o=n.subarray(i,i+a.byteLength);return a.set(o),o.byteLength}write(e,t){if(this._closed)throw r(`SyncAccessHandle is closed`,`InvalidStateError`);let n=new Uint8Array(e.buffer,e.byteOffset,e.byteLength),i=t?.at??0,a=this._file.getRawData(),o=i+n.byteLength,s;return o>a.byteLength?(s=new Uint8Array(o),s.set(a)):s=new Uint8Array(a),s.set(n,i),this._file.setRawData(s),n.byteLength}truncate(e){if(this._closed)throw r(`SyncAccessHandle is closed`,`InvalidStateError`);let t=this._file.getRawData(),n=new Uint8Array(e);n.set(t.subarray(0,Math.min(t.byteLength,e))),this._file.setRawData(n)}},o=class{_file;_buffer;_position=0;_length=0;_closed=!1;constructor(e,t=!1){this._file=e;let n=e.getRawData();t?(this._buffer=new Uint8Array(n),this._length=n.byteLength):(this._buffer=/* @__PURE__ */ new Uint8Array(1024),this._length=0)}async write(e){if(this._closed)throw r(`WritableStream is closed`,`InvalidStateError`);let t;if(typeof e==`string`)t=new TextEncoder().encode(e);else if(e instanceof Uint8Array)t=e;else if(e instanceof ArrayBuffer)t=new Uint8Array(e);else if(typeof Blob<`u`&&e instanceof Blob)t=typeof e.arrayBuffer==`function`?new Uint8Array(await e.arrayBuffer()):typeof e.text==`function`?new TextEncoder().encode(await e.text()):typeof FileReader<`u`?await new Promise(t=>{let n=new FileReader;n.onload=()=>{t(new Uint8Array(n.result))},n.onerror=()=>t(/* @__PURE__ */ new Uint8Array),n.readAsArrayBuffer(e)}):/* @__PURE__ */ new Uint8Array;else if(e&&typeof e==`object`&&`type`in e){if(e.type===`write`){typeof e.position==`number`&&(this._position=e.position);let n=e.data;t=typeof n==`string`?new TextEncoder().encode(n):n instanceof Uint8Array?n:n instanceof ArrayBuffer?new Uint8Array(n):typeof Blob<`u`&&n instanceof Blob&&typeof n.arrayBuffer==`function`?new Uint8Array(await n.arrayBuffer()):/* @__PURE__ */ new Uint8Array}else if(e.type===`seek`){this._position=e.position??0;return}else if(e.type===`truncate`){this._truncate(e.size??0);return}else t=/* @__PURE__ */ new Uint8Array}else t=/* @__PURE__ */ new Uint8Array;let n=this._position+t.length;if(n>this._buffer.length){let e=Math.max(this._buffer.length*2,n,1024),t=new Uint8Array(e);t.set(this._buffer),this._buffer=t}this._buffer.set(t,this._position),this._position+=t.length,this._position>this._length&&(this._length=this._position)}_truncate(e){if(e<this._length)this._length=e;else if(e>this._length){if(e>this._buffer.length){let t=new Uint8Array(e);t.set(this._buffer),this._buffer=t}this._length=e}this._position>e&&(this._position=e)}async seek(e){if(this._closed)throw r(`WritableStream is closed`,`InvalidStateError`);this._position=e}async truncate(e){if(this._closed)throw r(`WritableStream is closed`,`InvalidStateError`);this._truncate(e)}async close(){if(this._closed)return;this._closed=!0;let e=this._buffer.slice(0,this._length);this._file.setRawData(e)}async abort(){this._closed=!0}},s=class{kind=`file`;name;_data;_lastModified;constructor(e,t=/* @__PURE__ */ new Uint8Array){this.name=e,this._data=t,this._lastModified=Date.now()}getRawData(){return this._data}setRawData(e){this._data=e,this._lastModified=Date.now()}_getArrayBuffer(){let e=new ArrayBuffer(this._data.byteLength);return new Uint8Array(e).set(this._data),e}async getFile(){let e=this._getArrayBuffer(),t=this._data,n=this.name,r=this._lastModified,i={name:n,size:t.byteLength,type:``,lastModified:r,async text(){return new TextDecoder().decode(t)},async arrayBuffer(){return e},slice(n=0,r=t.byteLength){return new Blob([e.slice(n,r)])}};if(typeof File<`u`)try{let t=new File([e],this.name,{lastModified:this._lastModified});return typeof t.text!=`function`&&(t.text=i.text),typeof t.arrayBuffer!=`function`&&(t.arrayBuffer=i.arrayBuffer),t}catch{}return i}async createWritable(e){return new o(this,e?.keepExistingData??!1)}async createSyncAccessHandle(){return new a(this)}async isSameEntry(e){return this===e}async queryPermission(){return`granted`}async requestPermission(){return`granted`}},c=class e{kind=`directory`;name;_entries=/* @__PURE__ */ new Map;constructor(e){this.name=e}_setEntry(e,t){this._entries.set(e,t)}async getDirectoryHandle(t,n){if(t===`.`||t===``)return this;if(t===`..`)throw r(`Cannot navigate to parent directory with '..'`,`SecurityError`);let i=this._entries.get(t);if(i){if(i.kind===`directory`)return i;throw r(`"${t}" is a file, not a directory`,`TypeMismatchError`)}if(n?.create){let n=new e(t);return this._entries.set(t,n),n}throw r(`A requested file or directory could not be found at "${t}"`,`NotFoundError`)}async getFileHandle(e,t){if(e===`.`||e===`..`||e===``)throw r(`Invalid file name "${e}"`,`TypeMismatchError`);let n=this._entries.get(e);if(n){if(n.kind===`file`)return n;throw r(`"${e}" is a directory, not a file`,`TypeMismatchError`)}if(t?.create){let t=new s(e);return this._entries.set(e,t),t}throw r(`A requested file could not be found at "${e}"`,`NotFoundError`)}async removeEntry(e,t){let n=this._entries.get(e);if(!n)throw r(`Entry "${e}" not found`,`NotFoundError`);if(n.kind===`directory`&&n._entries.size>0&&!t?.recursive)throw r(`Directory "${e}" is not empty`,`InvalidModificationError`);this._entries.delete(e)}async resolve(e){if(this===e)return[];for(let[t,n]of this._entries.entries()){if(n===e)return[t];if(n.kind===`directory`){let r=await n.resolve(e);if(r)return[t,...r]}}return null}entries(){let e=this;return i(async function*(){for(let[t,n]of e._entries.entries())yield[t,n]})}values(){let e=this;return i(async function*(){for(let t of e._entries.values())yield t})}keys(){let e=this;return i(async function*(){for(let t of e._entries.keys())yield t})}[Symbol.asyncIterator](){return this.entries()}async isSameEntry(e){return this===e}async queryPermission(){return`granted`}async requestPermission(){return`granted`}};let l=null;function u(){if(!l){let e=new c(`memory-root`),n=new c(t);e._setEntry(t,n),l=n}return l}function d(){return l!==null}export{n,u as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{C as e}from"./config-
|
|
1
|
+
import{C as e}from"./config-C16fFWtP.js";import{t}from"./html-BwtE_7wp.js";function n(e){let t=e.toLowerCase(),n=/(?:^|[-_\/.])(\d+(?:\.\d+)?)b(?:[-_\/.]|$)/i.exec(t);if(n){let e=Number(n[1]);if(Number.isFinite(e)&&e>0)return e}let r=/(?:^|[-_\/.])e(\d+(?:\.\d+)?)b(?:[-_\/.]|$)/i.exec(t);if(!r)return null;let i=Number(r[1]);return!Number.isFinite(i)||i<=0?null:i}function r(e){let t=e.toLowerCase();return!!(/(^|[-_./])(instruct|chat|assistant|tool|it)([-_./]|$)/i.test(t)||/(qwen\d*(?:\.\d+)?|deepseek-r1-distill)/i.test(t))}function i(e){return/(^|[-_./])(q\d+|int8|uint8|4bit|8bit|bnb4|opt)([-_./]|$)/i.test(e)}function a(e,t){let a=e.id.toLowerCase(),o=n(e.id),s=0;return e.supportsTools||(s+=60),r(e.id)&&(s-=40),a.includes(`onnx`)?s-=30:s+=90,i(a)&&(s-=20),o===null?s+=10:o<=.6?s-=120:o<=.8?s-=100:o<=1.2?s-=80:o<=1.8?s-=40:s+=o<=3?20:80,/thinking|reasoning/i.test(a)&&(s+=25),t===`transformers_js_browser`&&(o!==null&&o>1.5&&(s+=40),a.includes(`onnx`)||(s+=80)),s}const o=[`onnx-community/Qwen3-0.6B-ONNX`,`onnx-community/gemma-3-1b-it-ONNX-GQA`,`onnx-community/gemma-4-E2B-it-ONNX`,`onnx-community/gemma-4-E4B-it-ONNX`],s={"onnx-community/Qwen3-0.6B-ONNX":`onnx-community/Qwen3-0.6B-ONNX — Recommended (Fast, Compact & Tool Calling)`,"onnx-community/gemma-3-1b-it-ONNX-GQA":`onnx-community/gemma-3-1b-it-ONNX-GQA — Alternative (1B Parameters)`,"onnx-community/gemma-4-E2B-it-ONNX":`onnx-community/gemma-4-E2B-it-ONNX — Alternative (2B Parameters, 128k Context)`,"onnx-community/gemma-4-E4B-it-ONNX":`onnx-community/gemma-4-E4B-it-ONNX — Alternative (4B Parameters, 128k Context)`};function c(e,t,n){if(n===`transformers_js_browser`){let n=o.indexOf(e.id),r=o.indexOf(t.id);return n!==-1&&r!==-1?n-r:n===-1?r===-1?e.id.localeCompare(t.id):1:-1}let r=a(e,n),i=a(t,n);return r===i?e.contextLength===t.contextLength?e.id.localeCompare(t.id):t.contextLength-e.contextLength:r-i}function l(t){let n=e.transformers_js_browser?.models||[],i=t&&t.length>0?t:n,a=/* @__PURE__ */ new Set;for(let e of i){let t=typeof e==`string`?e:e?.id||e?.name;t&&typeof t==`string`&&t.trim()&&a.add(t.trim())}for(let e of o)a.add(e);for(let e of n)a.add(e);return Array.from(a).sort((e,t)=>c({id:e,supportsTools:r(e),contextLength:0},{id:t,supportsTools:r(t),contextLength:0},`transformers_js_browser`))}function u(e,n,i){let a=l(n),o=``;for(let n=0;n<a.length;n++){let i=a[n],c=i===e?` selected`:``,l=s[i]||`${i}${r(i)?` 🛠️`:``}`;o+=`<option value="${t(i)}"${c}>${t(l)}</option>`,n===3&&a.length>4&&(o+=`<hr>`)}if(i?.includeCustom){let t=e===`__custom__`||e!==``&&!a.includes(e)?` selected`:``;o+=`<option value="__custom__"${t}>-- Custom Model ID --</option>`}return o}export{u as i,l as n,r,c as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./config-
|
|
1
|
+
import"./config-C16fFWtP.js";import{b as e,l as t,t as n,v as r}from"./orchestrator-Li1UAsv7.js";import{a as i,o as a,r as o,s,t as c}from"./get-group-dir-D--BiEyk.js";import{i as l,n as u,r as d}from"./write-group-file-R67DjJ-q.js";async function f(e,t,n,r,f){let g=r.replace(/\/$/,``),_=f.replace(/\/$/,``);if(t===n&&g===_)throw Error(`Source and target paths are identical`);let{dirs:v,filename:y}=u(g),{dirs:b,filename:x}=u(_);if(!y||!x)throw Error(`Invalid path`);for(let u=0;u<2;u++)try{let a=await c(e,t),s=await c(e,n),u=a;for(let e of v)u=await u.getDirectoryHandle(e);let f=s;for(let e of b)f=await f.getDirectoryHandle(e,{create:!0});if(await m(f,x)||await p(f,x))throw Error(`Target already exists: ${x}`);let g=await p(u,y);if(g){let t=await f.getDirectoryHandle(x,{create:!0}),r=n.replace(/:/g,`-`),i=[o(),`groups`,r,...b,x];try{await h(e,n,g,t,i)}catch(e){throw await f.removeEntry(x,{recursive:!0}).catch(()=>void 0),e}return}let _=await m(u,y);if(_){let t=await _.getFile(),r=await f.getFileHandle(x,{create:!0});try{await d(r,t)}catch(r){if(!((r instanceof Error?r.message:String(r)).includes(`Writable file streams are not supported`)&&(await i(e)).type===`opfs`))throw await f.removeEntry(x).catch(()=>void 0),r;let a=n.replace(/:/g,`-`);await l([o(),`groups`,a,...b,x],t)}return}throw Error(`Entry not found: ${r}`)}catch(e){if(u===0&&s(e)){a();continue}throw e}}async function p(e,t){try{return await e.getDirectoryHandle(t)}catch{return null}}async function m(e,t){try{return await e.getFileHandle(t)}catch{return null}}async function h(e,t,n,r,a){for await(let[o,s]of n.entries()){if(s.kind===`directory`){await h(e,t,s,await r.getDirectoryHandle(o,{create:!0}),[...a,o]);continue}let n=await s.getFile(),c=await r.getFileHandle(o,{create:!0});try{await d(c,n)}catch(t){if(!((t instanceof Error?t.message:String(t)).includes(`Writable file streams are not supported`)&&(await i(e)).type===`opfs`))throw t;await l([...a,o],n)}}}async function g(e,t,n){let r=n.replace(/\\/g,`/`).replace(/^\/home\/user\//,`/`).replace(/^\/+/,``).replace(/\/+$/,``).split(`/`).filter(Boolean);if(r.length===0)throw Error(`Empty directory path`);for(let n=0;n<2;n++)try{let n=await c(e,t);for(let e of r)n=await n.getDirectoryHandle(e,{create:!0});return}catch(e){if(n===0&&s(e)){a();continue}throw e}}async function _(i,a,o){let s=await c(i,a),{dirs:l,filename:d}=u(o),f=s;for(let e of l)f=await f.getDirectoryHandle(e);await f.removeEntry(d),a===`br:main`&&l.length===0&&(d===`MEMORY.md`?await r(i,!0):d===`index.html`&&await e(i,!0));try{await t(i,a,o)}catch{}try{await n.removePage(i,o,a)}catch{}}async function v(e,t,n,r,i){let a=r.replace(/\/$/,``),o=i.replace(/\/$/,``);if(t===n&&a===o)return;await f(e,t,n,a,o);let{dirs:s,filename:l}=u(a);if(!l)throw Error(`Invalid source path`);let d=await c(e,t);for(let e of s)d=await d.getDirectoryHandle(e);await d.removeEntry(l,{recursive:!0})}export{f as i,_ as n,g as r,v as t};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{u as e}from"./custom-element-security-kiDhPfb8.js";import{D as t,E as n,I as r,L as i,M as a,O as o,P as s,T as c,_ as l,g as u,j as d,l as f,o as p,r as m,s as h,t as g,v as _,w as v,z as y}from"./config-C-YdSFZB.js";import"./app-routes-V_-URXc5.js";import{n as b,r as x}from"./db-BUuJo1Gf.js";import{n as S}from"./tx-promise-DNVEN3Wa.js";import{t as C}from"./get-config-Bkvl__ZS.js";import{t as ee}from"./dist-CeFyqf9k.js";import{C as w,E as te,H as ne,Q as T,i as E,k as D,r as re,t as O,x as ie}from"./orchestrator-CaUpEVkQ.js";import{t as k}from"./set-config-DSiuMe0k.js";import{t as A}from"./ulid-BSJxYh6W.js";import{s as ae,t as j}from"./tools-DHA1dK2I.js";import{t as M}from"./get-or-create-subscriber-id-GvRZYXwA.js";import{r as oe}from"./get-group-dir-DL44kvqW.js";import{i as se,r as ce}from"./write-group-file-CmJuVQNO.js";import{t as N}from"./parse-boolean-config-BigJ9U46.js";import{S as P,a as le,b as F,i as ue,l as de,n as fe,r as pe,t as me}from"./provider-DNIL4-Hw.js";import{n as I,r as L}from"./crypto-4ETeplbS.js";import{t as he}from"./chat-template-DPHJy7tr.js";import{a as ge,i as _e,s as ve}from"./transformers-C-DuTM2K.js";import{a as ye}from"./push-client-DJEOz7bi.js";import{f as be,n as xe,t as Se,u as R}from"./channel-BylT3rJC.js";import{a as z,i as B,n as Ce,o as we,r as Te}from"./rooms-C6LXIJl4.js";import{i as Ee}from"./mime-ClqNyXPc.js";import{i as De,r as V,t as Oe}from"./peerjs-CgF4Iz5W.js";import{setWebMcpMode as ke,unregisterWebMcpTools as Ae}from"./webmcp-CMRtu57-.js";import{a as je,i as Me,p as Ne,r as Pe,t as Fe}from"./discover-skills-Cvmx5I9V.js";import{r as H}from"./sync-web-mcp-registration-BaH2nAP0.js";import{i as U,n as Ie,r as Le,t as Re}from"./system-prompt-Dck3N8T0.js";import{ensureControlPlaneConnected as ze}from"./init-control-plane-BoJijVtf.js";async function Be(e){if(e&&e.name!==`shadowclaw`){try{if(await C(e,m.DB_MIGRATED_FROM_LEGACY)===`true`)return}catch{}try{let t=await new Promise(e=>{let t=indexedDB.open(l);t.onsuccess=()=>{let n=t.result;!n.objectStoreNames||n.objectStoreNames.length===0?(n.close(),e(null)):e(n)},t.onerror=()=>e(null)});if(t){let n=Array.from(t.objectStoreNames).filter(t=>e.objectStoreNames.contains(t));for(let r of n)await new Promise(n=>{try{let i=t.transaction(r,`readonly`).objectStore(r).getAll();i.onsuccess=()=>{let t=i.result||[];if(t.length>0)try{let i=e.transaction(r,`readwrite`),a=i.objectStore(r);for(let e of t)a.put(e);i.oncomplete=()=>n(),i.onerror=()=>n(),i.onabort=()=>n()}catch{n()}else n()},i.onerror=()=>n()}catch{n()}});t.close()}}catch(e){console.warn(`Legacy IndexedDB migration warning:`,e)}finally{try{await k(e,m.DB_MIGRATED_FROM_LEGACY,`true`)}catch{}}}}async function W(e,t,n){for await(let[r,i]of e.entries())if(i.kind===`directory`)await W(i,await t.getDirectoryHandle(r,{create:!0}),[...n,r]);else if(i.kind===`file`){let e=await i.getFile(),a=await t.getFileHandle(r,{create:!0});try{await ce(a,e)}catch(t){if(!(t instanceof Error?t.message:String(t)).includes(`Writable file streams are not supported`))throw t;await se([...n,r],e)}}}async function Ve(e){if(!e)return;try{if(await C(e,m.OPFS_MIGRATED_FROM_LEGACY)===`true`)return}catch{}let t=oe();if(t!==`shadowclaw`&&typeof navigator<`u`&&navigator.storage&&typeof navigator.storage.getDirectory==`function`)try{let n=await navigator.storage.getDirectory(),r;try{r=await n.getDirectoryHandle(_)}catch{try{await k(e,m.OPFS_MIGRATED_FROM_LEGACY,`true`)}catch{}return}let i=await n.getDirectoryHandle(t,{create:!0});await W(r,i,[t])}catch(e){console.warn(`Legacy OPFS migration warning:`,e)}finally{try{await k(e,m.OPFS_MIGRATED_FROM_LEGACY,`true`)}catch{}}}function He(){return new Promise(async(e,t)=>{let n,r=d(),i=indexedDB.open(r,2);i.onupgradeneeded=()=>{let e=i.result;if(!e.objectStoreNames.contains(`messages`)){let t=e.createObjectStore(`messages`,{keyPath:`id`});t.createIndex(`by-group-time`,[`groupId`,`timestamp`]),t.createIndex(`by-group`,`groupId`)}if(e.objectStoreNames.contains(`sessions`)||e.createObjectStore(`sessions`,{keyPath:`groupId`}),!e.objectStoreNames.contains(`tasks`)){let t=e.createObjectStore(`tasks`,{keyPath:`id`});t.createIndex(`by-group`,`groupId`),t.createIndex(`by-enabled`,`enabled`)}e.objectStoreNames.contains(`config`)||e.createObjectStore(`config`,{keyPath:`key`}),e.objectStoreNames.contains(`pendingShares`)||e.createObjectStore(`pendingShares`,{keyPath:`id`}).createIndex(`by-createdAt`,`createdAt`)},i.onsuccess=async()=>{n=i.result,x(n);try{await Be(n),await Ve(n)}catch(e){console.warn(`Error running legacy migration:`,e)}e(n)},i.onerror=()=>{t(/* @__PURE__ */ Error(`Failed to open IndexedDB: ${i.error?.message}`))}})}var Ue=class{activeGroupId;displayCallback;messageCallback;type;typingCallback;constructor(){this.type=`browser`,this.messageCallback=null,this.typingCallback=null,this.displayCallback=null,this.activeGroupId=p}getActiveGroup(){return this.activeGroupId}onDisplay(e){this.displayCallback=e}onMessage(e){this.messageCallback=e}onTyping(e){this.typingCallback=e}setActiveGroup(e){this.activeGroupId=e}setTyping(e,t){this.typingCallback?.(e,t)}start(){}stop(){}submit(e,t,n=[],r,i,a){let o=t||this.activeGroupId,s={id:A(),groupId:o,sender:`You`,content:e,timestamp:Date.now(),channel:`browser`,attachments:n,a2uiAction:r,freshContext:i,subagent:a};this.messageCallback?.(s)}async send(e,t,n){this.displayCallback?.(e,t,!0)}},G=class{_entries;constructor(){this._entries=[]}find(e){return this.resolve(e)?.channel??null}get(e){return this._entries.find(t=>t.prefix===e)?.channel}getBadge(e){return this.resolve(e)?.badge??``}getChannelType(e){return this.resolve(e)?.channel.type??null}onMessage(e){for(let t of this._entries)t.channel.onMessage(e)}onTyping(e){for(let t of this._entries)t.channel.onTyping&&t.channel.onTyping(e)}prefixes(){return this._entries.map(e=>e.prefix)}register(e,t,n){let r=typeof n==`string`?{badge:n}:n??{};this._entries.push({prefix:e,channel:t,badge:r.badge??e.replace(/:$/,``),autoTrigger:r.autoTrigger??!1}),this._entries.sort((e,t)=>t.prefix.length-e.prefix.length)}resolve(e){for(let t of this._entries)if(e.startsWith(t.prefix))return t;return null}shouldAutoTrigger(e){return this.resolve(e)?.autoTrigger??!1}startAll(){for(let e of this._entries)e.channel.start()}stopAll(){for(let e of this._entries)e.channel.stop()}},We=class{abortController=null;apiKey=``;apiMode=`unknown`;cursor=null;fileReader=null;messageCallback=null;reconnectDelayMs=1e3;registeredChatIds=/* @__PURE__ */ new Set;running=!1;seenMessageIds=/* @__PURE__ */ new Map;serverUrl=``;type=`imessage`;configure(e,t,n){this.serverUrl=Ge(e),this.apiKey=t.trim(),this.registeredChatIds=new Set(n.map(e=>e.trim()).filter(Boolean)),this.cursor=null,this.apiMode=`unknown`}handleIncomingMessage(e){this.pruneSeenMessageIds();let t=String(e.chatId||e.conversationId||``).trim();if(!t||this.registeredChatIds.size>0&&!this.registeredChatIds.has(t))return;let n=`${e.text||e.body||``}`.trim();if(!n)return;let r=`${e.id||e.guid||`${t}:${e.timestamp||e.createdAt||n}`}`;if(this.seenMessageIds.has(r))return;this.seenMessageIds.set(r,Date.now());let i={id:r,groupId:`im:${t}`,sender:`${e.sender||e.handle||e.from||`iMessage`}`,content:n,timestamp:K(e.timestamp||e.createdAt),channel:`imessage`};this.messageCallback?.(i)}handlePollResponse(e){e.nextCursor!==void 0&&e.nextCursor!==null?this.cursor=String(e.nextCursor):e.cursor!==void 0&&e.cursor!==null&&(this.cursor=String(e.cursor));let t=Array.isArray(e.messages)?e.messages:[];for(let e of t)this.handleIncomingMessage(e)}isConfigured(){return this.serverUrl.length>0}onMessage(e){this.messageCallback=e}pruneSeenMessageIds(){let e=Date.now();for(let[t,n]of this.seenMessageIds.entries())e-n>6e4&&this.seenMessageIds.delete(t)}setTyping(e,t){if(!t)return;let n=e.replace(/^im:/,``);this.requestJson(`/messages/typing`,{method:`POST`,body:JSON.stringify({chatId:n,typing:!0})}).catch(()=>{})}start(){this.isConfigured()&&!this.running&&(this.running=!0,this.abortController=new AbortController,this.poll())}ensureConnected(){this.isConfigured()&&this.running&&(this.reconnectDelayMs=1e3,this.abortController?.abort(),this.abortController=new AbortController,this.poll())}stop(){this.running=!1,this.abortController?.abort(),this.abortController=null}async ensureApiMode(){if(this.apiMode!==`unknown`)return this.apiMode;try{await this.requestJson(`/v1/info`,{method:`GET`}),this.apiMode=`beeper-desktop`}catch{this.apiMode=`legacy`}return this.apiMode}async poll(){for(;this.running&&this.abortController&&!this.abortController.signal.aborted;)try{let e=new URLSearchParams({timeout:`25`});this.cursor&&e.set(`cursor`,this.cursor);let t=await this.requestJson(`/messages?${e.toString()}`,{method:`GET`},u+5e3,this.abortController.signal);this.reconnectDelayMs=1e3,this.handlePollResponse(t)}catch(e){if(e instanceof Error&&e.name===`AbortError`)break;console.error(`iMessage bridge poll error:`,e),await Ke(this.reconnectDelayMs),this.reconnectDelayMs=Math.min(this.reconnectDelayMs*2,3e4)}}async requestJson(e,t,n=u,r){let i=new AbortController,a=setTimeout(()=>i.abort(),n),o=()=>i.abort();r?.addEventListener(`abort`,o,{once:!0});try{let n=new Headers(t.headers);n.set(`Accept`,`application/json`),!n.has(`Content-Type`)&&t.body&&!(t.body instanceof FormData)&&n.set(`Content-Type`,`application/json`),this.apiKey&&(n.set(`Authorization`,`Bearer ${this.apiKey}`),n.set(`X-API-Key`,this.apiKey));let r=await fetch(`${this.serverUrl}${e}`,{...t,headers:n,signal:i.signal});if(!r.ok){let e=await r.text();throw Error(`iMessage bridge request failed: ${r.status} ${e}`)}return r.status===204?{messages:[]}:await r.json()}finally{clearTimeout(a),r?.removeEventListener(`abort`,o)}}async send(e,t,n){let r=e.replace(/^im:/,``),{remainingText:i,attachments:a}=qe(t);for(let t of a)if(!this.fileReader)await this.sendText(r,`[${t.alt}] (file: ${t.path})`);else try{let n=await this.fileReader(e,t.path);if(!n||n.size===0)throw Error(`Attachment file is empty or unavailable.`);await this.sendAttachment(r,n,t)}catch(e){console.warn(`iMessage attachment send failed for ${t.path}:`,e),await this.sendText(r,`[${t.alt}] (file: ${t.path})`)}let o=i.trim();o&&await this.sendText(r,o)}async sendAttachment(e,t,n){await this.ensureApiMode()===`beeper-desktop`?await this.sendAttachmentViaBeeperDesktop(e,t,n):await this.sendAttachmentViaLegacyBridge(e,t,n)}async sendAttachmentViaBeeperDesktop(e,t,n){let r=n.path.split(`/`).pop()||`attachment.bin`,i=new FormData;i.append(`file`,t,r),i.append(`fileName`,r),t.type&&i.append(`mimeType`,t.type);let a=`${(await this.requestJson(`/v1/assets/upload`,{method:`POST`,body:i})).uploadID||``}`.trim();if(!a)throw Error(`Beeper asset upload failed: missing uploadID`);await this.requestJson(`/v1/chats/${encodeURIComponent(e)}/messages`,{method:`POST`,body:JSON.stringify({text:n.alt||void 0,attachment:{uploadID:a,fileName:r,mimeType:t.type||void 0}})})}async sendAttachmentViaLegacyBridge(e,t,n){let r=n.path.split(`/`).pop()||`attachment.bin`,i=new FormData;i.append(`chatId`,e),n.alt&&i.append(`text`,n.alt),i.append(`file`,t,r),await this.requestJson(`/messages/send`,{method:`POST`,body:i})}async sendText(e,t){await this.ensureApiMode()===`beeper-desktop`?await this.requestJson(`/v1/chats/${encodeURIComponent(e)}/messages`,{method:`POST`,body:JSON.stringify({text:t})}):await this.requestJson(`/messages/send`,{method:`POST`,body:JSON.stringify({chatId:e,text:t})})}};function Ge(e){return e.trim().replace(/\/+$/,``)}function K(e){if(typeof e==`number`&&Number.isFinite(e))return e>0xe8d4a51000?e:e*1e3;if(typeof e==`string`){let t=Number(e);if(Number.isFinite(t))return K(t);let n=Date.parse(e);if(Number.isFinite(n))return n}return Date.now()}function Ke(e){return new Promise(t=>setTimeout(t,e))}function qe(e){let t=[],n=/!?\[([^\]]*)\]\(([^)]+)\)/g,r=null,i=e;for(;(r=n.exec(e))!==null;){let e=r[1]||``,n=Je((r[2]||``).trim());n&&(t.push({alt:e,path:n}),i=i.replace(r[0],``))}return{remainingText:i,attachments:t}}function Je(e){if(!e)return null;let t=e.trim();if(/^[a-zA-Z][a-zA-Z\d+.-]*:/.test(t)||t.startsWith(`//`))return null;let n=t.replace(/\\/g,`/`).replace(/^\/+/,``).replace(/^\.\//,``);if(!n)return null;let r=n.split(`/`).filter(Boolean);return r.some(e=>e===`..`)?null:r.join(`/`)}var Ye=class{messageCallback=null;running=!1;type=`room`;typingCallback=null;_manager=null;_peerjs=null;deliverInbound(e){this.messageCallback?.(e)}onMessage(e){this.messageCallback=e}onTyping(e){this.typingCallback=e}setManager(e){this._manager=e}setPeerJs(e){this._peerjs=e}setTyping(e,t){}start(){this.running=!0}stop(){this.running=!1}async send(e,t,n){if(!this._manager)return;let r=z(e);if(n&&n.length>0&&this._peerjs){let t=this._manager.get(r);t&&await this._peerjs.sendAttachmentsToRoom(t,e,n)}this._manager.broadcast(r,t,n)}};const q=1e3;var Xe=class{abortController=null;fileReader=null;messageCallback=null;offset=0;pollRetryDelayMs=q;pollSessionId=0;registeredChatIds=/* @__PURE__ */ new Set;running=!1;token=``;type=`telegram`;useProxy=!1;buildFileUrl(e){let t=e.split(`/`).filter(Boolean).map(e=>encodeURIComponent(e)).join(`/`);return`${this.useProxy?`/telegram/file/bot`:`https://api.telegram.org/file/bot`}${this.token}/${t}`}buildMethodUrl(e){let n=e.replace(/^\/+/,``);return`${this.useProxy?t:c}${this.token}/${n}`}configure(e,t,n=!1){this.token=e.trim(),this.registeredChatIds=new Set(t.map(e=>e.trim()).filter(Boolean)),this.useProxy=!!n}isConfigured(){return this.token.length>0}nextPollRetryDelay(){let e=this.pollRetryDelayMs;return this.pollRetryDelayMs=Math.min(this.pollRetryDelayMs*2,6e4),e}onMessage(e){this.messageCallback=e}registerChatId(e){let t=e.trim();t&&this.registeredChatIds.add(t)}resetPollBackoff(){this.pollRetryDelayMs=q}setTyping(e,t){if(!t)return;let n=e.replace(/^tg:/,``);this.apiCall(`sendChatAction`,{chat_id:n,action:`typing`}).catch(()=>{})}start(){if(!this.token||this.running)return;this.running=!0,this.resetPollBackoff();let e=++this.pollSessionId,t=new AbortController;this.abortController=t,this.poll(e,t)}ensureConnected(){if(!this.token||!this.running)return;this.resetPollBackoff(),this.abortController?.abort();let e=++this.pollSessionId,t=new AbortController;this.abortController=t,this.poll(e,t)}stop(){this.running=!1,this.resetPollBackoff(),this.pollSessionId+=1,this.abortController?.abort(),this.abortController=null}async apiCall(e,t){let n=await fetch(this.buildMethodUrl(e),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)});if(!n.ok){let t=await n.text();throw Error(`Telegram API ${e} failed: ${n.status} ${t}`)}return await n.json()}async extractAttachments(e){let t=[],n=Array.isArray(e.photo)?e.photo.at(-1):null;n?.file_id&&t.push({id:n.file_id,fileName:`photo-${e.message_id}.png`,mimeType:`image/png`,previewDisposition:`inline`}),e.document?.file_id&&t.push({id:e.document.file_id,fileName:e.document.file_name||`document-${e.message_id}`,mimeType:e.document.mime_type}),e.video?.file_id&&t.push({id:e.video.file_id,fileName:e.video.file_name||`video-${e.message_id}.mp4`,mimeType:e.video.mime_type||`video/mp4`}),e.audio?.file_id&&t.push({id:e.audio.file_id,fileName:e.audio.file_name||`audio-${e.message_id}.mp3`,mimeType:e.audio.mime_type||`audio/mpeg`}),e.voice?.file_id&&t.push({id:e.voice.file_id,fileName:`voice-${e.message_id}.ogg`,mimeType:e.voice.mime_type||`audio/ogg`}),e.animation?.file_id&&t.push({id:e.animation.file_id,fileName:e.animation.file_name||`animation-${e.message_id}.mp4`,mimeType:e.animation.mime_type||`video/mp4`}),e.sticker?.file_id&&t.push({id:e.sticker.file_id,fileName:`sticker-${e.message_id}.${$e(e.sticker)}`,mimeType:e.sticker.is_animated?`application/x-tgsticker`:e.sticker.is_video?`video/webm`:`image/webp`});let r=[];for(let e of t){let t=await this.fetchTelegramFileInfo(e.id);r.push({id:e.id,fileName:e.fileName,mimeType:e.mimeType,size:t.file_size,previewDisposition:e.previewDisposition,source:{kind:`remote-url`,url:this.buildFileUrl(t.file_path)}})}return r}async fetchTelegramFileInfo(e){let t=await this.apiCall(`getFile`,{file_id:e});if(!t.ok||!t.result?.file_path)throw Error(`Telegram getFile failed for attachment ${e}`);return t.result}async handleUpdate(e){let t=e.message;if(!t)return;let n=String(t.chat.id);if(t.text===`/chatid`){this.apiCall(`sendMessage`,{chat_id:n,text:`Chat ID: ${n}\nRegister this ID in ShadowClaw settings.`}).catch(console.error);return}if(t.text===`/ping`){this.apiCall(`sendMessage`,{chat_id:n,text:`Pong! ShadowClaw is running.`}).catch(console.error);return}if(!this.registeredChatIds.has(n))return;let r=await this.extractAttachments(t),i=`${t.text||t.caption||``}`.trim()||(t.photo?.length?`[Photo]`:null)||(t.voice?`[Voice message]`:null)||(t.video?`[Video]`:null)||(t.audio?`[Audio]`:null)||(t.animation?`[Animation]`:null)||(t.document?`[Document: ${t.document.file_name||`unnamed`}]`:null)||(t.sticker?`[Sticker: ${t.sticker.emoji||``}]`:null)||(t.location?`[Location: ${t.location.latitude}, ${t.location.longitude}]`:null)||(t.contact?`[Contact: ${t.contact.first_name}]`:null)||`[Unsupported message type]`,a=t.from?.first_name||t.from?.username||String(t.from?.id||`Unknown`),o={id:String(t.message_id),groupId:`tg:${n}`,sender:a,content:i,timestamp:t.date*1e3,channel:`telegram`,attachments:r};this.messageCallback?.(o)}async poll(e,t){for(;this.running&&this.pollSessionId===e&&!t.signal.aborted;)try{let e=await fetch(this.buildMethodUrl(`getUpdates?offset=${this.offset}&timeout=30`),{signal:t.signal});if(!e.ok){console.error(`Telegram poll error: HTTP ${e.status}`),await this.waitForRetry(this.nextPollRetryDelay());continue}let n=await e.json();if(!n.ok||!Array.isArray(n.result)){await this.waitForRetry(this.nextPollRetryDelay());continue}this.resetPollBackoff();for(let e of n.result)this.offset=e.update_id+1,await this.handleUpdate(e)}catch(e){if(e instanceof Error&&e.name===`AbortError`)break;console.error(`Telegram poll error:`,e),await this.waitForRetry(this.nextPollRetryDelay())}}async send(e,t,r){let i=e.replace(/^tg:/,``),{remainingText:a,attachments:o}=et(t);for(let t of o){if(this.fileReader)try{let n=await this.fileReader(e,t.path);if(n&&n.size>0){let e=t.path.toLowerCase();e.endsWith(`.png`)||e.endsWith(`.jpg`)||e.endsWith(`.jpeg`)||e.endsWith(`.gif`)||e.endsWith(`.webp`)?await this.sendPhoto(i,n,t.alt,t.path):await this.sendDocument(i,n,t.alt,t.path);continue}}catch(e){console.warn(`TelegramChannel: failed to read file ${t.path}:`,e)}await this.apiCall(`sendMessage`,{chat_id:i,text:`[${t.alt}] (file: ${t.path})`})}let s=a.trim();if(s){let e=Ze(s,n);for(let t of e)await this.apiCall(`sendMessage`,{chat_id:i,text:t})}}async sendDocument(e,t,n,r){let i=r.split(`/`).pop()||`document.file`,a=new FormData;a.append(`chat_id`,e),a.append(`document`,t,i),n&&a.append(`caption`,n);let o=await fetch(this.buildMethodUrl(`sendDocument`),{method:`POST`,body:a});if(!o.ok){let e=await o.text();throw Error(`Telegram sendDocument failed: ${o.status} ${e}`)}}async sendPhoto(e,t,n,r){let i=r.split(`/`).pop()||`image.png`,a=new FormData;a.append(`chat_id`,e),a.append(`photo`,t,i),n&&a.append(`caption`,n);let o=await fetch(this.buildMethodUrl(`sendPhoto`),{method:`POST`,body:a});if(!o.ok){let e=await o.text();throw Error(`Telegram sendPhoto failed: ${o.status} ${e}`)}}async waitForRetry(e){await Qe(e)}};function Ze(e,t){if(e.length<=t)return[e];let n=[],r=e;for(;r.length>0;){if(r.length<=t){n.push(r);break}let e=t,i=r.lastIndexOf(`
|
|
1
|
+
import{u as e}from"./custom-element-security-B2daIE5r.js";import{D as t,E as n,I as r,L as i,M as a,O as o,P as s,T as c,_ as l,et as u,g as d,j as f,l as p,o as m,r as h,s as g,t as _,v,w as y}from"./config-C16fFWtP.js";import{n as b,r as x}from"./db-BUuJo1Gf.js";import{n as S}from"./tx-promise-DNVEN3Wa.js";import{t as C}from"./get-config-Bkvl__ZS.js";import{t as ee}from"./dist-CeFyqf9k.js";import{C as w,E as te,H as ne,Q as T,i as E,k as D,r as re,t as O,x as ie}from"./orchestrator-Li1UAsv7.js";import{t as k}from"./set-config-DSiuMe0k.js";import{t as A}from"./ulid-BSJxYh6W.js";import{s as ae,t as j}from"./tools-D-52Zmfc.js";import{t as M}from"./get-or-create-subscriber-id-jVHnQfbr.js";import{r as oe}from"./get-group-dir-D--BiEyk.js";import{i as se,r as ce}from"./write-group-file-R67DjJ-q.js";import{t as N}from"./parse-boolean-config-BigJ9U46.js";import{S as P,a as le,b as F,i as ue,l as de,n as fe,r as pe,t as me}from"./provider-YPZmsuHR.js";import{n as I,r as L}from"./crypto-4ETeplbS.js";import{t as he}from"./chat-template-CXKs8lFR.js";import{a as ge,i as _e,s as ve}from"./transformers-CQ9ss9rD.js";import{a as ye}from"./push-client-DRx9Eggz.js";import{f as be,n as xe,t as Se,u as R}from"./channel-DIpDQekL.js";import{a as z,i as B,n as Ce,o as we,r as Te}from"./rooms-BurBI7is.js";import{i as Ee}from"./mime-ClqNyXPc.js";import{i as De,r as V,t as Oe}from"./peerjs-DbBryE-9.js";import{setWebMcpMode as ke,unregisterWebMcpTools as Ae}from"./webmcp-DIUZjVF5.js";import{a as je,i as Me,p as Ne,r as Pe,t as Fe}from"./discover-skills-BWJB8HUA.js";import{r as H}from"./sync-web-mcp-registration-DVK_IhXZ.js";import{i as U,n as Ie,r as Le,t as Re}from"./system-prompt-BmswoQwF.js";import{ensureControlPlaneConnected as ze}from"./init-control-plane-Ctz7FI8M.js";async function Be(e){if(e&&e.name!==`shadowclaw`){try{if(await C(e,h.DB_MIGRATED_FROM_LEGACY)===`true`)return}catch{}try{let t=await new Promise(e=>{let t=indexedDB.open(l);t.onsuccess=()=>{let n=t.result;!n.objectStoreNames||n.objectStoreNames.length===0?(n.close(),e(null)):e(n)},t.onerror=()=>e(null)});if(t){let n=Array.from(t.objectStoreNames).filter(t=>e.objectStoreNames.contains(t));for(let r of n)await new Promise(n=>{try{let i=t.transaction(r,`readonly`).objectStore(r).getAll();i.onsuccess=()=>{let t=i.result||[];if(t.length>0)try{let i=e.transaction(r,`readwrite`),a=i.objectStore(r);for(let e of t)a.put(e);i.oncomplete=()=>n(),i.onerror=()=>n(),i.onabort=()=>n()}catch{n()}else n()},i.onerror=()=>n()}catch{n()}});t.close()}}catch(e){console.warn(`Legacy IndexedDB migration warning:`,e)}finally{try{await k(e,h.DB_MIGRATED_FROM_LEGACY,`true`)}catch{}}}}async function W(e,t,n){for await(let[r,i]of e.entries())if(i.kind===`directory`)await W(i,await t.getDirectoryHandle(r,{create:!0}),[...n,r]);else if(i.kind===`file`){let e=await i.getFile(),a=await t.getFileHandle(r,{create:!0});try{await ce(a,e)}catch(t){if(!(t instanceof Error?t.message:String(t)).includes(`Writable file streams are not supported`))throw t;await se([...n,r],e)}}}async function Ve(e){if(!e)return;try{if(await C(e,h.OPFS_MIGRATED_FROM_LEGACY)===`true`)return}catch{}let t=oe();if(t!==`shadowclaw`&&typeof navigator<`u`&&navigator.storage&&typeof navigator.storage.getDirectory==`function`)try{let n=await navigator.storage.getDirectory(),r;try{r=await n.getDirectoryHandle(v)}catch{try{await k(e,h.OPFS_MIGRATED_FROM_LEGACY,`true`)}catch{}return}let i=await n.getDirectoryHandle(t,{create:!0});await W(r,i,[t])}catch(e){console.warn(`Legacy OPFS migration warning:`,e)}finally{try{await k(e,h.OPFS_MIGRATED_FROM_LEGACY,`true`)}catch{}}}function He(){return new Promise(async(e,t)=>{let n,r=f(),i=indexedDB.open(r,2);i.onupgradeneeded=()=>{let e=i.result;if(!e.objectStoreNames.contains(`messages`)){let t=e.createObjectStore(`messages`,{keyPath:`id`});t.createIndex(`by-group-time`,[`groupId`,`timestamp`]),t.createIndex(`by-group`,`groupId`)}if(e.objectStoreNames.contains(`sessions`)||e.createObjectStore(`sessions`,{keyPath:`groupId`}),!e.objectStoreNames.contains(`tasks`)){let t=e.createObjectStore(`tasks`,{keyPath:`id`});t.createIndex(`by-group`,`groupId`),t.createIndex(`by-enabled`,`enabled`)}e.objectStoreNames.contains(`config`)||e.createObjectStore(`config`,{keyPath:`key`}),e.objectStoreNames.contains(`pendingShares`)||e.createObjectStore(`pendingShares`,{keyPath:`id`}).createIndex(`by-createdAt`,`createdAt`)},i.onsuccess=async()=>{n=i.result,x(n);try{await Be(n),await Ve(n)}catch(e){console.warn(`Error running legacy migration:`,e)}e(n)},i.onerror=()=>{t(/* @__PURE__ */ Error(`Failed to open IndexedDB: ${i.error?.message}`))}})}var Ue=class{activeGroupId;displayCallback;messageCallback;type;typingCallback;constructor(){this.type=`browser`,this.messageCallback=null,this.typingCallback=null,this.displayCallback=null,this.activeGroupId=m}getActiveGroup(){return this.activeGroupId}onDisplay(e){this.displayCallback=e}onMessage(e){this.messageCallback=e}onTyping(e){this.typingCallback=e}setActiveGroup(e){this.activeGroupId=e}setTyping(e,t){this.typingCallback?.(e,t)}start(){}stop(){}submit(e,t,n=[],r,i,a){let o=t||this.activeGroupId,s={id:A(),groupId:o,sender:`You`,content:e,timestamp:Date.now(),channel:`browser`,attachments:n,a2uiAction:r,freshContext:i,subagent:a};this.messageCallback?.(s)}async send(e,t,n){this.displayCallback?.(e,t,!0)}},G=class{_entries;constructor(){this._entries=[]}find(e){return this.resolve(e)?.channel??null}get(e){return this._entries.find(t=>t.prefix===e)?.channel}getBadge(e){return this.resolve(e)?.badge??``}getChannelType(e){return this.resolve(e)?.channel.type??null}onMessage(e){for(let t of this._entries)t.channel.onMessage(e)}onTyping(e){for(let t of this._entries)t.channel.onTyping&&t.channel.onTyping(e)}prefixes(){return this._entries.map(e=>e.prefix)}register(e,t,n){let r=typeof n==`string`?{badge:n}:n??{};this._entries.push({prefix:e,channel:t,badge:r.badge??e.replace(/:$/,``),autoTrigger:r.autoTrigger??!1}),this._entries.sort((e,t)=>t.prefix.length-e.prefix.length)}resolve(e){for(let t of this._entries)if(e.startsWith(t.prefix))return t;return null}shouldAutoTrigger(e){return this.resolve(e)?.autoTrigger??!1}startAll(){for(let e of this._entries)e.channel.start()}stopAll(){for(let e of this._entries)e.channel.stop()}},We=class{abortController=null;apiKey=``;apiMode=`unknown`;cursor=null;fileReader=null;messageCallback=null;reconnectDelayMs=1e3;registeredChatIds=/* @__PURE__ */ new Set;running=!1;seenMessageIds=/* @__PURE__ */ new Map;serverUrl=``;type=`imessage`;configure(e,t,n){this.serverUrl=Ge(e),this.apiKey=t.trim(),this.registeredChatIds=new Set(n.map(e=>e.trim()).filter(Boolean)),this.cursor=null,this.apiMode=`unknown`}handleIncomingMessage(e){this.pruneSeenMessageIds();let t=String(e.chatId||e.conversationId||``).trim();if(!t||this.registeredChatIds.size>0&&!this.registeredChatIds.has(t))return;let n=`${e.text||e.body||``}`.trim();if(!n)return;let r=`${e.id||e.guid||`${t}:${e.timestamp||e.createdAt||n}`}`;if(this.seenMessageIds.has(r))return;this.seenMessageIds.set(r,Date.now());let i={id:r,groupId:`im:${t}`,sender:`${e.sender||e.handle||e.from||`iMessage`}`,content:n,timestamp:K(e.timestamp||e.createdAt),channel:`imessage`};this.messageCallback?.(i)}handlePollResponse(e){e.nextCursor!==void 0&&e.nextCursor!==null?this.cursor=String(e.nextCursor):e.cursor!==void 0&&e.cursor!==null&&(this.cursor=String(e.cursor));let t=Array.isArray(e.messages)?e.messages:[];for(let e of t)this.handleIncomingMessage(e)}isConfigured(){return this.serverUrl.length>0}onMessage(e){this.messageCallback=e}pruneSeenMessageIds(){let e=Date.now();for(let[t,n]of this.seenMessageIds.entries())e-n>6e4&&this.seenMessageIds.delete(t)}setTyping(e,t){if(!t)return;let n=e.replace(/^im:/,``);this.requestJson(`/messages/typing`,{method:`POST`,body:JSON.stringify({chatId:n,typing:!0})}).catch(()=>{})}start(){this.isConfigured()&&!this.running&&(this.running=!0,this.abortController=new AbortController,this.poll())}ensureConnected(){this.isConfigured()&&this.running&&(this.reconnectDelayMs=1e3,this.abortController?.abort(),this.abortController=new AbortController,this.poll())}stop(){this.running=!1,this.abortController?.abort(),this.abortController=null}async ensureApiMode(){if(this.apiMode!==`unknown`)return this.apiMode;try{await this.requestJson(`/v1/info`,{method:`GET`}),this.apiMode=`beeper-desktop`}catch{this.apiMode=`legacy`}return this.apiMode}async poll(){for(;this.running&&this.abortController&&!this.abortController.signal.aborted;)try{let e=new URLSearchParams({timeout:`25`});this.cursor&&e.set(`cursor`,this.cursor);let t=await this.requestJson(`/messages?${e.toString()}`,{method:`GET`},d+5e3,this.abortController.signal);this.reconnectDelayMs=1e3,this.handlePollResponse(t)}catch(e){if(e instanceof Error&&e.name===`AbortError`)break;console.error(`iMessage bridge poll error:`,e),await Ke(this.reconnectDelayMs),this.reconnectDelayMs=Math.min(this.reconnectDelayMs*2,3e4)}}async requestJson(e,t,n=d,r){let i=new AbortController,a=setTimeout(()=>i.abort(),n),o=()=>i.abort();r?.addEventListener(`abort`,o,{once:!0});try{let n=new Headers(t.headers);n.set(`Accept`,`application/json`),!n.has(`Content-Type`)&&t.body&&!(t.body instanceof FormData)&&n.set(`Content-Type`,`application/json`),this.apiKey&&(n.set(`Authorization`,`Bearer ${this.apiKey}`),n.set(`X-API-Key`,this.apiKey));let r=await fetch(`${this.serverUrl}${e}`,{...t,headers:n,signal:i.signal});if(!r.ok){let e=await r.text();throw Error(`iMessage bridge request failed: ${r.status} ${e}`)}return r.status===204?{messages:[]}:await r.json()}finally{clearTimeout(a),r?.removeEventListener(`abort`,o)}}async send(e,t,n){let r=e.replace(/^im:/,``),{remainingText:i,attachments:a}=qe(t);for(let t of a)if(!this.fileReader)await this.sendText(r,`[${t.alt}] (file: ${t.path})`);else try{let n=await this.fileReader(e,t.path);if(!n||n.size===0)throw Error(`Attachment file is empty or unavailable.`);await this.sendAttachment(r,n,t)}catch(e){console.warn(`iMessage attachment send failed for ${t.path}:`,e),await this.sendText(r,`[${t.alt}] (file: ${t.path})`)}let o=i.trim();o&&await this.sendText(r,o)}async sendAttachment(e,t,n){await this.ensureApiMode()===`beeper-desktop`?await this.sendAttachmentViaBeeperDesktop(e,t,n):await this.sendAttachmentViaLegacyBridge(e,t,n)}async sendAttachmentViaBeeperDesktop(e,t,n){let r=n.path.split(`/`).pop()||`attachment.bin`,i=new FormData;i.append(`file`,t,r),i.append(`fileName`,r),t.type&&i.append(`mimeType`,t.type);let a=`${(await this.requestJson(`/v1/assets/upload`,{method:`POST`,body:i})).uploadID||``}`.trim();if(!a)throw Error(`Beeper asset upload failed: missing uploadID`);await this.requestJson(`/v1/chats/${encodeURIComponent(e)}/messages`,{method:`POST`,body:JSON.stringify({text:n.alt||void 0,attachment:{uploadID:a,fileName:r,mimeType:t.type||void 0}})})}async sendAttachmentViaLegacyBridge(e,t,n){let r=n.path.split(`/`).pop()||`attachment.bin`,i=new FormData;i.append(`chatId`,e),n.alt&&i.append(`text`,n.alt),i.append(`file`,t,r),await this.requestJson(`/messages/send`,{method:`POST`,body:i})}async sendText(e,t){await this.ensureApiMode()===`beeper-desktop`?await this.requestJson(`/v1/chats/${encodeURIComponent(e)}/messages`,{method:`POST`,body:JSON.stringify({text:t})}):await this.requestJson(`/messages/send`,{method:`POST`,body:JSON.stringify({chatId:e,text:t})})}};function Ge(e){return e.trim().replace(/\/+$/,``)}function K(e){if(typeof e==`number`&&Number.isFinite(e))return e>0xe8d4a51000?e:e*1e3;if(typeof e==`string`){let t=Number(e);if(Number.isFinite(t))return K(t);let n=Date.parse(e);if(Number.isFinite(n))return n}return Date.now()}function Ke(e){return new Promise(t=>setTimeout(t,e))}function qe(e){let t=[],n=/!?\[([^\]]*)\]\(([^)]+)\)/g,r=null,i=e;for(;(r=n.exec(e))!==null;){let e=r[1]||``,n=Je((r[2]||``).trim());n&&(t.push({alt:e,path:n}),i=i.replace(r[0],``))}return{remainingText:i,attachments:t}}function Je(e){if(!e)return null;let t=e.trim();if(/^[a-zA-Z][a-zA-Z\d+.-]*:/.test(t)||t.startsWith(`//`))return null;let n=t.replace(/\\/g,`/`).replace(/^\/+/,``).replace(/^\.\//,``);if(!n)return null;let r=n.split(`/`).filter(Boolean);return r.some(e=>e===`..`)?null:r.join(`/`)}var Ye=class{messageCallback=null;running=!1;type=`room`;typingCallback=null;_manager=null;_peerjs=null;deliverInbound(e){this.messageCallback?.(e)}onMessage(e){this.messageCallback=e}onTyping(e){this.typingCallback=e}setManager(e){this._manager=e}setPeerJs(e){this._peerjs=e}setTyping(e,t){}start(){this.running=!0}stop(){this.running=!1}async send(e,t,n){if(!this._manager)return;let r=z(e);if(n&&n.length>0&&this._peerjs){let t=this._manager.get(r);t&&await this._peerjs.sendAttachmentsToRoom(t,e,n)}this._manager.broadcast(r,t,n)}};const q=1e3;var Xe=class{abortController=null;fileReader=null;messageCallback=null;offset=0;pollRetryDelayMs=q;pollSessionId=0;registeredChatIds=/* @__PURE__ */ new Set;running=!1;token=``;type=`telegram`;useProxy=!1;buildFileUrl(e){let t=e.split(`/`).filter(Boolean).map(e=>encodeURIComponent(e)).join(`/`);return`${this.useProxy?`/telegram/file/bot`:`https://api.telegram.org/file/bot`}${this.token}/${t}`}buildMethodUrl(e){let n=e.replace(/^\/+/,``);return`${this.useProxy?t:c}${this.token}/${n}`}configure(e,t,n=!1){this.token=e.trim(),this.registeredChatIds=new Set(t.map(e=>e.trim()).filter(Boolean)),this.useProxy=!!n}isConfigured(){return this.token.length>0}nextPollRetryDelay(){let e=this.pollRetryDelayMs;return this.pollRetryDelayMs=Math.min(this.pollRetryDelayMs*2,6e4),e}onMessage(e){this.messageCallback=e}registerChatId(e){let t=e.trim();t&&this.registeredChatIds.add(t)}resetPollBackoff(){this.pollRetryDelayMs=q}setTyping(e,t){if(!t)return;let n=e.replace(/^tg:/,``);this.apiCall(`sendChatAction`,{chat_id:n,action:`typing`}).catch(()=>{})}start(){if(!this.token||this.running)return;this.running=!0,this.resetPollBackoff();let e=++this.pollSessionId,t=new AbortController;this.abortController=t,this.poll(e,t)}ensureConnected(){if(!this.token||!this.running)return;this.resetPollBackoff(),this.abortController?.abort();let e=++this.pollSessionId,t=new AbortController;this.abortController=t,this.poll(e,t)}stop(){this.running=!1,this.resetPollBackoff(),this.pollSessionId+=1,this.abortController?.abort(),this.abortController=null}async apiCall(e,t){let n=await fetch(this.buildMethodUrl(e),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)});if(!n.ok){let t=await n.text();throw Error(`Telegram API ${e} failed: ${n.status} ${t}`)}return await n.json()}async extractAttachments(e){let t=[],n=Array.isArray(e.photo)?e.photo.at(-1):null;n?.file_id&&t.push({id:n.file_id,fileName:`photo-${e.message_id}.png`,mimeType:`image/png`,previewDisposition:`inline`}),e.document?.file_id&&t.push({id:e.document.file_id,fileName:e.document.file_name||`document-${e.message_id}`,mimeType:e.document.mime_type}),e.video?.file_id&&t.push({id:e.video.file_id,fileName:e.video.file_name||`video-${e.message_id}.mp4`,mimeType:e.video.mime_type||`video/mp4`}),e.audio?.file_id&&t.push({id:e.audio.file_id,fileName:e.audio.file_name||`audio-${e.message_id}.mp3`,mimeType:e.audio.mime_type||`audio/mpeg`}),e.voice?.file_id&&t.push({id:e.voice.file_id,fileName:`voice-${e.message_id}.ogg`,mimeType:e.voice.mime_type||`audio/ogg`}),e.animation?.file_id&&t.push({id:e.animation.file_id,fileName:e.animation.file_name||`animation-${e.message_id}.mp4`,mimeType:e.animation.mime_type||`video/mp4`}),e.sticker?.file_id&&t.push({id:e.sticker.file_id,fileName:`sticker-${e.message_id}.${$e(e.sticker)}`,mimeType:e.sticker.is_animated?`application/x-tgsticker`:e.sticker.is_video?`video/webm`:`image/webp`});let r=[];for(let e of t){let t=await this.fetchTelegramFileInfo(e.id);r.push({id:e.id,fileName:e.fileName,mimeType:e.mimeType,size:t.file_size,previewDisposition:e.previewDisposition,source:{kind:`remote-url`,url:this.buildFileUrl(t.file_path)}})}return r}async fetchTelegramFileInfo(e){let t=await this.apiCall(`getFile`,{file_id:e});if(!t.ok||!t.result?.file_path)throw Error(`Telegram getFile failed for attachment ${e}`);return t.result}async handleUpdate(e){let t=e.message;if(!t)return;let n=String(t.chat.id);if(t.text===`/chatid`){this.apiCall(`sendMessage`,{chat_id:n,text:`Chat ID: ${n}\nRegister this ID in ShadowClaw settings.`}).catch(console.error);return}if(t.text===`/ping`){this.apiCall(`sendMessage`,{chat_id:n,text:`Pong! ShadowClaw is running.`}).catch(console.error);return}if(!this.registeredChatIds.has(n))return;let r=await this.extractAttachments(t),i=`${t.text||t.caption||``}`.trim()||(t.photo?.length?`[Photo]`:null)||(t.voice?`[Voice message]`:null)||(t.video?`[Video]`:null)||(t.audio?`[Audio]`:null)||(t.animation?`[Animation]`:null)||(t.document?`[Document: ${t.document.file_name||`unnamed`}]`:null)||(t.sticker?`[Sticker: ${t.sticker.emoji||``}]`:null)||(t.location?`[Location: ${t.location.latitude}, ${t.location.longitude}]`:null)||(t.contact?`[Contact: ${t.contact.first_name}]`:null)||`[Unsupported message type]`,a=t.from?.first_name||t.from?.username||String(t.from?.id||`Unknown`),o={id:String(t.message_id),groupId:`tg:${n}`,sender:a,content:i,timestamp:t.date*1e3,channel:`telegram`,attachments:r};this.messageCallback?.(o)}async poll(e,t){for(;this.running&&this.pollSessionId===e&&!t.signal.aborted;)try{let e=await fetch(this.buildMethodUrl(`getUpdates?offset=${this.offset}&timeout=30`),{signal:t.signal});if(!e.ok){console.error(`Telegram poll error: HTTP ${e.status}`),await this.waitForRetry(this.nextPollRetryDelay());continue}let n=await e.json();if(!n.ok||!Array.isArray(n.result)){await this.waitForRetry(this.nextPollRetryDelay());continue}this.resetPollBackoff();for(let e of n.result)this.offset=e.update_id+1,await this.handleUpdate(e)}catch(e){if(e instanceof Error&&e.name===`AbortError`)break;console.error(`Telegram poll error:`,e),await this.waitForRetry(this.nextPollRetryDelay())}}async send(e,t,r){let i=e.replace(/^tg:/,``),{remainingText:a,attachments:o}=et(t);for(let t of o){if(this.fileReader)try{let n=await this.fileReader(e,t.path);if(n&&n.size>0){let e=t.path.toLowerCase();e.endsWith(`.png`)||e.endsWith(`.jpg`)||e.endsWith(`.jpeg`)||e.endsWith(`.gif`)||e.endsWith(`.webp`)?await this.sendPhoto(i,n,t.alt,t.path):await this.sendDocument(i,n,t.alt,t.path);continue}}catch(e){console.warn(`TelegramChannel: failed to read file ${t.path}:`,e)}await this.apiCall(`sendMessage`,{chat_id:i,text:`[${t.alt}] (file: ${t.path})`})}let s=a.trim();if(s){let e=Ze(s,n);for(let t of e)await this.apiCall(`sendMessage`,{chat_id:i,text:t})}}async sendDocument(e,t,n,r){let i=r.split(`/`).pop()||`document.file`,a=new FormData;a.append(`chat_id`,e),a.append(`document`,t,i),n&&a.append(`caption`,n);let o=await fetch(this.buildMethodUrl(`sendDocument`),{method:`POST`,body:a});if(!o.ok){let e=await o.text();throw Error(`Telegram sendDocument failed: ${o.status} ${e}`)}}async sendPhoto(e,t,n,r){let i=r.split(`/`).pop()||`image.png`,a=new FormData;a.append(`chat_id`,e),a.append(`photo`,t,i),n&&a.append(`caption`,n);let o=await fetch(this.buildMethodUrl(`sendPhoto`),{method:`POST`,body:a});if(!o.ok){let e=await o.text();throw Error(`Telegram sendPhoto failed: ${o.status} ${e}`)}}async waitForRetry(e){await Qe(e)}};function Ze(e,t){if(e.length<=t)return[e];let n=[],r=e;for(;r.length>0;){if(r.length<=t){n.push(r);break}let e=t,i=r.lastIndexOf(`
|
|
2
2
|
`,t);i>t*.5&&(e=i),n.push(r.slice(0,e)),r=r.slice(e)}return n}function Qe(e){return new Promise(t=>setTimeout(t,e))}function $e(e){return e?.is_animated?`tgs`:e?.is_video?`webm`:`webp`}function et(e){let t=[],n=/!?\[([^\]]*)\]\(([^)]+)\)/g,r,i=e;for(;(r=n.exec(e))!==null;){let e=r[1],n=tt((r[2]||``).trim());n&&(t.push({alt:e,path:n}),i=i.replace(r[0],``))}return{remainingText:i,attachments:t}}function tt(e){if(!e)return null;let t=e.trim();if(/^[a-zA-Z][a-zA-Z\d+.-]*:/.test(t)||t.startsWith(`//`))return null;let n=t.replace(/\\/g,`/`).replace(/^\/+/,``).replace(/^\.\//,``);if(!n)return null;let r=n.split(`/`).filter(Boolean);return r.some(e=>e===`..`)?null:r.join(`/`)}function J(e,t){let n=JSON.stringify(e.dataModel??{},null,2),r=t?`${t}`:`The user`;return`[A2UI ACTION]\nsurfaceId: "${e.surfaceId}"\nactionId: "${e.actionId}"\n`+(t?`firedBy: "${t}"\n`:``)+`dataModel:\n${n}\n\nInstructions: ${r} triggered the "${e.actionId}" action on surface "${e.surfaceId}". The dataModel above contains the current form values. Use the appropriate tool(s) to fulfill the action based on the actionId and dataModel values. After you have a result, call render_component with action "updateDataModel" on surfaceId "${e.surfaceId}" to update the surface (e.g. set path "/result" to the output value). Do NOT respond with plain text only — always update the surface via render_component.`}var nt=class{static formatMessagesXml(e){let t=e=>e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`);return`<messages>\n${e.map(e=>`<message sender="${t(e.sender)}" time="${new Date(e.timestamp).toISOString()}">${t(e.content)}</message>`).join(`
|
|
3
|
-
`)}\n</messages>`}static formatOutbound(e){return e.replace(/<internal>[\s\S]*?<\/internal>/g,``).trim()}registry;constructor(e){this.registry=e}findChannel(e){return this.registry.find(e)}setTyping(e,t){this.findChannel(e)?.setTyping(e,t)}async send(e,t,n){let r=this.findChannel(e);r?await r.send(e,t,n):console.warn(`No channel for groupId: ${e}`)}};function rt(e,t,n){if(!e.enabledChannelTypes.includes(n.channel))return null;let r=n.content.trim(),i=t.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`),a=r;if(e.requireMention){let e=RegExp(`^@${i}\\b\\s*(?:-|:)?\\s*`,`i`);if(!e.test(a))return null;a=a.replace(e,``).trim()}let o=a.match(/^\/([a-zA-Z0-9_]+)(?:\s+([\s\S]+))?$/);if(!o)return null;let s=o[1];if(!e.allowedTools.includes(s))return null;let c=(o[2]||``).trim();if(!c)return{toolName:s,input:{}};let l=c.startsWith(`'`)&&c.endsWith(`'`)||c.startsWith(`"`)&&c.endsWith(`"`)?c.slice(1,-1).trim():c;try{let e=JSON.parse(l);return e&&typeof e==`object`?{toolName:s,input:e}:null}catch{return null}}function it(e,t){let n=e.trim().match(/^\/([a-z0-9](?:[a-z0-9]|-(?!-))*[a-z0-9]|[a-z0-9])(?:\s+([\s\S]+))?$/u);if(!n)return null;let r=t.find(e=>e.name===n[1]&&e.userInvocable!==!1);return r?{skill:r,arguments:(n[2]||``).trim()}:null}async function Y(e,t,n){if(n.a2uiEnvelopes&&n.a2uiEnvelopes.length>0)for(let t of n.a2uiEnvelopes)e.events.emit(`a2ui-surface`,{groupId:n.groupId,envelope:t});n.a2uiAction&&e.events.emit(`a2ui-action`,{groupId:n.groupId,action:n.a2uiAction});let r=!!n.content,i=(n.attachments?.length??0)>0;if(!r&&!i&&(n.a2uiEnvelopes?.length??0)>0)return;let a=rt(e.directToolCommandPolicy,e.assistantName,n),o=a?null:it(n.content,(await Fe(t,n.groupId)).skills),s=n.channel===`browser`,c=e.channelRegistry.shouldAutoTrigger(n.groupId),l=!1;(n.channel===`browser`||n.groupId.startsWith(`room:`))&&(l=e.triggerPattern.test(n.content.trim())),o&&(l=!0),s&&n.groupId.startsWith(`peer:`)&&e.peerCompletedContexts.delete(n.groupId);let u=!!a;if(!l&&e.peerjsMyPeerId){if(n.content.includes(`@${e.peerjsMyPeerId}`))l=!0;else if(e.peerjsMyAlias&&n.content.includes(`@${e.peerjsMyAlias}`))l=!0;else for(let[t,r]of Object.entries(e.peerjsPeerAliases))if(r===e.peerjsMyPeerId&&n.content.includes(`@${t}`)){l=!0;break}}n.content.trim().startsWith(`[SCHEDULED TASK]`)&&(l=!0),n.content.trim().startsWith(`[A2UI ACTION]`)&&(l=!0);let d=!1;d=u||l?!0:s?!(n.groupId.startsWith(`peer:`)||n.groupId.startsWith(`room:`)):c,d&&!s&&!o&&n.groupId.startsWith(`peer:`)&&e.peerCompletedContexts.has(n.groupId)&&(d=!1);let f=await De(t,n.groupId,n.attachments||[]),p={...n,attachments:f,isFromMe:!1,isTrigger:d};if(d&&!u&&!o?.skill.execution&&e.messageQueue.push(o?{...n,content:`[SKILL COMMAND] Activate the "${o.skill.name}" skill and follow its instructions.\n${o.arguments}`}:n),await w(t,p),e.events.emit(`message`,p),o?.skill.execution){if(await e.ensureWorkerReady?.(),!e.agentWorker)throw Error(`Worker is not initialized.`);let t=o.skill.execution.tools.map(e=>{let t=e.input&&typeof e.input==`object`?{...e.input}:{};return o.arguments&&Object.keys(t).length===0&&(t.rawInput=o.arguments),{...e,input:t}});e.agentWorker.postMessage({type:`execute-skill-tools`,payload:{groupId:n.groupId,skillName:o.skill.name,tools:t}})}else if(n.channel===`peerjs`&&xe(n.groupId),s&&(n.groupId.startsWith(`peer:`)||n.groupId.startsWith(`room:`))&&e.router?.send(n.groupId,n.content,f).catch(e=>{console.error(`Failed to route browser message to peer:`,e)}),a){if(await e.ensureWorkerReady?.(),!e.agentWorker)throw Error(`Worker is not initialized.`);e.agentWorker.postMessage({type:`execute-direct-tool`,payload:{groupId:n.groupId,name:a.toolName,input:a.input}})}else X(e,t)}async function X(e,t){if(e.processing||e.messageQueue.length===0)return;let n=e.messageQueue[0]?.groupId,i=e.providerConfig,a=e.provider;if(n)try{let e=(await te(t)).find(e=>e.groupId===n);if(e?.pinnedProvider){let t=r(e.pinnedProvider);t&&(i=t,a=e.pinnedProvider)}}catch{}let o=i?.requiresApiKey!==!1,s=!0;if(o&&(s=a===e.provider?!!await le(e):!!await e.getApiKeyForSpecificProvider(t,a)),o&&!s){let t=`API key not configured. Go to Settings to add your API key.`;e.events.emit(`provider-help`,{providerId:a,reason:t,helpType:_e(a,t,o)});let n=e.messageQueue.shift();e.events.emit(`error`,{groupId:n.groupId,error:t});return}e.processing=!0;let c=e.messageQueue.shift();try{let{invokeAgent:n}=await import(`./invoke-agent-B3Osw6K7.js`);await n(e,t,c.groupId,c.content,c.freshContext,c.subagent)}catch(e){console.error(`Failed to invoke agent:`,e)}finally{e.processing=!1,e.messageQueue.length>0&&X(e,t)}}var at=class{listeners;constructor(){this.listeners=/* @__PURE__ */ new Map}emit(e,t){this.listeners.get(e)?.forEach(e=>e(t))}off(e,t){this.listeners.get(e)?.delete(t)}on(e,t){this.listeners.has(e)||this.listeners.set(e,/* @__PURE__ */ new Set),this.listeners.get(e)?.add(t)}};function Z(e,t){return{jsonrpc:`2.0`,method:e,params:t}}var ot=class{static isRoomMethod(e){return e===V.JOIN||e===V.ROSTER||e===V.LEAVE||e===V.MESSAGE||e===V.INVITE||e===V.RELAY||e===V.A2UI||e===V.A2UI_ACTION}roomsSignal=new ee.State([]);_opts;_rooms=/* @__PURE__ */ new Map;_seen=/* @__PURE__ */ new Map;_surfaceOwners=/* @__PURE__ */ new Map;constructor(e){this._opts=e}broadcast(e,t,n){let r=this._rooms.get(e);if(!r)return null;let i=this._opts.getLocalMember(),a=A(),o={roomId:e,messageId:a,senderPeerId:i.peerId,senderAlias:i.alias,text:t,attachments:n?.map(e=>({fileName:e.fileName,mimeType:e.mimeType,path:e.path,size:e.size}))};return this._markSeen(e,a),this._deliverToMembers(r,Z(V.MESSAGE,o)),a}broadcastA2UI(e,t){let n=this._rooms.get(e);if(!n)return null;let r=this._myPeerId;this._surfaceOwners.set(t.surfaceId,r);let i=A(),a={roomId:e,broadcastId:i,ownerPeerId:r,senderPeerId:r,envelope:t};return this._markSeen(e,i),this._deliverToMembers(n,Z(V.A2UI,a)),i}broadcastA2UIAction(e,t){let n=this._rooms.get(e);if(!n)return null;let r=this._opts.getLocalMember(),i=this._surfaceOwners.get(t.surfaceId)??``,a=A(),o={roomId:e,broadcastId:a,ownerPeerId:i,senderPeerId:r.peerId,senderAlias:r.alias,action:t};return this._markSeen(e,a),this._deliverToMembers(n,Z(V.A2UI_ACTION,o)),a}createRoom(e){let t=this._opts.getLocalMember(),n={roomId:A(),name:e,hostPeerId:t.peerId,members:[t],createdAt:Date.now()};return this._save(n),n}get(e){return this._rooms.get(e)??null}getSurfaceOwner(e){return this._surfaceOwners.get(e)}handleNotification(e,t,n){switch(t){case V.JOIN:this._onJoin(e,n);break;case V.ROSTER:this._onRoster(n);break;case V.LEAVE:this._onLeave(e,n);break;case V.MESSAGE:this._onMessage(n);break;case V.INVITE:this._opts.onInvite?.(n);break;case V.RELAY:this._onRelay(n);break;case V.A2UI:this._onA2UI(n);break;case V.A2UI_ACTION:this._onA2UIAction(n)}}invite(e,t){let n=this._rooms.get(e);if(!n)return!1;let r=this._opts.getLocalMember(),i={roomId:e,roomName:n.name,hostPeerId:n.hostPeerId,fromPeerId:r.peerId,fromAlias:r.alias},a=this._opts.transport;return a.connectToPeer(t),a.sendToPeer(t,Z(V.INVITE,i))}isHost(e){let t=this._rooms.get(e);return!!t&&t.hostPeerId===this._myPeerId}joinRoom(e,t,n){let r=this._opts.getLocalMember(),i=this._rooms.get(e)??{roomId:e,name:n,hostPeerId:t,members:[{peerId:t,alias:t,kind:`agent`},r],createdAt:Date.now()};this._save(i);let a=this._opts.transport;a.connectToPeer(t);let o={roomId:e,member:r};return a.sendToPeer(t,Z(V.JOIN,o)),i}leaveRoom(e){let t=this._rooms.get(e);if(!t)return;let n=this._myPeerId;if(t.hostPeerId===n){let r={roomId:e,peerId:n,disbanded:!0};this._deliverToMembers(t,Z(V.LEAVE,r))}else{let r={roomId:e,peerId:n};this._opts.transport.sendToPeer(t.hostPeerId,Z(V.LEAVE,r))}this._rooms.delete(e),this._seen.delete(e),this._opts.removeRoom?.(e),this._publish()}list(){return Array.from(this._rooms.values())}loadRooms(e){this._rooms.clear();for(let t of e)this._rooms.set(t.roomId,t);this._publish()}_broadcastRoster(e){let t={roomId:e.roomId,name:e.name,hostPeerId:e.hostPeerId,members:e.members};this._deliverToMembers(e,Z(V.ROSTER,t))}_deliverToMembers(e,t){let n=this._myPeerId;for(let r of e.members)r.peerId!==n&&this._deliverToPeer(e,r.peerId,t)}_deliverToPeer(e,t,n){let r=this._opts.transport;if(r.isConnected(t)){r.sendToPeer(t,n);return}let i=this._myPeerId;if(e.hostPeerId!==i&&e.hostPeerId!==t&&r.isConnected(e.hostPeerId)){let i={roomId:e.roomId,targetPeerId:t,inner:n};r.sendToPeer(e.hostPeerId,Z(V.RELAY,i)),r.connectToPeer(t)}else r.connectToPeer(t),r.sendToPeer(t,n)}_hasSeen(e,t){return this._seen.get(e)?.has(t)??!1}_markSeen(e,t){let n=this._seen.get(e);if(n||(n=/* @__PURE__ */ new Set,this._seen.set(e,n)),n.add(t),n.size>500){let e=n.values().next().value;e!==void 0&&n.delete(e)}}get _myPeerId(){return this._opts.transport.myPeerId}_onA2UI(e){if(!e||typeof e.roomId!=`string`||typeof e.broadcastId!=`string`||!e.envelope||!this._rooms.get(e.roomId)||this._hasSeen(e.roomId,e.broadcastId))return;this._markSeen(e.roomId,e.broadcastId);let t=e.envelope.surfaceId;this._surfaceOwners.get(t)!==this._myPeerId&&this._surfaceOwners.set(t,e.ownerPeerId);let n={id:e.broadcastId,groupId:B(e.roomId),sender:e.senderPeerId,content:``,timestamp:Date.now(),channel:`room`,a2uiEnvelopes:[e.envelope]};this._opts.onMessage(n)}_onA2UIAction(e){if(!e||typeof e.roomId!=`string`||typeof e.broadcastId!=`string`||!e.action||!this._rooms.get(e.roomId)||this._hasSeen(e.roomId,e.broadcastId)||(this._markSeen(e.roomId,e.broadcastId),this._surfaceOwners.get(e.action.surfaceId)!==this._myPeerId))return;let t={id:e.broadcastId,groupId:B(e.roomId),sender:e.senderAlias||e.senderPeerId,content:J(e.action,e.senderAlias),timestamp:Date.now(),channel:`room`,a2uiAction:e.action};this._opts.onMessage(t)}_onJoin(e,t){if(!t||typeof t.roomId!=`string`)return;let n=this._rooms.get(t.roomId);if(!n||n.hostPeerId!==this._myPeerId)return;let r=t.member??{peerId:e,alias:e,kind:`human`};r.peerId=e;let i=n.members.findIndex(t=>t.peerId===e);i>=0?n.members[i]=r:n.members.push(r),this._save(n),this._broadcastRoster(n)}_onLeave(e,t){if(!t||typeof t.roomId!=`string`)return;let n=this._rooms.get(t.roomId);n&&(t.disbanded?(this._rooms.delete(t.roomId),this._seen.delete(t.roomId),this._opts.removeRoom?.(t.roomId),this._publish()):n.hostPeerId===this._myPeerId&&(n.members=n.members.filter(n=>n.peerId!==(t.peerId||e)),this._save(n),this._broadcastRoster(n)))}_onMessage(e){if(!e||typeof e.roomId!=`string`||typeof e.messageId!=`string`||!this._rooms.get(e.roomId)||this._hasSeen(e.roomId,e.messageId))return;this._markSeen(e.roomId,e.messageId);let t={id:e.messageId,groupId:B(e.roomId),sender:e.senderAlias||e.senderPeerId,content:e.text??``,timestamp:Date.now(),channel:`room`,attachments:e.attachments?.map(e=>({fileName:e.fileName,mimeType:e.mimeType,path:e.path,size:e.size}))};this._opts.onMessage(t)}_onRelay(e){e&&typeof e.targetPeerId==`string`&&e.inner&&this.isHost(e.roomId)&&this._opts.transport.sendToPeer(e.targetPeerId,e.inner)}_onRoster(e){if(!e||typeof e.roomId!=`string`)return;let t=this._rooms.get(e.roomId),n={roomId:e.roomId,name:e.name??t?.name??e.roomId,hostPeerId:e.hostPeerId,members:Array.isArray(e.members)?e.members:[],createdAt:t?.createdAt??Date.now()};this._save(n)}_publish(){this.roomsSignal.set(this.list())}_save(e){this._rooms.set(e.roomId,e),this._opts.persistRoom?.(e),this._publish()}};function st(e){return e&&S(e)?Promise.resolve().then(()=>(e.db.prepare(`SELECT * FROM tasks WHERE enabled = 1`).all()??[]).map(e=>({...e,enabled:!0,tools:e.tools?JSON.parse(e.tools):void 0}))):new Promise(async(t,n)=>{try{let r=e??await b();if(!r)return n(/* @__PURE__ */ Error(`failed to get transaction, cannot get enabled tasks.`));let i=r.transaction(`tasks`,`readonly`);if(!i)return n(/* @__PURE__ */ Error(`failed to get transaction`));let a=i.objectStore(`tasks`).index(`by-enabled`).getAll(1);a.onsuccess=()=>{t(a.result.map(e=>({...e,enabled:!0})))},a.onerror=()=>n(a.error)}catch(e){n(e)}})}function ct(e,t){if(typeof e!=`string`||!e.trim())return!1;let n=e.trim().split(/\s+/);if(n.length!==5)return!1;let[r,i,a,o,s]=n;return Q(r,t.getMinutes())&&Q(i,t.getHours())&&Q(a,t.getDate())&&Q(o,t.getMonth()+1)&&Q(s,t.getDay())}function Q(e,t){return e===`*`||e.split(`,`).some(e=>{if(e.includes(`/`)){let[n,r]=e.split(`/`),i=parseInt(r,10);if(isNaN(i)||i<=0)return!1;if(n===`*`)return t%i===0;if(n.includes(`-`)){let[e,r]=n.split(`-`).map(Number);return t>=e&&t<=r&&(t-e)%i===0}let a=parseInt(n,10);return t>=a&&(t-a)%i===0}if(e.includes(`-`)){let[n,r]=e.split(`-`).map(Number);return t>=n&&t<=r}return parseInt(e,10)===t})}var lt=class{interval=null;onTaskChange;runner;shouldDefer;constructor(e,t,n){this.runner=e,this.onTaskChange=t,this.shouldDefer=n}ranThisMinute(e,t){if(!e.lastRun)return!1;let n=new Date(e.lastRun);return n.getFullYear()===t.getFullYear()&&n.getMonth()===t.getMonth()&&n.getDate()===t.getDate()&&n.getHours()===t.getHours()&&n.getMinutes()===t.getMinutes()}start(){this.interval||(this.interval=setInterval(()=>this.tick(),v),this.tick())}stop(){this.interval&&=(clearInterval(this.interval),null)}async tick(){try{let e=await st(),t=/* @__PURE__ */ new Date;for(let n of e){let e=n.schedule||``;if(e!==``&&ct(e,t)&&!this.ranThisMinute(n,t)){if(this.shouldDefer&&await this.shouldDefer(n))continue;await ie(n.id,t.getTime()),this.onTaskChange?.(),this.runner(n).catch(e=>{console.error(`Task ${n.id} failed:`,e)})}}}catch(e){console.error(`Scheduler tick error:`,e)}}};async function ut(e,t){e.channelEnabledByType.telegram=await R(`telegram`,t),e.channelEnabledByType.imessage=await R(`imessage`,t);let n=await e.loadSecretConfig(t,m.TELEGRAM_BOT_TOKEN),r=E(await C(t,m.TELEGRAM_CHAT_IDS)),i=await C(t,m.TELEGRAM_USE_PROXY)===`true`;e.telegramBotToken=n,e.telegramChatIds=r,e.telegramUseProxy=i,e.telegram.configure(n,r,i);let a=async(e,n)=>{try{let r=await ge(t,e,n),i=new Uint8Array(r.byteLength);i.set(r);let a=n.split(`/`).pop()||n,o=Ee(a);return new Blob([i],{type:o})}catch(e){return console.warn(`Orchestrator: channel fileReader failed for ${n}:`,e),null}};e.telegram.fileReader=a,e.imessage.fileReader=a;let o=(await C(t,m.IMESSAGE_SERVER_URL)||``).trim().replace(/\/+$/,``),s=await e.loadSecretConfig(t,m.IMESSAGE_API_KEY),c=E(await C(t,m.IMESSAGE_CHAT_IDS));e.imessageServerUrl=o,e.imessageApiKey=s,e.imessageChatIds=c,e.imessage.configure(o,s,c),e.channelEnabledByType.peerjs=await R(`peerjs`,t);let l=(await C(t,m.PEERJS_MY_PEER_ID)||``).trim(),u=E(await C(t,m.PEERJS_TRUSTED_PEER_IDS)),d=(await C(t,m.PEERJS_SERVER_HOST)||``).trim(),f=await C(t,m.PEERJS_SERVER_PORT),p=f&&parseInt(f,10)||0,h=(await C(t,m.PEERJS_SERVER_PATH)||``).trim(),g=await C(t,m.PEERJS_SERVER_SECURE)!==`false`,_={},v=await C(t,m.PEERJS_PEER_ALIASES);if(v)try{_=JSON.parse(v)}catch(e){console.warn(`Failed to parse peerjs_peer_aliases`,e)}e.peerjsMyPeerId=l,e.peerjsMyAlias=(await C(t,m.PEERJS_MY_ALIAS)||``).trim(),e.peerjsTrustedPeerIds=u,e.peerjsPeerAliases=_,e.peerjsServerHost=d,e.peerjsServerPort=p,e.peerjsServerPath=h,e.peerjsServerSecure=g;let y=d?{host:d,port:p||void 0,path:h||void 0,secure:g}:{};e.peerjs.configure(l,u,y)}const $={allowedTools:[`clear_chat`,`show_toast`],enabledChannelTypes:[`telegram`],requireMention:!0};function dt(e){if(!e)return{allowedTools:[...$.allowedTools],enabledChannelTypes:[...$.enabledChannelTypes],requireMention:$.requireMention};try{let t=JSON.parse(e),n=Array.isArray(t.enabledChannelTypes)?t.enabledChannelTypes.filter(e=>typeof e==`string`&&e.trim().length>0):$.enabledChannelTypes;return{allowedTools:Array.isArray(t.allowedTools)?t.allowedTools.filter(e=>typeof e==`string`&&e.trim().length>0):$.allowedTools,enabledChannelTypes:n,requireMention:typeof t.requireMention==`boolean`?t.requireMention:$.requireMention}}catch{return{allowedTools:[...$.allowedTools],enabledChannelTypes:[...$.enabledChannelTypes],requireMention:$.requireMention}}}function ft(e,t){typeof navigator<`u`&&navigator.serviceWorker&&((async()=>{try{let e=await M(t);await ye(e)}catch{}})(),navigator.serviceWorker.addEventListener(`message`,n=>{if(n.data?.type===`request-proxy-config`){ne(e);return}if(n.data?.type!==`scheduled-task-trigger`)return;let{taskId:r,groupId:i,prompt:a,taskType:o,tools:s,subscriberId:c}=n.data;i&&(async()=>{if(c){let e=await M(t);if(e&&c!==e){console.warn(`Ignoring push-triggered task ${r}: subscriberId mismatch (${c} !== ${e})`);return}}e.schedulerTriggeredGroups.add(i);try{let t=O.tasks.find(e=>e.id===r);if(t){O.runTask(t);return}if(o===`tools`&&Array.isArray(s)&&s.length>0){O.runTask({id:r||`push-task-${Date.now()}`,groupId:i,createdAt:Date.now(),enabled:!0,prompt:a||``,type:`tools`,tools:s,lastRun:null});return}a&&be(e,a,i)}finally{e.schedulerTriggeredGroups.delete(i)}})().catch(e=>console.error(`Push-triggered task ${r} failed:`,e))}))}function pt(e){return new ot({transport:{get myPeerId(){return e.peerjs.myPeerId||e.peerjsMyPeerId},sendToPeer:(t,n)=>e.peerjs.sendRoomNotification(t,n),isConnected:t=>e.peerjs.isPeerConnected(t),connectToPeer:t=>e.peerjs.connectPeer(t)},getLocalMember:()=>({peerId:e.peerjs.myPeerId||e.peerjsMyPeerId,alias:e.peerjsMyAlias||e.peerjs.myPeerId||e.peerjsMyPeerId||e.assistantName,kind:`agent`,agentName:e.assistantName}),onMessage:t=>e.roomChannel.deliverInbound(t),onInvite:t=>ve(e,t),persistRoom:t=>{e.db&&we(e.db,t).catch(e=>console.error(`Failed to persist room:`,e))},removeRoom:t=>{e.db&&Ce(e.db,t).catch(e=>console.error(`Failed to delete room:`,e))}})}async function mt(e,t){e.initializeChannelRegistry(),e.channelRegistry.onMessage(n=>{Y(e,t,n).catch(e=>{console.error(`Failed to enqueue inbound message:`,e)})}),e.channelRegistry.onTyping((t,n)=>{e.events.emit(`typing`,{groupId:t,typing:n}),t.startsWith(`peer:`)&&O.setRemoteAgentTyping(t,n)}),e.peerjs.onTaskComplete(t=>{e.peerCompletedContexts.add(t)}),await ut(e,t),Se(e);try{let n=await Te(t);e.roomManager.loadRooms(n)}catch(e){console.error(`Failed to load rooms:`,e)}}async function ht(e,t){e.assistantName=await C(t,m.ASSISTANT_NAME)||`ShadowClaw`,e.triggerPattern=o(e.assistantName)}async function gt(e,t){let n=await C(t,m.VM_BOOT_MODE);e.vmBootMode=n===`disabled`||n===`auto`||n===`9p`||n===`ext2`?n:`disabled`,e.streamingEnabled=await C(t,m.STREAMING_ENABLED)!==`false`,e.webMcpToolsEnabled=await C(t,m.WEBMCP_TOOLS_ENABLED)!==`false`,e.vmBashFullInternetAccess=await C(t,m.VM_BASH_FULL_INTERNET_ACCESS)===`true`;let r=await C(t,m.WEBMCP_MODE);(r===`native`||r===`polyfill`)&&ke(r),e.contextCompressionEnabled=await C(t,m.CONTEXT_COMPRESSION_ENABLED)===`true`;let i=await C(t,m.REASONING_EFFORT);e.reasoningEffort=i?i.trim().toLowerCase():`none`,e.directToolCommandPolicy=dt(await C(t,m.DIRECT_TOOL_COMMAND_POLICY)),e.useProxy=await C(t,m.USE_PROXY)===`true`,e.proxyUrl=await C(t,m.PROXY_URL)||`/proxy`,e.gitProxyUrl=await C(t,m.GIT_PROXY_URL)||`/git-proxy`,e.taskServerEnabled=await C(t,m.TASK_SERVER_ENABLED)===`true`,e.taskServerUrl=await C(t,m.TASK_SERVER_URL)||(await import(`./config-C-YdSFZB.js`).then(e=>e.k)).DEFAULT_TASK_SERVER_URL}async function _t(e,t){let n=await C(t,m.LLAMAFILE_MODE);n===`cli`||n===`server`?e.llamafileMode=n:await k(t,m.LLAMAFILE_MODE,e.llamafileMode);let r=await C(t,m.LLAMAFILE_HOST);r&&(e.llamafileHost=r);let i=await C(t,m.LLAMAFILE_PORT);if(i){let t=parseInt(i,10);Number.isFinite(t)&&t>=1&&t<=65535&&(e.llamafilePort=t)}await C(t,m.LLAMAFILE_OFFLINE)===`false`&&(e.llamafileOffline=!1),me(e);let a=await C(t,m.MESH_LLM_HOST);a&&(e.meshLlmHost=a),fe(e)}async function vt(e,t){let[n,i,a,o,c,l,u,d,f]=await Promise.all([C(t,m.PROVIDER),C(t,m.BEDROCK_REGION_FALLBACK),C(t,m.BEDROCK_PROFILE_FALLBACK),C(t,m.BEDROCK_AUTH_MODE),C(t,m.MODEL),C(t,m.MAX_TOKENS),C(t,m.MAX_ITERATIONS),C(t,m.RATE_LIMIT_CALLS_PER_MINUTE),C(t,m.RATE_LIMIT_AUTO_ADAPT)]),p=n||e.provider,h=p?r(p):void 0;h&&(e.provider=p,e.providerConfig=h),await e.loadApiKeyForProvider(t,e.provider),e.bedrockRegionFallback=(i||``).trim(),e.bedrockProfileFallback=(a||``).trim(),e.bedrockAuthMode=(o||`provider_chain`).trim();let g=typeof document<`u`&&!!document.getElementById(`shadow-claw-static-routing`),_=e.providerConfig?.format===`transformers_js`,v=!!e.providerConfig?.modelsUrl,b=()=>{if(g||_||!v)return;let t=()=>{ue(e).then(t=>y.fetchModelInfo(e.providerConfig,t||void 0,de(e,e.provider)))};typeof globalThis.requestIdleCallback==`function`?globalThis.requestIdleCallback(t,{timeout:5e3}):setTimeout(t,2e3)};!g&&!_&&v&&(typeof window<`u`&&typeof document<`u`?document.readyState===`complete`?b():window.addEventListener(`load`,b,{once:!0}):b()),e.model=c||e.providerConfig.defaultModel;let x=e.model;e.provider===`prompt_api`&&!P()&&(e.model===`browser-built-in`||!e.model)&&(x=await C(t,m.PROMPT_API_FALLBACK_MODEL)||`onnx-community/Qwen3-0.6B-ONNX`,he(x).catch(()=>{}));let S=s(x);if(e.maxTokens=l===`8192`||e.provider===`prompt_api`&&!P()&&l===`4096`?S:Math.max(1,parseInt(l||String(S),10)),u&&(e.maxIterations=parseInt(u,10)||50),d){let t=parseInt(d,10);e.rateLimitCallsPerMinute=Number.isFinite(t)?Math.max(0,t):0}e.rateLimitAutoAdapt=f!==`false`}async function yt(t,n){t.agentWorker=e(new URL(`./agent.worker.js`,import.meta.url).href),t.agentWorker.onmessage=e=>Pe(t,n,e.data),t.agentWorker.onerror=e=>{console.error(`Agent worker error:`,e)};let r=await C(n,m.STORAGE_HANDLE);r&&t.agentWorker.postMessage({payload:{storageHandle:r},type:`set-storage`}),ne(t),t.scheduler=new lt(async e=>{await Me(t,e)},()=>{t.events.emit(`task-change`,{type:`executed`})},e=>je(e,t)),t.scheduler.start(),ft(t,n)}var bt=class{agentWorker=null;assistantName=g;bedrockAuthMode=`provider_chain`;bedrockProfileFallback=``;bedrockRegionFallback=``;browserChat=new Ue;channelEnabledByType={browser:!0,peerjs:!1,telegram:!1,imessage:!1};channelRegistry=new G;channelsInitialized=!1;contextCompressionEnabled=!1;db=null;directToolCommandPolicy={...$};ensureControlPlaneConnected=ze;events=new at;gitProxyUrl=`/git-proxy`;imessage=new We;imessageApiKey=``;imessageChatIds=[];imessageServerUrl=``;inFlightEffectiveProviderByGroup=/* @__PURE__ */ new Map;inFlightProviderRequestIds=/* @__PURE__ */ new Map;inFlightTriggerByGroup=/* @__PURE__ */ new Map;llamafileHost=`127.0.0.1`;llamafileMode=`cli`;llamafileOffline=!0;llamafilePort=8080;maxIterations=50;maxTokens=h;meshLlmHost=``;messageQueue=[];model=a().defaultModel;peerCompletedContexts=/* @__PURE__ */ new Set;peerjs=new Oe;peerjsMyAlias=``;peerjsMyPeerId=``;peerjsPeerAliases={};peerjsServerHost=``;peerjsServerPath=``;peerjsServerPort=0;peerjsServerSecure=!0;peerjsTrustedPeerIds=[];pendingScheduledTasks=/* @__PURE__ */ new Set;processing=!1;promptControllers=/* @__PURE__ */ new Map;provider=f;providerConfig=a();proxyUrl=`/proxy`;pushSubscriptionWarned=!1;rateLimitAutoAdapt=!0;rateLimitCallsPerMinute=0;reasoningEffort=`none`;roomChannel=new Ye;roomManager;router=null;scheduler=null;schedulerTriggeredGroups=/* @__PURE__ */ new Set;state=`idle`;streamingEnabled=!0;taskServerEnabled=!1;taskServerUrl=`/schedule`;telegram=new Xe;telegramBotToken=``;telegramChatIds=[];telegramUseProxy=!1;transformersProgressPollers=/* @__PURE__ */ new Map;triggerPattern=o(g);useProxy=!1;vmBashFullInternetAccess=!1;vmBootMode=`disabled`;vmStatus={ready:!1,booting:!1,bootAttempted:!1,error:null};webMcpEffectCleanup=null;webMcpRegistrationLock=Promise.resolve();webMcpToolsEnabled=!0;#e=null;#t=null;constructor(){this.roomManager=pt(this),this.initializeChannelRegistry()}clearProviderRequest(e){this.inFlightProviderRequestIds.delete(e)}createProviderRequestId(e){if(this.provider!==`llamafile`)return this.inFlightProviderRequestIds.delete(e),``;let t=`${e}:${Date.now().toString(36)}:${Math.random().toString(36).slice(2,10)}`;return this.inFlightProviderRequestIds.set(e,t),t}async ensureWorkerReady(){this.db&&!this.channelsInitialized&&(this.channelsInitialized=!0,await mt(this,this.db),this.browserChat.onDisplay(()=>{})),!this.agentWorker&&this.db&&await yt(this,this.db),this.db&&(j.load(this.db),H(this,this.db))}initializeChannelRegistry(){this.channelRegistry=new G,this.channelRegistry.register(`br:`,this.browserChat,{badge:`Browser`,autoTrigger:!0}),this.channelRegistry.register(`tg:`,this.telegram,{badge:`Telegram`,autoTrigger:!1}),this.channelRegistry.register(`im:`,this.imessage,{badge:`iMessage`,autoTrigger:!0}),this.channelRegistry.register(`peer:`,this.peerjs,{badge:`PeerJS`,autoTrigger:!1}),this.channelRegistry.register(`room:`,this.roomChannel,{badge:`Room`,autoTrigger:!1}),this.roomChannel.setManager(this.roomManager),this.roomChannel.setPeerJs(this.peerjs),this.peerjs.setRoomNotificationHandler((e,t,n)=>this.roomManager.handleNotification(e,t,n)),this.router=new nt(this.channelRegistry)}setState(e,t){this.state=e,this.events.emit(`state-change`,{state:e,groupId:t})}shutdown(){this.channelRegistry.stopAll(),this.scheduler?.stop();for(let e of this.transformersProgressPollers.keys())F(this,e);this.agentWorker?.terminate(),typeof this.webMcpEffectCleanup==`function`&&this.webMcpEffectCleanup(),Ae()}async ensureAllConnections(e={}){let t=e.force??!1;try{await this.ensureControlPlaneConnected({orchestrator:this,db:this.db||void 0,force:t})}catch(e){console.warn(`Error ensuring Control Plane connection:`,e)}try{Se(this,t)}catch(e){console.warn(`Error ensuring channel connections:`,e)}this.taskServerEnabled&&this.db&&(O.replayTaskSyncOutbox(this.db),O.loadTasks(this.db)),this.scheduler&&(this.scheduler.start(),this.scheduler.tick())}stopCurrentRequest(e=p){if(this.state!==`thinking`&&this.state!==`responding`)return;F(this,e);let t=this.inFlightProviderRequestIds.get(e)||``;this.clearProviderRequest(e),this.agentWorker?.postMessage({type:`cancel`,payload:{groupId:e}}),this.provider===`llamafile`&&t&&pe(t);let n=this.promptControllers.get(e);n&&(n.abort(),this.promptControllers.delete(e)),this.inFlightTriggerByGroup.delete(e),this.inFlightEffectiveProviderByGroup.delete(e),this.events.emit(`typing`,{groupId:e,typing:!1}),this.router?.setTyping(e,!1),this.setState(`idle`,e)}async getApiKey(){if(!this.#t)return null;let e=Date.now();if(this.#e&&this.#e.expiresAt>e)return this.#e.value;try{let t=await I(this.#t);return t===null?null:(this.#e={expiresAt:e+3e4,value:t},t)}catch(e){return console.error(`[Orchestrator] Failed to decrypt API key:`,e),null}}async getApiKeyForSpecificProvider(e,t){let n=await C(e,i(t));if(!n&&t===`openrouter`){let t=await C(e,m.API_KEY);t&&(n=t)}if(!n)return``;try{return await I(n)||``}catch(e){return console.error(`[Orchestrator] Failed to decrypt API key:`,e),``}}async handleCompactDone(e,t,n){await D(e,t);let r={channel:this.channelRegistry.getChannelType(t)??`browser`,content:`📝 **Context Compacted**\n\n${n}`,groupId:t,id:A(),isFromMe:!0,isTrigger:!1,sender:this.assistantName,timestamp:Date.now()};await w(e,r),this.events.emit(`context-compacted`,{groupId:t,summary:n}),this.events.emit(`typing`,{groupId:t,typing:!1}),this.setState(`idle`,t)}async init(){let e=await He();this.db=e,await T(),await Promise.all([ht(this,e),vt(this,e),_t(this,e),gt(this,e)]),await T();let t=typeof document<`u`&&!!document.getElementById(`shadow-claw-static-routing`),n=re(),r=n?.sidebar?.chatHidden,i=n?.sidebar?.tasksHidden,[a,o]=await Promise.all([C(e,m.SIDEBAR_CHAT_HIDDEN),C(e,m.SIDEBAR_TASKS_HIDDEN)]),s=a==null?!!r:N(a),c=o==null?!!i:N(o),l=s&&c;t?l||setTimeout(()=>{this.ensureWorkerReady()},15e3):l||await yt(this,e),l||(this.channelsInitialized=!0,mt(this,e).then(()=>{this.browserChat.onDisplay(()=>{})})),this.events.emit(`ready`,void 0);let u=typeof globalThis<`u`?globalThis.window:void 0;return t?l||setTimeout(()=>{j.load(e),H(this,e)},15e3):u&&typeof u.requestIdleCallback==`function`?l||u.requestIdleCallback(()=>{j.load(e),H(this,e)}):l||(await j.load(e),H(this,e)),e}async loadApiKeyForProvider(e,t){let n=await C(e,i(t));if(!n&&t===`openrouter`){let r=await C(e,m.API_KEY);r&&(n=r,await k(e,i(t),r))}this.#t=n||``,this.#e=null}async loadSecretConfig(e,t){let n=await C(e,t);if(!n)return``;try{return await I(n)||``}catch{let r=await L(n);return r&&await k(e,t,r),n}}async newSession(e,t=p){await D(e,t),this.events.emit(`session-reset`,{groupId:t})}async refreshContextUsage(e,t=p){let n=``;try{n=await ae(e,t,`MEMORY.md`)}catch{}let i=j.enabledTools,a=O.getPeerState(t)||void 0,o=Re(this.assistantName,n,i,j.systemPromptOverride,a,void 0,{groupId:t}),c=(await te(e)).find(e=>e.groupId===t),l=c?.pinnedModel??(c?.pinnedProvider?r(c.pinnedProvider)?.defaultModel??this.model:this.model),u=l;(c?.pinnedProvider??this.provider)===`prompt_api`&&(l===`browser-built-in`||!l)&&!P()&&(u=await C(this.db,m.PROMPT_API_FALLBACK_MODEL)||`onnx-community/Qwen3-0.6B-ONNX`);let d=typeof c?.pinnedMaxTokens==`number`&&Number.isFinite(c.pinnedMaxTokens)&&c.pinnedMaxTokens>0?Math.floor(c.pinnedMaxTokens):this.maxTokens,f=Math.max(1,Math.min(d,s(u))),h=Ne(u),g=U(o)+(i?.reduce((e,t)=>e+U(JSON.stringify(t)),0)??0),_=await Ie(t,200),v=Le(_,{contextLimit:h,systemPromptTokens:g,maxOutputTokens:f,skimTop:this.contextCompressionEnabled}),y=v.estimatedTokens+g;if(O.tokenUsage){let e=O.tokenUsage,t=(e.inputTokens||0)+(e.cacheReadTokens||0)+(e.outputTokens||0);y=Math.max(y,t)}this.events.emit(`context-usage`,{estimatedTokens:y,contextLimit:h,usagePercent:Math.min(100,Math.max(v.usagePercent,y/h*100)),truncatedCount:v.truncatedCount})}async restartCurrentRequest(e=p){if(this.state!==`thinking`&&this.state!==`responding`||!this.db)return!1;let t=this.inFlightTriggerByGroup.get(e);if(!t)return!1;this.stopCurrentRequest(e);let{invokeAgent:n}=await import(`./invoke-agent-B3Osw6K7.js`);return await n(this,this.db,e,t),!0}async routeRoomA2UIAction(e,t){let n=z(e),r=this.peerjs.myPeerId||this.peerjsMyPeerId,i=this.roomManager.getSurfaceOwner(t.surfaceId);if(!i||i===r){if(!this.db)return;await Y(this,this.db,{id:A(),groupId:e,sender:this.peerjsMyAlias||r||`you`,content:J(t),timestamp:Date.now(),channel:`room`,a2uiAction:t})}else this.roomManager.broadcastA2UIAction(n,t)}async saveSecretConfig(e,t,n){if(!n){await k(e,t,``);return}let r=await L(n);if(!r)throw Error(`Failed to encrypt secret config for ${t}`);await k(e,t,r)}async setApiKey(e,t){this.#t=await L(t),this.#e=null;let n=await L(t);if(!n)throw Error(`key failed to encrypt. config cannot set.`);await k(e,i(this.provider),n)}submitMessage(e,t=p){this.browserChat.submit(e,t)}};export{bt as Orchestrator};
|
|
3
|
+
`)}\n</messages>`}static formatOutbound(e){return e.replace(/<internal>[\s\S]*?<\/internal>/g,``).trim()}registry;constructor(e){this.registry=e}findChannel(e){return this.registry.find(e)}setTyping(e,t){this.findChannel(e)?.setTyping(e,t)}async send(e,t,n){let r=this.findChannel(e);r?await r.send(e,t,n):console.warn(`No channel for groupId: ${e}`)}};function rt(e,t,n){if(!e.enabledChannelTypes.includes(n.channel))return null;let r=n.content.trim(),i=t.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`),a=r;if(e.requireMention){let e=RegExp(`^@${i}\\b\\s*(?:-|:)?\\s*`,`i`);if(!e.test(a))return null;a=a.replace(e,``).trim()}let o=a.match(/^\/([a-zA-Z0-9_]+)(?:\s+([\s\S]+))?$/);if(!o)return null;let s=o[1];if(!e.allowedTools.includes(s))return null;let c=(o[2]||``).trim();if(!c)return{toolName:s,input:{}};let l=c.startsWith(`'`)&&c.endsWith(`'`)||c.startsWith(`"`)&&c.endsWith(`"`)?c.slice(1,-1).trim():c;try{let e=JSON.parse(l);return e&&typeof e==`object`?{toolName:s,input:e}:null}catch{return null}}function it(e,t){let n=e.trim().match(/^\/([a-z0-9](?:[a-z0-9]|-(?!-))*[a-z0-9]|[a-z0-9])(?:\s+([\s\S]+))?$/u);if(!n)return null;let r=t.find(e=>e.name===n[1]&&e.userInvocable!==!1);return r?{skill:r,arguments:(n[2]||``).trim()}:null}async function Y(e,t,n){if(n.a2uiEnvelopes&&n.a2uiEnvelopes.length>0)for(let t of n.a2uiEnvelopes)e.events.emit(`a2ui-surface`,{groupId:n.groupId,envelope:t});n.a2uiAction&&e.events.emit(`a2ui-action`,{groupId:n.groupId,action:n.a2uiAction});let r=!!n.content,i=(n.attachments?.length??0)>0;if(!r&&!i&&(n.a2uiEnvelopes?.length??0)>0)return;let a=rt(e.directToolCommandPolicy,e.assistantName,n),o=a?null:it(n.content,(await Fe(t,n.groupId)).skills),s=n.channel===`browser`,c=e.channelRegistry.shouldAutoTrigger(n.groupId),l=!1;(n.channel===`browser`||n.groupId.startsWith(`room:`))&&(l=e.triggerPattern.test(n.content.trim())),o&&(l=!0),s&&n.groupId.startsWith(`peer:`)&&e.peerCompletedContexts.delete(n.groupId);let u=!!a;if(!l&&e.peerjsMyPeerId){if(n.content.includes(`@${e.peerjsMyPeerId}`))l=!0;else if(e.peerjsMyAlias&&n.content.includes(`@${e.peerjsMyAlias}`))l=!0;else for(let[t,r]of Object.entries(e.peerjsPeerAliases))if(r===e.peerjsMyPeerId&&n.content.includes(`@${t}`)){l=!0;break}}n.content.trim().startsWith(`[SCHEDULED TASK]`)&&(l=!0),n.content.trim().startsWith(`[A2UI ACTION]`)&&(l=!0);let d=!1;d=u||l?!0:s?!(n.groupId.startsWith(`peer:`)||n.groupId.startsWith(`room:`)):c,d&&!s&&!o&&n.groupId.startsWith(`peer:`)&&e.peerCompletedContexts.has(n.groupId)&&(d=!1);let f=await De(t,n.groupId,n.attachments||[]),p={...n,attachments:f,isFromMe:!1,isTrigger:d};if(d&&!u&&!o?.skill.execution&&e.messageQueue.push(o?{...n,content:`[SKILL COMMAND] Activate the "${o.skill.name}" skill and follow its instructions.\n${o.arguments}`}:n),await w(t,p),e.events.emit(`message`,p),o?.skill.execution){if(await e.ensureWorkerReady?.(),!e.agentWorker)throw Error(`Worker is not initialized.`);let t=o.skill.execution.tools.map(e=>{let t=e.input&&typeof e.input==`object`?{...e.input}:{};return o.arguments&&Object.keys(t).length===0&&(t.rawInput=o.arguments),{...e,input:t}});e.agentWorker.postMessage({type:`execute-skill-tools`,payload:{groupId:n.groupId,skillName:o.skill.name,tools:t}})}else if(n.channel===`peerjs`&&xe(n.groupId),s&&(n.groupId.startsWith(`peer:`)||n.groupId.startsWith(`room:`))&&e.router?.send(n.groupId,n.content,f).catch(e=>{console.error(`Failed to route browser message to peer:`,e)}),a){if(await e.ensureWorkerReady?.(),!e.agentWorker)throw Error(`Worker is not initialized.`);e.agentWorker.postMessage({type:`execute-direct-tool`,payload:{groupId:n.groupId,name:a.toolName,input:a.input}})}else X(e,t)}async function X(e,t){if(e.processing||e.messageQueue.length===0)return;let n=e.messageQueue[0]?.groupId,i=e.providerConfig,a=e.provider;if(n)try{let e=(await te(t)).find(e=>e.groupId===n);if(e?.pinnedProvider){let t=r(e.pinnedProvider);t&&(i=t,a=e.pinnedProvider)}}catch{}let o=i?.requiresApiKey!==!1,s=!0;if(o&&(s=a===e.provider?!!await le(e):!!await e.getApiKeyForSpecificProvider(t,a)),o&&!s){let t=`API key not configured. Go to Settings to add your API key.`;e.events.emit(`provider-help`,{providerId:a,reason:t,helpType:_e(a,t,o)});let n=e.messageQueue.shift();e.events.emit(`error`,{groupId:n.groupId,error:t});return}e.processing=!0;let c=e.messageQueue.shift();try{let{invokeAgent:n}=await import(`./invoke-agent-C_geruwq.js`);await n(e,t,c.groupId,c.content,c.freshContext,c.subagent)}catch(e){console.error(`Failed to invoke agent:`,e)}finally{e.processing=!1,e.messageQueue.length>0&&X(e,t)}}var at=class{listeners;constructor(){this.listeners=/* @__PURE__ */ new Map}emit(e,t){this.listeners.get(e)?.forEach(e=>e(t))}off(e,t){this.listeners.get(e)?.delete(t)}on(e,t){this.listeners.has(e)||this.listeners.set(e,/* @__PURE__ */ new Set),this.listeners.get(e)?.add(t)}};function Z(e,t){return{jsonrpc:`2.0`,method:e,params:t}}var ot=class{static isRoomMethod(e){return e===V.JOIN||e===V.ROSTER||e===V.LEAVE||e===V.MESSAGE||e===V.INVITE||e===V.RELAY||e===V.A2UI||e===V.A2UI_ACTION}roomsSignal=new ee.State([]);_opts;_rooms=/* @__PURE__ */ new Map;_seen=/* @__PURE__ */ new Map;_surfaceOwners=/* @__PURE__ */ new Map;constructor(e){this._opts=e}broadcast(e,t,n){let r=this._rooms.get(e);if(!r)return null;let i=this._opts.getLocalMember(),a=A(),o={roomId:e,messageId:a,senderPeerId:i.peerId,senderAlias:i.alias,text:t,attachments:n?.map(e=>({fileName:e.fileName,mimeType:e.mimeType,path:e.path,size:e.size}))};return this._markSeen(e,a),this._deliverToMembers(r,Z(V.MESSAGE,o)),a}broadcastA2UI(e,t){let n=this._rooms.get(e);if(!n)return null;let r=this._myPeerId;this._surfaceOwners.set(t.surfaceId,r);let i=A(),a={roomId:e,broadcastId:i,ownerPeerId:r,senderPeerId:r,envelope:t};return this._markSeen(e,i),this._deliverToMembers(n,Z(V.A2UI,a)),i}broadcastA2UIAction(e,t){let n=this._rooms.get(e);if(!n)return null;let r=this._opts.getLocalMember(),i=this._surfaceOwners.get(t.surfaceId)??``,a=A(),o={roomId:e,broadcastId:a,ownerPeerId:i,senderPeerId:r.peerId,senderAlias:r.alias,action:t};return this._markSeen(e,a),this._deliverToMembers(n,Z(V.A2UI_ACTION,o)),a}createRoom(e){let t=this._opts.getLocalMember(),n={roomId:A(),name:e,hostPeerId:t.peerId,members:[t],createdAt:Date.now()};return this._save(n),n}get(e){return this._rooms.get(e)??null}getSurfaceOwner(e){return this._surfaceOwners.get(e)}handleNotification(e,t,n){switch(t){case V.JOIN:this._onJoin(e,n);break;case V.ROSTER:this._onRoster(n);break;case V.LEAVE:this._onLeave(e,n);break;case V.MESSAGE:this._onMessage(n);break;case V.INVITE:this._opts.onInvite?.(n);break;case V.RELAY:this._onRelay(n);break;case V.A2UI:this._onA2UI(n);break;case V.A2UI_ACTION:this._onA2UIAction(n)}}invite(e,t){let n=this._rooms.get(e);if(!n)return!1;let r=this._opts.getLocalMember(),i={roomId:e,roomName:n.name,hostPeerId:n.hostPeerId,fromPeerId:r.peerId,fromAlias:r.alias},a=this._opts.transport;return a.connectToPeer(t),a.sendToPeer(t,Z(V.INVITE,i))}isHost(e){let t=this._rooms.get(e);return!!t&&t.hostPeerId===this._myPeerId}joinRoom(e,t,n){let r=this._opts.getLocalMember(),i=this._rooms.get(e)??{roomId:e,name:n,hostPeerId:t,members:[{peerId:t,alias:t,kind:`agent`},r],createdAt:Date.now()};this._save(i);let a=this._opts.transport;a.connectToPeer(t);let o={roomId:e,member:r};return a.sendToPeer(t,Z(V.JOIN,o)),i}leaveRoom(e){let t=this._rooms.get(e);if(!t)return;let n=this._myPeerId;if(t.hostPeerId===n){let r={roomId:e,peerId:n,disbanded:!0};this._deliverToMembers(t,Z(V.LEAVE,r))}else{let r={roomId:e,peerId:n};this._opts.transport.sendToPeer(t.hostPeerId,Z(V.LEAVE,r))}this._rooms.delete(e),this._seen.delete(e),this._opts.removeRoom?.(e),this._publish()}list(){return Array.from(this._rooms.values())}loadRooms(e){this._rooms.clear();for(let t of e)this._rooms.set(t.roomId,t);this._publish()}_broadcastRoster(e){let t={roomId:e.roomId,name:e.name,hostPeerId:e.hostPeerId,members:e.members};this._deliverToMembers(e,Z(V.ROSTER,t))}_deliverToMembers(e,t){let n=this._myPeerId;for(let r of e.members)r.peerId!==n&&this._deliverToPeer(e,r.peerId,t)}_deliverToPeer(e,t,n){let r=this._opts.transport;if(r.isConnected(t)){r.sendToPeer(t,n);return}let i=this._myPeerId;if(e.hostPeerId!==i&&e.hostPeerId!==t&&r.isConnected(e.hostPeerId)){let i={roomId:e.roomId,targetPeerId:t,inner:n};r.sendToPeer(e.hostPeerId,Z(V.RELAY,i)),r.connectToPeer(t)}else r.connectToPeer(t),r.sendToPeer(t,n)}_hasSeen(e,t){return this._seen.get(e)?.has(t)??!1}_markSeen(e,t){let n=this._seen.get(e);if(n||(n=/* @__PURE__ */ new Set,this._seen.set(e,n)),n.add(t),n.size>500){let e=n.values().next().value;e!==void 0&&n.delete(e)}}get _myPeerId(){return this._opts.transport.myPeerId}_onA2UI(e){if(!e||typeof e.roomId!=`string`||typeof e.broadcastId!=`string`||!e.envelope||!this._rooms.get(e.roomId)||this._hasSeen(e.roomId,e.broadcastId))return;this._markSeen(e.roomId,e.broadcastId);let t=e.envelope.surfaceId;this._surfaceOwners.get(t)!==this._myPeerId&&this._surfaceOwners.set(t,e.ownerPeerId);let n={id:e.broadcastId,groupId:B(e.roomId),sender:e.senderPeerId,content:``,timestamp:Date.now(),channel:`room`,a2uiEnvelopes:[e.envelope]};this._opts.onMessage(n)}_onA2UIAction(e){if(!e||typeof e.roomId!=`string`||typeof e.broadcastId!=`string`||!e.action||!this._rooms.get(e.roomId)||this._hasSeen(e.roomId,e.broadcastId)||(this._markSeen(e.roomId,e.broadcastId),this._surfaceOwners.get(e.action.surfaceId)!==this._myPeerId))return;let t={id:e.broadcastId,groupId:B(e.roomId),sender:e.senderAlias||e.senderPeerId,content:J(e.action,e.senderAlias),timestamp:Date.now(),channel:`room`,a2uiAction:e.action};this._opts.onMessage(t)}_onJoin(e,t){if(!t||typeof t.roomId!=`string`)return;let n=this._rooms.get(t.roomId);if(!n||n.hostPeerId!==this._myPeerId)return;let r=t.member??{peerId:e,alias:e,kind:`human`};r.peerId=e;let i=n.members.findIndex(t=>t.peerId===e);i>=0?n.members[i]=r:n.members.push(r),this._save(n),this._broadcastRoster(n)}_onLeave(e,t){if(!t||typeof t.roomId!=`string`)return;let n=this._rooms.get(t.roomId);n&&(t.disbanded?(this._rooms.delete(t.roomId),this._seen.delete(t.roomId),this._opts.removeRoom?.(t.roomId),this._publish()):n.hostPeerId===this._myPeerId&&(n.members=n.members.filter(n=>n.peerId!==(t.peerId||e)),this._save(n),this._broadcastRoster(n)))}_onMessage(e){if(!e||typeof e.roomId!=`string`||typeof e.messageId!=`string`||!this._rooms.get(e.roomId)||this._hasSeen(e.roomId,e.messageId))return;this._markSeen(e.roomId,e.messageId);let t={id:e.messageId,groupId:B(e.roomId),sender:e.senderAlias||e.senderPeerId,content:e.text??``,timestamp:Date.now(),channel:`room`,attachments:e.attachments?.map(e=>({fileName:e.fileName,mimeType:e.mimeType,path:e.path,size:e.size}))};this._opts.onMessage(t)}_onRelay(e){e&&typeof e.targetPeerId==`string`&&e.inner&&this.isHost(e.roomId)&&this._opts.transport.sendToPeer(e.targetPeerId,e.inner)}_onRoster(e){if(!e||typeof e.roomId!=`string`)return;let t=this._rooms.get(e.roomId),n={roomId:e.roomId,name:e.name??t?.name??e.roomId,hostPeerId:e.hostPeerId,members:Array.isArray(e.members)?e.members:[],createdAt:t?.createdAt??Date.now()};this._save(n)}_publish(){this.roomsSignal.set(this.list())}_save(e){this._rooms.set(e.roomId,e),this._opts.persistRoom?.(e),this._publish()}};function st(e){return e&&S(e)?Promise.resolve().then(()=>(e.db.prepare(`SELECT * FROM tasks WHERE enabled = 1`).all()??[]).map(e=>({...e,enabled:!0,tools:e.tools?JSON.parse(e.tools):void 0}))):new Promise(async(t,n)=>{try{let r=e??await b();if(!r)return n(/* @__PURE__ */ Error(`failed to get transaction, cannot get enabled tasks.`));let i=r.transaction(`tasks`,`readonly`);if(!i)return n(/* @__PURE__ */ Error(`failed to get transaction`));let a=i.objectStore(`tasks`).index(`by-enabled`).getAll(1);a.onsuccess=()=>{t(a.result.map(e=>({...e,enabled:!0})))},a.onerror=()=>n(a.error)}catch(e){n(e)}})}function ct(e,t){if(typeof e!=`string`||!e.trim())return!1;let n=e.trim().split(/\s+/);if(n.length!==5)return!1;let[r,i,a,o,s]=n;return Q(r,t.getMinutes())&&Q(i,t.getHours())&&Q(a,t.getDate())&&Q(o,t.getMonth()+1)&&Q(s,t.getDay())}function Q(e,t){return e===`*`||e.split(`,`).some(e=>{if(e.includes(`/`)){let[n,r]=e.split(`/`),i=parseInt(r,10);if(isNaN(i)||i<=0)return!1;if(n===`*`)return t%i===0;if(n.includes(`-`)){let[e,r]=n.split(`-`).map(Number);return t>=e&&t<=r&&(t-e)%i===0}let a=parseInt(n,10);return t>=a&&(t-a)%i===0}if(e.includes(`-`)){let[n,r]=e.split(`-`).map(Number);return t>=n&&t<=r}return parseInt(e,10)===t})}var lt=class{interval=null;onTaskChange;runner;shouldDefer;constructor(e,t,n){this.runner=e,this.onTaskChange=t,this.shouldDefer=n}ranThisMinute(e,t){if(!e.lastRun)return!1;let n=new Date(e.lastRun);return n.getFullYear()===t.getFullYear()&&n.getMonth()===t.getMonth()&&n.getDate()===t.getDate()&&n.getHours()===t.getHours()&&n.getMinutes()===t.getMinutes()}start(){this.interval||(this.interval=setInterval(()=>this.tick(),y),this.tick())}stop(){this.interval&&=(clearInterval(this.interval),null)}async tick(){try{let e=await st(),t=/* @__PURE__ */ new Date;for(let n of e){let e=n.schedule||``;if(e!==``&&ct(e,t)&&!this.ranThisMinute(n,t)){if(this.shouldDefer&&await this.shouldDefer(n))continue;await ie(n.id,t.getTime()),this.onTaskChange?.(),this.runner(n).catch(e=>{console.error(`Task ${n.id} failed:`,e)})}}}catch(e){console.error(`Scheduler tick error:`,e)}}};async function ut(e,t){e.channelEnabledByType.telegram=await R(`telegram`,t),e.channelEnabledByType.imessage=await R(`imessage`,t);let n=await e.loadSecretConfig(t,h.TELEGRAM_BOT_TOKEN),r=E(await C(t,h.TELEGRAM_CHAT_IDS)),i=await C(t,h.TELEGRAM_USE_PROXY)===`true`;e.telegramBotToken=n,e.telegramChatIds=r,e.telegramUseProxy=i,e.telegram.configure(n,r,i);let a=async(e,n)=>{try{let r=await ge(t,e,n),i=new Uint8Array(r.byteLength);i.set(r);let a=n.split(`/`).pop()||n,o=Ee(a);return new Blob([i],{type:o})}catch(e){return console.warn(`Orchestrator: channel fileReader failed for ${n}:`,e),null}};e.telegram.fileReader=a,e.imessage.fileReader=a;let o=(await C(t,h.IMESSAGE_SERVER_URL)||``).trim().replace(/\/+$/,``),s=await e.loadSecretConfig(t,h.IMESSAGE_API_KEY),c=E(await C(t,h.IMESSAGE_CHAT_IDS));e.imessageServerUrl=o,e.imessageApiKey=s,e.imessageChatIds=c,e.imessage.configure(o,s,c),e.channelEnabledByType.peerjs=await R(`peerjs`,t);let l=(await C(t,h.PEERJS_MY_PEER_ID)||``).trim(),u=E(await C(t,h.PEERJS_TRUSTED_PEER_IDS)),d=(await C(t,h.PEERJS_SERVER_HOST)||``).trim(),f=await C(t,h.PEERJS_SERVER_PORT),p=f&&parseInt(f,10)||0,m=(await C(t,h.PEERJS_SERVER_PATH)||``).trim(),g=await C(t,h.PEERJS_SERVER_SECURE)!==`false`,_={},v=await C(t,h.PEERJS_PEER_ALIASES);if(v)try{_=JSON.parse(v)}catch(e){console.warn(`Failed to parse peerjs_peer_aliases`,e)}e.peerjsMyPeerId=l,e.peerjsMyAlias=(await C(t,h.PEERJS_MY_ALIAS)||``).trim(),e.peerjsTrustedPeerIds=u,e.peerjsPeerAliases=_,e.peerjsServerHost=d,e.peerjsServerPort=p,e.peerjsServerPath=m,e.peerjsServerSecure=g;let y=d?{host:d,port:p||void 0,path:m||void 0,secure:g}:{};e.peerjs.configure(l,u,y)}const $={allowedTools:[`clear_chat`,`show_toast`],enabledChannelTypes:[`telegram`],requireMention:!0};function dt(e){if(!e)return{allowedTools:[...$.allowedTools],enabledChannelTypes:[...$.enabledChannelTypes],requireMention:$.requireMention};try{let t=JSON.parse(e),n=Array.isArray(t.enabledChannelTypes)?t.enabledChannelTypes.filter(e=>typeof e==`string`&&e.trim().length>0):$.enabledChannelTypes;return{allowedTools:Array.isArray(t.allowedTools)?t.allowedTools.filter(e=>typeof e==`string`&&e.trim().length>0):$.allowedTools,enabledChannelTypes:n,requireMention:typeof t.requireMention==`boolean`?t.requireMention:$.requireMention}}catch{return{allowedTools:[...$.allowedTools],enabledChannelTypes:[...$.enabledChannelTypes],requireMention:$.requireMention}}}function ft(e,t){typeof navigator<`u`&&navigator.serviceWorker&&((async()=>{try{let e=await M(t);await ye(e)}catch{}})(),navigator.serviceWorker.addEventListener(`message`,n=>{if(n.data?.type===`request-proxy-config`){ne(e);return}if(n.data?.type!==`scheduled-task-trigger`)return;let{taskId:r,groupId:i,prompt:a,taskType:o,tools:s,subscriberId:c}=n.data;i&&(async()=>{if(c){let e=await M(t);if(e&&c!==e){console.warn(`Ignoring push-triggered task ${r}: subscriberId mismatch (${c} !== ${e})`);return}}e.schedulerTriggeredGroups.add(i);try{let t=O.tasks.find(e=>e.id===r);if(t){O.runTask(t);return}if(o===`tools`&&Array.isArray(s)&&s.length>0){O.runTask({id:r||`push-task-${Date.now()}`,groupId:i,createdAt:Date.now(),enabled:!0,prompt:a||``,type:`tools`,tools:s,lastRun:null});return}a&&be(e,a,i)}finally{e.schedulerTriggeredGroups.delete(i)}})().catch(e=>console.error(`Push-triggered task ${r} failed:`,e))}))}function pt(e){return new ot({transport:{get myPeerId(){return e.peerjs.myPeerId||e.peerjsMyPeerId},sendToPeer:(t,n)=>e.peerjs.sendRoomNotification(t,n),isConnected:t=>e.peerjs.isPeerConnected(t),connectToPeer:t=>e.peerjs.connectPeer(t)},getLocalMember:()=>({peerId:e.peerjs.myPeerId||e.peerjsMyPeerId,alias:e.peerjsMyAlias||e.peerjs.myPeerId||e.peerjsMyPeerId||e.assistantName,kind:`agent`,agentName:e.assistantName}),onMessage:t=>e.roomChannel.deliverInbound(t),onInvite:t=>ve(e,t),persistRoom:t=>{e.db&&we(e.db,t).catch(e=>console.error(`Failed to persist room:`,e))},removeRoom:t=>{e.db&&Ce(e.db,t).catch(e=>console.error(`Failed to delete room:`,e))}})}async function mt(e,t){e.initializeChannelRegistry(),e.channelRegistry.onMessage(n=>{Y(e,t,n).catch(e=>{console.error(`Failed to enqueue inbound message:`,e)})}),e.channelRegistry.onTyping((t,n)=>{e.events.emit(`typing`,{groupId:t,typing:n}),t.startsWith(`peer:`)&&O.setRemoteAgentTyping(t,n)}),e.peerjs.onTaskComplete(t=>{e.peerCompletedContexts.add(t)}),await ut(e,t),Se(e);try{let n=await Te(t);e.roomManager.loadRooms(n)}catch(e){console.error(`Failed to load rooms:`,e)}}async function ht(e,t){e.assistantName=await C(t,h.ASSISTANT_NAME)||`ShadowClaw`,e.triggerPattern=o(e.assistantName)}async function gt(e,t){let n=await C(t,h.VM_BOOT_MODE);e.vmBootMode=n===`disabled`||n===`auto`||n===`9p`||n===`ext2`?n:`disabled`,e.streamingEnabled=await C(t,h.STREAMING_ENABLED)!==`false`,e.webMcpToolsEnabled=await C(t,h.WEBMCP_TOOLS_ENABLED)!==`false`,e.vmBashFullInternetAccess=await C(t,h.VM_BASH_FULL_INTERNET_ACCESS)===`true`;let r=await C(t,h.WEBMCP_MODE);(r===`native`||r===`polyfill`)&&ke(r),e.contextCompressionEnabled=await C(t,h.CONTEXT_COMPRESSION_ENABLED)===`true`;let i=await C(t,h.REASONING_EFFORT);e.reasoningEffort=i?i.trim().toLowerCase():`none`,e.directToolCommandPolicy=dt(await C(t,h.DIRECT_TOOL_COMMAND_POLICY)),e.useProxy=await C(t,h.USE_PROXY)===`true`,e.proxyUrl=await C(t,h.PROXY_URL)||`/proxy`,e.gitProxyUrl=await C(t,h.GIT_PROXY_URL)||`/git-proxy`,e.taskServerEnabled=await C(t,h.TASK_SERVER_ENABLED)===`true`,e.taskServerUrl=await C(t,h.TASK_SERVER_URL)||(await import(`./config-C16fFWtP.js`).then(e=>e.k)).DEFAULT_TASK_SERVER_URL}async function _t(e,t){let n=await C(t,h.LLAMAFILE_MODE);n===`cli`||n===`server`?e.llamafileMode=n:await k(t,h.LLAMAFILE_MODE,e.llamafileMode);let r=await C(t,h.LLAMAFILE_HOST);r&&(e.llamafileHost=r);let i=await C(t,h.LLAMAFILE_PORT);if(i){let t=parseInt(i,10);Number.isFinite(t)&&t>=1&&t<=65535&&(e.llamafilePort=t)}await C(t,h.LLAMAFILE_OFFLINE)===`false`&&(e.llamafileOffline=!1),me(e);let a=await C(t,h.MESH_LLM_HOST);a&&(e.meshLlmHost=a),fe(e)}async function vt(e,t){let[n,i,a,o,c,l,d,f,p]=await Promise.all([C(t,h.PROVIDER),C(t,h.BEDROCK_REGION_FALLBACK),C(t,h.BEDROCK_PROFILE_FALLBACK),C(t,h.BEDROCK_AUTH_MODE),C(t,h.MODEL),C(t,h.MAX_TOKENS),C(t,h.MAX_ITERATIONS),C(t,h.RATE_LIMIT_CALLS_PER_MINUTE),C(t,h.RATE_LIMIT_AUTO_ADAPT)]),m=n||e.provider,g=m?r(m):void 0;g&&(e.provider=m,e.providerConfig=g),await e.loadApiKeyForProvider(t,e.provider),e.bedrockRegionFallback=(i||``).trim(),e.bedrockProfileFallback=(a||``).trim(),e.bedrockAuthMode=(o||`provider_chain`).trim();let _=typeof document<`u`&&!!document.getElementById(`shadow-claw-static-routing`),v=e.providerConfig?.format===`transformers_js`,y=!!e.providerConfig?.modelsUrl,b=()=>{if(_||v||!y)return;let t=()=>{ue(e).then(t=>u.fetchModelInfo(e.providerConfig,t||void 0,de(e,e.provider)))};typeof globalThis.requestIdleCallback==`function`?globalThis.requestIdleCallback(t,{timeout:5e3}):setTimeout(t,2e3)};!_&&!v&&y&&(typeof window<`u`&&typeof document<`u`?document.readyState===`complete`?b():window.addEventListener(`load`,b,{once:!0}):b()),e.model=c||e.providerConfig.defaultModel;let x=e.model;e.provider===`prompt_api`&&!P()&&(e.model===`browser-built-in`||!e.model)&&(x=await C(t,h.PROMPT_API_FALLBACK_MODEL)||`onnx-community/Qwen3-0.6B-ONNX`,he(x).catch(()=>{}));let S=s(x);if(e.maxTokens=l===`8192`||e.provider===`prompt_api`&&!P()&&l===`4096`?S:Math.max(1,parseInt(l||String(S),10)),d&&(e.maxIterations=parseInt(d,10)||50),f){let t=parseInt(f,10);e.rateLimitCallsPerMinute=Number.isFinite(t)?Math.max(0,t):0}e.rateLimitAutoAdapt=p!==`false`}async function yt(t,n){t.agentWorker=e(new URL(`./agent.worker.js`,import.meta.url).href),t.agentWorker.onmessage=e=>Pe(t,n,e.data),t.agentWorker.onerror=e=>{console.error(`Agent worker error:`,e)};let r=await C(n,h.STORAGE_HANDLE);r&&t.agentWorker.postMessage({payload:{storageHandle:r},type:`set-storage`}),ne(t),t.scheduler=new lt(async e=>{await Me(t,e)},()=>{t.events.emit(`task-change`,{type:`executed`})},e=>je(e,t)),t.scheduler.start(),ft(t,n)}var bt=class{agentWorker=null;assistantName=_;bedrockAuthMode=`provider_chain`;bedrockProfileFallback=``;bedrockRegionFallback=``;browserChat=new Ue;channelEnabledByType={browser:!0,peerjs:!1,telegram:!1,imessage:!1};channelRegistry=new G;channelsInitialized=!1;contextCompressionEnabled=!1;db=null;directToolCommandPolicy={...$};ensureControlPlaneConnected=ze;events=new at;gitProxyUrl=`/git-proxy`;imessage=new We;imessageApiKey=``;imessageChatIds=[];imessageServerUrl=``;inFlightEffectiveProviderByGroup=/* @__PURE__ */ new Map;inFlightProviderRequestIds=/* @__PURE__ */ new Map;inFlightTriggerByGroup=/* @__PURE__ */ new Map;llamafileHost=`127.0.0.1`;llamafileMode=`cli`;llamafileOffline=!0;llamafilePort=8080;maxIterations=50;maxTokens=g;meshLlmHost=``;messageQueue=[];model=a().defaultModel;peerCompletedContexts=/* @__PURE__ */ new Set;peerjs=new Oe;peerjsMyAlias=``;peerjsMyPeerId=``;peerjsPeerAliases={};peerjsServerHost=``;peerjsServerPath=``;peerjsServerPort=0;peerjsServerSecure=!0;peerjsTrustedPeerIds=[];pendingScheduledTasks=/* @__PURE__ */ new Set;processing=!1;promptControllers=/* @__PURE__ */ new Map;provider=p;providerConfig=a();proxyUrl=`/proxy`;pushSubscriptionWarned=!1;rateLimitAutoAdapt=!0;rateLimitCallsPerMinute=0;reasoningEffort=`none`;roomChannel=new Ye;roomManager;router=null;scheduler=null;schedulerTriggeredGroups=/* @__PURE__ */ new Set;state=`idle`;streamingEnabled=!0;taskServerEnabled=!1;taskServerUrl=`/schedule`;telegram=new Xe;telegramBotToken=``;telegramChatIds=[];telegramUseProxy=!1;transformersProgressPollers=/* @__PURE__ */ new Map;triggerPattern=o(_);useProxy=!1;vmBashFullInternetAccess=!1;vmBootMode=`disabled`;vmStatus={ready:!1,booting:!1,bootAttempted:!1,error:null};webMcpEffectCleanup=null;webMcpRegistrationLock=Promise.resolve();webMcpToolsEnabled=!0;#e=null;#t=null;constructor(){this.roomManager=pt(this),this.initializeChannelRegistry()}clearProviderRequest(e){this.inFlightProviderRequestIds.delete(e)}createProviderRequestId(e){if(this.provider!==`llamafile`)return this.inFlightProviderRequestIds.delete(e),``;let t=`${e}:${Date.now().toString(36)}:${Math.random().toString(36).slice(2,10)}`;return this.inFlightProviderRequestIds.set(e,t),t}async ensureWorkerReady(){this.db&&!this.channelsInitialized&&(this.channelsInitialized=!0,await mt(this,this.db),this.browserChat.onDisplay(()=>{})),!this.agentWorker&&this.db&&await yt(this,this.db),this.db&&(j.load(this.db),H(this,this.db))}initializeChannelRegistry(){this.channelRegistry=new G,this.channelRegistry.register(`br:`,this.browserChat,{badge:`Browser`,autoTrigger:!0}),this.channelRegistry.register(`tg:`,this.telegram,{badge:`Telegram`,autoTrigger:!1}),this.channelRegistry.register(`im:`,this.imessage,{badge:`iMessage`,autoTrigger:!0}),this.channelRegistry.register(`peer:`,this.peerjs,{badge:`PeerJS`,autoTrigger:!1}),this.channelRegistry.register(`room:`,this.roomChannel,{badge:`Room`,autoTrigger:!1}),this.roomChannel.setManager(this.roomManager),this.roomChannel.setPeerJs(this.peerjs),this.peerjs.setRoomNotificationHandler((e,t,n)=>this.roomManager.handleNotification(e,t,n)),this.router=new nt(this.channelRegistry)}setState(e,t){this.state=e,this.events.emit(`state-change`,{state:e,groupId:t})}shutdown(){this.channelRegistry.stopAll(),this.scheduler?.stop();for(let e of this.transformersProgressPollers.keys())F(this,e);this.agentWorker?.terminate(),typeof this.webMcpEffectCleanup==`function`&&this.webMcpEffectCleanup(),Ae()}async ensureAllConnections(e={}){let t=e.force??!1;try{await this.ensureControlPlaneConnected({orchestrator:this,db:this.db||void 0,force:t})}catch(e){console.warn(`Error ensuring Control Plane connection:`,e)}try{Se(this,t)}catch(e){console.warn(`Error ensuring channel connections:`,e)}this.taskServerEnabled&&this.db&&(O.replayTaskSyncOutbox(this.db),O.loadTasks(this.db)),this.scheduler&&(this.scheduler.start(),this.scheduler.tick())}stopCurrentRequest(e=m){if(this.state!==`thinking`&&this.state!==`responding`)return;F(this,e);let t=this.inFlightProviderRequestIds.get(e)||``;this.clearProviderRequest(e),this.agentWorker?.postMessage({type:`cancel`,payload:{groupId:e}}),this.provider===`llamafile`&&t&&pe(t);let n=this.promptControllers.get(e);n&&(n.abort(),this.promptControllers.delete(e)),this.inFlightTriggerByGroup.delete(e),this.inFlightEffectiveProviderByGroup.delete(e),this.events.emit(`typing`,{groupId:e,typing:!1}),this.router?.setTyping(e,!1),this.setState(`idle`,e)}async getApiKey(){if(!this.#t)return null;let e=Date.now();if(this.#e&&this.#e.expiresAt>e)return this.#e.value;try{let t=await I(this.#t);return t===null?null:(this.#e={expiresAt:e+3e4,value:t},t)}catch(e){return console.error(`[Orchestrator] Failed to decrypt API key:`,e),null}}async getApiKeyForSpecificProvider(e,t){let n=await C(e,i(t));if(!n&&t===`openrouter`){let t=await C(e,h.API_KEY);t&&(n=t)}if(!n)return``;try{return await I(n)||``}catch(e){return console.error(`[Orchestrator] Failed to decrypt API key:`,e),``}}async handleCompactDone(e,t,n){await D(e,t);let r={channel:this.channelRegistry.getChannelType(t)??`browser`,content:`📝 **Context Compacted**\n\n${n}`,groupId:t,id:A(),isFromMe:!0,isTrigger:!1,sender:this.assistantName,timestamp:Date.now()};await w(e,r),this.events.emit(`context-compacted`,{groupId:t,summary:n}),this.events.emit(`typing`,{groupId:t,typing:!1}),this.setState(`idle`,t)}async init(){let e=await He();this.db=e,await T(),await Promise.all([ht(this,e),vt(this,e),_t(this,e),gt(this,e)]),await T();let t=typeof document<`u`&&!!document.getElementById(`shadow-claw-static-routing`),n=re(),r=n?.sidebar?.chatHidden,i=n?.sidebar?.tasksHidden,[a,o]=await Promise.all([C(e,h.SIDEBAR_CHAT_HIDDEN),C(e,h.SIDEBAR_TASKS_HIDDEN)]),s=a==null?!!r:N(a),c=o==null?!!i:N(o),l=s&&c;t?l||setTimeout(()=>{this.ensureWorkerReady()},15e3):l||await yt(this,e),l||(this.channelsInitialized=!0,mt(this,e).then(()=>{this.browserChat.onDisplay(()=>{})})),this.events.emit(`ready`,void 0);let u=typeof globalThis<`u`?globalThis.window:void 0;return t?l||setTimeout(()=>{j.load(e),H(this,e)},15e3):u&&typeof u.requestIdleCallback==`function`?l||u.requestIdleCallback(()=>{j.load(e),H(this,e)}):l||(await j.load(e),H(this,e)),e}async loadApiKeyForProvider(e,t){let n=await C(e,i(t));if(!n&&t===`openrouter`){let r=await C(e,h.API_KEY);r&&(n=r,await k(e,i(t),r))}this.#t=n||``,this.#e=null}async loadSecretConfig(e,t){let n=await C(e,t);if(!n)return``;try{return await I(n)||``}catch{let r=await L(n);return r&&await k(e,t,r),n}}async newSession(e,t=m){await D(e,t),this.events.emit(`session-reset`,{groupId:t})}async refreshContextUsage(e,t=m){let n=``;try{n=await ae(e,t,`MEMORY.md`)}catch{}let i=j.enabledTools,a=O.getPeerState(t)||void 0,o=Re(this.assistantName,n,i,j.systemPromptOverride,a,void 0,{groupId:t}),c=(await te(e)).find(e=>e.groupId===t),l=c?.pinnedModel??(c?.pinnedProvider?r(c.pinnedProvider)?.defaultModel??this.model:this.model),u=l;(c?.pinnedProvider??this.provider)===`prompt_api`&&(l===`browser-built-in`||!l)&&!P()&&(u=await C(this.db,h.PROMPT_API_FALLBACK_MODEL)||`onnx-community/Qwen3-0.6B-ONNX`);let d=typeof c?.pinnedMaxTokens==`number`&&Number.isFinite(c.pinnedMaxTokens)&&c.pinnedMaxTokens>0?Math.floor(c.pinnedMaxTokens):this.maxTokens,f=Math.max(1,Math.min(d,s(u))),p=Ne(u),g=U(o)+(i?.reduce((e,t)=>e+U(JSON.stringify(t)),0)??0),_=await Ie(t,200),v=Le(_,{contextLimit:p,systemPromptTokens:g,maxOutputTokens:f,skimTop:this.contextCompressionEnabled}),y=v.estimatedTokens+g;if(O.tokenUsage){let e=O.tokenUsage,t=(e.inputTokens||0)+(e.cacheReadTokens||0)+(e.outputTokens||0);y=Math.max(y,t)}this.events.emit(`context-usage`,{estimatedTokens:y,contextLimit:p,usagePercent:Math.min(100,Math.max(v.usagePercent,y/p*100)),truncatedCount:v.truncatedCount})}async restartCurrentRequest(e=m){if(this.state!==`thinking`&&this.state!==`responding`||!this.db)return!1;let t=this.inFlightTriggerByGroup.get(e);if(!t)return!1;this.stopCurrentRequest(e);let{invokeAgent:n}=await import(`./invoke-agent-C_geruwq.js`);return await n(this,this.db,e,t),!0}async routeRoomA2UIAction(e,t){let n=z(e),r=this.peerjs.myPeerId||this.peerjsMyPeerId,i=this.roomManager.getSurfaceOwner(t.surfaceId);if(!i||i===r){if(!this.db)return;await Y(this,this.db,{id:A(),groupId:e,sender:this.peerjsMyAlias||r||`you`,content:J(t),timestamp:Date.now(),channel:`room`,a2uiAction:t})}else this.roomManager.broadcastA2UIAction(n,t)}async saveSecretConfig(e,t,n){if(!n){await k(e,t,``);return}let r=await L(n);if(!r)throw Error(`Failed to encrypt secret config for ${t}`);await k(e,t,r)}async setApiKey(e,t){this.#t=await L(t),this.#e=null;let n=await L(t);if(!n)throw Error(`key failed to encrypt. config cannot set.`);await k(e,i(this.provider),n)}submitMessage(e,t=m){this.browserChat.submit(e,t)}};export{bt as Orchestrator};
|