shadow-claw 1.27.0 → 1.28.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/ai-catalog.json +11 -0
- package/.well-known/mcp/index.html +19 -0
- package/.well-known/mcp/server-card.json +52 -0
- package/.well-known/mcp/servers.json +15 -0
- package/.well-known/mcp.json +52 -0
- package/.well-known/oauth-protected-resource +10 -0
- package/.well-known/oauth-protected-resource.json +10 -0
- package/bin/assert-version-bump.mjs +61 -3
- package/bin/assert-version-bump.test.mjs +77 -1
- package/bin/build/build.mjs +116 -49
- package/bin/build/build.test.mjs +103 -0
- package/bin/cli.mjs +299 -237
- package/bin/cli.test.mjs +27 -0
- package/bin/commands/mcp.mjs +132 -2
- package/bin/commands/mcp.test.mjs +166 -0
- package/bin/commands/skills-index.mjs +139 -20
- package/bin/commands/skills-index.test.mjs +82 -0
- package/bin/utils/control-client.mjs +17 -0
- package/bin/utils/control-client.test.mjs +46 -0
- package/bin/version.mjs +208 -0
- package/bin/version.test.mjs +138 -0
- package/dist/electron/main.cjs +195 -185
- package/dist/lib/components/index.js +21 -21
- 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-llm.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/shadow-claw.d.ts +1 -0
- package/dist/lib/components/shadow-claw/utils/setupAppLifecycle.d.ts +23 -0
- 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-llm.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-pages.js +1 -1
- package/dist/lib/components/shadow-claw-peerjs.js +1 -1
- package/dist/lib/components/shadow-claw-settings.js +1 -1
- package/dist/lib/components/shadow-claw-storage.js +1 -1
- package/dist/lib/components/shadow-claw-task-server.js +1 -1
- package/dist/lib/components/shadow-claw-tasks.js +1 -1
- package/dist/lib/components/shadow-claw-terminal.js +1 -1
- package/dist/lib/components/shadow-claw-tools.js +1 -1
- package/dist/lib/components/shadow-claw-webvm.js +1 -1
- package/dist/lib/components/shadow-claw.js +1 -1
- package/dist/lib/{configurePeerJs-oODzltaC.js → configurePeerJs-D8Ph0-A9.js} +2 -2
- package/dist/lib/{configurePeerJs-oODzltaC.js.map → configurePeerJs-D8Ph0-A9.js.map} +1 -1
- package/dist/lib/core/control-plane-client.d.ts +2 -0
- package/dist/lib/core/orchestrator/orchestrator.d.ts +10 -0
- package/dist/lib/core/orchestrator/utils/operations/channel.d.ts +2 -2
- package/dist/lib/core/utils/initControlPlane.d.ts +6 -0
- package/dist/lib/index.js +21 -21
- package/dist/lib/{initControlPlane-C2zURVIS.js → initControlPlane-BIrWmpzc.js} +76 -9
- package/dist/lib/initControlPlane-BIrWmpzc.js.map +1 -0
- package/dist/lib/{markdown-C6EHl9zs.js → markdown-DEUoM1c6.js} +2 -2
- package/dist/lib/{markdown-C6EHl9zs.js.map → markdown-DEUoM1c6.js.map} +1 -1
- package/dist/lib/{orchestrator-KRjx0eba.js → orchestrator-BtVj9bBB.js} +11 -10
- package/dist/lib/{orchestrator-KRjx0eba.js.map → orchestrator-BtVj9bBB.js.map} +1 -1
- package/dist/lib/{orchestrator-CACLa_Ro.js → orchestrator-CFCW-l1O.js} +52 -4
- package/dist/lib/orchestrator-CFCW-l1O.js.map +1 -0
- package/dist/lib/{peerjs-DFWOBcXf.js → peerjs-BoBkx9DJ.js} +23 -3
- package/dist/lib/peerjs-BoBkx9DJ.js.map +1 -0
- package/dist/lib/{push-client-_tiWQsCT.js → push-client-D6hbzDNV.js} +10 -4
- package/dist/lib/push-client-D6hbzDNV.js.map +1 -0
- package/dist/lib/{shadow-claw-6UHdiy4a.js → shadow-claw-Cuf2O5bZ.js} +71 -4
- package/dist/lib/shadow-claw-Cuf2O5bZ.js.map +1 -0
- package/dist/lib/{shadow-claw-channel-config-DmfwJc6G.js → shadow-claw-channel-config-BDPKt6Bd.js} +3 -3
- package/dist/lib/{shadow-claw-channel-config-DmfwJc6G.js.map → shadow-claw-channel-config-BDPKt6Bd.js.map} +1 -1
- package/dist/lib/{shadow-claw-channels-1N6Jl-By.js → shadow-claw-channels-BsP5JABM.js} +2 -2
- package/dist/lib/{shadow-claw-channels-1N6Jl-By.js.map → shadow-claw-channels-BsP5JABM.js.map} +1 -1
- package/dist/lib/{shadow-claw-chat-BMoqQJRK.js → shadow-claw-chat-Cam2lX4k.js} +4 -4
- package/dist/lib/{shadow-claw-chat-BMoqQJRK.js.map → shadow-claw-chat-Cam2lX4k.js.map} +1 -1
- package/dist/lib/{shadow-claw-control-plane-UG0o7pCz.js → shadow-claw-control-plane-DB2qcCFs.js} +20 -10
- package/dist/lib/shadow-claw-control-plane-DB2qcCFs.js.map +1 -0
- package/dist/lib/{shadow-claw-conversations-BwXep3iu.js → shadow-claw-conversations-C9Vf4XGx.js} +2 -2
- package/dist/lib/{shadow-claw-conversations-BwXep3iu.js.map → shadow-claw-conversations-C9Vf4XGx.js.map} +1 -1
- package/dist/lib/{shadow-claw-file-viewer-DUxzVxDT.js → shadow-claw-file-viewer-B4HYiI0v.js} +3 -3
- package/dist/lib/{shadow-claw-file-viewer-DUxzVxDT.js.map → shadow-claw-file-viewer-B4HYiI0v.js.map} +1 -1
- package/dist/lib/{shadow-claw-files-DIREEnT2.js → shadow-claw-files-DVROUESO.js} +2 -2
- package/dist/lib/{shadow-claw-files-DIREEnT2.js.map → shadow-claw-files-DVROUESO.js.map} +1 -1
- package/dist/lib/{shadow-claw-git-Bg1SWgsF.js → shadow-claw-git-BqrO7cHJ.js} +3 -3
- package/dist/lib/{shadow-claw-git-Bg1SWgsF.js.map → shadow-claw-git-BqrO7cHJ.js.map} +1 -1
- package/dist/lib/{shadow-claw-llm-CazBrVpM.js → shadow-claw-llm-BexUQdYo.js} +2 -2
- package/dist/lib/{shadow-claw-llm-CazBrVpM.js.map → shadow-claw-llm-BexUQdYo.js.map} +1 -1
- package/dist/lib/{shadow-claw-networking-Df85tCbO.js → shadow-claw-networking-CfXRGpUD.js} +2 -2
- package/dist/lib/{shadow-claw-networking-Df85tCbO.js.map → shadow-claw-networking-CfXRGpUD.js.map} +1 -1
- package/dist/lib/{shadow-claw-notifications-v62FryTc.js → shadow-claw-notifications-C9KPMgx_.js} +2 -2
- package/dist/lib/{shadow-claw-notifications-v62FryTc.js.map → shadow-claw-notifications-C9KPMgx_.js.map} +1 -1
- package/dist/lib/{shadow-claw-pages-BgPyIEZO.js → shadow-claw-pages-CGzGXmrI.js} +3 -3
- package/dist/lib/{shadow-claw-pages-BgPyIEZO.js.map → shadow-claw-pages-CGzGXmrI.js.map} +1 -1
- package/dist/lib/{shadow-claw-peerjs-xkBXILed.js → shadow-claw-peerjs-B0ZB7yhB.js} +3 -3
- package/dist/lib/{shadow-claw-peerjs-xkBXILed.js.map → shadow-claw-peerjs-B0ZB7yhB.js.map} +1 -1
- package/dist/lib/{shadow-claw-settings-CN89xRVU.js → shadow-claw-settings-DBfMZdDS.js} +2 -2
- package/dist/lib/{shadow-claw-settings-CN89xRVU.js.map → shadow-claw-settings-DBfMZdDS.js.map} +1 -1
- package/dist/lib/{shadow-claw-storage-VnhcObCe.js → shadow-claw-storage-CM-w6mgG.js} +2 -2
- package/dist/lib/{shadow-claw-storage-VnhcObCe.js.map → shadow-claw-storage-CM-w6mgG.js.map} +1 -1
- package/dist/lib/{shadow-claw-task-server-jgEC2hHB.js → shadow-claw-task-server-DV4b1g2-.js} +4 -2
- package/dist/lib/{shadow-claw-task-server-jgEC2hHB.js.map → shadow-claw-task-server-DV4b1g2-.js.map} +1 -1
- package/dist/lib/{shadow-claw-tasks-i_evIufy.js → shadow-claw-tasks-K-foOHSE.js} +3 -3
- package/dist/lib/{shadow-claw-tasks-i_evIufy.js.map → shadow-claw-tasks-K-foOHSE.js.map} +1 -1
- package/dist/lib/{shadow-claw-terminal-CwScROlu.js → shadow-claw-terminal-CpAknKyA.js} +2 -2
- package/dist/lib/{shadow-claw-terminal-CwScROlu.js.map → shadow-claw-terminal-CpAknKyA.js.map} +1 -1
- package/dist/lib/{shadow-claw-tools-DD3fyXP4.js → shadow-claw-tools-D98XZ0Ep.js} +3 -3
- package/dist/lib/{shadow-claw-tools-DD3fyXP4.js.map → shadow-claw-tools-D98XZ0Ep.js.map} +1 -1
- package/dist/lib/{shadow-claw-webvm-DbJq4I3-.js → shadow-claw-webvm-DLOb8dMI.js} +2 -2
- package/dist/lib/{shadow-claw-webvm-DbJq4I3-.js.map → shadow-claw-webvm-DLOb8dMI.js.map} +1 -1
- package/dist/lib/subsystems/channels/imessage.d.ts +1 -0
- package/dist/lib/subsystems/channels/peerjs.d.ts +1 -0
- package/dist/lib/subsystems/channels/telegram.d.ts +1 -0
- package/dist/lib/subsystems/channels/types.d.ts +2 -0
- package/dist/lib/subsystems/notifications/push-client.d.ts +1 -1
- package/dist/lib/{syncWebMcpRegistration-DNLnQ-jz.js → syncWebMcpRegistration-NspKefOI.js} +2 -2
- package/dist/lib/{syncWebMcpRegistration-DNLnQ-jz.js.map → syncWebMcpRegistration-NspKefOI.js.map} +1 -1
- package/dist/public/.well-known/ai-catalog.json +11 -0
- package/dist/public/.well-known/mcp/index.html +19 -0
- package/dist/public/.well-known/mcp/server-card.json +52 -0
- package/dist/public/.well-known/mcp/servers.json +15 -0
- package/dist/public/.well-known/mcp.json +52 -0
- package/dist/public/.well-known/oauth-protected-resource +10 -0
- package/dist/public/.well-known/oauth-protected-resource.json +10 -0
- package/dist/public/404.html +28 -1
- package/dist/public/AGENTS.md +1 -1
- package/dist/public/agent.worker.js +1 -1
- package/dist/public/{configurePeerJs-BqgeBjP7.js → configurePeerJs-BhBokQlC.js} +1 -1
- package/dist/public/docs/example/article/index.html +3 -3
- package/dist/public/docs/publishing/index.html +3 -3
- package/dist/public/docs/skill-creator/index.html +3 -3
- package/dist/public/docs/subsystems/cli.md +11 -8
- package/dist/public/docs/subsystems/mcp-server.md +1 -0
- package/dist/public/docs/subsystems/notifications.md +10 -0
- package/dist/public/{e2e-bridge-Ceqr5kGc.js → e2e-bridge-DcBoeFvd.js} +1 -1
- package/dist/public/{file-viewer-C-6Jc_tb.js → file-viewer-CKtVC9Ix.js} +1 -1
- package/dist/public/index.css +1 -1
- package/dist/public/index.html +3 -3
- package/dist/public/index.js +1 -1
- package/dist/public/initControlPlane-Bi8ouFEb.js +1 -0
- package/dist/public/llms.txt +36 -1
- package/dist/public/main/index.html +3 -3
- package/dist/public/main/memory/index.html +3 -3
- package/dist/public/{markdown-C3M4OW_A.js → markdown-C-hCVJtc.js} +1 -1
- package/dist/public/orchestrator-8qNGfw8r.js +15 -0
- package/dist/public/{orchestrator-DHjdLtqa.js → orchestrator-BT3Ks5ip.js} +2 -2
- package/dist/public/peerjs-DfhwEiiq.js +1 -0
- package/dist/public/push-client-BVLrE9pK.js +1 -0
- package/dist/public/service-worker/fetch-proxy.js +1 -1
- package/dist/public/service-worker.js +1 -1
- package/dist/public/{shadow-claw-EAt2ml5Y.js → shadow-claw-DCjxNDCX.js} +3 -3
- package/dist/public/{shadow-claw-channels-XsfuWFF8.js → shadow-claw-channels-CITDrqMl.js} +1 -1
- package/dist/public/{shadow-claw-chat-CbSaOZ4q.js → shadow-claw-chat-BQrSgSKF.js} +1 -1
- package/dist/public/{shadow-claw-control-plane-DHvN3Ukg.js → shadow-claw-control-plane-Cp001OY0.js} +2 -2
- package/dist/public/{shadow-claw-conversations-BWs5VVfs.js → shadow-claw-conversations-EhX4RvIj.js} +1 -1
- package/dist/public/{shadow-claw-file-viewer-BWsoW5QS.js → shadow-claw-file-viewer-DiQXIjZD.js} +1 -1
- package/dist/public/{shadow-claw-files-CG7MqWiV.js → shadow-claw-files-lkTnSJsn.js} +1 -1
- package/dist/public/{shadow-claw-git-DBRPZNav.js → shadow-claw-git-BlcA_z8x.js} +2 -2
- package/dist/public/{shadow-claw-llm-DMvLgKXo.js → shadow-claw-llm-CW16X9Rg.js} +1 -1
- package/dist/public/{shadow-claw-networking-Dd8Rw31D.js → shadow-claw-networking-ySsMBY_i.js} +1 -1
- package/dist/public/{shadow-claw-notifications-Dbevj-lq.js → shadow-claw-notifications-CyV2zCQ8.js} +1 -1
- package/dist/public/{shadow-claw-pages-3_lQAv0t.js → shadow-claw-pages-Cx7cF9ah.js} +1 -1
- package/dist/public/{shadow-claw-settings-t8TIlgrM.js → shadow-claw-settings-zm4PHHGi.js} +2 -2
- package/dist/public/{shadow-claw-storage-CfEXoSIE.js → shadow-claw-storage-dy9JAEGd.js} +1 -1
- package/dist/public/{shadow-claw-task-server-DxQSsgRZ.js → shadow-claw-task-server-Bleww48s.js} +2 -2
- package/dist/public/{shadow-claw-tasks-DNpicQwz.js → shadow-claw-tasks-CTI5oaLN.js} +1 -1
- package/dist/public/{shadow-claw-terminal-DpY6zU_r.js → shadow-claw-terminal-mZ3i4HaQ.js} +1 -1
- package/dist/public/{shadow-claw-tools-WSwWohnk.js → shadow-claw-tools-B_nuk8Zl.js} +1 -1
- package/dist/public/{shadow-claw-webvm-CP6oFjg5.js → shadow-claw-webvm-Vl_jH5YL.js} +1 -1
- package/dist/public/{syncWebMcpRegistration-DOn9gLnD.js → syncWebMcpRegistration-n2vAMJ4w.js} +1 -1
- package/dist/server.js +197 -187
- package/package.json +2 -1
- package/src/components/settings/shadow-claw-control-plane/shadow-claw-control-plane.test.ts +6 -0
- package/src/components/settings/shadow-claw-control-plane/shadow-claw-control-plane.ts +19 -9
- package/src/components/settings/shadow-claw-task-server/shadow-claw-task-server.test.ts +14 -0
- package/src/components/settings/shadow-claw-task-server/shadow-claw-task-server.ts +12 -0
- package/src/components/shadow-claw/shadow-claw.ts +6 -0
- package/src/components/shadow-claw/utils/bindEventListeners.test.ts +57 -0
- package/src/components/shadow-claw/utils/bindEventListeners.ts +14 -0
- package/src/components/shadow-claw/utils/setupAppLifecycle.test.ts +201 -0
- package/src/components/shadow-claw/utils/setupAppLifecycle.ts +101 -0
- package/src/core/control-plane-client.test.ts +82 -1
- package/src/core/control-plane-client.ts +35 -1
- package/src/core/orchestrator/orchestrator.test.ts +49 -0
- package/src/core/orchestrator/orchestrator.ts +43 -0
- package/src/core/orchestrator/utils/operations/channel.test.ts +17 -0
- package/src/core/orchestrator/utils/operations/channel.ts +11 -5
- package/src/core/orchestrator/utils/operations/task.test.ts +26 -0
- package/src/core/orchestrator/utils/operations/task.ts +8 -1
- package/src/core/utils/initControlPlane.test.ts +138 -0
- package/src/core/utils/initControlPlane.ts +82 -0
- package/src/core/utils/initializeApp.test.ts +27 -1
- package/src/core/utils/initializeApp.ts +6 -13
- package/src/server/mcp/mcp-server.test.ts +6 -0
- package/src/server/mcp/mcp-server.ts +2 -1
- package/src/server/mcp/tools/built-in-tools.ts +88 -1
- package/src/server/mcp/tools/client-tool-relay.ts +6 -0
- package/src/server/mcp/tools/mcp-tools.test.ts +128 -0
- package/src/server/openapi/openapi-coverage.test.ts +2 -1
- package/src/server/openapi/openapi-spec.ts +2 -1
- package/src/server/openapi/paths/mcp.ts +104 -0
- package/src/server/openapi/paths/push.ts +3 -0
- package/src/server/routes/mcp.test.ts +92 -0
- package/src/server/routes/mcp.ts +138 -2
- package/src/server/utils/packageVersion.test.ts +10 -0
- package/src/server/utils/packageVersion.ts +32 -0
- package/src/service-worker/fetch-proxy-rules.test.ts +73 -0
- package/src/service-worker/fetch-proxy-rules.ts +44 -0
- package/src/service-worker/fetch-proxy.ts +1 -1
- package/src/subsystems/channels/imessage.test.ts +36 -0
- package/src/subsystems/channels/imessage.ts +11 -0
- package/src/subsystems/channels/peerjs.test.ts +56 -0
- package/src/subsystems/channels/peerjs.ts +29 -0
- package/src/subsystems/channels/telegram.test.ts +38 -0
- package/src/subsystems/channels/telegram.ts +13 -0
- package/src/subsystems/channels/types.ts +2 -0
- package/src/subsystems/notifications/push-client.test.ts +70 -0
- package/src/subsystems/notifications/push-client.ts +28 -3
- package/src/subsystems/notifications/push-routes.test.ts +82 -0
- package/src/subsystems/notifications/push-routes.ts +70 -16
- package/src/subsystems/notifications/push-store.test.ts +59 -0
- package/src/subsystems/notifications/push-store.ts +113 -19
- package/src/testing/jest-setup.ts +15 -0
- package/dist/lib/initControlPlane-C2zURVIS.js.map +0 -1
- package/dist/lib/orchestrator-CACLa_Ro.js.map +0 -1
- package/dist/lib/peerjs-DFWOBcXf.js.map +0 -1
- package/dist/lib/push-client-_tiWQsCT.js.map +0 -1
- package/dist/lib/shadow-claw-6UHdiy4a.js.map +0 -1
- package/dist/lib/shadow-claw-control-plane-UG0o7pCz.js.map +0 -1
- package/dist/public/initControlPlane-BN9cWyO0.js +0 -1
- package/dist/public/orchestrator-CMbCTjBf.js +0 -15
- package/dist/public/peerjs-DUCKH-m9.js +0 -1
- package/dist/public/push-client-D0lkwrK0.js +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"shadow-claw-6UHdiy4a.js","names":["customEvent","shadowClawStyles","shadowClawTemplate"],"sources":["../../src/stores/theme.ts","../../src/components/shadow-claw/utils/applyAnchorWithRetry.ts","../../src/components/shadow-claw/utils/getDefaultSidebarPage.ts","../../src/components/shadow-claw/utils/resolvePageForVisibility.ts","../../src/components/shadow-claw/utils/getTerminalSlotForPage.ts","../../src/components/shadow-claw/utils/syncTerminalPlacement.ts","../../src/components/shadow-claw/utils/loadComponent.ts","../../src/components/shadow-claw/utils/scheduleTerminalPlacement.ts","../../src/components/shadow-claw/utils/getPageHeaderElements.ts","../../src/components/shadow-claw/utils/syncPageHeaderMainVisibilityOverride.ts","../../src/components/shadow-claw/utils/updateActivityLogToggleVisibility.ts","../../src/components/shadow-claw/utils/getActivePageHeaderElement.ts","../../src/components/shadow-claw/utils/updateHeaderMainToggle.ts","../../src/components/shadow-claw/utils/updateTerminalToggle.ts","../../src/components/shadow-claw/utils/showPage.ts","../../src/components/shadow-claw/utils/applyRoute.ts","../../src/components/shadow-claw/utils/applyRouteFromCurrentLocation.ts","../../src/components/shadow-claw/utils/clampSidebarWidth.ts","../../src/components/shadow-claw/utils/persistSidebarWidth.ts","../../src/components/shadow-claw/utils/setSidebarWidth.ts","../../src/components/shadow-claw/utils/initSidebarResize.ts","../../src/components/shadow-claw/utils/requestDialog.ts","../../src/components/shadow-claw/utils/sidebarVisibility.ts","../../src/components/shadow-claw/utils/setPagesSidebarHidden.ts","../../src/components/shadow-claw/utils/supportsNavigationApi.ts","../../src/components/shadow-claw/utils/syncActivityLogVisibilityOverride.ts","../../src/components/shadow-claw/utils/updateActivityLogToggle.ts","../../src/components/shadow-claw/utils/toggleActivityLogVisibility.ts","../../src/components/shadow-claw/utils/togglePageHeaderMainVisibility.ts","../../src/components/shadow-claw/utils/toggleTerminalVisibility.ts","../../src/components/shadow-claw/utils/updateHostTheme.ts","../../src/components/shadow-claw/utils/updateThemeIcons.ts","../../src/components/shadow-claw/utils/bindEventListeners.ts","../../src/core/constants.ts","../../src/core/utils/clearBootPendingClass.ts","../../src/components/shadow-claw/utils/getRoute.ts","../../src/components/shadow-claw/utils/getTargetPath.ts","../../src/components/shadow-claw/utils/requestUserPrompt.ts","../../src/components/shadow-claw/utils/handleOrchestratorAskUser.ts","../../src/components/shadow-claw/utils/handleOrchestratorOpenFile.ts","../../src/components/shadow-claw/utils/handleOrchestratorProviderHelp.ts","../../src/components/shadow-claw/utils/handleOrchestratorRoomInvite.ts","../../src/components/shadow-claw/utils/historyState.ts","../../src/components/shadow-claw/utils/navigateToRoute.ts","../../src/components/shadow-claw/utils/normalizePageRoute.ts","../../src/components/shadow-claw/utils/handleShadowClawNavigate.ts","../../src/components/shadow-claw/utils/loadPagesSidebarVisibilityPreference.ts","../../src/components/shadow-claw/utils/processPeerQueryParam.ts","../../src/share-target/pending-shares.ts","../../src/components/shadow-claw/utils/buildSharedTextPayload.ts","../../src/components/shadow-claw/utils/resolveSharedFilesConversationId.ts","../../src/components/shadow-claw/utils/sanitizeSharedFileName.ts","../../src/components/shadow-claw/utils/processPendingSharedPayloads.ts","../../src/components/shadow-claw/utils/processRoomQueryParam.ts","../../src/components/shadow-claw/utils/setupEffects.ts","../../src/components/shadow-claw/shadow-claw.ts"],"sourcesContent":["import { Signal } from \"signal-polyfill\";\nimport {\n getNamespacedItem,\n getNamespacedStorageKey,\n setNamespacedItem,\n} from \"../utils/namespacedStorage.js\";\n\nexport type ThemeChoice = \"light\" | \"dark\" | \"system\";\nexport type ResolvedTheme = \"light\" | \"dark\";\n\nexport const Themes = {\n Light: \"light\" as const,\n Dark: \"dark\" as const,\n System: \"system\" as const,\n};\n\nconst THEME_KEY = \"shadow-claw-theme\";\n\n/**\n * Get the system theme preference\n */\nfunction getSystemTheme(): ResolvedTheme {\n if (typeof window.matchMedia !== \"function\") {\n return \"light\";\n }\n\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n ? \"dark\"\n : \"light\";\n}\n\n/**\n * Resolve theme choice to actual theme\n */\nfunction resolveTheme(choice: ThemeChoice): ResolvedTheme {\n return choice === \"system\" ? getSystemTheme() : choice;\n}\n\n/**\n * Apply theme to DOM\n */\nfunction applyTheme(resolved: ResolvedTheme): void {\n const root = document.documentElement;\n if (resolved === \"dark\") {\n root.classList.add(\"dark-mode\");\n root.classList.remove(\"light-mode\");\n } else {\n root.classList.add(\"light-mode\");\n root.classList.remove(\"dark-mode\");\n }\n\n // Apply to shadow-claw element directly\n const shadowAgent = document.querySelector(\"shadow-claw\");\n if (shadowAgent) {\n if (resolved === \"dark\") {\n shadowAgent.classList.add(\"dark-mode\");\n shadowAgent.classList.remove(\"light-mode\");\n } else {\n shadowAgent.classList.add(\"light-mode\");\n shadowAgent.classList.remove(\"dark-mode\");\n }\n }\n\n // Dispatch event for other components to respond if needed\n window.dispatchEvent(\n new CustomEvent(\"shadow-claw-theme-change\", {\n detail: { theme: resolved },\n }),\n );\n}\n\nconst stored = (getNamespacedItem(THEME_KEY) as ThemeChoice) || \"system\";\n\nconst initialResolved = resolveTheme(stored);\napplyTheme(initialResolved);\n\nexport class ThemeStore {\n private _resolved: Signal.State<ResolvedTheme>;\n private _theme: Signal.State<ThemeChoice>;\n\n constructor() {\n this._theme = new Signal.State(stored);\n this._resolved = new Signal.State(initialResolved);\n }\n\n /**\n * Get current theme info\n */\n getTheme(): { theme: ThemeChoice; resolved: ResolvedTheme } {\n return { theme: this.theme, resolved: this.resolved };\n }\n\n /**\n * Initialize listeners - should be called once\n */\n init(): void {\n // Listen for system theme changes — always override current choice\n if (typeof window.matchMedia === \"function\") {\n const mql = window.matchMedia(\"(prefers-color-scheme: dark)\");\n mql.addEventListener(\"change\", () => {\n const resolved = getSystemTheme();\n setNamespacedItem(THEME_KEY, \"system\");\n applyTheme(resolved);\n this._theme.set(\"system\");\n this._resolved.set(resolved);\n });\n }\n\n // Listen for storage changes (tab sync)\n window.addEventListener(\"storage\", (e) => {\n const targetKey = getNamespacedStorageKey(THEME_KEY);\n if (e.key === targetKey && e.newValue) {\n this.setTheme(e.newValue as ThemeChoice);\n }\n });\n }\n\n get resolved(): ResolvedTheme {\n return this._resolved.get();\n }\n\n /**\n * Set the theme\n */\n setTheme(theme: ThemeChoice): void {\n const resolved = resolveTheme(theme);\n setNamespacedItem(THEME_KEY, theme);\n applyTheme(resolved);\n this._theme.set(theme);\n this._resolved.set(resolved);\n }\n\n get theme(): ThemeChoice {\n return this._theme.get();\n }\n}\n\nexport const themeStore = new ThemeStore();\nthemeStore.init();\n","export async function applyAnchorWithRetry(\n apply: () => boolean,\n maxAttempts = 3,\n): Promise<void> {\n for (let i = 0; i < maxAttempts; i++) {\n if (apply()) {\n return;\n }\n\n await new Promise<void>((resolve) => {\n requestAnimationFrame(() => resolve());\n });\n }\n}\n","import { OrchestratorStore } from \"../../../stores/orchestrator.js\";\n\ninterface SidebarContext {\n pagesSidebarHidden?: boolean;\n chatSidebarHidden?: boolean;\n tasksSidebarHidden?: boolean;\n filesSidebarHidden?: boolean;\n}\n\nexport function getDefaultSidebarPage(\n oStore: OrchestratorStore,\n context?: SidebarContext,\n): \"pages\" | \"chat\" | \"tasks\" | \"files\" {\n const preferred = oStore.sidebarDefaultPage;\n const candidates: Array<\"pages\" | \"chat\" | \"tasks\" | \"files\"> = [\n preferred,\n \"pages\",\n \"chat\",\n \"tasks\",\n \"files\",\n ];\n\n if (!context) {\n if (\n preferred === \"pages\" ||\n preferred === \"chat\" ||\n preferred === \"tasks\" ||\n preferred === \"files\"\n ) {\n return preferred;\n }\n return \"chat\";\n }\n\n for (const page of candidates) {\n if (page === \"pages\" && !context.pagesSidebarHidden) {\n return \"pages\";\n }\n if (page === \"chat\" && !context.chatSidebarHidden) {\n return \"chat\";\n }\n if (page === \"tasks\" && !context.tasksSidebarHidden) {\n return \"tasks\";\n }\n if (page === \"files\" && !context.filesSidebarHidden) {\n return \"files\";\n }\n }\n\n return \"pages\";\n}\n","import { OrchestratorStore } from \"../../../stores/orchestrator.js\";\nimport { getDefaultSidebarPage } from \"./getDefaultSidebarPage.js\";\n\nexport function resolvePageForVisibility(\n oStore: OrchestratorStore,\n page: string,\n pagesSidebarHidden: boolean,\n): string {\n if (pagesSidebarHidden && page === \"pages\") {\n return getDefaultSidebarPage(oStore);\n }\n\n return page;\n}\n","export function getTerminalSlotForPage(\n shadow,\n page: string,\n): HTMLElement | null {\n if (!shadow || ![\"chat\", \"tasks\", \"files\"].includes(page)) {\n return null;\n }\n\n const pageEl = shadow.querySelector(`[data-page-id=\"${page}\"]`);\n if (!(pageEl instanceof HTMLElement)) {\n return null;\n }\n\n const child = pageEl.querySelector(\n \"shadow-claw-chat, shadow-claw-tasks, shadow-claw-files\",\n );\n\n const slot =\n child instanceof HTMLElement\n ? child.shadowRoot?.querySelector(\"[data-terminal-slot]\")\n : null;\n\n return slot instanceof HTMLElement ? slot : null;\n}\n","import { getTerminalSlotForPage } from \"./getTerminalSlotForPage.js\";\n\nimport type { ShadowClawTerminal } from \"../../shadow-claw-terminal/shadow-claw-terminal.js\";\n\nexport function syncTerminalPlacement(\n shadow: ShadowRoot | null,\n currentPage: string,\n terminalElement: ShadowClawTerminal | null,\n terminalVisible: boolean,\n) {\n const terminal = terminalElement;\n if (!terminal) {\n return;\n }\n\n const slot = getTerminalSlotForPage(shadow, currentPage);\n if (!slot) {\n return;\n }\n\n if (terminal.parentElement !== slot) {\n slot.appendChild(terminal);\n }\n\n const shouldHide = !terminalVisible;\n terminal.hidden = shouldHide;\n\n if (shouldHide) {\n slot.setAttribute(\"hidden\", \"hidden\");\n shadow\n ?.querySelector(\"shadow-claw-terminal\")\n ?.setAttribute(\"hidden\", \"hidden\");\n } else {\n slot.removeAttribute(\"hidden\");\n shadow?.querySelector(\"shadow-claw-terminal\")?.removeAttribute(\"hidden\");\n }\n}\n","const componentLoaders: Record<string, () => Promise<unknown>> = {\n pages: () => import(\"../../shadow-claw-pages/shadow-claw-pages.js\"),\n chat: () => import(\"../../shadow-claw-chat/shadow-claw-chat.js\"),\n tasks: () => import(\"../../shadow-claw-tasks/shadow-claw-tasks.js\"),\n files: () => import(\"../../shadow-claw-files/shadow-claw-files.js\"),\n settings: () => import(\"../../shadow-claw-settings/shadow-claw-settings.js\"),\n tools: () => import(\"../../shadow-claw-tools/shadow-claw-tools.js\"),\n channels: () => import(\"../../shadow-claw-channels/shadow-claw-channels.js\"),\n terminal: () => import(\"../../shadow-claw-terminal/shadow-claw-terminal.js\"),\n \"file-viewer\": () =>\n import(\"../../shadow-claw-file-viewer/shadow-claw-file-viewer.js\"),\n \"pdf-viewer\": () =>\n import(\"../../shadow-claw-pdf-viewer/shadow-claw-pdf-viewer.js\"),\n};\n\nconst loadingPromises = new Map<string, Promise<void>>();\n\nexport async function ensureComponentLoaded(name: string): Promise<void> {\n let promise = loadingPromises.get(name);\n if (!promise) {\n const loader = componentLoaders[name];\n if (loader) {\n promise = loader().then(() => undefined);\n loadingPromises.set(name, promise);\n } else {\n promise = Promise.resolve();\n }\n }\n await promise;\n}\n","import { syncTerminalPlacement } from \"./syncTerminalPlacement.js\";\nimport { ensureComponentLoaded } from \"./loadComponent.js\";\n\nimport type { ShadowClawTerminal } from \"../../shadow-claw-terminal/shadow-claw-terminal.js\";\n\nexport function scheduleTerminalPlacement(\n shadow: ShadowRoot | null,\n currentPage: string,\n terminalElement: ShadowClawTerminal | null,\n terminalVisible: boolean,\n terminalPlacementFrame: number | null,\n) {\n if (terminalVisible) {\n ensureComponentLoaded(\"terminal\").catch(console.error);\n }\n if (terminalPlacementFrame !== null) {\n cancelAnimationFrame(terminalPlacementFrame);\n }\n\n terminalPlacementFrame = requestAnimationFrame(() => {\n terminalPlacementFrame = null;\n syncTerminalPlacement(\n shadow,\n currentPage,\n terminalElement,\n terminalVisible,\n );\n });\n}\n","import { PageHeaderLikeElement } from \"../../types.js\";\n\nexport function getPageHeaderElements(\n shadow: ShadowRoot | null,\n): PageHeaderLikeElement[] {\n if (!shadow) {\n return [];\n }\n\n const containerSelectors = [\n \"shadow-claw-chat\",\n \"shadow-claw-tasks\",\n \"shadow-claw-files\",\n \"shadow-claw-pages\",\n \"shadow-claw-settings\",\n \"shadow-claw-tools\",\n \"shadow-claw-channels\",\n ];\n\n const headers: PageHeaderLikeElement[] = [];\n\n for (const selector of containerSelectors) {\n const container = shadow.querySelector(selector);\n if (!(container instanceof HTMLElement)) {\n continue;\n }\n\n const header = container.shadowRoot?.querySelector(\n \"shadow-claw-page-header\",\n );\n if (header instanceof HTMLElement) {\n headers.push(header as PageHeaderLikeElement);\n }\n }\n\n return headers;\n}\n","import { getPageHeaderElements } from \"./getPageHeaderElements.js\";\n\nexport function syncPageHeaderMainVisibilityOverride(\n shadow: ShadowRoot | null,\n headerMainCollapsedOverride: boolean | null,\n) {\n if (!shadow) {\n return;\n }\n\n for (const header of getPageHeaderElements(shadow)) {\n header.setMainCollapsedOverride?.(headerMainCollapsedOverride);\n }\n}\n","export function updateActivityLogToggleVisibility(\n shadow: ShadowRoot | null,\n currentPage: string,\n activityLogLength: number,\n): void {\n if (!shadow) {\n return;\n }\n\n const button = shadow.querySelector(\".activity-log-toggle\");\n if (!(button instanceof HTMLButtonElement)) {\n return;\n }\n\n button.hidden = currentPage !== \"chat\" || activityLogLength === 0;\n}\n","import { PageHeaderLikeElement } from \"../../types.js\";\n\nexport function getActivePageHeaderElement(\n shadow: ShadowRoot | null,\n): PageHeaderLikeElement | null {\n if (!shadow) {\n return null;\n }\n\n const activePage = shadow.querySelector(\".page.active\");\n if (!(activePage instanceof HTMLElement)) {\n return null;\n }\n\n const pageContainer = activePage.querySelector(\n \"shadow-claw-chat, shadow-claw-tasks, shadow-claw-files, shadow-claw-pages, shadow-claw-settings, shadow-claw-tools, shadow-claw-channels\",\n );\n if (!(pageContainer instanceof HTMLElement)) {\n return null;\n }\n\n const header = pageContainer.shadowRoot?.querySelector(\n \"shadow-claw-page-header\",\n );\n\n return header instanceof HTMLElement\n ? (header as PageHeaderLikeElement)\n : null;\n}\n","import { getActivePageHeaderElement } from \"./getActivePageHeaderElement.js\";\n\nexport function updateHeaderMainToggle(\n shadow: ShadowRoot | null,\n headerMainCollapsedOverride?: boolean | null,\n): void {\n if (!shadow) {\n return;\n }\n\n const button = shadow.querySelector(\".header-main-toggle\");\n if (!(button instanceof HTMLButtonElement)) {\n return;\n }\n\n const collapsed =\n typeof headerMainCollapsedOverride === \"boolean\"\n ? headerMainCollapsedOverride\n : (getActivePageHeaderElement(shadow)?.isMainCollapsed?.() ?? false);\n\n button.setAttribute(\n \"aria-label\",\n collapsed ? \"Show action header\" : \"Hide action header\",\n );\n\n button.setAttribute(\n \"title\",\n collapsed ? \"Show action header\" : \"Hide action header\",\n );\n\n button.setAttribute(\"aria-pressed\", String(collapsed));\n}\n","export function updateTerminalToggle(\n shadow: ShadowRoot | null,\n currentPage: string,\n terminalVisible: boolean,\n vmStatus: { ready: boolean; booting: boolean; bootAttempted: boolean },\n): void {\n if (!shadow) {\n return;\n }\n\n const button = shadow.querySelector(\".webvm-toggle\");\n if (!(button instanceof HTMLButtonElement)) {\n return;\n }\n\n const available = currentPage === \"chat\" || currentPage === \"files\";\n\n button.hidden = !available;\n button.classList.toggle(\"hidden\", !available);\n button.classList.remove(\n \"webvm-toggle--hidden\",\n \"webvm-toggle--visible\",\n \"webvm-toggle--booting\",\n \"webvm-toggle--ready\",\n \"webvm-toggle--error\",\n );\n\n if (!available) {\n button.classList.add(\"webvm-toggle--error\");\n\n return;\n }\n\n button.classList.add(\n terminalVisible ? \"webvm-toggle--visible\" : \"webvm-toggle--hidden\",\n );\n\n if (vmStatus.ready) {\n button.classList.add(\"webvm-toggle--ready\");\n } else if (vmStatus.booting || vmStatus.bootAttempted) {\n button.classList.add(\"webvm-toggle--booting\");\n }\n\n button.setAttribute(\n \"aria-label\",\n terminalVisible ? \"Hide WebVM terminal\" : \"Show WebVM terminal\",\n );\n\n button.setAttribute(\n \"title\",\n terminalVisible ? \"Hide WebVM terminal\" : \"Show WebVM terminal\",\n );\n\n button.setAttribute(\"aria-pressed\", String(terminalVisible));\n}\n","import { resolvePageForVisibility } from \"./resolvePageForVisibility.js\";\nimport { scheduleTerminalPlacement } from \"./scheduleTerminalPlacement.js\";\nimport { syncPageHeaderMainVisibilityOverride } from \"./syncPageHeaderMainVisibilityOverride.js\";\nimport { updateActivityLogToggleVisibility } from \"./updateActivityLogToggleVisibility.js\";\nimport { updateHeaderMainToggle } from \"./updateHeaderMainToggle.js\";\nimport { updateTerminalToggle } from \"./updateTerminalToggle.js\";\n\nimport { ensureComponentLoaded } from \"./loadComponent.js\";\n\nimport type { ShadowClawDatabase } from \"../../../db/types.js\";\nimport type { OrchestratorStore } from \"../../../stores/orchestrator.js\";\n\n/**\n * Map from page id to the custom element tag name used for that page.\n * Entries here must match the componentLoaders map in loadComponent.ts.\n */\nconst PAGE_ELEMENT_TAGS: Record<string, string> = {\n chat: \"shadow-claw-chat\",\n tasks: \"shadow-claw-tasks\",\n files: \"shadow-claw-files\",\n settings: \"shadow-claw-settings\",\n tools: \"shadow-claw-tools\",\n channels: \"shadow-claw-channels\",\n};\n\n/**\n * Stamp the page's custom element into its container div if the container is\n * currently empty. This is idempotent — calling it on an already-populated\n * container is a no-op.\n */\nfunction ensurePageElementStamped(shadow: ShadowRoot, pageId: string): void {\n const tag = PAGE_ELEMENT_TAGS[pageId];\n if (!tag) {\n return; // pages is pre-stamped; file-viewer is handled separately\n }\n\n const container = shadow.querySelector(`[data-page-id=\"${pageId}\"]`);\n if (!container || container.children.length > 0) {\n return; // already stamped\n }\n\n container.appendChild(document.createElement(tag));\n}\n\nexport interface ShowPageContext {\n pagesSidebarHidden: boolean;\n chatSplitViewEnabled?: boolean;\n currentPage: string;\n terminalElement: any;\n terminalVisible: boolean;\n terminalPlacementFrame: number | null;\n headerMainCollapsedOverride: boolean | null;\n vmStatus: { ready: boolean; booting: boolean; bootAttempted: boolean };\n}\n\n/**\n * Show a specific page\n */\nexport function showPage(\n shadow: ShadowRoot | null,\n shadowClaw: ShowPageContext,\n db: ShadowClawDatabase | undefined,\n oStore: OrchestratorStore,\n page: string,\n persist = true,\n) {\n if (!shadow) {\n return;\n }\n\n const resolvedPage = resolvePageForVisibility(\n oStore,\n page,\n shadowClaw.pagesSidebarHidden,\n );\n\n // Handle chat horizontal split view\n const isSplitActive =\n Boolean(shadowClaw.chatSplitViewEnabled) && resolvedPage !== \"chat\";\n\n const mainContent = shadow.querySelector(\".main-content\");\n const chatSplitResizeHandle = shadow.querySelector(\n \".chat-split-resize-handle\",\n );\n\n if (isSplitActive) {\n const chatTag = PAGE_ELEMENT_TAGS.chat;\n if (chatTag && customElements.get(chatTag)) {\n ensurePageElementStamped(shadow, \"chat\");\n } else {\n void ensureComponentLoaded(\"chat\")\n .then(() => {\n if (shadow) {\n ensurePageElementStamped(shadow, \"chat\");\n }\n })\n .catch(console.error);\n }\n\n if (mainContent) {\n mainContent.classList.add(\"split-chat-active\");\n }\n if (chatSplitResizeHandle) {\n chatSplitResizeHandle.removeAttribute(\"hidden\");\n }\n } else {\n if (mainContent) {\n mainContent.classList.remove(\"split-chat-active\");\n }\n if (chatSplitResizeHandle) {\n chatSplitResizeHandle.setAttribute(\"hidden\", \"hidden\");\n }\n }\n\n // Ensure the JS module import completes, then stamp the page element.\n // Stamping only after customElements.define guarantees the element constructor\n // attaches Shadow DOM synchronously upon creation.\n const tag = PAGE_ELEMENT_TAGS[resolvedPage];\n if (tag && customElements.get(tag)) {\n ensurePageElementStamped(shadow, resolvedPage);\n } else {\n void ensureComponentLoaded(resolvedPage)\n .then(() => {\n if (shadow) {\n ensurePageElementStamped(shadow, resolvedPage);\n }\n })\n .catch(console.error);\n }\n\n // Hide all pages\n shadow.querySelectorAll(\".page\").forEach((p) => {\n const el = p;\n el.classList.remove(\"active\");\n });\n\n shadow.querySelectorAll(\".nav-item\").forEach((n) => {\n const el = n;\n el.classList.remove(\"active\");\n });\n\n // Show selected page\n const pageEl = shadow.querySelector(`[data-page-id=\"${resolvedPage}\"]`);\n if (pageEl) {\n const el = pageEl;\n el.classList.add(\"active\");\n }\n\n const navEl = shadow.querySelector(`[data-page=\"${resolvedPage}\"]`);\n if (navEl) {\n const el = navEl;\n el.classList.add(\"active\");\n }\n\n shadowClaw.currentPage = resolvedPage;\n if (persist && db) {\n oStore.setActivePage(db, resolvedPage).catch(console.error);\n }\n\n scheduleTerminalPlacement(\n shadow,\n shadowClaw.currentPage,\n shadowClaw.terminalElement,\n shadowClaw.terminalVisible,\n shadowClaw.terminalPlacementFrame,\n );\n\n syncPageHeaderMainVisibilityOverride(\n shadow,\n shadowClaw.headerMainCollapsedOverride,\n );\n\n updateHeaderMainToggle(shadow, shadowClaw.headerMainCollapsedOverride);\n\n updateActivityLogToggleVisibility(\n shadow,\n shadowClaw.currentPage,\n oStore.activityLog.length,\n );\n\n updateTerminalToggle(\n shadow,\n shadowClaw.currentPage,\n shadowClaw.terminalVisible,\n shadowClaw.vmStatus,\n );\n\n // Scroll to top\n const activePage = shadow.querySelector(\".page.active\");\n if (activePage) {\n const el = activePage;\n if (typeof el.scrollTo === \"function\") {\n el.scrollTo(0, 0);\n }\n }\n\n // Check Prompt API onboarding when switching to the chat tab\n if (resolvedPage === \"chat\") {\n const chatComp = shadow.querySelector(\"shadow-claw-chat\") as any;\n if (chatComp && typeof chatComp.checkPromptApiOnboarding === \"function\") {\n void chatComp.checkPromptApiOnboarding();\n }\n }\n\n // Auto-refresh files if switching to the files tab\n if (resolvedPage === \"files\" && db) {\n oStore.loadFiles(db).catch(console.error);\n }\n\n // Auto-refresh pages if switching to the pages tab\n if (resolvedPage === \"pages\") {\n const pagesComp = shadow.querySelector(\"shadow-claw-pages\") as any;\n if (pagesComp && typeof pagesComp.renderSelectedPage === \"function\") {\n void pagesComp.renderSelectedPage();\n if (typeof pagesComp.setupAutoRefreshTimer === \"function\") {\n void pagesComp.setupAutoRefreshTimer();\n }\n }\n }\n}\n","import { DEFAULT_GROUP_ID } from \"../../../config/config.js\";\n\nimport { applyAnchorWithRetry } from \"./applyAnchorWithRetry.js\";\nimport { showPage } from \"./showPage.js\";\n\nimport type { ShadowClawAppRoute } from \"../../../core/app-routes.js\";\nimport type { FileViewerStore } from \"../../../stores/file-viewer.js\";\nimport type { OrchestratorStore } from \"../../../stores/orchestrator.js\";\nimport type { ShadowClaw } from \"../shadow-claw.js\";\n\nexport async function applyRoute(\n shadow: ShadowRoot | null,\n shadowClaw: ShadowClaw,\n db: IDBDatabase | null,\n fStore: FileViewerStore,\n oStore: OrchestratorStore,\n route: ShadowClawAppRoute,\n) {\n const { page, groupId, path, anchor } = route;\n if (!db) {\n return;\n }\n\n const resolvedPage = page ? String(page).toLowerCase() : \"\";\n\n if (resolvedPage && fStore.file) {\n const targetIsSameFile =\n resolvedPage === \"files\" &&\n path &&\n path === fStore.file.path &&\n (!groupId || groupId === oStore.activeGroupId);\n\n if (!targetIsSameFile) {\n const viewer = shadow?.querySelector(\"shadow-claw-file-viewer\") as any;\n if (viewer && typeof viewer.requestCloseViewer === \"function\") {\n const closed = await viewer.requestCloseViewer();\n if (!closed) {\n return;\n }\n } else {\n fStore.closeFile();\n }\n }\n }\n\n if (groupId && groupId !== oStore.activeGroupId) {\n await oStore.switchConversation(db, groupId, resolvedPage === \"chat\");\n } else if (groupId) {\n // groupId matches the currently active group (restored from last session),\n // but content may not have loaded yet — ensure it is present.\n void oStore.loadHistory();\n if (resolvedPage === \"tasks\" || resolvedPage === \"files\") {\n if (db) {\n void oStore.loadFiles(db);\n }\n }\n }\n\n if (resolvedPage) {\n showPage(shadow, shadowClaw, db, oStore, resolvedPage);\n }\n\n if (resolvedPage === \"files\" && path) {\n const hasExtension = /\\.[^./]+$/u.test(path);\n if (hasExtension) {\n try {\n await fStore.openFile(db, path, groupId || oStore.activeGroupId);\n if (anchor) {\n await applyAnchorWithRetry(() => {\n const viewer = shadow?.querySelector(\n \"shadow-claw-file-viewer\",\n ) as any;\n if (viewer && typeof viewer.handleAnchorNavigation === \"function\") {\n return !!viewer.handleAnchorNavigation(anchor);\n }\n\n return false;\n });\n }\n } catch (err) {\n console.error(\"Failed to open file via route navigation:\", path, err);\n }\n } else {\n try {\n await oStore.setCurrentPath(db, path);\n fStore.closeFile();\n } catch (err) {\n console.error(\"Failed to open folder via route navigation:\", path, err);\n }\n }\n }\n\n if (resolvedPage === \"pages\") {\n // The pages component is lazy-loaded via a dynamic import that is\n // fire-and-forgotten from showPage(). On initial boot the import may\n // still be in-flight here, leaving the DSD-prerendered element in the\n // DOM but not yet upgraded. Awaiting whenDefined() guarantees the\n // element is fully upgraded before clearBootPendingClass() fires —\n // regardless of whether a specific page path is in the URL. The upgrade\n // synchronously runs the connectedCallback() preamble which clears stale\n // SSR content, so the first visible frame after boot always shows CSR.\n if (typeof customElements !== \"undefined\") {\n await customElements.whenDefined(\"shadow-claw-pages\");\n }\n\n // When a specific path is in the URL, pin it before rendering.\n if (path) {\n await oStore.setActivePinnedPage(db, {\n groupId: groupId || oStore.activeGroupId || DEFAULT_GROUP_ID,\n path: path,\n });\n } else {\n const defaultPage =\n oStore.effectiveDefaultPage ||\n (oStore.pages && oStore.pages[0]) ||\n null;\n if (defaultPage) {\n await oStore.setActivePinnedPage(db, defaultPage);\n }\n }\n\n // Always render the active pinned page (either just-set from path, or the\n // persisted default page).\n const pagesComp = shadow?.querySelector(\"shadow-claw-pages\") as any;\n if (pagesComp && typeof pagesComp.renderSelectedPage === \"function\") {\n await pagesComp.renderSelectedPage();\n if (typeof pagesComp.setupAutoRefreshTimer === \"function\") {\n void pagesComp.setupAutoRefreshTimer();\n }\n if (anchor) {\n await applyAnchorWithRetry(() => {\n if (typeof pagesComp.handleAnchorNavigation === \"function\") {\n return !!pagesComp.handleAnchorNavigation(anchor);\n }\n\n return false;\n });\n }\n }\n }\n}\n","import { parseRouteFromUrlAsync } from \"../../../core/app-routes.js\";\nimport { applyRoute } from \"./applyRoute.js\";\n\nimport type { ShadowClawDatabase } from \"../../../db/types.js\";\nimport type { FileViewerStore } from \"../../../stores/file-viewer.js\";\nimport type { OrchestratorStore } from \"../../../stores/orchestrator.js\";\nimport type { ShadowClaw } from \"../shadow-claw.js\";\n\nexport async function applyRouteFromCurrentLocation(\n shadow: ShadowRoot | null,\n shadowClaw: ShadowClaw,\n db: ShadowClawDatabase | null,\n fStore: FileViewerStore,\n oStore: OrchestratorStore,\n url: URL,\n): Promise<void> {\n const parsed = await parseRouteFromUrlAsync(url, oStore.activeGroupId);\n if (!parsed) {\n return;\n }\n\n await applyRoute(shadow, shadowClaw, db, fStore, oStore, parsed);\n}\n","import { MAX_SIDEBAR_WIDTH_PX, MIN_SIDEBAR_WIDTH_PX } from \"../constants.js\";\n\nexport function clampSidebarWidth(\n shadow: ShadowRoot | null,\n px: number,\n): number {\n const appBody = shadow?.querySelector(\".app-body\");\n\n if (!(appBody instanceof HTMLElement)) {\n return Math.max(MIN_SIDEBAR_WIDTH_PX, Math.min(MAX_SIDEBAR_WIDTH_PX, px));\n }\n\n const maxByContainer = Math.max(\n MIN_SIDEBAR_WIDTH_PX,\n appBody.getBoundingClientRect().width - 260,\n );\n\n return Math.max(\n MIN_SIDEBAR_WIDTH_PX,\n Math.min(Math.min(MAX_SIDEBAR_WIDTH_PX, maxByContainer), px),\n );\n}\n","import { CONFIG_KEYS } from \"../../../config/config.js\";\nimport { setConfig } from \"../../../db/setConfig.js\";\n\nimport type { ShadowClawDatabase } from \"../../../db/db.js\";\n\nexport async function persistSidebarWidth(\n db: ShadowClawDatabase,\n px: number,\n): Promise<void> {\n if (!db) {\n return;\n }\n\n try {\n await setConfig(db, CONFIG_KEYS.SIDEBAR_WIDTH, px);\n } catch {\n // Ignore persistence failures so resize remains usable in degraded test/runtime states.\n }\n}\n","import { clampSidebarWidth } from \"./clampSidebarWidth.js\";\n\nexport function setSidebarWidth(shadow: ShadowRoot | null, px: number): void {\n const appBody = shadow?.querySelector(\".app-body\");\n\n if (!(appBody instanceof HTMLElement)) {\n return;\n }\n\n const clamped = clampSidebarWidth(shadow, px);\n appBody.style.setProperty(\"--sidebar-width\", `${clamped}px`);\n}\n","import { CONFIG_KEYS } from \"../../../config/config.js\";\nimport { getConfig } from \"../../../db/getConfig.js\";\n\nimport {\n DEFAULT_SIDEBAR_WIDTH_PX,\n MIN_SIDEBAR_WIDTH_PX,\n} from \"../constants.js\";\n\nimport { clampSidebarWidth } from \"./clampSidebarWidth.js\";\nimport { persistSidebarWidth } from \"./persistSidebarWidth.js\";\nimport { setSidebarWidth } from \"./setSidebarWidth.js\";\n\nimport type { ShadowClawDatabase } from \"../../../db/db.js\";\n\ninterface SidebarResizeHost {\n addCleanup: (fn: () => void) => void;\n}\n\nexport async function initSidebarResize(\n shadow: ShadowRoot | null,\n shadowClaw: SidebarResizeHost,\n sidebar: HTMLElement,\n db: ShadowClawDatabase | undefined,\n): Promise<void> {\n if (!shadow) {\n return;\n }\n\n const handle = shadow.querySelector(\".sidebar-resize-handle\");\n if (!(handle instanceof HTMLElement)) {\n return;\n }\n\n handle.setAttribute(\"tabindex\", \"0\");\n handle.setAttribute(\"role\", \"separator\");\n handle.setAttribute(\"aria-orientation\", \"vertical\");\n handle.setAttribute(\"aria-label\", \"Resize sidebar width\");\n\n const getCurrentWidth = () => {\n const appBody = shadow.querySelector(\".app-body\");\n if (!(appBody instanceof HTMLElement)) {\n return DEFAULT_SIDEBAR_WIDTH_PX;\n }\n\n const stored = parseFloat(\n appBody.style.getPropertyValue(\"--sidebar-width\"),\n );\n if (Number.isFinite(stored) && stored > 0) {\n return stored;\n }\n\n return sidebar.getBoundingClientRect().width || DEFAULT_SIDEBAR_WIDTH_PX;\n };\n\n const updateAria = () => {\n const current = Math.round(clampSidebarWidth(shadow, getCurrentWidth()));\n const max = Math.round(clampSidebarWidth(shadow, Number.MAX_SAFE_INTEGER));\n handle.setAttribute(\"aria-valuemin\", String(MIN_SIDEBAR_WIDTH_PX));\n handle.setAttribute(\"aria-valuemax\", String(max));\n handle.setAttribute(\"aria-valuenow\", String(current));\n };\n\n try {\n const saved = db\n ? await getConfig(db, CONFIG_KEYS.SIDEBAR_WIDTH)\n : undefined;\n\n if (typeof saved === \"number\" && Number.isFinite(saved) && saved > 0) {\n setSidebarWidth(shadow, saved);\n } else {\n setSidebarWidth(shadow, DEFAULT_SIDEBAR_WIDTH_PX);\n }\n } catch {\n setSidebarWidth(shadow, DEFAULT_SIDEBAR_WIDTH_PX);\n }\n\n let activePointerId: number | null = null;\n let startX = 0;\n let startWidth = 0;\n\n const onPointerMove = (event: PointerEvent) => {\n if (event.pointerId !== activePointerId) {\n return;\n }\n\n const delta = event.clientX - startX;\n const nextWidth = startWidth + delta;\n setSidebarWidth(shadow, nextWidth);\n updateAria();\n };\n\n const stopResize = () => {\n if (activePointerId === null) {\n return;\n }\n\n activePointerId = null;\n handle.classList.remove(\"active\");\n document.removeEventListener(\"pointermove\", onPointerMove);\n\n const appBody = shadow.querySelector(\".app-body\");\n if (appBody instanceof HTMLElement) {\n const value = parseFloat(\n appBody.style.getPropertyValue(\"--sidebar-width\"),\n );\n if (Number.isFinite(value) && value > 0 && db) {\n void persistSidebarWidth(db, value);\n }\n }\n };\n\n const onPointerUp = (event: PointerEvent) => {\n if (event.pointerId !== activePointerId) {\n return;\n }\n\n stopResize();\n };\n\n handle.addEventListener(\"pointerdown\", (event: PointerEvent) => {\n if (\n event.pointerType === \"mouse\" &&\n event.button !== 0 &&\n event.button !== -1\n ) {\n return;\n }\n\n if (window.innerWidth < 896) {\n return;\n }\n\n event.preventDefault();\n activePointerId = event.pointerId;\n startX = event.clientX;\n startWidth = sidebar.getBoundingClientRect().width;\n handle.classList.add(\"active\");\n\n handle.setPointerCapture(event.pointerId);\n document.addEventListener(\"pointermove\", onPointerMove);\n });\n\n handle.addEventListener(\"pointerup\", onPointerUp);\n handle.addEventListener(\"pointercancel\", stopResize);\n handle.addEventListener(\"dblclick\", () => {\n setSidebarWidth(shadow, DEFAULT_SIDEBAR_WIDTH_PX);\n if (db) {\n void persistSidebarWidth(db, DEFAULT_SIDEBAR_WIDTH_PX);\n }\n\n updateAria();\n });\n\n handle.addEventListener(\"keydown\", (event: KeyboardEvent) => {\n if (window.innerWidth < 896) {\n return;\n }\n\n const step = event.shiftKey ? 32 : 12;\n const current = getCurrentWidth();\n let next: number | null = null;\n\n if (event.key === \"ArrowRight\") {\n next = current + step;\n } else if (event.key === \"ArrowLeft\") {\n next = current - step;\n } else if (event.key === \"Home\") {\n next = MIN_SIDEBAR_WIDTH_PX;\n } else if (event.key === \"End\") {\n next = clampSidebarWidth(shadow, Number.MAX_SAFE_INTEGER);\n }\n\n if (next === null) {\n return;\n }\n\n event.preventDefault();\n setSidebarWidth(shadow, next);\n updateAria();\n if (db) {\n void persistSidebarWidth(\n db,\n clampSidebarWidth(shadow, getCurrentWidth()),\n );\n }\n });\n\n updateAria();\n\n shadowClaw.addCleanup(() => {\n stopResize();\n handle.removeEventListener(\"pointerup\", onPointerUp);\n handle.removeEventListener(\"pointercancel\", stopResize);\n });\n}\n","import type { AppDialogOptions } from \"../../../ui/types.js\";\n\nexport async function requestDialog(\n doc: Document,\n shadow: ShadowRoot | null,\n options: AppDialogOptions,\n) {\n if (!shadow) {\n return false;\n }\n\n const dialog = shadow.querySelector(\n \".app-dialog\",\n ) as HTMLDialogElement | null;\n const titleEl = shadow.querySelector(\n \".app-dialog__title\",\n ) as HTMLElement | null;\n const messageEl = shadow.querySelector(\n \".app-dialog__message\",\n ) as HTMLElement | null;\n const detailsEl = shadow.querySelector(\n \".app-dialog__details\",\n ) as HTMLUListElement | null;\n const linksEl = shadow.querySelector(\n \".app-dialog__links\",\n ) as HTMLDivElement | null;\n const confirmBtn = shadow.querySelector(\n \".app-dialog__btn--confirm\",\n ) as HTMLButtonElement | null;\n const cancelBtn = shadow.querySelector(\n \".app-dialog__btn--cancel\",\n ) as HTMLButtonElement | null;\n const countdownEl = shadow.querySelector(\n \".app-dialog__countdown\",\n ) as HTMLElement | null;\n\n if (\n !dialog ||\n !titleEl ||\n !messageEl ||\n !detailsEl ||\n !linksEl ||\n !confirmBtn ||\n !cancelBtn\n ) {\n return false;\n }\n\n if ((dialog as any)._autoCloseTimer) {\n clearInterval((dialog as any)._autoCloseTimer);\n (dialog as any)._autoCloseTimer = null;\n }\n\n if (dialog.open) {\n dialog.close();\n }\n\n titleEl.textContent = options.title;\n messageEl.textContent = options.message;\n\n detailsEl.replaceChildren();\n linksEl.replaceChildren();\n\n const details = Array.isArray(options.details) ? options.details : [];\n detailsEl.hidden = details.length === 0;\n for (const detail of details) {\n const item = doc.createElement(\"li\");\n item.textContent = detail;\n\n detailsEl.appendChild(item);\n }\n\n const links = Array.isArray(options.links) ? options.links : [];\n linksEl.hidden = links.length === 0;\n for (const link of links) {\n const anchor = doc.createElement(\"a\");\n anchor.className = \"app-dialog__link\";\n anchor.href = link.href;\n anchor.rel = \"noreferrer\";\n anchor.target = \"_blank\";\n anchor.textContent = link.label;\n\n linksEl.appendChild(anchor);\n }\n\n const mode = options.mode || \"confirm\";\n const baseConfirmLabel =\n options.confirmLabel || (mode === \"info\" ? \"OK\" : \"Confirm\");\n cancelBtn.textContent = options.cancelLabel || \"Cancel\";\n cancelBtn.hidden = mode === \"info\";\n\n let autoCloseTimer: ReturnType<typeof setInterval> | null = null;\n const cleanupTimer = () => {\n if (autoCloseTimer) {\n clearInterval(autoCloseTimer);\n autoCloseTimer = null;\n }\n if ((dialog as any)._autoCloseTimer) {\n (dialog as any)._autoCloseTimer = null;\n }\n };\n\n if (\n typeof options.autoCloseSeconds === \"number\" &&\n options.autoCloseSeconds > 0\n ) {\n let remainingSeconds = Math.max(1, Math.round(options.autoCloseSeconds));\n confirmBtn.textContent = `${baseConfirmLabel} (${remainingSeconds}s)`;\n\n if (countdownEl) {\n countdownEl.hidden = false;\n countdownEl.textContent = `Auto-closing in ${remainingSeconds}s...`;\n countdownEl.setAttribute(\"role\", \"status\");\n countdownEl.setAttribute(\"aria-live\", \"polite\");\n countdownEl.setAttribute(\"aria-atomic\", \"true\");\n }\n\n autoCloseTimer = setInterval(() => {\n remainingSeconds--;\n if (remainingSeconds > 0) {\n confirmBtn.textContent = `${baseConfirmLabel} (${remainingSeconds}s)`;\n if (countdownEl) {\n countdownEl.textContent = `Auto-closing in ${remainingSeconds}s...`;\n }\n } else {\n cleanupTimer();\n dialog.returnValue = mode === \"info\" ? \"confirm\" : \"cancel\";\n dialog.close(dialog.returnValue);\n }\n }, 1000);\n (dialog as any)._autoCloseTimer = autoCloseTimer;\n } else {\n confirmBtn.textContent = baseConfirmLabel;\n if (countdownEl) {\n countdownEl.hidden = true;\n countdownEl.textContent = \"\";\n }\n }\n\n dialog.returnValue = \"\";\n\n return await new Promise<boolean>((resolve) => {\n const onClose = () => {\n cleanupTimer();\n dialog.removeEventListener(\"close\", onClose);\n resolve(dialog.returnValue === \"confirm\");\n };\n\n dialog.addEventListener(\"close\", onClose);\n dialog.showModal();\n });\n}\n","import { CONFIG_KEYS } from \"../../../config/config.js\";\nimport { getConfig } from \"../../../db/getConfig.js\";\nimport { parseConfigBoolean } from \"./parseConfigBoolean.js\";\n\nimport type { ShadowClawDatabase } from \"../../../db/types.js\";\nimport type { OrchestratorStore } from \"../../../stores/orchestrator.js\";\nimport type { ShadowClaw } from \"../shadow-claw.js\";\n\n/**\n * Sidebar nav item keys and their corresponding CONFIG_KEYS.\n */\nconst SIDEBAR_VISIBILITY_MAP = {\n pages: CONFIG_KEYS.SIDEBAR_PAGES_HIDDEN,\n chat: CONFIG_KEYS.SIDEBAR_CHAT_HIDDEN,\n tasks: CONFIG_KEYS.SIDEBAR_TASKS_HIDDEN,\n files: CONFIG_KEYS.SIDEBAR_FILES_HIDDEN,\n} as const;\n\nexport type SidebarNavPage = keyof typeof SIDEBAR_VISIBILITY_MAP;\n\n/**\n * Apply the hidden attribute on a single sidebar nav item.\n */\nexport function applySidebarNavVisibility(\n shadow: ShadowRoot | null,\n page: SidebarNavPage,\n hidden: boolean,\n) {\n if (!shadow) {\n return;\n }\n\n const navItem = shadow.querySelector(\n `.nav-item[data-page=\"${page}\"]`,\n ) as HTMLElement | null;\n\n if (!navItem) {\n return;\n }\n\n navItem.hidden = hidden;\n navItem.setAttribute(\"aria-hidden\", String(hidden));\n}\n\n/**\n * Get the property name on ShadowClaw for a nav item's hidden state.\n */\nfunction getHiddenProp(\n page: SidebarNavPage,\n): keyof Pick<\n ShadowClaw,\n | \"pagesSidebarHidden\"\n | \"chatSidebarHidden\"\n | \"tasksSidebarHidden\"\n | \"filesSidebarHidden\"\n> {\n switch (page) {\n case \"pages\":\n return \"pagesSidebarHidden\";\n case \"chat\":\n return \"chatSidebarHidden\";\n case \"tasks\":\n return \"tasksSidebarHidden\";\n case \"files\":\n return \"filesSidebarHidden\";\n }\n}\n\n/**\n * Load all sidebar visibility preferences from config and apply them.\n * This generalizes `loadPagesSidebarVisibilityPreference` to cover all\n * four nav items.\n */\nexport async function loadAllSidebarVisibilityPreferences(\n shadow: ShadowRoot | null,\n shadowClaw: ShadowClaw,\n _oStore: OrchestratorStore | undefined,\n db: ShadowClawDatabase,\n): Promise<void> {\n for (const [page, configKey] of Object.entries(SIDEBAR_VISIBILITY_MAP)) {\n const navPage = page as SidebarNavPage;\n let hidden = false;\n\n if (db) {\n try {\n const raw = await getConfig(db, configKey);\n hidden = parseConfigBoolean(raw);\n } catch {\n hidden = false;\n }\n }\n\n const prop = getHiddenProp(navPage);\n shadowClaw[prop] = hidden;\n applySidebarNavVisibility(shadow, navPage, hidden);\n }\n}\n\n/**\n * Compute the best default sidebar page when the current page is hidden.\n * Respects all four hidden flags. Falls back to \"pages\" as absolute last resort.\n */\nexport function getDefaultVisibleSidebarPage(\n shadowClaw: ShadowClaw,\n): \"pages\" | \"chat\" | \"tasks\" | \"files\" {\n const candidates: Array<\"pages\" | \"chat\" | \"tasks\" | \"files\"> = [\n \"pages\",\n \"chat\",\n \"tasks\",\n \"files\",\n ];\n const hidden: Record<string, boolean> = {\n pages: shadowClaw.pagesSidebarHidden,\n chat: shadowClaw.chatSidebarHidden,\n tasks: shadowClaw.tasksSidebarHidden,\n files: shadowClaw.filesSidebarHidden,\n };\n\n for (const page of candidates) {\n if (!hidden[page]) {\n return page;\n }\n }\n\n // Absolute fallback — never hide everything\n return \"pages\";\n}\n","import {\n applySidebarNavVisibility,\n SidebarNavPage,\n} from \"./sidebarVisibility.js\";\nimport { getDefaultSidebarPage } from \"./getDefaultSidebarPage.js\";\nimport { showPage } from \"./showPage.js\";\n\nimport type { ShadowClawDatabase } from \"../../../db/types.js\";\nimport type { OrchestratorStore } from \"../../../stores/orchestrator.js\";\nimport type { ShadowClaw } from \"../shadow-claw.js\";\n\nexport function setSidebarNavHidden(\n shadow: ShadowRoot | null,\n shadowClaw: ShadowClaw,\n oStore: OrchestratorStore,\n db: ShadowClawDatabase,\n page: SidebarNavPage,\n hidden: boolean,\n) {\n switch (page) {\n case \"pages\":\n shadowClaw.pagesSidebarHidden = hidden;\n break;\n case \"chat\":\n shadowClaw.chatSidebarHidden = hidden;\n break;\n case \"tasks\":\n shadowClaw.tasksSidebarHidden = hidden;\n break;\n case \"files\":\n shadowClaw.filesSidebarHidden = hidden;\n break;\n }\n\n applySidebarNavVisibility(shadow, page, hidden);\n\n if (hidden && shadowClaw.currentPage === page) {\n showPage(\n shadow,\n shadowClaw,\n db,\n oStore,\n getDefaultSidebarPage(oStore, shadowClaw),\n );\n }\n}\n\nexport function setPagesSidebarHidden(\n shadow: ShadowRoot | null,\n shadowClaw: ShadowClaw,\n oStore: OrchestratorStore,\n db: ShadowClawDatabase,\n hidden: boolean,\n) {\n setSidebarNavHidden(shadow, shadowClaw, oStore, db, \"pages\", hidden);\n}\n","export function supportsNavigationApi(): boolean {\n const nav = (window as any).navigation;\n\n return !!(\n nav &&\n typeof nav.addEventListener === \"function\" &&\n typeof nav.navigate === \"function\"\n );\n}\n","export function syncActivityLogVisibilityOverride(\n shadow: ShadowRoot | null,\n activityLogCollapsedOverride: boolean | null,\n) {\n if (!shadow) {\n return;\n }\n\n const chat = shadow.querySelector(\"shadow-claw-chat\") as any;\n if (chat && typeof chat.setActivityLogCollapsedOverride === \"function\") {\n chat.setActivityLogCollapsedOverride(activityLogCollapsedOverride);\n }\n}\n","export function updateActivityLogToggle(\n shadow: ShadowRoot | null,\n activityLogCollapsedOverride?: boolean,\n): void {\n if (!shadow) {\n return;\n }\n\n const button = shadow.querySelector(\".activity-log-toggle\");\n if (!(button instanceof HTMLButtonElement)) {\n return;\n }\n\n const autoCollapsed =\n typeof globalThis.matchMedia === \"function\"\n ? !globalThis.matchMedia(\"(min-width: 56rem) and (min-height: 401px)\")\n .matches\n : false;\n\n const collapsed =\n typeof activityLogCollapsedOverride === \"boolean\"\n ? activityLogCollapsedOverride\n : autoCollapsed;\n\n button.setAttribute(\n \"aria-label\",\n collapsed ? \"Show activity log\" : \"Hide activity log\",\n );\n button.setAttribute(\n \"title\",\n collapsed ? \"Show activity log\" : \"Hide activity log\",\n );\n button.setAttribute(\"aria-pressed\", String(collapsed));\n}\n","import { syncActivityLogVisibilityOverride } from \"./syncActivityLogVisibilityOverride.js\";\nimport { updateActivityLogToggle } from \"./updateActivityLogToggle.js\";\n\nimport type { ShadowClaw } from \"../shadow-claw.js\";\n\nexport function toggleActivityLogVisibility(shadowClaw: ShadowClaw) {\n const autoCollapsed =\n typeof globalThis.matchMedia === \"function\"\n ? !globalThis.matchMedia(\"(min-width: 56rem) and (min-height: 401px)\")\n .matches\n : false;\n\n const currentCollapsed =\n typeof shadowClaw.activityLogCollapsedOverride === \"boolean\"\n ? shadowClaw.activityLogCollapsedOverride\n : autoCollapsed;\n\n shadowClaw.activityLogCollapsedOverride = !currentCollapsed;\n syncActivityLogVisibilityOverride(\n shadowClaw.shadowRoot,\n shadowClaw.activityLogCollapsedOverride,\n );\n\n updateActivityLogToggle(\n shadowClaw.shadowRoot,\n shadowClaw.activityLogCollapsedOverride,\n );\n}\n","import { getActivePageHeaderElement } from \"./getActivePageHeaderElement.js\";\nimport { syncPageHeaderMainVisibilityOverride } from \"./syncPageHeaderMainVisibilityOverride.js\";\nimport { updateHeaderMainToggle } from \"./updateHeaderMainToggle.js\";\n\nimport type { ShadowClaw } from \"../shadow-claw.js\";\n\nexport function togglePageHeaderMainVisibility(shadowClaw: ShadowClaw) {\n const currentCollapsed =\n typeof shadowClaw.headerMainCollapsedOverride === \"boolean\"\n ? shadowClaw.headerMainCollapsedOverride\n : (getActivePageHeaderElement(\n shadowClaw.shadowRoot,\n )?.isMainCollapsed?.() ?? false);\n\n shadowClaw.headerMainCollapsedOverride = !currentCollapsed;\n syncPageHeaderMainVisibilityOverride(\n shadowClaw.shadowRoot,\n shadowClaw.headerMainCollapsedOverride,\n );\n\n updateHeaderMainToggle(\n shadowClaw.shadowRoot,\n shadowClaw.headerMainCollapsedOverride,\n );\n}\n","import { scheduleTerminalPlacement } from \"./scheduleTerminalPlacement.js\";\nimport { updateTerminalToggle } from \"./updateTerminalToggle.js\";\n\nimport type { ShadowClaw } from \"../shadow-claw.js\";\n\nexport function toggleTerminalVisibility(\n shadow: ShadowRoot | null,\n shadowClaw: ShadowClaw,\n) {\n shadowClaw.terminalVisible = !shadowClaw.terminalVisible;\n\n updateTerminalToggle(\n shadow,\n shadowClaw.currentPage,\n shadowClaw.terminalVisible,\n shadowClaw.vmStatus,\n );\n\n scheduleTerminalPlacement(\n shadow,\n shadowClaw.currentPage,\n shadowClaw.terminalElement,\n shadowClaw.terminalVisible,\n shadowClaw.terminalPlacementFrame,\n );\n}\n","import { Themes } from \"../../../stores/theme.js\";\n\n/**\n * Update host element theme classes\n */\nexport function updateHostTheme(theme: string, classList: DOMTokenList): void {\n if (theme === Themes.Dark) {\n classList.add(\"dark-mode\");\n classList.remove(\"light-mode\");\n } else {\n classList.add(\"light-mode\");\n classList.remove(\"dark-mode\");\n }\n}\n","import { Themes } from \"../../../stores/theme.js\";\n\n/**\n * Update theme toggle icons based on current theme\n */\nexport function updateThemeIcons(shadow: ShadowRoot | null, theme: string) {\n if (!shadow) {\n return;\n }\n\n const sunIcon: HTMLElement | null = shadow.querySelector(\".sun-icon\");\n const moonIcon: HTMLElement | null = shadow.querySelector(\".moon-icon\");\n\n if (sunIcon && moonIcon) {\n if (theme === Themes.Dark) {\n sunIcon.style.display = \"block\";\n sunIcon.removeAttribute(\"hidden\");\n sunIcon.classList.remove(\"hidden\");\n\n moonIcon.style.display = \"none\";\n moonIcon.setAttribute(\"hidden\", \"hidden\");\n moonIcon.classList.add(\"hidden\");\n } else {\n sunIcon.style.display = \"none\";\n sunIcon.setAttribute(\"hidden\", \"hidden\");\n sunIcon.classList.add(\"hidden\");\n\n moonIcon.style.display = \"block\";\n moonIcon.removeAttribute(\"hidden\");\n moonIcon.classList.remove(\"hidden\");\n }\n }\n}\n","import { Themes } from \"../../../stores/theme.js\";\nimport { applyRouteFromCurrentLocation } from \"./applyRouteFromCurrentLocation.js\";\nimport { getDefaultSidebarPage } from \"./getDefaultSidebarPage.js\";\nimport { initSidebarResize } from \"./initSidebarResize.js\";\nimport { requestDialog } from \"./requestDialog.js\";\nimport { scheduleTerminalPlacement } from \"./scheduleTerminalPlacement.js\";\nimport {\n setPagesSidebarHidden,\n setSidebarNavHidden,\n} from \"./setPagesSidebarHidden.js\";\nimport { showPage } from \"./showPage.js\";\nimport { supportsNavigationApi } from \"./supportsNavigationApi.js\";\nimport { syncPageHeaderMainVisibilityOverride } from \"./syncPageHeaderMainVisibilityOverride.js\";\n\nimport { toggleActivityLogVisibility } from \"./toggleActivityLogVisibility.js\";\nimport { togglePageHeaderMainVisibility } from \"./togglePageHeaderMainVisibility.js\";\nimport { toggleTerminalVisibility } from \"./toggleTerminalVisibility.js\";\n\nimport { updateHeaderMainToggle } from \"./updateHeaderMainToggle.js\";\nimport { updateHostTheme } from \"./updateHostTheme.js\";\nimport { updateThemeIcons } from \"./updateThemeIcons.js\";\n\nimport type { ShadowClawDatabase } from \"../../../db/types.js\";\nimport type { FileViewerStore } from \"../../../stores/file-viewer.js\";\nimport type { OrchestratorStore } from \"../../../stores/orchestrator.js\";\nimport type { ThemeStore } from \"../../../stores/theme.js\";\nimport type { ShadowClaw } from \"../shadow-claw.js\";\n\nexport function bindEventListeners(\n win: Window,\n doc: Document,\n shadow: ShadowRoot | null,\n shadowClaw: ShadowClaw,\n db: ShadowClawDatabase,\n oStore: OrchestratorStore,\n fStore: FileViewerStore,\n tStore: ThemeStore,\n _url?: URL,\n): void {\n if (!shadow || !win || !doc) {\n return;\n }\n\n // Navigation items\n shadow.querySelectorAll(\".nav-item[data-page]\").forEach((item: Element) => {\n const lItem = item as HTMLLIElement;\n lItem.addEventListener(\"click\", () => {\n const page = lItem.dataset.page || getDefaultSidebarPage(oStore);\n\n // Apply the active class immediately so the browser can commit a paint\n // frame showing the selection highlight (this is the INP \"next paint\").\n // The actual page switch — which may create/upgrade a component and read\n // IndexedDB — is deferred to a separate task via setTimeout so it does\n // not block that first paint frame.\n shadow\n .querySelectorAll(\".nav-item\")\n .forEach((n) => n.classList.remove(\"active\"));\n lItem.classList.add(\"active\");\n\n setTimeout(() => {\n doc.dispatchEvent(\n new CustomEvent(\"shadow-claw-navigate\", {\n detail: { page },\n bubbles: true,\n composed: true,\n }),\n );\n }, 0);\n });\n });\n\n // Menu toggle logic\n const menuButton = shadow.getElementById(\"menu-button\");\n const sidebar = shadow.querySelector(\".sidebar\");\n\n if (menuButton && sidebar) {\n menuButton.addEventListener(\"click\", () => {\n sidebar.classList.toggle(\"open\");\n });\n\n // Close sidebar when an item is tapped (only on mobile)\n shadow.querySelectorAll(\".nav-item, .settings-btn\").forEach((item) => {\n item.addEventListener(\"click\", () => {\n if (win.innerWidth < 896) {\n sidebar.classList.remove(\"open\");\n }\n });\n });\n\n // Close sidebar when clicking outside of it (mobile only).\n // Use composedPath() instead of e.target because Shadow DOM event\n // retargeting makes e.target the host element at the doc level,\n // so contains() checks on shadow-root children always return false.\n doc.addEventListener(\"click\", (e: MouseEvent) => {\n const path = e.composedPath();\n if (\n win.innerWidth < 896 &&\n sidebar.classList.contains(\"open\") &&\n !path.includes(sidebar) &&\n !path.includes(menuButton)\n ) {\n sidebar.classList.remove(\"open\");\n }\n });\n\n // Responsive matchMedia handler for orientation/resizing\n const matchMedia = win.matchMedia\n ? win.matchMedia(\"(min-width: 56rem)\")\n : ({\n matches: false,\n addEventListener: () => {},\n removeEventListener: () => {},\n } as unknown as MediaQueryList);\n\n const handleMediaQuery = (e: MediaQueryListEvent | MediaQueryList) => {\n if (e.matches) {\n sidebar.classList.remove(\"open\"); // Desktop view handles visibility implicitly\n }\n };\n\n // Setup initial state\n handleMediaQuery(matchMedia);\n\n // Listen for changes\n matchMedia.addEventListener(\"change\", handleMediaQuery);\n\n initSidebarResize(shadow, shadowClaw, sidebar as HTMLElement, db);\n }\n\n // Settings button\n const settingsBtn = shadow.querySelector('[data-action=\"show-settings\"]');\n if (settingsBtn) {\n settingsBtn.addEventListener(\"click\", () => {\n doc.dispatchEvent(\n new CustomEvent(\"shadow-claw-navigate\", {\n detail: { page: \"settings\" },\n bubbles: true,\n composed: true,\n }),\n );\n });\n }\n\n const headerMainToggle = shadow.querySelector(\".header-main-toggle\");\n headerMainToggle?.addEventListener(\"click\", () => {\n togglePageHeaderMainVisibility(shadowClaw);\n });\n\n const activityLogToggle = shadow.querySelector(\".activity-log-toggle\");\n activityLogToggle?.addEventListener(\"click\", () => {\n toggleActivityLogVisibility(shadowClaw);\n });\n\n // Listen for navigate events from subcomponents (e.g. settings \"channels\" or \"tools\" buttons)\n shadow.addEventListener(\"navigate\", (e: Event) => {\n const page = (e as CustomEvent).detail?.page;\n if (page) {\n doc.dispatchEvent(\n new CustomEvent(\"shadow-claw-navigate\", {\n detail: { page },\n bubbles: true,\n composed: true,\n }),\n );\n }\n });\n\n shadow.addEventListener(\"sidebar-pages-visibility-change\", (event: Event) => {\n const hidden = Boolean((event as CustomEvent).detail?.hidden);\n setPagesSidebarHidden(shadow, shadowClaw, oStore, db, hidden);\n });\n\n shadow.addEventListener(\"sidebar-chat-visibility-change\", (event: Event) => {\n const hidden = Boolean((event as CustomEvent).detail?.hidden);\n setSidebarNavHidden(shadow, shadowClaw, oStore, db, \"chat\", hidden);\n });\n\n shadow.addEventListener(\"sidebar-tasks-visibility-change\", (event: Event) => {\n const hidden = Boolean((event as CustomEvent).detail?.hidden);\n setSidebarNavHidden(shadow, shadowClaw, oStore, db, \"tasks\", hidden);\n });\n\n shadow.addEventListener(\"sidebar-files-visibility-change\", (event: Event) => {\n const hidden = Boolean((event as CustomEvent).detail?.hidden);\n setSidebarNavHidden(shadow, shadowClaw, oStore, db, \"files\", hidden);\n });\n\n shadow.addEventListener(\"chat-split-view-change\", (event: Event) => {\n const enabled = Boolean((event as CustomEvent).detail?.enabled);\n shadowClaw.chatSplitViewEnabled = enabled;\n showPage(shadow, shadowClaw, db, oStore, shadowClaw.currentPage, false);\n });\n\n // Tools / Channels page \"Back to Settings\" navigation\n shadow.addEventListener(\"navigate-back\", () =>\n doc.dispatchEvent(\n new CustomEvent(\"shadow-claw-navigate\", {\n detail: { page: \"settings\" },\n bubbles: true,\n composed: true,\n }),\n ),\n );\n\n // Theme toggle\n const themeToggle = shadow.querySelector(\".theme-mode-toggle\");\n if (themeToggle) {\n themeToggle.addEventListener(\"click\", () => {\n const { resolved } = tStore.getTheme();\n\n const newTheme = resolved === Themes.Dark ? Themes.Light : Themes.Dark;\n tStore.setTheme(newTheme);\n });\n }\n\n shadow\n .querySelector(\".webvm-toggle\")\n ?.addEventListener(\"click\", () =>\n toggleTerminalVisibility(shadow, shadowClaw),\n );\n\n shadow.addEventListener(\"shadow-claw-terminal-slot-ready\", () => {\n scheduleTerminalPlacement(\n shadow,\n shadowClaw.currentPage,\n shadowClaw.terminalElement,\n shadowClaw.terminalVisible,\n shadowClaw.terminalPlacementFrame,\n );\n\n syncPageHeaderMainVisibilityOverride(\n shadow,\n shadowClaw.headerMainCollapsedOverride,\n );\n\n updateHeaderMainToggle(shadow, shadowClaw.headerMainCollapsedOverride);\n });\n\n win.addEventListener(\"resize\", () => {\n if (shadowClaw.headerMainCollapsedOverride === null) {\n updateHeaderMainToggle(shadow, shadowClaw.headerMainCollapsedOverride);\n }\n });\n\n doc.addEventListener(\"shadow-claw-navigate\", shadowClaw.shadowClawNav);\n\n if (supportsNavigationApi()) {\n const nav = (win as any).navigation;\n nav.addEventListener(\"navigate\", shadowClaw.handleNavigationApiNavigate);\n\n shadowClaw.navigationListenerAttached = true;\n } else {\n shadowClaw.popstateListener = () => {\n applyRouteFromCurrentLocation(\n shadow,\n shadowClaw,\n db,\n fStore,\n oStore,\n new URL(win.location.href),\n );\n };\n win.addEventListener(\"popstate\", shadowClaw.popstateListener);\n\n doc.addEventListener(\"click\", shadowClaw.fallbackClickListener);\n\n shadowClaw.fallbackClickListenerAttached = true;\n }\n\n // Listen for theme changes to update icons and host class\n win.addEventListener(\"shadow-claw-theme-change\", (e: Event) => {\n const theme = (e as CustomEvent).detail.theme;\n updateThemeIcons(shadow, theme);\n updateHostTheme(theme, shadowClaw.classList);\n });\n\n // Listen for PeerJS connection errors\n win.addEventListener(\"shadow-claw-peer-error\", (e: Event) => {\n const detail = (e as CustomEvent).detail;\n const remotePeerId = detail.remotePeerId;\n const errorMessage = detail.error;\n\n const title = \"Peer Connection Error\";\n const message = remotePeerId\n ? `Failed to communicate with peer ${remotePeerId}: ${errorMessage}`\n : `PeerJS error: ${errorMessage}`;\n\n requestDialog(doc, shadow, {\n mode: \"info\",\n title,\n message,\n confirmLabel: \"Dismiss\",\n autoCloseSeconds: 30,\n });\n });\n\n // Initial state\n const currentTheme = tStore.resolved;\n updateThemeIcons(shadow, currentTheme);\n updateHostTheme(currentTheme, shadowClaw.classList);\n}\n","export const BOOT_PENDING_CLASS = \"sc-js-boot-pending\";\nexport const BOOT_PENDING_ATTR = \"data-js-boot-pending\";\nexport const HYDRATION_PENDING_ATTR = \"data-hydration-pending\";\n","import {\n BOOT_PENDING_ATTR,\n BOOT_PENDING_CLASS,\n HYDRATION_PENDING_ATTR,\n} from \"../constants.js\";\n\nexport function clearBootPendingClass(doc: Document): void {\n if (typeof doc === \"undefined\") {\n return;\n }\n\n doc.documentElement.classList.remove(\n BOOT_PENDING_CLASS,\n \"sc-prerender-override\",\n );\n const host = doc.querySelector(\"shadow-claw\");\n host?.removeAttribute(BOOT_PENDING_ATTR);\n host?.removeAttribute(HYDRATION_PENDING_ATTR);\n}\n","import { isPossibleAppRoute } from \"../../../core/app-routes.js\";\nimport type { ShadowClawDatabase } from \"../../../db/types.js\";\n\nexport function getRoute(db: ShadowClawDatabase, ev: Event) {\n if (!db) {\n return;\n }\n\n const navigateEvent = ev as any;\n if (navigateEvent.navigationType === \"reload\") {\n return;\n }\n\n const destinationUrl = navigateEvent?.destination?.url;\n if (typeof destinationUrl !== \"string\") {\n return;\n }\n\n const parsedUrl = new URL(destinationUrl);\n if (parsedUrl.origin !== window.location.origin) {\n return;\n }\n\n if (!isPossibleAppRoute(parsedUrl.pathname)) {\n return;\n }\n\n // We must return the URL and navigateEvent so the caller can lazily resolve\n return {\n parsedUrl,\n navigateEvent,\n };\n}\n","import { isPossibleAppRoute } from \"../../../core/app-routes.js\";\n\nexport function getTargetPath(loc: Location, ev: MouseEvent): string | null {\n // 1. Ignore modified clicks, non-left clicks, and canceled events\n if (\n ev.defaultPrevented ||\n ev.button !== 0 ||\n ev.metaKey ||\n ev.ctrlKey ||\n ev.shiftKey ||\n ev.altKey\n ) {\n return null;\n }\n\n // 2. Find the nearest HTMLAnchorElement in the event bubbling path\n const path = ev.composedPath();\n let link: HTMLAnchorElement | null = null;\n\n for (const el of path) {\n if (el instanceof HTMLAnchorElement) {\n link = el;\n\n break;\n }\n }\n\n // If no link was clicked, exit\n if (!link) {\n return null;\n }\n\n // 3. Ignore empty links or non-http protocols (js, mail, phone)\n const href = link.getAttribute(\"href\") || \"\";\n if (\n !href ||\n href.startsWith(\"javascript:\") ||\n href.startsWith(\"mailto:\") ||\n href.startsWith(\"tel:\")\n ) {\n return null;\n }\n\n // 4. Ignore external targets (like target=\"_blank\")\n if (link.target && link.target !== \"_self\") {\n return null;\n }\n\n // 5. Ignore completely external domains\n if (link.origin !== loc.origin) {\n return null;\n }\n\n // 6. Ignore same-origin links that are not possible app routes (e.g. separate deployments)\n if (!isPossibleAppRoute(link.pathname)) {\n return null;\n }\n\n // 6. Ignore hash-only changes on the current page (let the browser handle anchor scrolling)\n if (\n link.pathname === loc.pathname &&\n link.search === loc.search &&\n link.hash !== loc.hash\n ) {\n return null;\n }\n\n // 7. Success: Intercept the native browser behavior and extract the route\n ev.preventDefault();\n\n return `${link.pathname}${link.search}${link.hash}`;\n}\n","export async function requestUserPrompt(\n doc: Document,\n shadow: ShadowRoot | null,\n options: {\n question: string;\n options?: string[];\n },\n): Promise<string | null> {\n if (!shadow) {\n return null;\n }\n\n const dialog = shadow.querySelector(\n \".app-prompt-dialog\",\n ) as HTMLDialogElement | null;\n const messageEl = shadow.querySelector(\n \".app-prompt-dialog__message\",\n ) as HTMLElement | null;\n const inputAreaEl = shadow.querySelector(\n \".app-prompt-dialog__input-area\",\n ) as HTMLElement | null;\n\n if (!dialog || !messageEl || !inputAreaEl) {\n return null;\n }\n\n if (dialog.open) {\n dialog.close();\n }\n\n messageEl.textContent = options.question;\n inputAreaEl.replaceChildren();\n\n if (Array.isArray(options.options) && options.options.length > 0) {\n const select = doc.createElement(\"select\");\n select.className = \"app-prompt-dialog__input\";\n select.name = \"prompt-response\";\n for (const opt of options.options) {\n const optionEl = doc.createElement(\"option\");\n optionEl.value = opt;\n optionEl.textContent = opt;\n\n select.appendChild(optionEl);\n }\n\n inputAreaEl.appendChild(select);\n } else {\n const input = doc.createElement(\"input\");\n input.type = \"text\";\n input.className = \"app-prompt-dialog__input\";\n input.name = \"prompt-response\";\n input.placeholder = \"Enter your response...\";\n input.autocomplete = \"off\";\n\n inputAreaEl.appendChild(input);\n\n // Optional: focus after modal is shown\n setTimeout(() => input.focus(), 50);\n }\n\n dialog.returnValue = \"\";\n\n return await new Promise<string | null>((resolve) => {\n const onClose = () => {\n dialog.removeEventListener(\"close\", onClose);\n if (dialog.returnValue === \"submit\") {\n const inputEl = inputAreaEl.querySelector(\n \"[name='prompt-response']\",\n ) as HTMLInputElement | HTMLSelectElement;\n resolve(inputEl ? inputEl.value : null);\n } else {\n resolve(null);\n }\n };\n\n dialog.addEventListener(\"close\", onClose);\n dialog.showModal();\n });\n}\n","import { answerUserPrompt } from \"../../../core/orchestrator/utils/operations/vm.js\";\nimport { requestUserPrompt } from \"./requestUserPrompt.js\";\n\ninterface AskUserContext {\n orchestrator: any;\n}\n\nexport async function handleOrchestratorAskUser(\n doc: Document,\n shadow: ShadowRoot | null,\n shadowClaw: AskUserContext,\n payload: {\n id: string;\n groupId: string;\n question: string;\n options?: string[];\n },\n) {\n const response = await requestUserPrompt(doc, shadow, payload);\n\n answerUserPrompt(shadowClaw.orchestrator, payload.id, response);\n}\n","import { OpenFilePayload } from \"../../../subsystems/worker/types.js\";\nimport { showError } from \"../../../ui/toast.js\";\n\nimport type { ShadowClawDatabase } from \"../../../db/types.js\";\nimport type { FileViewerStore } from \"../../../stores/file-viewer.js\";\nimport type { OrchestratorStore } from \"../../../stores/orchestrator.js\";\n\nexport async function handleOrchestratorOpenFile(\n db: ShadowClawDatabase,\n oStore: OrchestratorStore,\n fStore: FileViewerStore,\n payload: OpenFilePayload,\n) {\n const path = payload.path;\n const groupId = payload.groupId || oStore.activeGroupId;\n const maxRetries = 3;\n\n if (!path || !db) {\n return;\n }\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n await fStore.openFile(db, path, groupId);\n\n return;\n } catch (err) {\n const isNotFound =\n err instanceof DOMException && err.name === \"NotFoundError\";\n\n if (attempt < maxRetries && isNotFound) {\n await new Promise((r) => setTimeout(r, 150 * (attempt + 1)));\n\n continue;\n }\n\n const message = err instanceof Error ? err.message : String(err);\n showError(`Failed to open file from tool: ${message}`, 5000);\n\n return;\n }\n }\n}\n","import { requestDialog } from \"./requestDialog.js\";\n\nimport { buildLlamafileHelpDialogOptions } from \"../../common/help/llamafile.js\";\nimport { buildPromptApiHelpDialogOptions } from \"../../common/help/prompt-api.js\";\nimport { buildProviderHelpDialogOptions } from \"../../common/help/providers.js\";\nimport { buildTransformersJsHelpDialogOptions } from \"../../common/help/transformers.js\";\n\nimport type { ProviderHelpType } from \"../../types.js\";\n\nexport async function handleOrchestratorProviderHelp(\n doc: Document,\n shadow: ShadowRoot | null,\n payload: {\n providerId: string;\n reason?: string;\n helpType?: ProviderHelpType;\n },\n) {\n if (payload?.providerId === \"llamafile\") {\n await requestDialog(\n doc,\n shadow,\n buildLlamafileHelpDialogOptions(payload.reason),\n );\n } else if (payload?.providerId === \"transformers_js_local\") {\n await requestDialog(\n doc,\n shadow,\n buildTransformersJsHelpDialogOptions(payload.reason),\n );\n } else if (payload?.providerId === \"prompt_api\") {\n await requestDialog(\n doc,\n shadow,\n buildPromptApiHelpDialogOptions(payload.reason),\n );\n } else if (payload?.providerId && payload.helpType) {\n await requestDialog(\n doc,\n shadow,\n buildProviderHelpDialogOptions(\n payload.providerId,\n payload.helpType,\n payload.reason,\n ),\n );\n }\n}\n","import { joinRoomViaLink } from \"../../../core/orchestrator/utils/operations/room.js\";\nimport { RoomInvitePayload } from \"../../../subsystems/channels/peer-protocol.js\";\nimport { showError, showSuccess } from \"../../../ui/toast.js\";\nimport { requestDialog } from \"./requestDialog.js\";\nimport { showPage } from \"./showPage.js\";\n\nimport type { ShadowClawDatabase } from \"../../../db/types.js\";\nimport type { OrchestratorStore } from \"../../../stores/orchestrator.js\";\nimport type { ShowPageContext } from \"./showPage.js\";\n\ninterface RoomInviteContext extends ShowPageContext {\n orchestrator: any;\n}\n\nexport async function handleOrchestratorRoomInvite(\n doc: Document,\n shadow: ShadowRoot | null,\n shadowClaw: RoomInviteContext,\n db: ShadowClawDatabase | undefined,\n oStore: OrchestratorStore,\n invite: RoomInvitePayload | undefined,\n) {\n if (!db || !invite?.roomId || !invite?.hostPeerId) {\n return;\n }\n\n const from = invite.fromAlias || invite.fromPeerId;\n const accepted = await requestDialog(doc, shadow, {\n mode: \"confirm\",\n title: \"Room invitation\",\n message: `${from} invited you to join \"${invite.roomName}\".`,\n confirmLabel: \"Join\",\n cancelLabel: \"Decline\",\n });\n\n if (!accepted) {\n return;\n }\n\n try {\n joinRoomViaLink(\n shadowClaw.orchestrator,\n invite.roomId,\n invite.hostPeerId,\n invite.roomName,\n );\n\n await oStore.switchConversation(db, `room:${invite.roomId}`);\n\n showPage(shadow, shadowClaw, db, oStore, \"chat\");\n showSuccess(`Joined room \"${invite.roomName}\"`);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n showError(`Failed to join room: ${message}`, 6000);\n }\n}\n","export function historyState(history: History, finalPath: string, options) {\n const finalPathWithSlash =\n options.useTrailingSlash && !finalPath.includes(\"#\")\n ? finalPath.endsWith(\"/\")\n ? finalPath\n : finalPath + \"/\"\n : finalPath;\n\n if (options.replace) {\n history.replaceState({}, \"\", finalPathWithSlash);\n } else {\n history.pushState({}, \"\", finalPathWithSlash);\n }\n}\n","import { applyBasePath, buildRoutePath } from \"../../../core/app-routes.js\";\nimport { applyRoute } from \"./applyRoute.js\";\nimport { historyState } from \"./historyState.js\";\nimport { supportsNavigationApi } from \"./supportsNavigationApi.js\";\n\nimport type { ShadowClawAppRoute } from \"../../../core/app-routes.js\";\nimport type { ShadowClawDatabase } from \"../../../db/types.js\";\nimport type { FileViewerStore } from \"../../../stores/file-viewer.js\";\nimport type { OrchestratorStore } from \"../../../stores/orchestrator.js\";\nimport type { ShadowClaw } from \"../shadow-claw.js\";\n\nexport async function navigateToRoute(\n shadow: ShadowRoot,\n shadowClaw: ShadowClaw,\n db: ShadowClawDatabase,\n fStore: FileViewerStore,\n oStore: OrchestratorStore,\n route: ShadowClawAppRoute,\n options: { replace?: boolean } = { replace: false },\n): Promise<void> {\n const targetPath = buildRoutePath(route);\n const finalPath = applyBasePath(targetPath);\n\n if (supportsNavigationApi()) {\n const nav = (window as any).navigation;\n\n nav.navigate(finalPath, {\n history: options.replace ? \"replace\" : \"push\",\n });\n\n return;\n }\n\n if (finalPath !== window.location.pathname) {\n historyState(globalThis.history, finalPath, {\n ...options,\n useTrailingSlash: false,\n });\n }\n\n await applyRoute(shadow, shadowClaw, db, fStore, oStore, route);\n}\n","import type { ShadowClawAppRoute } from \"../../../core/app-routes.js\";\n\nexport function normalizePageRoute(page: string): ShadowClawAppRoute[\"page\"] {\n const normalized = String(page || \"chat\").toLowerCase();\n\n if (\n normalized === \"chat\" ||\n normalized === \"files\" ||\n normalized === \"tasks\" ||\n normalized === \"pages\" ||\n normalized === \"settings\" ||\n normalized === \"tools\" ||\n normalized === \"channels\"\n ) {\n return normalized;\n }\n\n return \"chat\";\n}\n","import { navigateToRoute } from \"./navigateToRoute.js\";\nimport { normalizePageRoute } from \"./normalizePageRoute.js\";\n\nimport type { ShadowClawDatabase } from \"../../../db/types.js\";\nimport type { FileViewerStore } from \"../../../stores/file-viewer.js\";\nimport type { OrchestratorStore } from \"../../../stores/orchestrator.js\";\nimport type { ShadowClawNavigateDetail } from \"../../../utils/utils.js\";\nimport type { ShadowClaw } from \"../shadow-claw.js\";\n\nexport async function handleShadowClawNavigate(\n shadow: ShadowRoot,\n shadowClaw: ShadowClaw,\n db: ShadowClawDatabase,\n fStore: FileViewerStore,\n oStore: OrchestratorStore,\n event: Event,\n) {\n const customEvent = event as CustomEvent<ShadowClawNavigateDetail>;\n const detail = customEvent.detail;\n if (!detail) {\n return;\n }\n\n await navigateToRoute(shadow, shadowClaw, db, fStore, oStore, {\n page: normalizePageRoute(String(detail.page || \"chat\")),\n groupId: detail.groupId,\n path: detail.path,\n anchor: detail.anchor,\n });\n}\n","import { loadAllSidebarVisibilityPreferences } from \"./sidebarVisibility.js\";\n\nimport type { ShadowClawDatabase } from \"../../../db/types.js\";\nimport type { OrchestratorStore } from \"../../../stores/orchestrator.js\";\nimport type { ShadowClaw } from \"../shadow-claw.js\";\n\nexport async function loadPagesSidebarVisibilityPreference(\n shadow: ShadowRoot | null,\n shadowClaw: ShadowClaw,\n oStore: OrchestratorStore,\n db: ShadowClawDatabase,\n): Promise<void> {\n await loadAllSidebarVisibilityPreferences(shadow, shadowClaw, oStore, db);\n}\n","import { configurePeerJs } from \"../../../core/orchestrator/utils/configurePeerJs.js\";\n\nimport {\n getPeerJsConfig,\n setChannelEnabled,\n} from \"../../../core/orchestrator/utils/operations/channel.js\";\n\nimport { orchestratorStore } from \"../../../stores/orchestrator.js\";\nimport { showError, showSuccess } from \"../../../ui/toast.js\";\nimport { ulid } from \"../../../utils/ulid.js\";\nimport { showPage } from \"../utils/showPage.js\";\n\nimport type { Orchestrator } from \"../../../core/orchestrator/orchestrator.js\";\nimport type { ShadowClawDatabase } from \"../../../db/db.js\";\nimport type { ShadowClaw } from \"../shadow-claw.js\";\n\nexport async function processPeerQueryParam(\n shadow: ShadowRoot,\n shadowClaw: ShadowClaw,\n db: ShadowClawDatabase | null,\n orchestrator: Orchestrator,\n): Promise<void> {\n if (!db) {\n return;\n }\n\n const currentUrl = new URL(window.location?.href || \"http://localhost/\");\n const peerParam = currentUrl.searchParams.get(\"peer\");\n if (!peerParam) {\n return;\n }\n\n const remotePeerId = peerParam.trim();\n if (!remotePeerId) {\n return;\n }\n\n try {\n // 1. Ensure PeerJS channel is enabled and configured\n const cfg = getPeerJsConfig(orchestrator);\n let myPeerId = cfg.myPeerId;\n if (!myPeerId) {\n myPeerId = ulid().toLowerCase();\n }\n\n // Automatically trust the remote peer we are connecting to\n const trusted = new Set(cfg.trustedPeerIds);\n trusted.add(remotePeerId);\n\n // Save/configure\n await configurePeerJs(\n orchestrator,\n db,\n myPeerId,\n Array.from(trusted),\n cfg.serverHost,\n cfg.serverPort,\n cfg.serverPath,\n cfg.serverSecure,\n );\n\n if (!cfg.enabled) {\n await setChannelEnabled(orchestrator, db, \"peerjs\", true);\n }\n\n // 2. Ensure peer conversation exists in the list\n const targetGroupId = await orchestratorStore.ensurePeerConversation(\n db,\n remotePeerId,\n );\n\n // 3. Switch conversation and navigate to chat\n await orchestratorStore.switchConversation(db, targetGroupId);\n showPage(shadow, shadowClaw, db, orchestratorStore, \"chat\");\n\n // 4. Remove 'peer' from URL params to prevent re-triggering\n currentUrl.searchParams.delete(\"peer\");\n const cleaned = `${currentUrl.pathname}${currentUrl.search}${currentUrl.hash}`;\n window.history.replaceState({}, \"\", cleaned || \"/\");\n\n showSuccess(`Connected to Peer: ${remotePeerId.substring(0, 8)}`);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n showError(`Failed to process peer parameter: ${message}`, 6000);\n }\n}\n","import type { ShadowClawDatabase } from \"../db/types.js\";\n\nconst PENDING_SHARES_STORE = \"pendingShares\";\n\nexport interface PendingShareRecord {\n id: string;\n createdAt: number;\n title: string;\n text: string;\n url: string;\n fileName: string;\n fileType: string;\n fileBytes: ArrayBuffer | null;\n}\n\nfunction normalizeRecord(raw: any): PendingShareRecord {\n return {\n id: typeof raw?.id === \"string\" ? raw.id : \"\",\n createdAt: typeof raw?.createdAt === \"number\" ? raw.createdAt : 0,\n title: typeof raw?.title === \"string\" ? raw.title : \"\",\n text: typeof raw?.text === \"string\" ? raw.text : \"\",\n url: typeof raw?.url === \"string\" ? raw.url : \"\",\n fileName: typeof raw?.fileName === \"string\" ? raw.fileName : \"\",\n fileType: typeof raw?.fileType === \"string\" ? raw.fileType : \"\",\n fileBytes: raw?.fileBytes instanceof ArrayBuffer ? raw.fileBytes : null,\n };\n}\n\n/**\n * Read and clear pending Web Share Target payloads in FIFO order.\n */\nexport async function consumePendingShares(\n db: ShadowClawDatabase,\n): Promise<PendingShareRecord[]> {\n if (!db || typeof (db as any).transaction !== \"function\") {\n return [];\n }\n\n return new Promise((resolve, reject) => {\n let tx: IDBTransaction;\n\n try {\n tx = db.transaction(PENDING_SHARES_STORE, \"readwrite\");\n } catch (error) {\n if (error instanceof DOMException && error.name === \"NotFoundError\") {\n resolve([]);\n\n return;\n }\n\n reject(error);\n\n return;\n }\n\n const store = tx.objectStore(PENDING_SHARES_STORE);\n const getAllRequest = store.getAll();\n\n getAllRequest.onerror = () => {\n reject(getAllRequest.error || new Error(\"Failed to read pending shares\"));\n };\n\n getAllRequest.onsuccess = () => {\n const rows = Array.isArray(getAllRequest.result)\n ? getAllRequest.result\n .map(normalizeRecord)\n .filter(\n (record) => typeof record.id === \"string\" && record.id.length > 0,\n )\n .sort((a, b) => a.createdAt - b.createdAt)\n : [];\n\n const clearRequest = store.clear();\n clearRequest.onerror = () => {\n reject(\n clearRequest.error || new Error(\"Failed to clear pending shares\"),\n );\n };\n\n clearRequest.onsuccess = () => {\n resolve(rows);\n };\n };\n\n tx.onabort = () => {\n reject(tx.error || new Error(\"Pending share transaction aborted\"));\n };\n });\n}\n","export function buildSharedTextPayload(share: {\n title: string;\n text: string;\n url: string;\n}): string {\n const lines: string[] = [\"# Shared Content\", \"\"];\n\n if (share.title) {\n lines.push(`Title: ${share.title}`);\n }\n\n if (share.url) {\n lines.push(`URL: ${share.url}`);\n }\n\n if (share.text) {\n lines.push(\"\", share.text);\n }\n\n return lines.join(\"\\n\").trim() + \"\\n\";\n}\n","import type { ShadowClawDatabase } from \"../../../db/db.js\";\nimport type { OrchestratorStore } from \"../../../stores/orchestrator.js\";\n\nexport async function resolveSharedFilesConversationId(\n db: ShadowClawDatabase,\n oStore: OrchestratorStore,\n): Promise<string> {\n const now = new Date();\n const year = String(now.getFullYear());\n const month = String(now.getMonth() + 1).padStart(2, \"0\");\n const day = String(now.getDate()).padStart(2, \"0\");\n const isoDate = `${year}-${month}-${day}`;\n const conversationName = `Shared Files ${isoDate}`;\n const existing = oStore.groups.find(\n (group) => group.name === conversationName,\n );\n\n if (existing) {\n await oStore.switchConversation(db, existing.groupId);\n\n return existing.groupId;\n }\n\n const group = await oStore.createConversation(db, conversationName);\n\n return group.groupId;\n}\n","export function sanitizeSharedFileName(\n name: string,\n fallbackBase: string,\n): string {\n const normalized =\n name.replace(/\\\\/g, \"/\").split(\"/\").filter(Boolean).pop() || \"\";\n\n const collapsed = normalized\n .replace(/\\s+/g, \"-\")\n .replace(/[^A-Za-z0-9._-]/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n\n if (collapsed) {\n return collapsed;\n }\n\n return `${fallbackBase}.txt`;\n}\n","import { consumePendingShares } from \"../../../share-target/pending-shares.js\";\nimport { writeGroupFile } from \"../../../storage/writeGroupFile.js\";\nimport { writeGroupFileBytes } from \"../../../storage/writeGroupFileBytes.js\";\nimport { showError, showSuccess } from \"../../../ui/toast.js\";\nimport { buildSharedTextPayload } from \"./buildSharedTextPayload.js\";\nimport { resolveSharedFilesConversationId } from \"./resolveSharedFilesConversationId.js\";\nimport { sanitizeSharedFileName } from \"./sanitizeSharedFileName.js\";\nimport { showPage } from \"./showPage.js\";\n\nimport type { ShadowClawDatabase } from \"../../../db/types.js\";\nimport type { FileViewerStore } from \"../../../stores/file-viewer.js\";\nimport type { OrchestratorStore } from \"../../../stores/orchestrator.js\";\nimport type { ShadowClaw } from \"../shadow-claw.js\";\n\nexport async function processPendingSharedPayloads(\n win: Window,\n shadow: ShadowRoot | null,\n shadowClaw: ShadowClaw,\n oStore: OrchestratorStore,\n fStore: FileViewerStore,\n db: ShadowClawDatabase,\n url: URL,\n): Promise<void> {\n if (!db) {\n return;\n }\n\n const pendingShares = await consumePendingShares(db);\n if (pendingShares.length === 0) {\n return;\n }\n\n try {\n const targetGroupId = await resolveSharedFilesConversationId(db, oStore);\n const savedPaths: string[] = [];\n\n for (let i = 0; i < pendingShares.length; i++) {\n const share = pendingShares[i];\n const baseName = `shared-${Date.now()}-${i + 1}`;\n\n if (share.fileBytes instanceof ArrayBuffer) {\n const preferredName =\n share.fileName ||\n (share.fileType === \"application/pdf\"\n ? `${baseName}.pdf`\n : `${baseName}.bin`);\n const fileName = sanitizeSharedFileName(preferredName, baseName);\n\n await writeGroupFileBytes(\n db,\n targetGroupId,\n fileName,\n new Uint8Array(share.fileBytes),\n );\n savedPaths.push(fileName);\n\n continue;\n }\n\n const textFileName = sanitizeSharedFileName(\n share.fileName || `${baseName}.md`,\n baseName,\n );\n const textPayload = buildSharedTextPayload(share);\n await writeGroupFile(db, targetGroupId, textFileName, textPayload);\n savedPaths.push(textFileName);\n }\n\n await oStore.loadFiles(db);\n showPage(shadow, shadowClaw, db, oStore, \"files\");\n\n if (savedPaths.length > 0) {\n await fStore.openFile(db, savedPaths[0], targetGroupId);\n }\n\n showSuccess(\n `Imported ${savedPaths.length} shared item${savedPaths.length === 1 ? \"\" : \"s\"}.`,\n );\n\n const currentUrl = url;\n if (currentUrl.searchParams.has(\"share-target\")) {\n currentUrl.searchParams.delete(\"share-target\");\n const cleaned = `${currentUrl.pathname}${currentUrl.search}${currentUrl.hash}`;\n win.history.replaceState({}, \"\", cleaned || \"/\");\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n showError(`Failed to import shared content: ${message}`, 6000);\n }\n}\n","import { configurePeerJs } from \"../../../core/orchestrator/utils/configurePeerJs.js\";\nimport {\n getPeerJsConfig,\n setChannelEnabled,\n} from \"../../../core/orchestrator/utils/operations/channel.js\";\nimport { joinRoomViaLink } from \"../../../core/orchestrator/utils/operations/room.js\";\nimport { showError, showSuccess } from \"../../../ui/toast.js\";\nimport { ulid } from \"../../../utils/ulid.js\";\nimport { showPage } from \"./showPage.js\";\n\nimport type { Orchestrator } from \"../../../core/orchestrator/orchestrator.js\";\nimport type { ShadowClawDatabase } from \"../../../db/types.js\";\nimport type { OrchestratorStore } from \"../../../stores/orchestrator.js\";\nimport type { ShadowClaw } from \"../shadow-claw.js\";\n\nexport async function processRoomQueryParam(\n win: Window,\n shadow: ShadowRoot | null,\n shadowClaw: ShadowClaw,\n db: ShadowClawDatabase,\n orchestrator: Orchestrator,\n oStore: OrchestratorStore,\n): Promise<void> {\n if (!db) {\n return;\n }\n\n const currentUrl = new URL(window.location?.href || \"http://localhost/\");\n const roomId = (currentUrl.searchParams.get(\"room\") || \"\").trim();\n const hostPeerId = (currentUrl.searchParams.get(\"host\") || \"\").trim();\n const roomName = (currentUrl.searchParams.get(\"name\") || \"\").trim() || \"Room\";\n\n if (!roomId || !hostPeerId) {\n return;\n }\n\n try {\n // 1. Ensure PeerJS channel is enabled and the host is trusted\n const cfg = getPeerJsConfig(orchestrator);\n let myPeerId = cfg.myPeerId;\n if (!myPeerId) {\n myPeerId = ulid().toLowerCase();\n }\n\n const trusted = new Set(cfg.trustedPeerIds);\n trusted.add(hostPeerId);\n\n await configurePeerJs(\n orchestrator,\n db,\n myPeerId,\n Array.from(trusted),\n cfg.serverHost,\n cfg.serverPort,\n cfg.serverPath,\n cfg.serverSecure,\n );\n\n if (!cfg.enabled) {\n await setChannelEnabled(orchestrator, db, \"peerjs\", true);\n }\n\n // 2. Join the room (connects to host + announces membership)\n joinRoomViaLink(orchestrator, roomId, hostPeerId, roomName);\n\n // 3. Navigate to the room conversation\n await oStore.switchConversation(db, `room:${roomId}`);\n showPage(shadow, shadowClaw, db, oStore, \"chat\");\n\n // 4. Clean the URL to prevent re-triggering\n currentUrl.searchParams.delete(\"room\");\n currentUrl.searchParams.delete(\"host\");\n currentUrl.searchParams.delete(\"name\");\n const cleaned = `${currentUrl.pathname}${currentUrl.search}${currentUrl.hash}`;\n win.history.replaceState({}, \"\", cleaned || \"/\");\n\n showSuccess(`Joined room \"${roomName}\"`);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n showError(`Failed to join room: ${message}`, 6000);\n }\n}\n","import { effect } from \"../../../core/effect.js\";\n\nimport { showSuccess } from \"../../../ui/toast.js\";\nimport { showPage } from \"./showPage.js\";\nimport { updateActivityLogToggleVisibility } from \"./updateActivityLogToggleVisibility.js\";\nimport { ensureComponentLoaded } from \"./loadComponent.js\";\nimport { fileViewerStore } from \"../../../stores/file-viewer.js\";\n\nimport type { ShadowClawDatabase } from \"../../../db/types.js\";\nimport type { OrchestratorStore } from \"../../../stores/orchestrator.js\";\nimport type { ShadowClaw } from \"../shadow-claw.js\";\n\nexport function setupEffects(\n shadow: ShadowRoot | null,\n shadowClaw: ShadowClaw,\n db: ShadowClawDatabase,\n oStore: OrchestratorStore,\n) {\n if (!shadow) {\n return;\n }\n\n // React to file viewer state to lazily load and stamp viewer components\n effect(() => {\n const file = fileViewerStore.file;\n if (file) {\n ensureComponentLoaded(\"file-viewer\")\n .then(() => {\n // Stamp the file-viewer element into the DOM on first use if it\n // was not pre-stamped in the static template.\n if (shadow && !shadow.querySelector(\"shadow-claw-file-viewer\")) {\n const main = shadow.querySelector(\".main-content\");\n if (main) {\n const viewer = document.createElement(\"shadow-claw-file-viewer\");\n viewer.id = \"file-viewer\";\n main.appendChild(viewer);\n }\n }\n })\n .catch(console.error);\n\n if (file.kind === \"pdf\") {\n ensureComponentLoaded(\"pdf-viewer\").catch(console.error);\n }\n }\n });\n\n // React to orchestrator state for completion notifications\n effect(() => {\n const state = oStore.state;\n\n if (\n state === \"idle\" &&\n (shadowClaw.previousOrchestratorState === \"thinking\" ||\n shadowClaw.previousOrchestratorState === \"responding\")\n ) {\n showSuccess(\"Response complete\", 2500);\n }\n\n shadowClaw.previousOrchestratorState = state;\n });\n\n // React to page changes from store\n effect(() => {\n const page = oStore.activePage;\n if (page !== shadowClaw.currentPage) {\n showPage(shadow, shadowClaw, db, oStore, page, false);\n }\n });\n\n // React to activityLog changes to show/hide the activity-log-toggle button.\n effect(() => {\n void oStore.activityLog; // track signal read\n updateActivityLogToggleVisibility(\n shadow,\n shadowClaw.currentPage,\n oStore.activityLog.length,\n );\n });\n}\n","import type { Orchestrator } from \"../../core/orchestrator/orchestrator.js\";\n\nimport { ShadowClawDatabase, setDB } from \"../../db/db.js\";\n\nimport { VMStatus } from \"../../shell/vm.js\";\n\nimport { fileViewerStore } from \"../../stores/file-viewer.js\";\n\nimport {\n OrchestratorDisplayState,\n orchestratorStore,\n} from \"../../stores/orchestrator.js\";\n\nimport { themeStore } from \"../../stores/theme.js\";\n\nimport { applyRoute } from \"./utils/applyRoute.js\";\nimport { applyRouteFromCurrentLocation } from \"./utils/applyRouteFromCurrentLocation.js\";\nimport { bindEventListeners } from \"./utils/bindEventListeners.js\";\nimport { clearBootPendingClass } from \"../../core/utils/clearBootPendingClass.js\";\nimport { getDefaultSidebarPage } from \"./utils/getDefaultSidebarPage.js\";\nimport { getRoute } from \"./utils/getRoute.js\";\nimport { getTargetPath } from \"./utils/getTargetPath.js\";\nimport { handleOrchestratorAskUser } from \"./utils/handleOrchestratorAskUser.js\";\nimport { handleOrchestratorOpenFile } from \"./utils/handleOrchestratorOpenFile.js\";\nimport { handleOrchestratorProviderHelp } from \"./utils/handleOrchestratorProviderHelp.js\";\nimport { handleOrchestratorRoomInvite } from \"./utils/handleOrchestratorRoomInvite.js\";\nimport { handleShadowClawNavigate } from \"./utils/handleShadowClawNavigate.js\";\nimport { historyState } from \"./utils/historyState.js\";\nimport { loadPagesSidebarVisibilityPreference } from \"./utils/loadPagesSidebarVisibilityPreference.js\";\nimport { processPeerQueryParam } from \"./utils/processPeerQueryParam.js\";\nimport { processPendingSharedPayloads } from \"./utils/processPendingSharedPayloads.js\";\nimport { processRoomQueryParam } from \"./utils/processRoomQueryParam.js\";\nimport { requestDialog } from \"./utils/requestDialog.js\";\nimport { scheduleTerminalPlacement } from \"./utils/scheduleTerminalPlacement.js\";\nimport { setupEffects } from \"./utils/setupEffects.js\";\nimport { showPage } from \"./utils/showPage.js\";\nimport { syncPageHeaderMainVisibilityOverride } from \"./utils/syncPageHeaderMainVisibilityOverride.js\";\nimport { updateActivityLogToggleVisibility } from \"./utils/updateActivityLogToggleVisibility.js\";\nimport { updateHeaderMainToggle } from \"./utils/updateHeaderMainToggle.js\";\nimport { updateTerminalToggle } from \"./utils/updateTerminalToggle.js\";\n\nimport type { RoomInvitePayload } from \"../../subsystems/channels/peer-protocol.js\";\nimport type { OpenFilePayload } from \"../../subsystems/worker/types.js\";\nimport type { AppDialogOptions } from \"../../ui/types.js\";\nimport type { ShadowClawTerminal } from \"../shadow-claw-terminal/shadow-claw-terminal.js\";\nimport type { ProviderHelpType } from \"../types.js\";\n\nimport ShadowClawElement from \"../shadow-claw-element.js\";\n\nexport {\n DEFAULT_SIDEBAR_WIDTH_PX,\n MIN_SIDEBAR_WIDTH_PX,\n MAX_SIDEBAR_WIDTH_PX,\n} from \"./constants.js\";\n\nimport shadowClawStyles from \"./shadow-claw.css\" with { type: \"css\" };\nimport shadowClawTemplate from \"./shadow-claw.html\" with { type: \"html\" };\n\nconst elementName = \"shadow-claw\";\n\nexport class ShadowClaw extends ShadowClawElement {\n static styles = shadowClawStyles;\n static template = shadowClawTemplate;\n\n activityLogCollapsedOverride: boolean | null = null;\n chatSidebarHidden: boolean = false;\n chatSplitViewEnabled: boolean = false;\n currentPage: string = orchestratorStore.sidebarDefaultPage;\n db: ShadowClawDatabase | null = null;\n fallbackClickListenerAttached: boolean = false;\n filesSidebarHidden: boolean = false;\n headerMainCollapsedOverride: boolean | null = null;\n navigationListenerAttached: boolean = false;\n orchestrator!: Orchestrator;\n pagesSidebarHidden: boolean = false;\n popstateListener: (() => void) | null = null;\n previousOrchestratorState: OrchestratorDisplayState = \"idle\";\n tasksSidebarHidden: boolean = false;\n terminalElement: ShadowClawTerminal | null = null;\n terminalPlacementFrame: number | null = null;\n terminalVisible: boolean = false;\n\n vmStatus: VMStatus = {\n ready: false,\n booting: false,\n bootAttempted: false,\n error: null,\n };\n\n vmStatusCleanup: (() => void) | null = null;\n\n constructor() {\n super();\n }\n\n async connectedCallback() {\n const root = this.shadowRoot;\n if (!root) {\n throw new Error(\"shadowRoot not found\");\n }\n\n try {\n const { Orchestrator } =\n await import(\"../../core/orchestrator/orchestrator.js\");\n\n // Lazily load non-critical UI components to reduce initial JS execution\n Promise.all([\n import(\"../shadow-claw-conversations/shadow-claw-conversations.js\"),\n import(\"../shadow-claw-dialog/shadow-claw-dialog.js\"),\n import(\"../shadow-claw-toast/shadow-claw-toast.js\"),\n ]).catch(console.error);\n\n // Explicitly yield to the event loop to ensure Time to First Paint (TTFP)\n // fires before the heavy IndexedDB and Orchestrator init blocks the thread.\n await new Promise((resolve) => {\n if (\"requestIdleCallback\" in window) {\n (window as any).requestIdleCallback(() => resolve(null));\n } else {\n setTimeout(resolve, 0);\n }\n });\n\n if (!this.orchestrator) {\n this.orchestrator = new Orchestrator();\n }\n\n this.db = await this.orchestrator.init();\n\n // Initialize reactive app store wiring before child components rely on ready state.\n // We do this before setDB() so that components waiting on getDb() find a ready store.\n await orchestratorStore.init(this.db, this.orchestrator);\n setDB(this.db);\n\n await this.render();\n\n // Ensure initial route state matches persisted store state even when prerender\n // markup starts on a different page. On a fresh install (no persisted page),\n // trust the pre-rendered content instead of forcing to Chat — unless the\n // Pages sidebar is hidden, in which case we must redirect away from it.\n const isCurrentPageHidden =\n (orchestratorStore.activePage === \"pages\" && this.pagesSidebarHidden) ||\n (orchestratorStore.activePage === \"chat\" && this.chatSidebarHidden) ||\n (orchestratorStore.activePage === \"tasks\" && this.tasksSidebarHidden) ||\n (orchestratorStore.activePage === \"files\" && this.filesSidebarHidden);\n\n if (orchestratorStore.hadPersistedActivePage && !isCurrentPageHidden) {\n showPage(\n this.shadowRoot,\n this,\n this.db,\n orchestratorStore,\n orchestratorStore.activePage,\n false,\n );\n } else if (isCurrentPageHidden) {\n showPage(\n this.shadowRoot,\n this,\n this.db,\n orchestratorStore,\n getDefaultSidebarPage(orchestratorStore, this),\n false,\n );\n } else {\n showPage(\n this.shadowRoot,\n this,\n this.db,\n orchestratorStore,\n orchestratorStore.activePage,\n false,\n );\n }\n\n await applyRouteFromCurrentLocation(\n this.shadowRoot,\n this,\n this.db,\n fileViewerStore,\n orchestratorStore,\n new URL(window.location.href),\n );\n\n await processPeerQueryParam(\n this.shadowRoot,\n this,\n this.db,\n this.orchestrator,\n );\n\n await processRoomQueryParam(\n window,\n this.shadowRoot,\n this,\n this.db,\n this.orchestrator,\n orchestratorStore,\n );\n\n await processPendingSharedPayloads(\n window,\n this.shadowRoot,\n this,\n orchestratorStore,\n fileViewerStore,\n this.db,\n new URL(window.location.href),\n );\n\n console.log(\"ShadowClaw UI initialized\");\n\n // Ensure the active page's component is fully upgraded before revealing the host.\n // applyRouteFromCurrentLocation only awaits the component if the URL explicitly\n // matches its route. When the URL is `/`, the route parser returns null, so\n // applyRoute is skipped. Awaiting here guarantees we never reveal stale SSR\n // markup (like the default prerendered page) before the CSR component\n // takes over and clears it, even on root URL loads.\n if (typeof customElements !== \"undefined\") {\n await customElements.whenDefined(`shadow-claw-${this.currentPage}`);\n }\n\n const { isMemoryStorageFallbackActive } =\n await import(\"../../storage/memoryStorage.js\");\n if (isMemoryStorageFallbackActive()) {\n const { showWarning } = await import(\"../../ui/toast.js\");\n showWarning(\n \"Private Browsing / Limited Storage: Operating in temporary in-memory mode. Files and changes will not persist across page reloads.\",\n 7000,\n );\n }\n\n // Signal that the UI and initial routing are fully ready.\n // clearBootPendingClass is called immediately after setReady() so that\n // sc-prerender-override is removed only AFTER applyRouteFromCurrentLocation\n // has fully completed (including any await pagesComp.renderSelectedPage())\n // — eliminating the race where initializeApp's finally block would remove\n // the class while CSR content was still async-loading.\n orchestratorStore.setReady();\n } finally {\n // Always clear the boot-pending class so the app is never permanently\n // hidden behind sc-prerender-override, even if init throws.\n clearBootPendingClass(document);\n }\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n\n if (this.vmStatusCleanup) {\n this.vmStatusCleanup();\n this.vmStatusCleanup = null;\n }\n\n if (this.terminalPlacementFrame !== null) {\n cancelAnimationFrame(this.terminalPlacementFrame);\n this.terminalPlacementFrame = null;\n }\n\n document.removeEventListener(\"shadow-claw-navigate\", this.shadowClawNav);\n\n if (this.popstateListener) {\n window.removeEventListener(\"popstate\", this.popstateListener);\n this.popstateListener = null;\n }\n\n if (this.fallbackClickListenerAttached) {\n document.removeEventListener(\"click\", this.fallbackClickListener);\n this.fallbackClickListenerAttached = false;\n }\n\n if (this.navigationListenerAttached) {\n const nav = (window as any).navigation;\n if (nav && typeof nav.removeEventListener === \"function\") {\n nav.removeEventListener(\"navigate\", this.handleNavigationApiNavigate);\n }\n\n this.navigationListenerAttached = false;\n }\n }\n\n addCleanup(cb: () => void) {\n super.addCleanup(cb);\n }\n\n fallbackClickListener = (event: MouseEvent) => {\n if (typeof window === \"undefined\" || !window.location) {\n return;\n }\n\n const targetPath = getTargetPath(window.location, event);\n if (!targetPath) {\n return;\n }\n\n historyState(globalThis.history, targetPath, {\n replace: false,\n useTrailingSlash: false,\n });\n\n applyRouteFromCurrentLocation(\n this.shadowRoot,\n this,\n this.db,\n fileViewerStore,\n orchestratorStore,\n new URL(window.location.href),\n );\n };\n\n handleNavigationApiNavigate = (event: Event) => {\n const { parsedUrl, navigateEvent } = getRoute(this.db, event) ?? {};\n\n if (!parsedUrl || !navigateEvent) {\n return;\n }\n\n if (typeof navigateEvent.intercept === \"function\") {\n navigateEvent.intercept({\n handler: async () => {\n const { parseRouteFromUrlAsync } =\n await import(\"../../core/app-routes.js\");\n const asyncRoute = await parseRouteFromUrlAsync(\n parsedUrl,\n orchestratorStore.activeGroupId,\n );\n if (!asyncRoute) {\n // Not a SPA route, we could assign location to force a server hit or just return.\n return;\n }\n\n await applyRoute(\n this.shadowRoot,\n this,\n this.db,\n fileViewerStore,\n orchestratorStore,\n asyncRoute,\n );\n },\n });\n }\n };\n\n shadowClawNav = (event: Event): void => {\n if (!this.shadowRoot || !this.db) {\n return;\n }\n\n handleShadowClawNavigate(\n this.shadowRoot,\n this,\n this.db,\n fileViewerStore,\n orchestratorStore,\n event,\n );\n };\n\n async render() {\n bindEventListeners(\n window,\n document,\n this.shadowRoot,\n this,\n this.db,\n orchestratorStore,\n fileViewerStore,\n themeStore,\n new URL(window.location.href),\n );\n\n await loadPagesSidebarVisibilityPreference(\n this.shadowRoot,\n this,\n orchestratorStore,\n this.db,\n );\n\n if (this.db) {\n try {\n const { getConfig } = await import(\"../../db/getConfig.js\");\n const { parseConfigBoolean } =\n await import(\"./utils/parseConfigBoolean.js\");\n const { CONFIG_KEYS } = await import(\"../../config/config.js\");\n const rawSplit = await getConfig(\n this.db,\n CONFIG_KEYS.CHAT_SPLIT_VIEW_ENABLED,\n );\n this.chatSplitViewEnabled = parseConfigBoolean(rawSplit);\n } catch {\n this.chatSplitViewEnabled = false;\n }\n }\n\n const chatSplitHandle = this.shadowRoot?.querySelector(\n \".chat-split-resize-handle\",\n );\n if (this.shadowRoot && chatSplitHandle instanceof HTMLElement) {\n const { initChatSplitResize } =\n await import(\"./utils/initChatSplitResize.js\");\n await initChatSplitResize(\n this.shadowRoot,\n this,\n chatSplitHandle,\n this.db,\n );\n }\n\n this.terminalElement = document.createElement(\n \"shadow-claw-terminal\",\n ) as ShadowClawTerminal;\n if (this.terminalElement) {\n this.terminalElement.orchestrator = this.orchestrator;\n }\n\n updateTerminalToggle(\n this.shadowRoot,\n this.currentPage,\n this.terminalVisible,\n this.vmStatus,\n );\n\n scheduleTerminalPlacement(\n this.shadowRoot,\n this.currentPage,\n this.terminalElement,\n this.terminalVisible,\n this.terminalPlacementFrame,\n );\n\n syncPageHeaderMainVisibilityOverride(\n this.shadowRoot,\n this.headerMainCollapsedOverride,\n );\n\n updateHeaderMainToggle(this.shadowRoot, this.headerMainCollapsedOverride);\n\n updateActivityLogToggleVisibility(\n this.shadowRoot,\n this.currentPage,\n orchestratorStore.activityLog.length,\n );\n\n const vmStatusListener = (status: VMStatus) => {\n this.vmStatus = status;\n\n // When WebVM is unavailable (for example mode = disabled), force-close\n // the panel before hiding the toggle so the UI cannot get stuck open.\n if (status.error && this.terminalVisible) {\n this.terminalVisible = false;\n if (this.terminalElement) {\n this.terminalElement.hidden = true;\n }\n\n scheduleTerminalPlacement(\n this.shadowRoot,\n this.currentPage,\n this.terminalElement,\n this.terminalVisible,\n this.terminalPlacementFrame,\n );\n }\n\n updateTerminalToggle(\n this.shadowRoot,\n this.currentPage,\n this.terminalVisible,\n this.vmStatus,\n );\n };\n\n this.vmStatus = this.orchestrator.vmStatus || this.vmStatus;\n\n updateTerminalToggle(\n this.shadowRoot,\n this.currentPage,\n this.terminalVisible,\n this.vmStatus,\n );\n\n this.orchestrator.events.on?.(\"vm-status\", vmStatusListener);\n\n this.vmStatusCleanup = () => {\n this.orchestrator.events.off?.(\"vm-status\", vmStatusListener);\n };\n\n // Bridge worker tool events to UI actions.\n this.orchestrator.events.on(\"open-file\", (payload: OpenFilePayload) =>\n handleOrchestratorOpenFile(\n this.db,\n orchestratorStore,\n fileViewerStore,\n payload,\n ),\n );\n\n this.orchestrator.events.on(\n \"provider-help\",\n (payload: {\n providerId: string;\n reason?: string;\n helpType?: ProviderHelpType;\n }) => handleOrchestratorProviderHelp(document, this.shadowRoot, payload),\n );\n\n this.orchestrator.events.on(\"room-invite\", (invite: RoomInvitePayload) =>\n handleOrchestratorRoomInvite(\n document,\n this.shadowRoot,\n this,\n this.db,\n orchestratorStore,\n invite,\n ),\n );\n\n this.orchestrator.events.on(\n \"ask-user\",\n (payload: {\n id: string;\n groupId: string;\n question: string;\n options?: string[];\n }) => handleOrchestratorAskUser(document, this.shadowRoot, this, payload),\n );\n\n // React to store changes using effect()\n setupEffects(this.shadowRoot, this, this.db, orchestratorStore);\n }\n\n async requestDialog(options: AppDialogOptions): Promise<boolean> {\n return requestDialog(document, this.shadowRoot, options);\n }\n}\n\nif (!customElements.get(elementName)) {\n customElements.define(elementName, ShadowClaw);\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"shadow-claw-control-plane-UG0o7pCz.js","names":["shadowClawControlPlaneStyles","shadowClawControlPlaneTemplate"],"sources":["../../src/components/settings/shadow-claw-control-plane/shadow-claw-control-plane.ts"],"sourcesContent":["import { effect } from \"../../../core/effect.js\";\nimport { getDb } from \"../../../db/db.js\";\nimport { getConfig } from \"../../../db/getConfig.js\";\nimport { setConfig } from \"../../../db/setConfig.js\";\nimport {\n CONFIG_KEYS,\n DEFAULT_CONTROL_PLANE_ENABLED,\n DEFAULT_CONTROL_PLANE_TRANSPORT,\n} from \"../../../config/config.js\";\nimport { orchestratorStore } from \"../../../stores/orchestrator.js\";\nimport { showError, showSuccess } from \"../../../ui/toast.js\";\n\nimport type { Orchestrator } from \"../../../core/orchestrator/orchestrator.js\";\nimport type { ShadowClawDatabase } from \"../../../db/types.js\";\nimport type { AppDialogOptions } from \"../../../ui/types.js\";\n\nimport ShadowClawElement from \"../../shadow-claw-element.js\";\nimport shadowClawControlPlaneStyles from \"./shadow-claw-control-plane.css\" with { type: \"css\" };\nimport shadowClawControlPlaneTemplate from \"./shadow-claw-control-plane.html\" with { type: \"html\" };\n\nconst elementName = \"shadow-claw-control-plane\";\n\n/**\n * Computes Chromium targetAddressSpace for Private Network Access (PNA).\n */\nexport function getControlPlaneTargetAddressSpace(\n urlStr: string,\n): \"loopback\" | \"private\" | undefined {\n try {\n const parsed = new URL(urlStr);\n const hostname = parsed.hostname.toLowerCase();\n const isLoopback =\n hostname === \"localhost\" ||\n hostname === \"127.0.0.1\" ||\n hostname === \"::1\" ||\n hostname === \"[::1]\";\n if (isLoopback) {\n return \"loopback\";\n }\n const isPrivate = /^(10\\.|172\\.(1[6-9]|2\\d|3[01])\\.|192\\.168\\.)/.test(\n hostname,\n );\n if (isPrivate) {\n return \"private\";\n }\n } catch (_) {}\n return undefined;\n}\n\n/**\n * Settings sub-component for Control Plane Client URL, enabled toggle, and transport configuration.\n */\nexport class ShadowClawControlPlane extends ShadowClawElement {\n static styles = shadowClawControlPlaneStyles;\n static template = shadowClawControlPlaneTemplate;\n\n db: ShadowClawDatabase | null;\n orchestrator: Orchestrator | null;\n\n constructor() {\n super();\n\n this.db = null;\n this.orchestrator = null;\n }\n\n async connectedCallback() {\n const root = this.shadowRoot;\n if (!root) {\n throw new Error(\"shadowRoot not found\");\n }\n\n this.db = await getDb();\n this.orchestrator = orchestratorStore.orchestrator;\n\n this.bindEventListeners();\n this.setupEffects();\n await this.render();\n }\n\n bindEventListeners() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n root\n .querySelector('[data-action=\"save-control-plane-transport\"]')\n ?.addEventListener(\"click\", () => {\n void this.saveControlPlaneTransport();\n });\n\n root\n .querySelector('[data-action=\"save-control-plane-url\"]')\n ?.addEventListener(\"click\", () => {\n void this.saveControlPlaneUrl();\n });\n\n root\n .querySelector('[data-action=\"test-control-plane-connection\"]')\n ?.addEventListener(\"click\", () => {\n void this.testControlPlaneConnection();\n });\n\n root\n .querySelector('[data-setting=\"control-plane-enabled-toggle\"]')\n ?.addEventListener(\"change\", (e) => {\n const target = e.target as HTMLInputElement;\n void this.saveControlPlaneEnabled(target.checked);\n });\n }\n\n setupEffects() {\n effect(() => {\n if (orchestratorStore.ready) {\n this.orchestrator = orchestratorStore.orchestrator;\n this.render();\n }\n });\n }\n\n async render() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const cpEnabledToggle = root.querySelector(\n '[data-setting=\"control-plane-enabled-toggle\"]',\n ) as HTMLInputElement | null;\n if (cpEnabledToggle && this.db) {\n try {\n const { isControlPlaneEnabled } =\n await import(\"../../../core/utils/initControlPlane.js\");\n cpEnabledToggle.checked = await isControlPlaneEnabled(this.db);\n } catch (_) {\n cpEnabledToggle.checked = DEFAULT_CONTROL_PLANE_ENABLED;\n }\n }\n\n const cpUrlInput = root.querySelector(\n '[data-setting=\"control-plane-url-input\"]',\n ) as HTMLInputElement | null;\n if (cpUrlInput && this.db) {\n try {\n const stored = await getConfig(this.db, CONFIG_KEYS.CONTROL_PLANE_URL);\n cpUrlInput.value = stored || \"\";\n } catch (_) {\n cpUrlInput.value = \"\";\n }\n }\n\n const transportSelect = root.querySelector(\n '[data-setting=\"control-plane-transport-select\"]',\n ) as HTMLSelectElement | null;\n if (transportSelect && this.db) {\n try {\n const stored = await getConfig(\n this.db,\n CONFIG_KEYS.CONTROL_PLANE_TRANSPORT,\n );\n transportSelect.value = stored || DEFAULT_CONTROL_PLANE_TRANSPORT;\n } catch (_) {\n transportSelect.value = DEFAULT_CONTROL_PLANE_TRANSPORT;\n }\n }\n }\n\n async requestAppDialog(options: AppDialogOptions): Promise<boolean> {\n const el = document.querySelector(\"shadow-claw\") as any;\n if (el && typeof el.requestDialog === \"function\") {\n return await el.requestDialog(options);\n }\n\n return false;\n }\n\n /**\n * Performs a direct fetch probe to the Control Plane server.\n * Executed during user gestures (e.g. Test Connection / Save URL) to trigger\n * Chromium's Local Network Access (LNA) / Private Network Access (PNA) permission prompt if needed.\n */\n async probeControlPlane(\n urlStr: string,\n ): Promise<{ success: boolean; error?: string }> {\n let targetUrl: URL;\n try {\n targetUrl = new URL(urlStr);\n } catch {\n return { success: false, error: `Invalid URL format: \"${urlStr}\"` };\n }\n\n const targetAddressSpace = getControlPlaneTargetAddressSpace(urlStr);\n const fetchOptions: any = {\n method: \"GET\",\n cache: \"no-store\",\n mode: \"cors\",\n };\n if (targetAddressSpace) {\n fetchOptions.targetAddressSpace = targetAddressSpace;\n }\n\n try {\n const healthUrl = new URL(\"/api/control/health\", targetUrl).toString();\n let res = await fetch(healthUrl, fetchOptions);\n\n if (res.status === 404) {\n const fallbackUrl = new URL(\n \"/api/control/messages\",\n targetUrl,\n ).toString();\n res = await fetch(fallbackUrl, {\n ...fetchOptions,\n method: \"OPTIONS\",\n });\n }\n\n if (res.ok || res.status === 204 || res.status === 401) {\n return { success: true };\n }\n\n return {\n success: false,\n error: `Server responded with HTTP ${res.status} (${res.statusText || \"Error\"})`,\n };\n } catch (err: any) {\n return {\n success: false,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n /**\n * Interactive handler to test connection and surface diagnostic modal if needed.\n */\n async testControlPlaneConnection(): Promise<boolean> {\n const root = this.shadowRoot;\n if (!root) {\n return false;\n }\n\n const input = root.querySelector(\n '[data-setting=\"control-plane-url-input\"]',\n ) as HTMLInputElement | null;\n const testBtn = root.querySelector(\n '[data-action=\"test-control-plane-connection\"]',\n ) as HTMLButtonElement | null;\n\n const rawUrl = input?.value.trim() || \"http://127.0.0.1:8888\";\n\n if (testBtn) {\n testBtn.disabled = true;\n testBtn.textContent = \"⏳ Testing...\";\n }\n\n try {\n const result = await this.probeControlPlane(rawUrl);\n\n if (result.success) {\n showSuccess(`Successfully reached Control Plane at ${rawUrl}`, 4000);\n return true;\n }\n\n const errorMsg = result.error || \"Unknown connection error\";\n showError(`Connection test failed: ${errorMsg}`, 6000);\n\n await this.requestAppDialog({\n title: \"Control Plane Connection Failed\",\n message: `Unable to connect to \"${rawUrl}\".\\n\\n• TLS / Certificate: If using HTTPS with a self-signed certificate, ensure the certificate is installed and trusted in Chrome (chrome://certificate-manager/localcerts/usercerts).\\n• Chrome Permissions: In Site Settings, ensure \"Local network access\" is allowed.\\n• Server Status: Verify the ShadowClaw dev server is running and listening on this host/port.`,\n confirmLabel: \"OK\",\n });\n\n return false;\n } finally {\n if (testBtn) {\n testBtn.disabled = false;\n testBtn.textContent = \"🔌 Test Connection\";\n }\n }\n }\n\n async saveControlPlaneTransport() {\n if (!this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const select = root.querySelector(\n '[data-setting=\"control-plane-transport-select\"]',\n ) as HTMLSelectElement | null;\n if (!select) {\n return;\n }\n\n const transport = select.value === \"websocket\" ? \"websocket\" : \"sse\";\n\n try {\n await setConfig(this.db, CONFIG_KEYS.CONTROL_PLANE_TRANSPORT, transport);\n if (typeof localStorage !== \"undefined\") {\n try {\n localStorage.setItem(CONFIG_KEYS.CONTROL_PLANE_TRANSPORT, transport);\n } catch (_) {}\n }\n\n const {\n isControlPlaneEnabled,\n createDefaultControlPlaneClient,\n shouldConnectControlPlane,\n } = await import(\"../../../core/utils/initControlPlane.js\");\n\n if (\n (await isControlPlaneEnabled(this.db)) &&\n shouldConnectControlPlane()\n ) {\n createDefaultControlPlaneClient({\n orchestrator: this.orchestrator || undefined,\n transport,\n });\n }\n\n showSuccess(\n `Control Plane transport saved: ${transport.toUpperCase()}`,\n 3000,\n );\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving Control Plane transport: \" + errorMsg, 6000);\n }\n }\n\n async saveControlPlaneUrl() {\n if (!this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const input = root.querySelector(\n '[data-setting=\"control-plane-url-input\"]',\n ) as HTMLInputElement | null;\n if (!input) {\n return;\n }\n\n const url = input.value.trim();\n\n try {\n // Trigger probe within user gesture to elicit Chrome LNA prompt if needed\n if (url) {\n void this.probeControlPlane(url);\n }\n\n await setConfig(this.db, CONFIG_KEYS.CONTROL_PLANE_URL, url);\n if (typeof localStorage !== \"undefined\") {\n try {\n if (url) {\n localStorage.setItem(CONFIG_KEYS.CONTROL_PLANE_URL, url);\n } else {\n localStorage.removeItem(CONFIG_KEYS.CONTROL_PLANE_URL);\n }\n } catch (_) {}\n }\n\n const {\n isControlPlaneEnabled,\n createDefaultControlPlaneClient,\n shouldConnectControlPlane,\n } = await import(\"../../../core/utils/initControlPlane.js\");\n\n if (\n (await isControlPlaneEnabled(this.db)) &&\n shouldConnectControlPlane()\n ) {\n createDefaultControlPlaneClient({\n orchestrator: this.orchestrator || undefined,\n });\n }\n\n showSuccess(\n url\n ? `Control Plane URL saved: ${url}`\n : \"Control Plane URL reset to default\",\n 3000,\n );\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving Control Plane URL: \" + errorMsg, 6000);\n }\n }\n\n async saveControlPlaneEnabled(enabled: boolean) {\n if (!this.db) {\n return;\n }\n\n try {\n if (enabled) {\n const storedUrl =\n (await getConfig(this.db, CONFIG_KEYS.CONTROL_PLANE_URL)) ||\n \"http://127.0.0.1:8888\";\n void this.probeControlPlane(storedUrl);\n }\n\n await setConfig(\n this.db,\n CONFIG_KEYS.CONTROL_PLANE_ENABLED,\n enabled ? \"true\" : \"false\",\n );\n if (typeof localStorage !== \"undefined\") {\n try {\n localStorage.setItem(\n CONFIG_KEYS.CONTROL_PLANE_ENABLED,\n enabled ? \"true\" : \"false\",\n );\n } catch (_) {}\n }\n\n const {\n createDefaultControlPlaneClient,\n stopControlPlaneClient,\n shouldConnectControlPlane,\n } = await import(\"../../../core/utils/initControlPlane.js\");\n\n if (enabled) {\n if (shouldConnectControlPlane()) {\n createDefaultControlPlaneClient({\n orchestrator: this.orchestrator || undefined,\n });\n }\n showSuccess(\"Control plane client enabled and connected\", 3000);\n } else {\n stopControlPlaneClient();\n showSuccess(\"Control plane client disabled\", 3000);\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving Control Plane setting: \" + errorMsg, 6000);\n }\n }\n}\n\nif (!customElements.get(elementName)) {\n customElements.define(elementName, ShadowClawControlPlane);\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{i as e}from"./rolldown-runtime-aKtaBQYM.js";import{r as t}from"./config-CrHchneq.js";import{i as n}from"./app-routes-Bs-riIvr.js";import{n as r}from"./txPromise-EBECky1b.js";import{t as i}from"./ulid-BY7rQVLN.js";import{t as a}from"./browser-nBz_r6l4.js";import{t as o}from"./getAllTasks-vpBlgGsc.js";var s=e(a(),1),c=class{_transport;_url;_httpUrl;_token;_clientId;_peerId;_deviceLabel;_capabilities;_version;_heartbeatIntervalMs;_reconnectDelayMs;_maxReconnectDelayMs;_handlers;_WebSocketClass;_EventSourceClass;_fetchFn;_ws=null;_es=null;_heartbeatTimer=null;_reconnectTimer=null;_currentReconnectDelay;_isDestroyed=!1;_state=`disconnected`;constructor(e){if(this._transport=e.transport||`sse`,this._clientId=e.clientId,this._peerId=e.peerId,this._deviceLabel=e.deviceLabel||`ShadowClaw Browser Client`,this._capabilities=e.capabilities||[`webmcp`,`opfs`,`push`],this._version=e.version||`1.23.4`,this._token=e.token,this._heartbeatIntervalMs=e.heartbeatIntervalMs||1e4,this._reconnectDelayMs=e.reconnectDelayMs||1e3,this._maxReconnectDelayMs=e.maxReconnectDelayMs||3e4,this._currentReconnectDelay=this._reconnectDelayMs,this._handlers=new Map,this._WebSocketClass=e.WebSocketClass||(typeof WebSocket<`u`?WebSocket:null),this._EventSourceClass=e.EventSourceClass||(typeof EventSource<`u`?EventSource:null),this._fetchFn=e.fetchFn||(typeof fetch<`u`?fetch.bind(globalThis):(()=>Promise.reject(Error(`fetch not available`)))),e.handlers)for(let[t,n]of Object.entries(e.handlers))this.registerHandler(t,n);let t=typeof location<`u`?location:null,n=t?`${t.protocol}//${t.host}`:`http://127.0.0.1:8888`,r=t?`${t.protocol===`https:`?`wss:`:`ws:`}//${t.host}`:`ws://127.0.0.1:8888`;this._url=e.url||`${r}/ws/control`,this._httpUrl=e.httpUrl||n}get transport(){return this._transport}registerHandler(e,t){this._handlers.set(e,t)}unregisterHandler(e){this._handlers.delete(e)}getState(){return this._state}connect(){this._isDestroyed||this._state===`connected`||this._state===`connecting`||(this._transport===`websocket`?this._connectWebSocket():this._connectSse())}_connectWebSocket(){if(!this._WebSocketClass){console.warn(`[ControlPlaneClient] WebSocket not supported in this environment`);return}this._state=`connecting`;let e=new URL(this._url,`ws://127.0.0.1:8888`);this._token&&e.searchParams.set(`token`,this._token);try{let t=new this._WebSocketClass(e.toString());this._ws=t,t.onopen=()=>{this._state=`connected`,this._currentReconnectDelay=this._reconnectDelayMs,this._sendRegister(),this._startHeartbeat()},t.onmessage=e=>{this._handleMessage(e.data)},t.onclose=()=>{this._cleanupConnection(),this._isDestroyed||this._scheduleReconnect()},t.onerror=e=>{console.warn(`[ControlPlaneClient] WebSocket error:`,e)}}catch(e){console.warn(`[ControlPlaneClient] Failed to establish WebSocket connection:`,e),this._cleanupConnection(),this._scheduleReconnect()}}_connectSse(){if(!this._EventSourceClass){(s.default===void 0||!s.default.env?.JEST_WORKER_ID)&&console.warn(`[ControlPlaneClient] EventSource not supported in this environment`);return}this._state=`connecting`;let e=new URL(`/api/control/events`,this._httpUrl);e.searchParams.set(`clientId`,this._clientId),this._token&&e.searchParams.set(`token`,this._token);try{let t=new this._EventSourceClass(e.toString());this._es=t,t.onopen=()=>{this._state=`connected`,this._currentReconnectDelay=this._reconnectDelayMs,this._sendRegister(),this._startHeartbeat()},typeof t.addEventListener==`function`&&t.addEventListener(`command:execute`,e=>{this._handleMessage(e.data)}),t.onmessage=e=>{this._handleMessage(e.data)},t.onerror=e=>{console.warn(`[ControlPlaneClient] SSE connection error:`,e),this._cleanupConnection(),this._isDestroyed||this._scheduleReconnect()}}catch(e){console.warn(`[ControlPlaneClient] Failed to establish SSE connection:`,e),this._cleanupConnection(),this._scheduleReconnect()}}disconnect(){this._isDestroyed=!0;try{this._sendUnregister()}catch{}this._cleanupConnection(),this._reconnectTimer&&=(clearTimeout(this._reconnectTimer),null)}_cleanupConnection(){if(this._state=`disconnected`,this._stopHeartbeat(),this._ws){try{this._ws.close()}catch{}this._ws=null}if(this._es){try{this._es.close()}catch{}this._es=null}}_scheduleReconnect(){this._reconnectTimer||this._isDestroyed||(this._reconnectTimer=setTimeout(()=>{this._reconnectTimer=null,this._isDestroyed||this.connect()},this._currentReconnectDelay),this._currentReconnectDelay=Math.min(this._currentReconnectDelay*1.5,this._maxReconnectDelayMs))}_startHeartbeat(){this._stopHeartbeat(),this._heartbeatTimer=setInterval(()=>{this._sendHeartbeat()},this._heartbeatIntervalMs)}_stopHeartbeat(){this._heartbeatTimer&&=(clearInterval(this._heartbeatTimer),null)}_sendRegister(){let e={clientId:this._clientId,deviceLabel:this._deviceLabel,capabilities:this._capabilities,version:this._version,transport:this._transport,peerId:this._peerId};this._sendMessage({id:i(),type:`client:register`,payload:e})}_sendHeartbeat(){let e={clientId:this._clientId,timestamp:Date.now()};this._sendMessage({id:i(),type:`client:heartbeat`,payload:e})}_sendUnregister(){if(!this._clientId)return;let e={clientId:this._clientId};this._sendMessage({id:i(),type:`client:unregister`,payload:e})}_sendMessage(e){if(this._transport===`websocket`){this._ws&&(this._ws.readyState===1||this._ws.readyState===this._WebSocketClass?.OPEN)&&this._ws.send(JSON.stringify(e));return}let t=new URL(`/api/control/messages`,this._httpUrl),n={"Content-Type":`application/json`};this._token&&(n[`x-control-token`]=this._token,n.Authorization=`Bearer ${this._token}`);let r={method:`POST`,headers:n,body:JSON.stringify(e)},i=t.hostname.toLowerCase(),a=i===`localhost`||i===`127.0.0.1`||i===`::1`||i===`[::1]`,o=/^(10\.|172\.(1[6-9]|2\d|3[01])\.|192\.168\.)/.test(i);a?r.targetAddressSpace=`loopback`:o&&(r.targetAddressSpace=`private`),this._fetchFn(t.toString(),r).catch(e=>{console.warn(`[ControlPlaneClient] Failed to send message via HTTP POST:`,e)})}async _handleMessage(e){if(!e||typeof e!=`string`)return;let t;try{t=JSON.parse(e)}catch{return}if(t.type===`command:execute`){let{commandId:e,action:n,args:r}=t.payload,a=this._handlers.get(n);if(!a){this._sendMessage({id:i(),type:`command:result`,replyTo:t.id,payload:{commandId:e,success:!1,error:`Unknown action: ${n}`}});return}try{let n=await a(r);this._sendMessage({id:i(),type:`command:result`,replyTo:t.id,payload:{commandId:e,success:!0,data:n}})}catch(n){this._sendMessage({id:i(),type:`command:result`,replyTo:t.id,payload:{commandId:e,success:!1,error:n.message||String(n)}})}}}};function l(){if(typeof localStorage<`u`)try{let e=localStorage.getItem(t.CONTROL_PLANE_CLIENT_ID);if(e&&e.trim())return e.trim()}catch{}let e=n(),r=e?`${e}-${i().toLowerCase()}`:`client-${i().toLowerCase()}`;if(typeof localStorage<`u`)try{localStorage.setItem(t.CONTROL_PLANE_CLIENT_ID,r)}catch{}return r}function u(){if(typeof localStorage<`u`)try{let e=localStorage.getItem(t.CONTROL_PLANE_ENABLED);if(e!==null)return e===`true`||e===`1`}catch{}return!1}async function d(e){if(typeof localStorage<`u`)try{let e=localStorage.getItem(t.CONTROL_PLANE_ENABLED);if(e!==null)return e===`true`||e===`1`}catch{}if(e)try{let{getConfig:n}=await import(`./getConfig-D89uJgo5.js`).then(e=>e.n),r=await n(e,t.CONTROL_PLANE_ENABLED);if(r!=null)return r===`true`||r===`1`}catch{}return!1}function f(e){if(typeof EventSource>`u`&&typeof WebSocket>`u`)return!1;let t=e||(typeof location<`u`?location:null);return!(!t||t.protocol===`file:`||typeof document<`u`&&document.querySelector(`meta[name="shadowclaw-static-only"]`))}function p(e){let n=``;if(typeof localStorage<`u`)try{n=(localStorage.getItem(t.CONTROL_PLANE_URL)||``).trim()}catch{}let r=e||(typeof location<`u`?location:null),i=r&&(r.protocol===`file:`||r.hostname&&(r.hostname.endsWith(`.github.io`)||r.hostname.endsWith(`.pages.dev`))),a=n;a||=i?`http://127.0.0.1:8888`:r&&r.host?`${r.protocol}//${r.host}`:`http://127.0.0.1:8888`,a=a.replace(/\/+$/,``);let o=a.replace(/^https?:/,e=>e===`https:`?`wss:`:`ws:`);return{httpUrl:a,wsUrl:`${o}/ws/control`}}function m(){let e=[];return typeof navigator<`u`&&(navigator.storage&&typeof navigator.storage.getDirectory==`function`&&e.push(`opfs`),`serviceWorker`in navigator&&typeof window<`u`&&`PushManager`in window&&e.push(`push`),(typeof document<`u`&&document.modelContext||navigator&&navigator.modelContext)&&e.push(`webmcp`)),typeof RTCPeerConnection<`u`&&e.push(`peerjs`),e}function h(){if(typeof navigator>`u`)return`ShadowClaw Node`;let e=navigator.userAgent,t=`Desktop`;/iPad/i.test(e)?t=`iPad`:/iPhone/i.test(e)?t=`iPhone`:/Android/i.test(e)?t=`Android`:/Macintosh/i.test(e)?t=`Mac`:/Windows/i.test(e)?t=`Windows`:/Linux/i.test(e)&&(t=`Linux`);let n=`Browser`;return/Chrome/i.test(e)&&!/Edg/i.test(e)?n=`Chrome`:/Safari/i.test(e)&&!/Chrome/i.test(e)?n=`Safari`:/Firefox/i.test(e)?n=`Firefox`:/Edg/i.test(e)&&(n=`Edge`),`${t} ${n}`}let g=null;async function _(e,t={},n={}){let i=l(),a=h(),s=m();switch(e){case`send-message`:{if(!t.text)throw Error(`Missing text parameter`);let{orchestratorStore:e}=await import(`./orchestrator-DHjdLtqa.js`).then(e=>e.n),r=n.orchestrator||e.orchestrator,i=t.groupId||e.activeGroupId||`br:main`;return r?.browserChat?.submit?(r.browserChat.submit(t.text,i),{queued:!0,groupId:i}):r?.submitMessage?(r.submitMessage(t.text,i),{queued:!0,groupId:i}):e.sendMessage?(e.sendMessage(t.text),{queued:!0,groupId:i}):{queued:!1,error:`Orchestrator not ready`}}case`list-tasks`:{let e=await o(await r());return t?.groupId&&(e=e.filter(e=>e.groupId===t.groupId)),{tasks:e}}case`read-state`:{let{orchestratorStore:e}=await import(`./orchestrator-DHjdLtqa.js`).then(e=>e.n),t=n.orchestrator||e.orchestrator;return{clientId:i,deviceLabel:a,capabilities:s,activeGroupId:n.orchestrator?.activeGroupId||e.activeGroupId||t?.activeGroupId||`br:main`,state:n.orchestrator?.state||e.state||t?.state||`idle`}}case`list-tools`:{try{let{getWebMcpTools:e}=await import(`./webmcp-DAjmliCx.js`).then(e=>e.a),t=await e();if(t&&t.length>0)return{tools:t.map(e=>({name:e.name,description:e.description,inputSchema:e.inputSchema,annotations:e.annotations}))}}catch{}try{let{orchestratorStore:e}=await import(`./orchestrator-DHjdLtqa.js`).then(e=>e.n),r=n.orchestrator||e.orchestrator||(typeof document<`u`?document.querySelector(`shadow-claw`)?.orchestrator:null),i=t.groupId||r?.activeGroupId||e.activeGroupId||`br:main`,a=e.groups.find(e=>e.groupId===i);if(a?.toolTags&&a.toolTags.length>0){let{TOOL_DEFINITIONS:e}=await import(`./tools-C8x3nmo4.js`).then(e=>e.n),{parseWebMcpInputSchema:t}=await import(`./webmcp-DAjmliCx.js`).then(e=>e.a);return{tools:e.filter(e=>a.toolTags.includes(e.name)).map(e=>({name:e.name,description:e.description,inputSchema:t(e.input_schema)}))}}}catch{}let{TOOL_DEFINITIONS:e}=await import(`./tools-C8x3nmo4.js`).then(e=>e.n),{parseWebMcpInputSchema:r}=await import(`./webmcp-DAjmliCx.js`).then(e=>e.a);return{tools:e.map(e=>({name:e.name,description:e.description,inputSchema:r(e.input_schema)}))}}case`invoke-tool`:{if(!t.toolName)throw Error(`Missing toolName parameter`);try{let{orchestratorStore:e}=await import(`./orchestrator-DHjdLtqa.js`).then(e=>e.n),{toolsStore:r}=await import(`./tools-DvckJZG2.js`).then(e=>e.n),i=n.orchestrator||e.orchestrator||(typeof document<`u`?document.querySelector(`shadow-claw`)?.orchestrator:null),a=t.groupId||i?.activeGroupId||e.activeGroupId||`br:main`,o=e.groups.find(e=>e.groupId===a);if(o?.toolTags&&o.toolTags.length>0){if(!o.toolTags.includes(t.toolName))throw Error(`Tool '${t.toolName}' is not enabled in the active conversation (${a}).`)}else if(r?.allTools&&r.allTools.some(e=>e.name===t.toolName)&&r?.enabledToolNames&&r.enabledToolNames.size>0){let e=r.enabledToolNames.has(t.toolName),n=r.isDeclarativeToolEnabled(t.toolName);if(!e&&!n)throw Error(`Tool '${t.toolName}' is not enabled on this client.`)}}catch(e){if(e.message&&e.message.includes(`is not enabled`))throw e}let e=typeof document<`u`&&document.modelContext||typeof navigator<`u`&&navigator.modelContext;if(e){let n;if(typeof e.getTools==`function`)try{let r=await e.getTools();if(Array.isArray(r)&&r.length>0){if(n=r.find(e=>e.name===t.toolName),!n)throw Error(`Tool '${t.toolName}' is not enabled or registered on this client.`)}else n=Array.isArray(r)?r.find(e=>e.name===t.toolName):void 0;if(n&&typeof n.execute==`function`)return{result:await n.execute(typeof t.input==`string`?JSON.parse(t.input):t.input||{})}}catch(e){if(e.message&&e.message.includes(`is not enabled`))throw e}let r=typeof t.input==`string`?t.input:JSON.stringify(t.input||{});if(typeof e.executeTool==`function`){if(n)try{return{result:await e.executeTool(n,r)}}catch{}try{return{result:await e.executeTool({name:t.toolName},r)}}catch{}try{return{result:await e.executeTool(t.toolName,r)}}catch{}}if(typeof navigator<`u`&&navigator.modelContextTesting&&typeof navigator.modelContextTesting.executeTool==`function`)try{return{result:await navigator.modelContextTesting.executeTool(t.toolName,r)}}catch{}if(typeof e.callTool==`function`)try{return{result:await e.callTool({name:t.toolName,arguments:typeof t.input==`string`?JSON.parse(t.input):t.input||{}})}}catch{}if(typeof e.invoke==`function`)try{return{result:await e.invoke(t.toolName,typeof t.input==`string`?JSON.parse(t.input):t.input||{})}}catch{}}let{orchestratorStore:r}=await import(`./orchestrator-DHjdLtqa.js`).then(e=>e.n),i=n.orchestrator||r.orchestrator||(typeof document<`u`?document.querySelector(`shadow-claw`)?.orchestrator:null),a=i?.agentWorker;if(a&&typeof a.postMessage==`function`){let e=Date.now().toString(36)+Math.random().toString(36).slice(2),n=t.toolName===`ask_user`,r=t.timeoutMs||(n?3e5:6e4);return{result:await new Promise((n,o)=>{let s=setTimeout(()=>{a.removeEventListener(`message`,c),o(Error(`Timeout waiting for tool execution`))},r),c=t=>{let r=t.data;r&&r.type===`execute-tool-result`&&r.callId===e&&(clearTimeout(s),a.removeEventListener(`message`,c),r.error?o(Error(r.error)):n(r.result))};a.addEventListener(`message`,c),a.postMessage({type:`execute-tool`,callId:e,payload:{name:t.toolName,input:typeof t.input==`string`?JSON.parse(t.input):t.input||{},groupId:t.groupId||i?.activeGroupId||`br:main`}})})}}throw Error(`Tool ${t.toolName} could not be executed (no context or worker available)`)}case`trigger-backup`:{let{orchestratorStore:e}=await import(`./orchestrator-DHjdLtqa.js`).then(e=>e.n),a=t.groupId||n.orchestrator?.activeGroupId||e.activeGroupId||`br:main`,o=await r(),{getGroupDir:s}=await import(`./getGroupDir-P1h9wl6S.js`).then(e=>e.n),c=await s(o,a);async function l(e,t=``){let n=[];for await(let[r,i]of e.entries()){let e=t?`${t}/${r}`:r;if(i.kind===`directory`){let t=await l(i,e);n.push(...t)}else n.push(e)}return n}async function u(e){try{let t=e.split(`/`),n=c;for(let e=0;e<t.length-1;e++)n=await n.getDirectoryHandle(t[e]);let r=await(await(await n.getFileHandle(t[t.length-1])).getFile()).arrayBuffer();return new Uint8Array(r)}catch{return null}}let{BackupController:d}=await import(`./backup-controller-CvzDOq4T.js`);return await new d({clientId:i,token:t.token,serverBaseUrl:p().httpUrl,fileEnumerator:()=>l(c),fileReader:e=>u(e)}).initiate()}default:throw Error(`Unknown action '${e}'`)}}function v(e={}){if(g){try{g.disconnect()}catch{}g=null}let n=e.clientId&&e.clientId.trim()||l(),r=m(),i=h(),a=null;if(typeof localStorage<`u`)try{let e=localStorage.getItem(t.CONTROL_PLANE_TRANSPORT);(e===`sse`||e===`websocket`)&&(a=e)}catch{}let o=e.transport||a||`sse`,s;if(typeof localStorage<`u`)try{s=localStorage.getItem(t.PEERJS_MY_PEER_ID)||void 0}catch{}let{httpUrl:u,wsUrl:d}=p(),v=new c({clientId:n,deviceLabel:i,capabilities:r,peerId:s,transport:o,httpUrl:u,url:d,handlers:{"send-message":t=>_(`send-message`,t,e),"list-tasks":t=>_(`list-tasks`,t,e),"read-state":t=>_(`read-state`,t,e),"invoke-tool":t=>_(`invoke-tool`,t,e),"list-tools":t=>_(`list-tools`,t,e),"trigger-backup":t=>_(`trigger-backup`,t,e)}});return e.autoConnect!==!1&&f()&&v.connect(),g=v,v}function y(){if(g){try{g.disconnect()}catch{}g=null}}export{v as createDefaultControlPlaneClient,_ as executeClientControlCommand,d as isControlPlaneEnabled,u as isControlPlaneEnabledSync,f as shouldConnectControlPlane,y as stopControlPlaneClient};
|