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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator-cRBe3lhq.js","names":["_defaultSetConfig","_defaultSetConfig","idb","idb","idb"],"sources":["../../src/core/orchestrator/utils/operations/vm.ts","../../src/core/orchestrator/utils/sync-proxy-config-to-service-worker.ts","../../src/core/orchestrator/utils/settings.ts","../../src/db/clear-group-messages.ts","../../src/db/clone-group-messages.ts","../../src/db/clone-group-tasks.ts","../../src/db/delete-message.ts","../../src/db/delete-task.ts","../../src/db/get-recent-messages.ts","../../src/db/groups.ts","../../src/db/save-message.ts","../../src/db/save-task.ts","../../src/db/update-task-last-run.ts","../../src/db/reorder-tasks.ts","../../src/storage/copy-group-directory.ts","../../src/storage/default-index-content.mjs","../../src/storage/ensure-main-group-index.ts","../../src/storage/default-memory-content.mjs","../../src/storage/ensure-main-group-memory.ts","../../src/storage/list-group-files.ts","../../src/storage/request-storage-access.ts","../../src/storage/delete-all-group-files.ts","../../src/storage/delete-group-directory.ts","../../src/storage/suppressed-pages.ts","../../src/storage/static-main-site.ts","../../src/ui/agui-adapter.ts","../../src/stores/orchestrator.ts"],"sourcesContent":["import { CONFIG_KEYS, DEFAULT_GROUP_ID } from \"../../../../config/config.js\";\nimport { setConfig as _defaultSetConfig } from \"../../../../db/set-config.js\";\n\nimport type { ShadowClawDatabase } from \"../../../../db/db.js\";\nimport type { VMBootMode } from \"../../../../shell/vm.js\";\nimport type { OrchestratorState } from \"../../orchestrator-state.js\";\n\ntype SetConfigFn = (\n db: ShadowClawDatabase,\n key: string,\n value: string,\n) => Promise<void>;\n\nexport function openTerminalSession(\n state: Pick<OrchestratorState, \"agentWorker\">,\n groupId = DEFAULT_GROUP_ID,\n): void {\n state.agentWorker?.postMessage({\n payload: { groupId },\n type: \"vm-terminal-open\",\n });\n}\n\nexport function closeTerminalSession(\n state: Pick<OrchestratorState, \"agentWorker\">,\n groupId = DEFAULT_GROUP_ID,\n): void {\n state.agentWorker?.postMessage({\n payload: { groupId },\n type: \"vm-terminal-close\",\n });\n}\n\nexport function sendTerminalInput(\n state: Pick<OrchestratorState, \"agentWorker\">,\n data: string,\n): void {\n state.agentWorker?.postMessage({\n payload: { data },\n type: \"vm-terminal-input\",\n });\n}\n\nexport function syncTerminalWorkspace(\n state: Pick<OrchestratorState, \"agentWorker\">,\n groupId = DEFAULT_GROUP_ID,\n): void {\n state.agentWorker?.postMessage({\n payload: { groupId },\n type: \"vm-workspace-sync\",\n });\n}\n\nexport function flushTerminalWorkspace(\n state: Pick<OrchestratorState, \"agentWorker\">,\n groupId = DEFAULT_GROUP_ID,\n): void {\n state.agentWorker?.postMessage({\n payload: { groupId },\n type: \"vm-workspace-flush\",\n });\n}\n\nexport function answerUserPrompt(\n state: Pick<OrchestratorState, \"agentWorker\">,\n id: string,\n response: string | null,\n): void {\n state.agentWorker?.postMessage({\n payload: { id, response },\n type: \"ask-user-response\",\n });\n}\n\nexport async function setVMBootMode(\n state: Pick<OrchestratorState, \"vmBootMode\" | \"agentWorker\">,\n db: ShadowClawDatabase,\n mode: VMBootMode,\n _setConfig: SetConfigFn = _defaultSetConfig,\n): Promise<void> {\n const normalized =\n mode === \"disabled\" || mode === \"9p\" || mode === \"ext2\" || mode === \"auto\"\n ? mode\n : \"disabled\";\n state.vmBootMode = normalized;\n await _setConfig(db, CONFIG_KEYS.VM_BOOT_MODE, normalized);\n state.agentWorker?.postMessage({\n payload: { mode: normalized },\n type: \"set-vm-mode\",\n });\n}\n\nexport async function setVMBootHost(\n state: Pick<OrchestratorState, \"agentWorker\">,\n db: ShadowClawDatabase,\n bootHost: string,\n _setConfig: SetConfigFn = _defaultSetConfig,\n): Promise<void> {\n const normalized = typeof bootHost === \"string\" ? bootHost.trim() : \"\";\n await _setConfig(db, CONFIG_KEYS.VM_BOOT_HOST, normalized);\n state.agentWorker?.postMessage({\n payload: { bootHost: normalized },\n type: \"set-vm-mode\",\n });\n}\n\nexport async function setVMNetworkRelayURL(\n state: Pick<OrchestratorState, \"agentWorker\">,\n db: ShadowClawDatabase,\n relayUrl: string,\n _setConfig: SetConfigFn = _defaultSetConfig,\n): Promise<void> {\n const normalized = typeof relayUrl === \"string\" ? relayUrl.trim() : \"\";\n await _setConfig(db, CONFIG_KEYS.VM_NETWORK_RELAY_URL, normalized);\n state.agentWorker?.postMessage({\n payload: { networkRelayUrl: normalized },\n type: \"set-vm-mode\",\n });\n}\n","import type { OrchestratorState } from \"../orchestrator-state.js\";\n\nexport function syncProxyConfigToServiceWorker(\n state: Pick<OrchestratorState, \"useProxy\" | \"proxyUrl\">,\n) {\n if (\"serviceWorker\" in navigator && navigator.serviceWorker?.controller) {\n navigator.serviceWorker.controller.postMessage({\n type: \"set-proxy-config\",\n payload: {\n useProxy: state.useProxy,\n proxyUrl: state.proxyUrl,\n },\n });\n }\n}\n","import {\n CONFIG_KEYS,\n DEFAULT_TASK_SERVER_URL,\n} from \"../../../config/config.js\";\nimport { setConfig as _defaultSetConfig } from \"../../../db/set-config.js\";\nimport { syncProxyConfigToServiceWorker } from \"./sync-proxy-config-to-service-worker.js\";\n\nimport type { ShadowClawDatabase } from \"../../../db/db.js\";\nimport type { OrchestratorState } from \"../orchestrator-state.js\";\n\ntype SetConfigFn = (\n db: ShadowClawDatabase,\n key: string,\n value: string,\n) => Promise<void>;\n\n// ── Boolean / string / number settings ──────────────────────────────────────\n\nexport async function setContextCompressionEnabled(\n state: OrchestratorState,\n db: ShadowClawDatabase,\n enabled: boolean,\n _setConfig: SetConfigFn = _defaultSetConfig,\n): Promise<void> {\n state.contextCompressionEnabled = !!enabled;\n\n await _setConfig(\n db,\n CONFIG_KEYS.CONTEXT_COMPRESSION_ENABLED,\n state.contextCompressionEnabled ? \"true\" : \"false\",\n );\n}\n\nexport async function setGitProxyUrl(\n state: OrchestratorState,\n db: ShadowClawDatabase,\n url: string,\n _setConfig: SetConfigFn = _defaultSetConfig,\n): Promise<void> {\n state.gitProxyUrl = url || \"/git-proxy\";\n\n await _setConfig(db, CONFIG_KEYS.GIT_PROXY_URL, state.gitProxyUrl);\n}\n\nexport async function setMaxIterations(\n state: OrchestratorState,\n db: ShadowClawDatabase,\n value: number,\n _setConfig: SetConfigFn = _defaultSetConfig,\n): Promise<void> {\n state.maxIterations = value;\n\n await _setConfig(db, CONFIG_KEYS.MAX_ITERATIONS, String(value));\n}\n\nexport async function setMaxTokens(\n state: OrchestratorState,\n db: ShadowClawDatabase,\n value: number,\n _setConfig: SetConfigFn = _defaultSetConfig,\n): Promise<void> {\n // Allow the user to set any value ≥ 1. The model will error at runtime if\n // the value exceeds its actual capacity — this is the correct behaviour for\n // ONNX community models that have no enforced API cap.\n const normalized = Math.max(1, value);\n\n state.maxTokens = normalized;\n\n await _setConfig(db, CONFIG_KEYS.MAX_TOKENS, String(normalized));\n}\n\nexport async function setProxyUrl(\n state: OrchestratorState,\n db: ShadowClawDatabase,\n url: string,\n _setConfig: SetConfigFn = _defaultSetConfig,\n): Promise<void> {\n state.proxyUrl = url || \"/proxy\";\n\n await _setConfig(db, CONFIG_KEYS.PROXY_URL, state.proxyUrl);\n syncProxyConfigToServiceWorker(state);\n}\n\nexport async function setRateLimitAutoAdapt(\n state: OrchestratorState,\n db: ShadowClawDatabase,\n enabled: boolean,\n _setConfig: SetConfigFn = _defaultSetConfig,\n): Promise<void> {\n state.rateLimitAutoAdapt = !!enabled;\n\n await _setConfig(\n db,\n CONFIG_KEYS.RATE_LIMIT_AUTO_ADAPT,\n state.rateLimitAutoAdapt ? \"true\" : \"false\",\n );\n}\n\nexport async function setRateLimitCallsPerMinute(\n state: OrchestratorState,\n db: ShadowClawDatabase,\n value: number,\n _setConfig: SetConfigFn = _defaultSetConfig,\n): Promise<void> {\n const normalized = Number.isFinite(value)\n ? Math.max(0, Math.floor(value))\n : 0;\n\n state.rateLimitCallsPerMinute = normalized;\n\n await _setConfig(\n db,\n CONFIG_KEYS.RATE_LIMIT_CALLS_PER_MINUTE,\n String(normalized),\n );\n}\n\nexport async function setReasoningEffort(\n state: OrchestratorState,\n db: ShadowClawDatabase,\n effort: string,\n _setConfig: SetConfigFn = _defaultSetConfig,\n): Promise<void> {\n const normalized =\n typeof effort === \"string\" ? effort.trim().toLowerCase() : \"none\";\n state.reasoningEffort = normalized || \"none\";\n\n await _setConfig(db, CONFIG_KEYS.REASONING_EFFORT, state.reasoningEffort);\n}\n\nexport async function setStreamingEnabled(\n state: OrchestratorState,\n db: ShadowClawDatabase,\n enabled: boolean,\n _setConfig: SetConfigFn = _defaultSetConfig,\n): Promise<void> {\n state.streamingEnabled = !!enabled;\n\n await _setConfig(\n db,\n CONFIG_KEYS.STREAMING_ENABLED,\n state.streamingEnabled ? \"true\" : \"false\",\n );\n}\n\nexport async function setTaskServerEnabled(\n state: OrchestratorState,\n db: ShadowClawDatabase,\n enabled: boolean,\n _setConfig: SetConfigFn = _defaultSetConfig,\n): Promise<void> {\n state.taskServerEnabled = !!enabled;\n\n await _setConfig(\n db,\n CONFIG_KEYS.TASK_SERVER_ENABLED,\n state.taskServerEnabled ? \"true\" : \"false\",\n );\n}\n\nexport async function setTaskServerUrl(\n state: OrchestratorState,\n db: ShadowClawDatabase,\n url: string,\n _setConfig: SetConfigFn = _defaultSetConfig,\n): Promise<void> {\n const defaultUrl = DEFAULT_TASK_SERVER_URL;\n\n state.taskServerUrl = url || defaultUrl;\n\n await _setConfig(db, CONFIG_KEYS.TASK_SERVER_URL, state.taskServerUrl);\n}\n\nexport async function setUseProxy(\n state: OrchestratorState,\n db: ShadowClawDatabase,\n enabled: boolean,\n _setConfig: SetConfigFn = _defaultSetConfig,\n): Promise<void> {\n state.useProxy = !!enabled;\n\n await _setConfig(\n db,\n CONFIG_KEYS.USE_PROXY,\n state.useProxy ? \"true\" : \"false\",\n );\n syncProxyConfigToServiceWorker(state);\n}\n\nexport async function setVMBashFullInternetAccess(\n state: OrchestratorState,\n db: ShadowClawDatabase,\n enabled: boolean,\n _setConfig: SetConfigFn = _defaultSetConfig,\n): Promise<void> {\n state.vmBashFullInternetAccess = !!enabled;\n\n await _setConfig(\n db,\n CONFIG_KEYS.VM_BASH_FULL_INTERNET_ACCESS,\n state.vmBashFullInternetAccess ? \"true\" : \"false\",\n );\n}\n\nexport async function setVMBashTimeout(\n _state: OrchestratorState,\n db: ShadowClawDatabase,\n timeoutSec: number,\n _setConfig: SetConfigFn = _defaultSetConfig,\n): Promise<void> {\n const normalized = Math.min(Math.max(Math.floor(timeoutSec), 1), 1800);\n\n await _setConfig(db, CONFIG_KEYS.VM_BASH_TIMEOUT_SEC, String(normalized));\n}\n","import { isSqliteDatabase } from \"./sqlite/types.js\";\nimport type { ShadowClawDatabase } from \"./types.js\";\n\n/**\n * Delete all messages for a given group.\n *\n * Accepts an optional `db` parameter for headless/SQLite usage.\n */\nexport function clearGroupMessages(\n dbOrGroupId: ShadowClawDatabase | string,\n groupIdOrNothing?: string,\n): Promise<void> {\n let db: ShadowClawDatabase | null = null;\n let groupId: string;\n\n if (typeof dbOrGroupId === \"string\") {\n groupId = dbOrGroupId;\n } else {\n db = dbOrGroupId;\n groupId = groupIdOrNothing!;\n }\n\n // SQLite fast path\n if (db && isSqliteDatabase(db)) {\n const raw = db.db;\n raw.prepare(\"DELETE FROM messages WHERE groupId = ?\").run(groupId);\n return Promise.resolve();\n }\n\n return new Promise((resolve, reject) => {\n try {\n const idb = db as IDBDatabase | null;\n const tx = idb?.transaction(\"messages\", \"readwrite\");\n\n if (!tx) {\n return reject(\n new Error(\"failed to get transaction, cannot clear group messages.\"),\n );\n }\n\n const store = tx.objectStore(\"messages\");\n const index = store.index(\"by-group\");\n const request = index.openCursor(groupId);\n\n request.onsuccess = () => {\n const cursor = request.result;\n if (cursor) {\n cursor.delete();\n cursor.continue();\n } else {\n resolve(undefined);\n }\n };\n\n request.onerror = () => reject(request.error);\n } catch (err) {\n reject(err);\n }\n });\n}\n","import { ulid } from \"../utils/ulid.js\";\nimport { isSqliteDatabase } from \"./sqlite/types.js\";\nimport type { ShadowClawDatabase } from \"./types.js\";\n\n/**\n * Clone all messages from one group to another, assigning new IDs.\n */\nexport function cloneGroupMessages(\n db: ShadowClawDatabase,\n sourceGroupId: string,\n targetGroupId: string,\n): Promise<number> {\n if (db && isSqliteDatabase(db)) {\n const raw = db.db;\n const rows = raw\n .prepare(\"SELECT * FROM messages WHERE groupId = ?\")\n .all(sourceGroupId) as any[];\n const stmt = raw.prepare(\n `INSERT INTO messages\n (id, groupId, timestamp, content, sender, channel, isFromMe, isTrigger, attachments, a2uiAction, a2uiEnvelopes, freshContext, subagent)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n );\n for (const r of rows) {\n stmt.run(\n ulid(),\n targetGroupId,\n r.timestamp,\n r.content,\n r.sender,\n r.channel ?? \"chat\",\n r.isFromMe,\n r.isTrigger,\n r.attachments,\n r.a2uiAction,\n r.a2uiEnvelopes,\n r.freshContext,\n r.subagent,\n );\n }\n return Promise.resolve(rows.length);\n }\n\n return new Promise((resolve, reject) => {\n const idb = db as IDBDatabase;\n const tx = idb?.transaction(\"messages\", \"readwrite\");\n\n if (!tx) {\n throw new Error(\"failed to get transaction, cannot clone messages.\");\n }\n\n const store = tx.objectStore(\"messages\");\n const index = store.index(\"by-group\");\n const request = index.openCursor(sourceGroupId);\n let count = 0;\n\n request.onsuccess = () => {\n const cursor = request.result;\n if (cursor) {\n const clone = { ...cursor.value, id: ulid(), groupId: targetGroupId };\n store.put(clone);\n count++;\n cursor.continue();\n } else {\n resolve(count);\n }\n };\n\n request.onerror = () => reject(request.error);\n });\n}\n","import { ulid } from \"../utils/ulid.js\";\nimport { isSqliteDatabase } from \"./sqlite/types.js\";\nimport type { ShadowClawDatabase } from \"./types.js\";\n\n/**\n * Clone all tasks from one group to another, assigning new IDs.\n */\nexport function cloneGroupTasks(\n db: ShadowClawDatabase,\n sourceGroupId: string,\n targetGroupId: string,\n): Promise<number> {\n if (db && isSqliteDatabase(db)) {\n const raw = db.db;\n const rows = raw\n .prepare(\"SELECT * FROM tasks WHERE groupId = ?\")\n .all(sourceGroupId) as any[];\n const stmt = raw.prepare(\n `INSERT INTO tasks\n (id, groupId, enabled, schedule, prompt, tools, lastRun, createdAt, type, freshContext, subagent, name, task_order, pushNotifications)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n );\n for (const r of rows) {\n stmt.run(\n ulid(),\n targetGroupId,\n r.enabled ? 1 : 0,\n r.schedule ?? null,\n r.prompt ?? \"\",\n r.tools ?? null,\n r.lastRun ?? null,\n r.createdAt,\n r.type ?? null,\n r.freshContext ? 1 : null,\n r.subagent ? 1 : null,\n r.name ?? null,\n r.task_order ?? null,\n r.pushNotifications ? 1 : null,\n );\n }\n return Promise.resolve(rows.length);\n }\n\n return new Promise((resolve, reject) => {\n const idb = db as IDBDatabase;\n const tx = idb?.transaction(\"tasks\", \"readwrite\");\n\n if (!tx) {\n throw new Error(\"failed to get transaction, cannot clone tasks.\");\n }\n\n const store = tx.objectStore(\"tasks\");\n const index = store.index(\"by-group\");\n const request = index.openCursor(sourceGroupId);\n let count = 0;\n\n request.onsuccess = () => {\n const cursor = request.result;\n if (cursor) {\n const clone = { ...cursor.value, id: ulid(), groupId: targetGroupId };\n store.put(clone);\n count++;\n cursor.continue();\n } else {\n resolve(count);\n }\n };\n\n request.onerror = () => reject(request.error);\n });\n}\n","import { txPromise } from \"./tx-promise.js\";\nimport type { ShadowClawDatabase } from \"./types.js\";\n\n/**\n * Delete a message from the database by ID\n */\nexport function deleteMessage(\n db: ShadowClawDatabase,\n id: string,\n): Promise<void> {\n return txPromise(db, \"messages\", \"readwrite\", (store) =>\n store.delete(id),\n ).then(() => undefined);\n}\n","import { txPromise } from \"./tx-promise.js\";\nimport type { ShadowClawDatabase } from \"./types.js\";\n\n/**\n * Delete a task\n */\nexport function deleteTask(db: ShadowClawDatabase, id: string): Promise<void> {\n if (!id) {\n return Promise.reject(new Error(\"Task ID is required for deletion.\"));\n }\n\n return txPromise(db, \"tasks\", \"readwrite\", (store) => store.delete(id)).then(\n () => undefined,\n );\n}\n","import { getDb } from \"./db.js\";\nimport { isSqliteDatabase } from \"./sqlite/types.js\";\nimport type { ShadowClawDatabase, StoredMessage } from \"./types.js\";\n\n/**\n * Get recent messages for a group.\n *\n * Accepts an optional `db` parameter for headless/SQLite usage. When omitted,\n * falls back to the singleton `getDb()` (browser IDB path).\n */\nexport function getRecentMessages(\n groupIdOrDb: string | ShadowClawDatabase,\n limitOrGroupId: number | string,\n maybeLimit?: number,\n): Promise<StoredMessage[]> {\n // Overload resolution: getRecentMessages(db, groupId, limit) vs getRecentMessages(groupId, limit)\n let db: ShadowClawDatabase | null = null;\n let groupId: string;\n let limit: number;\n\n if (typeof groupIdOrDb === \"string\") {\n groupId = groupIdOrDb;\n limit = limitOrGroupId as number;\n } else {\n db = groupIdOrDb;\n groupId = limitOrGroupId as string;\n limit = maybeLimit ?? 50;\n }\n\n // SQLite fast path\n if (db && isSqliteDatabase(db)) {\n return Promise.resolve().then(() => {\n const raw = db!.db;\n // Get the N most-recent rows (DESC), then reverse for oldest-first output\n const rows = (raw\n .prepare(\n `SELECT * FROM messages WHERE groupId = ? ORDER BY timestamp DESC LIMIT ?`,\n )\n .all(groupId, limit) ?? []) as any[];\n return rows.reverse().map(deserializeMessage);\n });\n }\n\n return new Promise(async (resolve, reject) => {\n try {\n const tx: ShadowClawDatabase = db ?? (await getDb());\n\n if (!tx) {\n return reject(\n new Error(\"failed to get transaction, cannot get recent messages.\"),\n );\n }\n\n const transactionStore = (tx as IDBDatabase).transaction(\n \"messages\",\n \"readonly\",\n );\n if (!transactionStore) {\n return reject(new Error(\"failed to get transaction\"));\n }\n\n const store = transactionStore.objectStore(\"messages\");\n const index = store.index(\"by-group-time\");\n const range = IDBKeyRange.bound([groupId, 0], [groupId, Infinity]);\n const request = index.openCursor(range, \"prev\");\n const results: StoredMessage[] = [];\n\n request.onsuccess = () => {\n const cursor = request.result;\n if (cursor && results.length < limit) {\n results.push(cursor.value);\n\n cursor.continue();\n } else {\n // Reverse so oldest first\n resolve(results.reverse());\n }\n };\n\n request.onerror = () => reject(request.error);\n } catch (err) {\n reject(err);\n }\n });\n}\n\nfunction deserializeMessage(row: any): StoredMessage {\n return {\n ...row,\n isFromMe: !!row.isFromMe,\n isTrigger: !!row.isTrigger,\n attachments: row.attachments ? JSON.parse(row.attachments) : undefined,\n a2uiAction: row.a2uiAction ? JSON.parse(row.a2uiAction) : undefined,\n a2uiEnvelopes: row.a2uiEnvelopes\n ? JSON.parse(row.a2uiEnvelopes)\n : undefined,\n };\n}\n","/**\n * ShadowClaw — Group (conversation) metadata management\n * Stores group metadata in the config store as JSON.\n */\n\nimport { DEFAULT_GROUP_ID } from \"../config/config.js\";\nimport { getConfig } from \"./get-config.js\";\nimport { setConfig } from \"./set-config.js\";\nimport { ulid } from \"../utils/ulid.js\";\nimport type { GroupMeta, ShadowClawDatabase } from \"./types.js\";\n\nconst CONFIG_KEY = \"group_metadata\";\n\n/**\n * Get all group metadata from config.\n */\nexport async function getGroupMetadata(\n db: ShadowClawDatabase,\n): Promise<GroupMeta[]> {\n const raw = await getConfig(db, CONFIG_KEY);\n if (!raw) {\n return [];\n }\n\n try {\n return JSON.parse(raw);\n } catch {\n return [];\n }\n}\n\n/**\n * Save group metadata to config.\n */\nexport async function saveGroupMetadata(\n db: ShadowClawDatabase,\n metadata: GroupMeta[],\n): Promise<void> {\n await setConfig(db, CONFIG_KEY, JSON.stringify(metadata));\n}\n\n/**\n * Create a new group and persist it.\n */\nexport async function createGroup(\n db: ShadowClawDatabase,\n name: string,\n prefix: string = \"br:\",\n id?: string,\n): Promise<GroupMeta> {\n const groups = await getGroupMetadata(db);\n const group: GroupMeta = {\n groupId: `${prefix}${id ?? ulid()}`,\n name,\n createdAt: Date.now(),\n };\n groups.push(group);\n await saveGroupMetadata(db, groups);\n\n return group;\n}\n\n/**\n * Rename an existing group.\n */\nexport async function renameGroup(\n db: ShadowClawDatabase,\n groupId: string,\n newName: string,\n): Promise<void> {\n const groups = await getGroupMetadata(db);\n const group = groups.find((g) => g.groupId === groupId);\n if (group) {\n group.name = newName;\n }\n\n await saveGroupMetadata(db, groups);\n}\n\n/**\n * Update the tool tags pinned to an existing group.\n */\nexport async function updateGroupToolTags(\n db: ShadowClawDatabase,\n groupId: string,\n tags?: string[],\n): Promise<void> {\n const groups = await getGroupMetadata(db);\n const group = groups.find((g) => g.groupId === groupId);\n if (group) {\n if (tags && tags.length > 0) {\n group.toolTags = tags;\n } else {\n delete group.toolTags;\n }\n }\n\n await saveGroupMetadata(db, groups);\n}\n\n/**\n * Delete a group from metadata.\n */\nexport async function deleteGroupMetadata(\n db: ShadowClawDatabase,\n groupId: string,\n): Promise<void> {\n const groups = await getGroupMetadata(db);\n const filtered = groups.filter((g) => g.groupId !== groupId);\n await saveGroupMetadata(db, filtered);\n}\n\n/**\n * List all groups in their persisted order.\n * If no groups exist, returns a default \"Main\" group.\n */\nexport async function listGroups(db: ShadowClawDatabase): Promise<GroupMeta[]> {\n const groups = await getGroupMetadata(db);\n if (groups.length === 0) {\n const defaultGroup: GroupMeta = {\n groupId: DEFAULT_GROUP_ID,\n name: \"Main\",\n createdAt: 0,\n };\n await saveGroupMetadata(db, [defaultGroup]);\n\n return [defaultGroup];\n }\n\n return groups;\n}\n\n/**\n * Reorder groups according to a provided list of groupIds.\n * Groups not in the list are appended at the end in their original order.\n */\nexport async function reorderGroups(\n db: ShadowClawDatabase,\n orderedIds: string[],\n): Promise<void> {\n const groups = await getGroupMetadata(db);\n const byId = new Map(groups.map((g) => [g.groupId, g]));\n\n const reordered: GroupMeta[] = [];\n for (const id of orderedIds) {\n const g = byId.get(id);\n if (g) {\n reordered.push(g);\n byId.delete(id);\n }\n }\n\n // Append any groups not mentioned in orderedIds\n for (const g of groups) {\n if (byId.has(g.groupId)) {\n reordered.push(g);\n }\n }\n\n await saveGroupMetadata(db, reordered);\n}\n\n/**\n * Clone a group (metadata only). Messages must be cloned separately.\n * Returns null if the source group is not found.\n */\nexport async function cloneGroup(\n db: ShadowClawDatabase,\n sourceGroupId: string,\n): Promise<GroupMeta | null> {\n const groups = await getGroupMetadata(db);\n const source = groups.find((g) => g.groupId === sourceGroupId);\n if (!source) {\n return null;\n }\n\n // Extract prefix from the source groupId (e.g. \"br:\" from \"br:abc123\")\n const colonIdx = sourceGroupId.indexOf(\":\");\n const prefix = colonIdx >= 0 ? sourceGroupId.slice(0, colonIdx + 1) : \"br:\";\n\n const clone: GroupMeta = {\n groupId: `${prefix}${ulid()}`,\n name: `${source.name} (copy)`,\n createdAt: Date.now(),\n pinnedMaxTokens: source.pinnedMaxTokens,\n providerRuntimeOverrides: source.providerRuntimeOverrides\n ? JSON.parse(JSON.stringify(source.providerRuntimeOverrides))\n : undefined,\n subagentModelSelectionMode: source.subagentModelSelectionMode,\n subagentMaxTokens: source.subagentMaxTokens,\n subagentPinnedProvider: source.subagentPinnedProvider,\n subagentPinnedModel: source.subagentPinnedModel,\n subagentFastProvider: source.subagentFastProvider,\n subagentFastModel: source.subagentFastModel,\n subagentSmartProvider: source.subagentSmartProvider,\n subagentSmartModel: source.subagentSmartModel,\n subagentPowerfulProvider: source.subagentPowerfulProvider,\n subagentPowerfulModel: source.subagentPowerfulModel,\n toolTags: source.toolTags ? [...source.toolTags] : undefined,\n };\n groups.push(clone);\n await saveGroupMetadata(db, groups);\n\n return clone;\n}\n\n/**\n * Update the pinned provider and model for an existing group.\n */\nexport async function updateGroupPinnedProvider(\n db: ShadowClawDatabase,\n groupId: string,\n providerId?: string,\n modelId?: string,\n pinnedMaxTokens?: number,\n): Promise<void> {\n const groups = await getGroupMetadata(db);\n const group = groups.find((g) => g.groupId === groupId);\n if (group) {\n if (providerId) {\n group.pinnedProvider = providerId;\n } else {\n delete group.pinnedProvider;\n }\n\n if (modelId) {\n group.pinnedModel = modelId;\n } else {\n delete group.pinnedModel;\n }\n\n if (\n typeof pinnedMaxTokens === \"number\" &&\n Number.isFinite(pinnedMaxTokens) &&\n pinnedMaxTokens > 0\n ) {\n group.pinnedMaxTokens = Math.floor(pinnedMaxTokens);\n } else {\n delete group.pinnedMaxTokens;\n }\n }\n\n await saveGroupMetadata(db, groups);\n}\n\n/**\n * Update group-level defaults for subagent provider/model selection.\n */\nexport async function updateGroupSubagentSettings(\n db: ShadowClawDatabase,\n groupId: string,\n mode: \"automatic\" | \"manual\",\n providerId?: string,\n modelId?: string,\n subagentMaxTokens?: number,\n): Promise<void> {\n const groups = await getGroupMetadata(db);\n const group = groups.find((g) => g.groupId === groupId);\n if (group) {\n group.subagentModelSelectionMode = mode;\n\n if (mode === \"manual\") {\n if (providerId) {\n group.subagentPinnedProvider = providerId;\n } else {\n delete group.subagentPinnedProvider;\n }\n\n if (modelId) {\n group.subagentPinnedModel = modelId;\n } else {\n delete group.subagentPinnedModel;\n }\n } else {\n delete group.subagentPinnedProvider;\n delete group.subagentPinnedModel;\n }\n\n if (\n typeof subagentMaxTokens === \"number\" &&\n Number.isFinite(subagentMaxTokens) &&\n subagentMaxTokens > 0\n ) {\n group.subagentMaxTokens = Math.floor(subagentMaxTokens);\n } else {\n delete group.subagentMaxTokens;\n }\n }\n\n await saveGroupMetadata(db, groups);\n}\n\n/**\n * Update group-level provider runtime overrides (for provider module settings).\n */\nexport async function updateGroupProviderRuntimeOverrides(\n db: ShadowClawDatabase,\n groupId: string,\n overrides: GroupMeta[\"providerRuntimeOverrides\"],\n): Promise<void> {\n const groups = await getGroupMetadata(db);\n const group = groups.find((g) => g.groupId === groupId);\n if (group) {\n if (overrides && Object.keys(overrides).length > 0) {\n group.providerRuntimeOverrides = JSON.parse(JSON.stringify(overrides));\n } else {\n delete group.providerRuntimeOverrides;\n }\n }\n\n await saveGroupMetadata(db, groups);\n}\n\n/**\n * Update the named subagent model profile slots (fast / smart / powerful).\n * These are available in automatic mode so the LLM can route subagents by\n * task complexity without hallucinating arbitrary provider/model IDs.\n */\nexport async function updateGroupSubagentProfiles(\n db: ShadowClawDatabase,\n groupId: string,\n profiles: {\n fast?: { provider?: string; model?: string } | null;\n smart?: { provider?: string; model?: string } | null;\n powerful?: { provider?: string; model?: string } | null;\n },\n): Promise<void> {\n const groups = await getGroupMetadata(db);\n const group = groups.find((g) => g.groupId === groupId);\n if (!group) {\n return;\n }\n\n const set = (\n providerKey: keyof GroupMeta,\n modelKey: keyof GroupMeta,\n slot: { provider?: string; model?: string } | null | undefined,\n ) => {\n if (slot === null) {\n // Explicit null clears the slot\n delete (group as any)[providerKey];\n delete (group as any)[modelKey];\n } else if (slot !== undefined) {\n if (slot.provider) {\n (group as any)[providerKey] = slot.provider;\n } else {\n delete (group as any)[providerKey];\n }\n\n if (slot.model) {\n (group as any)[modelKey] = slot.model;\n } else {\n delete (group as any)[modelKey];\n }\n }\n };\n\n set(\"subagentFastProvider\", \"subagentFastModel\", profiles.fast);\n set(\"subagentSmartProvider\", \"subagentSmartModel\", profiles.smart);\n set(\"subagentPowerfulProvider\", \"subagentPowerfulModel\", profiles.powerful);\n\n await saveGroupMetadata(db, groups);\n}\n","import { txPromise } from \"./tx-promise.js\";\nimport type { ShadowClawDatabase, StoredMessage } from \"./types.js\";\n\n/**\n * Save a message to the database\n */\nexport function saveMessage(\n db: ShadowClawDatabase,\n msg: StoredMessage,\n): Promise<void> {\n return txPromise(db, \"messages\", \"readwrite\", (store) => store.put(msg)).then(\n () => undefined,\n );\n}\n","import { txPromise } from \"./tx-promise.js\";\nimport type { ShadowClawDatabase, Task } from \"./types.js\";\n\n/**\n * Save a task to the database\n */\nexport function saveTask(db: ShadowClawDatabase, task: Task): Promise<void> {\n // Store `enabled` as 0/1 so the IndexedDB 'by-enabled' index works\n const record = { ...task, enabled: task.enabled ? 1 : 0 };\n\n return txPromise(db, \"tasks\", \"readwrite\", (store) => store.put(record)).then(\n () => undefined,\n );\n}\n","import { getDb } from \"./db.js\";\nimport { isSqliteDatabase } from \"./sqlite/types.js\";\nimport type { ShadowClawDatabase } from \"./types.js\";\n\n/**\n * Update task last run timestamp.\n *\n * Accepts an optional `db` parameter for headless/SQLite usage. When omitted,\n * falls back to the singleton `getDb()` (browser IDB path).\n */\nexport function updateTaskLastRun(\n dbOrId: ShadowClawDatabase | string,\n idOrTimestamp: string | number,\n maybeTimestamp?: number,\n): Promise<void> {\n let db: ShadowClawDatabase | null = null;\n let id: string;\n let timestamp: number;\n\n if (typeof dbOrId === \"string\") {\n id = dbOrId;\n timestamp = idOrTimestamp as number;\n } else {\n db = dbOrId;\n id = idOrTimestamp as string;\n timestamp = maybeTimestamp!;\n }\n\n // SQLite fast path\n if (db && isSqliteDatabase(db)) {\n return Promise.resolve().then(() => {\n db!.db\n .prepare(\"UPDATE tasks SET lastRun = ? WHERE id = ?\")\n .run(timestamp, id);\n });\n }\n\n return new Promise(async (resolve, reject) => {\n try {\n const tx: ShadowClawDatabase = db ?? (await getDb());\n\n if (!tx) {\n return reject(\n new Error(\"failed to get transaction, cannot update task last run.\"),\n );\n }\n\n const transactionStore = (tx as IDBDatabase).transaction(\n \"tasks\",\n \"readwrite\",\n );\n if (!transactionStore) {\n return reject(new Error(\"failed to get transaction\"));\n }\n\n const store = transactionStore.objectStore(\"tasks\");\n const getReq = store.get(id);\n getReq.onsuccess = () => {\n const task = getReq.result;\n if (!task) {\n resolve();\n\n return;\n }\n\n task.lastRun = timestamp;\n const putReq = store.put(task);\n putReq.onsuccess = () => resolve();\n putReq.onerror = () => reject(putReq.error);\n };\n\n getReq.onerror = () => reject(getReq.error);\n } catch (err) {\n reject(err);\n }\n });\n}\n","import { getAllTasks } from \"./get-all-tasks.js\";\nimport { saveTask } from \"./save-task.js\";\nimport type { ShadowClawDatabase, Task } from \"./types.js\";\n\n/**\n * Reorder tasks in a group by assigning sequential order values.\n */\nexport async function reorderTasks(\n db: ShadowClawDatabase,\n groupId: string,\n orderedIds: string[],\n): Promise<Task[]> {\n const allTasks = await getAllTasks(db);\n const groupTasks = allTasks.filter((t) => t.groupId === groupId);\n const byId = new Map(groupTasks.map((t) => [t.id, t]));\n\n const updatedTasks: Task[] = [];\n let orderIndex = 0;\n\n // Process the ordered IDs first\n for (const id of orderedIds) {\n const task = byId.get(id);\n if (task) {\n task.order = orderIndex++;\n await saveTask(db, task);\n updatedTasks.push(task);\n byId.delete(id);\n }\n }\n\n // Process any remaining tasks in the group that were not explicitly ordered\n const remaining = Array.from(byId.values()).sort((a, b) => {\n const oA = a.order ?? 0;\n const oB = b.order ?? 0;\n if (oA !== oB) {\n return oA - oB;\n }\n return a.createdAt - b.createdAt;\n });\n\n for (const task of remaining) {\n task.order = orderIndex++;\n await saveTask(db, task);\n updatedTasks.push(task);\n }\n\n return updatedTasks;\n}\n","import { getGroupDir } from \"./get-group-dir.js\";\nimport { getOpfsRootDirName, getStorageStatus } from \"./storage.js\";\nimport {\n writeFileHandle,\n writeOpfsPathViaWorker,\n} from \"./write-file-handle.js\";\nimport type { ShadowClawDatabase } from \"../db/types.js\";\n\n/**\n * Copy a nested directory from one group workspace to another.\n */\nexport async function copyGroupDirectory(\n db: ShadowClawDatabase,\n sourceGroupId: string,\n targetGroupId: string,\n dirPath: string,\n): Promise<void> {\n const sourceRoot = await getGroupDir(db, sourceGroupId);\n const targetRoot = await getGroupDir(db, targetGroupId);\n const parts = dirPath\n .replace(/\\\\/g, \"/\")\n .replace(/^\\/+/, \"\")\n .split(\"/\")\n .filter(Boolean);\n\n let sourceDir = sourceRoot;\n let targetDir = targetRoot;\n\n for (const part of parts) {\n sourceDir = await sourceDir.getDirectoryHandle(part);\n targetDir = await targetDir.getDirectoryHandle(part, { create: true });\n }\n\n const safeTargetGroupId = targetGroupId.replace(/:/g, \"-\");\n const initialPathSegments = [\n getOpfsRootDirName(),\n \"groups\",\n safeTargetGroupId,\n ...parts,\n ];\n\n try {\n await copyDirectoryContents(\n db,\n targetGroupId,\n sourceDir,\n targetDir,\n initialPathSegments,\n );\n } catch (copyErr) {\n if (parts.length > 0) {\n await targetRoot\n .removeEntry(parts[0], { recursive: true })\n .catch(() => undefined);\n }\n throw copyErr;\n }\n}\n\nasync function copyDirectoryContents(\n db: ShadowClawDatabase,\n targetGroupId: string,\n sourceDir: FileSystemDirectoryHandle,\n targetDir: FileSystemDirectoryHandle,\n currentPathSegments: string[],\n): Promise<void> {\n for await (const [name, handle] of (sourceDir as any).entries()) {\n if (handle.kind === \"directory\") {\n const nextTargetDir = await targetDir.getDirectoryHandle(name, {\n create: true,\n });\n await copyDirectoryContents(db, targetGroupId, handle, nextTargetDir, [\n ...currentPathSegments,\n name,\n ]);\n\n continue;\n }\n\n const file = await handle.getFile();\n const targetFileHandle = await targetDir.getFileHandle(name, {\n create: true,\n });\n\n try {\n await writeFileHandle(targetFileHandle, file);\n } catch (writeErr) {\n const message =\n writeErr instanceof Error ? writeErr.message : String(writeErr);\n const needsOpfsWorkerFallback =\n message.includes(\"Writable file streams are not supported\") &&\n (await getStorageStatus(db)).type === \"opfs\";\n\n if (!needsOpfsWorkerFallback) {\n throw writeErr;\n }\n\n await writeOpfsPathViaWorker([...currentPathSegments, name], file);\n }\n }\n}\n","// Shared source of truth for the default index.html content.\nexport const DEFAULT_MAIN_GROUP_INDEX_CONTENT = `---\ntitle: \"ShadowClaw Pages\"\ncreated: \"1970-01-01T00:00:00Z\"\nupdated: \"1970-01-01T00:00:00Z\"\nslug: \"shadow-claw-pages\"\n---\n\n<article>\n <h2>Welcome to ShadowClaw Pages</h2>\n <p>This is the default static page for your workspace.</p>\n <h2 id=\"getting-started-with-shadowclaw\">Getting started with ShadowClaw</h2>\n <h3 id=\"what-is-memorymd\">What is MEMORY.md?</h3>\n <ul>\n <li>\n \"<a href=\"/files/main/MEMORY.md\">MEMORY.md</a>\" is a per conversation, per\n invocation, auto-loaded, persistent agent memory file.\n </li>\n <li>\n It is designed to be a helpful scratchpad for agents to store important\n information, notes, and context about the conversation.\n </li>\n </ul>\n <h3 id=\"how-to-use-files\">How to use Files</h3>\n <ul>\n <li>Open \"<a href=\"/files/main\">Files</a>\" to browse your workspace.</li>\n <li>\n Edit and preview files with the file viewer:\n <ul>\n <li><a href=\"/files/main/index.html\">index.html</a></li>\n </ul>\n </li>\n </ul>\n <h3 id=\"how-to-use-pages\">How to use Pages</h3>\n <ul>\n <li>Use Set as Page on any markdown or HTML file to add it to Pages.</li>\n <li>Remove a page anytime from the \"<a href=\"/pages\">Pages</a>\" view.</li>\n </ul>\n <h3 id=\"how-to-use-chat\">How to use Chat</h3>\n <ul>\n <li>\n Open \"<a href=\"/settings\">Settings</a>\" to configure your agent's system\n prompt, tools, and more.\n </li>\n <li>\n Open \"<a href=\"/chat/main\">Chat</a>\" to start a conversation with your\n agent.\n </li>\n </ul>\n <h2 id=\"further-information\">Further information</h2>\n <ul>\n <li>\n <a href=\"https://github.com/xt-ml/shadow-claw#-shadowclaw\"\n >ShadowClaw Project</a\n >\n </li>\n <li><a href=\"https://deepwiki.com/xt-ml/shadow-claw\">Deep Wiki</a></li>\n </ul>\n</article>`;\n","/// <reference lib=\"dom\" />\nimport { CONFIG_KEYS, DEFAULT_GROUP_ID } from \"../config/config.js\";\nimport { getConfig } from \"../db/get-config.js\";\nimport { setConfig } from \"../db/set-config.js\";\nimport { DEFAULT_MAIN_GROUP_INDEX_CONTENT } from \"./default-index-content.mjs\";\nimport { groupFileExists } from \"./group-file-exists.js\";\nimport { readGroupFile } from \"./read-group-file.js\";\nimport { writeGroupFile } from \"./write-group-file.js\";\n\nimport { applyBasePath } from \"../core/app-routes.js\";\n\nimport type { ShadowClawDatabase } from \"../db/types.js\";\n\nexport const DEFAULT_MAIN_GROUP_INDEX_PATH = \"index.html\";\nexport const STATIC_MAIN_GROUP_INDEX_PATH = \"static-main/index.html\";\n\nexport function resolveStaticMainGroupIndexUrl(): string {\n const targetPath = applyBasePath(`/${STATIC_MAIN_GROUP_INDEX_PATH}`);\n\n if (typeof window !== \"undefined\" && window.location?.origin) {\n try {\n return new URL(targetPath, window.location.origin).toString();\n } catch {\n return targetPath;\n }\n }\n\n return targetPath;\n}\n\nexport async function isMainGroupIndexSuppressed(\n db: ShadowClawDatabase,\n): Promise<boolean> {\n const raw = (await getConfig(\n db,\n CONFIG_KEYS.MAIN_GROUP_INDEX_SUPPRESSED,\n )) as unknown;\n\n return raw === true || raw === \"true\";\n}\n\nexport async function setMainGroupIndexSuppressed(\n db: ShadowClawDatabase,\n suppressed: boolean,\n): Promise<void> {\n await setConfig(db, CONFIG_KEYS.MAIN_GROUP_INDEX_SUPPRESSED, suppressed);\n}\n\n/**\n * Ensure the main index.html exists in the workspace file store.\n * Returns true if the file exists after this call (already existed or was created).\n */\nexport async function ensureMainGroupIndex(\n db: ShadowClawDatabase,\n groupId: string = DEFAULT_GROUP_ID,\n customContent?: string,\n): Promise<boolean> {\n try {\n const exists = await groupFileExists(db, groupId, \"index.html\");\n\n if (exists) {\n if (groupId === DEFAULT_GROUP_ID) {\n try {\n const existingText = await readGroupFile(db, groupId, \"index.html\");\n if (\n typeof existingText === \"string\" &&\n (existingText.includes(\"<shadow-claw\") ||\n existingText.includes(\"data-shadow-claw-dsd\"))\n ) {\n await writeGroupFile(\n db,\n groupId,\n \"index.html\",\n customContent ?? DEFAULT_MAIN_GROUP_INDEX_CONTENT,\n );\n }\n } catch {}\n }\n return true;\n }\n\n if (\n groupId === DEFAULT_GROUP_ID &&\n (await isMainGroupIndexSuppressed(db))\n ) {\n return false;\n }\n\n let content = customContent;\n if (content === undefined && typeof fetch === \"function\") {\n try {\n const res = await fetch(resolveStaticMainGroupIndexUrl());\n if (res.ok) {\n const text = await res.text();\n if (\n !text.includes(\"<shadow-claw\") &&\n !text.includes(\"data-shadow-claw-dsd\")\n ) {\n content = text;\n }\n }\n } catch {\n // Fetch failed or unavailable, fallback to default\n }\n }\n content = content ?? DEFAULT_MAIN_GROUP_INDEX_CONTENT;\n\n await writeGroupFile(db, groupId, \"index.html\", content);\n\n return true;\n } catch (error) {\n console.warn(\"Failed to ensure main workspace Memory:\", error);\n\n return false;\n }\n}\n","// Shared source of truth for the default MEMORY.md content.\n// Imported by both src/storage/ensureMainGroupMemory.ts (runtime)\n// and bin/prerender-dsd-shell/prerender-dsd-shell.mjs (build-time) so they stay in sync.\n\nexport const DEFAULT_MAIN_GROUP_MEMORY_CONTENT = `---\ntitle: \"Agent Memory\"\ncreated: \"1970-01-01T00:00:00Z\"\nupdated: \"1970-01-01T00:00:00Z\"\nslug: \"agent-memory\"\n---\n\n## Memory\n\n### Workspace Layout & Skills Conventions\n\n- **Skills**: \\`.agents/skills/<skill-name>/SKILL.md\\` (canonical flat layout; legacy \\`.agents/skills/main/\\` supported for backward-compatible reads)\n- **Declarative Tools**: \\`.agents/tools/<tool-name>.json\\` (canonical flat layout; legacy \\`.agents/tools/main/\\` supported for backward-compatible reads)\n- **Skill Format**: Markdown file with YAML frontmatter AND a Markdown body (frontmatter is metadata only; always include a \\`# <Skill Title>\\` heading and human-readable description in the Markdown body so it renders in document previews):\n\n \\`\\`\\`yaml\n ---\n name: <skill-name>\n description: <clear summary for model and slash command>\n user-invocable: true\n metadata:\n allowed-tools: <tool1> <tool2>\n execution:\n type: tools\n tools:\n - name: <tool1>\n input: { ... }\n - name: <tool2>\n input: { \"$pipe\": \"prev\" }\n ---\n # <Skill Title>\n\n <Overview and description of what the skill does, parameters, and usage instructions.>\n \\`\\`\\`\n\n- **Declarative Tool Format**: JSON with \\`\"name\"\\`, \\`\"description\"\\`, \\`\"executor\": \"javascript\"\\`, \\`\"inputSchema\"\\`, and \\`\"code\"\\`.\n- **Open Agent Skills & Discovery**: Install community skills from [skills.sh](https://skills.sh) via \\`npx shadow-claw skills add <owner/repo>\\` (or \\`npx skills add\\`), search via \\`npx shadow-claw skills find <term>\\`, and publish RFC v0.2.0 discovery indexes via \\`npx shadow-claw skills:index\\` (\\`.well-known/agent-skills/index.json\\`).\n- **Authoring**: Use \\`create_directory\\` before writing new directories, then \\`write_file\\`.`;\n","/// <reference lib=\"dom\" />\nimport { CONFIG_KEYS, DEFAULT_GROUP_ID } from \"../config/config.js\";\nimport { getConfig } from \"../db/get-config.js\";\nimport { setConfig } from \"../db/set-config.js\";\nimport { DEFAULT_MAIN_GROUP_MEMORY_CONTENT } from \"./default-memory-content.mjs\";\nimport { groupFileExists } from \"./group-file-exists.js\";\nimport { readGroupFile } from \"./read-group-file.js\";\nimport { writeGroupFile } from \"./write-group-file.js\";\n\nimport { applyBasePath } from \"../core/app-routes.js\";\n\nimport type { ShadowClawDatabase } from \"../db/types.js\";\n\nexport { DEFAULT_MAIN_GROUP_MEMORY_CONTENT as DEFAULT_MAIN_GROUP_MEMORY_CONTENT };\n\nexport const DEFAULT_MAIN_GROUP_MEMORY_PATH = \"MEMORY.md\";\nexport const STATIC_MAIN_GROUP_MEMORY_PATH = \"static-main/MEMORY.md\";\n\nexport function resolveStaticMainGroupMemoryUrl(): string {\n const targetPath = applyBasePath(`/${STATIC_MAIN_GROUP_MEMORY_PATH}`);\n\n if (typeof window !== \"undefined\" && window.location?.origin) {\n try {\n return new URL(targetPath, window.location.origin).toString();\n } catch {\n return targetPath;\n }\n }\n\n return targetPath;\n}\n\nexport async function isMainGroupMemorySuppressed(\n db: ShadowClawDatabase,\n): Promise<boolean> {\n const raw = (await getConfig(\n db,\n CONFIG_KEYS.MAIN_GROUP_README_SUPPRESSED,\n )) as unknown;\n\n return raw === true || raw === \"true\";\n}\n\nexport async function setMainGroupMemorySuppressed(\n db: ShadowClawDatabase,\n suppressed: boolean,\n): Promise<void> {\n await setConfig(db, CONFIG_KEYS.MAIN_GROUP_README_SUPPRESSED, suppressed);\n}\n\n/**\n * Ensure the main MEMORY.md exists in the workspace file store.\n * Returns true if the file exists after this call (already existed or was created).\n */\nexport async function ensureMainGroupMemory(\n db: ShadowClawDatabase,\n groupId: string = DEFAULT_GROUP_ID,\n customContent?: string,\n): Promise<boolean> {\n try {\n const exists = await groupFileExists(\n db,\n groupId,\n DEFAULT_MAIN_GROUP_MEMORY_PATH,\n );\n if (exists) {\n if (groupId === DEFAULT_GROUP_ID) {\n try {\n const existingText = await readGroupFile(\n db,\n groupId,\n DEFAULT_MAIN_GROUP_MEMORY_PATH,\n );\n if (\n typeof existingText === \"string\" &&\n (existingText.includes(\"<shadow-claw\") ||\n existingText.includes(\"data-shadow-claw-dsd\"))\n ) {\n await writeGroupFile(\n db,\n groupId,\n DEFAULT_MAIN_GROUP_MEMORY_PATH,\n customContent ?? DEFAULT_MAIN_GROUP_MEMORY_CONTENT,\n );\n }\n } catch {}\n }\n return true;\n }\n\n if (\n groupId === DEFAULT_GROUP_ID &&\n (await isMainGroupMemorySuppressed(db))\n ) {\n return false;\n }\n\n let content = customContent;\n if (content === undefined && typeof fetch === \"function\") {\n try {\n const res = await fetch(resolveStaticMainGroupMemoryUrl());\n if (res.ok) {\n const text = await res.text();\n if (\n !text.includes(\"<shadow-claw\") &&\n !text.includes(\"data-shadow-claw-dsd\")\n ) {\n content = text;\n }\n }\n } catch {\n // Fetch failed or unavailable, fallback to default\n }\n }\n content = content ?? DEFAULT_MAIN_GROUP_MEMORY_CONTENT;\n\n await writeGroupFile(db, groupId, DEFAULT_MAIN_GROUP_MEMORY_PATH, content);\n\n return true;\n } catch (error) {\n console.warn(\"Failed to ensure main workspace Memory:\", error);\n\n return false;\n }\n}\n","import { getGroupDir } from \"./get-group-dir.js\";\nimport { invalidateStorageRoot, isStaleHandleError } from \"./storage.js\";\nimport type { ShadowClawDatabase } from \"../db/types.js\";\n\n/**\n * List files and directories in a group's workspace directory.\n */\nexport async function listGroupFiles(\n db: ShadowClawDatabase,\n groupId: string,\n dirPath: string = \".\",\n): Promise<string[]> {\n for (let attempt = 0; attempt < 2; attempt++) {\n try {\n const groupDir = await getGroupDir(db, groupId);\n\n let dir = groupDir;\n if (dirPath && dirPath !== \".\") {\n const parts = dirPath\n .replace(/\\\\/g, \"/\")\n .replace(/^\\/home\\/user\\//, \"/\")\n .replace(/^\\/+/, \"\")\n .split(\"/\")\n .filter(Boolean);\n\n for (const seg of parts) {\n const child = await dir.getDirectoryHandle(seg);\n\n // Guard against stale handles where navigation returns the same directory\n if (\n typeof dir.isSameEntry === \"function\" &&\n (await dir.isSameEntry(child))\n ) {\n throw new Error(\n `Directory navigation stuck at \"${dir.name}\" for segment \"${seg}\" — ` +\n \"the stored directory handle may be stale.\",\n );\n }\n\n dir = child;\n }\n }\n\n const entries: string[] = [];\n for await (const [name, handle] of (dir as any).entries()) {\n entries.push(handle.kind === \"directory\" ? `${name}/` : name);\n }\n\n return entries.sort();\n } catch (err) {\n if (attempt === 0 && isStaleHandleError(err)) {\n invalidateStorageRoot();\n\n continue;\n }\n\n throw err;\n }\n }\n\n return [];\n}\n","import { CONFIG_KEYS } from \"../config/config.js\";\nimport { getConfig } from \"../db/get-config.js\";\nimport type { ShadowClawDatabase } from \"../db/types.js\";\n\nfunction isDirectoryHandle(handle: any): handle is FileSystemDirectoryHandle {\n if (!handle || typeof handle !== \"object\") {\n return false;\n }\n\n const ctor = globalThis.FileSystemDirectoryHandle;\n if (typeof ctor !== \"undefined\" && handle instanceof ctor) {\n return true;\n }\n\n return (\n typeof handle.getDirectoryHandle === \"function\" &&\n typeof handle.getFileHandle === \"function\" &&\n typeof handle.requestPermission === \"function\"\n );\n}\n\n/**\n * Request storage handle permission if needed.\n */\nexport async function requestStorageAccess(\n db: ShadowClawDatabase,\n): Promise<boolean> {\n const handle = await getConfig(db, CONFIG_KEYS.STORAGE_HANDLE);\n if (isDirectoryHandle(handle)) {\n const status = await (handle as any).requestPermission({\n mode: \"readwrite\",\n });\n\n return status === \"granted\";\n }\n\n return true; // No handle means OPFS, which always has \"access\"\n}\n","import { getGroupDir } from \"./get-group-dir.js\";\nimport type { ShadowClawDatabase } from \"../db/types.js\";\n\n/**\n * Recursively delete all files and directories in a group's workspace.\n */\nexport async function deleteAllGroupFiles(\n db: ShadowClawDatabase,\n groupId: string,\n): Promise<void> {\n const groupDir = await getGroupDir(db, groupId);\n\n // Delete everything in the group directory\n for await (const [name] of (groupDir as any).entries()) {\n await groupDir.removeEntry(name, { recursive: true });\n }\n}\n","import { getGroupDir } from \"./get-group-dir.js\";\nimport { parsePath } from \"./parse-path.js\";\nimport type { ShadowClawDatabase } from \"../db/types.js\";\n\n/**\n * Delete a directory recursively from a group's workspace.\n */\nexport async function deleteGroupDirectory(\n db: ShadowClawDatabase,\n groupId: string,\n dirPath: string,\n): Promise<void> {\n const groupDir = await getGroupDir(db, groupId);\n const { dirs, filename: dirName } = parsePath(dirPath.replace(/\\/$/, \"\"));\n\n let dir = groupDir;\n for (const seg of dirs) {\n dir = await dir.getDirectoryHandle(seg);\n }\n\n // recursive: true makes it delete non-empty directories\n await dir.removeEntry(dirName, { recursive: true });\n}\n","import { CONFIG_KEYS } from \"../config/config.js\";\nimport { getConfig } from \"../db/get-config.js\";\nimport { setConfig } from \"../db/set-config.js\";\n\nimport type { SavedPageRef, ShadowClawDatabase } from \"../db/types.js\";\n\nexport function pageRefKey(groupId: string, path: string): string {\n return `${groupId}:${path}`;\n}\n\nexport async function getSuppressedPages(\n db: ShadowClawDatabase,\n): Promise<SavedPageRef[]> {\n const raw = await getConfig(db, CONFIG_KEYS.SUPPRESSED_PAGES_LIST);\n if (!raw || typeof raw !== \"string\") {\n return [];\n }\n\n try {\n const parsed = JSON.parse(raw);\n if (Array.isArray(parsed)) {\n return parsed as SavedPageRef[];\n }\n } catch {\n // Ignore invalid JSON\n }\n\n return [];\n}\n\nexport async function isPageSuppressed(\n db: ShadowClawDatabase,\n groupId: string,\n path: string,\n): Promise<boolean> {\n const list = await getSuppressedPages(db);\n const targetKey = pageRefKey(groupId, path);\n\n return list.some((ref) => pageRefKey(ref.groupId, ref.path) === targetKey);\n}\n\nexport async function suppressPage(\n db: ShadowClawDatabase,\n groupId: string,\n path: string,\n): Promise<void> {\n const list = await getSuppressedPages(db);\n const targetKey = pageRefKey(groupId, path);\n\n if (!list.some((ref) => pageRefKey(ref.groupId, ref.path) === targetKey)) {\n const updated = [...list, { groupId, path }];\n await setConfig(\n db,\n CONFIG_KEYS.SUPPRESSED_PAGES_LIST,\n JSON.stringify(updated),\n );\n }\n}\n\nexport async function unsuppressPage(\n db: ShadowClawDatabase,\n groupId: string,\n path: string,\n): Promise<void> {\n const list = await getSuppressedPages(db);\n const targetKey = pageRefKey(groupId, path);\n const filtered = list.filter(\n (ref) => pageRefKey(ref.groupId, ref.path) !== targetKey,\n );\n\n if (filtered.length !== list.length) {\n await setConfig(\n db,\n CONFIG_KEYS.SUPPRESSED_PAGES_LIST,\n JSON.stringify(filtered),\n );\n }\n}\n","import { CONFIG_KEYS, DEFAULT_GROUP_ID } from \"../config/config.js\";\nimport {\n getNamespacedItem,\n setNamespacedItem,\n} from \"../utils/namespaced-storage.js\";\nimport { DEFAULT_MAIN_GROUP_INDEX_CONTENT } from \"./default-index-content.mjs\";\nimport { DEFAULT_MAIN_GROUP_MEMORY_CONTENT } from \"./default-memory-content.mjs\";\n\nimport { applyBasePath } from \"../core/app-routes.js\";\nimport { getConfig } from \"../db/get-config.js\";\nimport { setConfig } from \"../db/set-config.js\";\n\nimport { deleteAllGroupFiles } from \"./delete-all-group-files.js\";\nimport { deleteGroupDirectory } from \"./delete-group-directory.js\";\nimport { ensureMainGroupIndex } from \"./ensure-main-group-index.js\";\n\nimport {\n ensureMainGroupMemory,\n isMainGroupMemorySuppressed,\n} from \"./ensure-main-group-memory.js\";\n\nimport { groupFileExists } from \"./group-file-exists.js\";\nimport { isPageSuppressed, pageRefKey } from \"./suppressed-pages.js\";\nimport { writeGroupFile } from \"./write-group-file.js\";\nimport { isPagePathAllowed } from \"../utils/is-page-path-allowed.js\";\nimport { normalizeStringList } from \"../utils/normalize-string-list.js\";\nimport { dedentLeadingWhitespace } from \"../utils/dedent.js\";\n\nimport type { SavedPageRef, ShadowClawDatabase } from \"../db/types.js\";\n\nexport interface StaticPageSource {\n displayPath: string;\n content: string;\n}\n\nexport interface StaticSkillSource {\n displayPath: string;\n content: string;\n}\n\nexport interface StaticToolSource {\n displayPath: string;\n content: string;\n}\n\nexport interface StaticMainManifest {\n pages: StaticPageSource[];\n skills?: StaticSkillSource[];\n skillsPurgeId?: string;\n tools?: StaticToolSource[];\n preRenderedStaticPages?: Record<string, any>;\n /** One-shot purge guard. Runtime stores this in localStorage after purging;\n * subsequent boots skip the purge until the value changes. */\n purgeId?: string;\n}\n\n/** localStorage key that records the last completed purge run. */\nexport const PURGE_STORAGE_KEY = \"sc:purge-id\";\nexport const PURGE_CONFIG_KEY = \"static_main_site_purge_id\";\nexport const SKILLS_PURGE_STORAGE_KEY = \"sc:skills-purge-id\";\nexport const SKILLS_PURGE_CONFIG_KEY = \"static_main_skills_purge_id\";\nconst LEGACY_PURGE_ID = \"__legacy_purge_pages__\";\n\nexport const STATIC_MAIN_MANIFEST_PATH = \"static-main-manifest.json\";\nexport const STATIC_MAIN_DIR = \"static-main\";\n\nexport function staticMainSiteSeededKey(\n groupId: string = DEFAULT_GROUP_ID,\n): string {\n return groupId === DEFAULT_GROUP_ID\n ? CONFIG_KEYS.STATIC_MAIN_SITE_SEEDED\n : `${CONFIG_KEYS.STATIC_MAIN_SITE_SEEDED}:${groupId}`;\n}\n\nexport async function isStaticMainSiteSeeded(\n db: ShadowClawDatabase,\n groupId: string = DEFAULT_GROUP_ID,\n): Promise<boolean> {\n const key = staticMainSiteSeededKey(groupId);\n const raw = (await getConfig(db, key)) as unknown;\n\n return raw === true || raw === \"true\";\n}\n\nexport async function setStaticMainSiteSeeded(\n db: ShadowClawDatabase,\n groupId: string = DEFAULT_GROUP_ID,\n seeded: boolean = true,\n): Promise<void> {\n const key = staticMainSiteSeededKey(groupId);\n await setConfig(db, key, seeded);\n}\n\nexport function resolveStaticMainManifestUrl(): string {\n const targetPath = applyBasePath(`/${STATIC_MAIN_MANIFEST_PATH}`);\n\n if (typeof window !== \"undefined\" && window.location?.origin) {\n try {\n return new URL(targetPath, window.location.origin).toString();\n } catch {\n return targetPath;\n }\n }\n\n return targetPath;\n}\n\nexport function resolveStaticMainFileUrl(displayPath: string): string {\n const cleanPath = displayPath.replace(/^\\/+/, \"\");\n let baseDir: string = STATIC_MAIN_DIR;\n\n if (typeof document !== \"undefined\") {\n try {\n const scriptEl = document.getElementById(\"shadow-claw-site-config\");\n if (scriptEl?.textContent) {\n const config = JSON.parse(scriptEl.textContent);\n if (typeof config?.pages?.baseUrl === \"string\") {\n baseDir = config.pages.baseUrl\n .replace(/^\\/+/, \"\")\n .replace(/\\/+$/, \"\");\n }\n }\n } catch {}\n }\n\n const targetPath = baseDir\n ? applyBasePath(`/${baseDir}/${cleanPath}`)\n : applyBasePath(`/${cleanPath}`);\n\n if (typeof window !== \"undefined\" && window.location?.origin) {\n try {\n return new URL(targetPath, window.location.origin).toString();\n } catch {\n return targetPath;\n }\n }\n\n return targetPath;\n}\n\nexport async function fetchStaticMainManifest(): Promise<StaticMainManifest | null> {\n if (typeof fetch !== \"function\") {\n return null;\n }\n\n try {\n const url = resolveStaticMainManifestUrl();\n const res = await fetch(url);\n if (res.ok) {\n const contentType = res.headers?.get?.(\"content-type\") || \"\";\n if (contentType.includes(\"text/html\")) {\n return null;\n }\n const parsed = await res.json();\n if (parsed && Array.isArray(parsed.pages)) {\n return parsed as StaticMainManifest;\n }\n }\n } catch {\n // Fetch failed or unavailable\n }\n\n return null;\n}\n\nexport async function fetchStaticMainFile(\n displayPath: string,\n): Promise<string | null> {\n if (typeof fetch !== \"function\") {\n return null;\n }\n\n try {\n const url = resolveStaticMainFileUrl(displayPath);\n const res = await fetch(url);\n if (res.ok) {\n const contentType = res.headers?.get?.(\"content-type\") || \"\";\n if (\n (displayPath.endsWith(\".md\") ||\n displayPath.endsWith(\".markdown\") ||\n displayPath.endsWith(\".json\")) &&\n contentType.includes(\"text/html\")\n ) {\n return null;\n }\n const text = await res.text();\n if (\n text.includes(\"<shadow-claw\") ||\n text.includes(\"data-shadow-claw-dsd\")\n ) {\n return null;\n }\n return text;\n }\n } catch {\n // Fetch failed or unavailable\n }\n\n return null;\n}\n\nexport function findPrerenderedElement(\n displayPath?: string,\n): HTMLElement | null {\n if (typeof document === \"undefined\") {\n return null;\n }\n const matchPath = (el: Element | null | undefined): el is HTMLElement => {\n if (!el || !(el instanceof HTMLElement)) return false;\n if (!displayPath) return true;\n const initialPath = el.getAttribute(\"data-initial-path\")?.trim();\n return !initialPath || initialPath === displayPath;\n };\n\n // 1. Direct light DOM check\n const lightDirect = document.querySelector(\n displayPath\n ? `[data-pages-rendered][data-initial-path=\"${displayPath}\"]`\n : \"[data-pages-rendered]\",\n );\n if (matchPath(lightDirect)) return lightDirect;\n\n // 2. Traversal through custom element shadow roots\n const sc = document.querySelector(\"shadow-claw\");\n const scRoot = sc?.shadowRoot;\n const pagesEl = scRoot?.querySelector(\"shadow-claw-pages\");\n const pagesRoot = pagesEl?.shadowRoot;\n const shadowRendered =\n pagesRoot?.querySelector(\n displayPath\n ? `[data-pages-rendered][data-initial-path=\"${displayPath}\"]`\n : \"[data-pages-rendered]\",\n ) ||\n scRoot?.querySelector(\n displayPath\n ? `[data-pages-rendered][data-initial-path=\"${displayPath}\"]`\n : \"[data-pages-rendered]\",\n );\n if (matchPath(shadowRendered)) return shadowRendered;\n\n // 3. Search unattached template elements (e.g. DSD templates prior to attachment / polyfills / jsdom)\n const templates = document.querySelectorAll(\"template\");\n for (const t of Array.from(templates)) {\n const fromTemplate = t.content?.querySelector(\n displayPath\n ? `[data-pages-rendered][data-initial-path=\"${displayPath}\"]`\n : \"[data-pages-rendered]\",\n );\n if (matchPath(fromTemplate)) return fromTemplate;\n const nestedTemplates = t.content?.querySelectorAll(\"template\");\n if (nestedTemplates) {\n for (const nt of Array.from(nestedTemplates)) {\n const fromNested = nt.content?.querySelector(\n displayPath\n ? `[data-pages-rendered][data-initial-path=\"${displayPath}\"]`\n : \"[data-pages-rendered]\",\n );\n if (matchPath(fromNested)) return fromNested;\n }\n }\n }\n\n return null;\n}\n\nexport function extractPrerenderedPageContent(\n displayPath: string = \"index.html\",\n): string | null {\n const renderedEl = findPrerenderedElement(displayPath);\n if (!renderedEl) {\n return null;\n }\n\n const initialPath = renderedEl.getAttribute(\"data-initial-path\")?.trim();\n if (initialPath && initialPath !== displayPath) {\n return null;\n }\n\n // Check for frontmatter\n const fmEl = renderedEl.querySelector(\"[data-markdown-frontmatter]\");\n let frontmatterData: Record<string, any> | null = null;\n if (fmEl) {\n const rawFm = fmEl.getAttribute(\"data-frontmatter\");\n if (rawFm) {\n try {\n frontmatterData = JSON.parse(rawFm);\n } catch {}\n }\n }\n\n // Extract body: clone renderedEl and remove the frontmatter element if present\n const clone = renderedEl.cloneNode(true) as HTMLElement;\n const cloneFm = clone.querySelector(\"[data-markdown-frontmatter]\");\n if (cloneFm) {\n cloneFm.remove();\n }\n const bodyHtml = clone.innerHTML.trim();\n if (!bodyHtml && !frontmatterData) {\n return null;\n }\n\n // If frontmatter exists, serialize to YAML\n if (frontmatterData && Object.keys(frontmatterData).length > 0) {\n const yamlLines = [\"---\"];\n for (const [key, value] of Object.entries(frontmatterData)) {\n if (typeof value === \"string\") {\n yamlLines.push(`${key}: ${JSON.stringify(value)}`);\n } else if (typeof value === \"number\" || typeof value === \"boolean\") {\n yamlLines.push(`${key}: ${value}`);\n } else {\n yamlLines.push(`${key}: ${JSON.stringify(value)}`);\n }\n }\n yamlLines.push(\"---\", \"\");\n return `${yamlLines.join(\"\\n\")}\\n${bodyHtml}`;\n }\n\n return bodyHtml;\n}\n\nexport async function getStaticMainManifest(\n options: { preferEmbedded?: boolean; fetchFallback?: boolean } = {},\n): Promise<StaticMainManifest> {\n const parseEmbedded = (): StaticMainManifest | null => {\n let manifest: StaticMainManifest | null = null;\n if (typeof document !== \"undefined\") {\n const scriptEl = document.getElementById(\"shadow-claw-static-manifest\");\n if (scriptEl && scriptEl.textContent) {\n try {\n const parsed = JSON.parse(scriptEl.textContent);\n if (parsed && Array.isArray(parsed.pages)) {\n manifest = { ...parsed, pages: [...parsed.pages] };\n }\n } catch (err) {\n console.warn(\"Failed to parse embedded static main manifest:\", err);\n }\n }\n\n // Discover inline markdown pages: <script type=\"text/markdown\" data-shadow-claw-page=\"...\">\n const inlinePageEls = document.querySelectorAll<HTMLScriptElement>(\n 'script[type=\"text/markdown\"][data-shadow-claw-page]',\n );\n if (inlinePageEls.length > 0) {\n if (!manifest) {\n manifest = { pages: [] };\n }\n for (const el of Array.from(inlinePageEls)) {\n const pagePath = el.getAttribute(\"data-shadow-claw-page\")?.trim();\n if (pagePath) {\n let content = el.textContent || \"\";\n content = dedentLeadingWhitespace(content);\n // Deduplicate empty MEMORY.md: fallback to DEFAULT_MAIN_GROUP_MEMORY_CONTENT\n if (!content.trim() && /^memory\\.(md|markdown)$/iu.test(pagePath)) {\n content = DEFAULT_MAIN_GROUP_MEMORY_CONTENT;\n }\n // Deduplicate empty index.html / initial page: fallback to pre-rendered DSD or DEFAULT_MAIN_GROUP_INDEX_CONTENT\n if (\n !content.trim() &&\n (pagePath === \"index.html\" ||\n /^index\\.(html?|xhtml)$/iu.test(pagePath))\n ) {\n content =\n extractPrerenderedPageContent(pagePath) ??\n DEFAULT_MAIN_GROUP_INDEX_CONTENT;\n }\n const existingIndex = manifest.pages.findIndex(\n (p) => p.displayPath === pagePath,\n );\n if (existingIndex >= 0) {\n manifest.pages[existingIndex].content = content;\n } else {\n manifest.pages.push({ displayPath: pagePath, content });\n }\n }\n }\n }\n\n // Discover sidecar directory pages configured via pages.files\n const configScript = document.getElementById(\"shadow-claw-site-config\");\n if (configScript?.textContent) {\n try {\n const config = JSON.parse(configScript.textContent);\n if (Array.isArray(config?.pages?.files)) {\n if (!manifest) {\n manifest = { pages: [] };\n }\n for (const file of config.pages.files) {\n if (typeof file === \"string\" && file.trim()) {\n const filePath = file.trim();\n let initialContent = \"\";\n if (/^memory\\.(md|markdown)$/iu.test(filePath)) {\n initialContent = DEFAULT_MAIN_GROUP_MEMORY_CONTENT;\n } else if (\n filePath === \"index.html\" ||\n /^index\\.(html?|xhtml)$/iu.test(filePath)\n ) {\n initialContent =\n extractPrerenderedPageContent(filePath) ??\n DEFAULT_MAIN_GROUP_INDEX_CONTENT;\n }\n if (!manifest.pages.some((p) => p.displayPath === filePath)) {\n manifest.pages.push({\n displayPath: filePath,\n content: initialContent,\n });\n }\n }\n }\n }\n } catch {}\n }\n\n // If no manifest or inline script existed, auto-discover pre-rendered DSD page\n const prerenderedEl = findPrerenderedElement();\n if (prerenderedEl) {\n if (!manifest) {\n manifest = { pages: [] };\n }\n const initialPath =\n prerenderedEl.getAttribute(\"data-initial-path\")?.trim() ||\n \"index.html\";\n if (!manifest.pages.some((p) => p.displayPath === initialPath)) {\n const content =\n extractPrerenderedPageContent(initialPath) ??\n DEFAULT_MAIN_GROUP_INDEX_CONTENT;\n manifest.pages.push({ displayPath: initialPath, content });\n }\n if (\n !manifest.pages.some((p) =>\n /^memory\\.(md|markdown)$/iu.test(p.displayPath),\n )\n ) {\n manifest.pages.push({\n displayPath: \"MEMORY.md\",\n content: DEFAULT_MAIN_GROUP_MEMORY_CONTENT,\n });\n }\n }\n }\n\n return manifest;\n };\n if (options.preferEmbedded !== false) {\n const embedded = parseEmbedded();\n if (embedded && embedded.pages.length > 0) {\n return embedded;\n }\n }\n\n if (options.fetchFallback !== false) {\n const fetched = await fetchStaticMainManifest();\n if (fetched && fetched.pages.length > 0) {\n return fetched;\n }\n }\n\n if (options.preferEmbedded === false) {\n const embedded = parseEmbedded();\n if (embedded && embedded.pages.length > 0) {\n return embedded;\n }\n }\n\n return {\n pages: [\n {\n displayPath: \"index.html\",\n content: DEFAULT_MAIN_GROUP_INDEX_CONTENT,\n },\n {\n displayPath: \"MEMORY.md\",\n content: DEFAULT_MAIN_GROUP_MEMORY_CONTENT,\n },\n ],\n };\n}\n\nexport async function getStaticPageContent(\n displayPath: string,\n): Promise<string | null> {\n if (typeof document !== \"undefined\") {\n // 1. Check embedded JSON manifest\n const scriptEl = document.getElementById(\"shadow-claw-static-manifest\");\n if (scriptEl && scriptEl.textContent) {\n try {\n const parsed = JSON.parse(scriptEl.textContent);\n if (parsed && Array.isArray(parsed.pages)) {\n const found = parsed.pages.find(\n (p: StaticPageSource) => p.displayPath === displayPath,\n );\n if (\n found &&\n typeof found.content === \"string\" &&\n found.content.trim()\n ) {\n return found.content;\n }\n }\n } catch {}\n }\n\n // 2. Check inline markdown script tags: <script type=\"text/markdown\" data-shadow-claw-page=\"...\">\n const inlinePageEls = document.querySelectorAll<HTMLScriptElement>(\n 'script[type=\"text/markdown\"][data-shadow-claw-page]',\n );\n for (const el of Array.from(inlinePageEls)) {\n const pagePath = el.getAttribute(\"data-shadow-claw-page\")?.trim();\n if (pagePath === displayPath) {\n const content = el.textContent || \"\";\n if (content.trim()) {\n return content;\n }\n }\n }\n\n // 3. Check pre-rendered DSD content\n const prerendered = extractPrerenderedPageContent(displayPath);\n if (typeof prerendered === \"string\" && prerendered.trim()) {\n return prerendered;\n }\n\n // 4. Default fallbacks for built-in files\n if (/^memory\\.(md|markdown)$/iu.test(displayPath)) {\n return DEFAULT_MAIN_GROUP_MEMORY_CONTENT;\n }\n if (\n displayPath === \"index.html\" ||\n /^index\\.(html?|xhtml)$/iu.test(displayPath)\n ) {\n return DEFAULT_MAIN_GROUP_INDEX_CONTENT;\n }\n }\n\n const fileContent = await fetchStaticMainFile(displayPath);\n if (typeof fileContent === \"string\") {\n return fileContent;\n }\n\n const manifest = await fetchStaticMainManifest();\n if (manifest && Array.isArray(manifest.pages)) {\n const found = manifest.pages.find((p) => p.displayPath === displayPath);\n if (found && typeof found.content === \"string\") {\n return found.content;\n }\n }\n\n return null;\n}\n\nasync function processPurgeTokens(\n db: ShadowClawDatabase,\n node: Record<string, any>,\n currentPath: string[] = [],\n) {\n for (const [key, value] of Object.entries(node)) {\n if (key === \"purgePreRenderedStaticPages\" && value === true) {\n if (currentPath.length > 0) {\n const groupId = currentPath[0];\n const dirPath = currentPath.slice(1).join(\"/\");\n try {\n if (dirPath) {\n await deleteGroupDirectory(db, groupId, dirPath);\n } else {\n await deleteAllGroupFiles(db, groupId);\n }\n } catch (error) {\n console.warn(\n `Failed to purge pre-rendered static pages for ${groupId}/${dirPath}:`,\n error,\n );\n }\n }\n } else if (typeof value === \"object\" && value !== null) {\n await processPurgeTokens(db, value, [...currentPath, key]);\n }\n }\n}\n\nfunction getSiteConfigSortOrder(): \"asc\" | \"desc\" {\n if (typeof document !== \"undefined\") {\n try {\n const scriptEl = document.getElementById(\"shadow-claw-site-config\");\n if (scriptEl?.textContent) {\n const config = JSON.parse(scriptEl.textContent);\n if (config?.pages?.sortOrder === \"desc\") {\n return \"desc\";\n }\n if (config?.pages?.sortOrder === \"asc\") {\n return \"asc\";\n }\n }\n } catch {}\n }\n return \"desc\";\n}\n\nexport function getSiteConfigDefaultPinnedPage(): string | null {\n if (typeof document !== \"undefined\") {\n try {\n const scriptEl = document.getElementById(\"shadow-claw-site-config\");\n if (scriptEl?.textContent) {\n const config = JSON.parse(scriptEl.textContent);\n const def = config?.pages?.defaultPinnedPage;\n if (typeof def === \"string\" && def.trim().length > 0) {\n return def.trim();\n }\n }\n } catch {}\n }\n return null;\n}\n\nexport function getSiteConfigSeoSettings(): {\n siteTitle: string;\n separator?: string;\n titleTemplate?: string;\n} {\n let siteTitle = \"ShadowClaw\";\n let separator: string | undefined;\n let titleTemplate: string | undefined;\n\n if (typeof document !== \"undefined\") {\n try {\n const scriptEl = document.getElementById(\"shadow-claw-site-config\");\n if (scriptEl?.textContent) {\n const config = JSON.parse(scriptEl.textContent);\n if (config?.site?.title) {\n siteTitle = String(config.site.title).trim();\n }\n if (config?.site?.titleSeparator ?? config?.site?.sep) {\n separator = String(config.site.titleSeparator ?? config.site.sep);\n }\n if (config?.site?.titleTemplate) {\n titleTemplate = String(config.site.titleTemplate);\n }\n }\n } catch {}\n\n if (siteTitle === \"ShadowClaw\" && document.title) {\n const parts = document.title.split(/\\s*[-|—•·]\\s*/);\n const possibleSite = parts[parts.length - 1]?.trim();\n if (possibleSite) {\n siteTitle = possibleSite;\n }\n }\n }\n\n return { siteTitle, separator, titleTemplate };\n}\n\nexport function getSiteConfigPageFilter(): {\n allowList: string[];\n denyList: string[];\n} {\n if (typeof document !== \"undefined\") {\n try {\n const scriptEl = document.getElementById(\"shadow-claw-site-config\");\n if (scriptEl?.textContent) {\n const config = JSON.parse(scriptEl.textContent);\n const allowList = normalizeStringList(\n config?.pages?.allowList ??\n config?.pages?.allowlist ??\n config?.allowList ??\n config?.allowlist ??\n [],\n );\n const denyList = normalizeStringList(\n config?.pages?.denyList ??\n config?.pages?.denylist ??\n config?.denyList ??\n config?.denylist ??\n [],\n );\n return { allowList, denyList };\n }\n } catch {}\n }\n return { allowList: [], denyList: [] };\n}\n\nexport function sortSavedPageRefs(\n refs: SavedPageRef[],\n sortOrder?: \"asc\" | \"desc\",\n): SavedPageRef[] {\n const order = sortOrder ?? getSiteConfigSortOrder();\n return [...refs].sort((left, right) => {\n const leftPath = left.path;\n const rightPath = right.path;\n\n const leftFileName = leftPath.split(\"/\").pop() || \"\";\n const rightFileName = rightPath.split(\"/\").pop() || \"\";\n\n const leftIsIndex = /^index\\.(html?|xhtml)$/iu.test(leftFileName);\n const rightIsIndex = /^index\\.(html?|xhtml)$/iu.test(rightFileName);\n\n if (leftIsIndex && !rightIsIndex) {\n return -1;\n }\n\n if (!leftIsIndex && rightIsIndex) {\n return 1;\n }\n\n const leftIsMemory = /^memory\\.(md|markdown)$/iu.test(leftFileName);\n const rightIsMemory = /^memory\\.(md|markdown)$/iu.test(rightFileName);\n\n if (leftIsMemory && !rightIsMemory) {\n return 1;\n }\n\n if (!leftIsMemory && rightIsMemory) {\n return -1;\n }\n\n if (order === \"asc\") {\n return leftPath.localeCompare(rightPath, undefined, {\n numeric: true,\n sensitivity: \"base\",\n });\n }\n\n // Sort right-to-left (Z-A) with natural numeric handling\n return rightPath.localeCompare(leftPath, undefined, {\n numeric: true,\n sensitivity: \"base\",\n });\n });\n}\n\n/** Returns true when a purge should be skipped because it already ran for\n * this deployment on this client. */\nasync function checkAndMarkPurge(\n db: ShadowClawDatabase,\n purgeId: string | undefined,\n storageKey: string = PURGE_STORAGE_KEY,\n configKey: string = PURGE_CONFIG_KEY,\n): Promise<boolean> {\n const effectivePurgeId = purgeId ?? LEGACY_PURGE_ID;\n try {\n const lastPurgeId = getNamespacedItem(storageKey);\n if (lastPurgeId === effectivePurgeId) {\n return true;\n }\n } catch {\n // Continue with IndexedDB when localStorage is unavailable.\n }\n\n try {\n const lastPurgeId = await getConfig(db, configKey);\n if (lastPurgeId === effectivePurgeId) {\n try {\n setNamespacedItem(storageKey, effectivePurgeId);\n } catch {\n // IndexedDB is the durable record when localStorage is unavailable.\n }\n return true;\n }\n\n await setConfig(db, configKey, effectivePurgeId);\n try {\n setNamespacedItem(storageKey, effectivePurgeId);\n } catch {\n // IndexedDB is the durable record when localStorage is unavailable.\n }\n } catch {\n // Fall back to localStorage when IndexedDB is unavailable.\n try {\n setNamespacedItem(storageKey, effectivePurgeId);\n } catch {\n // If neither store is available, allow the purge to proceed.\n }\n }\n return false;\n}\n\nexport async function seedStaticMainSite(\n db: ShadowClawDatabase,\n groupId: string = DEFAULT_GROUP_ID,\n existingPages: SavedPageRef[] = [],\n options: { preferEmbedded?: boolean; fetchFallback?: boolean } = {},\n): Promise<SavedPageRef[] & { didPurge?: boolean }> {\n await ensureMainGroupIndex(db, groupId);\n // When seeding on initial boot, prefer the embedded manifest so first paint / hydration\n // does not block on a heavy network request. Full background seeding can run separately.\n const manifest = await getStaticMainManifest(options);\n\n let didPurge = false;\n if (manifest.preRenderedStaticPages) {\n if (!(await checkAndMarkPurge(db, manifest.purgeId))) {\n didPurge = true;\n await processPurgeTokens(db, manifest.preRenderedStaticPages);\n }\n }\n\n let didPurgeSkills = false;\n if (\n groupId === DEFAULT_GROUP_ID &&\n manifest.skillsPurgeId !== undefined &&\n !(await checkAndMarkPurge(\n db,\n manifest.skillsPurgeId,\n SKILLS_PURGE_STORAGE_KEY,\n SKILLS_PURGE_CONFIG_KEY,\n ))\n ) {\n didPurgeSkills = true;\n try {\n await deleteGroupDirectory(db, groupId, \".agents/skills/main\");\n } catch (error) {\n if (!(\n error &&\n typeof error === \"object\" &&\n \"name\" in error &&\n error.name === \"NotFoundError\"\n )) {\n throw error;\n }\n }\n try {\n await deleteGroupDirectory(db, groupId, \".agents/tools/main\");\n } catch (error) {\n // A fresh workspace has no bundled-tool directory to remove yet.\n if (!(\n error &&\n typeof error === \"object\" &&\n \"name\" in error &&\n error.name === \"NotFoundError\"\n )) {\n throw error;\n }\n }\n }\n\n for (const page of manifest.pages) {\n if (page.content?.includes('slug: \"shadow-claw--purge-pages\"')) {\n if (!didPurge && !(await checkAndMarkPurge(db, manifest.purgeId))) {\n didPurge = true;\n await deleteAllGroupFiles(db, groupId);\n }\n break;\n }\n }\n\n const isMemorySuppressed =\n groupId === DEFAULT_GROUP_ID\n ? await isMainGroupMemorySuppressed(db)\n : false;\n\n const manifestKeys = new Set(\n manifest.pages.map((p) => pageRefKey(groupId, p.displayPath)),\n );\n\n const resultPages: SavedPageRef[] & { didPurge?: boolean } = didPurge\n ? existingPages.filter(\n (ref) =>\n ref.groupId !== groupId ||\n manifestKeys.has(pageRefKey(ref.groupId, ref.path)),\n )\n : [...existingPages];\n\n const { allowList, denyList } = getSiteConfigPageFilter();\n\n let pageIndex = 0;\n for (const page of manifest.pages) {\n pageIndex++;\n if (pageIndex % 5 === 0) {\n await new Promise((resolve) => setTimeout(resolve, 0));\n }\n if (page.content?.includes('slug: \"shadow-claw--purge-pages\"')) {\n continue;\n }\n\n if (\n !isPagePathAllowed(page.displayPath, {\n allowList,\n denyList,\n groupId,\n })\n ) {\n continue;\n }\n\n const isMemoryPath = /^memory\\.(md|markdown)$/iu.test(page.displayPath);\n if (isMemoryPath) {\n if (isMemorySuppressed) {\n continue;\n }\n\n const hasCustomContent =\n typeof page.content === \"string\" &&\n page.content.trim().length > 0 &&\n page.content !== DEFAULT_MAIN_GROUP_MEMORY_CONTENT;\n const customContent = hasCustomContent ? page.content : undefined;\n const ensured =\n customContent === undefined\n ? await ensureMainGroupMemory(db, groupId)\n : await ensureMainGroupMemory(db, groupId, customContent);\n if (ensured) {\n const refKey = pageRefKey(groupId, page.displayPath);\n if (\n !resultPages.some(\n (ref) => pageRefKey(ref.groupId, ref.path) === refKey,\n )\n ) {\n resultPages.push({ groupId, path: page.displayPath });\n }\n }\n continue;\n }\n\n if (await isPageSuppressed(db, groupId, page.displayPath)) {\n continue;\n }\n\n try {\n const exists = await groupFileExists(db, groupId, page.displayPath);\n if (!exists) {\n let contentToWrite = page.content;\n if (typeof contentToWrite !== \"string\" || !contentToWrite.trim()) {\n if (page.displayPath === \"index.html\") {\n contentToWrite =\n extractPrerenderedPageContent(\"index.html\") ??\n DEFAULT_MAIN_GROUP_INDEX_CONTENT;\n } else {\n contentToWrite =\n (await fetchStaticMainFile(page.displayPath)) ?? \"\";\n }\n }\n await writeGroupFile(db, groupId, page.displayPath, contentToWrite);\n }\n\n const refKey = pageRefKey(groupId, page.displayPath);\n if (\n !resultPages.some((ref) => pageRefKey(ref.groupId, ref.path) === refKey)\n ) {\n resultPages.push({ groupId, path: page.displayPath });\n }\n } catch (error) {\n console.warn(\n `Failed to seed static page file ${page.displayPath}:`,\n error,\n );\n }\n }\n\n // Bundled skills belong to the main conversation only. Other groups can\n // provide their own skills under their isolated workspace.\n if (groupId === DEFAULT_GROUP_ID) {\n for (const skill of manifest.skills || []) {\n const skillPath = `.agents/skills/main/${skill.displayPath}`;\n try {\n if (!(await groupFileExists(db, groupId, skillPath))) {\n await writeGroupFile(db, groupId, skillPath, skill.content);\n }\n } catch (error) {\n console.warn(`Failed to seed skill file ${skillPath}:`, error);\n }\n }\n\n for (const tool of manifest.tools || []) {\n const toolPath = `.agents/tools/main/${tool.displayPath}`;\n try {\n if (didPurgeSkills || !(await groupFileExists(db, groupId, toolPath))) {\n await writeGroupFile(db, groupId, toolPath, tool.content);\n }\n } catch (error) {\n console.warn(`Failed to seed tool file ${toolPath}:`, error);\n }\n }\n }\n\n const hasEmbeddedScript =\n typeof document !== \"undefined\" &&\n (document.getElementById(\"shadow-claw-static-manifest\") !== null ||\n document.querySelector(\n 'script[type=\"text/markdown\"][data-shadow-claw-page]',\n ) !== null ||\n findPrerenderedElement() !== null);\n const isPartialEmbeddedSeed =\n options.preferEmbedded !== false && hasEmbeddedScript;\n\n if (!isPartialEmbeddedSeed) {\n await setStaticMainSiteSeeded(db, groupId, true);\n }\n\n const filteredResultPages = (resultPages as SavedPageRef[]).filter((ref) =>\n isPagePathAllowed(ref.path, {\n allowList,\n denyList,\n groupId: ref.groupId,\n }),\n );\n\n Object.defineProperty(filteredResultPages, \"didPurge\", {\n value: didPurge,\n enumerable: false,\n writable: true,\n configurable: true,\n });\n Object.defineProperty(filteredResultPages, \"didPurgeSkills\", {\n value: didPurgeSkills,\n enumerable: false,\n writable: true,\n configurable: true,\n });\n return sortSavedPageRefs(filteredResultPages);\n}\n","/**\n * AG-UI Event Adapter\n *\n * Translates orchestrator EventBus events into AG-UI protocol events,\n * dispatched as DOM CustomEvents on `window`. This is entirely independent\n * of PeerJS — it works for any conversation (browser chat, peer, etc.).\n *\n * AG-UI events are emitted on the \"shadow-claw-agui-event\" CustomEvent with\n * detail: { groupId: string; event: AGUIEvent }.\n *\n * References:\n * - https://docs.ag-ui.com/concepts/events\n * - src/subsystems/channels/peer-protocol.ts (type definitions)\n */\n\nimport type {\n AGUIEvent,\n AGUIRunStarted,\n AGUIRunFinished,\n AGUITextMessageStart,\n AGUITextMessageContent,\n AGUITextMessageEnd,\n AGUIToolCallStart,\n AGUIToolCallEnd,\n} from \"../subsystems/channels/peer-protocol.js\";\n\nimport { ulid } from \"../utils/ulid.js\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\ninterface EventBus {\n on(event: string, callback: Function): void;\n off(event: string, callback: Function): void;\n}\n\n/** Per-group run tracking state */\ninterface RunState {\n runId: string;\n threadId: string;\n messageId: string | null;\n activeToolCallIds: Set<string>;\n}\n\n// =============================================================================\n// AG-UI Adapter\n// =============================================================================\n\nexport class AGUIAdapter {\n private _events: EventBus;\n private _handlers: Array<{ event: string; handler: Function }> = [];\n private _runs = new Map<string, RunState>();\n\n constructor(events: EventBus) {\n this._events = events;\n }\n\n /** Start listening to orchestrator events and emitting AG-UI events. */\n start(): void {\n this._listen(\"streaming-start\", this._onStreamingStart);\n this._listen(\"streaming-chunk\", this._onStreamingChunk);\n this._listen(\"streaming-end\", this._onStreamingEnd);\n this._listen(\"streaming-done\", this._onStreamingDone);\n this._listen(\"streaming-error\", this._onStreamingError);\n this._listen(\"tool-activity\", this._onToolActivity);\n }\n\n /** Stop listening and clean up. */\n stop(): void {\n for (const { event, handler } of this._handlers) {\n this._events.off(event, handler);\n }\n\n this._handlers = [];\n this._runs.clear();\n }\n\n private _emit(groupId: string, event: AGUIEvent): void {\n window.dispatchEvent(\n new CustomEvent(\"shadow-claw-agui-event\", {\n detail: { groupId, event },\n }),\n );\n }\n\n // ---------------------------------------------------------------------------\n // Internal\n // ---------------------------------------------------------------------------\n\n private _listen(event: string, handler: Function): void {\n this._events.on(event, handler);\n this._handlers.push({ event, handler });\n }\n\n private _onStreamingChunk = ({\n groupId,\n text,\n }: {\n groupId: string;\n text: string;\n }): void => {\n const run = this._runs.get(groupId);\n if (!run || !run.messageId) {\n return;\n }\n\n this._emit(groupId, {\n type: \"TEXT_MESSAGE_CONTENT\",\n messageId: run.messageId,\n delta: text,\n timestamp: Date.now(),\n } satisfies AGUITextMessageContent);\n };\n\n private _onStreamingDone = ({ groupId }: { groupId: string }): void => {\n // streaming-done means the entire response cycle is finished\n const run = this._runs.get(groupId);\n if (!run) {\n return;\n }\n\n // Close any open message (non-streaming responses skip streaming-end)\n if (run.messageId) {\n this._emit(groupId, {\n type: \"TEXT_MESSAGE_END\",\n messageId: run.messageId,\n timestamp: Date.now(),\n } satisfies AGUITextMessageEnd);\n }\n\n // RUN_FINISHED\n this._emit(groupId, {\n type: \"RUN_FINISHED\",\n threadId: run.threadId,\n runId: run.runId,\n timestamp: Date.now(),\n } satisfies AGUIRunFinished);\n\n this._runs.delete(groupId);\n };\n\n private _onStreamingEnd = ({ groupId }: { groupId: string }): void => {\n // streaming-end means text is done but tool calls are about to run\n const run = this._runs.get(groupId);\n if (!run || !run.messageId) {\n return;\n }\n\n this._emit(groupId, {\n type: \"TEXT_MESSAGE_END\",\n messageId: run.messageId,\n timestamp: Date.now(),\n } satisfies AGUITextMessageEnd);\n\n run.messageId = null;\n };\n\n private _onStreamingError = ({\n groupId,\n error,\n }: {\n groupId: string;\n error?: string;\n }): void => {\n const run = this._runs.get(groupId);\n if (!run) {\n return;\n }\n\n // Close open message if any\n if (run.messageId) {\n this._emit(groupId, {\n type: \"TEXT_MESSAGE_END\",\n messageId: run.messageId,\n timestamp: Date.now(),\n } satisfies AGUITextMessageEnd);\n }\n\n this._emit(groupId, {\n type: \"RUN_ERROR\",\n message: error || \"Unknown streaming error\",\n timestamp: Date.now(),\n });\n\n this._runs.delete(groupId);\n };\n\n // ---------------------------------------------------------------------------\n // Event Handlers\n // ---------------------------------------------------------------------------\n\n private _onStreamingStart = ({ groupId }: { groupId: string }): void => {\n const runId = ulid();\n const threadId = groupId;\n const messageId = ulid();\n\n this._runs.set(groupId, {\n runId,\n threadId,\n messageId,\n activeToolCallIds: new Set(),\n });\n\n // RUN_STARTED\n this._emit(groupId, {\n type: \"RUN_STARTED\",\n threadId,\n runId,\n timestamp: Date.now(),\n } satisfies AGUIRunStarted);\n\n // TEXT_MESSAGE_START\n this._emit(groupId, {\n type: \"TEXT_MESSAGE_START\",\n messageId,\n role: \"assistant\",\n timestamp: Date.now(),\n } satisfies AGUITextMessageStart);\n };\n\n private _onToolActivity = ({\n groupId,\n tool,\n status,\n }: {\n groupId: string;\n tool: string;\n status: string;\n }): void => {\n const run = this._runs.get(groupId);\n if (!run) {\n return;\n }\n\n if (status === \"running\") {\n const toolCallId = ulid();\n run.activeToolCallIds.add(toolCallId);\n\n this._emit(groupId, {\n type: \"TOOL_CALL_START\",\n toolCallId,\n toolCallName: tool,\n timestamp: Date.now(),\n } satisfies AGUIToolCallStart);\n\n // Store mapping: tool name → toolCallId for end matching\n // Use a simple approach: store on the set (latest wins)\n (run as any)._lastToolCallId = toolCallId;\n } else if (status === \"done\" || status === \"error\") {\n const toolCallId = (run as any)._lastToolCallId;\n if (toolCallId) {\n run.activeToolCallIds.delete(toolCallId);\n\n this._emit(groupId, {\n type: \"TOOL_CALL_END\",\n toolCallId,\n timestamp: Date.now(),\n } satisfies AGUIToolCallEnd);\n }\n }\n };\n}\n","import { Signal } from \"signal-polyfill\";\n\nimport { yieldToMain } from \"../utils/delay.js\";\n\nimport { CONFIG_KEYS, DEFAULT_GROUP_ID } from \"../config/config.js\";\n\nimport {\n flushTerminalWorkspace,\n syncTerminalWorkspace,\n} from \"../core/orchestrator/utils/operations/vm.js\";\n\nimport {\n setGitProxyUrl,\n setProxyUrl,\n setUseProxy,\n setVMBashFullInternetAccess,\n} from \"../core/orchestrator/utils/settings.js\";\n\nimport { clearGroupMessages } from \"../db/clear-group-messages.js\";\nimport { cloneGroupMessages } from \"../db/clone-group-messages.js\";\nimport { cloneGroupTasks } from \"../db/clone-group-tasks.js\";\nimport { deleteMessage } from \"../db/delete-message.js\";\nimport { deleteTask } from \"../db/delete-task.js\";\nimport { getAllTasks } from \"../db/get-all-tasks.js\";\nimport { getConfig } from \"../db/get-config.js\";\nimport { getOrCreateSubscriberId } from \"../db/get-or-create-subscriber-id.js\";\nimport { getRecentMessages } from \"../db/get-recent-messages.js\";\n\nimport {\n cloneGroup,\n createGroup,\n deleteGroupMetadata,\n listGroups,\n renameGroup,\n reorderGroups,\n saveGroupMetadata,\n updateGroupPinnedProvider,\n updateGroupProviderRuntimeOverrides,\n updateGroupSubagentSettings,\n updateGroupToolTags,\n} from \"../db/groups.js\";\n\nimport { saveMessage } from \"../db/save-message.js\";\nimport { saveTask } from \"../db/save-task.js\";\nimport { setConfig } from \"../db/set-config.js\";\nimport { updateTaskLastRun } from \"../db/update-task-last-run.js\";\nimport { reorderTasks } from \"../db/reorder-tasks.js\";\nimport { copyGroupDirectory } from \"../storage/copy-group-directory.js\";\nimport { ensureMainGroupIndex } from \"../storage/ensure-main-group-index.js\";\n\nimport {\n DEFAULT_MAIN_GROUP_MEMORY_PATH,\n ensureMainGroupMemory,\n isMainGroupMemorySuppressed,\n setMainGroupMemorySuppressed,\n} from \"../storage/ensure-main-group-memory.js\";\n\nimport { listGroupFiles } from \"../storage/list-group-files.js\";\nimport { readGroupFile } from \"../storage/read-group-file.js\";\nimport { requestStorageAccess } from \"../storage/request-storage-access.js\";\nimport { getStorageStatus } from \"../storage/storage.js\";\nimport {\n configureCustomElementSecurity,\n installCustomElementDomGuard,\n installCustomElementsRegistryGuard,\n loadCustomElementSecurityFromDb,\n} from \"../security/custom-element-security.js\";\nimport {\n getSiteConfigDefaultPinnedPage,\n isStaticMainSiteSeeded,\n seedStaticMainSite,\n} from \"../storage/static-main-site.js\";\nimport {\n getAppBasePath,\n resolveDefaultPinnedPageRef,\n} from \"../core/app-routes.js\";\nimport { suppressPage, unsuppressPage } from \"../storage/suppressed-pages.js\";\nimport { writeGroupFile } from \"../storage/write-group-file.js\";\nimport { AGUIAdapter } from \"../ui/agui-adapter.js\";\nimport { showError, showSuccess } from \"../ui/toast.js\";\nimport { applyJsonPatch } from \"../utils/json-patch.js\";\nimport { isPagePathAllowed } from \"../utils/is-page-path-allowed.js\";\nimport { normalizeStringList } from \"../utils/normalize-string-list.js\";\nimport { isTruthyConfigValue } from \"../utils/parse-boolean-config.js\";\nimport { parseStoredStringList } from \"../utils/parse-stored-string-list.js\";\nimport { getSiteConfig } from \"../utils/site-config.js\";\nimport { ulid } from \"../utils/ulid.js\";\nimport { toolsStore } from \"./tools.js\";\n\nimport type { MessageAttachment } from \"../content/types.js\";\nimport type { Orchestrator } from \"../core/orchestrator/orchestrator.js\";\n\nimport type {\n GroupMeta,\n SavedPageRef,\n ShadowClawDatabase,\n StoredMessage,\n Task,\n} from \"../db/types.js\";\n\nimport type { StorageStatus } from \"../storage/storage.js\";\n\nimport type {\n ContextUsage,\n ModelDownloadProgressPayload,\n ThinkingLogEntry,\n TokenUsage,\n ToolActivity,\n} from \"../subsystems/worker/types.js\";\n\nimport type { A2UIAction } from \"../ui/a2ui/types.js\";\n\nexport type OrchestratorDisplayState =\n \"idle\" | \"thinking\" | \"responding\" | \"error\";\n\ntype TaskSyncOutboxOperation =\n | {\n type: \"upsert\";\n id: string;\n task: Task;\n queuedAt: number;\n }\n | {\n type: \"delete\";\n id: string;\n queuedAt: number;\n };\n\ninterface ServerScheduledTask {\n id: string;\n group_id?: string;\n groupId?: string;\n schedule: string;\n prompt: string;\n type?: \"prompt\" | \"tools\";\n tools?: string | Task[\"tools\"] | null;\n channel?: string | null;\n\n enabled: number | boolean;\n last_run?: number | null;\n lastRun?: number | null;\n created_at?: number;\n createdAt?: number;\n name?: string | null;\n order?: number | null;\n task_order?: number | null;\n}\n\nfunction parseTaskTools(value: ServerScheduledTask[\"tools\"]): Task[\"tools\"] {\n if (!value) {\n return undefined;\n }\n\n if (Array.isArray(value)) {\n return value;\n }\n\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n try {\n const parsed = JSON.parse(value);\n\n return Array.isArray(parsed) ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction isConfigEnabled(value: unknown): boolean {\n if (typeof value === \"boolean\") {\n return value;\n }\n\n if (typeof value === \"string\") {\n const normalized = value.trim().toLowerCase();\n\n return normalized === \"true\" || normalized === \"1\";\n }\n\n if (typeof value === \"number\") {\n return value === 1;\n }\n\n return false;\n}\n\n/**\n * Lazy-cached probe: returns true only when the server's schedule API is\n * reachable.\n *\n * Returns false immediately when taskServerEnabled is false so no network\n * probes are ever made in static-only deployments.\n */\nfunction isScheduleServerEnabled(enabled: boolean): boolean {\n return !!enabled;\n}\n\n/**\n * Sync a task to the server-side SQLite store.\n */\nasync function syncTaskToServer(\n task: Task,\n baseUrl: string,\n subscriberId: string,\n serverEnabled: boolean,\n): Promise<boolean> {\n if (!isScheduleServerEnabled(serverEnabled)) {\n return true; // Silently succeed when server-side tasks are disabled.\n }\n\n // If the task has no schedule, it belongs only in local storage.\n // We issue a delete to ensure it is removed from the server if it was previously scheduled.\n if (!task.schedule) {\n const deleteResult = await deleteTaskFromServer(\n task.id,\n baseUrl,\n subscriberId,\n serverEnabled,\n );\n return deleteResult !== \"failed\";\n }\n\n try {\n const base = baseUrl.replace(/\\/$/, \"\");\n const res = await fetch(`${base}/tasks`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n ...task,\n subscriberId,\n }),\n });\n\n return res.ok;\n } catch {\n return false;\n }\n}\n\ntype DeleteTaskServerResult = \"deleted\" | \"missing\" | \"failed\";\n\n/**\n * Delete a task from the server-side SQLite store.\n */\nasync function deleteTaskFromServer(\n id: string,\n baseUrl: string,\n subscriberId: string,\n serverEnabled: boolean,\n): Promise<DeleteTaskServerResult> {\n if (!isScheduleServerEnabled(serverEnabled)) {\n return \"missing\"; // No server in static-only deployments.\n }\n\n try {\n const base = baseUrl.replace(/\\/$/, \"\");\n const query = `subscriberId=${encodeURIComponent(subscriberId)}`;\n const res = await fetch(\n `${base}/tasks/${encodeURIComponent(id)}?${query}`,\n {\n method: \"DELETE\",\n },\n );\n\n if (res.ok) {\n return \"deleted\";\n }\n\n // \"Not found\" means there is nothing left to delete on the server.\n // Some deployments may also reject DELETE on this endpoint with 405.\n if (res.status === 404 || res.status === 405) {\n return \"missing\";\n }\n\n return \"failed\";\n } catch {\n return \"failed\";\n }\n}\n\nasync function fetchServerTasksForGroup(\n groupId: string,\n baseUrl: string,\n subscriberId: string,\n serverEnabled: boolean,\n): Promise<Task[] | null> {\n if (!isScheduleServerEnabled(serverEnabled)) {\n return null; // No server in static-only deployments.\n }\n\n try {\n const base = baseUrl.replace(/\\/$/, \"\");\n const res = await fetch(\n `${base}/tasks?groupId=${encodeURIComponent(groupId)}&subscriberId=${encodeURIComponent(subscriberId)}`,\n {\n method: \"GET\",\n },\n );\n\n if (!res.ok || typeof (res as any).json !== \"function\") {\n return null;\n }\n\n const payload = await (res as any).json();\n if (!Array.isArray(payload)) {\n return null;\n }\n\n return payload\n .filter((task): task is ServerScheduledTask => {\n return (\n !!task &&\n typeof task === \"object\" &&\n typeof (task as any).id === \"string\" &&\n typeof (task as any).schedule === \"string\" &&\n typeof (task as any).prompt === \"string\"\n );\n })\n .map((task) => ({\n id: task.id,\n groupId: task.group_id || task.groupId || groupId,\n schedule: task.schedule,\n type: task.type,\n prompt: task.prompt,\n tools: parseTaskTools(task.tools),\n channel: typeof task.channel === \"string\" ? task.channel : undefined,\n\n enabled: task.enabled === true || task.enabled === 1,\n lastRun:\n typeof task.lastRun === \"number\"\n ? task.lastRun\n : typeof task.last_run === \"number\"\n ? task.last_run\n : null,\n createdAt:\n typeof task.createdAt === \"number\"\n ? task.createdAt\n : typeof task.created_at === \"number\"\n ? task.created_at\n : Date.now(),\n name: typeof task.name === \"string\" ? task.name : undefined,\n order:\n typeof task.order === \"number\"\n ? task.order\n : typeof task.task_order === \"number\"\n ? task.task_order\n : undefined,\n }));\n } catch {\n return null;\n }\n}\n\nexport interface OrchestratorStoreState {\n isTyping: boolean;\n ready: boolean;\n state: OrchestratorDisplayState;\n messages: StoredMessage[];\n contextUsage: ContextUsage | null;\n files: string[];\n activeGroupId: string;\n pages: SavedPageRef[];\n currentPath: string;\n error: string | null;\n activityLog: ThinkingLogEntry[];\n tokenUsage: TokenUsage | null;\n toolActivity: ToolActivity | null;\n modelDownloadProgress: ModelDownloadProgressPayload | null;\n streamingText: string | null;\n}\n\nexport function accumulateTokenUsage(\n prev: TokenUsage | null,\n next: TokenUsage,\n): TokenUsage {\n const inputTokens = (prev?.inputTokens ?? 0) + (next.inputTokens ?? 0);\n const outputTokens = (prev?.outputTokens ?? 0) + (next.outputTokens ?? 0);\n const cacheReadTokens =\n (prev?.cacheReadTokens ?? 0) + (next.cacheReadTokens ?? 0);\n const cacheCreationTokens =\n (prev?.cacheCreationTokens ?? 0) + (next.cacheCreationTokens ?? 0);\n\n return {\n groupId: next.groupId || prev?.groupId || \"\",\n inputTokens,\n outputTokens,\n cacheReadTokens,\n cacheCreationTokens,\n totalTokens:\n inputTokens + outputTokens + cacheReadTokens + cacheCreationTokens,\n contextLimit: next.contextLimit || prev?.contextLimit || 0,\n };\n}\n\nexport class OrchestratorStore {\n private static readonly DEFAULT_PAGE_PATH = \"MEMORY.md\";\n public orchestrator: Orchestrator | null;\n public _activeGroupId: Signal.State<string>;\n public _activePage: Signal.State<string>;\n public _activePinnedPage: Signal.State<SavedPageRef | null>;\n public _defaultPinnedPage: Signal.State<SavedPageRef | null>;\n public _activityLog: Signal.State<ThinkingLogEntry[]>;\n private _activityLogSessionStartedAtByGroup: Map<string, string>;\n private _aguiAdapter: AGUIAdapter | null;\n public _aguiEvent: Signal.State<{ groupId: string; event: any } | null>;\n public _contextUsage: Signal.State<ContextUsage | null>;\n public _currentPath: Signal.State<string>;\n private _db: ShadowClawDatabase | null;\n public _error: Signal.State<string | null>;\n public _files: Signal.State<string[]>;\n public _gitProxyUrl: Signal.State<string>;\n public _groups: Signal.State<GroupMeta[]>;\n private _hadPersistedActivePage: boolean;\n private _initResolve: (() => void) | null;\n public _isTyping: Signal.State<boolean>;\n private _lastOrchestratorDisplayState: OrchestratorDisplayState = \"idle\";\n\n public _messages: Signal.State<StoredMessage[]>;\n public _modelDownloadProgress: Signal.State<ModelDownloadProgressPayload | null>;\n private _onlineReplayHandler: (() => void) | null;\n public _pages: Signal.State<SavedPageRef[]>;\n public _pagesAllowList: Signal.State<string[]>;\n public _pagesDenyList: Signal.State<string[]>;\n public _peerStateByGroup: Signal.State<Map<string, Record<string, unknown>>>;\n public _proxyUrl: Signal.State<string>;\n public _ready: Signal.State<boolean>;\n public _remoteAgentStatusByGroup: Signal.State<\n Map<string, OrchestratorDisplayState>\n >;\n public _remoteAgentTypingByGroup: Signal.State<Map<string, boolean>>;\n private _replayingTaskSyncOutbox: boolean;\n private _subscriberId: string | null;\n public _sidebarDefaultPage: Signal.State<\n \"pages\" | \"chat\" | \"tasks\" | \"files\"\n >;\n public _state: Signal.State<OrchestratorDisplayState>;\n public _storageStatus: Signal.State<StorageStatus | null>;\n public _streamingText: Signal.State<string | null>;\n public _tasks: Signal.State<Task[]>;\n private _taskSyncOutbox: TaskSyncOutboxOperation[];\n public _tokenUsage: Signal.State<TokenUsage | null>;\n private _tokenUsageAccumulator: TokenUsage | null = null;\n public _toolActivity: Signal.State<ToolActivity | null>;\n public _unreadGroupIds: Signal.State<Set<string>>;\n public _useProxy: Signal.State<boolean>;\n public _vmBashFullInternetAccess: Signal.State<boolean>;\n private _whenInitialized: Promise<void>;\n private _whenReady: Promise<void>;\n private _readyResolve: (() => void) | null;\n\n constructor() {\n this._messages = new Signal.State([]);\n this._isTyping = new Signal.State(false);\n this._storageStatus = new Signal.State(null);\n this._toolActivity = new Signal.State(null);\n this._modelDownloadProgress = new Signal.State(null);\n this._activityLog = new Signal.State([]);\n this._state = new Signal.State(\"idle\");\n this._tokenUsage = new Signal.State(null);\n this._error = new Signal.State(null);\n this._activeGroupId = new Signal.State(DEFAULT_GROUP_ID);\n this._ready = new Signal.State(false);\n this._tasks = new Signal.State([]);\n this._files = new Signal.State([]);\n this._currentPath = new Signal.State(\".\");\n this._groups = new Signal.State([]);\n this._unreadGroupIds = new Signal.State(new Set());\n this._streamingText = new Signal.State(null);\n this._aguiEvent = new Signal.State(null);\n this._contextUsage = new Signal.State(null);\n this._useProxy = new Signal.State(false);\n this._proxyUrl = new Signal.State(\"/proxy\");\n this._gitProxyUrl = new Signal.State(\"/git-proxy\");\n this._vmBashFullInternetAccess = new Signal.State(false);\n this._activePage = new Signal.State(\"pages\");\n const siteConfig = getSiteConfig();\n const siteConfigDefaultPage = siteConfig?.sidebar?.defaultPage;\n const initialSidebarDefaultPage =\n siteConfigDefaultPage === \"pages\" ||\n siteConfigDefaultPage === \"chat\" ||\n siteConfigDefaultPage === \"tasks\" ||\n siteConfigDefaultPage === \"files\"\n ? siteConfigDefaultPage\n : \"chat\";\n this._sidebarDefaultPage = new Signal.State(initialSidebarDefaultPage);\n this._pages = new Signal.State([]);\n this._pagesAllowList = new Signal.State([]);\n this._pagesDenyList = new Signal.State([]);\n this._activePinnedPage = new Signal.State(null);\n this._defaultPinnedPage = new Signal.State(null);\n this._remoteAgentStatusByGroup = new Signal.State(new Map());\n this._remoteAgentTypingByGroup = new Signal.State(new Map());\n this._peerStateByGroup = new Signal.State(new Map());\n this._hadPersistedActivePage = false;\n this._initResolve = null;\n this._whenInitialized = new Promise<void>((resolve) => {\n this._initResolve = resolve;\n });\n this._readyResolve = null;\n this._whenReady = new Promise<void>((resolve) => {\n this._readyResolve = resolve;\n });\n this.orchestrator = null;\n this._db = null;\n this._activityLogSessionStartedAtByGroup = new Map();\n this._taskSyncOutbox = [];\n this._replayingTaskSyncOutbox = false;\n this._subscriberId = null;\n this._onlineReplayHandler = null;\n this._aguiAdapter = null;\n }\n\n get activeGroupId() {\n return this._activeGroupId.get();\n }\n\n get activePage() {\n return this._activePage.get();\n }\n\n get activePinnedPage() {\n return this._activePinnedPage.get();\n }\n\n get defaultPinnedPage(): SavedPageRef | null {\n return this._defaultPinnedPage.get();\n }\n\n get pagesAllowList(): string[] {\n return this._pagesAllowList.get();\n }\n\n get pagesDenyList(): string[] {\n return this._pagesDenyList.get();\n }\n\n isPageAllowed(path: string, groupId?: string | null): boolean {\n return isPagePathAllowed(path, {\n allowList: this._pagesAllowList.get(),\n denyList: this._pagesDenyList.get(),\n groupId: groupId ?? this._activeGroupId.get(),\n });\n }\n\n get effectiveDefaultPage(): SavedPageRef | null {\n const def = this._defaultPinnedPage.get();\n if (def && this.isPageAllowed(def.path, def.groupId)) {\n return def;\n }\n\n const pages = this._pages.get();\n\n return pages[0] || null;\n }\n\n get activityLog() {\n return this._activityLog.get();\n }\n\n get taskServerEnabled(): boolean {\n return this.orchestrator?.taskServerEnabled ?? false;\n }\n\n /**\n * Get the latest AG-UI event for the active conversation, or null.\n */\n get aguiEvent(): { groupId: string; event: any } | null {\n return this._aguiEvent.get();\n }\n\n /**\n * Clear error\n */\n clearError() {\n this._error.set(null);\n if (this._state.get() === \"error\") {\n this._state.set(\"idle\");\n }\n }\n\n /**\n * Get context usage info, or `null` if not yet computed.\n */\n get contextUsage(): ContextUsage | null {\n return this._contextUsage.get();\n }\n\n get tokenUsageAccumulator(): TokenUsage | null {\n return this._tokenUsageAccumulator;\n }\n\n get currentPath() {\n return this._currentPath.get();\n }\n\n get error() {\n return this._error.get();\n }\n\n get files() {\n return this._files.get();\n }\n\n getPeerState(groupId: string): Record<string, unknown> | null {\n return this._peerStateByGroup.get().get(groupId) || null;\n }\n\n /**\n * Get the remote agent status for a specific group.\n * Returns \"idle\" if no remote status is set.\n */\n getRemoteAgentStatus(groupId: string): OrchestratorDisplayState {\n const statusMap = this._remoteAgentStatusByGroup.get();\n\n return statusMap.get(groupId) || \"idle\";\n }\n\n /**\n * Get current state\n */\n getState(): OrchestratorStoreState {\n return {\n messages: this.messages,\n isTyping: this.isTyping,\n toolActivity: this.toolActivity,\n activityLog: this.activityLog,\n state: this.state,\n tokenUsage: this.tokenUsage,\n modelDownloadProgress: this.modelDownloadProgress,\n error: this.error,\n activeGroupId: this.activeGroupId,\n pages: this.pages,\n ready: this.ready,\n files: this.files,\n currentPath: this.currentPath,\n streamingText: this.streamingText,\n contextUsage: this.contextUsage,\n };\n }\n\n /**\n * Get all tasks for backup\n */\n getTasksForBackup(): Task[] {\n return this._tasks.get();\n }\n\n get gitProxyUrl() {\n return this._gitProxyUrl.get();\n }\n\n get groups() {\n return this._groups.get();\n }\n\n get hadPersistedActivePage() {\n return this._hadPersistedActivePage;\n }\n\n /**\n * Get the remote agent typing status for a specific group.\n */\n isRemoteAgentTyping(groupId: string): boolean {\n const typingMap = this._remoteAgentTypingByGroup.get();\n\n return typingMap.get(groupId) || false;\n }\n\n get isTyping() {\n return this._isTyping.get();\n }\n\n get messages() {\n return this._messages.get();\n }\n\n get modelDownloadProgress() {\n return this._modelDownloadProgress.get();\n }\n\n get pages() {\n return this._pages.get();\n }\n\n get proxyUrl() {\n return this._proxyUrl.get();\n }\n\n get ready() {\n return this._ready.get();\n }\n\n /**\n * Send a message\n */\n sendMessage(\n text: string,\n attachments: MessageAttachment[] = [],\n a2uiAction?: A2UIAction,\n ): void {\n if (a2uiAction !== undefined) {\n this.orchestrator?.browserChat?.submit(\n text,\n this._activeGroupId.get(),\n attachments,\n a2uiAction,\n );\n } else {\n this.orchestrator?.browserChat?.submit(\n text,\n this._activeGroupId.get(),\n attachments,\n );\n }\n }\n\n /**\n * Send a workspace file to remote peer(s) in the active peer or room conversation.\n */\n async sendFileToPeer(\n filePath: string,\n groupId: string = this._activeGroupId.get(),\n options?: { mimeType?: string; size?: number; fileName?: string },\n ): Promise<void> {\n const isPeer = groupId.startsWith(\"peer:\");\n const isRoom = groupId.startsWith(\"room:\");\n\n if (!isPeer && !isRoom) {\n const errorMsg =\n \"Can only send files to peers in a peer or room conversation.\";\n showError(errorMsg, 4500);\n throw new Error(errorMsg);\n }\n\n const router = this.orchestrator?.router;\n if (!router) {\n const errorMsg = \"Network router is not initialized.\";\n showError(errorMsg, 4500);\n throw new Error(errorMsg);\n }\n\n const fileName = options?.fileName || filePath.split(\"/\").pop() || filePath;\n const mimeType = options?.mimeType || \"application/octet-stream\";\n const size = options?.size || 0;\n\n router.setTyping(groupId, true);\n try {\n const attachment: MessageAttachment = {\n path: filePath,\n fileName,\n mimeType,\n size,\n };\n\n await router.send(groupId, \"\", [attachment]);\n\n if (this._db) {\n const stored: StoredMessage = {\n id: ulid(),\n groupId,\n sender: \"You\",\n content: \"\",\n timestamp: Date.now(),\n channel: isRoom ? \"room\" : \"peerjs\",\n attachments: [attachment],\n isFromMe: false,\n isTrigger: false,\n };\n await saveMessage(this._db, stored);\n this.orchestrator?.events.emit(\"message\", stored);\n }\n\n const targetLabel = isRoom ? \"room peers\" : \"peer\";\n showSuccess(`Sent ${fileName} to ${targetLabel}`, 2500);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n console.error(\"sendFileToPeer error:\", err);\n showError(`Failed to send file: ${message}`, 6000);\n throw err;\n } finally {\n router.setTyping(groupId, false);\n }\n }\n\n /**\n * Set active group\n */\n setActiveGroup(\n db: ShadowClawDatabase,\n groupId: string,\n clearUnread = this._activePage.get() === \"chat\",\n ) {\n this._activeGroupId.set(groupId);\n this._messages.set([]);\n this._activityLog.set([]);\n this._error.set(null);\n this._isTyping.set(false);\n this._toolActivity.set(null);\n this._modelDownloadProgress.set(null);\n this._streamingText.set(null);\n this._currentPath.set(\".\");\n\n // Clear unread indicator for the group being viewed\n if (clearUnread) {\n const unread = new Set(this._unreadGroupIds.get());\n if (unread.delete(groupId)) {\n this._unreadGroupIds.set(unread);\n }\n }\n\n this.loadHistory();\n this.loadTasks(db);\n this.loadFiles(db);\n }\n\n setReady(ready: boolean = true): void {\n this._ready.set(ready);\n if (ready && this._readyResolve) {\n this._readyResolve();\n }\n }\n\n /**\n * Set the remote agent status for a specific group.\n */\n setRemoteAgentStatus(\n groupId: string,\n status: OrchestratorDisplayState,\n ): void {\n const statusMap = this._remoteAgentStatusByGroup.get();\n const newMap = new Map(statusMap);\n newMap.set(groupId, status);\n this._remoteAgentStatusByGroup.set(newMap);\n }\n\n /**\n * Set the remote agent typing status for a specific group.\n */\n setRemoteAgentTyping(groupId: string, typing: boolean): void {\n const typingMap = this._remoteAgentTypingByGroup.get();\n const newMap = new Map(typingMap);\n if (typing) {\n newMap.set(groupId, true);\n } else {\n newMap.delete(groupId);\n }\n\n this._remoteAgentTypingByGroup.set(newMap);\n }\n\n get sidebarDefaultPage() {\n return this._sidebarDefaultPage.get();\n }\n\n get state() {\n return this._state.get();\n }\n\n /**\n * Stop the active in-flight request for the current group.\n */\n stopCurrentRequest() {\n this.orchestrator?.stopCurrentRequest?.(this._activeGroupId.get());\n }\n\n get storageStatus() {\n return this._storageStatus.get();\n }\n\n /**\n * Get the accumulated streaming text, or `null` if no stream is active.\n */\n get streamingText(): string | null {\n return this._streamingText.get();\n }\n\n /**\n * Request a manual host -> VM workspace sync for the active group.\n */\n syncHostWorkspaceToVM() {\n syncTerminalWorkspace(this.orchestrator!, this._activeGroupId.get());\n }\n\n /**\n * Request a manual VM -> host workspace flush for the active group.\n */\n syncVMWorkspaceToHost() {\n flushTerminalWorkspace(this.orchestrator!, this._activeGroupId.get());\n }\n\n get tasks() {\n return this._tasks.get();\n }\n\n get tokenUsage() {\n return this._tokenUsage.get();\n }\n\n get toolActivity() {\n return this._toolActivity.get();\n }\n\n /**\n * Get the set of groupIds with unread messages.\n */\n get unreadGroupIds(): Set<string> {\n return this._unreadGroupIds.get();\n }\n\n get useProxy() {\n return this._useProxy.get();\n }\n\n get vmBashFullInternetAccess() {\n return this._vmBashFullInternetAccess.get();\n }\n\n get whenInitialized(): Promise<void> {\n return this._whenInitialized;\n }\n\n /** Allow embedded declarative site defaults to apply again on next boot. */\n async resetSiteConfigSeed(db: ShadowClawDatabase): Promise<void> {\n await setConfig(db, CONFIG_KEYS.SITE_CONFIG_SEEDED, false);\n }\n\n get whenReady(): Promise<void> {\n return this._whenReady;\n }\n\n async addPage(\n db: ShadowClawDatabase,\n path: string,\n groupId: string = this._activeGroupId.get(),\n ): Promise<void> {\n const normalized =\n groupId === DEFAULT_GROUP_ID ? this.normalizePagePath(path) : path.trim();\n if (!normalized || !this.isPageAllowed(normalized, groupId)) {\n return;\n }\n\n const pages = this._pages.get();\n if (\n pages.some(\n (entry) => entry.path === normalized && entry.groupId === groupId,\n )\n ) {\n return;\n }\n\n this.setPages([\n ...pages,\n {\n groupId,\n path: normalized,\n },\n ]);\n\n await unsuppressPage(db, groupId, normalized);\n\n if (\n groupId === DEFAULT_GROUP_ID &&\n normalized === DEFAULT_MAIN_GROUP_MEMORY_PATH\n ) {\n await setMainGroupMemorySuppressed(db, false);\n }\n\n await this.persistPages(db);\n }\n\n /**\n * Clear all tasks for the current group\n */\n async clearAllTasks(db: ShadowClawDatabase): Promise<void> {\n const allTasks = await getAllTasks(db);\n const currentGroupId = this._activeGroupId.get();\n const groupTasks = allTasks.filter((t) => t.groupId === currentGroupId);\n\n const subscriberId = await this.getSubscriberId(db);\n\n for (const task of groupTasks) {\n const serverResult = await deleteTaskFromServer(\n task.id,\n this.getTaskServerBaseUrl(),\n subscriberId,\n this.orchestrator?.taskServerEnabled ?? false,\n );\n if (serverResult === \"failed\") {\n console.warn(\n `Failed to delete task \"${task.id}\" from server — queued for replay.`,\n );\n await this.queueTaskSyncOutboxOperation(db, {\n type: \"delete\",\n id: task.id,\n queuedAt: Date.now(),\n });\n\n continue;\n }\n\n await deleteTask(db, task.id);\n }\n\n await this.loadTasks(db);\n }\n\n /**\n * Clone a conversation (metadata + messages + tasks + MEMORY.md)\n * and switch to the clone.\n */\n async cloneConversation(\n db: ShadowClawDatabase,\n sourceGroupId: string,\n ): Promise<GroupMeta | null> {\n const clone = await cloneGroup(db, sourceGroupId);\n if (!clone) {\n return null;\n }\n\n await cloneGroupMessages(db, sourceGroupId, clone.groupId);\n await cloneGroupTasks(db, sourceGroupId, clone.groupId);\n\n try {\n const memory = await readGroupFile(db, sourceGroupId, \"MEMORY.md\");\n if (memory) {\n await writeGroupFile(db, clone.groupId, \"MEMORY.md\", memory);\n }\n } catch {\n // Source has no MEMORY.md — nothing to copy\n }\n\n try {\n await copyGroupDirectory(db, sourceGroupId, clone.groupId, \"attachments\");\n } catch {\n // Source has no attachments directory — nothing to copy\n }\n\n this.setActiveGroup(db, clone.groupId);\n await this.loadGroups(db);\n\n return clone;\n }\n\n /**\n * Compact context\n */\n async compactContext(db: ShadowClawDatabase): Promise<any> {\n if (!this.orchestrator) return;\n const { compactContext } =\n await import(\"../core/orchestrator/utils/compact-context.js\");\n return compactContext(this.orchestrator, db, this._activeGroupId.get());\n }\n\n /**\n * Create a conversation\n */\n async createConversation(\n db: ShadowClawDatabase,\n name: string,\n ): Promise<GroupMeta> {\n const group = await createGroup(db, name);\n this.setActiveGroup(db, group.groupId);\n await this.loadGroups(db);\n\n return group;\n }\n\n /**\n * Delete a conversation. Refuses to delete the last remaining group.\n * If the deleted group is active, switches to the first remaining group.\n */\n async deleteConversation(\n db: ShadowClawDatabase,\n groupId: string,\n ): Promise<void> {\n const groups = this._groups.get();\n if (groups.length <= 1) {\n return;\n }\n\n await deleteGroupMetadata(db, groupId);\n await clearGroupMessages(db, groupId);\n await this.loadGroups(db);\n\n if (this._activeGroupId.get() === groupId) {\n const remaining = this._groups.get();\n const next = remaining[0]?.groupId || DEFAULT_GROUP_ID;\n this.setActiveGroup(db, next);\n }\n }\n\n /**\n * Delete a message\n */\n async deleteMessage(db: ShadowClawDatabase, id: string): Promise<void> {\n await deleteMessage(db, id);\n await this.loadHistory();\n if (this.orchestrator?.refreshContextUsage) {\n await this.orchestrator.refreshContextUsage(\n db,\n this._activeGroupId.get(),\n );\n }\n }\n\n /**\n * Delete a task\n */\n async deleteTask(db: ShadowClawDatabase, id: string): Promise<void> {\n const subscriberId = await this.getSubscriberId(db);\n const serverResult = await deleteTaskFromServer(\n id,\n this.getTaskServerBaseUrl(),\n subscriberId,\n this.orchestrator?.taskServerEnabled ?? false,\n );\n if (serverResult === \"failed\") {\n console.warn(\"Failed to delete task from server — queued for replay.\");\n await this.queueTaskSyncOutboxOperation(db, {\n type: \"delete\",\n id,\n queuedAt: Date.now(),\n });\n\n throw new Error(\n \"Failed to delete scheduled task on server; task kept locally.\",\n );\n }\n\n await deleteTask(db, id);\n await this.loadTasks(db);\n }\n\n /**\n * Ensure a PeerJS conversation exists. If not, create it.\n */\n async ensurePeerConversation(\n db: ShadowClawDatabase,\n remotePeerId: string,\n ): Promise<string> {\n const groupId = `peer:${remotePeerId}`;\n const groups = await listGroups(db);\n const existing = groups.find((g) => g.groupId === groupId);\n if (!existing) {\n const metadata = [...groups];\n let aliasName = \"\";\n if (this.orchestrator?.peerjsPeerAliases) {\n // Find if any alias matches this remotePeerId\n for (const [alias, id] of Object.entries(\n this.orchestrator.peerjsPeerAliases,\n )) {\n if (id === remotePeerId) {\n aliasName = alias;\n\n break;\n }\n }\n }\n\n metadata.push({\n groupId,\n name: `Peer: ${aliasName ? aliasName : remotePeerId.substring(0, 8)}`,\n createdAt: Date.now(),\n });\n await saveGroupMetadata(db, metadata);\n await this.loadGroups(db);\n }\n\n return groupId;\n }\n\n /**\n * Request storage access\n */\n async grantStorageAccess(db: ShadowClawDatabase): Promise<void> {\n try {\n await requestStorageAccess(db);\n await this.loadFiles(db); // Refresh files and status after granting access\n } catch (err) {\n console.error(\"Failed to grant storage access:\", err);\n }\n }\n\n /**\n * Initialize the store with an Orchestrator instance\n */\n async init(db: ShadowClawDatabase, orch: Orchestrator): Promise<void> {\n this._db = db;\n this.orchestrator = orch;\n\n this._taskSyncOutbox = this.parseTaskSyncOutbox(\n await getConfig(db, CONFIG_KEYS.TASK_SYNC_OUTBOX),\n );\n\n await this.replayTaskSyncOutbox(db);\n\n if (typeof window !== \"undefined\" && !this._onlineReplayHandler) {\n this._onlineReplayHandler = () => {\n if (this._db) {\n void this.replayTaskSyncOutbox(this._db);\n }\n };\n\n window.addEventListener(\"online\", this._onlineReplayHandler);\n }\n\n // Subscribe to orchestrator events\n orch.events.on(\"a2ui-surface\", async ({ groupId, envelope }) => {\n if (groupId) {\n void this.ensureGroupExists(db, groupId);\n }\n\n const messages = this._messages.get();\n const existingMsgIndex = messages.findIndex((m) =>\n m.a2uiEnvelopes?.some((e) => e.surfaceId === envelope.surfaceId),\n );\n\n if (existingMsgIndex !== -1) {\n const existingMsg = messages[existingMsgIndex];\n const updatedEnvelopes = [\n ...(existingMsg.a2uiEnvelopes || []),\n envelope,\n ];\n const updatedMsg = {\n ...existingMsg,\n a2uiEnvelopes: updatedEnvelopes,\n };\n const updatedMessages = [...messages];\n updatedMessages[existingMsgIndex] = updatedMsg;\n this._messages.set(updatedMessages);\n\n await saveMessage(db, updatedMsg);\n } else {\n const isFromMe = !groupId.startsWith(\"peer:\");\n const newMsg: StoredMessage = {\n id: ulid(),\n groupId,\n sender: isFromMe ? \"agent\" : groupId.replace(/^peer:/, \"\"),\n content: \"\",\n timestamp: Date.now(),\n channel: groupId.startsWith(\"peer:\") ? \"peerjs\" : \"browser\",\n isFromMe,\n isTrigger: false,\n a2uiEnvelopes: [envelope],\n };\n\n if (groupId === this._activeGroupId.get()) {\n this._messages.set([...messages, newMsg]);\n }\n\n await saveMessage(db, newMsg);\n }\n });\n\n orch.events.on(\"message\", (msg) => {\n if (msg.groupId) {\n void this.ensureGroupExists(db, msg.groupId, msg.timestamp);\n }\n\n // Only append messages belonging to the active conversation\n if (msg.groupId && msg.groupId !== this._activeGroupId.get()) {\n // Track as unread for the sidebar pulse indicator\n const unread = new Set(this._unreadGroupIds.get());\n unread.add(msg.groupId);\n this._unreadGroupIds.set(unread);\n\n return;\n }\n\n // When a streaming response finalizes, the `response` message arrives\n // but the streaming bubble already showed the text. Don't double-append;\n // just clear streaming state and let the persisted message appear.\n if (msg.isFromMe && this._streamingText.get() !== null) {\n this._streamingText.set(null);\n }\n\n this._messages.set([...this._messages.get(), msg]);\n });\n\n orch.events.on(\"typing\", ({ groupId, typing }) => {\n if (groupId && groupId !== this._activeGroupId.get()) {\n return;\n }\n\n this._isTyping.set(typing);\n });\n\n orch.events.on(\"tool-activity\", ({ groupId, tool, status }) => {\n if (groupId && groupId !== this._activeGroupId.get()) {\n return;\n }\n\n this._toolActivity.set(status === \"running\" ? { tool, status } : null);\n });\n\n orch.events.on(\"model-download-progress\", (payload) => {\n this._modelDownloadProgress.set(\n payload.status === \"done\" ? null : payload,\n );\n });\n\n orch.events.on(\"thinking-log\", (entry) => {\n // Only show activity for the active conversation\n if (entry.groupId && entry.groupId !== this._activeGroupId.get()) {\n return;\n }\n\n // Reset log when a new invocation starts\n if (entry.level === \"info\" && entry.label === \"Starting\") {\n this._activityLog.set([entry]);\n } else {\n this._activityLog.set([...this._activityLog.get(), entry]);\n }\n\n void this.forwardActivityLogEntryToServer(entry);\n });\n\n orch.events.on(\"state-change\", (payload) => {\n const state = typeof payload === \"string\" ? payload : payload.state;\n const groupId = typeof payload === \"string\" ? undefined : payload.groupId;\n\n if (groupId && groupId !== this._activeGroupId.get()) {\n return;\n }\n\n const prev = this._lastOrchestratorDisplayState;\n this._lastOrchestratorDisplayState = state;\n this._state.set(state);\n\n if (state === \"idle\") {\n this._toolActivity.set(null);\n this._modelDownloadProgress.set(null);\n this._streamingText.set(null);\n }\n\n if (\n state === \"thinking\" &&\n prev !== \"thinking\" &&\n prev !== \"responding\"\n ) {\n this._tokenUsageAccumulator = null;\n }\n });\n\n orch.events.on(\"error\", ({ error }) => {\n console.error(\"[Orchestrator Error Event]\", error);\n\n this._error.set(error);\n this._state.set(\"error\");\n });\n\n orch.events.on(\"session-reset\", () => {\n this._messages.set([]);\n this._activityLog.set([]);\n this._tokenUsageAccumulator = null;\n this._tokenUsage.set(null);\n this._contextUsage.set(null);\n this._toolActivity.set(null);\n this._modelDownloadProgress.set(null);\n this._streamingText.set(null);\n this._isTyping.set(false);\n this._state.set(\"idle\");\n });\n\n orch.events.on(\"context-compacted\", (payload) => {\n // Only reload history if the compacted group is the one being viewed\n if (payload?.groupId && payload.groupId !== this._activeGroupId.get()) {\n return;\n }\n\n this._tokenUsage.set(null);\n this.loadHistory();\n });\n\n orch.events.on(\"token-usage\", (usage: TokenUsage | null) => {\n if (!usage) {\n return;\n }\n\n if (usage.groupId && usage.groupId !== this._activeGroupId.get()) {\n return;\n }\n\n const accumulated = accumulateTokenUsage(\n this._tokenUsageAccumulator,\n usage,\n );\n\n this._tokenUsageAccumulator = accumulated;\n this._tokenUsage.set(accumulated);\n\n // Refresh context usage so the UI reflects the actual token usage from the API\n if (this.orchestrator?.refreshContextUsage && this._db) {\n void this.orchestrator.refreshContextUsage(\n this._db,\n this._activeGroupId.get(),\n );\n }\n });\n\n orch.events.on(\"context-usage\", (usage) => {\n this._contextUsage.set(usage);\n });\n\n orch.events.on(\"ready\", () => {\n this._ready.set(true);\n });\n\n orch.events.on(\"task-change\", () => {\n this.loadTasks(db);\n });\n\n orch.events.on(\"file-change\", () => {\n this.loadFiles(db);\n });\n\n // --- Streaming events ---\n\n orch.events.on(\"streaming-start\", ({ groupId }) => {\n if (groupId !== this._activeGroupId.get()) {\n return;\n }\n\n this._streamingText.set(\"\");\n });\n\n orch.events.on(\"streaming-chunk\", ({ groupId, text }) => {\n if (groupId !== this._activeGroupId.get()) {\n return;\n }\n\n const current = this._streamingText.get();\n this._streamingText.set((current || \"\") + text);\n });\n\n orch.events.on(\"streaming-end\", ({ groupId }) => {\n if (groupId !== this._activeGroupId.get()) {\n return;\n }\n\n // Tool calls are about to run; clear the streaming bubble\n this._streamingText.set(null);\n });\n\n orch.events.on(\"streaming-done\", ({ groupId }) => {\n if (groupId !== this._activeGroupId.get()) {\n return;\n }\n });\n\n orch.events.on(\"streaming-error\", ({ groupId }) => {\n if (groupId !== this._activeGroupId.get()) {\n return;\n }\n });\n\n // --- AG-UI adapter (emits AG-UI CustomEvents for all conversations) ---\n this._aguiAdapter = new AGUIAdapter(orch.events);\n this._aguiAdapter.start();\n\n // Forward AG-UI DOM events into a reactive signal for the active group\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"shadow-claw-agui-event\", ((\n e: CustomEvent<{ groupId: string; event: unknown }>,\n ) => {\n if (e.detail.groupId === this._activeGroupId.get()) {\n this._aguiEvent.set(e.detail as any);\n }\n\n const ev = e.detail.event as any;\n if (ev) {\n if (ev.type === \"STATE_SNAPSHOT\") {\n const currentMap = new Map(this._peerStateByGroup.get());\n currentMap.set(e.detail.groupId, ev.snapshot || {});\n this._peerStateByGroup.set(currentMap);\n } else if (ev.type === \"STATE_DELTA\") {\n const currentMap = new Map(this._peerStateByGroup.get());\n const existingState = currentMap.get(e.detail.groupId) || {};\n const patched = applyJsonPatch(existingState, ev.delta || []);\n currentMap.set(e.detail.groupId, patched);\n this._peerStateByGroup.set(currentMap);\n }\n }\n }) as EventListener);\n }\n\n // Initialize custom element security from DB and install registry guard\n await loadCustomElementSecurityFromDb(db);\n installCustomElementsRegistryGuard();\n installCustomElementDomGuard();\n await yieldToMain();\n\n // Load pages allowList / denyList from DB\n const rawAllowList = await getConfig(db, CONFIG_KEYS.PAGES_ALLOW_LIST);\n const rawDenyList = await getConfig(db, CONFIG_KEYS.PAGES_DENY_LIST);\n if (rawAllowList) {\n this._pagesAllowList.set(parseStoredStringList(String(rawAllowList)));\n }\n if (rawDenyList) {\n this._pagesDenyList.set(parseStoredStringList(String(rawDenyList)));\n }\n await yieldToMain();\n\n const hasStaticRouting =\n typeof document !== \"undefined\" &&\n document.getElementById(\"shadow-claw-static-routing\") !== null;\n\n // Seed static main site files (including declarative tools) first\n const rawPagesList = await getConfig(db, CONFIG_KEYS.PAGES_LIST);\n const existingPages =\n rawPagesList !== null && rawPagesList !== undefined\n ? this.parsePagesList(rawPagesList)\n : [];\n const seeded = await seedStaticMainSite(\n db,\n DEFAULT_GROUP_ID,\n existingPages,\n );\n if (seeded.length > 0) {\n this.setPages(seeded);\n await this.persistPages(db);\n } else {\n await this.ensureDefaultPage(db);\n }\n await yieldToMain();\n\n // Apply declarative site config defaults (from embedded site-config.json) on first boot\n await this.applySiteConfigDefaults(db);\n await yieldToMain();\n\n // Restore last-active conversation, then load data\n await this.loadGroups(db);\n const lastGroup = await getConfig(db, CONFIG_KEYS.LAST_ACTIVE_GROUP);\n if (lastGroup && lastGroup !== this._activeGroupId.get()) {\n this._activeGroupId.set(lastGroup);\n }\n await yieldToMain();\n\n const lastPage = (await getConfig(db, CONFIG_KEYS.LAST_ACTIVE_PAGE)) as\n string | null;\n if (lastPage) {\n this._activePage.set(lastPage);\n this._hadPersistedActivePage = true;\n }\n\n const sidebarDefaultPageRaw = await getConfig(\n db,\n CONFIG_KEYS.SIDEBAR_DEFAULT_PAGE,\n );\n this._sidebarDefaultPage.set(\n this.normalizeSidebarDefaultPage(sidebarDefaultPageRaw),\n );\n\n const siteConfigDefaultPinned = getSiteConfigDefaultPinnedPage();\n let defaultPinnedRef: SavedPageRef | null = null;\n if (siteConfigDefaultPinned) {\n defaultPinnedRef = resolveDefaultPinnedPageRef(siteConfigDefaultPinned);\n }\n if (!defaultPinnedRef) {\n const rawDefaultPinned = await getConfig(\n db,\n CONFIG_KEYS.DEFAULT_PINNED_PAGE,\n );\n if (rawDefaultPinned) {\n defaultPinnedRef = resolveDefaultPinnedPageRef(\n rawDefaultPinned as string,\n );\n }\n }\n if (\n defaultPinnedRef &&\n this.isPageAllowed(defaultPinnedRef.path, defaultPinnedRef.groupId)\n ) {\n this._defaultPinnedPage.set(defaultPinnedRef);\n }\n await yieldToMain();\n\n const historyState =\n typeof window !== \"undefined\" && window.history\n ? (window.history.state as any)\n : null;\n const isFeedScroll = !!(\n historyState?.inFeedScroll ||\n historyState?.scrollSpy ||\n historyState?.suppressRouter\n );\n\n const isRootLocation =\n isFeedScroll ||\n (typeof window !== \"undefined\" &&\n window.location &&\n (() => {\n let pathname = window.location.pathname || \"/\";\n const basePath = getAppBasePath();\n if (basePath !== \"/\" && pathname.startsWith(basePath)) {\n pathname = \"/\" + pathname.slice(basePath.length);\n }\n const parts = pathname.split(\"/\").filter(Boolean);\n return (\n parts.length === 0 ||\n (parts.length === 1 && parts[0] === \"index.html\")\n );\n })());\n\n let activePinnedSet = false;\n if (\n isRootLocation &&\n defaultPinnedRef &&\n this.isPageAllowed(defaultPinnedRef.path, defaultPinnedRef.groupId)\n ) {\n this._activePinnedPage.set(defaultPinnedRef);\n activePinnedSet = true;\n }\n\n if (!activePinnedSet) {\n const lastPinnedPageRaw = await getConfig(\n db,\n CONFIG_KEYS.LAST_SELECTED_PINNED_PAGE,\n );\n if (lastPinnedPageRaw) {\n try {\n const parsed = JSON.parse(lastPinnedPageRaw as string);\n if (\n parsed &&\n typeof parsed.path === \"string\" &&\n typeof parsed.groupId === \"string\" &&\n this.isPageAllowed(parsed.path, parsed.groupId)\n ) {\n this._activePinnedPage.set(parsed);\n activePinnedSet = true;\n }\n } catch {}\n }\n }\n\n if (!activePinnedSet && isRootLocation && this.effectiveDefaultPage) {\n if (\n this.isPageAllowed(\n this.effectiveDefaultPage.path,\n this.effectiveDefaultPage.groupId,\n )\n ) {\n this._activePinnedPage.set(this.effectiveDefaultPage);\n activePinnedSet = true;\n }\n }\n\n // Initialize proxy values from orchestrator\n if (this.orchestrator) {\n this._useProxy.set(this.orchestrator.useProxy);\n this._proxyUrl.set(this.orchestrator.proxyUrl);\n this._gitProxyUrl.set(this.orchestrator.gitProxyUrl);\n this._vmBashFullInternetAccess.set(\n this.orchestrator.vmBashFullInternetAccess,\n );\n }\n\n const [dbChatHiddenRaw, dbTasksHiddenRaw, dbFilesHiddenRaw] =\n await Promise.all([\n getConfig(db, CONFIG_KEYS.SIDEBAR_CHAT_HIDDEN),\n getConfig(db, CONFIG_KEYS.SIDEBAR_TASKS_HIDDEN),\n getConfig(db, CONFIG_KEYS.SIDEBAR_FILES_HIDDEN),\n ]);\n\n const siteConfig = getSiteConfig();\n const siteChatHidden = siteConfig?.sidebar?.chatHidden;\n const siteTasksHidden = siteConfig?.sidebar?.tasksHidden;\n const siteFilesHidden = siteConfig?.sidebar?.filesHidden;\n\n const isChatHidden =\n dbChatHiddenRaw !== null && dbChatHiddenRaw !== undefined\n ? isTruthyConfigValue(dbChatHiddenRaw)\n : Boolean(siteChatHidden);\n\n const isTasksHidden =\n dbTasksHiddenRaw !== null && dbTasksHiddenRaw !== undefined\n ? isTruthyConfigValue(dbTasksHiddenRaw)\n : Boolean(siteTasksHidden);\n\n const isFilesHidden =\n dbFilesHiddenRaw !== null && dbFilesHiddenRaw !== undefined\n ? isTruthyConfigValue(dbFilesHiddenRaw)\n : Boolean(siteFilesHidden);\n\n const runSecondaryLoads = () => {\n const secondaryLoads: Promise<unknown>[] = [];\n if (!isChatHidden || this.activePage === \"chat\") {\n secondaryLoads.push(this.loadHistory());\n }\n if (!isTasksHidden || this.activePage === \"tasks\") {\n secondaryLoads.push(this.loadTasks(db));\n }\n if (!isFilesHidden || this.activePage === \"files\") {\n secondaryLoads.push(this.loadFiles(db));\n }\n\n void Promise.all(secondaryLoads).catch((err) => {\n console.warn(\"Secondary background store loads failed:\", err);\n });\n };\n\n if (hasStaticRouting) {\n if (typeof (window as any).requestIdleCallback === \"function\") {\n (window as any).requestIdleCallback(runSecondaryLoads, {\n timeout: 2000,\n });\n } else {\n setTimeout(runSecondaryLoads, 100);\n }\n } else {\n const immediateLoads: Promise<unknown>[] = [];\n if (!isChatHidden || this.activePage === \"chat\") {\n immediateLoads.push(this.loadHistory());\n }\n if (!isTasksHidden || this.activePage === \"tasks\") {\n immediateLoads.push(this.loadTasks(db));\n }\n if (!isFilesHidden || this.activePage === \"files\") {\n immediateLoads.push(this.loadFiles(db));\n }\n await Promise.all(immediateLoads);\n }\n\n await yieldToMain();\n this._initResolve?.();\n\n this.scheduleBackgroundStaticMainSiteSeeding(db);\n }\n\n /**\n * Load files\n */\n async loadFiles(db: ShadowClawDatabase): Promise<void> {\n const groupId = this._activeGroupId.get();\n const currentPath = this._currentPath.get();\n try {\n this._storageStatus.set(await getStorageStatus(db));\n\n const files = await listGroupFiles(db, groupId, currentPath);\n\n this._files.set(files);\n } catch (err) {\n console.error(\"Failed to load files in store:\", err);\n }\n }\n\n /**\n * Load conversations\n */\n async loadGroups(db: ShadowClawDatabase): Promise<void> {\n const groups = await listGroups(db);\n this._groups.set(groups);\n }\n\n /**\n * Load message history\n */\n async loadHistory() {\n const groupId = this._activeGroupId.get();\n const msgs = await getRecentMessages(groupId, 200);\n\n // Guard: if the user switched conversations during the async DB query,\n // discard these results to avoid overwriting the new conversation's messages.\n if (this._activeGroupId.get() !== groupId) {\n return;\n }\n\n this._messages.set(msgs);\n }\n\n /**\n * Load tasks\n */\n async loadTasks(db: ShadowClawDatabase): Promise<void> {\n const currentGroupId = this._activeGroupId.get();\n const allLocalTasks = await getAllTasks(db);\n const localGroupTasks = allLocalTasks.filter(\n (t) => t.groupId === currentGroupId,\n );\n localGroupTasks.sort((a, b) => {\n const oA = a.order ?? 0;\n const oB = b.order ?? 0;\n if (oA !== oB) {\n return oA - oB;\n }\n return a.createdAt - b.createdAt;\n });\n this._tasks.set(localGroupTasks);\n\n const subscriberId = await this.getSubscriberId(db);\n\n // Reconcile server-side scheduled tasks into local IndexedDB so\n // server tasks become visible in the UI and can be deleted.\n const serverGroupTasks = await fetchServerTasksForGroup(\n currentGroupId,\n this.getTaskServerBaseUrl(),\n subscriberId,\n this.orchestrator?.taskServerEnabled ?? false,\n );\n if (!serverGroupTasks) {\n return;\n }\n\n const localTaskIds = new Set(allLocalTasks.map((task) => task.id));\n const serverOnlyTasks = serverGroupTasks.filter(\n (task) => !localTaskIds.has(task.id),\n );\n\n if (serverOnlyTasks.length === 0) {\n return;\n }\n\n for (const task of serverOnlyTasks) {\n await saveTask(db, task);\n }\n\n const combined = [...localGroupTasks, ...serverOnlyTasks];\n combined.sort((a, b) => {\n const oA = a.order ?? 0;\n const oB = b.order ?? 0;\n if (oA !== oB) {\n return oA - oB;\n }\n return a.createdAt - b.createdAt;\n });\n this._tasks.set(combined);\n }\n\n /**\n * Navigate back to parent folder\n */\n async navigateBackFolder(db: ShadowClawDatabase): Promise<void> {\n const currentPath = this._currentPath.get();\n if (currentPath === \".\") {\n return;\n }\n\n const parts = currentPath.split(\"/\").filter(Boolean);\n\n parts.pop();\n\n const newPath = parts.length === 0 ? \".\" : parts.join(\"/\");\n\n await this.setCurrentPath(db, newPath);\n }\n\n /**\n * Navigate into a folder\n */\n async navigateIntoFolder(\n db: ShadowClawDatabase,\n folderName: string,\n ): Promise<void> {\n const currentPath = this._currentPath.get();\n const newPath =\n currentPath === \".\"\n ? folderName.replace(/\\/$/, \"\")\n : `${currentPath}/${folderName.replace(/\\/$/, \"\")}`;\n\n try {\n await this.setCurrentPath(db, newPath);\n } catch (err) {\n console.error(\"Failed to navigate into folder in store:\", err);\n showError(`Folder not found: ${newPath}`, 4500);\n await this.loadFiles(db);\n }\n }\n\n /**\n * Start a new session\n */\n async newSession(db: ShadowClawDatabase): Promise<void> {\n await this.orchestrator?.newSession?.(db, this._activeGroupId.get());\n await this.loadHistory();\n }\n\n async removePage(\n db: ShadowClawDatabase,\n path: string,\n groupId: string = this._activeGroupId.get(),\n ): Promise<void> {\n const normalized = this.normalizePagePath(path);\n if (!normalized) {\n return;\n }\n\n const pages = this._pages.get();\n if (\n !pages.some(\n (entry) => entry.path === normalized && entry.groupId === groupId,\n )\n ) {\n return;\n }\n\n const remainingPages = pages.filter(\n (entry) => !(entry.path === normalized && entry.groupId === groupId),\n );\n\n await suppressPage(db, groupId, normalized);\n\n const removingMainMemoryPage =\n groupId === DEFAULT_GROUP_ID &&\n normalized === DEFAULT_MAIN_GROUP_MEMORY_PATH;\n\n if (removingMainMemoryPage) {\n await setMainGroupMemorySuppressed(db, true);\n }\n\n const mainMemorySuppressed =\n removingMainMemoryPage || (await isMainGroupMemorySuppressed(db));\n\n if (remainingPages.length === 0 && !mainMemorySuppressed) {\n const hasWorkspaceReadme = await ensureMainGroupMemory(\n db,\n DEFAULT_GROUP_ID,\n );\n\n if (hasWorkspaceReadme) {\n remainingPages.push({\n groupId: DEFAULT_GROUP_ID,\n path: OrchestratorStore.DEFAULT_PAGE_PATH,\n });\n } else {\n return;\n }\n }\n\n this.setPages(remainingPages);\n const def = this._defaultPinnedPage.get();\n if (def && def.path === normalized && def.groupId === groupId) {\n await this.setDefaultPinnedPage(db, null);\n }\n await this.persistPages(db);\n }\n\n async removeAllPages(db: ShadowClawDatabase): Promise<void> {\n const pages = [...this._pages.get()];\n for (const page of pages) {\n await suppressPage(db, page.groupId, page.path);\n if (\n page.groupId === DEFAULT_GROUP_ID &&\n page.path === DEFAULT_MAIN_GROUP_MEMORY_PATH\n ) {\n await setMainGroupMemorySuppressed(db, true);\n }\n }\n\n this.setPages([]);\n await this.setDefaultPinnedPage(db, null);\n await this.setActivePinnedPage(db, null);\n await this.persistPages(db);\n }\n\n /**\n * Rename a conversation\n */\n async renameConversation(\n db: ShadowClawDatabase,\n groupId: string,\n newName: string,\n ): Promise<void> {\n await renameGroup(db, groupId, newName);\n await this.loadGroups(db);\n }\n\n /**\n * Reorder conversations\n */\n async reorderConversations(\n db: ShadowClawDatabase,\n groupIds: string[],\n ): Promise<void> {\n await reorderGroups(db, groupIds);\n await this.loadGroups(db);\n }\n\n /**\n * Reorder tasks in a group\n */\n async reorderTasks(\n db: ShadowClawDatabase,\n groupId: string,\n taskIds: string[],\n ): Promise<void> {\n const updatedTasks = await reorderTasks(db, groupId, taskIds);\n await this.loadTasks(db);\n\n // Sync all updated tasks to the server\n const subscriberId = await this.getSubscriberId(db);\n for (const task of updatedTasks) {\n const base = this.getTaskServerBaseUrl();\n const ok = await syncTaskToServer(\n task,\n base,\n subscriberId,\n this.orchestrator?.taskServerEnabled ?? false,\n );\n if (!ok) {\n console.warn(\n `Failed to sync reordered task \"${task.id}\" to server — queued for replay.`,\n );\n await this.queueTaskSyncOutboxOperation(db, {\n type: \"upsert\",\n id: task.id,\n task,\n queuedAt: Date.now(),\n });\n }\n }\n }\n\n async replayTaskSyncOutbox(db: ShadowClawDatabase): Promise<void> {\n if (this._replayingTaskSyncOutbox || this._taskSyncOutbox.length === 0) {\n return;\n }\n\n this._replayingTaskSyncOutbox = true;\n\n try {\n const subscriberId = await this.getSubscriberId(db);\n const remaining: TaskSyncOutboxOperation[] = [];\n\n for (const op of this._taskSyncOutbox) {\n const base = this.getTaskServerBaseUrl();\n const ok =\n op.type === \"upsert\"\n ? await syncTaskToServer(\n op.task,\n base,\n subscriberId,\n this.orchestrator?.taskServerEnabled ?? false,\n )\n : await deleteTaskFromServer(\n op.id,\n base,\n subscriberId,\n this.orchestrator?.taskServerEnabled ?? false,\n );\n\n if (!ok) {\n remaining.push(op);\n }\n }\n\n this._taskSyncOutbox = this.compactTaskSyncOutbox(remaining);\n await this.persistTaskSyncOutbox(db);\n } finally {\n this._replayingTaskSyncOutbox = false;\n }\n }\n\n /**\n * Reset to root folder\n */\n async resetToRootFolder(db: ShadowClawDatabase): Promise<void> {\n await this.setCurrentPath(db, \".\");\n }\n\n async restartCurrentRequest(): Promise<boolean> {\n if (!this.orchestrator?.restartCurrentRequest) {\n return false;\n }\n\n return this.orchestrator.restartCurrentRequest(this._activeGroupId.get());\n }\n\n /**\n * Restore tasks from backup\n */\n async restoreTasksFromBackup(\n db: ShadowClawDatabase,\n tasks: Task[],\n ): Promise<void> {\n // First, clear all existing tasks\n await this.clearAllTasks(db);\n\n const currentGroupId = this._activeGroupId.get();\n // Save each task with current group ID and new IDs\n for (const task of tasks) {\n const taskToSave = {\n ...task,\n groupId: currentGroupId,\n id: crypto.randomUUID\n ? crypto.randomUUID()\n : `task-${Date.now()}-${Math.random()}`,\n };\n\n await this.upsertTask(db, taskToSave, { reloadTasks: false });\n }\n\n await this.loadTasks(db);\n }\n\n /**\n * Run a task\n */\n async runTask(task: Task, isManual: boolean = false): Promise<void> {\n const db = this._db;\n if (isManual && db) {\n await updateTaskLastRun(task.id, Date.now());\n await this.loadTasks(db);\n }\n\n if (\n task.type === \"tools\" &&\n Array.isArray(task.tools) &&\n task.tools.length > 0\n ) {\n if (this.orchestrator?.agentWorker) {\n const executionGroupId = task.subagent\n ? `subagent:${ulid()}`\n : task.groupId;\n this.orchestrator.agentWorker.postMessage({\n type: \"execute-task-tools\",\n payload: {\n groupId: executionGroupId,\n tools: task.tools,\n isManual,\n },\n });\n } else {\n console.error(\"Agent worker not available to execute tool task.\");\n }\n } else {\n // Send the prompt directly to the conversation that owns the task,\n // NOT the currently-visible conversation — scheduled tasks must always\n // fire in the conversation they were created in.\n if (!task.groupId) {\n console.error(\n `Task ${task.id} has no groupId - refusing to execute in active conversation to prevent context pollution.`,\n );\n\n return;\n }\n\n this.orchestrator?.browserChat?.submit(\n task.prompt,\n task.groupId,\n [],\n undefined,\n task.freshContext,\n task.subagent,\n );\n }\n }\n\n /**\n * Set active page\n */\n async setActivePage(db: ShadowClawDatabase, page: string) {\n this._activePage.set(page);\n await setConfig(db, CONFIG_KEYS.LAST_ACTIVE_PAGE, page);\n\n const nextSidebarDefaultPage =\n this.resolveSidebarDefaultPageForActivePage(page);\n if (nextSidebarDefaultPage !== this._sidebarDefaultPage.get()) {\n this._sidebarDefaultPage.set(nextSidebarDefaultPage);\n await setConfig(\n db,\n CONFIG_KEYS.SIDEBAR_DEFAULT_PAGE,\n nextSidebarDefaultPage,\n );\n }\n }\n\n async setActivePinnedPage(\n db: ShadowClawDatabase,\n page: SavedPageRef | null,\n ): Promise<void> {\n if (page && !this.isPageAllowed(page.path, page.groupId)) {\n page = this.effectiveDefaultPage;\n }\n this._activePinnedPage.set(page);\n if (page) {\n await setConfig(\n db,\n CONFIG_KEYS.LAST_SELECTED_PINNED_PAGE,\n JSON.stringify(page),\n );\n } else {\n await setConfig(db, CONFIG_KEYS.LAST_SELECTED_PINNED_PAGE, null);\n }\n }\n\n async setDefaultPinnedPage(\n db: ShadowClawDatabase,\n page: SavedPageRef | null,\n ): Promise<void> {\n if (page && !this.isPageAllowed(page.path, page.groupId)) {\n return;\n }\n const current = this._defaultPinnedPage.get();\n const isSame =\n current &&\n page &&\n current.path === page.path &&\n current.groupId === page.groupId;\n const nextValue = isSame ? null : page;\n\n this._defaultPinnedPage.set(nextValue);\n if (nextValue) {\n await setConfig(\n db,\n CONFIG_KEYS.DEFAULT_PINNED_PAGE,\n JSON.stringify(nextValue),\n );\n } else {\n await setConfig(db, CONFIG_KEYS.DEFAULT_PINNED_PAGE, null);\n }\n }\n\n async reorderPages(\n db: ShadowClawDatabase,\n pages: SavedPageRef[],\n ): Promise<void> {\n this.setPages(pages);\n await this.persistPages(db);\n }\n\n /**\n * Set and load the current file browser path.\n */\n async setCurrentPath(db: ShadowClawDatabase, path: string): Promise<void> {\n const normalizedPath = path.replace(/^\\/+|\\/+$/g, \"\");\n const nextPath = normalizedPath ? normalizedPath : \".\";\n const groupId = this._activeGroupId.get();\n\n this._storageStatus.set(await getStorageStatus(db));\n\n const files = await listGroupFiles(db, groupId, nextPath);\n\n this._currentPath.set(nextPath);\n this._files.set(files);\n }\n\n /**\n * Set Git CORS proxy URL\n */\n async setGitProxyUrl(db: ShadowClawDatabase, url: string): Promise<void> {\n if (this.orchestrator) {\n await setGitProxyUrl(this.orchestrator, db, url);\n this._gitProxyUrl.set(this.orchestrator.gitProxyUrl);\n }\n }\n\n /**\n * Set global CORS proxy URL\n */\n async setProxyUrl(db: ShadowClawDatabase, url: string): Promise<void> {\n if (this.orchestrator) {\n await setProxyUrl(this.orchestrator, db, url);\n\n this._proxyUrl.set(this.orchestrator.proxyUrl);\n }\n }\n\n /**\n * Toggle global CORS proxy\n */\n async setUseProxy(db: ShadowClawDatabase, enabled: boolean): Promise<void> {\n if (this.orchestrator) {\n await setUseProxy(this.orchestrator, db, enabled);\n\n this._useProxy.set(this.orchestrator.useProxy);\n }\n }\n\n /**\n * Toggle shared full internet access for shell/javascript tools.\n */\n async setVMBashFullInternetAccess(\n db: ShadowClawDatabase,\n enabled: boolean,\n ): Promise<void> {\n if (this.orchestrator) {\n await setVMBashFullInternetAccess(this.orchestrator, db, enabled);\n this._vmBashFullInternetAccess.set(\n this.orchestrator.vmBashFullInternetAccess,\n );\n }\n }\n\n /**\n * Switch active conversation\n */\n async switchConversation(\n db: ShadowClawDatabase,\n groupId: string,\n clearUnread?: boolean,\n ): Promise<void> {\n this.setActiveGroup(\n db,\n groupId,\n clearUnread ?? this._activePage.get() === \"chat\",\n );\n await setConfig(db, CONFIG_KEYS.LAST_ACTIVE_GROUP, groupId);\n }\n\n /**\n * Toggle a task\n */\n async toggleTask(\n db: ShadowClawDatabase,\n task: Task,\n enabled: boolean,\n ): Promise<void> {\n const updatedTask = { ...task, enabled };\n await saveTask(db, updatedTask);\n await this.loadTasks(db);\n\n const serverOk = await syncTaskToServer(\n updatedTask,\n this.getTaskServerBaseUrl(),\n await this.getSubscriberId(db),\n this.orchestrator?.taskServerEnabled ?? false,\n );\n if (!serverOk) {\n console.warn(\"Failed to update task on server — queued for replay.\");\n\n await this.queueTaskSyncOutboxOperation(db, {\n type: \"upsert\",\n id: updatedTask.id,\n task: updatedTask,\n queuedAt: Date.now(),\n });\n }\n }\n\n /**\n * Update the pinned provider and model to an existing conversation\n */\n async updateConversationPinnedProvider(\n db: ShadowClawDatabase,\n groupId: string,\n providerId?: string,\n modelId?: string,\n pinnedMaxTokens?: number,\n ): Promise<void> {\n await updateGroupPinnedProvider(\n db,\n groupId,\n providerId,\n modelId,\n pinnedMaxTokens,\n );\n await this.loadGroups(db);\n }\n\n /**\n * Update provider module runtime overrides for a conversation.\n */\n async updateConversationProviderRuntimeOverrides(\n db: ShadowClawDatabase,\n groupId: string,\n overrides: GroupMeta[\"providerRuntimeOverrides\"],\n ): Promise<void> {\n await updateGroupProviderRuntimeOverrides(db, groupId, overrides);\n await this.loadGroups(db);\n }\n\n /**\n * Update subagent provider/model selection policy for a conversation.\n */\n async updateConversationSubagentSettings(\n db: ShadowClawDatabase,\n groupId: string,\n mode: \"automatic\" | \"manual\",\n providerId?: string,\n modelId?: string,\n subagentMaxTokens?: number,\n ): Promise<void> {\n await updateGroupSubagentSettings(\n db,\n groupId,\n mode,\n providerId,\n modelId,\n subagentMaxTokens,\n );\n await this.loadGroups(db);\n }\n\n /**\n * Update the tool tags pinned to an existing conversation\n */\n async updateConversationToolTags(\n db: ShadowClawDatabase,\n groupId: string,\n tags: string[],\n ): Promise<void> {\n await updateGroupToolTags(db, groupId, tags);\n await this.loadGroups(db);\n }\n\n /**\n * Save/update a task locally, then sync or queue replay if server is unavailable.\n */\n async upsertTask(\n db: ShadowClawDatabase,\n task: Task,\n options?: { reloadTasks?: boolean },\n ): Promise<void> {\n const shouldReload = options?.reloadTasks !== false;\n\n await saveTask(db, task);\n if (shouldReload) {\n await this.loadTasks(db);\n }\n\n const subscriberId = await this.getSubscriberId(db);\n const serverOk = await syncTaskToServer(\n task,\n this.getTaskServerBaseUrl(),\n subscriberId,\n this.orchestrator?.taskServerEnabled ?? false,\n );\n if (!serverOk) {\n console.warn(\"Failed to sync task to server — queued for replay.\");\n await this.queueTaskSyncOutboxOperation(db, {\n type: \"upsert\",\n id: task.id,\n task,\n queuedAt: Date.now(),\n });\n }\n }\n\n private compactTaskSyncOutbox(\n ops: TaskSyncOutboxOperation[],\n ): TaskSyncOutboxOperation[] {\n const lastIndexById = new Map<string, number>();\n ops.forEach((op, index) => {\n lastIndexById.set(op.id, index);\n });\n\n return ops.filter((op, index) => lastIndexById.get(op.id) === index);\n }\n\n private deriveGroupName(groupId: string): string {\n if (groupId.startsWith(\"tg:\")) {\n return `Telegram ${groupId.slice(3)}`;\n }\n\n if (groupId.startsWith(\"im:\")) {\n return `iMessage ${groupId.slice(3)}`;\n }\n\n if (groupId.startsWith(\"br:\")) {\n return groupId === DEFAULT_GROUP_ID ? \"Main\" : \"Browser Conversation\";\n }\n\n return \"Conversation\";\n }\n\n private getActivityLogSessionStartedAt(groupId: string): string {\n const existing = this._activityLogSessionStartedAtByGroup.get(groupId);\n if (existing) {\n return existing;\n }\n\n const startedAt = new Date().toISOString();\n this._activityLogSessionStartedAtByGroup.set(groupId, startedAt);\n\n return startedAt;\n }\n\n // --- Getters for reactive state ---\n\n private getTaskServerBaseUrl(): string {\n return this.orchestrator?.taskServerUrl ?? \"/schedule\";\n }\n\n private async getSubscriberId(db: ShadowClawDatabase): Promise<string> {\n if (this._subscriberId) {\n return this._subscriberId;\n }\n\n const subscriberId = await getOrCreateSubscriberId(db);\n this._subscriberId = subscriberId;\n\n return subscriberId;\n }\n\n private normalizePagePath(path: string): string {\n const normalized = path.trim().replace(/^\\/+/, \"\").replace(/\\/+/g, \"/\");\n\n // Migrate legacy default page paths into the current default page.\n if (normalized === \"main/memory.md\") {\n return OrchestratorStore.DEFAULT_PAGE_PATH;\n }\n\n return normalized;\n }\n\n private normalizeSidebarDefaultPage(\n value: unknown,\n ): \"pages\" | \"chat\" | \"tasks\" | \"files\" {\n if (\n value === \"pages\" ||\n value === \"chat\" ||\n value === \"tasks\" ||\n value === \"files\"\n ) {\n return value;\n }\n\n return \"chat\";\n }\n\n private parsePagesList(raw: string | null | undefined): SavedPageRef[] {\n if (!raw) {\n return [];\n }\n\n try {\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed)) {\n return [];\n }\n\n return parsed\n .map((entry) => {\n if (typeof entry === \"string\") {\n return {\n groupId: DEFAULT_GROUP_ID,\n path: this.normalizePagePath(entry),\n } satisfies SavedPageRef;\n }\n\n if (!entry || typeof entry !== \"object\") {\n return null;\n }\n\n const page = entry as Partial<SavedPageRef>;\n if (typeof page.path !== \"string\") {\n return null;\n }\n\n const normalizedGroupId =\n typeof page.groupId === \"string\" && page.groupId.trim().length > 0\n ? page.groupId\n : DEFAULT_GROUP_ID;\n\n const normalizedPath =\n normalizedGroupId === DEFAULT_GROUP_ID\n ? this.normalizePagePath(page.path)\n : page.path.trim();\n\n if (!normalizedPath) {\n return null;\n }\n\n return {\n groupId: normalizedGroupId,\n path: normalizedPath,\n } satisfies SavedPageRef;\n })\n .filter((entry): entry is SavedPageRef => !!entry)\n .filter((entry, index, arr) => {\n const key = `${entry.groupId}\\u0000${entry.path}`;\n\n return (\n index ===\n arr.findIndex((candidate) => {\n return `${candidate.groupId}\\u0000${candidate.path}` === key;\n })\n );\n });\n } catch {\n return [];\n }\n }\n\n private parseTaskSyncOutbox(raw: string | null | undefined) {\n if (!raw) {\n return [] as TaskSyncOutboxOperation[];\n }\n\n try {\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed)) {\n return [] as TaskSyncOutboxOperation[];\n }\n\n const normalized = parsed\n .filter((entry): entry is any => !!entry && typeof entry === \"object\")\n .filter((entry) => entry.type === \"upsert\" || entry.type === \"delete\")\n .filter((entry) => typeof entry.id === \"string\" && entry.id.length > 0)\n .map((entry) => ({\n ...entry,\n queuedAt:\n typeof entry.queuedAt === \"number\" ? entry.queuedAt : Date.now(),\n })) as TaskSyncOutboxOperation[];\n\n return this.compactTaskSyncOutbox(normalized);\n } catch {\n return [] as TaskSyncOutboxOperation[];\n }\n }\n\n private resolveSidebarDefaultPageForActivePage(\n page: string,\n ): \"pages\" | \"chat\" | \"tasks\" | \"files\" {\n if (\n page === \"pages\" ||\n page === \"chat\" ||\n page === \"tasks\" ||\n page === \"files\"\n ) {\n return page;\n }\n\n return this._sidebarDefaultPage.get();\n }\n\n private setPages(pages: SavedPageRef[]): void {\n const allowed = pages.filter((p) => this.isPageAllowed(p.path, p.groupId));\n const memoryPages = allowed.filter(\n (p) => p.path.toLowerCase() === \"memory.md\",\n );\n const otherPages = allowed.filter(\n (p) => p.path.toLowerCase() !== \"memory.md\",\n );\n this._pages.set([...otherPages, ...memoryPages]);\n }\n\n private async ensureDefaultPage(db: ShadowClawDatabase): Promise<void> {\n if (await isMainGroupMemorySuppressed(db)) {\n return;\n }\n\n const hasWorkspaceReadme = await ensureMainGroupMemory(\n db,\n DEFAULT_GROUP_ID,\n );\n\n await ensureMainGroupIndex(db, DEFAULT_GROUP_ID);\n\n if (!hasWorkspaceReadme || this._pages.get().length > 0) {\n return;\n }\n\n this.setPages([\n {\n groupId: DEFAULT_GROUP_ID,\n path: OrchestratorStore.DEFAULT_PAGE_PATH,\n },\n ]);\n await this.persistPages(db);\n }\n\n private async ensureGroupExists(\n db: ShadowClawDatabase,\n groupId: string,\n timestamp?: number,\n ): Promise<void> {\n const groups = this._groups.get();\n if (groups.some((g) => g.groupId === groupId)) {\n return;\n }\n\n const nextGroups = [\n ...groups,\n {\n groupId,\n name: this.deriveGroupName(groupId),\n createdAt: timestamp || Date.now(),\n },\n ];\n\n this._groups.set(nextGroups);\n\n try {\n await saveGroupMetadata(db, nextGroups);\n } catch (error) {\n console.error(\"Failed to persist new conversation metadata:\", error);\n }\n }\n\n private async forwardActivityLogEntryToServer(\n entry: ThinkingLogEntry,\n ): Promise<void> {\n if (!this._db) {\n return;\n }\n\n const enabled = isConfigEnabled(\n await getConfig(this._db, CONFIG_KEYS.ACTIVITY_LOG_DISK_LOGGING_ENABLED),\n );\n\n if (!enabled) {\n return;\n }\n\n const groupId =\n typeof entry.groupId === \"string\" && entry.groupId\n ? entry.groupId\n : this._activeGroupId.get();\n\n if (!groupId) {\n return;\n }\n\n const message =\n typeof entry.message === \"string\" ? entry.message.trim() : \"\";\n if (!message) {\n return;\n }\n\n if (entry.level === \"info\" && entry.label === \"Starting\") {\n this._activityLogSessionStartedAtByGroup.set(\n groupId,\n new Date().toISOString(),\n );\n }\n\n const sessionStartedAt = this.getActivityLogSessionStartedAt(groupId);\n\n try {\n await fetch(\"/activity-log\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n groupId,\n level: entry.level,\n label: entry.label,\n message,\n timestamp: new Date().toISOString(),\n sessionStartedAt,\n }),\n });\n } catch (error) {\n console.warn(\"Failed to persist activity log entry to server:\", error);\n }\n }\n\n scheduleBackgroundStaticMainSiteSeeding(db: ShadowClawDatabase): void {\n if (typeof window === \"undefined\") {\n return;\n }\n\n const runBackgroundSeed = async () => {\n try {\n const isSeeded = await isStaticMainSiteSeeded(db, DEFAULT_GROUP_ID);\n if (isSeeded) {\n return;\n }\n\n const rawPagesList = await getConfig(db, CONFIG_KEYS.PAGES_LIST);\n const existingPages =\n rawPagesList !== null && rawPagesList !== undefined\n ? this.parsePagesList(rawPagesList)\n : [];\n\n const updated = await seedStaticMainSite(\n db,\n DEFAULT_GROUP_ID,\n existingPages,\n { preferEmbedded: false },\n );\n\n if (updated && updated.length > 0) {\n this.setPages(updated);\n await this.persistPages(db);\n }\n } catch (err) {\n console.warn(\"Background static main site seeding failed:\", err);\n }\n };\n\n if (typeof (window as any).requestIdleCallback === \"function\") {\n (window as any).requestIdleCallback(() => void runBackgroundSeed(), {\n timeout: 3000,\n });\n } else {\n setTimeout(() => void runBackgroundSeed(), 100);\n }\n }\n\n private async persistPages(db: ShadowClawDatabase): Promise<void> {\n await setConfig(\n db,\n CONFIG_KEYS.PAGES_LIST,\n JSON.stringify(this._pages.get()),\n );\n }\n\n private async persistTaskSyncOutbox(db: ShadowClawDatabase): Promise<void> {\n await setConfig(\n db,\n CONFIG_KEYS.TASK_SYNC_OUTBOX,\n JSON.stringify(this._taskSyncOutbox),\n );\n }\n\n private async queueTaskSyncOutboxOperation(\n db: ShadowClawDatabase,\n op: TaskSyncOutboxOperation,\n ): Promise<void> {\n this._taskSyncOutbox = this.compactTaskSyncOutbox([\n ...this._taskSyncOutbox,\n op,\n ]);\n\n await this.persistTaskSyncOutbox(db);\n }\n\n private async applySiteConfigDefaults(db: ShadowClawDatabase): Promise<void> {\n if (typeof document === \"undefined\") {\n return;\n }\n\n try {\n const config = getSiteConfig();\n if (!config || typeof config !== \"object\") {\n return;\n }\n\n configureCustomElementSecurity(config);\n installCustomElementsRegistryGuard();\n installCustomElementDomGuard();\n\n const customElConfig = config.customElements;\n\n // Clear any erroneous group-level toolTags override on DEFAULT_GROUP_ID\n const groups = await listGroups(db);\n const defaultGroup = groups.find((g) => g.groupId === DEFAULT_GROUP_ID);\n if (defaultGroup?.toolTags) {\n await updateGroupToolTags(db, DEFAULT_GROUP_ID, undefined);\n }\n\n // If site configuration declares internet access, ensure it is honored\n const declaredInternetAccess =\n config.settings?.internetAccess ??\n config.settings?.vm_bash_full_internet_access ??\n config.settings?.fullInternetAccess ??\n config.internetAccess;\n if (declaredInternetAccess === true) {\n const currentInternet = await getConfig(\n db,\n CONFIG_KEYS.VM_BASH_FULL_INTERNET_ACCESS,\n );\n if (currentInternet !== \"true\") {\n await setConfig(db, CONFIG_KEYS.VM_BASH_FULL_INTERNET_ACCESS, \"true\");\n if (this.orchestrator) {\n this.orchestrator.vmBashFullInternetAccess = true;\n }\n this._vmBashFullInternetAccess.set(true);\n }\n }\n\n // If site configuration declares default pinned page, ensure it is honored\n if (config.pages && typeof config.pages === \"object\") {\n const { defaultPinnedPage } = config.pages;\n if (defaultPinnedPage && typeof defaultPinnedPage === \"string\") {\n const resolved = resolveDefaultPinnedPageRef(defaultPinnedPage);\n if (resolved && this.isPageAllowed(resolved.path, resolved.groupId)) {\n this._defaultPinnedPage.set(resolved);\n await setConfig(\n db,\n CONFIG_KEYS.DEFAULT_PINNED_PAGE,\n JSON.stringify(resolved),\n );\n }\n }\n }\n\n const allowedElements =\n config.allowedCustomElements ||\n (typeof customElConfig === \"object\" && !Array.isArray(customElConfig)\n ? customElConfig.allowedElements\n : undefined);\n if (allowedElements !== undefined) {\n const curElements = await getConfig(\n db,\n CONFIG_KEYS.ALLOWED_CUSTOM_ELEMENTS,\n );\n if (curElements === undefined || curElements === null) {\n await setConfig(\n db,\n CONFIG_KEYS.ALLOWED_CUSTOM_ELEMENTS,\n JSON.stringify(allowedElements),\n );\n }\n }\n\n const allowedDomains =\n config.allowedCustomElementDomains ||\n (typeof customElConfig === \"object\" && !Array.isArray(customElConfig)\n ? customElConfig.allowedDomains\n : undefined);\n if (allowedDomains !== undefined) {\n const curDomains = await getConfig(\n db,\n CONFIG_KEYS.ALLOWED_CUSTOM_ELEMENT_HOST_PATTERNS,\n );\n if (curDomains === undefined || curDomains === null) {\n await setConfig(\n db,\n CONFIG_KEYS.ALLOWED_CUSTOM_ELEMENT_HOST_PATTERNS,\n JSON.stringify(allowedDomains),\n );\n }\n }\n\n if (config.sidebar && typeof config.sidebar === \"object\") {\n const {\n pagesHidden,\n chatHidden,\n tasksHidden,\n filesHidden,\n defaultPage,\n } = config.sidebar;\n if (pagesHidden !== undefined) {\n const cur = await getConfig(db, CONFIG_KEYS.SIDEBAR_PAGES_HIDDEN);\n if (cur === undefined || cur === null) {\n await setConfig(\n db,\n CONFIG_KEYS.SIDEBAR_PAGES_HIDDEN,\n String(Boolean(pagesHidden)),\n );\n }\n }\n if (chatHidden !== undefined) {\n const cur = await getConfig(db, CONFIG_KEYS.SIDEBAR_CHAT_HIDDEN);\n if (cur === undefined || cur === null) {\n await setConfig(\n db,\n CONFIG_KEYS.SIDEBAR_CHAT_HIDDEN,\n String(Boolean(chatHidden)),\n );\n }\n }\n if (tasksHidden !== undefined) {\n const cur = await getConfig(db, CONFIG_KEYS.SIDEBAR_TASKS_HIDDEN);\n if (cur === undefined || cur === null) {\n await setConfig(\n db,\n CONFIG_KEYS.SIDEBAR_TASKS_HIDDEN,\n String(Boolean(tasksHidden)),\n );\n }\n }\n if (filesHidden !== undefined) {\n const cur = await getConfig(db, CONFIG_KEYS.SIDEBAR_FILES_HIDDEN);\n if (cur === undefined || cur === null) {\n await setConfig(\n db,\n CONFIG_KEYS.SIDEBAR_FILES_HIDDEN,\n String(Boolean(filesHidden)),\n );\n }\n }\n if (defaultPage && typeof defaultPage === \"string\") {\n const normalized = this.normalizeSidebarDefaultPage(defaultPage);\n this._sidebarDefaultPage.set(normalized);\n const cur = await getConfig(db, CONFIG_KEYS.SIDEBAR_DEFAULT_PAGE);\n if (!cur) {\n await setConfig(db, CONFIG_KEYS.SIDEBAR_DEFAULT_PAGE, defaultPage);\n }\n }\n }\n\n if (config.settings && typeof config.settings === \"object\") {\n const {\n assistantName,\n defaultProvider,\n provider,\n defaultModel,\n model,\n } = config.settings;\n if (assistantName && typeof assistantName === \"string\") {\n const cur = await getConfig(db, CONFIG_KEYS.ASSISTANT_NAME);\n if (!cur) {\n await setConfig(db, CONFIG_KEYS.ASSISTANT_NAME, assistantName);\n }\n }\n\n const configuredProvider = defaultProvider ?? provider;\n if (\n typeof configuredProvider === \"string\" &&\n configuredProvider.trim().length > 0\n ) {\n const currentProvider = await getConfig(db, CONFIG_KEYS.PROVIDER);\n if (!currentProvider) {\n const providerVal = configuredProvider.trim();\n await setConfig(db, CONFIG_KEYS.PROVIDER, providerVal);\n if (this.orchestrator) {\n this.orchestrator.provider = providerVal;\n }\n }\n }\n\n const configuredModel = defaultModel ?? model;\n if (\n typeof configuredModel === \"string\" &&\n configuredModel.trim().length > 0\n ) {\n const currentModel = await getConfig(db, CONFIG_KEYS.MODEL);\n if (!currentModel) {\n const modelVal = configuredModel.trim();\n await setConfig(db, CONFIG_KEYS.MODEL, modelVal);\n if (this.orchestrator) {\n this.orchestrator.model = modelVal;\n }\n }\n }\n const allowInternet =\n config.settings.internetAccess ??\n config.settings.vm_bash_full_internet_access ??\n config.settings.fullInternetAccess ??\n config.internetAccess;\n if (typeof allowInternet === \"boolean\") {\n const cur = await getConfig(\n db,\n CONFIG_KEYS.VM_BASH_FULL_INTERNET_ACCESS,\n );\n if (cur === undefined || cur === null) {\n await setConfig(\n db,\n CONFIG_KEYS.VM_BASH_FULL_INTERNET_ACCESS,\n String(allowInternet),\n );\n if (this.orchestrator) {\n this.orchestrator.vmBashFullInternetAccess = allowInternet;\n }\n this._vmBashFullInternetAccess.set(allowInternet);\n }\n }\n }\n\n const defaultToolsProfile =\n (config.settings && typeof config.settings === \"object\"\n ? config.settings.defaultToolsProfile\n : undefined) ?? config.defaultToolsProfile;\n if (\n typeof defaultToolsProfile === \"string\" &&\n defaultToolsProfile.trim().length > 0\n ) {\n const curProfile = await getConfig(db, CONFIG_KEYS.ACTIVE_TOOL_PROFILE);\n if (!curProfile) {\n const profileValue = defaultToolsProfile.trim();\n if (profileValue.toLowerCase() === \"none\") {\n await toolsStore.deactivateProfile(db);\n } else {\n const matchedProfile = toolsStore.profiles.find(\n (p) =>\n p.id.toLowerCase() === profileValue.toLowerCase() ||\n p.name.toLowerCase() === profileValue.toLowerCase(),\n );\n if (matchedProfile) {\n await toolsStore.activateProfile(db, matchedProfile.id);\n } else {\n console.warn(\n `Default tools profile \"${profileValue}\" specified in site-config was not found.`,\n );\n }\n }\n }\n }\n\n if (config.pages && typeof config.pages === \"object\") {\n const { defaultPinnedPage } = config.pages;\n if (defaultPinnedPage && typeof defaultPinnedPage === \"string\") {\n const curPinned = await getConfig(\n db,\n CONFIG_KEYS.DEFAULT_PINNED_PAGE,\n );\n if (!curPinned) {\n await setConfig(\n db,\n CONFIG_KEYS.DEFAULT_PINNED_PAGE,\n defaultPinnedPage,\n );\n }\n }\n }\n\n const rawAllowList =\n config.pages?.allowList ??\n config.pages?.allowlist ??\n config.allowList ??\n config.allowlist;\n const rawDenyList =\n config.pages?.denyList ??\n config.pages?.denylist ??\n config.denyList ??\n config.denylist;\n if (Array.isArray(rawAllowList)) {\n const curAllow = await getConfig(db, CONFIG_KEYS.PAGES_ALLOW_LIST);\n if (curAllow === undefined || curAllow === null) {\n const allowList = normalizeStringList(rawAllowList.map(String));\n this._pagesAllowList.set(allowList);\n await setConfig(\n db,\n CONFIG_KEYS.PAGES_ALLOW_LIST,\n JSON.stringify(allowList),\n );\n }\n }\n if (Array.isArray(rawDenyList)) {\n const curDeny = await getConfig(db, CONFIG_KEYS.PAGES_DENY_LIST);\n if (curDeny === undefined || curDeny === null) {\n const denyList = normalizeStringList(rawDenyList.map(String));\n this._pagesDenyList.set(denyList);\n await setConfig(\n db,\n CONFIG_KEYS.PAGES_DENY_LIST,\n JSON.stringify(denyList),\n );\n }\n }\n\n await setConfig(db, CONFIG_KEYS.SITE_CONFIG_SEEDED, \"true\");\n\n // Filter existing pages if any denied pages were previously saved\n const currentPages = this._pages.get();\n const filtered = currentPages.filter((p) =>\n this.isPageAllowed(p.path, p.groupId),\n );\n if (filtered.length !== currentPages.length) {\n this.setPages(filtered);\n await this.persistPages(db);\n }\n const activePinned = this._activePinnedPage.get();\n if (\n activePinned &&\n !this.isPageAllowed(activePinned.path, activePinned.groupId)\n ) {\n await this.setActivePinnedPage(db, this.effectiveDefaultPage);\n }\n const defPinned = this._defaultPinnedPage.get();\n if (defPinned && !this.isPageAllowed(defPinned.path, defPinned.groupId)) {\n await this.setDefaultPinnedPage(db, null);\n }\n\n if (Array.isArray(config.enabledTools)) {\n const enabledTools = config.enabledTools.filter(\n (name: unknown): name is string =>\n typeof name === \"string\" && name.trim().length > 0,\n );\n await toolsStore.setAllEnabled(db, enabledTools);\n await toolsStore.setAllDeclarativeEnabled(db, enabledTools);\n }\n\n await setConfig(db, CONFIG_KEYS.SITE_CONFIG_SEEDED, \"true\");\n } catch (err) {\n console.warn(\"Failed to apply site-config defaults:\", err);\n }\n }\n}\n\nexport const orchestratorStore = new OrchestratorStore();\n"],"mappings":"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"}
|