@vantran-se/openchamber-web 1.24.4 → 2.0.2
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/README.md +2 -8
- package/bin/lib/commands-connect-url.js +3 -8
- package/bin/lib/commands-tunnel.js +3 -0
- package/dist/assets/{CodeMirrorCommentWidgets-B4a0JkUz.js → CodeMirrorCommentWidgets-B82Oye3V.js} +1 -1
- package/dist/assets/DiffView-DJLmWn6Z.js +4 -0
- package/dist/assets/FilesView-DjksmZRo.js +17 -0
- package/dist/assets/{GitView-Byu2DY7s.js → GitView-DiUsUIgr.js} +4 -4
- package/dist/assets/{GuestAttachDialog-B808E0-d.js → GuestAttachDialog-CYwWYLr3.js} +1 -1
- package/dist/assets/GuestSurfacePane-CmctyRI4.js +1 -0
- package/dist/assets/{JsonTreeView-VW_7czo3.js → JsonTreeView-DOHHcbgJ.js} +1 -1
- package/dist/assets/LinearIssuesView-DaqnylcV.js +1 -0
- package/dist/assets/MarkdownImageGallery-HJNvWt7L.js +1 -0
- package/dist/assets/MarkdownRendererImpl-nDZRGg2I.js +12 -0
- package/dist/assets/OnboardingScreen-C2B5Bsof.js +1 -0
- package/dist/assets/{PatchDiff-DCjGhlYV.js → PatchDiff-C4FLBjpt.js} +1 -1
- package/dist/assets/{PierreDiffViewer-CEDZNkU2.js → PierreDiffViewer-C_1S9c9n.js} +1 -1
- package/dist/assets/PlanView-_eZvb-G5.js +5 -0
- package/dist/assets/PluginPane-sM8fcZIV.js +3 -0
- package/dist/assets/SettingsView-BRfr46hb.js +29 -0
- package/dist/assets/SettingsWindow-CcUDwQHg.js +1 -0
- package/dist/assets/SubmoduleDiffSummary-CrN1ZGwl.js +1 -0
- package/dist/assets/ToolOutputDialog-Cij4jI09.js +15 -0
- package/dist/assets/ToolPartDiffPreview-BXzwQ-JY.js +8 -0
- package/dist/assets/{VirtualizedFileDiff-NU0FHFhT.js → VirtualizedFileDiff-DSWTLJNH.js} +4 -4
- package/dist/assets/{WalkthroughView-BZyjhqHv.js → WalkthroughView-CpUUgY8H.js} +2 -2
- package/dist/assets/appThemeRegistry-B5tHTkR8.js +1 -0
- package/dist/assets/{commitAndPush-BDftrjr6.js → commitAndPush-D7D8qV8p.js} +1 -1
- package/dist/assets/{computeVirtualFileMetrics-DlWlEM3x.js → computeVirtualFileMetrics-cq9uQ30i.js} +1 -1
- package/dist/assets/de-CUO1-KqF.js +10 -0
- package/dist/assets/es-BlbC6sGJ.js +16 -0
- package/dist/assets/fr-D2nwe_0W.js +14 -0
- package/dist/assets/index-BQOoYIOu.js +1 -0
- package/dist/assets/index-CLcM8HKx.css +1 -0
- package/dist/assets/index-CvLgnuNI.js +41 -0
- package/dist/assets/{isDiffPlainText-CO4e5J_S.js → isDiffPlainText-D0obJ2p8.js} +1 -1
- package/dist/assets/{isFilePlainText-ue6kCou7.js → isFilePlainText-DB3_rjyW.js} +1 -1
- package/dist/assets/ja-CA7vnDsZ.js +16 -0
- package/dist/assets/ko-Chy6a9l-.js +16 -0
- package/dist/assets/main-B9JFK3vF.js +896 -0
- package/dist/assets/main-Bhiqnrhd.js +2 -0
- package/dist/assets/{markdownCore-CK48LG0z.js → markdownCore-tfqOFaBd.js} +4 -4
- package/dist/assets/miniChat-B0UOL5zA.js +2 -0
- package/dist/assets/mobile-BJppFIEo.js +2 -0
- package/dist/assets/{patchFileDiff-D7QVlovD.js → patchFileDiff-Db6KuwCP.js} +3 -3
- package/dist/assets/pl-CTR5A_1P.js +16 -0
- package/dist/assets/pt-BR-BE1O1KEx.js +16 -0
- package/dist/assets/renderElectronMiniChatApp-Yz5sfoFh.js +2 -0
- package/dist/assets/renderMobileApp-QQ-yB8aY.js +25 -0
- package/dist/assets/runtimeEndpointReset-DKDdzRzm.js +27 -0
- package/dist/assets/scheduledTasksApi-C5sCuNqf.js +1 -0
- package/dist/assets/{shikiHighlight-BPu3JiQs.js → shikiHighlight-xURoo5t_.js} +1 -1
- package/dist/assets/{textMateThemeFromAppTheme-DWqRPo9A.js → textMateThemeFromAppTheme-BZLGuYTU.js} +1 -1
- package/dist/assets/tr-Bh5vK6cW.js +7 -0
- package/dist/assets/uk-CLDkZFy_.js +16 -0
- package/dist/assets/useAppFontEffects-BxrtCnfR.js +7337 -0
- package/dist/assets/{useInlineCommentController-CgS0fnw_.js → useInlineCommentController-CeXuR-SR.js} +2 -2
- package/dist/assets/useRootScrollLock-DgWxezc1.js +2 -0
- package/dist/assets/{vendor-codemirror-language-data-Bx2EHc1O.js → vendor-codemirror-language-data-DOuaQUZ0.js} +2 -2
- package/dist/assets/vendor-cron-parser-CjvYVigk.js +2 -0
- package/dist/assets/vendor-opencode-client-_BAHQo4R.js +12 -0
- package/dist/assets/{vendor-remixicon-react-BDmGmFCA.js → vendor-remixicon-react-D6dZ0UwF.js} +1 -1
- package/dist/assets/{vendor-zod-CgAdXWZO.js → vendor-zod-Gea9uBlY.js} +1 -1
- package/dist/assets/{web-components-DxX8bZ1o.js → web-components-63H1h21j.js} +2 -2
- package/dist/assets/zh-CN-DODgcmYj.js +16 -0
- package/dist/assets/zh-TW-ByNfIwLA.js +16 -0
- package/dist/index.html +13 -7
- package/dist/mini-chat.html +5 -5
- package/dist/mobile.html +5 -5
- package/package.json +6 -5
- package/server/index.d.ts +1 -0
- package/server/index.js +246 -91
- package/server/lib/agent-tool/DOCUMENTATION.md +32 -15
- package/server/lib/agent-tool/runtime.js +135 -54
- package/server/lib/agent-tool/runtime.test.js +155 -87
- package/server/lib/browser-control/DOCUMENTATION.md +37 -2
- package/server/lib/browser-control/provider.js +217 -0
- package/server/lib/browser-control/provider.test.js +251 -0
- package/server/lib/context-obligatory/runtime.js +61 -50
- package/server/lib/context-obligatory/runtime.test.js +62 -162
- package/server/lib/event-stream/DOCUMENTATION.md +12 -1
- package/server/lib/event-stream/delta-coalescer.js +0 -0
- package/server/lib/event-stream/delta-coalescer.test.js +68 -57
- package/server/lib/event-stream/directory-ws-bridge.js +1 -1
- package/server/lib/event-stream/global-hub.js +10 -1
- package/server/lib/event-stream/global-hub.test.js +27 -26
- package/server/lib/event-stream/index.js +6 -0
- package/server/lib/event-stream/protocol.js +26 -19
- package/server/lib/event-stream/protocol.test.js +18 -7
- package/server/lib/event-stream/rebind.test.js +5 -5
- package/server/lib/event-stream/runtime.test.js +17 -15
- package/server/lib/event-stream/translate-v2.js +313 -0
- package/server/lib/event-stream/translate-v2.test.js +209 -0
- package/server/lib/event-stream/upstream-reader.test.js +16 -16
- package/server/lib/fs/DOCUMENTATION.md +4 -2
- package/server/lib/fs/byte-range.js +35 -0
- package/server/lib/fs/byte-range.test.js +31 -0
- package/server/lib/fs/routes.js +47 -42
- package/server/lib/fs/routes.test.js +123 -18
- package/server/lib/git/service.js +12 -0
- package/server/lib/github/DOCUMENTATION.md +1 -1
- package/server/lib/github/pr-status.js +22 -2
- package/server/lib/github/pr-status.test.js +27 -14
- package/server/lib/guests/DOCUMENTATION.md +13 -0
- package/server/lib/guests/catalog.js +12 -0
- package/server/lib/guests/catalog.test.js +33 -0
- package/server/lib/guests/routes.js +10 -1
- package/server/lib/guests/service.js +192 -14
- package/server/lib/guests/service.test.js +201 -1
- package/server/lib/guests/surface.js +630 -0
- package/server/lib/guests/surface.test.js +486 -0
- package/server/lib/markdown-image-grants/routes.js +18 -5
- package/server/lib/markdown-image-grants/routes.test.js +9 -6
- package/server/lib/message-queue/DOCUMENTATION.md +33 -22
- package/server/lib/message-queue/runtime.js +155 -100
- package/server/lib/message-queue/runtime.test.js +168 -82
- package/server/lib/notifications/DOCUMENTATION.md +28 -0
- package/server/lib/notifications/control-stream.http.test.js +68 -0
- package/server/lib/notifications/emitter-runtime.js +15 -0
- package/server/lib/notifications/emitter-runtime.test.js +32 -0
- package/server/lib/notifications/push-runtime.js +5 -1
- package/server/lib/notifications/push-runtime.test.js +2 -2
- package/server/lib/notifications/routes.js +1 -1
- package/server/lib/notifications/runtime.js +115 -26
- package/server/lib/notifications/template-runtime.js +13 -15
- package/server/lib/notifications/template-runtime.test.js +16 -9
- package/server/lib/notifications/trigger-runtime.test.js +187 -0
- package/server/lib/openchamber-control/DOCUMENTATION.md +10 -0
- package/server/lib/openchamber-control/actions.js +3 -2
- package/server/lib/openchamber-control/error.js +1 -1
- package/server/lib/openchamber-control/file-open.js +59 -0
- package/server/lib/openchamber-control/file-open.test.js +57 -0
- package/server/lib/openchamber-control/routes.test.js +12 -0
- package/server/lib/openchamber-control/service.js +102 -49
- package/server/lib/openchamber-control/service.test.js +84 -44
- package/server/lib/openchamber-sessions/archive-store.js +224 -0
- package/server/lib/openchamber-sessions/archive-store.test.js +187 -0
- package/server/lib/openchamber-sessions/opencode-client.js +22 -0
- package/server/lib/openchamber-sessions/routes.js +398 -328
- package/server/lib/openchamber-sessions/routes.test.js +777 -740
- package/server/lib/openchamber-sessions/session-metadata-store.js +285 -0
- package/server/lib/openchamber-sessions/session-metadata-store.test.js +259 -0
- package/server/lib/opencode/DOCUMENTATION.md +449 -29
- package/server/lib/opencode/agents.js +233 -327
- package/server/lib/opencode/auth.js +41 -44
- package/server/lib/opencode/auth.test.js +92 -0
- package/server/lib/opencode/cli-upgrade.d.ts +4 -0
- package/server/lib/opencode/cli-upgrade.js +18 -0
- package/server/lib/opencode/cli-upgrade.test.js +36 -0
- package/server/lib/opencode/commands.js +164 -145
- package/server/lib/opencode/compatibility.d.ts +16 -0
- package/server/lib/opencode/compatibility.js +88 -0
- package/server/lib/opencode/compatibility.test.js +62 -0
- package/server/lib/opencode/config-entity-routes.js +58 -29
- package/server/lib/opencode/config-entity-v2.test.js +290 -0
- package/server/lib/opencode/config-mutation-response.js +17 -7
- package/server/lib/opencode/config-mutation-response.test.js +4 -7
- package/server/lib/opencode/config-paths.test.js +2 -2
- package/server/lib/opencode/config-v2.d.ts +183 -0
- package/server/lib/opencode/config-v2.js +801 -0
- package/server/lib/opencode/config-v2.test.js +466 -0
- package/server/lib/opencode/credential-db.js +144 -0
- package/server/lib/opencode/credential-db.test.js +104 -0
- package/server/lib/opencode/env-runtime.js +48 -9
- package/server/lib/opencode/env-runtime.test.js +45 -0
- package/server/lib/opencode/feature-routes-runtime.js +15 -5
- package/server/lib/opencode/lifecycle-process.test.js +7 -4
- package/server/lib/opencode/lifecycle.js +85 -30
- package/server/lib/opencode/lifecycle.test.js +80 -8
- package/server/lib/opencode/login-shell-env.js +27 -0
- package/server/lib/opencode/managed-config-file.js +119 -0
- package/server/lib/opencode/managed-config-file.test.js +152 -0
- package/server/lib/opencode/managed-plugin-config.js +33 -13
- package/server/lib/opencode/mcp.js +43 -149
- package/server/lib/opencode/network-runtime.js +6 -7
- package/server/lib/opencode/openchamber-routes.test.js +2 -5
- package/server/lib/opencode/plugin-routes.js +3 -3
- package/server/lib/opencode/plugin-routes.test.js +6 -24
- package/server/lib/opencode/plugins.js +91 -40
- package/server/lib/opencode/plugins.test.js +28 -15
- package/server/lib/opencode/providers.js +63 -83
- package/server/lib/opencode/providers.test.js +128 -59
- package/server/lib/opencode/proxy-agent-wiring.test.js +4 -2
- package/server/lib/opencode/proxy.js +179 -129
- package/server/lib/opencode/pwa-manifest-routes.js +4 -2
- package/server/lib/opencode/pwa-manifest-routes.test.js +3 -2
- package/server/lib/opencode/response-envelope.js +14 -0
- package/server/lib/opencode/response-envelope.test.js +23 -0
- package/server/lib/opencode/routes-upgrade.test.js +73 -116
- package/server/lib/opencode/routes.js +121 -428
- package/server/lib/opencode/server-utils-runtime.js +10 -4
- package/server/lib/opencode/session-activity.js +78 -0
- package/server/lib/opencode/session-runtime.js +21 -10
- package/server/lib/opencode/session-runtime.test.js +9 -9
- package/server/lib/opencode/settings-helpers.js +9 -9
- package/server/lib/opencode/settings-helpers.test.js +7 -12
- package/server/lib/opencode/settings-registry.json +6 -8
- package/server/lib/opencode/settings-runtime.js +18 -1
- package/server/lib/opencode/settings-runtime.test.js +31 -2
- package/server/lib/opencode/shared.js +54 -22
- package/server/lib/opencode/shared.test.js +8 -4
- package/server/lib/opencode/shutdown-runtime.js +54 -7
- package/server/lib/opencode/shutdown-runtime.test.js +224 -30
- package/server/lib/opencode/skill-routes.js +23 -24
- package/server/lib/opencode/skills.js +7 -5
- package/server/lib/opencode/tunnel-wiring-runtime.js +2 -1
- package/server/lib/opencode/upgrade-capability.test.js +1 -1
- package/server/lib/opencode/v1-migration-topup.js +288 -0
- package/server/lib/opencode/v1-migration-topup.test.js +266 -0
- package/server/lib/opencode/v2-install.d.ts +8 -0
- package/server/lib/opencode/v2-install.js +158 -0
- package/server/lib/opencode/v2-install.test.js +124 -0
- package/server/lib/opencode/watcher.js +10 -3
- package/server/lib/opencode/watcher.test.js +17 -21
- package/server/lib/opencode/websearch-config.js +66 -0
- package/server/lib/package-manager.js +55 -68
- package/server/lib/package-manager.test.js +241 -75
- package/server/lib/permission-auto-accept/runtime.js +38 -22
- package/server/lib/permission-auto-accept/runtime.test.js +39 -17
- package/server/lib/quota/DOCUMENTATION.md +4 -0
- package/server/lib/quota/providers/xai.js +4 -4
- package/server/lib/relay/tunnel-host.js +4 -1
- package/server/lib/relay/tunnel-host.test.js +7 -0
- package/server/lib/routing/DOCUMENTATION.md +52 -21
- package/server/lib/routing/defaults.js +23 -6
- package/server/lib/routing/jev.js +17 -7
- package/server/lib/routing/routes.http.test.js +68 -33
- package/server/lib/routing/routes.js +65 -22
- package/server/lib/routing/runtime.js +145 -48
- package/server/lib/routing/runtime.test.js +79 -55
- package/server/lib/scheduled-tasks/DOCUMENTATION.md +4 -0
- package/server/lib/scheduled-tasks/issue-2710-double-execution.test.js +51 -46
- package/server/lib/scheduled-tasks/runtime.js +81 -74
- package/server/lib/scheduled-tasks/runtime.test.js +53 -1
- package/server/lib/session-assist/DOCUMENTATION.md +8 -3
- package/server/lib/session-assist/context.js +122 -46
- package/server/lib/session-assist/context.test.js +117 -49
- package/server/lib/session-assist/runtime.js +52 -22
- package/server/lib/session-assist/runtime.test.js +145 -173
- package/server/lib/session-goal/DOCUMENTATION.md +23 -15
- package/server/lib/session-goal/create.js +9 -12
- package/server/lib/session-goal/create.test.js +27 -28
- package/server/lib/session-goal/runtime.js +164 -77
- package/server/lib/session-goal/runtime.test.js +271 -519
- package/server/lib/session-knowledge/DOCUMENTATION.md +5 -0
- package/server/lib/session-knowledge/runtime.js +59 -41
- package/server/lib/session-knowledge/runtime.test.js +90 -20
- package/server/lib/small-model/DOCUMENTATION.md +154 -208
- package/server/lib/small-model/client.js +113 -0
- package/server/lib/small-model/index.js +296 -158
- package/server/lib/small-model/index.test.js +423 -256
- package/server/lib/small-model/routes.js +1 -1
- package/server/lib/spaces/DOCUMENTATION.md +807 -0
- package/server/lib/spaces/code-in-bait.js +185 -0
- package/server/lib/spaces/code-in.js +641 -0
- package/server/lib/spaces/code-in.test.js +1048 -0
- package/server/lib/spaces/errors.js +8 -0
- package/server/lib/spaces/exec-http.js +94 -0
- package/server/lib/spaces/gatekeeper-channel.js +202 -0
- package/server/lib/spaces/gatekeeper-channel.test.js +215 -0
- package/server/lib/spaces/gatekeeper-program.cjs +914 -0
- package/server/lib/spaces/gatekeeper-program.test.js +1391 -0
- package/server/lib/spaces/hardening.js +457 -0
- package/server/lib/spaces/hardening.test.js +368 -0
- package/server/lib/spaces/host-git.js +127 -0
- package/server/lib/spaces/host-git.test.js +137 -0
- package/server/lib/spaces/labels.js +234 -0
- package/server/lib/spaces/labels.test.js +219 -0
- package/server/lib/spaces/layout.js +184 -0
- package/server/lib/spaces/layout.test.js +30 -0
- package/server/lib/spaces/manager.js +82 -0
- package/server/lib/spaces/manager.test.js +114 -0
- package/server/lib/spaces/places/code-in.docker.live.test.js +216 -0
- package/server/lib/spaces/places/contract-suite.js +156 -0
- package/server/lib/spaces/places/contract.docker.live.test.js +7 -0
- package/server/lib/spaces/places/contract.test.js +6 -0
- package/server/lib/spaces/places/docker-engine.js +126 -0
- package/server/lib/spaces/places/docker-live-support.js +202 -0
- package/server/lib/spaces/places/docker-tools.js +186 -0
- package/server/lib/spaces/places/docker.js +587 -0
- package/server/lib/spaces/places/docker.test.js +1610 -0
- package/server/lib/spaces/places/escape-suite.js +1018 -0
- package/server/lib/spaces/places/escape.docker.live.test.js +7 -0
- package/server/lib/spaces/places/fake-docker.js +375 -0
- package/server/lib/spaces/places/memory-place.js +103 -0
- package/server/lib/spaces/places/packed.docker.live.test.js +77 -0
- package/server/lib/spaces/places/registry.js +43 -0
- package/server/lib/spaces/places/registry.test.js +50 -0
- package/server/lib/spaces/places/server.docker.live.test.js +225 -0
- package/server/lib/spaces/run-command.js +261 -0
- package/server/lib/spaces/run-command.test.js +396 -0
- package/server/lib/spaces/space-server.js +190 -0
- package/server/lib/spaces/space-server.test.js +335 -0
- package/server/lib/spaces/tools-filler.js +82 -0
- package/server/lib/spaces/tools-filler.test.js +148 -0
- package/server/lib/spaces/tools-pack.js +49 -0
- package/server/lib/spaces/tools-pack.test.js +57 -0
- package/server/lib/spaces/tools.js +138 -0
- package/server/lib/spaces/tools.test.js +153 -0
- package/server/lib/tts/openai-sdk.js +11 -0
- package/server/lib/tts/service.js +7 -5
- package/server/lib/tts/stt.js +3 -2
- package/server/lib/tunnels/DOCUMENTATION.md +2 -0
- package/server/lib/tunnels/routes.js +7 -0
- package/server/lib/tunnels/routes.test.js +55 -0
- package/server/lib/ui-auth/ui-auth.js +38 -2
- package/server/lib/ui-auth/ui-auth.test.js +42 -0
- package/server/lib/ui-auth/ui-passkeys.js +12 -10
- package/server/lib/walkthrough/DOCUMENTATION.md +10 -1
- package/server/lib/walkthrough/pull-request.js +61 -8
- package/server/lib/walkthrough/pull-request.test.js +54 -1
- package/server/lib/walkthrough/routes.js +20 -0
- package/server/lib/walkthrough/routes.test.js +19 -0
- package/server/opencode-proxy.test.js +190 -166
- package/server/opencode-worktree-readiness.test.js +5 -4
- package/dist/assets/DiffView-B2CD9wC8.js +0 -4
- package/dist/assets/FilesView-C4vMFclc.js +0 -13
- package/dist/assets/LinearIssuesView-EzGNCGrd.js +0 -1
- package/dist/assets/MarkdownImageGallery-B2YUDFaB.js +0 -1
- package/dist/assets/MarkdownRendererImpl-B4ikIzR3.js +0 -12
- package/dist/assets/OnboardingScreen-CQHBSTEi.js +0 -1
- package/dist/assets/PlanView-D3x-pTkZ.js +0 -5
- package/dist/assets/PluginPane-DEcgDQ9h.js +0 -3
- package/dist/assets/SettingsView-CSinuH-1.js +0 -29
- package/dist/assets/SettingsWindow-B5CHoJFZ.js +0 -1
- package/dist/assets/SubmoduleDiffSummary-oxeACCWs.js +0 -1
- package/dist/assets/ToolOutputDialog-tLNWmfcW.js +0 -15
- package/dist/assets/ToolPartDiffPreview-CflzmK-x.js +0 -8
- package/dist/assets/appThemeRegistry-DLicw4dH.js +0 -1
- package/dist/assets/de-Bro6_zyl.js +0 -10
- package/dist/assets/es-Bb9XQZvd.js +0 -16
- package/dist/assets/fr-Dgfzn-IL.js +0 -14
- package/dist/assets/index-CtQNmqUL.js +0 -1
- package/dist/assets/index-DqaMWNrC.css +0 -1
- package/dist/assets/index-Dqc6USl3.js +0 -40
- package/dist/assets/ja-BYsakGFh.js +0 -16
- package/dist/assets/ko-BSaQz9aN.js +0 -16
- package/dist/assets/main-B62_pjL5.js +0 -2
- package/dist/assets/main-BEdcOI2P.js +0 -896
- package/dist/assets/miniChat-LT8Rqofr.js +0 -2
- package/dist/assets/mobile-CqarEynh.js +0 -2
- package/dist/assets/pl-OIviPdoj.js +0 -16
- package/dist/assets/pt-BR-Cltg-E6s.js +0 -16
- package/dist/assets/renderElectronMiniChatApp-COyLTtZx.js +0 -2
- package/dist/assets/renderMobileApp-BC1MHg6g.js +0 -25
- package/dist/assets/runtimeEndpointReset-DdrazOVH.js +0 -25
- package/dist/assets/scheduledTasksApi-B2SWMGEU.js +0 -1
- package/dist/assets/tr-CQI-KPre.js +0 -7
- package/dist/assets/uk-CqW7R4DA.js +0 -16
- package/dist/assets/useAppFontEffects-ne84JBVL.js +0 -7333
- package/dist/assets/useRootScrollLock-Cpf1qoGp.js +0 -2
- package/dist/assets/vendor-cron-parser-CUcP7OfX.js +0 -2
- package/dist/assets/vendor-opencode-sdk-BJ73u-bH.js +0 -7
- package/dist/assets/zh-CN-CVZG_o_J.js +0 -16
- package/dist/assets/zh-TW-D5ZxzCZp.js +0 -16
- package/server/lib/opencode/mcp-oauth-callback.test.js +0 -111
- package/server/lib/routing/feature-flag.js +0 -11
- package/server/lib/small-model/call.js +0 -851
- package/server/lib/small-model/call.test.js +0 -1292
- package/server/lib/small-model/catalog.js +0 -13
- package/server/lib/small-model/resolve.js +0 -131
- package/server/lib/small-model/resolve.test.js +0 -197
- package/server/lib/small-model/runtime-providers.js +0 -164
- package/server/lib/small-model/runtime-providers.test.js +0 -118
- package/server/lib/system-prompt/DOCUMENTATION.md +0 -36
- package/server/lib/system-prompt/runtime.js +0 -49
- package/server/lib/system-prompt/runtime.test.js +0 -76
- package/server/lib/walkthrough/reproduce-2607.test.js +0 -148
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/vendor-heic2any-CEam9pDc.js","assets/vendor-react-BUCujlKS.js","assets/vendor-scheduler-7OC5HNn7.js","assets/vendor-capacitor-app-BrDJj9I_.js","assets/vendor-vite-runtime-DD1OZmLC.js","assets/vendor-capacitor-core-B4EWRrHz.js"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{s as m,o as v,n as C,r as Ve,d as dr,l as U,a as N,b as Fe,u as ue,_ as Te,c as Qt,t as ji,j as Ni,e as tr,f as wc}from"./vendor-zod-CgAdXWZO.js";import{_ as Xs}from"./vendor-vite-runtime-DD1OZmLC.js";import{c as gt,d as xn,p as fr,a as Bu}from"./vendor-zustand-BAGL70zf.js";import{c as Hu}from"./vendor-opencode-sdk-BJ73u-bH.js";import{f as bc,R as no}from"./vendor-react-BUCujlKS.js";const Kn=1,zu="openchamber-relay-v1",Sc=1,Tc=12,Vn=1+Tc,nr=64*1024,rr=5,ro=128,vc=0,kc=1,vn=4,$u=1+vn,hs=nr-rr-$u,H={HttpRequest:1,HttpBody:2,HttpResponse:3,StreamEnd:4,StreamAbort:5,WsOpen:6,WsOpened:7,WsText:8,WsBinary:9,WsClose:10,Ping:11,Pong:12,DeliveryAck:13},Gu=new Set(Object.values(H)),Wu=e=>Gu.has(e),Jt={DuplicateClient:4002,AuthFailed:4010,LimitExceeded:4029,ChannelFailure:1011},pt=globalThis.crypto.subtle,Ec={name:"ECDH",namedCurve:"P-256"},Pc=16,jo=32,qu=16,ms=4,Ac=8;class Rt extends Error{constructor(t){super(t),this.name="RelayCryptoError"}}const Ku=()=>pt.generateKey(Ec,!0,["deriveBits"]),Vu=async e=>{const t=await pt.exportKey("jwk",e);return{kty:t.kty,crv:t.crv,x:t.x,y:t.y}},Ju=async e=>{if(e.kty!=="EC"||e.crv!=="P-256"||typeof e.x!="string"||typeof e.y!="string")throw new Rt("invalid ECDH public key JWK");try{return await pt.importKey("jwk",{kty:e.kty,crv:e.crv,x:e.x,y:e.y,ext:!0},Ec,!0,[])}catch{throw new Rt("invalid ECDH public key JWK")}},Yu=()=>{const e=new Uint8Array(Pc);return globalThis.crypto.getRandomValues(e),e},Qu=async(e,t,n)=>{if(n.length!==Pc)throw new Rt("invalid handshake nonce length");const r=await pt.deriveBits({name:"ECDH",public:t},e,256),o=await pt.importKey("raw",r,"HKDF",!1,["deriveBits"]),s=new Uint8Array(await pt.deriveBits({name:"HKDF",hash:"SHA-256",salt:n,info:new TextEncoder().encode(zu)},o,jo*2*8)),i=(a,c)=>pt.importKey("raw",a,{name:"AES-GCM"},!1,c);return{clientToHost:await i(s.slice(0,jo),["encrypt","decrypt"]),hostToClient:await i(s.slice(jo),["encrypt","decrypt"])}},Xu=(e,t,n)=>{for(let r=Ac-1;r>=0;r-=1)e[t+r]=Number(n&0xffn),n>>=8n},Zu=(e,t)=>{let n=0n;for(let r=0;r<Ac;r+=1)n=n<<8n|BigInt(e[t+r]);return n},ed=e=>{const t=new Uint8Array(ms);globalThis.crypto.getRandomValues(t);let n=0n;return{async encrypt(r){if(r.length>nr)throw new Rt("plaintext frame exceeds maximum size");n+=1n;const o=new Uint8Array(Tc);o.set(t,0),Xu(o,ms,n);const s=new Uint8Array(await pt.encrypt({name:"AES-GCM",iv:o},e,r)),i=new Uint8Array(Vn+s.length);return i[0]=Sc,i.set(o,1),i.set(s,Vn),i}}},td=e=>{let t=0n;return{async decrypt(n){if(n.length<Vn+qu)throw new Rt("encrypted frame too short");if(n[0]!==Sc)throw new Rt("unsupported encrypted frame version");const r=n.slice(1,Vn),o=Zu(r,ms);if(o<=t)throw new Rt("frame counter regression");let s;try{s=await pt.decrypt({name:"AES-GCM",iv:r},e,n.slice(Vn))}catch{throw new Rt("frame decryption failed")}return t=o,new Uint8Array(s)}}},kr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",nd=e=>{let t="";for(let n=0;n<e.length;n+=3){const r=e[n],o=n+1<e.length?e[n+1]:void 0,s=n+2<e.length?e[n+2]:void 0;t+=kr[r>>2],t+=kr[(r&3)<<4|(o??0)>>4],o!==void 0&&(t+=kr[(o&15)<<2|(s??0)>>6]),s!==void 0&&(t+=kr[s&63])}return t},Bi=e=>{let t;try{t=JSON.parse(e)}catch{return null}if(typeof t!="object"||t===null)return null;const n=t;if(n.v!==Kn)return null;const r=n.batch===!0,o=n.flowControl===!0;return n.t==="ready"?{t:"ready",v:Kn,batch:r,flowControl:o}:n.t==="hello"&&typeof n.nonce=="string"&&typeof n.clientPubJwk=="object"&&n.clientPubJwk!==null?{t:"hello",v:Kn,clientPubJwk:n.clientPubJwk,nonce:n.nonce,batch:r,flowControl:o}:null},rd=e=>({type:"fail",closeCode:Jt.ChannelFailure,reason:e}),od=async(e,t={})=>{const n=t.batch!==!1,r=await Ju(e),o=await Ku(),s=Yu(),i={t:"hello",v:Kn,clientPubJwk:await Vu(o.publicKey),nonce:nd(s)};n&&(i.batch=!0),t.flowControl!==!1&&(i.flowControl=!0);let a=!1;return{helloText:JSON.stringify(i),get established(){return a},async handleText(c){if(a)return Bi(c)?.t==="ready"?{type:"ignore"}:rd("plaintext frame on established channel");const l=Bi(c);if(l?.t!=="ready")return{type:"ignore"};const u=await Qu(o.privateKey,r,s);return a=!0,{type:"established",batch:n&&l.batch===!0,flowControl:t.flowControl!==!1&&l.flowControl===!0,channel:{encryptor:ed(u.clientToHost),decryptor:td(u.hostToClient)}}}}},Ic=4294967295,sd=e=>{if(!Number.isSafeInteger(e)||e<0)throw new Error("invalid delivery acknowledgement");const t=new Uint8Array(8);return new DataView(t.buffer).setBigUint64(0,BigInt(e)),t};class ye extends Error{constructor(t){super(t),this.name="TunnelCodecError"}}const ze=(e,t,n,r=!1)=>{if(!Number.isInteger(t)||t<0||t>Ic)throw new ye("invalid stream id");if(n.length>hs)throw new ye("tunnel payload exceeds maximum size");const o=new Uint8Array(rr+n.length);return o[0]=r?e|ro:e,o[1]=t>>>24&255,o[2]=t>>>16&255,o[3]=t>>>8&255,o[4]=t&255,o.set(n,rr),o},id=e=>{if(e.length<rr)throw new ye("tunnel frame too short");const t=e[0],n=(t&ro)!==0,r=t&~ro;if(!Wu(r))throw new ye(`unknown tunnel frame type ${r}`);const o=(e[1]<<24|e[2]<<16|e[3]<<8|e[4])>>>0;return{frameType:r,streamId:o,payload:e.slice(rr),hasMoreFragments:n}},ad=new TextEncoder,cd=new TextDecoder,Er=e=>ad.encode(JSON.stringify(e)),Pr=(e,t)=>{let n;try{n=JSON.parse(cd.decode(e))}catch{throw new ye("malformed JSON tunnel payload")}if(!t(n))throw new ye("unexpected JSON tunnel payload shape");return n},xc=(e,t=hs)=>{if(t<=0||t>hs)throw new ye("invalid chunk size");if(e.length===0)return[new Uint8Array(0)];const n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n},Hi=(e,t,n)=>{const r=xc(n);return r.map((o,s)=>ze(e,t,o,s<r.length-1))},ld=(e=16*1024*1024)=>{const t=new Map;return{push(n){const r=`${n.streamId}:${n.frameType}`,o=t.get(r);if(!n.hasMoreFragments&&!o)return n.payload;const s=o?.chunks??[],i=(o?.totalBytes??0)+n.payload.length;if(i>e)throw t.delete(r),new ye("fragmented message exceeds maximum size");if(s.push(n.payload),n.hasMoreFragments)return t.set(r,{chunks:s,totalBytes:i}),null;t.delete(r);const a=new Uint8Array(i);let c=0;for(const l of s)a.set(l,c),c+=l.length;return a},dropStream(n){for(const r of t.keys())r.startsWith(`${n}:`)&&t.delete(r)}}},ud=e=>{if(e.length===0)throw new ye("cannot encode an empty frame batch");if(e.length===1){const o=e[0],s=new Uint8Array(1+o.length);if(s[0]=vc,s.set(o,1),s.length>nr)throw new ye("frame batch exceeds maximum plaintext size");return s}let t=1;for(const o of e)t+=vn+o.length;if(t>nr)throw new ye("frame batch exceeds maximum plaintext size");const n=new Uint8Array(t);n[0]=kc;let r=1;for(const o of e)n[r]=o.length>>>24&255,n[r+1]=o.length>>>16&255,n[r+2]=o.length>>>8&255,n[r+3]=o.length&255,r+=vn,n.set(o,r),r+=o.length;return n},dd=e=>{if(e.length<1)throw new ye("empty batch plaintext");const t=e[0];if(t===vc)return[e.slice(1)];if(t!==kc)throw new ye(`unknown batch container tag ${t}`);const n=[];let r=1;for(;r<e.length;){if(r+vn>e.length)throw new ye("truncated batch frame length");const o=(e[r]<<24|e[r+1]<<16|e[r+2]<<8|e[r+3])>>>0;if(r+=vn,r+o>e.length)throw new ye("truncated batch frame body");n.push(e.slice(r,r+o)),r+=o}if(n.length===0)throw new ye("empty frame batch");return n},fd=new Set([H.HttpBody,H.WsText,H.WsBinary]),Cc=150,pd=24*1024,hd=32,md=e=>{const t=e.windowMs??Cc,n=e.maxBatchBytes??pd,r=e.maxBatchFrames??hd,o=e.now??(()=>Date.now()),s=e.setTimer??((b,w)=>setTimeout(b,w)),i=e.clearTimer??(b=>clearTimeout(b));let a=[],c=0,l=null,u=0,d=!1;const f=()=>{l!==null&&(i(l),l=null)},p=()=>{if(f(),a.length===0)return;const b=a;a=[],c=0,u=o(),e.sendBatch(ud(b))};return{enqueue:b=>{if(d)return;const w=b[0]&~ro;if(!fd.has(w)){a.push(b),p();return}const E=o();if(a.length===0&&E-u>=t){a.push(b),p();return}const k=vn+b.length;if(a.length>0&&1+c+k>nr&&p(),a.push(b),c+=k,c>=n||a.length>=r){p();return}l===null&&(l=s(p,t))},flush:p,dispose(){d=!0,f(),a=[],c=0}}},gd=()=>{let e=1;return{next(){if(e>Ic)throw new ye("stream id space exhausted");const t=e;return e+=2,t}}},ko=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),yd=e=>ko(e)&&Object.values(e).every(t=>typeof t=="string"),wd=e=>ko(e)&&typeof e.status=="number"&&yd(e.headers),zi=e=>ko(e)&&typeof e.reason=="string",bd=e=>ko(e)&&typeof e.code=="number"&&typeof e.reason=="string",Rc=/^[a-z][a-z\d+.-]*:\/\//i,Zs="http://tunnel.invalid",Sd=e=>{try{const t=Rc.test(e)?new URL(e):new URL(e,Zs);return`${t.pathname}${t.search}`}catch{return e}},Ar=e=>({async*[Symbol.asyncIterator](){yield e}}),Td=e=>({async*[Symbol.asyncIterator](){const t=e.getReader();try{for(;;){const{done:n,value:r}=await t.read();if(n)return;r&&(yield r)}}finally{t.releaseLock()}}}),vd=e=>{const t=new Uint8Array(e.byteLength);return t.set(new Uint8Array(e.buffer,e.byteOffset,e.byteLength)),t},kd=async e=>{if(e==null)return{body:null};if(e instanceof ReadableStream)return{body:Td(e)};if(typeof e=="string")return{body:Ar(new TextEncoder().encode(e))};if(e instanceof ArrayBuffer)return{body:Ar(new Uint8Array(e.slice(0)))};if(ArrayBuffer.isView(e))return{body:Ar(vd(e))};const t=new Response(e),n=t.headers.get("content-type")??void 0,r=new Uint8Array(await t.arrayBuffer());return{body:Ar(r),contentType:n}},Ed=async(e,t)=>{let n;const r=new Headers;let o="GET",s=null,i;e instanceof Request?(n=e.url,o=e.method,e.headers.forEach((d,f)=>r.set(f,d)),i=e.signal,s=e.body):n=e.toString(),t&&(t.method&&(o=t.method),t.headers&&new Headers(t.headers).forEach((d,f)=>r.set(f,d)),t.body!==void 0&&(s=t.body),t.signal&&(i=t.signal));const a=Rc.test(n)?new URL(n):new URL(n,Zs),{body:c,contentType:l}=await kd(s);l&&!r.has("content-type")&&r.set("content-type",l);const u={};return r.forEach((d,f)=>{u[f]=d}),{method:o.toUpperCase(),path:a.pathname,query:a.search.startsWith("?")?a.search.slice(1):a.search,headers:u,body:c,signal:i}},Dc="__openchamberAmbiguousTransport",Oc=e=>(Object.defineProperty(e,Dc,{value:!0,enumerable:!1,configurable:!0}),e),Pd=e=>!e||typeof e!="object"?!1:e[Dc]===!0,Ad=["local","remote",null],Id=["ok","not-configured","unreachable","incompatible","wrong-service","missing"];function Mc(e){if(!e||typeof e!="object")return{valid:!1};const t=e,n=t.localAvailable===!1?{localAvailable:!1}:{},r=t.target,o=t.status;if(r!==null&&(typeof r!="string"||!Ad.includes(r)))return{valid:!1};if(typeof o!="string"||!Id.includes(o))return{valid:!1};if(r==="remote"||r==="local"){if(o==="ok"&&r==="local")return{valid:!0,outcome:{target:"local",status:"ok",...n}};if(o==="ok"&&r==="remote")return typeof t.hostId!="string"||typeof t.url!="string"?{valid:!1}:{valid:!0,outcome:{target:"remote",status:"ok",hostId:t.hostId,url:t.url,...n}};if(o==="unreachable")return r==="local"?{valid:!0,outcome:{target:"local",status:"unreachable",...n}}:typeof t.hostId!="string"||typeof t.url!="string"?{valid:!1}:{valid:!0,outcome:{target:"remote",status:"unreachable",hostId:t.hostId,url:t.url,...n}};if(o==="incompatible"||o==="wrong-service")return r!=="remote"?{valid:!1}:typeof t.hostId!="string"||typeof t.url!="string"?{valid:!1}:{valid:!0,outcome:{target:"remote",status:o,hostId:t.hostId,url:t.url,...n}};if(o==="missing")return r!=="remote"?{valid:!1}:typeof t.hostId!="string"?{valid:!1}:{valid:!0,outcome:{target:"remote",status:"missing",hostId:t.hostId,...n}}}if(r===null){if(o==="not-configured")return{valid:!0,outcome:{target:null,status:"not-configured",...n}};if(o==="missing")return{valid:!1}}return{valid:!1}}function wS(e){if(!e.isDesktopShell)return null;const t=e.bootOutcome;if(!t)return null;const n=t.localAvailable===!1?{localAvailable:!1}:{};if(t.status==="ok"){if(t.target==="local")return{screen:"main",...n};if(t.target==="remote")return{screen:"main",hostId:t.hostId,url:t.url,...n}}if(t.target===null&&t.status==="not-configured")return{screen:"chooser",...n};if(t.target==="local"&&t.status==="unreachable")return{screen:"chooser",...n};if(t.target==="remote"){if(t.status==="unreachable")return{screen:"recovery",variant:"remote-unreachable",hostId:t.hostId,url:t.url,...n};if(t.status==="incompatible")return{screen:"recovery",variant:"remote-incompatible",hostId:t.hostId,url:t.url,...n};if(t.status==="wrong-service")return{screen:"recovery",variant:"remote-wrong-service",hostId:t.hostId,url:t.url,...n};if(t.status==="missing")return{screen:"recovery",variant:"remote-missing",hostId:t.hostId,...n}}return null}function bS(e){return e.isDesktopShell?e.bootOutcomeKnown?e.bootViewIsMain===!1?!0:e.isInitialized:!1:e.isInitialized}function SS(e){return e.isDesktopShell&&!e.isDesktopLocalOriginActive}function _c(){if(xd()!=="valid")return null;const t=window.__OPENCHAMBER_DESKTOP_BOOT_OUTCOME__,n=Mc(t);return n.valid?n.outcome:null}function xd(){if(typeof window>"u")return"not-injected";const e=window.__OPENCHAMBER_DESKTOP_BOOT_OUTCOME__;return e==null?"not-injected":Mc(e).valid?"valid":"malformed"}const oo=/^[a-z][a-z\d+.-]*:\/\//i,Cd=e=>{const t=e.trim();return t?t.startsWith("/")?t:`/${t}`:"/"},so=e=>typeof e!="string"?"":e.trim().replace(/\/+$/,""),Rd=()=>{if(typeof window>"u")return"";const e=window.__OPENCHAMBER_API_BASE_URL__;return so(e)},Dd=()=>{if(typeof window>"u")return"";const e=window.__OPENCHAMBER_LOCAL_ORIGIN__;return so(e)},Od=()=>Object.keys(xo()).length>0,Md=e=>{const t=e.currentHref?.();return t||(typeof window<"u"?window.location.href||window.location.origin:"")},gs=(e,t)=>{if(!t)return;const n=t instanceof URLSearchParams?Array.from(t.entries()):Object.entries(t);for(const[r,o]of n)o!=null&&e.searchParams.set(r,String(o))},_d=(e,t)=>{if(!t)return e;const n=new URLSearchParams;gs({searchParams:n},t);const r=n.toString();return r?e.includes("?")?`${e}&${r}`:`${e}?${r}`:e},$i=(e,t,n)=>{if(oo.test(t)){const s=new URL(t);return gs(s,n),s.toString()}const r=Cd(t);if(!e)return _d(r,n);const o=new URL(r,`${e}/`);return gs(o,n),o.toString()},Ir=(e,t=pf())=>{if(!t)return e;const n=oo.test(e)?new URL(e):new URL(e,"http://openchamber.local");return n.searchParams.set("oc_url_token",t),oo.test(e)?n.toString():`${n.pathname}${n.search}${n.hash}`},Lc=(e,t)=>{const n=oo.test(e)?new URL(e):new URL(e,Md(t));return n.protocol==="ws:"||n.protocol==="wss:"||(n.protocol=n.protocol==="https:"?"wss:":"ws:"),n.toString()},Gi=(e,t,n)=>{if(!Od())return null;const r=Dd();if(!r)return null;try{const o=new URL(`/api/openchamber/realtime-proxy/${e==="sse"?"sse":"ws"}`,`${r}/`);o.searchParams.set("url",t);const s=hf(r);return s&&o.searchParams.set("oc_url_token",s),e==="ws"?(o.protocol=o.protocol==="https:"?"wss:":"ws:",Lc(o.toString(),n)):o.toString()}catch{return null}},ei=(e={})=>{const t=so(e.apiBaseUrl),n=so(e.realtimeBaseUrl),r=()=>t||Rd(),o=()=>n||r(),s=(a,c)=>$i(r(),a,c),i=(a,c)=>$i(o(),a,c);return{api:s,authenticatedAsset:(a,c)=>Ir(s(a,c)),assetWithUrlToken:(a,c,l)=>Ir(s(a,l),c),auth:s,health:a=>s("/health",a),rawFile:(a,c)=>s("/api/fs/raw",{path:a,download:c?.download===!0?!0:void 0,allowOutsideWorkspace:c?.allowOutsideWorkspace===!0?!0:void 0,outsideFileGrant:c?.outsideFileGrant}),sse:(a,c)=>{const l=Ir(i(a,c));return Gi("sse",l,e)||l},websocket:(a,c)=>{const l=Lc(Ir(i(a,c)),e);return Gi("ws",l,e)||l}}};let io=ei();const Ee=()=>io,Ld=e=>{io=e},Fc=e=>(io=ei(e),io),ys="openchamber:runtime-endpoint-changed",ws="openchamber:runtime-endpoint-will-change";let kn="",or="";const No=(e,t,n)=>{try{e[t]=n}catch{}},ti=e=>{try{const t=new URL(e);return t.hash="",t.search="",t.pathname=t.pathname.replace(/\/+$/,"")||"/",`url:${t.toString().replace(/\/+$/,"")}`}catch{return`url:${e.trim().replace(/\/+$/,"")||"default"}`}},Fd="mobile-disconnected",Ud="url:default",Uc=e=>e===""||e===Ud||e===Fd,jc=()=>{if(typeof window>"u")return"";const e=window.__OPENCHAMBER_API_BASE_URL__;return typeof e=="string"?e.trim():""},Nc=()=>{if(typeof window>"u")return"";const e=window.__OPENCHAMBER_LOCAL_ORIGIN__;return typeof e=="string"?e.trim():""},Bc=(e,t)=>{if(!e||!t)return!1;try{return new URL(e).origin===new URL(t).origin}catch{return!1}},Eo=()=>kn||jc();let Bo="",Wi=null,qi,Ki;const Vi=e=>{if(typeof window>"u")return;const t=window[e];return typeof t=="string"?t:void 0},G=()=>{if(or)return or;const e=Vi("__OPENCHAMBER_API_BASE_URL__"),t=Vi("__OPENCHAMBER_LOCAL_ORIGIN__");if(Wi===kn&&qi===e&&Ki===t)return Bo;const n=Eo();return Bo=Bc(n,Nc())?"local":ti(n),Wi=kn,qi=e,Ki=t,Bo},jd=(e={})=>{if(kn||or)return;const t=e.apiBaseUrl?.trim()||jc(),n=globalThis.window?.location?.origin??"",r=/^https?:\/\//.test(n)?n:"";if(!t&&!r)return;const o=Nc(),s=o&&(!t||Bc(t,o));kn=t,or=e.runtimeKey?.trim()||(s?"local":ti(t||r))},ao=e=>{const t=e.apiBaseUrl.trim(),n=Eo(),r=G(),o=e.runtimeKey?.trim()||ti(t),s={apiBaseUrl:t,previousApiBaseUrl:n,runtimeKey:o,previousRuntimeKey:r};if(typeof window<"u"&&window.dispatchEvent(new CustomEvent(ws,{detail:s})),kn=t,or=o,typeof window<"u"){const i=window;No(i,"__OPENCHAMBER_API_BASE_URL__",t),No(i,"__OPENCHAMBER_CLIENT_TOKEN__",e.clientToken||void 0),No(i,"__OPENCHAMBER_RUNTIME_HEADERS__",e.requestHeaders||void 0)}Fc({apiBaseUrl:t,realtimeBaseUrl:t}),Zc(e.requestHeaders||null),Xc(e.clientToken||null),e.relay?sf(e.relay):af(),Co(t).catch(()=>{}),typeof window<"u"&&window.dispatchEvent(new CustomEvent(ys,{detail:s}))},Nd=e=>{if(typeof window>"u")return()=>{};const t=n=>{e(n.detail)};return window.addEventListener(ws,t),()=>window.removeEventListener(ws,t)},Hc=e=>{if(typeof window>"u")return()=>{};const t=n=>{e(n.detail)};return window.addEventListener(ys,t),()=>window.removeEventListener(ys,t)};let bs=null;const TS=e=>{bs=e},Po=()=>bs||(typeof window>"u"?null:window.__OPENCHAMBER_RUNTIME_APIS__??null),zc=()=>typeof window>"u"?null:window.__VSCODE_CONFIG__??null,Bd=(e=zc())=>!!e,Hd=()=>typeof window>"u"?null:window.__OPENCHAMBER_ELECTRON__??null,mt=()=>typeof window>"u"?null:window.__OPENCHAMBER_DESKTOP__??null,tn=()=>Hd()?.runtime==="electron",zd=()=>{if(typeof window>"u")return null;const e=window.__OPENCHAMBER_PLATFORM__;return typeof e=="string"?e:null},$d="right",vS=()=>{if(!tn())return!1;const e=zd();return e==="win32"||e==="linux"},kS=e=>e==="left"?"left":$d,ES=e=>e==="left"?["close","minimize","maximize"]:["minimize","maximize","close"],ve=()=>typeof mt()?.invoke=="function",Cn=()=>tn()&&ve(),Gd=()=>{if(mt()?.pickThemeFile)return{async pick(){const e=mt()?.pickThemeFile;return e?{status:"picked",file:v({name:m(),size:C().nonnegative(),text:m()}).nullable().parse(await e())}:{status:"unsupported"}}}},oe=async(e,t)=>{const n=mt();return typeof n?.invoke!="function"?null:n.invoke(e,t??{})},PS=async()=>{if(!Cn()||!ke())return null;try{const e=await oe("desktop_get_launch_at_login");return!e||typeof e.supported!="boolean"||typeof e.enabled!="boolean"?null:e}catch(e){return console.warn("Failed to get launch at login status",e),null}},AS=async e=>{if(!Cn()||!ke())return null;try{const t=await oe("desktop_set_launch_at_login",{enabled:e});return!t||typeof t.supported!="boolean"||typeof t.enabled!="boolean"?null:t}catch(t){return console.warn("Failed to set launch at login status",t),null}},IS=async()=>{if(!Cn()||!ke())return null;try{const e=await oe("desktop_get_minimize_to_tray");return!e||typeof e.supported!="boolean"||typeof e.enabled!="boolean"?null:e}catch(e){return console.warn("Failed to get minimize to tray status",e),null}},xS=async e=>{if(!Cn()||!ke())return null;try{const t=await oe("desktop_set_minimize_to_tray",{enabled:e});return!t||typeof t.supported!="boolean"||typeof t.enabled!="boolean"?null:t}catch(t){return console.warn("Failed to set minimize to tray status",t),null}},CS=async()=>{if(!Cn()||!ke())return null;try{const e=await oe("desktop_get_keep_awake");return!e||typeof e.supported!="boolean"||typeof e.enabled!="boolean"||typeof e.active!="boolean"?null:e}catch(e){return console.warn("Failed to get keep awake status",e),null}},RS=async e=>{if(!Cn()||!ke())return null;try{const t=await oe("desktop_set_keep_awake",{enabled:e});return!t||typeof t.supported!="boolean"||typeof t.enabled!="boolean"||typeof t.active!="boolean"?null:t}catch(t){return console.warn("Failed to set keep awake status",t),null}},Ji=e=>{const t=e.trim();if(!t)return null;try{return new URL(t).origin}catch{try{return new URL(t.endsWith("/")?t:`${t}/`).origin}catch{return null}}},Ho=e=>{const t=e.trim();if(!t)return null;try{return new URL(t)}catch{try{return new URL(t.endsWith("/")?t:`${t}/`)}catch{return null}}},Wd=e=>e.replace(/^\[|\]$/g,"").toLowerCase(),Un=e=>{const t=Wd(e);return t==="localhost"||t==="127.0.0.1"||t==="::1"},ke=()=>{if(typeof window>"u"||!Je())return!1;if(G()==="local")return!0;const e=typeof window.__OPENCHAMBER_LOCAL_ORIGIN__=="string"?window.__OPENCHAMBER_LOCAL_ORIGIN__:"",t=Ho(e),n=Ho(Eo());if(!n&&t&&_c()?.target==="local")return!0;if(t&&n){if(t.origin===n.origin)return!0;const i=t.port||(t.protocol==="https:"?"443":"80"),a=n.port||(n.protocol==="https:"?"443":"80");return t.protocol===n.protocol&&i===a&&Un(t.hostname)&&Un(n.hostname)}const r=Ho(window.location.origin);if(t&&r){if(t.origin===r.origin)return!0;const i=t.port||(t.protocol==="https:"?"443":"80"),a=r.port||(r.protocol==="https:"?"443":"80");return t.protocol===r.protocol&&i===a&&Un(t.hostname)&&Un(r.hostname)}const o=Ji(e),s=Ji(window.location.origin)||window.location.origin;return o&&s&&o===s?!0:!!(r&&Un(r.hostname))},Je=()=>typeof window>"u"?!1:tn(),DS=async()=>{if(!Je())return!1;try{return!!await oe("desktop_focus_window")}catch{return!1}},$c=()=>Je()&&ve()&&ke(),qd=m().min(1),OS=e=>{if(!$c())return null;try{const t=qd.safeParse(mt()?.pathForFile?.(e));return t.success?t.data:null}catch(t){return console.warn("Failed to resolve dropped file path",t),null}},MS=async()=>{if(!Je())return!1;try{return await oe("desktop_start_window_drag"),!0}catch{return!1}},Me=()=>Bd()?!0:Po()?.runtime?.isVSCode===!0,_S=()=>{const t=Po()?.runtime?.platform;return t==="web"?!0:t==="desktop"||t==="vscode"?!1:!Me()},LS=(e,t=Je())=>e==="web"&&!t,Gc=async()=>{if(typeof window<"u"){const e=window.__OPENCHAMBER_HOME__;if(e&&e.length>0)return e}return null},FS=async e=>{if($c())try{const t=await mt()?.openDialog?.({directory:!0,multiple:!1,title:"Select Working Directory",...e?{defaultPath:e}:{}});return!t||typeof t!="string"?{success:!1,error:"Directory selection cancelled"}:{success:!0,path:t}}catch(t){return console.warn("Failed to request directory access",t),{success:!1,error:t instanceof Error?t.message:String(t)}}return{success:!1,error:"Native directory picker not available"}},Kd=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),Vd=v({path:m().min(1),outsideFileGrant:m().min(1),expiresAt:C().finite()}),US=async e=>{if(ve()&&ke())try{const t=await mt()?.openDialog?.({directory:!1,multiple:!1,title:"Select File",returnGrant:!0,...e?.filters?{filters:e.filters}:{},...e?.defaultPath?{defaultPath:e.defaultPath}:{}});if(!t)return{success:!1,error:"File selection cancelled"};if(typeof t=="string")return{success:!0,path:t};if(!Kd(t))return{success:!1,error:"File selection cancelled"};const n=typeof t.path=="string"?t.path:"";return n?{success:!0,path:n,outsideFileGrant:typeof t.outsideFileGrant=="string"?t.outsideFileGrant:void 0}:{success:!1,error:"File selection cancelled"}}catch(t){return console.warn("Failed to request file access",t),{success:!1,error:t instanceof Error?t.message:String(t)}}return{success:!1,error:"Native file picker not available"}},jS=async e=>{const t=typeof e=="string"?e.trim():"";if(!t)return{success:!1,error:"Path is required"};if(!ve()||!ke())return{success:!1,error:"Native file access not available"};try{const n=await mt()?.grantFileAccess?.(t),r=Vd.safeParse(n);return r.success?{success:!0,...r.data}:{success:!1,error:"File access was not granted"}}catch(n){return console.warn("Failed to request existing file access",n),{success:!1,error:n instanceof Error?n.message:String(n)}}},NS=async e=>({success:!0}),BS=async e=>({success:!0}),HS=async()=>ve()?await oe("desktop_check_for_updates"):null,zS=async e=>{if(!ve())return!1;const t=mt();let n=null,r=0,o;try{return typeof e=="function"&&t?.listen&&(n=await t.listen("openchamber:update-progress",s=>{const i=s?.payload;if(!i||typeof i!="object")return;const a=i,c=typeof a.event=="string"?a.event:null,l=a.data&&typeof a.data=="object"?a.data:null;if(c==="Started"){r=0,o=typeof l?.contentLength=="number"?l.contentLength:void 0,e({downloaded:r,total:o});return}if(c==="Progress"){const u=l?.downloaded,d=l?.total;typeof u=="number"&&(r=u),typeof d=="number"&&(o=d),e({downloaded:r,total:o});return}c==="Finished"&&e({downloaded:r,total:o})})),await oe("desktop_download_and_install_update"),!0}catch(s){throw s instanceof Error?s:new Error(String(s))}finally{if(n)try{const s=n();s instanceof Promise&&await s}catch{}}},$S=async()=>ve()?(await oe("desktop_restart"),!0):!1,GS=async()=>{if(!ve())return!1;try{return await oe("desktop_restart"),!0}catch(e){return console.warn("Failed to restart desktop app",e),!1}},WS=async()=>{if(!ve()||!ke())return null;try{const e=await oe("desktop_get_lan_address");return typeof e=="string"&&e.trim().length>0?e.trim():null}catch(e){return console.warn("Failed to get desktop LAN address",e),null}},Jd=async(e,t)=>{if(!ve()||!ke())return!1;const n=e?.trim();if(!n)return!1;try{return await oe("desktop_open_path",{path:n,app:typeof t=="string"&&t.trim().length>0?t.trim():void 0}),!0}catch(r){return console.warn("Failed to open path",r),!1}},qS=async e=>{if(!ve()||!ke())return!1;const t=e?.trim();if(!t)return!1;try{return await oe("desktop_reveal_path",{path:t}),!0}catch{return Jd(t)}},KS=async(e,t)=>{if(!ve()||!ke())return null;const n=e?.trim();if(!n)return null;try{const r=await oe("desktop_save_markdown_file",{defaultFileName:n,content:t});return typeof r=="string"&&r.trim().length>0?r:null}catch(r){return console.warn("Failed to save markdown file",r),null}},VS=async(e,t,n)=>{if(!ve()||!ke())return!1;const r=e?.trim(),o=t?.trim(),s=n?.trim();if(!r||!o||!s)return!1;try{return await oe("desktop_open_in_app",{projectPath:r,appId:o,appName:s}),!0}catch(i){return console.warn("Failed to open project in app",i),!1}},JS=async(e,t,n)=>{if(!ve()||!ke())return!1;const r=e?.trim(),o=t?.trim(),s=n?.trim();if(!r||!o||!s)return!1;try{return await oe("desktop_open_file_in_app",{filePath:r,appId:o,appName:s}),!0}catch(i){return console.warn("Failed to open file in app",i),!1}},YS=async(e,t)=>{if(!ve()||!ke())return{apps:[],success:!1,hasCache:!1,isCacheStale:!1};const n=Array.isArray(e)?e.filter(r=>typeof r=="string"):[];if(n.length===0)return{apps:[],success:!0,hasCache:!1,isCacheStale:!1};try{const r=await oe("desktop_get_installed_apps",{apps:n,force:t===!0?!0:void 0});if(!r||typeof r!="object")return{apps:[],success:!1,hasCache:!1,isCacheStale:!1};const o=r;return o.supported===!1?{apps:[],success:!0,hasCache:!1,isCacheStale:!1}:Array.isArray(o.apps)?{apps:o.apps.filter(i=>i&&typeof i=="object").map(i=>{const a=i;return{name:typeof a.name=="string"?a.name:"",iconDataUrl:typeof a.iconDataUrl=="string"?a.iconDataUrl:null}}).filter(i=>i.name.length>0),success:!0,hasCache:o.hasCache===!0,isCacheStale:o.isCacheStale===!0}:{apps:[],success:!1,hasCache:!1,isCacheStale:!1}}catch(r){return console.warn("Failed to fetch installed apps",r),{apps:[],success:!1,hasCache:!1,isCacheStale:!1}}},pr=()=>typeof window>"u"?!1:window.Capacitor?.isNativePlatform?.()===!0||window.location.protocol==="capacitor:",Yd=()=>{if(typeof window>"u")return!1;const e=window.__OPENCHAMBER_ELECTRON__?.arch?.toLowerCase?.();if(e==="arm64"||e==="aarch64")return(navigator.platform||"").toLowerCase().includes("win");const t=window.__VSCODE_CONFIG__?.arch?.toLowerCase?.();if(t==="arm64"||t==="aarch64")return(navigator.platform||"").toLowerCase().includes("win");const n=navigator.userAgentData;if(n?.architecture?.toLowerCase?.()==="arm64"||n?.architecture?.toLowerCase?.()==="aarch64")return(n.platform||navigator.platform||"").toLowerCase().includes("win");const r=navigator.userAgent.toLowerCase();return!!((r.includes("aarch64")||r.includes("arm64")||r.includes("armv"))&&r.includes("windows"))},QS=()=>{if(typeof window>"u"||!pr()||Wc()!=="ios")return!1;const e=navigator.userAgent||"",t=navigator.maxTouchPoints??0;return/iPad/i.test(e)||/Macintosh|MacIntel/i.test(e)&&t>1},Wc=()=>{if(typeof window<"u"){const t=window.Capacitor?.getPlatform?.();if(t==="ios"||t==="android")return t}return Me()?"vscode":Je()?"desktop":"web"},Qd="1.24.4",xr=new Uint8Array(0),Xd=new TextEncoder,Zd=new TextDecoder,je=e=>e instanceof Error?e:new Error(String(e)),Cr=()=>new DOMException("The operation was aborted.","AbortError"),ef=e=>{e.binaryType="arraybuffer";const t={get readyState(){return e.readyState},send(n){e.send(n)},close(n,r){e.close(n,r)},onopen:null,onmessage:null,onclose:null,onerror:null};return e.onopen=()=>t.onopen?.(),e.onmessage=n=>t.onmessage?.({data:n.data}),e.onclose=n=>t.onclose?.({code:n.code,reason:n.reason}),e.onerror=()=>t.onerror?.(),t},tf=e=>{const t={get readyState(){return e.readyState},get binaryType(){return e.binaryType},set binaryType(n){n&&(e.binaryType=n)},onopen:null,onmessage:null,onerror:null,onclose:null,send(n){e.send(n)},close(n,r){e.close(n,r)}};return e.onopen=()=>t.onopen?.(),e.onmessage=n=>{const r=n.data;(typeof r=="string"||r instanceof ArrayBuffer)&&t.onmessage?.({data:r})},e.onerror=()=>t.onerror?.(),e.onclose=n=>t.onclose?.({code:n.code,reason:n.reason}),t},Yi=0,zo=1,Qi=2,Xi=3,nf=new Set([Jt.AuthFailed,Jt.DuplicateClient,Jt.LimitExceeded]),rf={[Jt.AuthFailed]:"relay authentication failed",[Jt.DuplicateClient]:"relay connection replaced by another client",[Jt.LimitExceeded]:"relay connection limit reached"},Zi=()=>{const e=typeof navigator<"u"&&navigator.onLine===!1,t=typeof document<"u"&&document.visibilityState==="hidden";return e||t},ni=e=>{const t=e.helloRetryMs??1e3,n=e.helloTimeoutMs??3e4,r=e.pingIntervalMs??3e4,o=e.pingTimeoutMs??15e3,s=e.batchWindowMs??Cc,i=e.batch!==!1,a=e.reconnectBaseDelayMs??1e3,c=e.reconnectMaxDelayMs??3e4,l=e.hiddenOrOfflineMaxDelayMs??6e4,u=e.createWireSocket??(x=>ef(new WebSocket(x)));let d=!1,f=null,p={state:"idle"};const g=new Set;let b=null,w=null,E=null,k=0,F=0,O=null,K=[],R=!1;const we=x=>{if(!(p.state===x.state&&p.lastError===x.lastError)){p=x;for(const $ of g)try{$(p)}catch{}}},se=x=>{const $=K;K=[];for(const D of $)D.reject(x)},Lo=x=>{const $=K;K=[];for(const D of $)D.resolve(x)},Pe=(x,$)=>{x.dead=!0;const D=Array.from(x.streams.values());x.streams.clear();for(const M of D)try{M.fail($)}catch{}},On=()=>{O!==null&&(clearTimeout(O),O=null)},Mn=()=>{d||O===null||Zi()||(On(),Qe(),_n())},Lt=()=>{typeof document<"u"&&document.visibilityState==="visible"&&Mn()},L=()=>{R||typeof window>"u"||(R=!0,window.addEventListener("online",Mn),typeof document<"u"&&document.addEventListener("visibilitychange",Lt))},Qe=()=>{!R||typeof window>"u"||(R=!1,window.removeEventListener("online",Mn),typeof document<"u"&&document.removeEventListener("visibilitychange",Lt))},on=()=>{if(d||O!==null)return;const x=Math.max(0,F-1),$=a*2**Math.min(x,10),D=Zi()?l:c,M=Math.min(D,$);L(),O=setTimeout(()=>{O=null,Qe(),_n()},M)},Sr=()=>{const x=new URL(e.relayUrl);return x.searchParams.set("v",String(Kn)),x.searchParams.set("role","client"),x.searchParams.set("serverId",e.serverId),x.searchParams.set("appId","openchamber"),x.searchParams.set("appVersion",Qd),x.searchParams.set("platform",Wc()),e.grant&&x.searchParams.set("grant",e.grant),x.toString()},_n=async()=>{if(d)return;On(),k+=1;const x=k;we({state:F>0?"reconnecting":"connecting",lastError:p.lastError});let $;try{$=await od(e.hostEncPubJwk,{batch:i,flowControl:e.flowControl})}catch(V){if(x!==k||d)return;Ui(x,je(V),!0);return}if(x!==k||d)return;let D;try{D=u(Sr())}catch(V){Ui(x,je(V));return}w=D;let M=!1,j=null,W=null,xe=null,he=null,B=Promise.resolve(),z=null,te=null,it=!1,de=!1,fe=0,me=0,ge=null,at=null,Q=Date.now();const wt=()=>{ge!==null&&(clearTimeout(ge),ge=null),j!==null&&(clearInterval(j),j=null),W!==null&&(clearTimeout(W),W=null),xe!==null&&(clearInterval(xe),xe=null),he!==null&&(clearTimeout(he),he=null),at!==null&&(at.dispose(),at=null)};E=wt;function q(V,ne=!1,Y=!1){if(!(M||x!==k)){M=!0,Y&&(f=V),wt(),z&&(b=null,Pe(z,new Error(`relay tunnel reset: ${V.message}`))),se(V);try{D.close()}catch{}if(w===D&&(w=null),!d){if(F+=1,Y){we({state:"error",lastError:V.message});return}we({state:ne?"error":"reconnecting",lastError:V.message}),on()}}}const Ln=()=>{try{D.send($.helloText)}catch{}},vr=(V,ne,Y)=>{te=V,it=ne,de=Y,j!==null&&(clearInterval(j),j=null),W!==null&&(clearTimeout(W),W=null);const ie=new Map,Ft=gd(),Ue=ld();let Ut=Promise.resolve();const bt=Fn=>{Ut=Ut.then(async()=>{if(jt.dead)return;const Nu=await V.encryptor.encrypt(Fn);jt.dead||D.send(Nu)}).catch(()=>{q(new Error("relay encrypt/send failed"))})},Uo=ne?md({windowMs:s,sendBatch:bt}):null;at=Uo;const jt={streams:ie,assembler:Ue,nextStreamId:()=>Ft.next(),dead:!1,send(Fn){jt.dead||(Uo?Uo.enqueue(Fn):bt(Fn))}};z=jt,b=jt,F=0,Q=Date.now(),we({state:"connected"}),Lo(jt),xe=setInterval(()=>{Date.now()-Q<r||(jt.send(ze(H.Ping,0,xr)),he===null&&(he=setTimeout(()=>{he=null,q(new Error("relay keepalive timeout"))},o)))},r)},sn=()=>{ge!==null&&clearTimeout(ge),ge=null,!(!z||z.dead||fe===me)&&(me=fe,z.send(ze(H.DeliveryAck,0,sd(fe))))},ju=(V,ne)=>{let Y;try{Y=id(ne)}catch(Ue){q(je(Ue));return}if(Y.frameType===H.DeliveryAck){q(new Error("unexpected downstream delivery acknowledgement"));return}if(de&&Y.streamId!==0&&(fe+=ne.length,ge===null&&(ge=setTimeout(sn,10))),Q=Date.now(),he!==null&&(clearTimeout(he),he=null),Y.frameType===H.Ping){V.send(ze(H.Pong,Y.streamId,xr));return}if(Y.frameType===H.Pong)return;let ie=Y.payload;if(Y.frameType===H.WsText||Y.frameType===H.WsBinary){let Ue;try{Ue=V.assembler.push(Y)}catch(Ut){q(je(Ut));return}if(Ue===null)return;ie=Ue}else if(Y.hasMoreFragments){q(new Error("unexpected fragmented tunnel frame"));return}const Ft=V.streams.get(Y.streamId);Ft&&Ft.handleFrame(Y.frameType,ie)};D.onopen=()=>{M||x!==k||(Ln(),j=setInterval(Ln,t))},D.onmessage=V=>{if(M||x!==k)return;const ne=V.data;if(typeof ne=="string"){B=B.then(async()=>{if(M||x!==k)return;const ie=await $.handleText(ne);if(ie.type==="established"){if(te)return;vr(ie.channel,ie.batch,ie.flowControl)}else ie.type==="fail"&&q(new Error(`relay handshake failed: ${ie.reason}`))}).catch(ie=>{q(je(ie))});return}const Y=ne instanceof ArrayBuffer?new Uint8Array(ne):ne instanceof Uint8Array?ne:null;Y&&(B=B.then(async()=>{if(M||x!==k)return;const ie=z,Ft=te;if(!ie||!Ft){q(new Error("encrypted frame before handshake completed"));return}let Ue;try{Ue=await Ft.decryptor.decrypt(Y)}catch(bt){q(je(bt));return}let Ut;try{Ut=it?dd(Ue):[Ue]}catch(bt){q(je(bt));return}for(const bt of Ut){if(M||x!==k||ie.dead)return;ju(ie,bt)}de&&fe-me>=16*1024&&sn()}).catch(ie=>{q(je(ie))}))},D.onclose=V=>{const ne=nf.has(V.code);q(new Error(rf[V.code]??`relay socket closed (code ${V.code})`),ne,ne)},D.onerror=()=>{},W=setTimeout(()=>{W=null,q(new Error("relay handshake timeout"),!0)},n);function Ui(V,ne,Y=!1){V!==k||d||(se(ne),F+=1,we({state:Y?"error":"reconnecting",lastError:ne.message}),on())}},Tr=x=>d?Promise.reject(new Error("relay tunnel closed")):x?.aborted?Promise.reject(Cr()):f?Promise.reject(f):b&&!b.dead?Promise.resolve(b):new Promise(($,D)=>{let M=null;const j={resolve(W){M&&x&&x.removeEventListener("abort",M),$(W)},reject(W){M&&x&&x.removeEventListener("abort",M),D(W)}};x&&(M=()=>{K=K.filter(W=>W!==j),D(Cr())},x.addEventListener("abort",M,{once:!0})),K.push(j)}),yt=async(x,$)=>{const D=await Ed(x,$),M=D.signal;if(M?.aborted)throw Cr();const j=await Tr(M),W=j.nextStreamId();return await new Promise((xe,he)=>{let B=!1,z=!1,te=null,it=null;const de=()=>{j.streams.delete(W),j.assembler.dropStream(W),it&&M&&M.removeEventListener("abort",it)},fe=Q=>{if(!z){if(z=!0,de(),!B){he(Q);return}try{te?.error(Q)}catch{}}},me=Q=>{j.dead||j.send(ze(H.StreamAbort,W,Er({reason:Q})))},ge=Q=>Oc(new Error(Q));it=()=>{me("aborted"),fe(Cr())},j.streams.set(W,{handleFrame(Q,wt){if(Q===H.HttpResponse){if(B||z)return;let q;try{q=Pr(wt,wd)}catch(sn){me("malformed response head"),fe(ge(je(sn).message));return}const Ln=q.status===204||q.status===205||q.status===304;let vr=null;Ln||(vr=new ReadableStream({start(sn){te=sn},cancel(){z||(z=!0,de(),me("response body cancelled"))}})),B=!0,xe(new Response(vr,{status:q.status,headers:q.headers})),Ln&&(z=!0,de());return}if(Q===H.HttpBody){if(!B||z)return;try{te?.enqueue(wt)}catch{}return}if(Q===H.StreamEnd){if(z)return;if(!B){fe(ge("tunnel stream ended before response head"));return}z=!0,de();try{te?.close()}catch{}return}if(Q===H.StreamAbort){let q="stream aborted by host";try{q=Pr(wt,zi).reason}catch{}fe(ge(q))}},fail(Q){fe(ge(Q.message))}}),M&&M.addEventListener("abort",it,{once:!0});const at={method:D.method,path:D.path,query:D.query,headers:D.headers,hasBody:D.body!==null};j.send(ze(H.HttpRequest,W,Er(at))),(async()=>{try{let Q=!1;if(D.body)for await(const wt of D.body){if(z||j.dead)return;for(const q of xc(wt))j.send(ze(H.HttpBody,W,q)),Q=!0}!z&&!j.dead&&(D.body&&!Q&&j.send(ze(H.HttpBody,W,xr)),j.send(ze(H.StreamEnd,W,xr)))}catch(Q){me("request body failed"),fe(ge(je(Q).message))}})()})},Fo=x=>{const $=x.indexOf("?");return $===-1?{path:x,query:""}:{path:x.slice(0,$),query:x.slice($+1)}},Fu=(x,$)=>{let D=Yi,M=null,j=0,W=!1;const xe={get readyState(){return D},onopen:null,onmessage:null,onerror:null,onclose:null,send(B){if(D!==zo||!M||M.dead)throw new Error("relay tunnel socket is not open");if(typeof B=="string"){for(const te of Hi(H.WsText,j,Xd.encode(B)))M.send(te);return}const z=B instanceof ArrayBuffer?new Uint8Array(B.slice(0)):(()=>{const te=new Uint8Array(B.byteLength);return te.set(new Uint8Array(B.buffer,B.byteOffset,B.byteLength)),te})();for(const te of Hi(H.WsBinary,j,z))M.send(te)},close(B=1e3,z=""){D===Xi||D===Qi||(D===zo&&M&&!M.dead&&(D=Qi,M.send(ze(H.WsClose,j,Er({code:B,reason:z})))),he(B,z))}},he=(B,z,te=!1)=>{if(!W){if(W=!0,M&&(M.streams.delete(j),M.assembler.dropStream(j)),D=Xi,te)try{xe.onerror?.()}catch{}try{xe.onclose?.({code:B,reason:z})}catch{}}};return(async()=>{let B;try{B=await Tr()}catch(de){he(1006,je(de).message,!0);return}if(W)return;M=B,j=B.nextStreamId(),B.streams.set(j,{handleFrame(de,fe){if(de===H.WsOpened){if(D===Yi){D=zo;try{xe.onopen?.()}catch{}}return}if(de===H.WsText){try{xe.onmessage?.({data:Zd.decode(fe)})}catch{}return}if(de===H.WsBinary){const me=new ArrayBuffer(fe.byteLength);new Uint8Array(me).set(fe);try{xe.onmessage?.({data:me})}catch{}return}if(de===H.WsClose){let me=1e3,ge="";try{const at=Pr(fe,bd);me=at.code,ge=at.reason}catch{}he(me,ge);return}if(de===H.StreamAbort){let me="stream aborted";try{me=Pr(fe,zi).reason}catch{}he(1006,me,!0)}},fail(de){he(1012,de.message,!0)}});const{path:z,query:te}=Fo(x),it=$&&$.length>0?{path:z,query:te,protocols:$}:{path:z,query:te};B.send(ze(H.WsOpen,j,Er(it)))})(),xe},Uu=()=>{if(d)return;d=!0,k+=1,On(),Qe(),E?.(),E=null;const x=b;b=null;const $=new Error("relay tunnel closed");x&&Pe(x,$),se($);try{w?.close()}catch{}w=null,we({state:"idle"})};return _n(),{fetch:yt,openWebSocket:Fu,getStatus:()=>p,subscribeStatus(x){return g.add(x),()=>{g.delete(x)}},close:Uu}};let De=null,ht=null;const of=(e,t)=>e.relayUrl===t.relayUrl&&e.serverId===t.serverId&&e.grant===t.grant&&JSON.stringify(e.hostEncPubJwk)===JSON.stringify(t.hostEncPubJwk),Ao=()=>De,XS=()=>!De||!ht?null:{relayUrl:ht.relayUrl,serverId:ht.serverId,hostEncPubJwk:{...ht.hostEncPubJwk}},ZS=()=>De!==null,sf=e=>(De&&ht&&of(ht,e)||(De?.close(),ht=e,De=ni(e)),De),eT=(e,t)=>{De!==t&&(De?.close(),ht=e,De=t)},af=()=>{De?.close(),De=null,ht=null};let qc=()=>null,Kc="",co={},Xt="",sr=0,Wt=null,Sn="",ir=0,Zt="",qt=null,It="",Kr=0,Vr=0;const ri=1e4,cf=e=>e.toLowerCase()==="authorization",Vc=e=>{const t={};for(const[n,r]of Object.entries(e||{})){const o=n.trim(),s=r.trim();o&&s&&!cf(o)&&(t[o]=s)}return t},lf=(e,t)=>{const n=Object.entries(e);return n.length!==Object.keys(t).length?!1:n.every(([r,o])=>t[r]===o)},Io=e=>typeof e!="string"?"":e.trim(),uf=()=>{if(typeof window>"u")return"";const e=window.__OPENCHAMBER_CLIENT_TOKEN__;return Io(e)},df=()=>{if(typeof window>"u")return"";const e=window.__OPENCHAMBER_API_BASE_URL__;return typeof e=="string"?e.trim():""},Jc=(e,t)=>{const n=typeof e=="string"&&e.trim()?e.trim():df();if(!n)return t;try{return new URL(t,`${n.replace(/\/+$/,"")}/`).toString()}catch{return t}},oi=e=>{try{return new URL(e).origin}catch{return""}},Yc=()=>{Sn="",ir=0,Zt="",qt=null,It="",Kr+=1},hr=()=>{Xt="",sr=0,Yc()},Qc=()=>{Vr+=1,Wt=null,hr(),si()},Xc=e=>{const t=Io(e);Kc=t,Qc(),qc=()=>t?{type:"bearer",token:t}:null},Zc=e=>{const t=Vc(e);lf(co,t)||(co=t,Qc())},xo=()=>{if(Object.keys(co).length>0)return co;if(typeof window>"u")return{};const e=window.__OPENCHAMBER_RUNTIME_HEADERS__;return e&&typeof e=="object"?Vc(e):{}},el=()=>Kc||uf(),ff=(e,t)=>{const n=Io(e);if(!n||typeof t!="number"||!Number.isFinite(t)){hr();return}const r=Xt;Xt=n,sr=t,r&&r!==n&&wf()},tl=()=>!Xt||sr<=Date.now()+ri?(hr(),""):Xt,nl=e=>{const t=oi(e);return!t||Zt!==t?"":!Sn||ir<=Date.now()+ri?(Sn="",ir=0,Zt="",""):Sn},pf=()=>{const e=tl();return!e&&(el()||typeof window<"u")&&Co().catch(()=>{}),e},hf=e=>{const t=e?nl(e):"";return!t&&e&&typeof window<"u"&&il(e).catch(()=>{}),t},rl=async()=>{const e=await qc(),t=e?.type==="bearer"?Io(e.token):el();return t?{type:"bearer",token:t}:null},mf=v({token:m(),expiresAt:C()}),ol=async(e,t)=>{const n=await rl(),r=new Headers;for(const[c,l]of Object.entries(xo()))r.set(c,l);n?.type==="bearer"&&r.set("Authorization",`Bearer ${n.token}`);const o=t?`/auth/url-token?scope=${encodeURIComponent(t)}`:"/auth/url-token",s=Ao(),i=s?await s.fetch(o,{method:"POST",headers:r}):await fetch(Jc(e,o),{method:"POST",headers:r,credentials:"include"});if(!i.ok)throw new Error(`Failed to mint runtime URL auth token (${i.status})`);const a=mf.safeParse(await i.json().catch(()=>null));return a.success?{token:a.data.token.trim(),expiresAt:a.data.expiresAt}:{token:"",expiresAt:0}},tT=async e=>{const t=await ol(null,`guest:${e}`);if(!t.token)throw new Error("Guest URL auth token response was invalid");return t},sl=e=>{if(Wt)return Wt;const t=Vr,r=(async()=>{let o;try{o=await ol(e)}catch(s){throw t===Vr&&hr(),s}if(t!==Vr)throw new Error("Runtime URL auth token response is stale");if(ff(o.token,o.expiresAt),!Xt)throw new Error("Runtime URL auth token response was invalid");return Xt})().finally(()=>{Wt===r&&(Wt=null)});return Wt=r,Wt},gf=e=>{const t=oi(e);if(!t)return Promise.reject(new Error("Local runtime URL auth origin was invalid"));if(qt&&It===t)return qt;const n=Kr,o=(async()=>{const s=await fetch(Jc(t,"/auth/url-token"),{method:"POST",credentials:"include"});if(!s.ok)throw n===Kr&&t===It&&(Sn="",ir=0,Zt=""),new Error(`Failed to mint local runtime URL auth token (${s.status})`);const i=await s.json().catch(()=>null),a=typeof i?.token=="string"?i.token.trim():"",c=typeof i?.expiresAt=="number"?i.expiresAt:0;if(!a||!Number.isFinite(c))throw new Error("Local runtime URL auth token response was invalid");if(n!==Kr||t!==It)throw new Error("Local runtime URL auth token response is stale");return Sn=a,ir=c,Zt=t,a})().finally(()=>{qt===o&&(qt=null,It="")});return qt=o,It=t,qt},Co=async e=>{const t=tl();return t||sl(e)},il=async e=>{const t=oi(e);if(!t)throw new Error("Local runtime URL auth origin was invalid");const n=nl(t);return n||((Zt&&Zt!==t||It&&It!==t)&&Yc(),gf(t))};let gn=0,Jn=null,al=null;const Ss=new Set,yf=5e3,wf=()=>{for(const e of Ss)try{e()}catch{}},cl=()=>{Jn!==null&&(clearTimeout(Jn),Jn=null)},si=()=>{if(cl(),gn<=0||typeof window>"u")return;const e=sr-ri-yf,t=sr>0?Math.max(0,e-Date.now()):0;Jn=setTimeout(()=>{Jn=null,!(gn<=0)&&sl(al).catch(()=>{}).finally(()=>{si()})},t)},nT=e=>{typeof e=="string"&&e.trim()&&(al=e.trim()),gn+=1,si();let t=!1;return()=>{t||(t=!0,gn=Math.max(0,gn-1),gn===0&&cl())}},rT=e=>(Ss.add(e),()=>{Ss.delete(e)}),bf=async e=>{const t=new Headers(e);for(const[r,o]of Object.entries(xo()))t.has(r)||t.set(r,o);if(t.has("Authorization"))return t;const n=await rl();return n?.type==="bearer"&&t.set("Authorization",`Bearer ${n.token}`),t},lo=gt(e=>({state:"ok",markExpired:()=>e(t=>t.state==="expired"?t:{state:"expired"}),markReauthenticating:()=>e({state:"reauthenticating"}),markAuthenticated:()=>e({state:"ok"})})),Sf=15e3,Tf=5*6e4;let Ts=0,$o=!1;const vf=e=>e.includes("/auth/session")||e.includes("/api/client-auth/"),kf=e=>{const t=e.startsWith("/")?e:(()=>{try{return new URL(e).pathname}catch{return""}})();return!t.startsWith("/api/")&&!t.startsWith("/auth/")?!1:!vf(t)},ll=async()=>{if(!$o){$o=!0;try{const{runtimeFetch:e}=await Xs(async()=>{const{runtimeFetch:n}=await Promise.resolve().then(()=>Lf);return{runtimeFetch:n}},void 0),t=await e("/auth/session",{credentials:"include"});if(t.status===401){lo.getState().markExpired();return}if(t.ok){const{state:n,markAuthenticated:r}=lo.getState();n==="expired"&&r()}}catch{}finally{$o=!1}}},Ef=(e,t)=>{if(t!==401||lo.getState().state==="expired"||!kf(e))return;const n=Date.now();n-Ts<Sf||(Ts=n,ll())};let ea=!1;const oT=()=>{if(ea)return;ea=!0;let e=Date.now();const t=()=>{if(lo.getState().state!=="ok")return;const n=Date.now();n-e<Tf||(e=n,Ts=n,ll())};document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&t()}),window.addEventListener("focus",t)},en=e=>e.startsWith("/api/")||e==="/api"||e.startsWith("/auth/")||e==="/auth"||e==="/health",Pf=()=>typeof window>"u"?"":window.location.origin||"",ii=e=>{if(typeof window>"u")return!1;const t=Pf();if(t&&e.origin===t)return!0;try{const n=new URL(window.location.href||t);return e.protocol===n.protocol&&e.host===n.host}catch{return!1}},ai=e=>/^[a-z][a-z\d+.-]*:\/\//i.test(e),Af=e=>/(^|\.)ngrok(?:-free)?\.(?:app|dev|io)$/i.test(e),Pt=(e,t)=>{try{Af(new URL(e).hostname)&&!t.has("ngrok-skip-browser-warning")&&t.set("ngrok-skip-browser-warning","openchamber")}catch{}return t},ci=(e,t)=>{if(!t)return;const n=t instanceof URLSearchParams?Array.from(t.entries()):Object.entries(t);for(const[r,o]of n)o!=null&&e.searchParams.set(r,String(o))},Jr=e=>{try{const t=Ee().api("/api");if(!/^[a-z][a-z\d+.-]*:\/\//i.test(t))return!1;const n=new URL(t);return e.origin!==n.origin?!1:en(e.pathname)}catch{return!1}},Go=e=>{if(en(e))return!0;if(!/^[a-z][a-z\d+.-]*:\/\//i.test(e))return!1;try{const t=new URL(e);return ii(t)&&en(t.pathname)}catch{return!1}},If=(e,t)=>{try{const n=new URL(e);if(!ii(n))return e;const r=Ot(`${n.pathname}${n.search}`,t);return!ai(r)&&(n.protocol==="http:"||n.protocol==="https:")?(ci(n,t),n.toString()):n.hash?`${r}${n.hash}`:r}catch{return e}},Ot=(e,t)=>e==="/health"?Ee().health(t):e.startsWith("/auth/")||e==="/auth"?Ee().auth(e,t):en(e)?Ee().api(e,t):/^[a-z][a-z\d+.-]*:\/\//i.test(e)?If(e,t):e,xf=e=>{const t=e instanceof Request?e.url:e.toString();if(!ai(t))return en(t);try{return Jr(new URL(t))}catch{return!1}},ul=e=>{for(let t=0;t<e.length;t+=1)if(e.charCodeAt(t)>255)return!1;return!0},Cf=(e,t)=>!ul(t),vs=e=>{if(!e)return;const t=e instanceof Headers?Array.from(e.entries()):Array.isArray(e)?e:Object.entries(e);if(t.length===0)return;const n=[];let r=!1,o=!1;for(const[s,i]of t)Cf(s,i)?(n.push([s,encodeURIComponent(i)]),r=!0,s.toLowerCase()==="x-opencode-directory"&&(o=!0)):n.push([s,i]);return o&&n.push(["x-opencode-directory-encoding","uri"]),r?n:void 0},ct=async(e,t,n=!0)=>{const r=new Headers(vs(e)??e);return t&&new Headers(vs(t)??t).forEach((o,s)=>r.set(s,o)),n?bf(r):r},Rf=(e,t)=>{if(!t)return e;const n=new URL(e,Zs);return ci(n,t),`${n.pathname}${n.search}`},dl=(e,t)=>{const n=e instanceof Request?e.url:e.toString();if(!ai(n))return en(n)?Rf(n,t):null;try{const r=new URL(n);return!ii(r)||!en(r.pathname)?null:(ci(r,t),`${r.pathname}${r.search}`)}catch{return null}},Df=async(e,t,n)=>{const r=Ao();if(!r)return null;const o=dl(e,n);if(o===null)return null;const s=e instanceof Request?e.headers:void 0,i=await ct(s,t.headers,!0);return e instanceof Request?r.fetch(e,{...t,headers:i}):r.fetch(o,{...t,headers:i})},Of=(e,t)=>{if(typeof e=="string")return Ot(e,t);if(e instanceof URL)return Ot(e.toString(),t);const n=Ot(e.url,t);return n===e.url?e:new Request(n,e)},Mf=/\/api\/(config|path|app\/agents|agent|project|command)(\b|\/|\?|$)/,Rr=new Map,_f=(e,t,n)=>n||e!=="GET"||t.includes("/event")||!Mf.test(t)?null:`GET ${t}`,y=async(e,t={})=>{const{query:n,...r}=t,o=Ao(),s=o?dl(e,n):null;let i,a,c;if(o&&s!==null){const g=e instanceof Request?e.headers:void 0,b=await ct(g,r.headers,!0);i=e instanceof Request?()=>o.fetch(e,{...r,headers:b}):()=>o.fetch(s,{...r,headers:b}),a=s,c=String(r.method??(e instanceof Request?e.method:"GET")).toUpperCase()}else{const g=Of(e,n),b=g instanceof Request?g.headers:void 0,w=await ct(b,r.headers,xf(g)),E=g instanceof Request?g.url:g instanceof URL?g.toString():String(g);Pt(E,w),i=g instanceof Request?()=>fetch(new Request(g,{...r,headers:w})):()=>fetch(g,{...r,headers:w}),a=E,c=String(r.method??(g instanceof Request?g.method:"GET")).toUpperCase()}const l=i;i=()=>l().then(g=>(Ef(a,g.status),g));const u=r.signal!=null||e instanceof Request,d=_f(c,a,u);if(!d)return i();const f=Rr.get(d);if(f)return f.then(g=>g.clone());const p=i();return Rr.set(d,p),p.then(()=>Rr.delete(d),()=>Rr.delete(d)),p.then(g=>g.clone())};let ta=!1;const fl=()=>{if(ta||typeof window>"u")return;ta=!0;const e=window.fetch.bind(window);window.fetch=async(t,n)=>{const r=await Df(t,n??{});if(r)return r;if(typeof t=="string"){if(!Go(t)){try{const i=new URL(t);if(Jr(i)){const a=await ct(void 0,n?.headers);return Pt(i.toString(),a),e(t,{...n,headers:a})}}catch{}return e(t,n)}const o=await ct(void 0,n?.headers),s=Ot(t);return Pt(s,o),e(s,{...n,headers:o})}if(t instanceof URL){const o=t.toString();if(!Go(o)){if(Jr(t)){const a=await ct(void 0,n?.headers);return Pt(t.toString(),a),e(t,{...n,headers:a})}return e(t,n)}const s=await ct(void 0,n?.headers),i=Ot(o);return Pt(i,s),e(i,{...n,headers:s})}if(t instanceof Request){if(!Go(t.url)){try{const a=new URL(t.url);if(Jr(a)){const c=await ct(t.headers,n?.headers);return Pt(a.toString(),c),e(new Request(t,{...n,headers:c}))}}catch{}return e(t,n)}const o=await ct(t.headers,n?.headers),s=Ot(t.url);Pt(s,o);const i=s===t.url?t:new Request(s,t);return e(new Request(i,{...n,headers:o}))}return e(t,n)}},Lf=Object.freeze(Object.defineProperty({__proto__:null,addRuntimeProxyHeaders:Pt,buildRuntimeFetchUrl:Ot,installRuntimeFetchBridge:fl,isLatin1Safe:ul,runtimeFetch:y,sanitizeHeadersForBrowser:vs},Symbol.toStringTag,{value:"Module"})),Tn=16384,uo=globalThis,Ff=e=>{if(uo.Buffer)return uo.Buffer.from(e,"utf8").toString("base64url");const t=new TextEncoder().encode(e);let n="";for(let r=0;r<t.length;r+=32768)n+=String.fromCharCode(...t.slice(r,r+32768));return btoa(n).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")},pl=e=>{try{if(uo.Buffer)return uo.Buffer.from(e,"base64url").toString("utf8");const t=e.replace(/-/g,"+").replace(/_/g,"/").padEnd(Math.ceil(e.length/4)*4,"="),n=atob(t),r=new Uint8Array(n.length);for(let o=0;o<n.length;o+=1)r[o]=n.charCodeAt(o);return new TextDecoder().decode(r)}catch{return null}},Uf=e=>{if(typeof e!="string")return null;const t=e.trim();if(!t)return null;try{const n=new URL(t);return n.protocol!=="http:"&&n.protocol!=="https:"?null:(n.hash="",n.toString().replace(/\/+$/g,""))}catch{return null}},jf=e=>{if(typeof e!="string")return null;const t=e.trim();if(!t)return null;try{const n=new URL(t);return n.protocol!=="ws:"&&n.protocol!=="wss:"?null:(n.hash="",n.toString())}catch{return null}},na=e=>typeof e=="string"&&e.length>0,Nf=e=>{if(!e||typeof e!="object"||Array.isArray(e))return null;const t=e;return t.kty!=="EC"||t.crv!=="P-256"||!na(t.x)||!na(t.y)?null:{kty:"EC",crv:"P-256",x:t.x,y:t.y}},Bf=e=>typeof e=="number"&&Number.isFinite(e)?e:void 0,Hf=e=>{if(!e||typeof e!="object")return null;const t=e,n=Bf(t.priority);if(t.type==="lan"||t.type==="tunnel"){const r=Uf(t.url);return r?n===void 0?{type:t.type,url:r}:{type:t.type,url:r,priority:n}:null}if(t.type==="relay"){const r=jf(t.relayUrl);if(!r)return null;const o=typeof t.serverId=="string"?t.serverId.trim():"";if(!o)return null;const s=Nf(t.hostEncPubJwk);if(!s)return null;const i=typeof t.grant=="string"&&t.grant.trim()?t.grant.trim():void 0;return{type:"relay",relayUrl:r,serverId:o,hostEncPubJwk:s,...i?{grant:i}:{},...n===void 0?{}:{priority:n}}}return null},li=e=>{if(!e||typeof e!="object")return null;const t=e;if(t.v!==2)return null;const n=typeof t.pairingId=="string"?t.pairingId.trim():"",r=typeof t.secret=="string"?t.secret.trim():"";if(!n||!r)return null;const o=Array.isArray(t.candidates)?t.candidates.map(Hf).filter(c=>!!c):[];if(o.length===0)return null;const s=typeof t.expiresAt=="string"&&t.expiresAt.trim()?t.expiresAt.trim():void 0;if(s){const c=Date.parse(s);if(!Number.isFinite(c)||c<=Date.now())return null}const i=typeof t.label=="string"&&t.label.trim()?t.label.trim():void 0,a=typeof t.fingerprint=="string"&&t.fingerprint.trim()?t.fingerprint.trim():void 0;return{v:2,pairingId:n,secret:r,...i?{label:i}:{},...a?{fingerprint:a}:{},...s?{expiresAt:s}:{},candidates:o}},sT=e=>({v:2,pairingId:e.pairingId.trim(),secret:e.secret.trim(),...e.label?.trim()?{label:e.label.trim()}:{},...e.fingerprint?.trim()?{fingerprint:e.fingerprint.trim()}:{},...e.expiresAt?.trim()?{expiresAt:e.expiresAt.trim()}:{},candidates:e.candidates}),iT=e=>{const t=li(e);if(!t)throw new Error("Invalid pairing connection payload");const n=new URLSearchParams;return n.set("v","2"),n.set("p",Ff(JSON.stringify(t))),`openchamber://connect?${n.toString()}`},zf=e=>{const t=e.trim();if(!t||t.length>Tn)return null;try{const n=new URL(t);if(n.protocol!=="openchamber:"||n.hostname!=="connect"||n.searchParams.get("v")!=="2")return null;const r=n.searchParams.get("p")||"";if(!r||r.length>Tn)return null;const o=pl(r);return!o||o.length>Tn?null:li(JSON.parse(o))}catch{return null}},aT=e=>{const t=e.trim();if(!t||t.length>Tn)return null;const n=t.indexOf("?");if(n===-1||!/^openchamber:\/\/connect\/?$/i.test(t.slice(0,n)))return null;let r=null,o=null;for(const i of t.slice(n+1).split("&")){const a=i.indexOf("=");if(a===-1)continue;const c=i.slice(0,a),l=i.slice(a+1);c==="v"?r=l:c==="p"&&(o=l)}if(r!=="2"||!o||o.length>Tn)return null;const s=pl(o);if(!s||s.length>Tn)return null;try{return li(JSON.parse(s))}catch{return null}},En=e=>typeof e=="object"&&e!==null,$f=e=>e.trim().toLowerCase()==="authorization",Gf=e=>{if(!En(e))return;const t={};for(const[n,r]of Object.entries(e)){const o=n.trim(),s=typeof r=="string"?r.trim():"";!o||!s||/[\r\n:]/.test(o)||/[\r\n]/.test(s)||$f(o)||(t[o]=s)}return Object.keys(t).length>0?t:void 0},Wf=e=>`relay://${e}`,qf=e=>{if(!En(e))return null;const t=be(e,"relayUrl")||be(e,"relay_url"),n=be(e,"serverId")||be(e,"server_id"),r=e.hostEncPubJwk??e.host_enc_pub_jwk;return!t||!n||!En(r)?null:{relayUrl:t,serverId:n,hostEncPubJwk:r}},Kf=()=>{if(typeof navigator>"u")return;const e=navigator.userAgent;if(/Macintosh|Mac OS X/i.test(e))return"macos";if(/Windows/i.test(e))return"windows";if(/Linux/i.test(e))return"linux"},cT=async(e,t)=>{const n=zf(e);if(!n)throw new Error("invalid-connect-link");const r=await Xf().catch(()=>""),o={method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({pairingId:n.pairingId,secret:n.secret,clientLabel:n.label||"OpenChamber Desktop",clientKind:"desktop",deviceName:"OpenChamber Desktop",devicePlatform:Kf(),...r?{dedupeKey:`desktop:${r}`}:{}})},s=async w=>{if(!w.ok)return null;const E=await w.json().catch(()=>null);return(typeof E?.clientToken=="string"?E.clientToken.trim():"")||null};let i=null;const a=[...n.candidates].sort((w,E)=>(w.type==="relay"?1:0)-(E.type==="relay"?1:0));for(const w of a){if(w.type==="relay"){const k=ni({relayUrl:w.relayUrl,serverId:w.serverId,hostEncPubJwk:w.hostEncPubJwk,...w.grant?{grant:w.grant}:{}});try{const F=await s(await k.fetch("/api/client-auth/pairing/redeem",o));if(F){i={relay:{relayUrl:w.relayUrl,serverId:w.serverId,hostEncPubJwk:w.hostEncPubJwk},token:F};break}}catch{}finally{k.close()}continue}const E=Se(w.url);if(E)try{const k=await s(await fetch(`${E}/api/client-auth/pairing/redeem`,o));if(k){i={directUrl:E,token:k};break}}catch{}}if(!i)throw new Error("pairing-redeem-failed");const c=n.candidates.find(w=>w.type==="relay"),l=i.relay||(c?{relayUrl:c.relayUrl,serverId:c.serverId,hostEncPubJwk:c.hostEncPubJwk}:void 0),u=n.candidates.filter(w=>w.type!=="relay").map(w=>Se(w.url)).find(w=>!!w),d=i.directUrl||u,f=d||(l?Wf(l.serverId):null);if(!f)throw new Error("pairing-missing-transport");const p=t.find(w=>l?w.relay?.serverId===l.serverId:!w.relay&&Se(w.apiUrl||w.url)===f),g=p?.id||(typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`host-${Date.now()}-${Math.random().toString(16).slice(2)}`),b={...p||{},id:g,label:n.label||p?.label||hl(f),url:f,apiUrl:d,clientToken:i.token,...l?{relay:l}:{}};return{hostId:g,hosts:p?t.map(w=>w.id===g?b:w):[b,...t]}},Vf=/^(t|.*(?:token|auth|secret|api).*)$/i,Se=e=>{const t=e.trim();if(!t)return null;try{const n=new URL(t);return n.protocol!=="http:"&&n.protocol!=="https:"?null:t.split("#")[0]||null}catch{return null}},lT=e=>{const t=Se(e);if(!t)return null;try{const n=new URL(t);if((n.pathname.replace(/\/+$/,"")||"/")==="/connect"&&n.searchParams.has("t"))return{persistedUrl:n.origin,redeemUrl:n.toString(),kind:"tunnel-connect-link"}}catch{return null}return{persistedUrl:t,redeemUrl:null,kind:"normal-host"}},hl=e=>{const t=Se(e);if(!t)return e;try{const n=new URL(t);(n.username||n.password)&&(n.username="",n.password="");const r=Array.from(new Set(Array.from(n.searchParams.keys())));for(const o of r)Vf.test(o)&&n.searchParams.set(o,"[REDACTED]");return n.toString()}catch{return t}},Dr=(e,t)=>{const n=Se(e),r=Se(t);if(!n||!r)return!1;try{const o=new URL(n),s=new URL(r);if(o.origin!==s.origin||s.search&&o.search!==s.search)return!1;const i=s.pathname.length>1?s.pathname.replace(/\/+$/,""):s.pathname,a=o.pathname.length>1?o.pathname.replace(/\/+$/,""):o.pathname;return i==="/"?!0:a===i||a.startsWith(`${i}/`)}catch{return!1}},be=(e,t)=>{const n=e[t];return typeof n=="string"?n:null},ra=(e,t)=>{const n=e[t];return typeof n=="number"&&Number.isFinite(n)?n:null},Jf=e=>{if(!En(e))return null;const t=be(e,"id"),n=be(e,"label"),r=be(e,"url"),o=be(e,"apiUrl")||be(e,"api_url"),s=be(e,"clientToken")||be(e,"client_token"),i=Gf(e.requestHeaders),a=qf(e.relay);return!t||!n||!r?null:{id:t,label:n,url:r,...o?{apiUrl:o}:{},...s?{clientToken:s}:{},...i?{requestHeaders:i}:{},...a?{relay:a}:{}}},Yn=e=>Se(e.apiUrl||e.url)||e.apiUrl||e.url,nn=()=>ve()?(e,t)=>oe(e,t):null,ui=async()=>{const e=nn();if(!e)return{hosts:[],defaultHostId:"local",initialHostChoiceCompleted:!1};const t=await e("desktop_hosts_get");if(!En(t))return{hosts:[],defaultHostId:null,initialHostChoiceCompleted:!1};const n=t.hosts,r=Array.isArray(n)?n.map(Jf).filter(a=>!!a):[],o=be(t,"defaultHostId")||be(t,"default_host_id")||be(t,"defaultHostID"),s=t.initialHostChoiceCompleted===!0||t.initial_host_choice_completed===!0,i=be(t,"localOrigin")||be(t,"local_origin");return{hosts:r,defaultHostId:o,initialHostChoiceCompleted:s,localOrigin:i}},Yf=async e=>{const t=nn();if(!t)return;const n={hosts:e.hosts,defaultHostId:e.defaultHostId,initialHostChoiceCompleted:e.initialHostChoiceCompleted};e.localClientToken!==void 0&&(n.localClientToken=e.localClientToken),await t("desktop_hosts_set",{input:n})},Qf=async()=>{const e=nn();if(!e)return"";const t=await e("desktop_local_client_token_get").catch(()=>null);return typeof t=="string"?t.trim():""},Xf=async()=>{const e=nn();if(!e)return"";const t=await e("desktop_install_id_get").catch(()=>null);return typeof t=="string"?t.trim():""},Zf=8e3,ep=15e3,tp=400,np=async(e,t,n,r)=>{const o=new AbortController,s=window.setTimeout(()=>o.abort(),n);try{return await e.fetch(t,{...r,signal:o.signal})}finally{window.clearTimeout(s)}},oa=async(e,t,n,r)=>{for(;;){const o=n-Date.now();if(o<=0)throw new Error("relay probe deadline exceeded");try{return await np(e,t,Math.min(Zf,o),r)}catch(s){if(e.getStatus().state==="error"||Date.now()>=n)throw s;await new Promise(i=>window.setTimeout(i,tp))}}},rp=async(e,t)=>{const n=ni({relayUrl:e.relayUrl,serverId:e.serverId,hostEncPubJwk:e.hostEncPubJwk}),r=Date.now(),o=r+ep;let s=!1;try{if(!(await oa(n,"/health",o)).ok)return{status:"unreachable",latencyMs:0};const a=new Headers({Accept:"application/json"});for(const[u,d]of Object.entries(t?.requestHeaders||{}))u.toLowerCase()!=="authorization"&&a.set(u,d);const c=t?.clientToken?.trim();c&&a.set("Authorization",`Bearer ${c}`);const l=await oa(n,"/auth/session",o,{headers:a});return l.status===401||l.status===403?{status:"auth",latencyMs:Math.max(0,Date.now()-r)}:l.ok?(s=t?.keepTunnel===!0,{status:"ok",latencyMs:Math.max(0,Date.now()-r),...s?{tunnel:n}:{}}):{status:"unreachable",latencyMs:0}}catch{return{status:"unreachable",latencyMs:0}}finally{s||n.close()}},di=async(e,t)=>{const n=nn();if(!n)return{status:"unreachable",latencyMs:0};const r=await n("desktop_host_probe",{url:e,clientToken:t?.clientToken||void 0,requestHeaders:t?.requestHeaders||void 0,expectedServerId:t?.expectedServerId||void 0});if(!En(r))return{status:"unreachable",latencyMs:0};const o=r.status,s=o==="ok"||o==="auth"||o==="update-recommended"||o==="incompatible"||o==="wrong-service"||o==="unreachable"?o:"unreachable",i=ra(r,"latencyMs")??ra(r,"latency_ms")??0;return{status:s,latencyMs:i}},uT=async(e,t)=>{const n=nn();n&&await n("desktop_new_window_at_url",{url:e,clientToken:t?.clientToken||void 0,requestHeaders:t?.requestHeaders||void 0})},dT=async e=>{const t=nn();t&&await t("desktop_new_window_for_host",{hostId:e})},Dt="local",op=e=>({id:Dt,label:"Local",url:e||ml()}),ml=()=>typeof window>"u"?"":window.__OPENCHAMBER_LOCAL_ORIGIN__||window.location.origin,sp=e=>e.id===Dt?"local":`host:${e.id}`,fT=e=>{const t=typeof window>"u"?"":window.location.href,n=e.find(u=>u.id===Dt)?.url||ml(),r=Eo(),o=Se(n)||n,s=Se(t)||t,i=G(),a=e.find(u=>u.relay&&sp(u)===i);if(a)return{id:a.id,label:a.label,url:a.url};if(r&&Dr(r,n))return{id:Dt,label:"Local",url:o};const c=e.find(u=>r?Dr(r,Yn(u)):!1);if(c)return{id:c.id,label:c.label,url:Se(Yn(c))||Yn(c)};if(t&&Dr(t,n))return{id:Dt,label:"Local",url:o};const l=e.find(u=>t?Dr(t,u.url):!1);return l?{id:l.id,label:l.label,url:Se(l.url)||l.url}:t.startsWith("openchamber-ui://")?{id:Dt,label:"Local",url:o}:{id:"custom",label:hl(s||"Instance"),url:s}},fo=new Map;let gl=0;const po=new Map;let ks=0,yl={byHostId:{},isProbing:!1};const Es=new Set,ho=()=>{yl={byHostId:Object.fromEntries(fo),isProbing:ks>0};for(const e of Es)try{e()}catch{}},pT=e=>(Es.add(e),()=>{Es.delete(e)}),hT=()=>yl,wl=(e,t)=>{fo.set(e,t),ho()},mT=(e,t)=>{po.set(e,++gl),wl(e,t)},ip=e=>{const t=new Set([Dt,...e]);let n=!1;for(const r of Array.from(fo.keys()))t.has(r)||(fo.delete(r),po.delete(r),n=!0);n&&ho()},ap=e=>e==="unreachable"||e==="wrong-service"||e==="incompatible",cp=async()=>tn()?Qf().catch(()=>""):"",lp=async(e,t)=>{const n=e.id===Dt?t:e.clientToken||"",r=async()=>{const i=await rp(e.relay,{clientToken:n,requestHeaders:e.requestHeaders||null}).catch(()=>({status:"unreachable",latencyMs:0})),a={status:i.status,latencyMs:i.latencyMs};return i.status==="ok"&&(a.via="relay"),a};if(e.relay&&!e.apiUrl)return r();const o=Se(tn()?Yn(e):e.url);if(!o)return{status:"unreachable",latencyMs:0};const s=await di(o,{clientToken:n||null,requestHeaders:e.requestHeaders||null}).catch(()=>({status:"unreachable",latencyMs:0}));if(ap(s.status)&&e.relay){const i=await r();if(i.status==="ok")return i}return{status:s.status,latencyMs:s.latencyMs}},up=async e=>{if(!Je())return;const t=++gl;for(const n of e)po.set(n.id,t);ks+=1,ho();try{const n=await cp();await Promise.all(e.map(async r=>{const o=await lp(r,n);po.get(r.id)===t&&wl(r.id,o)}))}finally{ks-=1,ho()}};let sa=!1;const dp=async()=>{if(sa||!Je())return;sa=!0;const e=await ui().catch(()=>null);e&&(ip(e.hosts.map(t=>t.id)),await up([op(e.localOrigin),...e.hosts]))},fp=5e3,pp=1500;let Wo=!1;const hp=async e=>{if(!tn()||Wo)return;const t=`host:${e}`;if(G()===t){Wo=!0;try{const n=await ui().catch(()=>null),r=n?.hosts.find(d=>d.id===e);if(!n||!r?.relay)return;const o=r.apiUrl?Se(r.apiUrl):null;if(o&&o.startsWith("https://"))return;const s=await y("/api/client-auth/connection/candidates").catch(()=>null);if(!s?.ok)return;const i=await s.json().catch(()=>null);if(!i||i.serverId!==r.relay.serverId)return;const a=Array.isArray(i.candidates)?i.candidates:[],c=[];for(const d of a){if(!d||typeof d!="object")continue;const f=d;if(f.type!=="lan"||typeof f.url!="string")continue;const p=Se(f.url);p&&!c.includes(p)&&c.push(p)}if(c.length===0)return;const l=o&&c.includes(o)?o:c[0];l!==o&&await Yf({hosts:n.hosts.map(d=>d.id===e?{...d,apiUrl:l}:d),defaultHostId:n.defaultHostId,initialHostChoiceCompleted:n.initialHostChoiceCompleted}).catch(()=>{});const u=await di(l,{clientToken:r.clientToken||null,requestHeaders:r.requestHeaders||null,expectedServerId:r.relay.serverId}).catch(()=>({status:"unreachable",latencyMs:0}));if(u.status==="unreachable"||u.status==="wrong-service"||u.status==="incompatible"||G()!==t)return;ao({apiBaseUrl:l,clientToken:r.clientToken||null,requestHeaders:r.requestHeaders||null,runtimeKey:t})}finally{Wo=!1}}},mp=e=>{typeof window>"u"||window.setTimeout(()=>{hp(e).catch(()=>{})},fp)},gp=async e=>{if(!tn())return;const t=await ui().catch(()=>null);if(!t)return;const n=e||(t.defaultHostId!=="local"?t.defaultHostId:null);if(!n)return;const r=t.hosts.find(d=>d.id===n);if(!r?.relay)return;const o=`host:${r.id}`;if(G()===o)return;const s=d=>{ao({apiBaseUrl:d,clientToken:r.clientToken||null,requestHeaders:r.requestHeaders||null,runtimeKey:o})},i=()=>{ao({apiBaseUrl:typeof window<"u"?window.location.origin:"",clientToken:r.clientToken||null,runtimeKey:o,relay:r.relay??void 0}),mp(r.id)},a=r.apiUrl?Se(Yn(r)):null;if(!a){i();return}const c=d=>d.status!=="unreachable"&&d.status!=="wrong-service"&&d.status!=="incompatible",l=di(a,{clientToken:r.clientToken||null,requestHeaders:r.requestHeaders||null,expectedServerId:r.relay.serverId}).catch(()=>({status:"unreachable",latencyMs:0})),u=await Promise.race([l,new Promise(d=>setTimeout(()=>d(null),pp))]);if(u){if(c(u)){s(a);return}i();return}i(),l.then(d=>{c(d)&&G()===o&&s(a)})};class Yt extends Error{reason;status;constructor(t,n={}){super(t),this.name="FilesystemError",this.reason=n.reason??"unknown",this.status=n.status}}const gT=e=>e instanceof Yt||!!(e&&typeof e=="object"&&"reason"in e&&typeof e.reason=="string"),mo=e=>{switch(e){case"os-permission":case"already-exists":case"not-found":case"not-directory":case"invalid-response":return e;default:return"unknown"}},bl=/^(?:\/\/\?\/)?[A-Za-z]:\/+$/u,ia=/^(?:\/\/\?\/)?[A-Za-z]:$/u,yp=/^\/\/(?:[^/?][^/]*\/[^/]+|\?\/UNC\/[^/]+\/[^/]+)$/iu,Ye=e=>{if(typeof e!="string")return null;const t=e.trim();if(!t)return null;const n=t.replace(/\\/g,"/").replace(/^([a-z]):/,(o,s)=>s.toUpperCase()+":");return n==="/"?"/":bl.test(n)?n.replace(/\/+$/u,"/"):(n.length>1?n.replace(/\/+$/,""):n)||null},wp=e=>{if(e==="/"||bl.test(e)||ia.test(e)||yp.test(e))return null;const t=e.lastIndexOf("/");if(t<0)return null;if(t===0)return"/";const n=e.slice(0,t);return ia.test(n)?`${n}/`:n},bp=e=>Ye(e)??"",Sp=Ve(m().min(1),dr("type",[v({type:U("idle")}),v({type:U("busy")}),v({type:U("retry"),attempt:C(),message:m(),next:C()})])),Sl=v({messageID:m(),callID:m()}).optional(),Tp=v({id:m().min(1),sessionID:m().min(1),permission:m(),patterns:N(m()),metadata:Ve(m(),ue()),always:N(m()),tool:Sl}),vp=v({id:m().min(1),sessionID:m().min(1),questions:N(v({question:m(),header:m(),options:N(v({label:m(),description:m()})),multiple:Fe().optional()})),tool:Sl}),kp=v({sessions:Ve(m().min(1),v({status:m(),lastUpdateAt:C()})),pending:Ve(m().min(1),v({permissions:N(Tp),questions:N(vp)})).optional(),serverTime:C()}),aa=500,Tl=()=>{if(typeof window>"u")return!1;try{return new URLSearchParams(window.location.search).get("startupTrace")==="1"||window.localStorage?.getItem("OPENCHAMBER_STARTUP_TRACE")==="1"}catch{return!1}},yT=()=>Tl(),$e=(e,t)=>{if(!Tl())return;const n=typeof performance<"u"?performance.now():Date.now();window.__OPENCHAMBER_STARTUP_TRACE_START__??=n,window.__OPENCHAMBER_STARTUP_TRACE__??=[],window.__OPENCHAMBER_STARTUP_TRACE__.push({t:Math.round(n-window.__OPENCHAMBER_STARTUP_TRACE_START__),name:e,...t?{data:t}:{}}),window.__OPENCHAMBER_STARTUP_TRACE__.length>aa&&window.__OPENCHAMBER_STARTUP_TRACE__.splice(0,window.__OPENCHAMBER_STARTUP_TRACE__.length-aa)},Ep=()=>{const e=typeof window<"u"?window.__OPENCHAMBER_STARTUP_TRACE__??[]:[],t=e.findIndex(r=>r.name==="ModelControls:ready"),n=t>=0?Math.min(e.length,t+8):e.length;return e.slice(0,n).filter(r=>r.name.includes("checkConnection")||r.name.includes("checkHealth")||r.name.includes("initializeApp")||r.name.includes("initApp")||r.name.includes("loadProviders")||r.name.includes("loadAgents")||r.name.includes("config.defaults")||r.name.includes("modelsMetadata")||r.name.includes("ModelControls")||r.name.includes("activateDirectory")||r.name.includes("opencodeClient:setDirectory"))};typeof window<"u"&&(window.__OPENCHAMBER_STARTUP_TRACE_SUMMARY__=Ep);const wT=async(e,t,n)=>{const r=typeof performance<"u"?performance.now():Date.now();$e(`${e}:start`,n);try{const o=await t(),s=typeof performance<"u"?performance.now():Date.now();return $e(`${e}:end`,{durationMs:Math.round(s-r)}),o}catch(o){const s=typeof performance<"u"?performance.now():Date.now();throw $e(`${e}:error`,{durationMs:Math.round(s-r),error:o instanceof Error?o.message:String(o)}),o}},Pp=3,Ap=3e4,Ip=32e3,xp=3600*1e3,Cp=600*1e3,Rp=200,Dp=new Set([429,502,503,504]),ut=new Map,fi=e=>JSON.stringify([G(),e]);function Op(){const e=Date.now();for(const[t,n]of ut){const r=Math.max(n.lastErrorAt,n.circuitOpenAt);e-r>xp&&ut.delete(t)}}typeof setInterval<"u"&&setInterval(Op,Cp).unref?.();function Mp(e){const t=fi(e);let n=ut.get(t);if(!n)for(n={consecutiveErrors:0,lastErrorAt:0,circuitOpen:!1,circuitOpenAt:0,circuitCooldownMs:Ap},ut.set(t,n);ut.size>Rp;){const r=ut.keys().next().value;if(!r)break;ut.delete(r)}return n}function _p(e){e&&ut.delete(fi(e))}function ca(e,t){if(!e)return;const n=Mp(e);n.consecutiveErrors+=1,n.lastErrorAt=Date.now(),Lp(t)&&n.consecutiveErrors>=Pp&&(n.circuitOpen=!0,n.circuitOpenAt=Date.now(),console.warn(`[provider-tracker] Circuit opened for ${e} after ${n.consecutiveErrors} consecutive errors`))}function Lp(e){return e!==void 0&&Dp.has(e)}function Fp(e){const t=ut.get(fi(e));return t?.circuitOpen?Date.now()-t.circuitOpenAt>=t.circuitCooldownMs?(t.circuitOpen=!1,t.consecutiveErrors=0,t.circuitCooldownMs=Math.min(t.circuitCooldownMs*2,Ip*4),!1):!0:!1}function Up(e){if(!(!e||!Fp(e)))throw new Error(`Provider ${e} is temporarily unavailable after repeated errors. Please retry shortly.`)}const la="/api",jp=1e4,Np=4e3;function yn(e){if(e instanceof Error)return e.message;if(typeof e=="string")return e;if(e&&typeof e=="object"&&"message"in e&&typeof e.message=="string")return e.message;try{return JSON.stringify(e)}catch{return String(e)}}const Bp=v({reason:m().optional(),isDirectory:Fe().optional()});function Ne(e,t){if(e.error){const n=e.response?.status,r=new Error(`${t} failed${n?` (${n})`:""}: ${yn(e.error)}`);throw n!==void 0&&(r.status=n),r}if(e.data===void 0||e.data===null)throw new Error(`${t} failed: empty response`);return e.data}function an(e,t){if(e.error){const n=e.response?.status,r=new Error(`${t} failed${n?` (${n})`:""}: ${yn(e.error)}`);throw n!==void 0&&(r.status=n),r}return e.data}const Hp=/^[a-zA-Z][a-zA-Z\d+\-.]*:\/\//,ua="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",zp=14;let da=0,qo=0;const $p=e=>{const t=new Uint8Array(e);if(typeof crypto<"u"&&typeof crypto.getRandomValues=="function")crypto.getRandomValues(t);else for(let r=0;r<e;r+=1)t[r]=Math.floor(Math.random()*256);let n="";for(let r=0;r<e;r+=1)n+=ua[t[r]%ua.length];return n},fa=e=>{const t=Date.now();t!==da&&(da=t,qo=0),qo+=1;const n=BigInt(t)*BigInt(4096)+BigInt(qo),r=new Uint8Array(6);for(let s=0;s<6;s+=1)r[s]=Number(n>>BigInt(40-8*s)&BigInt(255));const o=Array.from(r,s=>s.toString(16).padStart(2,"0")).join("");return`${e}_${o}${$p(zp)}`},pa=e=>{const t=typeof e=="string"&&e.trim().length>0?e.trim():"/api";if(Hp.test(t)||typeof window>"u")return t;const n=window.location?.href||window.location?.origin;if(!n)return t;try{return new URL(t,n).toString()}catch(r){return console.warn("Failed to normalize OpenCode base URL:",r),t}},ha=()=>{try{return Ee().api("/api")}catch{return null}},vl=e=>{const t=typeof AbortSignal<"u"?AbortSignal:void 0;if(typeof t?.timeout=="function")return{signal:t.timeout(e),cleanup:()=>{}};const n=new AbortController,r=setTimeout(()=>n.abort(),e);return{signal:n.signal,cleanup:()=>clearTimeout(r)}},Gp=3e4,Wp=e=>(typeof e=="string"?e:e instanceof URL?e.toString():e.url).includes("/event"),Ko=e=>{const t=e.requestTimeoutMs??Gp;return Hu({...e,fetch:async(n,r)=>{const o=String(r?.method??(n instanceof Request?n.method:"GET")).toUpperCase();if(Wp(n)||o==="POST")return y(n,r);const s=vl(t),i=r?.signal!==void 0?r.signal:n instanceof Request?n.signal:void 0,a=typeof AbortSignal<"u"&&typeof AbortSignal.any=="function";let c,l=null;if(i&&a)c=AbortSignal.any([i,s.signal]);else if(i){const f=new AbortController,p=()=>f.abort(i.reason),g=()=>f.abort(s.signal.reason);i.aborted?p():s.signal.aborted?g():(i.addEventListener("abort",p,{once:!0}),s.signal.addEventListener("abort",g,{once:!0}),l=()=>{i.removeEventListener("abort",p),s.signal.removeEventListener("abort",g)}),c=f.signal}else c=s.signal;const u=()=>{l?.(),s.cleanup()};let d=!1;try{const f=await y(n,{...r,signal:c});return d=f.body!==null,f}catch(f){throw s.signal.aborted&&!i?.aborted?new Error(`OpenCode request timed out after ${t}ms`):f}finally{!d||c.aborted?u():c.addEventListener("abort",u,{once:!0})}}})},cn=e=>e.replace(/\\/g,"/"),ma=400,ga=()=>{const e=Po();return e&&e.runtime?.isDesktop&&e.files?e.files:null},Or=m().trim().regex(/^(?:\/|[A-Za-z]:[\\/]|\\\\)/),qp=v({home:Or,chatsRoot:Or.optional(),canonicalChatsRoot:Or.optional(),canonicalLegacyChatsRoot:Or.optional()});class Kp{client;baseUrl;scopedClients=new Map;currentDirectory=void 0;directoryContextQueue=Promise.resolve();listDirectoryInFlight=new Map;configProvidersInFlight=new Map;listAgentsInFlight=new Map;configInFlight=new Map;configCache=new Map;configCacheGeneration=0;listDirectoryCache=new Map;constructor(t=la){const r=ha()||t;this.baseUrl=pa(r),this.client=Ko({baseUrl:this.baseUrl})}assertRuntimeUnchanged(t){if(t&&t!==G())throw new Error("Message was not sent because the runtime changed.")}getBaseUrl(){return this.baseUrl}reconnectToRuntimeBaseUrl(){const t=ha(),n=pa(t||la);this.baseUrl=n,this.client=Ko({baseUrl:this.baseUrl}),this.scopedClients.clear(),this.listDirectoryInFlight.clear(),this.configProvidersInFlight.clear(),this.listAgentsInFlight.clear(),this.clearConfigCache(),this.listDirectoryCache.clear()}getSdkClient(){return this.client}getScopedSdkClient(t){return this.getScopedApiClient(t)}getScopedApiClient(t){const n=this.normalizeCandidatePath(t)??t,r=n||"",o=this.scopedClients.get(r);if(o)return o;const s=Ko({baseUrl:this.baseUrl,directory:n});return this.scopedClients.set(r,s),s}normalizeCandidatePath(t){return Ye(t)}deriveHomeDirectory(t){const n=t.match(/^([A-Za-z]:)(?:\/|$)/);if(n){const s=n[1],a=t.slice(s.length+(t.charAt(s.length)==="/"?1:0)).split("/").filter(Boolean);return a.length>=2?{homeDirectory:`${s}/${a[0]}/${a[1]}`,username:a[1]}:a.length===1?{homeDirectory:`${s}/${a[0]}`,username:a[0]}:{homeDirectory:`${s}/`,username:void 0}}const r=t.startsWith("/"),o=t.split("/").filter(Boolean);return o.length>=2&&(o[0]==="Users"||o[0]==="home")?{homeDirectory:`${r?"/":""}${o[0]}/${o[1]}`,username:o[1]}:r?o.length===0?{homeDirectory:"/",username:void 0}:{homeDirectory:`/${o.join("/")}`,username:o[o.length-1]}:o.length>0?{homeDirectory:`/${o.join("/")}`,username:o[o.length-1]}:{homeDirectory:"/",username:void 0}}setDirectory(t){const n=this.normalizeCandidatePath(t)??t;this.currentDirectory!==n&&$e("opencodeClient:setDirectory",{previous:this.currentDirectory??null,next:n??null}),this.currentDirectory=n}getDirectory(){return this.currentDirectory}async withDirectory(t,n){const r=async()=>{if(t==null)return n();const s=this.currentDirectory,i=this.normalizeCandidatePath(t)??t;this.currentDirectory=i;try{return await n()}finally{this.currentDirectory===i&&(this.currentDirectory=s)}},o=this.directoryContextQueue.then(r,r);return this.directoryContextQueue=o.then(()=>{},()=>{}),o}getApiClient(){return this.client}async getSystemInfo(){const t=new Set,n=o=>{const s=this.normalizeCandidatePath(o);s&&t.add(s)};try{const s=(await this.client.path.get(this.currentDirectory?{directory:this.currentDirectory}:void 0)).data;s&&(n(s.directory),n(s.worktree),n(s.state))}catch(o){console.debug("Failed to load path info:",o)}if(!t.size)try{const o=await this.client.project.current(this.currentDirectory?{directory:this.currentDirectory}:void 0);n(o.data?.worktree)}catch(o){console.debug("Failed to load project info:",o)}if(!t.size)try{(await this.listSessions()).forEach(s=>n(s.directory))}catch(o){console.debug("Failed to inspect sessions for system info:",o)}if(n(this.currentDirectory),typeof window<"u")try{n(window.localStorage.getItem("lastDirectory")),n(window.localStorage.getItem("homeDirectory"))}catch{}if(!t.size&&typeof process<"u"&&typeof process.cwd=="function"&&n(process.cwd()),!t.size)return{homeDirectory:"/",username:void 0};const[r]=Array.from(t);return this.deriveHomeDirectory(r)}async probeDirectory(t){return await this.getDirectoryAvailability(t)==="available"}async getDirectoryAvailability(t){const n=this.normalizeCandidatePath(t);if(!n)return"unknown";try{const r=await y("/api/fs/directory-stat",{query:{path:n}}),o=Bp.safeParse(await r.json().catch(()=>null)).data;if(r.ok&&o?.isDirectory===!0)return"available";const s=mo(o?.reason);return s==="not-found"||s==="not-directory"?"missing":"unknown"}catch{return"unknown"}}async listSessions(){const t=await this.client.session.list(this.currentDirectory?{directory:this.currentDirectory}:void 0);return Array.isArray(t.data)?t.data:[]}async createSession(t,n){const r=this.normalizeCandidatePath(n)??this.currentDirectory,o=await this.client.session.create({...r?{directory:r}:{},parentID:t?.parentID,title:t?.title,metadata:t?.metadata});return Ne(o,"session.create")}async getSession(t,n){const r=this.normalizeCandidatePath(n)??this.currentDirectory,o=await this.client.session.get({sessionID:t,...r?{directory:r}:{}});return Ne(o,"session.get")}async deleteSession(t,n){const r=this.normalizeCandidatePath(n)??this.currentDirectory,o=await this.client.session.delete({sessionID:t,...r?{directory:r}:{}});return an(o,"session.delete")===!0}async updateSession(t,n,r){const o=this.normalizeCandidatePath(r)??this.currentDirectory,s={...n.title!==void 0?{title:n.title}:{},...n.metadata!==void 0?{metadata:n.metadata}:{},...n.time?.archived!==void 0&&n.time.archived!==null?{time:{archived:n.time.archived}}:{}},i=await this.client.session.update({sessionID:t,...o?{directory:o}:{},...s});return Ne(i,"session.update")}async getSessionMessages(t,n,r){const o=this.normalizeCandidatePath(r)??this.currentDirectory,s=await this.client.session.messages({sessionID:t,...o?{directory:o}:{},...typeof n=="number"?{limit:n}:{}});return Ne(s,"session.messages")}async getSessionTodos(t){try{const n=await this.client.session.todo({sessionID:t,...this.currentDirectory?{directory:this.currentDirectory}:{}});if(n.error)return[];const r=n.data;return!r||!Array.isArray(r)?[]:r}catch{return[]}}shouldNormalizeToTextPlain(t){if(!t)return!1;const n=t.toLowerCase();return n.startsWith("text/")&&n!=="text/plain"?!0:["application/json","application/xml","application/javascript","application/typescript","application/x-yaml","application/yaml","application/toml","application/x-sh","application/x-shellscript","application/octet-stream","image/svg+xml"].includes(n)}isHeicMime(t){if(!t)return!1;const n=t.toLowerCase();return n==="image/heic"||n==="image/heif"}async convertHeicToJpeg(t){try{const n=(await Xs(async()=>{const{default:d}=await import("./vendor-heic2any-CEam9pDc.js").then(f=>f.h);return{default:d}},__vite__mapDeps([0,1,2]))).default,r=t.url.indexOf(",");if(r===-1)return t;const o=t.url.substring(r+1),s=atob(o),i=new Uint8Array(s.length);for(let d=0;d<s.length;d++)i[d]=s.charCodeAt(d);const a=new Blob([i],{type:t.mime}),c=await n({blob:a,toType:"image/jpeg",quality:.9}),l=await new Promise((d,f)=>{const p=new FileReader;p.onload=()=>d(p.result),p.onerror=f,p.readAsDataURL(c)});let u=t.filename;return u&&(u=u.replace(/\.heic$/i,".jpg").replace(/\.heif$/i,".jpg")),{mime:"image/jpeg",filename:u,url:l}}catch(n){return console.warn("Failed to convert HEIC to JPEG:",n),t}}async normalizeFilePart(t){if(this.isHeicMime(t.mime))return this.convertHeicToJpeg(t);if(!this.shouldNormalizeToTextPlain(t.mime))return t;let n=t.url;if(t.url.startsWith("data:")){const r=t.url.indexOf(",");if(r!==-1){const o=t.url.substring(5,r),s=t.url.substring(r);n=`data:${o.replace(/^[^;,]+/,"text/plain")}${s}`}}return{mime:"text/plain",filename:t.filename,url:n}}async toNormalizedFilePartInput(t){const n=await this.normalizeFilePart(t);return{...t.id?{id:t.id}:{},type:"file",mime:n.mime,filename:n.filename,url:n.url}}async sendMessage(t){this.assertRuntimeUnchanged(t.runtimeKey);const n=t.messageId??fa("msg"),r=[];if(t.prefaceText&&t.prefaceText.trim()&&r.push({type:"text",text:t.prefaceText,synthetic:t.prefaceTextSynthetic!==!1}),t.text&&t.text.trim()){const l={type:"text",text:t.text};r.push(l)}if(t.files&&t.files.length>0)for(const l of t.files){const u=await this.toNormalizedFilePartInput(l);r.push(u)}if(t.additionalParts&&t.additionalParts.length>0)for(const l of t.additionalParts){if(l.text&&l.text.trim()){const u={type:"text",text:l.text};l.synthetic&&(u.synthetic=!0),l.metadata&&(u.metadata=l.metadata),r.push(u)}if(l.files&&l.files.length>0)for(const u of l.files){const d=await this.toNormalizedFilePartInput(u);r.push(d)}}if(t.agentMentions&&t.agentMentions.length>0)for(const l of t.agentMentions)l?.name&&r.push({type:"agent",name:l.name,...l.source?{source:l.source}:{}});if(r.length===0)throw new Error("Message must have at least one part (text or file)");const o=this.normalizeCandidatePath(t.directory??null)??this.currentDirectory;t.format&&console.info("[git-generation][browser] send structured message",{sessionId:t.id,providerID:t.providerID,modelID:t.modelID,agent:t.agent,variant:t.variant,directory:o,baseUrl:this.baseUrl,formatType:t.format.type}),Up(t.providerID),this.assertRuntimeUnchanged(t.runtimeKey);let s;try{const l=await this.client.session.promptAsync({sessionID:t.id,...o?{directory:o}:{},model:{providerID:t.providerID,modelID:t.modelID},agent:t.agent,variant:t.variant,messageID:n,...t.delivery?{delivery:t.delivery}:{},...t.format?{format:t.format}:{},parts:r});if(l.response instanceof Response)s=l.response;else if(l.error){const u=l.response?.status;if(!u){const d=new Error(`Message send transport failure: ${yn(l.error)}`);throw Pd(l.error)?Oc(d):d}s=new Response(JSON.stringify(l.error),{status:u})}else s=new Response(JSON.stringify(l.data??!0),{status:200})}catch(l){throw ca(t.providerID),l}if(s.ok)return _p(t.providerID),n;let i="";try{i=await s.text()}catch{}const a=i&&i.trim().length>0?`: ${i.trim()}`:"",c=new Error(`Failed to send message (${s.status})${a}`);throw c.status=s.status,ca(t.providerID,s.status),c}async sendCommand(t){this.assertRuntimeUnchanged(t.runtimeKey);const n=t.messageId??fa("msg"),r=[];if(t.files&&t.files.length>0)for(const i of t.files)r.push(await this.toNormalizedFilePartInput(i));const o=this.normalizeCandidatePath(t.directory??null)??this.currentDirectory;this.assertRuntimeUnchanged(t.runtimeKey);const s=await this.client.session.command({sessionID:t.id,...o?{directory:o}:{},command:t.command,arguments:t.arguments??"",model:`${t.providerID}/${t.modelID}`,agent:t.agent,variant:t.variant,...r.length>0?{parts:r}:{},messageID:n});return an(s,"session.command"),n}async abortSession(t){return!!(await this.client.session.abort({sessionID:t,...this.currentDirectory?{directory:this.currentDirectory}:{}},{throwOnError:!0})).data}async shellSession(t){this.assertRuntimeUnchanged(t.runtimeKey);const n=this.normalizeCandidatePath(t.directory??null)??this.currentDirectory,r=await this.client.session.shell({sessionID:t.sessionId,...n?{directory:n}:{},messageID:t.messageId,agent:t.agent,model:t.model,command:t.command});return Ne(r,"session.shell")}async revertSession(t,n,r,o){const s=this.normalizeCandidatePath(o)??this.currentDirectory,i=await this.client.session.revert({sessionID:t,...s?{directory:s}:{},messageID:n,partID:r});return Ne(i,"session.revert")}async summarizeSession(t,n,r,o){const s=this.normalizeCandidatePath(o)??this.currentDirectory,i=await this.client.session.summarize({sessionID:t,...s?{directory:s}:{},providerID:n,modelID:r});return an(i,"session.summarize")===!0}async unrevertSession(t){const n=await this.client.session.unrevert({sessionID:t,...this.currentDirectory?{directory:this.currentDirectory}:{}});return Ne(n,"session.unrevert")}async forkSession(t,n,r){const o=this.normalizeCandidatePath(r)??this.currentDirectory,s=await this.client.session.fork({sessionID:t,...o?{directory:o}:{},messageID:n});return Ne(s,"session.fork")}async getSessionStatus(){return await this.getSessionStatusForDirectory(this.currentDirectory??null)??{}}async getSessionStatusForDirectory(t){try{const n=this.normalizeCandidatePath(t),r=await this.client.session.status(n?{directory:n}:void 0);if(r.error)return null;const o=Sp.safeParse(r.data);return o.success?o.data:null}catch{return null}}async getGlobalSessionStatus(){return await this.getSessionStatusForDirectory(null)??{}}async getHostSessionStatusSnapshot(){try{const t=await y("/api/sessions/status",{method:"GET",headers:{Accept:"application/json"}});if(!t.ok)return null;const n=kp.safeParse(await t.json().catch(()=>null));return n.success?n.data:null}catch{return null}}async getWebServerSessionActivity(){try{const t=await y("/api/session-activity",{method:"GET",headers:{Accept:"application/json"}});if(!t.ok)return null;const n=await t.json().catch(()=>null);return!n||typeof n!="object"?null:n}catch{return null}}async listToolIds(t){try{const n=typeof t?.directory=="string"?t.directory.trim():this.currentDirectory?this.currentDirectory.trim():"";return((await this.client.tool.ids(n?{directory:n}:void 0)).data||[]).filter(s=>typeof s=="string"&&s!=="invalid")}catch{return[]}}async replyToPermission(t,n,r){const o=this.normalizeCandidatePath(r?.directory??null)??this.currentDirectory,s=await this.client.permission.reply({requestID:t,...o?{directory:o}:{},reply:n,...r?.message?{message:r.message}:{}});return an(s,"permission.reply")===!0}async createPermission(t,n,r,o){try{const s=await this.client.v2.session.permission.create({sessionID:t,action:n,resources:r,...o?.id?{id:o.id}:{},...o?.save?{save:o.save}:{},...o?.metadata?{metadata:o.metadata}:{},...o?.source?{source:o.source}:{},...o?.agent?{agent:o.agent}:{}});if(s.error!==void 0)return null;const i=s.data?.data;return i===void 0?null:{id:i.id,effect:i.effect}}catch{return null}}async fetchPermission(t,n,r){try{const s=await(r?this.getScopedSdkClient(r):this.client).v2.session.permission.get({sessionID:t,requestID:n});if(s.error===void 0){const i=s.data?.data;if(i!==void 0)return{state:"ok",permission:i}}return s.response?.status===404?{state:"resolved"}:{state:"unknown"}}catch{return{state:"unknown"}}}async listPendingPermissions(t){const n=[],r=async c=>{const l=typeof c=="string"?c.trim():"",u=await this.client.permission.list(l?{directory:l}:void 0);if(u.error)throw new Error(`permission.list failed: ${yn(u.error)}`);return u.data||[]};n.push(r(null));const o=new Set;for(const c of t?.directories??[]){const l=this.normalizeCandidatePath(c??null);l&&o.add(l)}for(const c of o)n.push(r(c));const s=await Promise.all(n),i=[],a=new Set;for(const c of s)for(const l of c){if(!l||typeof l!="object")continue;const u=l.id;typeof u!="string"||u.length===0||a.has(u)||(a.add(u),i.push(l))}return i}async replyToQuestion(t,n,r){const o=!Array.isArray(n)||n.length===0?[]:Array.isArray(n[0])?n:[n],s=this.normalizeCandidatePath(r)??this.currentDirectory,i=await this.client.question.reply({requestID:t,...s?{directory:s}:{},answers:o});return an(i,"question.reply")===!0}async rejectQuestion(t){const n=await this.client.question.reject({requestID:t,...this.currentDirectory?{directory:this.currentDirectory}:{}});return an(n,"question.reject")===!0}async listPendingQuestions(t){const n=[],r=async c=>{const l=typeof c=="string"?c.trim():"",u=await this.client.question.list(l?{directory:l}:void 0);if(u.error)throw new Error(`question.list failed: ${yn(u.error)}`);return u.data||[]};n.push(r(null));const o=new Set;for(const c of t?.directories??[]){const l=this.normalizeCandidatePath(c??null);l&&o.add(l)}for(const c of o)n.push(r(c));const s=await Promise.all(n),i=[],a=new Set;for(const c of s)for(const l of c){if(!l||typeof l!="object")continue;const u=l.id;typeof u!="string"||u.length===0||a.has(u)||(a.add(u),i.push(l))}return i}clearConfigCache(){this.configCacheGeneration+=1,this.configInFlight.clear(),this.configCache.clear()}async getConfig(t){const n=this.normalizeCandidatePath(t)??t??this.currentDirectory??void 0,r=n??"",o=this.configCache.get(r);if(o&&o.expiresAt>Date.now())return $e("opencodeClient.getConfig:cacheHit",{directory:n??null}),o.config;const s=this.configInFlight.get(r);if(s)return $e("opencodeClient.getConfig:deduped",{directory:n??null}),s;const i=this.configCacheGeneration,a=(async()=>{$e("opencodeClient.getConfig:start",{directory:n??null});const c=typeof performance<"u"?performance.now():Date.now(),u=await(n?this.getScopedApiClient(n):this.client).config.get();if(!u.data)throw new Error("Failed to get config");const d=typeof performance<"u"?performance.now():Date.now();return $e("opencodeClient.getConfig:end",{directory:n??null,durationMs:Math.round(d-c)}),i===this.configCacheGeneration&&this.configCache.set(r,{config:u.data,expiresAt:Date.now()+jp}),u.data})();this.configInFlight.set(r,a);try{return await a}finally{this.configInFlight.get(r)===a&&this.configInFlight.delete(r)}}async updateConfig(t){const n=await this.client.config.update({config:t}),r=Ne(n,"global.config.update");return this.clearConfigCache(),r}async updateConfigPartial(t){const n=await this.getConfig(),r=t(n);return await this.updateConfig(r)}async getProviders(){return this.getProvidersForConfig(this.currentDirectory)}async getProvidersForConfig(t){const n=this.normalizeCandidatePath(t)??t??this.currentDirectory??void 0,r=n??"",o=this.configProvidersInFlight.get(r);if(o)return o;const s=(async()=>{const i=await this.client.config.providers(n?{directory:n}:void 0);return Ne(i,"config.providers")})();this.configProvidersInFlight.set(r,s);try{return await s}finally{this.configProvidersInFlight.get(r)===s&&this.configProvidersInFlight.delete(r)}}async getApp(){return{version:"0.0.3",config:await this.getConfig()}}async initApp(){try{return await this.checkHealth()}catch{return!1}}async listAgents(t){const n=this.normalizeCandidatePath(t)??t??this.currentDirectory??void 0,r=n??"",o=this.listAgentsInFlight.get(r);if(o)return o;const s=(async()=>{const i=n?{directory:n}:void 0,a=await this.client.app.agents(i);if(!a.error&&Array.isArray(a.data)&&a.data.length>0)return a.data;const c=await y("/api/agent",{...n?{query:{directory:n}}:{}});if(!c.ok)throw a.error?new Error(`app.agents failed${a.response?.status?` (${a.response.status})`:""}: ${yn(a.error)}`):new Error(`agent.list failed (${c.status})`);const l=await c.json().catch(()=>null);if(!Array.isArray(l))throw new Error("agent.list failed: invalid response");return l})();this.listAgentsInFlight.set(r,s);try{return await s}finally{this.listAgentsInFlight.get(r)===s&&this.listAgentsInFlight.delete(r)}}async listCommandsWithDetails(t,n){const r=this.normalizeCandidatePath(t??null)??this.currentDirectory,o=await this.client.command.list(r?{directory:r}:void 0,{signal:n});return(Ne(o,"command.list")||[]).map(i=>({name:i.name,description:i.description,agent:i.agent,model:i.model,source:i.source,template:i.template}))}async checkHealth(){try{const t=this.baseUrl.endsWith("/")?this.baseUrl.replace(/\/+$/,""):this.baseUrl,n=t==="/api"||t.endsWith("/api")?"/api/opencode/health":`${t}/opencode/health`;$e("opencodeClient.checkHealth:url",{baseUrl:this.baseUrl,healthUrl:n});const r=vl(Np),o=await y(n,{signal:r.signal}).finally(r.cleanup);if($e("opencodeClient.checkHealth:response",{status:o.status}),!o.ok)return!1;const s=await o.json();return $e("opencodeClient.checkHealth:result",{healthy:s?.healthy}),s?.healthy===!0}catch{return!1}}async createDirectory(t,n){const r=ga();if(r?.createDirectory)try{return await r.createDirectory(t)}catch(a){const c=a instanceof Error?a.message:String(a);throw new Error(c||"Failed to create directory")}if(n?.asProject){const a=await y(`${this.baseUrl}/opencode/directory`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:t,create:!0})});if(!a.ok){const l=await a.json().catch(()=>({error:"Failed to create project directory"}));throw new Error(l.error||"Failed to create project directory")}return{success:!0,path:(await a.json()).path}}const o={path:t,...n?.allowOutsideWorkspace?{allowOutsideWorkspace:!0}:{}},s=await y(`${this.baseUrl}/fs/mkdir`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)});if(!s.ok){const a=await s.json().catch(()=>({error:"Failed to create directory"}));throw new Error(a.error||"Failed to create directory")}return await s.json()}async cloneRepository(t){const n=await y(`${this.baseUrl}/fs/clone`,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(t)});if(!n.ok){const r=await n.json().catch(()=>({error:"Failed to clone repository"}));throw new Error(r.error||"Failed to clone repository")}return await n.json()}async listLocalDirectory(t,n){const o=`${typeof t=="string"?cn(t.trim()):""}|${n?.respectGitignore?"1":"0"}`,s=Date.now(),i=this.listDirectoryCache.get(o);if(i&&i.expiresAt>s)return i.entries;const a=this.listDirectoryInFlight.get(o);if(a)return a;const l=(async()=>{const u=ga();try{if(u){const w=await u.listDirectory(t||"",n);if(!w||!Array.isArray(w.entries))throw new Yt("Directory listing returned an invalid response",{reason:"invalid-response"});const E=w.entries.map(k=>({name:k.name,path:cn(k.path),isDirectory:!!k.isDirectory,isFile:!k.isDirectory,isSymbolicLink:!1}));return this.listDirectoryCache.set(o,{entries:E,expiresAt:Date.now()+ma}),E}const d=new URLSearchParams;t&&t.trim().length>0&&d.set("path",t),n?.respectGitignore&&d.set("respectGitignore","true");const f=d.toString(),p=await y(`${this.baseUrl}/fs/list${f?`?${f}`:""}`);if(!p.ok){const w=await p.json().catch(()=>({})),E=typeof w.error=="string"?w.error:"Failed to list directory";throw new Yt(E,{reason:mo(w.reason),status:p.status})}const g=await p.json();if(!g||!Array.isArray(g.entries))throw new Yt("Directory listing returned an invalid response",{reason:"invalid-response"});const b=g.entries;return this.listDirectoryCache.set(o,{entries:b,expiresAt:Date.now()+ma}),b}catch(d){throw console.error("Failed to list directory contents:",d),d}})().finally(()=>{this.listDirectoryInFlight.get(o)===l&&this.listDirectoryInFlight.delete(o)});return this.listDirectoryInFlight.set(o,l),l}async searchFiles(t,n){const r=typeof n?.directory=="string"&&n.directory.trim().length>0?n.directory.trim():this.currentDirectory,o=r?cn(r):null,s=r?this.getScopedApiClient(r):this.client;try{const i=await s.find.files({query:t,limit:typeof n?.limit=="number"&&Number.isFinite(n.limit)?n.limit:void 0,dirs:n?.dirs===!1||n?.type==="file"?"false":"true",type:n?.type});return(Array.isArray(i?.data)?i.data:[]).map(c=>{const l=cn(c),u=l.split("/").filter(Boolean).pop()||l,d=cn(o?`${o}/${l}`:l);return{name:u,path:d,relativePath:l,extension:u.includes(".")?u.split(".").pop()?.toLowerCase():void 0}})}catch(i){throw console.error("Failed to search files:",i),i}}async getFilesystemHome(){const t=G();if(!t||t==="local"){const n=await Gc();if(n)return n}try{const n=await y(`${this.baseUrl}/fs/home`,{method:"GET",headers:{Accept:"application/json"}});if(!n.ok){const o=await n.json().catch(()=>({})),s=typeof o.error=="string"&&o.error.length>0?o.error:"Failed to resolve home directory";throw new Error(s)}const r=await n.json();return r&&typeof r.home=="string"&&r.home.length>0?r.home:null}catch(n){return console.warn("Failed to resolve filesystem home directory:",n),null}}async getFilesystemHomeInfo(){const t=await y(`${this.baseUrl}/fs/home`,{method:"GET",headers:{Accept:"application/json"}});if(!t.ok)throw new Error(`Failed to resolve the chats root (${t.status})`);return qp.parse(await t.json())}async setOpenCodeWorkingDirectory(t){if(!t||typeof t!="string"||!t.trim())return console.warn("[OpencodeClient] setOpenCodeWorkingDirectory: invalid path",t),null;const n=`${this.baseUrl}/opencode/directory`;console.log("[OpencodeClient] POST",n,"with path:",t);try{const r=await y(n,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:t})}),o=await r.json().catch(()=>null);if(!r.ok){const s=o??{},i=typeof s.error=="string"&&s.error.length>0?s.error:"Failed to update OpenCode working directory";throw new Error(i)}return o&&typeof o=="object"?o:{success:!0,restarted:!1,path:t}}catch(r){throw console.warn("Failed to update OpenCode working directory:",r),r}}}const rt=new Kp;let Vo=null,Jo=null,Yo=null;const ya=new Set;let wa=!1;const kl=e=>{if(ya.add(e),wa||typeof window>"u")return;wa=!0;const t=()=>{for(const n of ya)n()};try{window.addEventListener("pagehide",t,{capture:!0}),window.addEventListener("beforeunload",t,{capture:!0}),typeof document<"u"&&(document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&t()}),document.addEventListener("freeze",t))}catch{}},Vp=(e,t)=>{let n;try{n=e()}catch{return}const r=new Map,o=new Set;let s;const i=()=>{if(s=void 0,r.size===0&&o.size===0)return;const c=Array.from(r.entries()),l=Array.from(o);r.clear(),o.clear();for(const[u,d]of c)try{n.setItem(u,JSON.stringify(d,t?.replacer))}catch(f){console.error("Failed to persist deferred storage value",f),!r.has(u)&&!o.has(u)&&r.set(u,d)}for(const u of l)try{n.removeItem(u)}catch(d){console.error("Failed to remove deferred storage value",d),r.has(u)||o.add(u)}},a=()=>{s===void 0&&(s=setTimeout(i,0))};return kl(i),{getItem:c=>{if(r.has(c))return r.get(c)??null;if(o.has(c))return null;const l=d=>{if(d===null)return null;try{return JSON.parse(d,t?.reviver)}catch{try{n.removeItem(c)}catch{}return null}},u=n.getItem(c);return u instanceof Promise?u.then(l):l(u)},setItem:(c,l)=>{r.set(c,l),o.delete(c),a()},removeItem:c=>{r.delete(c),o.add(c),a()}}},pi=e=>Vp(()=>Al(),e),Jp=e=>{const t=new Map,n=new Set;let r;const o=()=>{if(r=void 0,t.size===0&&n.size===0)return;const i=Array.from(t.entries()),a=Array.from(n);t.clear(),n.clear();for(const[c,l]of i)try{e.setItem(c,l)}catch(u){console.error("Failed to persist deferred storage value",u),!t.has(c)&&!n.has(c)&&t.set(c,l)}for(const c of a)try{e.removeItem(c)}catch(l){console.error("Failed to remove deferred storage value",l),t.has(c)||n.add(c)}},s=()=>{r===void 0&&(r=setTimeout(o,0))};return kl(o),{getItem:i=>t.has(i)?t.get(i)??null:n.has(i)?null:e.getItem(i),setItem:(i,a)=>{t.set(i,a),n.delete(i),s()},removeItem:i=>{t.delete(i),n.add(i),s()},clear:()=>{t.clear(),n.clear(),r!==void 0&&(clearTimeout(r),r=void 0),e.clear()},key:i=>e.key(i),get length(){return e.length}}},El=e=>{if(typeof window>"u")return null;try{return window[e]??null}catch{return null}},hi=()=>{const e=new Map;return{getItem:t=>e.get(t)??null,setItem:(t,n)=>{e.set(t,n)},removeItem:t=>{e.delete(t)},clear:()=>{e.clear()},key:t=>Array.from(e.keys())[t]??null,get length(){return e.size}}},Pl=e=>{const t=hi(),n=new Set,r=new Set,o=l=>{if(r.has(l))return null;if(n.has(l))return t.getItem(l);try{return e.getItem(l)}catch{return null}},s=(l,u)=>{try{e.setItem(l,u),t.removeItem(l),n.delete(l),r.delete(l);return}catch{try{e.removeItem(l)}catch{}}t.setItem(l,u),n.add(l),r.delete(l)},i=l=>{try{e.removeItem(l),r.delete(l)}catch{r.add(l)}t.removeItem(l),n.delete(l)},a=()=>{const l=[];try{for(let u=0;u<e.length;u+=1){const d=e.key(u);d&&l.push(d)}}catch{}try{e.clear(),r.clear()}catch{for(const u of l)r.add(u)}t.clear(),n.clear()},c=()=>{const l=new Set;try{for(let u=0;u<e.length;u+=1){const d=e.key(u);d&&!r.has(d)&&!n.has(d)&&l.add(d)}}catch{}for(const u of n)l.add(u);return[...l]};return{getItem:o,setItem:s,removeItem:i,clear:a,key:l=>c()[l]??null,get length(){return c().length}}},Yp=()=>{const e=El("localStorage");return e?Pl(e):hi()},Al=()=>(Vo||(Vo=Yp()),Vo),mr=()=>(Yo||(Yo=Jp(Al())),Yo),Qp=()=>{const e=El("sessionStorage");return e?Pl(e):hi()},Xp=()=>(Jo||(Jo=Qp()),Jo),Zp={markdown:"0.875rem",code:"0.75rem",uiHeader:"0.875rem",uiLabel:"0.84375rem",meta:"0.8125rem",micro:"0.8125rem",settingsPageTitle:"1.0625rem"},bT={markdown:"0.8438rem",code:"0.8125rem",uiHeader:"0.8438rem",uiLabel:"0.7813rem",meta:"0.7813rem",micro:"0.75rem",settingsPageTitle:"1rem"};function ba(e){return`--text-${e.replace(/([A-Z])/g,"-$1").toLowerCase()}`}const Mr={semanticMarkdown:{fontSize:"var(--text-markdown)"},semanticCode:{fontSize:"var(--text-code)"},uiHeader:{fontSize:"var(--text-ui-header)"},uiLabel:{fontSize:"var(--text-ui-label)"},meta:{fontSize:"var(--text-meta)"},micro:{fontSize:"var(--text-micro)"},ui:{button:{fontSize:"var(--text-ui-label)",lineHeight:"var(--ui-button-line-height)",letterSpacing:"var(--ui-button-letter-spacing)",fontWeight:"var(--ui-button-font-weight)"},buttonSmall:{fontSize:"var(--text-meta)",lineHeight:"var(--ui-button-small-line-height)",letterSpacing:"var(--ui-button-small-letter-spacing)",fontWeight:"var(--ui-button-small-font-weight)"},buttonLarge:{fontSize:"var(--text-ui-label)",lineHeight:"var(--ui-button-large-line-height)",letterSpacing:"var(--ui-button-large-letter-spacing)",fontWeight:"var(--ui-button-large-font-weight)"},label:{fontSize:"var(--text-meta)",lineHeight:"var(--ui-label-line-height)",letterSpacing:"var(--ui-label-letter-spacing)",fontWeight:"var(--ui-label-font-weight)"},caption:{fontSize:"var(--text-micro)",lineHeight:"var(--ui-caption-line-height)",letterSpacing:"var(--ui-caption-letter-spacing)",fontWeight:"var(--ui-caption-font-weight)"},badge:{fontSize:"var(--text-micro)",lineHeight:"var(--ui-badge-line-height)",letterSpacing:"var(--ui-badge-letter-spacing)",fontWeight:"var(--ui-badge-font-weight)"},tooltip:{fontSize:"var(--text-micro)",lineHeight:"var(--ui-tooltip-line-height)",letterSpacing:"var(--ui-tooltip-letter-spacing)",fontWeight:"var(--ui-tooltip-font-weight)"},input:{fontSize:"var(--text-ui-label)",lineHeight:"var(--ui-input-line-height)",letterSpacing:"var(--ui-input-letter-spacing)",fontWeight:"var(--ui-input-font-weight)"},helperText:{fontSize:"var(--text-meta)",lineHeight:"var(--ui-helper-text-line-height)",letterSpacing:"var(--ui-helper-text-letter-spacing)",fontWeight:"var(--ui-helper-text-font-weight)"}},code:{inline:{fontSize:"var(--text-code)",lineHeight:"var(--code-inline-line-height)",letterSpacing:"var(--code-inline-letter-spacing)",fontWeight:"var(--code-inline-font-weight)"},block:{fontSize:"var(--text-code)",lineHeight:"var(--code-block-line-height)",letterSpacing:"var(--code-block-letter-spacing)",fontWeight:"var(--code-block-font-weight)"},lineNumbers:{fontSize:"var(--text-micro)",lineHeight:"var(--code-line-numbers-line-height)",letterSpacing:"var(--code-line-numbers-letter-spacing)",fontWeight:"var(--code-line-numbers-font-weight)"}},markdown:{body:{fontSize:"var(--text-markdown)",lineHeight:"var(--markdown-body-line-height)",letterSpacing:"var(--markdown-body-letter-spacing)",fontWeight:"var(--markdown-body-font-weight)"},bodySmall:{fontSize:"var(--text-meta)",lineHeight:"var(--markdown-body-small-line-height)",letterSpacing:"var(--markdown-body-small-letter-spacing)",fontWeight:"var(--markdown-body-small-font-weight)"},bodyLarge:{fontSize:"var(--text-markdown)",lineHeight:"var(--markdown-body-large-line-height)",letterSpacing:"var(--markdown-body-large-letter-spacing)",fontWeight:"var(--markdown-body-large-font-weight)"},blockquote:{fontSize:"var(--text-markdown)",lineHeight:"var(--markdown-blockquote-line-height)",letterSpacing:"var(--markdown-blockquote-letter-spacing)",fontWeight:"var(--markdown-blockquote-font-weight)"},list:{fontSize:"var(--text-markdown)",lineHeight:"var(--markdown-list-line-height)",letterSpacing:"var(--markdown-list-letter-spacing)",fontWeight:"var(--markdown-list-font-weight)"},link:{fontSize:"var(--text-markdown)",lineHeight:"var(--markdown-link-line-height)",letterSpacing:"var(--markdown-link-letter-spacing)",fontWeight:"var(--markdown-link-font-weight)"},code:{fontSize:"var(--text-code)",lineHeight:"var(--markdown-code-line-height)",letterSpacing:"var(--markdown-code-letter-spacing)",fontWeight:"var(--markdown-code-font-weight)"},codeBlock:{fontSize:"var(--text-code)",lineHeight:"var(--markdown-code-block-line-height)",letterSpacing:"var(--markdown-code-block-letter-spacing)",fontWeight:"var(--markdown-code-block-font-weight)"}},tool:{collapsed:{fontSize:"var(--text-code)",lineHeight:"var(--code-block-line-height)",letterSpacing:"var(--code-block-letter-spacing)",fontWeight:"var(--code-block-font-weight)"},popup:{fontSize:"var(--text-code)",lineHeight:"var(--code-block-line-height)",letterSpacing:"var(--code-block-letter-spacing)",fontWeight:"var(--code-block-font-weight)"},inline:{fontSize:"var(--text-code)",lineHeight:"var(--code-inline-line-height)",letterSpacing:"var(--code-inline-letter-spacing)",fontWeight:"var(--code-inline-font-weight)"}}},Qo={padding:{collapsed:"0.375rem",popup:"0.75rem",popupContainer:"1rem"},backgroundOpacity:{muted:"30",mutedAlt:"50"},getCollapsedStyles:()=>({...Mr.tool.collapsed,background:"transparent",backgroundColor:"transparent",margin:0,padding:Qo.padding.collapsed,borderRadius:0}),getPopupStyles:()=>({...Mr.tool.popup,background:"transparent",backgroundColor:"transparent",margin:0,padding:Qo.padding.popup,borderRadius:"0.75rem"}),getPopupContainerStyles:()=>({...Mr.tool.popup,background:"transparent",backgroundColor:"transparent",margin:0,padding:Qo.padding.popupContainer,borderRadius:"0.5rem",overflowX:"auto"}),getInlineStyles:()=>({...Mr.tool.inline})},eh=[{id:"inter",label:"Inter",description:"Modern UI sans with excellent readability at small sizes.",stack:'"Inter", "SF Pro Text", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',source:{family:"Inter",packageName:"@fontsource/inter",filePrefix:"inter",weights:[400,500,600]}},{id:"fixel",label:"Fixel Text",description:"Humanist geometric sans-serif with full Ukrainian support.",stack:'"Fixel Text", "SF Pro Text", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',source:{family:"Fixel Text",weights:[400,500,600],urls:{400:"https://cdn.jsdelivr.net/gh/MacPaw/Fixel@f6ee910e98add47e830db87f1a754130506c11a2/fonts/webfonts/FixelText-Regular.woff2",500:"https://cdn.jsdelivr.net/gh/MacPaw/Fixel@f6ee910e98add47e830db87f1a754130506c11a2/fonts/webfonts/FixelText-Medium.woff2",600:"https://cdn.jsdelivr.net/gh/MacPaw/Fixel@f6ee910e98add47e830db87f1a754130506c11a2/fonts/webfonts/FixelText-SemiBold.woff2"}}},{id:"geist-sans",label:"Geist Sans",description:"Crisp sans-serif with a technical interface feel.",stack:'"Geist Sans", "SF Pro Text", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',source:{family:"Geist Sans",packageName:"@fontsource/geist-sans",filePrefix:"geist-sans",weights:[400,500,600]}},{id:"atkinson-hyperlegible",label:"Atkinson Hyperlegible",description:"Accessibility-focused sans-serif optimized for character distinction.",stack:'"Atkinson Hyperlegible", "SF Pro Text", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',source:{family:"Atkinson Hyperlegible",packageName:"@fontsource/atkinson-hyperlegible",filePrefix:"atkinson-hyperlegible",weights:[400,700]}},{id:"source-sans-3",label:"Source Sans 3",description:"Adobe sans-serif tuned for clean, readable interfaces.",stack:'"Source Sans 3", "SF Pro Text", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',source:{family:"Source Sans 3",packageName:"@fontsource/source-sans-3",filePrefix:"source-sans-3",weights:[400,500,600]}},{id:"roboto",label:"Roboto",description:"Familiar Material-style sans-serif with broad UI usage.",stack:'"Roboto", "SF Pro Text", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',source:{family:"Roboto",packageName:"@fontsource/roboto",filePrefix:"roboto",weights:[400,500,600]}},{id:"noto-sans",label:"Noto Sans",description:"Readable sans-serif with strong international coverage.",stack:'"Noto Sans", "SF Pro Text", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',source:{family:"Noto Sans",packageName:"@fontsource/noto-sans",filePrefix:"noto-sans",weights:[400,500,600]}},{id:"dm-sans",label:"DM Sans",description:"Modern product UI sans-serif with friendly proportions.",stack:'"DM Sans", "SF Pro Text", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',source:{family:"DM Sans",packageName:"@fontsource/dm-sans",filePrefix:"dm-sans",weights:[400,500,600]}},{id:"manrope",label:"Manrope",description:"Polished geometric sans-serif for modern app interfaces.",stack:'"Manrope", "SF Pro Text", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',source:{family:"Manrope",packageName:"@fontsource/manrope",filePrefix:"manrope",weights:[400,500,600]}},{id:"system",label:"System",description:"Native operating system interface font.",stack:'-apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif'}],th=[{id:"jetbrains-mono",label:"JetBrains Mono",description:"Developer-focused monospace with strong punctuation clarity.",stack:'"JetBrains Mono", "SFMono-Regular", "Menlo", monospace',source:{family:"JetBrains Mono",packageName:"@fontsource/jetbrains-mono",filePrefix:"jetbrains-mono",weights:[400,500,600]}},{id:"fira-code",label:"Fira Code",description:"Readable coding font with ligature support.",stack:'"Fira Code", "SFMono-Regular", "Menlo", monospace',source:{family:"Fira Code",packageName:"@fontsource/fira-code",filePrefix:"fira-code",weights:[400,500,600]}},{id:"geist-mono",label:"Geist Mono",description:"Sharp monospace pair for Geist Sans.",stack:'"Geist Mono", "SFMono-Regular", "Menlo", monospace',source:{family:"Geist Mono",packageName:"@fontsource/geist-mono",filePrefix:"geist-mono",weights:[400,500,600]}},{id:"commit-mono",label:"Commit Mono",description:"Code-oriented monospace with polished editor ergonomics.",stack:'"Commit Mono", "SFMono-Regular", "Menlo", monospace',source:{family:"Commit Mono",packageName:"@fontsource/commit-mono",filePrefix:"commit-mono",weights:[400,500,600]}},{id:"source-code-pro",label:"Source Code Pro",description:"Adobe monospace designed for source code readability.",stack:'"Source Code Pro", "SFMono-Regular", "Menlo", monospace',source:{family:"Source Code Pro",packageName:"@fontsource/source-code-pro",filePrefix:"source-code-pro",weights:[400,500,600]}},{id:"cascadia-code",label:"Cascadia Code",description:"Microsoft coding font popular in terminals and editors.",stack:'"Cascadia Code", "SFMono-Regular", "Menlo", monospace',source:{family:"Cascadia Code",packageName:"@fontsource/cascadia-code",filePrefix:"cascadia-code",weights:[400,500,600]}},{id:"roboto-mono",label:"Roboto Mono",description:"Neutral monospace companion to Roboto.",stack:'"Roboto Mono", "SFMono-Regular", "Menlo", monospace',source:{family:"Roboto Mono",packageName:"@fontsource/roboto-mono",filePrefix:"roboto-mono",weights:[400,500,600]}},{id:"iosevka",label:"Iosevka",description:"Compact monospace for dense code and terminal layouts.",stack:'"Iosevka", "SFMono-Regular", "Menlo", monospace',source:{family:"Iosevka",packageName:"@fontsource/iosevka",filePrefix:"iosevka",weights:[400,500,600]}},{id:"system-mono",label:"System Mono",description:"Native operating system monospace font.",stack:'ui-monospace, "SFMono-Regular", "Menlo", "Cascadia Mono", "Segoe UI Mono", monospace'}],Il=e=>Object.fromEntries(e.map(t=>[t.id,t])),nh=Il(eh),rh=Il(th),oh="system",sh="system-mono",ih=e=>typeof e=="string"&&e in nh,ah=e=>typeof e=="string"&&e in rh,Ps="openchamber.mobileKeyboardMode",ch='meta[name="viewport"]',Sa="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover",ST=()=>!0;function Ro(e,t="resize-content"){return e==="native"||e==="resize-content"?e:t}const lh=e=>Ro(e)==="resize-content"?`${Sa}, interactive-widget=resizes-content`:Sa,uh=()=>{if(typeof window>"u")return"resize-content";try{return Ro(localStorage.getItem(Ps))}catch{return"resize-content"}},xl=e=>{const t=Ro(e);if(typeof window<"u")try{t==="resize-content"?localStorage.removeItem(Ps):localStorage.setItem(Ps,t)}catch{}return t},TT=e=>{const t=xl(e);if(typeof document>"u")return t;document.documentElement.setAttribute("data-oc-mobile-keyboard-mode",t);const n=document.querySelector(ch);if(n instanceof HTMLMetaElement){const r=lh(t);n.getAttribute("content")!==r&&n.setAttribute("content",r)}return t},Xo=Object.freeze({chunks:Object.freeze([]),byteLength:0,lastSequence:-1}),dh=new Set(["starting","running","stopping"]),fh=e=>!!e?.tabs.some(t=>wn(t.purpose)&&t.lifecycle!=="exited"),As=512*1024,ph=new TextEncoder,hh=new TextDecoder,Zo=e=>{const t=ph.encode(e);if(t.byteLength<=As)return{text:e,byteLength:t.byteLength};let n=t.byteLength-As;for(;n<t.byteLength&&(t[n]&192)===128;)n+=1;const r=t.subarray(n);return{text:hh.decode(r),byteLength:r.byteLength}},Xe=(e,t)=>`${e}\0${t}`,ln=(e,t)=>{let n=null;for(const r of e.keys())t(r)&&(n??=new Map(e),n.delete(r));return n},mh="terminal-store";let Ta=!1,va=0;const gh=v({type:U("project-action"),actionId:m()}),zn=()=>typeof globalThis.crypto?.randomUUID=="function"?`tab-${globalThis.crypto.randomUUID()}`:(va+=1,`tab-${Date.now().toString(36)}-${va.toString(36)}`),es=e=>typeof e=="object"&&e!==null,wn=e=>e.type==="project-action",_r=(e,t)=>wn(e.purpose)?t===void 0?!0:e.purpose.executionId===t:t==null,yh=()=>zn().replace(/^tab-/,"exec-"),ka=e=>e==="running"?"running":"exited",wh=(e,t)=>({type:"project-action",actionId:e.actionId,executionId:t==="running"?e.executionId:null}),bh=e=>{const t=new Map,n=[];for(const r of e){if(r.purpose?.type!=="project-action"){n.push(r);continue}const o=t.get(r.purpose.actionId);(!o||r.status==="running"&&o.status!=="running"||r.status===o.status&&((r.createdAt??0)>(o.createdAt??0)||r.createdAt===o.createdAt&&r.sessionId>o.sessionId))&&t.set(r.purpose.actionId,r)}return[...n,...t.values()]},ts={previewUrl:null,previewAutoOpened:!1,previewUrlLocked:!1},Sh=e=>e.trim()||"Action",Th=e=>{const t=/^tab-(\d+)$/.exec(e);if(!t)return null;const n=Number(t[1]);return Number.isFinite(n)?n:null},X=bp,go=(e,t)=>`${e}\0${t}`,jn=(e,t,n,r)=>{e.set(go(t,n),r)},Ea=(e,t,n,r)=>{if(!r)return!1;const o=go(t,n),s=e.actionMutationRevisions.get(o)??0,i=r.get(o)??0;return s>i},vh=/^Terminal(?: (\d+))?$/,Pa=e=>{let t=0;for(const n of e){const r=vh.exec(n.label);if(!r)continue;const o=r[1]?Number.parseInt(r[1],10):1;Number.isSafeInteger(o)&&(t=Math.max(t,o))}return t===0?"Terminal":`Terminal ${t+1}`},vT=e=>e.purpose.type==="project-action"&&e.purpose.executionId!==null&&dh.has(e.lifecycle),kh=e=>!!(e&&e.terminalSessionId!==null&&e.lifecycle==="running"),Lr=(e,t)=>({id:e,terminalSessionId:null,lifecycle:"idle",purpose:{type:"terminal"},label:t,iconKey:null,isConnecting:!1,createdAt:Date.now(),previewUrl:null,previewAutoOpened:!1,previewUrlLocked:!1}),ns=e=>({tabs:[e],activeTabId:e.id}),Ae=(e,t)=>e.tabs.findIndex(n=>n.id===t);let rs=null,os=null;const Eh=e=>{if(os&&rs?.sessions===e.sessions&&rs.nextTabId===e.nextTabId)return os;const t={sessions:Array.from(e.sessions.entries()).map(([n,r])=>[n,{activeTabId:r.activeTabId,tabs:r.tabs.map(o=>({id:o.id,label:o.label,iconKey:o.iconKey,createdAt:o.createdAt,purpose:o.purpose.type==="project-action"?{type:"project-action",actionId:o.purpose.actionId}:{type:"terminal"}}))}]),nextTabId:e.nextTabId};return rs={sessions:e.sessions,nextTabId:e.nextTabId},os=t,t},Ph=()=>{const e=Bu(()=>Xp());if(!e)return;let t=null;return{getItem:n=>e.getItem(n),setItem:(n,r)=>{if(r.state!==t)return t=r.state,e.setItem(n,r)},removeItem:n=>(t=null,e.removeItem(n))}},Yr=gt()(xn(fr((e,t)=>({sessions:new Map,buffers:new Map,actionMutationRevisions:new Map,nextActionMutationRevision:1,nextChunkId:1,nextTabId:1,hasHydrated:typeof window>"u",ensureDirectory:n=>{const r=X(n);r&&e(o=>{if(o.sessions.has(r))return o;const s=new Map(o.sessions),i=zn(),a=Lr(i,"Terminal");return s.set(r,ns(a)),{sessions:s,nextTabId:o.nextTabId+1}})},getDirectoryState:n=>{const r=X(n);return t().sessions.get(r)},getActiveTab:n=>{const r=X(n),o=t().sessions.get(r);if(!o)return;const s=o.activeTabId;return s?o.tabs.find(i=>i.id===s)??o.tabs[0]:o.tabs[0]},getBuffer:(n,r)=>t().buffers.get(Xe(X(n),r))??Xo,matchesActionExecution:(n,r,o)=>{const s=t().sessions.get(X(n))?.tabs.find(i=>i.id===r);return!!(s&&wn(s.purpose)&&s.purpose.executionId===o)},captureStartedActionMutationRevisions:n=>{const r=X(n),o=go(r,""),s=new Map;for(const[i,a]of t().actionMutationRevisions.entries())i.startsWith(o)&&s.set(i,a);return s},createTab:n=>{const r=X(n);if(!r)return"tab-invalid";const o=zn();return e(s=>{const i=new Map(s.sessions),a=i.get(r),c=s.nextTabId+1,l=Pa(a?.tabs??[]),u=Lr(o,l);return a?i.set(r,{...a,tabs:[...a.tabs,u]}):i.set(r,ns(u)),{sessions:i,nextTabId:c}}),o},reconcileServerSessions:(n,r,o)=>{const s=X(n);s&&e(i=>{const a=i.sessions.get(s);if(!a&&r.length===0)return i;const c=[...a?.tabs??[]];let l=i.buffers,u=!1,d=null;const f=new Set,p=new Set,g=c.length===1&&c[0].terminalSessionId===null&&c[0].lifecycle==="idle"&&c[0].purpose.type==="terminal"&&!i.buffers.has(Xe(s,c[0].id))?c[0]:null;g&&r.length>0&&(c.length=0);for(const R of bh(r)){let we=c.findIndex(L=>L.terminalSessionId===R.sessionId||L.id===R.sessionId);const se=R.purpose,Lo=se?.type==="project-action"&&Ea(i,s,se.actionId,o?.startedActionMutationRevisions);if(se?.type==="project-action"){f.add(se.actionId);const L=c.findIndex(Qe=>wn(Qe.purpose)&&Qe.purpose.actionId===se.actionId);if(Lo){L>=0&&p.add(c[L].id);continue}we<0&&(we=L)}const Pe=se?.type==="project-action"?wh(se,R.status):{type:"terminal"};if(we>=0){const L=c[we];let Qe=L.purpose.type==="project-action"||se?.type==="project-action"?ka(R.status):R.status;L.lifecycle==="stopping"&&R.status==="running"&&L.purpose.type==="project-action"&&Pe.type==="project-action"&&L.purpose.executionId===Pe.executionId&&(Qe="stopping");const on=R.createdAt??L.createdAt,Sr=se?.type==="project-action"&&(L.terminalSessionId!==R.sessionId||Pe.type==="project-action"&&Pe.executionId!==null&&(L.purpose.type!=="project-action"||L.purpose.executionId!==Pe.executionId));if(Sr){const yt=Xe(s,L.id);l=ln(l,Fo=>Fo===yt)??l}const _n=se?.type==="project-action"&&R.status==="running"&&(L.terminalSessionId!==R.sessionId||L.lifecycle!=="running"),Tr=L.purpose.type!==Pe.type||L.purpose.type==="project-action"&&Pe.type==="project-action"&&(L.purpose.actionId!==Pe.actionId||L.purpose.executionId!==Pe.executionId);if((L.terminalSessionId!==R.sessionId||L.lifecycle!==Qe||L.isConnecting!==!1||L.createdAt!==on||Tr)&&(c[we]={...L,terminalSessionId:R.sessionId,lifecycle:Qe,purpose:Pe,isConnecting:!1,createdAt:on},Sr&&Object.assign(c[we],ts),u=!0),_n){const yt={tabId:L.id,createdAt:on,index:we};(!d||yt.createdAt>d.createdAt||yt.createdAt===d.createdAt&&yt.index>d.index)&&(d=yt)}p.add(L.id);continue}const On=se?.type==="project-action"?Sh(se.actionId):g&&c.length===0?g.label:Pa(c),Mn=se?.type==="project-action"?"play":null,Lt={...Lr(R.sessionId,On),terminalSessionId:R.sessionId,lifecycle:se?.type==="project-action"?ka(R.status):R.status,purpose:Pe,iconKey:Mn,createdAt:R.createdAt??Date.now()};if(c.push(Lt),u=!0,se?.type==="project-action"&&R.status==="running"){const L={tabId:Lt.id,createdAt:Lt.createdAt,index:c.length-1};(!d||L.createdAt>d.createdAt||L.createdAt===d.createdAt&&L.index>d.index)&&(d=L)}p.add(Lt.id)}let b=u||!!(g&&r.length>0);const w=c.map(R=>!wn(R.purpose)||f.has(R.purpose.actionId)||p.has(R.id)||R.lifecycle==="starting"||Ea(i,s,R.purpose.actionId,o?.startedActionMutationRevisions)||R.lifecycle==="exited"&&!R.isConnecting?R:(b=!0,{...R,lifecycle:"exited",isConnecting:!1,purpose:{type:"project-action",actionId:R.purpose.actionId,executionId:null}})),E=a?.activeTabId??null,k=E&&w.some(R=>R.id===E)?E:w[0]?.id??null,F=k?w.find(R=>R.id===k):w[0],O=d&&!kh(F)?d.tabId:k;if(!b&&a&&O===a.activeTabId&&w.length===a.tabs.length&&w.every((R,we)=>R===a.tabs[we]))return i;const K=new Map(i.sessions);return K.set(s,{tabs:w,activeTabId:O}),{sessions:K,buffers:l}})},setActiveTab:(n,r)=>{const o=X(n);e(s=>{const i=new Map(s.sessions),a=i.get(o);return!a||a.activeTabId===r||Ae(a,r)<0?s:(i.set(o,{...a,activeTabId:r}),{sessions:i})})},setTabLabel:(n,r,o)=>{const s=X(n),i=o.trim();i&&e(a=>{const c=new Map(a.sessions),l=c.get(s);if(!l)return a;const u=Ae(l,r);if(u<0||l.tabs[u]?.label===i)return a;const d=[...l.tabs];return d[u]={...d[u],label:i},c.set(s,{...l,tabs:d}),{sessions:c}})},setTabIconKey:(n,r,o)=>{const s=X(n);e(i=>{const a=new Map(i.sessions),c=a.get(s);if(!c)return i;const l=Ae(c,r);if(l<0)return i;const u=o?.trim()||null;if(c.tabs[l]?.iconKey===u)return i;const d=[...c.tabs];return d[l]={...d[l],iconKey:u},a.set(s,{...c,tabs:d}),{sessions:a}})},closeTab:(n,r)=>{const o=X(n);e(s=>{const i=new Map(s.sessions),a=i.get(o);if(!a)return s;const c=Ae(a,r);if(c<0)return s;const l=a.tabs[c].purpose;let u=s.actionMutationRevisions,d=s.nextActionMutationRevision;l.type==="project-action"&&(u=new Map(u),jn(u,o,l.actionId,d),d+=1);const f={actionMutationRevisions:u,nextActionMutationRevision:d},p=a.tabs.filter(k=>k.id!==r),g=Xe(o,r),b=s.buffers.has(g)?ln(s.buffers,k=>k===g):null;if(p.length===0){const k=zn(),F=Lr(k,"Terminal");i.set(o,ns(F));const O={sessions:i,nextTabId:s.nextTabId+1};return b&&(O.buffers=b),{...O,...f}}let w=a.activeTabId;a.activeTabId===r&&(w=p[Math.min(c,p.length-1)]?.id??p[0]?.id??null),i.set(o,{...a,tabs:p,activeTabId:w});const E={sessions:i};return b&&(E.buffers=b),{...E,...f}})},setTabPurpose:(n,r,o)=>{const s=X(n);e(i=>{const a=i.sessions.get(s);if(!a)return i;const c=Ae(a,r);if(c<0)return i;const l=a.tabs[c];if(JSON.stringify(l.purpose)===JSON.stringify(o))return i;const u=[...a.tabs],d=o.type==="project-action"&&o.executionId!==null&&(l.purpose.type!=="project-action"||l.purpose.executionId!==o.executionId);u[c]={...l,purpose:o},d&&Object.assign(u[c],ts);const f=Xe(s,r),p=d?ln(i.buffers,w=>w===f)??i.buffers:i.buffers,g=new Map(i.sessions);if(g.set(s,{...a,tabs:u}),o.type!=="project-action")return{sessions:g};const b=new Map(i.actionMutationRevisions);return jn(b,s,o.actionId,i.nextActionMutationRevision),{sessions:g,buffers:p,actionMutationRevisions:b,nextActionMutationRevision:i.nextActionMutationRevision+1}})},allocateActionExecution:(n,r,o)=>{const s=X(n),i=t().sessions.get(s);if(!i||Ae(i,r)<0)return null;const a=yh();return e(c=>{const l=c.sessions.get(s);if(!l)return c;const u=Ae(l,r);if(u<0)return c;const d=[...l.tabs];d[u]={...d[u],purpose:{type:"project-action",actionId:o,executionId:a},lifecycle:"starting",terminalSessionId:null,...ts,isConnecting:!1};const f=new Map(c.sessions);f.set(s,{...l,tabs:d});const p=new Map(c.actionMutationRevisions);jn(p,s,o,c.nextActionMutationRevision);const g=Xe(s,r),b=ln(c.buffers,w=>w===g)??c.buffers;return{sessions:f,buffers:b,actionMutationRevisions:p,nextActionMutationRevision:c.nextActionMutationRevision+1}}),a},setTabSessionId:(n,r,o,s)=>{const i=X(n);e(a=>{const c=new Map(a.sessions),l=c.get(i);if(!l)return a;const u=Ae(l,r);if(u<0)return a;const d=l.tabs[u];if(!_r(d,s?.expectedExecutionId))return a;const f=o!==null&&d.terminalSessionId!==o,p=o?"running":d.terminalSessionId?"exited":d.lifecycle,g={...d,terminalSessionId:o,lifecycle:p,isConnecting:!1},b=Xe(i,r),w=f&&a.buffers.has(b)?ln(a.buffers,F=>F===b):null,E=[...l.tabs];E[u]=g,c.set(i,{...l,tabs:E});const k={sessions:c,nextActionMutationRevision:a.nextActionMutationRevision};if(wn(d.purpose)){const F=new Map(a.actionMutationRevisions);jn(F,i,d.purpose.actionId,a.nextActionMutationRevision),k.actionMutationRevisions=F,k.nextActionMutationRevision=a.nextActionMutationRevision+1}return w&&(k.buffers=w),k})},setTabLifecycle:(n,r,o,s)=>{const i=X(n);e(a=>{const c=new Map(a.sessions),l=c.get(i);if(!l)return a;const u=Ae(l,r);if(u<0||!_r(l.tabs[u],s?.expectedExecutionId))return a;const d=l.tabs[u];if(d.lifecycle===o&&!d.isConnecting)return a;const f=[...l.tabs];if(f[u]={...d,lifecycle:o,isConnecting:!1},c.set(i,{...l,tabs:f}),d.purpose.type!=="project-action"||d.lifecycle===o)return{sessions:c};const p=new Map(a.actionMutationRevisions);return jn(p,i,d.purpose.actionId,a.nextActionMutationRevision),{sessions:c,actionMutationRevisions:p,nextActionMutationRevision:a.nextActionMutationRevision+1}})},setConnecting:(n,r,o,s)=>{const i=X(n);e(a=>{const c=new Map(a.sessions),l=c.get(i);if(!l)return a;const u=Ae(l,r);if(u<0||!_r(l.tabs[u],s?.expectedExecutionId))return a;const d=[...l.tabs];return d[u]={...d[u],isConnecting:o},c.set(i,{...l,tabs:d}),{sessions:c}})},replaceBuffer:(n,r,o,s,i)=>{const a=X(n);e(c=>{const l=c.sessions.get(a);if(!l||Ae(l,r)<0)return c;const u=Xe(a,r),d=c.buffers.get(u)??Xo;if(d.lastSequence>s)return c;const f=Zo(o),p=d.chunks[0]?.size;if(d.lastSequence===s&&d.byteLength===f.byteLength&&d.chunks.map(w=>w.data).join("")===f.text&&p?.cols===i?.cols&&p?.rows===i?.rows)return c;const g=c.nextChunkId,b=new Map(c.buffers);return b.set(u,{chunks:f.text?[{id:g,data:f.text,byteLength:f.byteLength,...i?{size:i}:{}}]:[],byteLength:f.byteLength,lastSequence:s}),{buffers:b,nextChunkId:f.text?g+1:g}})},appendToBuffer:(n,r,o,s,i)=>{if(!o)return;const a=X(n);e(c=>{const l=c.sessions.get(a);if(!l||Ae(l,r)<0)return c;const u=Xe(a,r),d=c.buffers.get(u)??Xo;if(s!==void 0&&s<=d.lastSequence)return c;const f=c.nextChunkId,p=Zo(o),g=i!==void 0&&i!==o?Zo(i).text:void 0,b={id:f,data:p.text,...g!==void 0?{replayData:g}:{},byteLength:p.byteLength},w=[...d.chunks,b];let E=d.byteLength+b.byteLength;for(;E>As&&w.length>1;){const F=w.shift();if(!F)break;E-=F.byteLength}const k=new Map(c.buffers);return k.set(u,{chunks:w,byteLength:E,lastSequence:s??d.lastSequence}),{buffers:k,nextChunkId:f+1}})},setTabPreviewUrl:(n,r,o,s={})=>{const i=X(n);e(a=>{const c=new Map(a.sessions),l=c.get(i);if(!l)return a;const u=Ae(l,r);if(u<0)return a;const d=l.tabs[u];if(!_r(d,s.expectedExecutionId))return a;const f=s.autoOpened??d.previewAutoOpened,p=s.locked??d.previewUrlLocked;if(d.previewUrl===o&&d.previewAutoOpened===f&&d.previewUrlLocked===p)return a;const g=[...l.tabs];return g[u]={...d,previewUrl:o,previewAutoOpened:f,previewUrlLocked:p},c.set(i,{...l,tabs:g}),{sessions:c}})},markPreviewAutoOpened:(n,r)=>{const o=X(n);e(s=>{const i=new Map(s.sessions),a=i.get(o);if(!a)return s;const c=Ae(a,r);if(c<0)return s;const l=a.tabs[c];if(!l.previewUrl||l.previewAutoOpened)return s;const u=[...a.tabs];return u[c]={...l,previewAutoOpened:!0},i.set(o,{...a,tabs:u}),{sessions:i}})},removeDirectory:n=>{const r=X(n);e(o=>{const s=new Map(o.sessions);s.delete(r);const i=Xe(r,""),a=ln(o.buffers,d=>d.startsWith(i)),c=go(r,"");let l;for(const d of o.actionMutationRevisions.keys())d.startsWith(c)&&(l??=new Map(o.actionMutationRevisions),l.delete(d));const u={sessions:s};return a&&(u.buffers=a),l&&(u.actionMutationRevisions=l),u})},clearAll:()=>{e({sessions:new Map,buffers:new Map,actionMutationRevisions:new Map,nextActionMutationRevision:1,nextChunkId:1,nextTabId:1})}}),{name:mh,storage:Ph(),partialize:Eh,merge:(e,t)=>{if(!es(e))return t;const n=Array.isArray(e.sessions)?e.sessions:[],r=new Map;let o=0;for(const a of n){if(!Array.isArray(a)||a.length!==2)continue;const[c,l]=a;if(typeof c!="string"||!es(l))continue;const u=Array.isArray(l.tabs)?l.tabs:[],d=[],f=new Map;for(const w of u){if(!es(w))continue;const E=typeof w.id=="string"?w.id:null;if(!E)continue;const k=Th(E);k!==null&&(o=Math.max(o,k));const F=k===null?E:zn();f.set(E,F);const O=gh.safeParse(w.purpose).data,K=O?{type:"project-action",actionId:O.actionId,executionId:null}:{type:"terminal"};d.push({id:F,label:typeof w.label=="string"?w.label:"Terminal",iconKey:typeof w.iconKey=="string"?w.iconKey:null,terminalSessionId:null,lifecycle:"idle",purpose:K,createdAt:typeof w.createdAt=="number"?w.createdAt:Date.now(),isConnecting:!1,previewUrl:null,previewAutoOpened:!1,previewUrlLocked:!1})}if(d.length===0)continue;const p=typeof l.activeTabId=="string"?l.activeTabId:null,g=p?f.get(p)??p:null,b=g?d.some(w=>w.id===g):!1;r.set(c,{tabs:d,activeTabId:b?g:d[0].id})}const s=typeof e.nextTabId=="number"&&Number.isFinite(e.nextTabId)?e.nextTabId:1,i=Math.max(t.nextTabId,s,o+1);return{...t,sessions:r,buffers:new Map,actionMutationRevisions:new Map,nextActionMutationRevision:1,nextChunkId:1,nextTabId:i,hasHydrated:!0}}})));if(typeof window<"u"&&!Ta){Ta=!0;const e=Yr.persist,t=()=>{Yr.getState().hasHydrated||Yr.setState({hasHydrated:!0})};e?.hasHydrated?.()?t():e?.onFinishHydration?e.onFinishHydration(t):t()}const Ze=20,Ah=8,Aa=4096,Ih=2160*60*6e4,J=e=>{if(!e)return"";const t=e.replace(/\\/g,"/"),n=t.startsWith("//");let r=t.replace(/\/+/g,"/");n&&!r.startsWith("//")&&(r=`/${r}`);const o=r==="/",s=/^[A-Za-z]:\/$/.test(r);return!o&&!s&&(r=r.replace(/\/+$/,"")),r},At=e=>/^[A-Za-z]:\//.test(e)?e.toLowerCase():e,xt=(e,t)=>{const n=J(t),r=J(e);if(!n||!r)return!1;const o=At(n),s=At(r);return s===o||s.startsWith(`${o}/`)},Nn=e=>{if(!e||typeof e!="object")return{};const t=e,n={};for(const[r,o]of Object.entries(t)){const s=J(r);if(!s||!o||typeof o!="object")continue;const i=o,a=Array.isArray(i.openPaths)?Array.from(new Set(i.openPaths.filter(p=>typeof p=="string").map(p=>J(p)).filter(p=>p.length<=Aa&&xt(p,s)))).slice(-50):[],c=Array.isArray(i.expandedPaths)?Array.from(new Set(i.expandedPaths.filter(p=>typeof p=="string").map(p=>J(p)).filter(p=>p.length<=Aa&&xt(p,s)))).slice(-500):[],l=typeof i.selectedPath=="string"?J(i.selectedPath):null,u=l&&xt(l,s)?l:a[0]??null,d=typeof i.touchedAt=="number"&&Number.isFinite(i.touchedAt)?i.touchedAt:Date.now();if(Date.now()-d>Ih)continue;const f=n[s];if(f){const p=Array.from(new Set([...f.openPaths,...a])),g=Array.from(new Set([...f.expandedPaths,...c])),b=f.selectedPath??u??p[0]??null;n[s]={openPaths:p,selectedPath:b,expandedPaths:g,touchedAt:Math.max(f.touchedAt,d)};continue}n[s]={openPaths:a,selectedPath:u,expandedPaths:c,touchedAt:d}}return et(n,Ze)},et=(e,t)=>{const n=Object.entries(e);if(n.length<=t)return e;n.sort((o,s)=>(s[1]?.touchedAt??0)-(o[1]?.touchedAt??0));const r={};for(const[o,s]of n.slice(0,t))r[o]=s;return r},un=e=>e?{...e,touchedAt:Date.now()}:{openPaths:[],selectedPath:null,expandedPaths:[],touchedAt:Date.now()},xh=gt()(xn(fr((e,t)=>({byRoot:{},activeRuntimeKey:G(),runtimeSnapshots:{},resetForRuntimeSwitch:n=>{e(r=>{const o={...r.runtimeSnapshots,[r.activeRuntimeKey]:{byRoot:Nn(r.byRoot),updatedAt:Date.now()}};return{activeRuntimeKey:n,runtimeSnapshots:o,byRoot:Nn(o[n]?.byRoot)}})},addOpenPath:(n,r,o)=>{const s=J((n||"").trim()),i=J((r||"").trim());!s||!i||!o?.allowOutsideRoot&&!xt(i,s)||e(a=>{const c=a.byRoot[s],l=un(c),u=l.openPaths.includes(i),d=u?l.openPaths:[...l.openPaths,i],f=l.selectedPath??i;if(c&&u&&c.selectedPath===f)return a;const p={...a.byRoot,[s]:{...l,openPaths:d,selectedPath:f}};return{byRoot:et(p,Ze)}})},removeOpenPath:(n,r)=>{const o=J((n||"").trim()),s=J((r||"").trim());!o||!s||e(i=>{const a=i.byRoot[o];if(!a)return i;const c=At(s),l=g=>At(g)===c,u=a.selectedPath?l(a.selectedPath):!1;if(!a.openPaths.some(l)&&!u)return i;const d=a.openPaths.filter(g=>!l(g)),f=u?d[0]??null:a.selectedPath,p={...i.byRoot,[o]:{...a,openPaths:d,selectedPath:f,touchedAt:Date.now()}};return{byRoot:et(p,Ze)}})},removeOpenPathsByPrefix:(n,r)=>{const o=J((n||"").trim()),s=J((r||"").trim());!o||!s||e(i=>{const a=i.byRoot[o];if(!a)return i;const c=At(s),l=c.endsWith("/")?c:`${c}/`,u=g=>{const b=At(g);return b===c||b.startsWith(l)},d=a.openPaths.filter(g=>!u(g));if(d.length===a.openPaths.length)return i;const f=a.selectedPath&&u(a.selectedPath)?d[0]??null:a.selectedPath,p={...i.byRoot,[o]:{...a,openPaths:d,selectedPath:f,touchedAt:Date.now()}};return{byRoot:et(p,Ze)}})},removeExpandedPathsByPrefix:(n,r)=>{const o=J((n||"").trim()),s=J((r||"").trim());!o||!s||e(i=>{const a=i.byRoot[o];if(!a)return i;const c=At(s),l=c.endsWith("/")?c:`${c}/`,u=a.expandedPaths.filter(f=>{const p=At(f);return p!==c&&!p.startsWith(l)});if(u.length===a.expandedPaths.length)return i;const d={...i.byRoot,[o]:{...a,expandedPaths:u,touchedAt:Date.now()}};return{byRoot:et(d,Ze)}})},setSelectedPath:(n,r,o)=>{const s=J((n||"").trim()),i=r?J(r.trim()):null;!s||i&&!o?.allowOutsideRoot&&!xt(i,s)||e(a=>{const c=a.byRoot[s],l=un(c),u=i&&!l.openPaths.includes(i)?[...l.openPaths,i]:l.openPaths;if(c&&c.selectedPath===i&&u===c.openPaths)return a;const d={...a.byRoot,[s]:{...l,openPaths:u,selectedPath:i}};return{byRoot:et(d,Ze)}})},ensureSelectedPath:n=>{const r=J((n||"").trim());if(!r)return;const o=t().byRoot[r];if(!o||o.selectedPath)return;const s=o.openPaths[0]??null;s&&t().setSelectedPath(r,s)},toggleExpandedPath:(n,r)=>{const o=J((n||"").trim()),s=J((r||"").trim());!o||!s||!xt(s,o)||e(i=>{const a=i.byRoot[o],c=un(a),u=c.expandedPaths.includes(s)?c.expandedPaths.filter(f=>f!==s):[...c.expandedPaths,s];if(a&&a.expandedPaths===u&&a.selectedPath===c.selectedPath&&a.openPaths===c.openPaths)return i;const d={...i.byRoot,[o]:{...c,expandedPaths:u}};return{byRoot:et(d,Ze)}})},collapseAllExpandedPaths:n=>{const r=J((n||"").trim());r&&e(o=>{const s=o.byRoot[r];if(!s||s.expandedPaths.length===0)return o;const i={...o.byRoot,[r]:{...un(s),expandedPaths:[]}};return{byRoot:et(i,Ze)}})},expandPath:(n,r)=>{const o=J((n||"").trim()),s=J((r||"").trim());!o||!s||!xt(s,o)||e(i=>{const a=i.byRoot[o],c=un(a);if(c.expandedPaths.includes(s)&&a)return i;const u={...i.byRoot,[o]:{...c,expandedPaths:[...c.expandedPaths,s]}};return{byRoot:et(u,Ze)}})},expandPaths:(n,r)=>{const o=J((n||"").trim());if(!o||!r||r.length===0)return;const s=r.map(i=>J((i||"").trim())).filter(i=>i&&xt(i,o));s.length!==0&&e(i=>{const a=i.byRoot[o],c=un(a),l=new Set(c.expandedPaths),u=s.filter(f=>!l.has(f));if(u.length===0)return i;const d={...i.byRoot,[o]:{...c,expandedPaths:[...c.expandedPaths,...u]}};return{byRoot:et(d,Ze)}})}}),{name:"files-view-tabs-store",version:3,storage:pi(),migrate:(e,t)=>t<3||!e||typeof e!="object"?{byRoot:{},activeRuntimeKey:G(),runtimeSnapshots:{}}:e,partialize:e=>{const t={...e.runtimeSnapshots,[e.activeRuntimeKey]:{byRoot:Nn(e.byRoot),updatedAt:Date.now()}},n=Object.fromEntries(Object.entries(t).sort(([,r],[,o])=>o.updatedAt-r.updatedAt).slice(0,Ah).map(([r,o])=>[r,{byRoot:Nn(o.byRoot),updatedAt:o.updatedAt}]));return{activeRuntimeKey:e.activeRuntimeKey,runtimeSnapshots:n}},merge:(e,t)=>{const n=e&&typeof e=="object"?e:{},r=n.runtimeSnapshots&&typeof n.runtimeSnapshots=="object"?n.runtimeSnapshots:{},o=G();return{...t,activeRuntimeKey:o,runtimeSnapshots:r,byRoot:Nn(r[o]?.byRoot)}}}),{name:"files-view-tabs-store"})),Ch=["diff","walkthrough","file","context","plan","chat","browser","git","pr","linear","notes","terminal"],Rh=/^plugin:[a-z][a-z0-9-]*$/,Dh=new Set(Ch),Oh=e=>Rh.test(e),Mh=e=>Dh.has(e)||Oh(e),kT=e=>e.slice(7),ET=e=>`plugin:${e}`,mi=["session","repository","usage","telemetry","subagents","tasks","mcp","pinned","contextSources"],PT={session:"chat.workStatus.section.session",repository:"chat.workStatus.section.project",usage:"chat.workStatus.section.usage",telemetry:"chat.workStatus.section.telemetry",subagents:"chat.workStatus.section.subagents",tasks:"chat.workStatus.section.tasks",mcp:"chat.workStatus.section.mcp",pinned:"chat.workStatus.section.pinned",contextSources:"chat.workStatus.section.contextBreakdown"},_h=new Set(mi),Cl=e=>typeof e=="string"&&_h.has(e),Is=e=>{const t=new Set;if(Array.isArray(e))for(const n of e)Cl(n)&&t.add(n);for(const n of mi)t.add(n);return[...t]},AT=(e,t)=>!e?.includes(t),IT=e=>e!=null&&mi.every(t=>e.includes(t)),xT=({visible:e,contentMounted:t,renderedSections:n,allSectionsHidden:r})=>({interactive:e&&(n>0||r),showEmptyState:t&&r}),Rl=(e,t=!0)=>{if(!Array.isArray(e))return[];const n=new Set;for(const r of e)Cl(r)&&n.add(r);return t||n.delete("telemetry"),[...n]},Lh=e=>Math.min(480,Math.max(200,Math.round(e))),Fh=Te(["diff","walkthrough","file","context","plan","chat","browser","git","pr","linear","notes","terminal"]),Uh=v({widthByMode:Ve(m(),C().finite().optional().catch(void 0)).catch({}),widthFractionByMode:Ve(m(),C().positive().max(1).optional().catch(void 0)).catch({})}),Dl="ask",Ia=e=>e==="attach"||e==="inline"||e==="ask"?e:Dl;function xa(e){return e==="vim"?"vim":"default"}const dt="all";function Ca(e){return e==="all"||e==="backlog"||e==="todo"||e==="started"||e==="inReview"||e==="completed"||e==="canceled"||e==="duplicate"?e:"all"}function Ra(e){return e==="me"||e==="any"?e:"any"}function Ol(e){return typeof e!="string"?dt:e.trim()||dt}function Da(e,t){const n=G();if(Uc(n))return e;const r={...e};return t===dt?delete r[n]:r[n]=t,r}function jh(e){if(!e||typeof e!="object"||Array.isArray(e))return{};const t={};for(const[n,r]of Object.entries(e)){if(!n.trim()||typeof r!="string")continue;const o=Ol(r);o!==dt&&(t[n]=o)}return t}function Oa(e){return e==="none"||e==="urgent"||e==="high"||e==="medium"||e==="low"||e==="all"?e:"all"}const Fr={completion:{title:"{agent_name} is ready",message:"{last_message}"},error:{title:"Tool error",message:"{last_message}"},question:{title:"{agent_name} needs input",message:"{last_message}"},subtask:{title:"Subtask complete",message:"{last_message}"}},St={completion:{title:"",message:""},error:{title:"",message:""},question:{title:"",message:""},subtask:{title:"",message:""}},Ur=(e,t)=>e?e.title===t.title&&e.message===t.message:!1,Nh=e=>{if(!e||typeof e!="object")return!1;const t=e;return Ur(t.completion,Fr.completion)&&Ur(t.error,Fr.error)&&Ur(t.question,Fr.question)&&Ur(t.subtask,Fr.subtask)},Bh=380,Hh=320,zh=1e4,Ml=12,Ma=120,$h=280;let _a=0;const Gh=e=>pe(e),pe=e=>{if(!e)return"";const t=e.replace(/\\/g,"/"),n=t.startsWith("//");let r=t.replace(/\/+$/g,"");return r=r.replace(/\/+/g,"/"),n&&!r.startsWith("//")&&(r=`/${r}`),r===""?t.startsWith("/")?"/":"":r},_l=e=>Number.isFinite(e)?Math.min(zh,Math.max(Hh,Math.round(e))):Bh,ar=e=>{if(typeof e!="string")return null;const t=e.trim();return t?t.replace(/\\/g,"/"):null},yo=e=>{const t=ar(e);return t&&Gh(t)||null},wo=e=>{if(typeof e!="string")return null;const t=e.trim();return t?t.length>Ma?t.slice(0,Ma):t:null},gi=e=>e==="working"||e==="staged"||e==="turn"||e==="branch"||e==="commit"||e==="pr"?e:null,Ll=e=>{if(!e||typeof e!="object"||Array.isArray(e))return null;const t=e,n=typeof t.id=="string"?t.id.trim():"",r=typeof t.path=="string"?t.path.trim():"";return n&&r?{id:n,path:r}:null},Wh=(e,t)=>(e==="file"||e==="browser")&&t||e,Fl=(e,t,n)=>{if(e==="diff")return e;if(typeof n=="string"){const r=n.trim();if(r)return r}return Wh(e,t)},Ul=(e,t)=>t===e?e:`${e}:${t}`,yi=e=>{const t=ar(e.targetPath),n=e.mode==="terminal"?yo(e.targetDirectory):null,r=Fl(e.mode,t,e.dedupeKey);return{id:Ul(e.mode,r),mode:e.mode,targetPath:t,targetDirectory:n,projectPlanId:typeof e.projectPlanId=="string"&&e.projectPlanId.trim()?e.projectPlanId.trim():null,projectPlanRef:Ll(e.projectPlanRef),dedupeKey:r,label:wo(e.label),sessionTitleFallback:wo(e.sessionTitleFallback),readOnly:e.readOnly===!0,stagedDiff:e.stagedDiff===!0,diffScope:gi(e.diffScope)??(e.stagedDiff===!0?"staged":"working"),touchedAt:Date.now()}},jl=(e,t,n)=>{const r=new Map;for(const i of e)r.set(i.mode,(r.get(i.mode)??0)+1);const o=[...r.entries()].filter(([,i])=>i>t);if(o.length===0)return e;const s=new Set;for(const[i,a]of o){const l=[...e.filter(u=>u.mode===i)].sort((u,d)=>u.touchedAt-d.touchedAt).filter(u=>u.id!==n);for(const u of l.slice(0,a-t))s.add(u.id)}return s.size===0?e:e.filter(i=>!s.has(i.id))},Nl=e=>{if(!Array.isArray(e))return[];const t=Me(),n=[],r=new Set;for(const o of e){if(!o||typeof o!="object")continue;const s=o;if(typeof s.mode!="string"||!Mh(s.mode)||t&&s.mode==="browser")continue;const i=ar(typeof s.targetPath=="string"?s.targetPath:null),a=s.mode==="terminal"?yo(s.targetDirectory):null,c=typeof s.projectPlanId=="string"&&s.projectPlanId.trim()?s.projectPlanId.trim():null,l=Ll(s.projectPlanRef);if(s.mode==="plan"&&c!==null!=(l!==null))continue;const u=Fl(s.mode,i,typeof s.dedupeKey=="string"?s.dedupeKey:null),d=Ul(s.mode,u);!d||r.has(d)||(r.add(d),n.push({id:d,mode:s.mode,targetPath:i,targetDirectory:a,projectPlanId:c,projectPlanRef:l,dedupeKey:u,label:wo(typeof s.label=="string"?s.label:null),sessionTitleFallback:wo(typeof s.sessionTitleFallback=="string"?s.sessionTitleFallback:null),readOnly:s.readOnly===!0,stagedDiff:s.stagedDiff===!0,diffScope:gi(s.diffScope)??(s.stagedDiff===!0?"staged":"working"),touchedAt:typeof s.touchedAt=="number"&&Number.isFinite(s.touchedAt)?s.touchedAt:Date.now()}))}return n},Pn=(e,t)=>t&&e.some(n=>n.id===t)?t:e.length===0?null:e[e.length-1].id,Nt=e=>{if(e){const t=Nl(e.tabs),n=Pn(t,e.activeTabId);return{...e,tabs:t,activeTabId:n,touchedAt:Date.now()}}return{isOpen:!1,expanded:!1,tabs:[],activeTabId:null,widthByMode:{},widthFractionByMode:{},touchedAt:Date.now()}},qh=(e,t,n)=>{const r=n?.reveal!==!1,o=yi(t),s=o.mode==="file"&&o.targetPath?e.tabs.filter(u=>!(u.mode==="file"&&!u.targetPath)):e.tabs,i=s.findIndex(u=>u.id===o.id),a=i===-1?[...s,o]:s.map((u,d)=>d===i?{...u,mode:o.mode,targetPath:o.targetPath||u.targetPath,targetDirectory:o.targetDirectory,projectPlanId:o.projectPlanId??u.projectPlanId,projectPlanRef:o.projectPlanRef??u.projectPlanRef,dedupeKey:o.dedupeKey,label:o.label,sessionTitleFallback:o.sessionTitleFallback||u.sessionTitleFallback,stagedDiff:o.stagedDiff,diffScope:o.diffScope,readOnly:o.readOnly,touchedAt:Date.now()}:u),c=r?o.id:e.activeTabId??o.id,l=jl(a,Ml,c);return{...e,isOpen:r?!0:e.isOpen,tabs:l,activeTabId:Pn(l,c),touchedAt:Date.now()}},Kh=(e,t)=>{const n=new Set(t),r=e.tabs.filter(l=>n.has(l.id)),o=e.tabs.filter(l=>!n.has(l.id));if(o.length===e.tabs.length)return e;if(!(e.activeTabId?n.has(e.activeTabId):!1))return{...e,tabs:o,activeTabId:Pn(o,e.activeTabId),isOpen:o.length>0?e.isOpen:!1,touchedAt:Date.now()};const i=r.find(l=>l.id===e.activeTabId)?.mode??null,a=i?o.filter(l=>l.mode===i):[],c=a.length>0?a.reduce((l,u)=>u.touchedAt>=l.touchedAt?u:l):null;if(i==="file"&&!c&&r.some(l=>l.mode==="file"&&l.targetPath)){const l=yi({mode:"file"});return{...e,tabs:[...o,l],activeTabId:l.id,isOpen:e.isOpen,touchedAt:Date.now()}}return{...e,tabs:o,activeTabId:c?.id??Pn(o,null),isOpen:c?e.isOpen:!1,touchedAt:Date.now()}},Vh=(e,t,n)=>{if(t===n)return e;const r=e.tabs.findIndex(a=>a.id===t),o=e.tabs.findIndex(a=>a.id===n);if(r===-1||o===-1)return e;const s=[...e.tabs],[i]=s.splice(r,1);return i?(s.splice(o,0,i),{...e,tabs:s,touchedAt:Date.now()}):e},Jh=(e,t,n)=>({...e,tabs:e.tabs.map(r=>r.id===t?{...r,targetPath:n}:r)}),ss=e=>{if(!e||typeof e!="object")return{};const t=e,n={};for(const[r,o]of Object.entries(t)){const s=pe(r);if(!s||!o||typeof o!="object")continue;const i=o;let a=Nl(i.tabs),c=typeof i.activeTabId=="string"?i.activeTabId:null;a.length===0&&(i.mode==="diff"||i.mode==="file"||i.mode==="context"||i.mode==="plan"||i.mode==="chat"||i.mode==="terminal")&&(a=[yi({mode:i.mode,targetPath:typeof i.targetPath=="string"?i.targetPath:null,targetDirectory:i.targetDirectory,dedupeKey:typeof i.dedupeKey=="string"?i.dedupeKey:null,label:typeof i.label=="string"?i.label:null})],c=a[0]?.id??null);const l=Pn(a,c),u=jl(a,Ml,l),d={},f={},p=Uh.parse(o);for(const g of Fh.options){const b=p.widthByMode[g],w=p.widthFractionByMode[g];b!==void 0&&(d[g]=_l(b)),w!==void 0&&(f[g]=w)}n[s]={isOpen:i.isOpen===!0,expanded:i.expanded===!0,tabs:u,activeTabId:Pn(u,l),widthByMode:d,widthFractionByMode:f,touchedAt:typeof i.touchedAt=="number"&&Number.isFinite(i.touchedAt)?i.touchedAt:Date.now()}}return n},Bt=(e,t)=>{const n=Object.entries(e);if(n.length<=t)return e;n.sort((o,s)=>(s[1]?.touchedAt??0)-(o[1]?.touchedAt??0));const r={};for(const[o,s]of n.slice(0,t))r[o]=s;return r},T=gt()(xn(fr((e,t)=>({theme:"system",isMultiRunLauncherOpen:!1,multiRunLauncherPrefillPrompt:"",isSidebarOpen:!0,sidebarWidth:$h,contextPanelByDirectory:{},contextRailOrder:[],contextRailHiddenSurfaces:[],contextEditorTreeVisible:!0,contextEditorVisible:!0,contextEditorTreeWidth:240,notesPanelHeight:112,workStatusExpandedSections:{},messageQueueExpanded:!0,workStatusScrollTop:0,workStatusPanelEnabled:!0,workStatusPanelVisible:!1,workStatusPanelFits:!1,workStatusOverlayOpen:!1,workStatusHiddenSections:[],workStatusSectionOrder:Is([]),workStatusHiddenSectionsExplicit:!1,isSessionSwitcherOpen:!1,isSessionDropdownOpen:!1,pendingDiffFile:null,pendingDiffStaged:!1,pendingDiffScope:null,pendingFileNavigation:null,pendingFileFocusPath:null,isMobile:!1,isCommandPaletteOpen:!1,isHelpDialogOpen:!1,isAboutDialogOpen:!1,isOpenCodeStatusDialogOpen:!1,openCodeStatusText:"",isSessionCreateDialogOpen:!1,isScheduledTasksDialogOpen:!1,isArchivePageOpen:!1,openGuestPageId:null,worktreesPageProjectId:null,isSettingsDialogOpen:!1,isNewWorktreeDialogOpen:!1,isModelSelectorOpen:!1,sidebarSection:"sessions",settingsPage:"home",settingsHasOpenedOnce:!1,settingsProjectsSelectedId:null,settingsProjectPath:null,settingsRemoteInstancesSelectedId:null,eventStreamStatus:"idle",eventStreamHint:null,showReasoningTraces:!0,streamingAutoFollowEnabled:!0,sessionRecapEnabled:!0,sessionSuggestionEnabled:!0,sessionGoalEnabled:!0,sessionGoalDefaultBudgetEnabled:!1,sessionGoalDefaultBudget:2e5,collapsibleThinkingBlocks:!0,chatRenderMode:"live",activityRenderMode:"summary",showDeletionDialog:!0,showOpenCodeRestartConfirm:!0,autoDeleteEnabled:!1,autoSaveEnabled:!0,autoDeleteAfterDays:30,sessionRetentionAction:"archive",sessionRetentionOnlyArchived:!1,autoDeleteLastRunAt:null,messageLimit:200,fontSize:100,globalDraftStarters:null,terminalFontSize:14,terminalShell:"auto",terminalLoginShells:[],editorFontSize:13,uiFont:oh,monoFont:sh,padding:100,cornerRadius:18,inputBarOffset:0,mobileKeyboardMode:uh(),favoriteModels:[],hiddenModels:[],providerOrder:[],collapsedModelProviders:[],recentModels:[],recentAgents:[],recentEfforts:{},diffLayoutPreference:"inline",diffFileLayout:{},diffWrapLines:!1,walkthroughTocWidth:224,gitChangesViewMode:"flat",toolJsonViewMode:"summary",linearIssueListStatus:"all",linearIssueListAssignee:"any",linearIssueListTeamId:dt,linearIssueListTeamIdByRuntime:{},linearIssueListPriority:"all",linearIssueFocus:null,isTimelineDialogOpen:!1,isPromptNavigatorPanelOpen:!1,isImagePreviewOpen:!1,nativeNotificationsEnabled:!1,notificationMode:"hidden-only",notifyOnSubtasks:!0,dockBadgeEnabled:!0,alwaysShowScrollbars:!1,notifyOnCompletion:!0,notifyOnError:!0,notifyOnQuestion:!0,notificationTemplates:{completion:{...St.completion},error:{...St.error},question:{...St.question},subtask:{...St.subtask}},summarizeLastMessage:!1,summaryThreshold:200,summaryLength:100,maxLastMessageLength:250,showTerminalQuickKeysOnDesktop:!1,sessionTabsEnabled:!1,persistChatDraft:!0,showOpenCodeUpdateNotifications:!Yd(),agentControlToolEnabled:!0,agentWebToolEnabled:!0,agentMemoryToolEnabled:!1,agentMemoryFeatureAvailable:!1,routingFeatureAvailable:!1,agentMemoryViewedAt:{},projectContextSidebarWidth:168,projectContextTab:"notes",inputSpellcheckEnabled:!1,largeTextPasteBehavior:Dl,enterToSend:!1,enterToSendConfigured:!1,wideChatLayoutEnabled:!1,codeBlockLineWrap:!0,showToolFileIcons:!0,showTurnChangedFiles:!1,showExpandedBashTools:!1,showExpandedEditTools:!1,timeFormatPreference:"auto",weekStartPreference:"auto",desktopWindowControlsPosition:"right",desktopWindowControlsStyle:"classic",mermaidRenderingMode:"svg",userMessageRenderingMode:"markdown",collapsibleUserMessages:!0,stickyUserHeader:!1,promptNavigatorEnabled:!0,showSplitAssistantMessageActions:!1,allowPromptingSubagentSessions:!1,draftStartersVisible:!0,isExpandedInput:!1,reportUsage:!0,shortcutOverrides:{},fileEditorKeymap:"default",setTheme:n=>{e({theme:n}),t().applyTheme()},toggleSidebar:()=>{e(n=>({isSidebarOpen:!n.isSidebarOpen}))},setSidebarOpen:n=>{e(r=>r.isSidebarOpen===n?r:{isSidebarOpen:n})},setSidebarWidth:n=>{e({sidebarWidth:n})},setContextRailOrder:n=>{const r=Array.isArray(n)?n.filter((o,s)=>typeof o=="string"&&o.trim()!==""&&n.indexOf(o)===s):[];e({contextRailOrder:r})},toggleContextEditorTree:()=>{e(n=>n.contextEditorTreeVisible&&!n.contextEditorVisible?{contextEditorTreeVisible:!1,contextEditorVisible:!0}:{contextEditorTreeVisible:!n.contextEditorTreeVisible})},toggleContextEditor:()=>{e(n=>n.contextEditorVisible&&!n.contextEditorTreeVisible?{contextEditorVisible:!1,contextEditorTreeVisible:!0}:{contextEditorVisible:!n.contextEditorVisible})},setContextEditorTreeWidth:n=>{Number.isFinite(n)&&e({contextEditorTreeWidth:Lh(n)})},openContextSurface:(n,r)=>{const o=pe((n||"").trim());if(!o)return;const s=t(),i=s.contextPanelByDirectory[o],a=i?.tabs??[],c=a.find(d=>d.id===i?.activeTabId)??null,l=()=>{if(r==="terminal"){const f=(a.find(p=>p.mode==="terminal")??null)?.targetDirectory??null;if(f){const p=Yr.getState().getDirectoryState(f);if(fh(p))return}s.openContextPanelTab(o,{mode:"terminal",targetDirectory:null},{reveal:!1})}};if(i?.isOpen&&c?.mode===r){l(),s.closeContextPanel(o);return}r==="file"&&!s.contextEditorTreeVisible&&e({contextEditorTreeVisible:!0});const u=a.filter(d=>d.mode===r);if(u.length>0){l();const d=u.reduce((f,p)=>p.touchedAt>=f.touchedAt?p:f);s.setActiveContextPanelTab(o,d.id);return}r!=="chat"&&s.openContextPanelTab(o,{mode:r})},openContextPanelTab:(n,r,o)=>{const s=pe((n||"").trim());if(!s)return;const i=r.mode==="terminal"?{...r,targetDirectory:yo(r.targetDirectory)===s?null:yo(r.targetDirectory)}:r,a=i.mode==="file"&&!!i.targetPath&&o?.reveal!==!1;e(c=>{const l=c.contextPanelByDirectory[s],u=Nt(l),d={...c.contextPanelByDirectory,[s]:qh(u,i,o)};return{contextPanelByDirectory:Bt(d,20),contextEditorVisible:a||c.contextEditorVisible}})},openContextDiff:(n,r,o=!1,s=null)=>{const i=pe((n||"").trim()),a=(r||"").trim();if(!i||!a)return;const c=gi(s)??(o?"staged":"working");t().openContextPanelTab(i,{mode:"diff",targetPath:a,stagedDiff:c==="staged",diffScope:c})},openContextFile:(n,r)=>{const o=pe((n||"").trim()),s=ar(r);!o||!s||(t().openContextPanelTab(o,{mode:"file",targetPath:s}),t().setPendingFileFocusPath(s),t().setPendingFileNavigation(null))},openContextFileAtLine:(n,r,o,s)=>{const i=pe((n||"").trim()),a=ar(r),c=Number.isFinite(o)?Math.max(1,Math.trunc(o)):1,l=Number.isFinite(s)?Math.max(1,Math.trunc(s)):1;!i||!a||(t().openContextPanelTab(i,{mode:"file",targetPath:a}),t().setPendingFileFocusPath(null),t().setPendingFileNavigation({path:a,line:c,column:l}))},openContextOverview:n=>{const r=pe((n||"").trim());r&&t().openContextPanelTab(r,{mode:"context"})},openContextPreview:(n,r)=>{const o=pe((n||"").trim()),s=(r||"").trim();!o||!s||Me()||t().openContextPanelTab(o,{mode:"browser",targetPath:s,dedupeKey:s,label:null})},openNewContextBrowserTab:n=>{const r=pe((n||"").trim());!r||Me()||(_a+=1,t().openContextPanelTab(r,{mode:"browser",targetPath:"",dedupeKey:`browser:new:${Date.now()}-${_a}`,label:null}))},openContextBrowser:(n,r="",o)=>{const s=pe((n||"").trim());if(!s||Me())return;const i=typeof r=="string"&&r.trim().length>0?r.trim():"";t().openContextPanelTab(s,{mode:"browser",targetPath:i,dedupeKey:i||"browser",label:null},o)},setContextPanelTabTargetPath:(n,r,o)=>{const s=pe((n||"").trim()),i=(r||"").trim();!s||!i||e(a=>{const c=a.contextPanelByDirectory[s];return c?{contextPanelByDirectory:{...a.contextPanelByDirectory,[s]:Jh(c,i,o)}}:a})},setActiveContextPanelTab:(n,r)=>{const o=pe((n||"").trim()),s=(r||"").trim();!o||!s||e(i=>{const a=i.contextPanelByDirectory[o],c=Nt(a),l=c.tabs.find(f=>f.id===s);if(!l)return i;const u=l.mode==="file"&&!!l.targetPath;if(c.activeTabId===s&&c.isOpen)return u?{contextEditorVisible:!0}:i;const d={...i.contextPanelByDirectory,[o]:{...c,isOpen:!0,activeTabId:s,touchedAt:Date.now(),tabs:c.tabs.map(f=>f.id===s?{...f,touchedAt:Date.now()}:f)}};return{contextPanelByDirectory:Bt(d,20),contextEditorVisible:u||i.contextEditorVisible}})},reorderContextPanelTabs:(n,r,o)=>{const s=pe((n||"").trim()),i=(r||"").trim(),a=(o||"").trim();!s||!i||!a||e(c=>{const l=c.contextPanelByDirectory[s],u=Nt(l);if(!u.tabs.some(p=>p.id===i)||!u.tabs.some(p=>p.id===a))return c;const d=Vh(u,i,a);if(d.tabs===u.tabs)return c;const f={...c.contextPanelByDirectory,[s]:d};return{contextPanelByDirectory:Bt(f,20)}})},closeContextPanelTab:(n,r)=>{t().closeContextPanelTabs(n,[r])},closeContextPanelTabs:(n,r)=>{const o=pe((n||"").trim()),s=(r??[]).map(a=>(a||"").trim()).filter(a=>a.length>0);if(!o||s.length===0)return;const i=s.map(a=>t().contextPanelByDirectory[o]?.tabs.find(c=>c.id===a)).filter(a=>!!a);e(a=>{const c=a.contextPanelByDirectory[o],l=Nt(c);if(!l.tabs.some(g=>s.includes(g.id)))return a;const u=Kh(l,s),d=u.tabs.find(g=>g.id===u.activeTabId),f=u.isOpen&&d?.mode==="file"&&!d.targetPath,p={...a.contextPanelByDirectory,[o]:u};return{contextPanelByDirectory:Bt(p,20),contextEditorTreeVisible:f||a.contextEditorTreeVisible}});for(const a of i)a.mode==="file"&&a.targetPath&&xh.getState().removeOpenPath(o,a.targetPath)},closeContextPanel:n=>{const r=pe((n||"").trim());r&&e(o=>{const s=o.contextPanelByDirectory[r];if(!s||!s.isOpen)return o;const i={...o.contextPanelByDirectory,[r]:{...Nt(s),isOpen:!1}};return{contextPanelByDirectory:Bt(i,20)}})},toggleContextPanelExpanded:n=>{const r=pe((n||"").trim());r&&e(o=>{const s=o.contextPanelByDirectory[r],i=Nt(s),a={...o.contextPanelByDirectory,[r]:{...i,expanded:!i.expanded}};return{contextPanelByDirectory:Bt(a,20)}})},setContextPanelWidth:(n,r,o,s)=>{const i=pe((n||"").trim());i&&e(a=>{const c=a.contextPanelByDirectory[i],l=Nt(c),u=_l(o),d={...l.widthFractionByMode};s!==void 0&&Number.isFinite(s)&&s>0?d[r]=Math.min(1,u/s):delete d[r];const f={...a.contextPanelByDirectory,[i]:{...l,widthByMode:{...l.widthByMode,[r]:u},widthFractionByMode:d}};return{contextPanelByDirectory:Bt(f,20)}})},setNotesPanelHeight:n=>{e({notesPanelHeight:n})},setWorkStatusSectionExpanded:(n,r)=>{e(o=>o.workStatusExpandedSections[n]===r?o:{workStatusExpandedSections:{...o.workStatusExpandedSections,[n]:r}})},setMessageQueueExpanded:n=>{e(r=>r.messageQueueExpanded===n?r:{messageQueueExpanded:n})},setWorkStatusScrollTop:n=>{e({workStatusScrollTop:Math.max(0,n)})},setWorkStatusPanelEnabled:n=>{e({workStatusPanelEnabled:n})},setWorkStatusPanelVisible:n=>{e(r=>r.workStatusPanelVisible===n?r:{workStatusPanelVisible:n})},setWorkStatusPanelFits:n=>{e(r=>r.workStatusPanelFits===n?r:n?{workStatusPanelFits:!0,workStatusOverlayOpen:!1}:{workStatusPanelFits:!1})},setWorkStatusOverlayOpen:n=>{e(r=>r.workStatusOverlayOpen===n?r:{workStatusOverlayOpen:n})},setWorkStatusSectionVisible:(n,r)=>{e(o=>{const s=o.workStatusHiddenSections,i=s.includes(n);return r===!i?o:{workStatusHiddenSectionsExplicit:!0,workStatusHiddenSections:r?s.filter(a=>a!==n):[...s,n]}})},setWorkStatusHiddenSections:n=>{e({workStatusHiddenSections:[...new Set(n)],workStatusHiddenSectionsExplicit:!0})},setWorkStatusSectionOrder:n=>{e({workStatusSectionOrder:Is(n)})},setContextRailSurfaceVisible:(n,r)=>{e(o=>{const s=o.contextRailHiddenSurfaces,i=s.includes(n);return r===!i?o:{contextRailHiddenSurfaces:r?s.filter(a=>a!==n):[...s,n]}})},setContextRailHiddenSurfaces:n=>{e({contextRailHiddenSurfaces:[...new Set(n)]})},setSessionSwitcherOpen:n=>{t().isSessionSwitcherOpen!==n&&e({isSessionSwitcherOpen:n})},setSessionDropdownOpen:n=>{t().isSessionDropdownOpen!==n&&e({isSessionDropdownOpen:n})},setPendingDiffFile:(n,r=!1,o=null)=>{e({pendingDiffFile:n,pendingDiffStaged:n?r:!1,pendingDiffScope:n?o:null})},setPendingFileNavigation:n=>{e({pendingFileNavigation:n})},setPendingFileFocusPath:n=>{e({pendingFileFocusPath:n})},navigateToDiff:(n,r=!1,o=null)=>{e({pendingDiffFile:n,pendingDiffStaged:r,pendingDiffScope:o})},consumePendingDiffFile:()=>{const{pendingDiffFile:n}=t();return n&&e({pendingDiffFile:null,pendingDiffStaged:!1,pendingDiffScope:null}),n},setIsMobile:n=>{e({isMobile:n})},toggleCommandPalette:()=>{e(n=>({isCommandPaletteOpen:!n.isCommandPaletteOpen}))},setCommandPaletteOpen:n=>{e({isCommandPaletteOpen:n})},toggleHelpDialog:()=>{e(n=>({isHelpDialogOpen:!n.isHelpDialogOpen}))},setHelpDialogOpen:n=>{e({isHelpDialogOpen:n})},setAboutDialogOpen:n=>{e({isAboutDialogOpen:n})},setOpenCodeStatusDialogOpen:n=>{e({isOpenCodeStatusDialogOpen:n})},setOpenCodeStatusText:n=>{e({openCodeStatusText:n})},setSessionCreateDialogOpen:n=>{e({isSessionCreateDialogOpen:n})},setScheduledTasksDialogOpen:n=>{e(n?{isScheduledTasksDialogOpen:!0,isArchivePageOpen:!1,worktreesPageProjectId:null,isMultiRunLauncherOpen:!1,openGuestPageId:null}:{isScheduledTasksDialogOpen:!1})},setArchivePageOpen:n=>{e(n?{isArchivePageOpen:!0,isScheduledTasksDialogOpen:!1,worktreesPageProjectId:null,isMultiRunLauncherOpen:!1,openGuestPageId:null}:{isArchivePageOpen:!1})},setWorktreesPageProjectId:n=>{e(n?{worktreesPageProjectId:n,isScheduledTasksDialogOpen:!1,isArchivePageOpen:!1,isMultiRunLauncherOpen:!1,openGuestPageId:null}:{worktreesPageProjectId:null})},setOpenGuestPage:n=>{e(n?{openGuestPageId:n,isScheduledTasksDialogOpen:!1,isArchivePageOpen:!1,worktreesPageProjectId:null,isMultiRunLauncherOpen:!1}:{openGuestPageId:null})},closeMainSurfaces:()=>{const n=t();!n.isScheduledTasksDialogOpen&&!n.isArchivePageOpen&&!n.worktreesPageProjectId&&!n.isMultiRunLauncherOpen&&!n.openGuestPageId||e({isScheduledTasksDialogOpen:!1,isArchivePageOpen:!1,worktreesPageProjectId:null,isMultiRunLauncherOpen:!1,multiRunLauncherPrefillPrompt:"",openGuestPageId:null})},setSettingsDialogOpen:n=>{e(r=>n?r.settingsHasOpenedOnce?{isSettingsDialogOpen:!0}:{isSettingsDialogOpen:!0,settingsHasOpenedOnce:!0}:{isSettingsDialogOpen:!1})},setNewWorktreeDialogOpen:n=>{e({isNewWorktreeDialogOpen:n})},setModelSelectorOpen:n=>{e({isModelSelectorOpen:n})},setSidebarSection:n=>{e({sidebarSection:n})},setSettingsPage:n=>{e({settingsPage:n})},setSettingsProjectPath:n=>{const r=n?.trim();e({settingsProjectPath:r||null})},setSettingsProjectsSelectedId:n=>{e({settingsProjectsSelectedId:n})},setSettingsRemoteInstancesSelectedId:n=>{e({settingsRemoteInstancesSelectedId:n})},setEventStreamStatus:(n,r)=>{e({eventStreamStatus:n,eventStreamHint:r??null})},setShowReasoningTraces:n=>{e({showReasoningTraces:n})},setStreamingAutoFollowEnabled:n=>{e({streamingAutoFollowEnabled:n})},setSessionRecapEnabled:n=>{e({sessionRecapEnabled:n})},setSessionSuggestionEnabled:n=>{e({sessionSuggestionEnabled:n})},setSessionGoalEnabled:n=>{e({sessionGoalEnabled:n})},setSessionGoalDefaultBudgetEnabled:n=>{e({sessionGoalDefaultBudgetEnabled:n})},setSessionGoalDefaultBudget:n=>{e({sessionGoalDefaultBudget:n})},setCollapsibleThinkingBlocks:n=>{e({collapsibleThinkingBlocks:n})},setChatRenderMode:n=>{e({chatRenderMode:n})},setActivityRenderMode:n=>{e({activityRenderMode:n})},setShowDeletionDialog:n=>{e({showDeletionDialog:n})},setShowOpenCodeRestartConfirm:n=>{e({showOpenCodeRestartConfirm:n})},setAutoDeleteEnabled:n=>{e({autoDeleteEnabled:n})},setAutoSaveEnabled:n=>{e({autoSaveEnabled:n})},setAutoDeleteAfterDays:n=>{const r=Math.max(1,Math.min(365,n));e({autoDeleteAfterDays:r})},setSessionRetentionAction:n=>{e(r=>({sessionRetentionAction:r.sessionRetentionOnlyArchived?"delete":n}))},setSessionRetentionOnlyArchived:n=>{e(r=>({sessionRetentionOnlyArchived:n,sessionRetentionAction:n?"delete":r.sessionRetentionAction}))},setAutoDeleteLastRunAt:n=>{e({autoDeleteLastRunAt:n})},setMessageLimit:n=>{const r=Math.max(10,Math.min(500,Math.round(n)));e({messageLimit:r})},setFontSize:n=>{const r=Math.max(50,Math.min(200,n));e({fontSize:r}),t().applyTypography()},setGlobalDraftStarters:n=>{e({globalDraftStarters:n})},setDraftStartersVisible:n=>{e({draftStartersVisible:n})},setTerminalFontSize:n=>{const r=Math.round(n),o=Math.max(9,Math.min(52,r));e({terminalFontSize:o})},setTerminalShell:n=>{e({terminalShell:n})},setTerminalLoginShells:n=>{e({terminalLoginShells:[...new Set(n)]})},setEditorFontSize:n=>{const r=Math.round(n),o=Math.max(9,Math.min(32,r));e({editorFontSize:o})},setUiFont:n=>{e({uiFont:n})},setMonoFont:n=>{e({monoFont:n})},setPadding:n=>{const r=Math.max(50,Math.min(200,n));e({padding:r}),t().applyPadding()},setCornerRadius:n=>{e({cornerRadius:n})},applyTypography:()=>{const{fontSize:n}=t(),r=document.documentElement,o=n/100,s=Object.entries(Zp);if(o===1){r.style.removeProperty("font-size");for(const[i]of s)r.style.removeProperty(ba(i));return}r.style.fontSize=`${o*100}%`;for(const[i]of s)r.style.removeProperty(ba(i))},applyPadding:()=>{const{padding:n}=t(),r=document.documentElement,o=n/100;if(o===1){r.style.removeProperty("--padding-scale"),r.style.removeProperty("--line-height-tight"),r.style.removeProperty("--line-height-normal"),r.style.removeProperty("--line-height-relaxed"),r.style.removeProperty("--line-height-loose");return}const s=Math.sqrt(o);r.style.setProperty("--padding-scale",s.toString());const i=1+(o-1)*.15;r.style.setProperty("--line-height-tight",(1.25*i).toFixed(3)),r.style.setProperty("--line-height-normal",(1.5*i).toFixed(3)),r.style.setProperty("--line-height-relaxed",(1.625*i).toFixed(3)),r.style.setProperty("--line-height-loose",(2*i).toFixed(3))},setDiffLayoutPreference:n=>{e({diffLayoutPreference:n})},setDiffFileLayout:(n,r)=>{e(o=>({diffFileLayout:{...o.diffFileLayout,[n]:r}}))},setDiffWrapLines:n=>{e({diffWrapLines:n})},setWalkthroughTocWidth:n=>{e({walkthroughTocWidth:Math.round(n)})},setGitChangesViewMode:n=>{e({gitChangesViewMode:n})},setToolJsonViewMode:n=>{e({toolJsonViewMode:n})},setLinearIssueListStatus:n=>{e({linearIssueListStatus:Ca(n)})},setLinearIssueListAssignee:n=>{e({linearIssueListAssignee:Ra(n)})},setLinearIssueListTeamId:n=>{const r=Ol(n);e(o=>({linearIssueListTeamId:r,linearIssueListTeamIdByRuntime:Da(o.linearIssueListTeamIdByRuntime,r)}))},applyLinearIssueListFiltersForRuntime:()=>{const n=G();e(r=>({linearIssueListTeamId:Uc(n)?dt:r.linearIssueListTeamIdByRuntime[n]??dt}))},setLinearIssueListPriority:n=>{e({linearIssueListPriority:Oa(n)})},resetLinearIssueListFilters:()=>{e(n=>({linearIssueListStatus:"all",linearIssueListAssignee:"any",linearIssueListTeamId:dt,linearIssueListTeamIdByRuntime:Da(n.linearIssueListTeamIdByRuntime,dt),linearIssueListPriority:"all"}))},setLinearIssueFocus:n=>{const r=n?.trim()??"";e({linearIssueFocus:r||null})},setInputBarOffset:n=>{e({inputBarOffset:n})},setMobileKeyboardMode:n=>{e(r=>r.mobileKeyboardMode===n?r:{mobileKeyboardMode:n})},toggleFavoriteModel:(n,r)=>{e(o=>o.favoriteModels.some(i=>i.providerID===n&&i.modelID===r)?{favoriteModels:o.favoriteModels.filter(i=>!(i.providerID===n&&i.modelID===r))}:{favoriteModels:[{providerID:n,modelID:r},...o.favoriteModels]})},reorderFavoriteModel:(n,r,o,s)=>{e(i=>{const a=i.favoriteModels.findIndex(d=>d.providerID===n&&d.modelID===r),c=i.favoriteModels.findIndex(d=>d.providerID===o&&d.modelID===s);if(a===-1||c===-1||a===c)return i;const l=i.favoriteModels.slice(),[u]=l.splice(a,1);return u?(l.splice(c,0,u),{favoriteModels:l}):i})},setProviderOrder:n=>{e(r=>{const o=n.filter(i=>typeof i=="string"&&i.length>0),s=r.providerOrder;return s.length===o.length&&s.every((i,a)=>i===o[a])?r:{providerOrder:o}})},toggleHiddenModel:(n,r)=>{e(o=>o.hiddenModels.some(i=>i.providerID===n&&i.modelID===r)?{hiddenModels:o.hiddenModels.filter(i=>!(i.providerID===n&&i.modelID===r))}:{hiddenModels:[{providerID:n,modelID:r},...o.hiddenModels]})},isHiddenModel:(n,r)=>{const{hiddenModels:o}=t();return o.some(s=>s.providerID===n&&s.modelID===r)},hideAllModels:(n,r)=>{e(o=>{const s=o.hiddenModels.filter(a=>a.providerID!==n);return{hiddenModels:[...r.filter(a=>typeof a=="string"&&a.length>0).map(a=>({providerID:n,modelID:a})),...s]}})},showAllModels:n=>{e(r=>({hiddenModels:r.hiddenModels.filter(o=>o.providerID!==n)}))},toggleModelProviderCollapsed:n=>{const r=typeof n=="string"?n.trim():"";r&&e(o=>o.collapsedModelProviders.includes(r)?{collapsedModelProviders:o.collapsedModelProviders.filter(i=>i!==r)}:{collapsedModelProviders:[...o.collapsedModelProviders,r]})},setModelProvidersCollapsed:(n,r)=>{const o=Array.from(new Set(n.filter(s=>typeof s=="string").map(s=>s.trim()).filter(Boolean)));o.length!==0&&e(s=>{const i=new Set(o),a=s.collapsedModelProviders.filter(c=>!i.has(c));return{collapsedModelProviders:r?[...a,...o]:a}})},isFavoriteModel:(n,r)=>{const{favoriteModels:o}=t();return o.some(s=>s.providerID===n&&s.modelID===r)},addRecentModel:(n,r)=>{e(o=>{const s=o.recentModels.filter(i=>!(i.providerID===n&&i.modelID===r));return{recentModels:[{providerID:n,modelID:r},...s].slice(0,5)}})},addRecentAgent:n=>{const r=typeof n=="string"?n.trim():"";r&&e(o=>{if(o.recentAgents.includes(r))return o;const s=o.recentAgents;return{recentAgents:[r,...s].slice(0,5)}})},addRecentEffort:(n,r,o)=>{const s=typeof n=="string"?n.trim():"",i=typeof r=="string"?r.trim():"";if(!s||!i)return;const a=`${s}/${i}`,c=typeof o=="string"&&o.trim().length>0?o.trim():"default";e(l=>{const u=l.recentEfforts[a]??[];if(u.includes(c))return l;const d=u;return{recentEfforts:{...l.recentEfforts,[a]:[c,...d].slice(0,5)}}})},applyTheme:()=>{const{theme:n}=t(),r=document.documentElement;if(r.classList.remove("light","dark"),n==="system"){const o=window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light";r.classList.add(o)}else r.classList.add(n)},setMultiRunLauncherOpen:n=>{e(r=>({isMultiRunLauncherOpen:n,multiRunLauncherPrefillPrompt:n?r.multiRunLauncherPrefillPrompt:"",...n?{isScheduledTasksDialogOpen:!1,isArchivePageOpen:!1,worktreesPageProjectId:null,openGuestPageId:null}:{}}))},openMultiRunLauncher:()=>{e({openGuestPageId:null,isMultiRunLauncherOpen:!0,multiRunLauncherPrefillPrompt:"",isSessionSwitcherOpen:!1,isScheduledTasksDialogOpen:!1,isArchivePageOpen:!1,worktreesPageProjectId:null})},openMultiRunLauncherWithPrompt:n=>{e({openGuestPageId:null,isMultiRunLauncherOpen:!0,multiRunLauncherPrefillPrompt:n,isSessionSwitcherOpen:!1,isScheduledTasksDialogOpen:!1,isArchivePageOpen:!1,worktreesPageProjectId:null})},setTimelineDialogOpen:n=>{e({isTimelineDialogOpen:n})},setPromptNavigatorPanelOpen:n=>{e({isPromptNavigatorPanelOpen:n})},togglePromptNavigatorPanel:()=>{e(n=>({isPromptNavigatorPanelOpen:!n.isPromptNavigatorPanelOpen}))},setImagePreviewOpen:n=>{e({isImagePreviewOpen:n})},setNativeNotificationsEnabled:n=>{e({nativeNotificationsEnabled:n})},setNotificationMode:n=>{e({notificationMode:n})},setShowTerminalQuickKeysOnDesktop:n=>{e({showTerminalQuickKeysOnDesktop:n})},setSessionTabsEnabled:n=>{e({sessionTabsEnabled:n})},setNotifyOnSubtasks:n=>{e({notifyOnSubtasks:n})},setDockBadgeEnabled:n=>{e({dockBadgeEnabled:n})},setAlwaysShowScrollbars:n=>{e({alwaysShowScrollbars:n})},setNotifyOnCompletion:n=>{e({notifyOnCompletion:n})},setNotifyOnError:n=>{e({notifyOnError:n})},setNotifyOnQuestion:n=>{e({notifyOnQuestion:n})},setNotificationTemplates:n=>{e(r=>({notificationTemplates:typeof n=="function"?n(r.notificationTemplates):n}))},setSummarizeLastMessage:n=>{e({summarizeLastMessage:n})},setSummaryThreshold:n=>{e({summaryThreshold:n})},setSummaryLength:n=>{e({summaryLength:n})},setMaxLastMessageLength:n=>{e({maxLastMessageLength:n})},setPersistChatDraft:n=>{e({persistChatDraft:n})},setShowOpenCodeUpdateNotifications:n=>{e({showOpenCodeUpdateNotifications:n})},setAgentControlToolEnabled:n=>{e({agentControlToolEnabled:n})},setAgentWebToolEnabled:n=>{e({agentWebToolEnabled:n})},setAgentMemoryToolEnabled:n=>{e({agentMemoryToolEnabled:n})},setAgentMemoryFeatureAvailable:n=>{e({agentMemoryFeatureAvailable:n})},setRoutingFeatureAvailable:n=>{e({routingFeatureAvailable:n})},setProjectContextSidebarWidth:n=>{e({projectContextSidebarWidth:n})},markAgentMemoryViewed:(n,r)=>{e(o=>({agentMemoryViewedAt:r>(o.agentMemoryViewedAt[n]??0)?{...o.agentMemoryViewedAt,[n]:r}:o.agentMemoryViewedAt}))},setProjectContextTab:n=>{e({projectContextTab:n})},setInputSpellcheckEnabled:n=>{e({inputSpellcheckEnabled:n})},setLargeTextPasteBehavior:n=>{e({largeTextPasteBehavior:Ia(n)})},setEnterToSend:n=>{e({enterToSend:n})},setEnterToSendConfigured:n=>{e({enterToSendConfigured:n})},setWideChatLayoutEnabled:n=>{e({wideChatLayoutEnabled:n})},setCodeBlockLineWrap:n=>{e({codeBlockLineWrap:n})},setShowToolFileIcons:n=>{e({showToolFileIcons:n})},setShowTurnChangedFiles:n=>{e({showTurnChangedFiles:n})},setShowExpandedBashTools:n=>{e({showExpandedBashTools:n})},setShowExpandedEditTools:n=>{e({showExpandedEditTools:n})},setTimeFormatPreference:n=>{e({timeFormatPreference:n})},setWeekStartPreference:n=>{e({weekStartPreference:n})},setDesktopWindowControlsPosition:n=>{e({desktopWindowControlsPosition:n==="left"?"left":"right"})},setDesktopWindowControlsStyle:n=>{e({desktopWindowControlsStyle:n==="traffic-lights"?"traffic-lights":"classic"})},setMermaidRenderingMode:n=>{e({mermaidRenderingMode:n})},setUserMessageRenderingMode:n=>{e({userMessageRenderingMode:n})},setCollapsibleUserMessages:n=>{e({collapsibleUserMessages:n})},setStickyUserHeader:n=>{e({stickyUserHeader:n})},setPromptNavigatorEnabled:n=>{e({promptNavigatorEnabled:n})},setShowSplitAssistantMessageActions:n=>{e({showSplitAssistantMessageActions:n})},setAllowPromptingSubagentSessions:n=>{e({allowPromptingSubagentSessions:n})},setReportUsage:n=>{e({reportUsage:n})},viewPagerPage:"center",setViewPagerPage:n=>{e({viewPagerPage:n}),e({isSessionSwitcherOpen:n==="left"})},setShortcutOverride:(n,r)=>{e(o=>({shortcutOverrides:{...o.shortcutOverrides,[n]:r}}))},clearShortcutOverride:n=>{e(r=>{const o={...r.shortcutOverrides};return delete o[n],{shortcutOverrides:o}})},resetAllShortcutOverrides:()=>{e({shortcutOverrides:{}})},setFileEditorKeymap:n=>{e({fileEditorKeymap:xa(n)})},toggleExpandedInput:()=>{e(n=>({isExpandedInput:!n.isExpandedInput}))},setExpandedInput:n=>{e({isExpandedInput:n})}}),{name:"ui-store",storage:pi(),version:21,migrate:(e,t)=>{if(!e||typeof e!="object")return e;const n=e;if(t<21&&n.workStatusHiddenSectionsExplicit!==!0&&(n.workStatusHiddenSections=Array.isArray(n.workStatusHiddenSections)?n.workStatusHiddenSections.filter(r=>r!=="telemetry"):[],n.workStatusHiddenSectionsExplicit=!1),t<16&&(delete n.activeMainTab,delete n.activeSurface),t<17&&delete n.expandedEditorToolbar,t<18&&delete n.shortcutOverrides,t<14){const r=n.contextPanelByDirectory;if(r&&typeof r=="object")for(const o of Object.values(r)){if(!o||typeof o!="object")continue;const s=o,i=s.widthByMode;if(i&&typeof i=="object"){const l=i;l.preview!==void 0&&(l.browser===void 0&&(l.browser=l.preview),delete l.preview)}if(!Array.isArray(s.tabs))continue;const a=new Set,c=[];for(const l of s.tabs){if(!l||typeof l!="object")continue;const u=l;if(u.mode!=="preview"){typeof u.id=="string"&&a.add(u.id),c.push(u);continue}const d=typeof u.targetPath=="string"?u.targetPath:"",f=typeof u.dedupeKey=="string"&&u.dedupeKey.trim()?u.dedupeKey.trim():d||"browser",p=f==="browser"?"browser":`browser:${f}`;a.has(p)||(a.add(p),c.push({...u,mode:"browser",id:p,dedupeKey:f}))}if(s.tabs=c,typeof s.activeTabId=="string"&&s.activeTabId.startsWith("preview")){const l=c.find(u=>typeof u.id=="string");s.activeTabId=l&&typeof l.id=="string"?l.id:null}}}if(t<13&&typeof n.autoSaveEnabled!="boolean"){let r=!0;try{if(typeof localStorage<"u"){const o=localStorage.getItem("openchamber:files:auto-save-enabled");o!==null&&(r=o!=="false",localStorage.removeItem("openchamber:files:auto-save-enabled"))}}catch{r=!0}n.autoSaveEnabled=r}if(t<12&&(n.desktopWindowControlsPosition==="auto"||n.desktopWindowControlsPosition==null)&&(n.desktopWindowControlsPosition="right"),t<11&&n.terminalFontSize===13&&(n.terminalFontSize=14),t<10&&delete n.diffViewMode,t<9&&((!n.workStatusExpandedSections||typeof n.workStatusExpandedSections!="object")&&(n.workStatusExpandedSections={}),(typeof n.workStatusScrollTop!="number"||!Number.isFinite(n.workStatusScrollTop))&&(n.workStatusScrollTop=0),typeof n.workStatusPanelEnabled!="boolean"&&(n.workStatusPanelEnabled=!0),Array.isArray(n.workStatusHiddenSections)||(n.workStatusHiddenSections=[]),(typeof n.notesPanelHeight!="number"||!Number.isFinite(n.notesPanelHeight))&&(n.notesPanelHeight=112)),t<1&&Nh(n.notificationTemplates)&&(n.notificationTemplates={completion:{...St.completion},error:{...St.error},question:{...St.question},subtask:{...St.subtask}}),t<3){const r=new Set([90,120,180,220]),o=n.memoryLimitHistorical,s=n.memoryLimitActiveSession;typeof o=="number"&&!r.has(o)?n.messageLimit=o:typeof s=="number"&&!r.has(s)&&(n.messageLimit=s),delete n.memoryLimitHistorical,delete n.memoryLimitViewport,delete n.memoryLimitActiveSession}if(delete n.isRightSidebarOpen,delete n.rightSidebarWidth,delete n.rightSidebarTab,n.contextPanelByDirectory=ss(n.contextPanelByDirectory),t<5)if(!n.shortcutOverrides||typeof n.shortcutOverrides!="object")n.shortcutOverrides={};else{const r=n.shortcutOverrides,o={};for(const[s,i]of Object.entries(r))typeof s=="string"&&typeof i=="string"&&(o[s]=i);n.shortcutOverrides=o}return t<6&&(n.contextPanelByDirectory=ss(n.contextPanelByDirectory)),t<7&&(n.contextPanelByDirectory=ss(n.contextPanelByDirectory)),t<8&&n.gitChangesViewMode!=="flat"&&n.gitChangesViewMode!=="tree"&&(n.gitChangesViewMode="flat"),n.linearIssueListStatus=Ca(n.linearIssueListStatus),n.linearIssueListAssignee=Ra(n.linearIssueListAssignee),delete n.linearIssueListTeamId,n.linearIssueListTeamIdByRuntime=jh(n.linearIssueListTeamIdByRuntime),n.linearIssueListPriority=Oa(n.linearIssueListPriority),n.fileEditorKeymap=xa(n.fileEditorKeymap),n.largeTextPasteBehavior=Ia(n.largeTextPasteBehavior),n.toolJsonViewMode!=="summary"&&n.toolJsonViewMode!=="formatted"&&n.toolJsonViewMode!=="raw"&&(n.toolJsonViewMode="summary"),typeof n.autoSaveEnabled!="boolean"&&(n.autoSaveEnabled=!0),n.contextRailHiddenSurfaces=Array.isArray(n.contextRailHiddenSurfaces)?n.contextRailHiddenSurfaces.filter(r=>typeof r=="string"&&r.trim()!==""):[],n.contextRailOrder=Array.isArray(n.contextRailOrder)?n.contextRailOrder.filter(r=>typeof r=="string"&&r.trim()!==""):[],n},partialize:e=>({theme:e.theme,isSidebarOpen:e.isSidebarOpen,sidebarWidth:e.sidebarWidth,contextPanelByDirectory:e.contextPanelByDirectory,contextRailOrder:e.contextRailOrder,contextRailHiddenSurfaces:e.contextRailHiddenSurfaces,contextEditorTreeVisible:e.contextEditorTreeVisible,contextEditorVisible:e.contextEditorVisible,contextEditorTreeWidth:e.contextEditorTreeWidth,notesPanelHeight:e.notesPanelHeight,workStatusExpandedSections:e.workStatusExpandedSections,messageQueueExpanded:e.messageQueueExpanded,workStatusScrollTop:e.workStatusScrollTop,workStatusPanelEnabled:e.workStatusPanelEnabled,workStatusHiddenSections:e.workStatusHiddenSections,workStatusSectionOrder:e.workStatusSectionOrder,workStatusHiddenSectionsExplicit:e.workStatusHiddenSectionsExplicit,isSessionSwitcherOpen:e.isSessionSwitcherOpen,sidebarSection:e.sidebarSection,settingsPage:e.settingsPage,settingsHasOpenedOnce:e.settingsHasOpenedOnce,settingsProjectsSelectedId:e.settingsProjectsSelectedId,settingsRemoteInstancesSelectedId:e.settingsRemoteInstancesSelectedId,isSessionCreateDialogOpen:e.isSessionCreateDialogOpen,showReasoningTraces:e.showReasoningTraces,streamingAutoFollowEnabled:e.streamingAutoFollowEnabled,sessionRecapEnabled:e.sessionRecapEnabled,sessionSuggestionEnabled:e.sessionSuggestionEnabled,sessionGoalEnabled:e.sessionGoalEnabled,sessionGoalDefaultBudgetEnabled:e.sessionGoalDefaultBudgetEnabled,sessionGoalDefaultBudget:e.sessionGoalDefaultBudget,collapsibleThinkingBlocks:e.collapsibleThinkingBlocks,chatRenderMode:e.chatRenderMode,activityRenderMode:e.activityRenderMode,showDeletionDialog:e.showDeletionDialog,showOpenCodeRestartConfirm:e.showOpenCodeRestartConfirm,autoDeleteEnabled:e.autoDeleteEnabled,autoSaveEnabled:e.autoSaveEnabled,autoDeleteAfterDays:e.autoDeleteAfterDays,sessionRetentionAction:e.sessionRetentionAction,sessionRetentionOnlyArchived:e.sessionRetentionOnlyArchived,autoDeleteLastRunAt:e.autoDeleteLastRunAt,messageLimit:e.messageLimit,fontSize:e.fontSize,globalDraftStarters:e.globalDraftStarters,terminalFontSize:e.terminalFontSize,terminalShell:e.terminalShell,terminalLoginShells:e.terminalLoginShells,editorFontSize:e.editorFontSize,uiFont:e.uiFont,monoFont:e.monoFont,padding:e.padding,cornerRadius:e.cornerRadius,favoriteModels:e.favoriteModels,hiddenModels:e.hiddenModels,providerOrder:e.providerOrder,collapsedModelProviders:e.collapsedModelProviders,recentModels:e.recentModels,recentAgents:e.recentAgents,recentEfforts:e.recentEfforts,diffLayoutPreference:e.diffLayoutPreference,diffWrapLines:e.diffWrapLines,walkthroughTocWidth:e.walkthroughTocWidth,gitChangesViewMode:e.gitChangesViewMode,toolJsonViewMode:e.toolJsonViewMode,linearIssueListStatus:e.linearIssueListStatus,linearIssueListAssignee:e.linearIssueListAssignee,linearIssueListTeamIdByRuntime:e.linearIssueListTeamIdByRuntime,linearIssueListPriority:e.linearIssueListPriority,nativeNotificationsEnabled:e.nativeNotificationsEnabled,notificationMode:e.notificationMode,showTerminalQuickKeysOnDesktop:e.showTerminalQuickKeysOnDesktop,sessionTabsEnabled:e.sessionTabsEnabled,notifyOnSubtasks:e.notifyOnSubtasks,dockBadgeEnabled:e.dockBadgeEnabled,alwaysShowScrollbars:e.alwaysShowScrollbars,notifyOnCompletion:e.notifyOnCompletion,notifyOnError:e.notifyOnError,notifyOnQuestion:e.notifyOnQuestion,notificationTemplates:e.notificationTemplates,summarizeLastMessage:e.summarizeLastMessage,summaryThreshold:e.summaryThreshold,summaryLength:e.summaryLength,maxLastMessageLength:e.maxLastMessageLength,persistChatDraft:e.persistChatDraft,showOpenCodeUpdateNotifications:e.showOpenCodeUpdateNotifications,agentControlToolEnabled:e.agentControlToolEnabled,agentWebToolEnabled:e.agentWebToolEnabled,agentMemoryToolEnabled:e.agentMemoryToolEnabled,agentMemoryViewedAt:e.agentMemoryViewedAt,projectContextSidebarWidth:e.projectContextSidebarWidth,inputSpellcheckEnabled:e.inputSpellcheckEnabled,largeTextPasteBehavior:e.largeTextPasteBehavior,enterToSend:e.enterToSend,enterToSendConfigured:e.enterToSendConfigured,wideChatLayoutEnabled:e.wideChatLayoutEnabled,codeBlockLineWrap:e.codeBlockLineWrap,showToolFileIcons:e.showToolFileIcons,showTurnChangedFiles:e.showTurnChangedFiles,showExpandedBashTools:e.showExpandedBashTools,showExpandedEditTools:e.showExpandedEditTools,timeFormatPreference:e.timeFormatPreference,weekStartPreference:e.weekStartPreference,desktopWindowControlsPosition:e.desktopWindowControlsPosition,desktopWindowControlsStyle:e.desktopWindowControlsStyle,inputBarOffset:e.inputBarOffset,mermaidRenderingMode:e.mermaidRenderingMode,userMessageRenderingMode:e.userMessageRenderingMode,collapsibleUserMessages:e.collapsibleUserMessages,stickyUserHeader:e.stickyUserHeader,promptNavigatorEnabled:e.promptNavigatorEnabled,showSplitAssistantMessageActions:e.showSplitAssistantMessageActions,allowPromptingSubagentSessions:e.allowPromptingSubagentSessions,draftStartersVisible:e.draftStartersVisible,shortcutOverrides:e.shortcutOverrides,fileEditorKeymap:e.fileEditorKeymap})}),{name:"ui-store"})),Yh=e=>{if(!e||typeof e!="object")return null;const t={};return typeof e.showReasoningTraces=="boolean"&&(t.showReasoningTraces=e.showReasoningTraces),typeof e.collapsibleThinkingBlocks=="boolean"&&(t.collapsibleThinkingBlocks=e.collapsibleThinkingBlocks),Object.keys(t).length>0?t:null},Qh=e=>{if(!e||typeof e!="object")return null;const t=e;return{showReasoningTraces:t.showReasoningTraces,collapsibleThinkingBlocks:t.collapsibleThinkingBlocks}},Xh=e=>{const t=T.getState();typeof e.showReasoningTraces=="boolean"&&t.setShowReasoningTraces(e.showReasoningTraces),typeof e.collapsibleThinkingBlocks=="boolean"&&t.setCollapsibleThinkingBlocks(e.collapsibleThinkingBlocks)},Zh=async()=>{if(typeof window>"u")return null;const e=localStorage.getItem("appearance-preferences");if(!e)return null;try{const t=JSON.parse(e),n=Qh(t);return Yh(n)}catch(t){return console.warn("Failed to parse stored appearance preferences:",t),null}},em=(e,t)=>{const n=e??{};return t<2&&(n.projectSortOrder="manual"),t<3&&n.projectSortOrder==="recent"&&(n.projectSortOrder="manual"),t<4&&delete n.displayMode,n},xs=gt()(fr(e=>({projectDisplayMode:"all",singleProjectId:null,setProjectDisplayMode:t=>e({projectDisplayMode:t}),setSingleProjectId:t=>e({singleProjectId:t}),sessionGroupingMode:"by-worktree",setSessionGroupingMode:t=>e({sessionGroupingMode:t}),stickyZoneHeaders:!0,toggleStickyZoneHeaders:()=>e(t=>({stickyZoneHeaders:!t.stickyZoneHeaders})),showRecentSection:!0,showArchivedSessions:!1,projectSortOrder:"manual",setShowRecentSection:t=>e({showRecentSection:t}),setShowArchivedSessions:t=>e({showArchivedSessions:t}),toggleRecentSection:()=>e(t=>({showRecentSection:!t.showRecentSection})),toggleArchivedSessions:()=>e(t=>({showArchivedSessions:!t.showArchivedSessions})),setProjectSortOrder:t=>e({projectSortOrder:t})}),{name:"session-display-mode",version:5,migrate:em})),Bl="directoryTreeShowHidden",Cs="directory-show-hidden-change",Rs=()=>{if(typeof window>"u")return!0;try{const e=mr().getItem(Bl);return e===null?!0:e==="true"}catch{return!0}},tm=()=>{typeof window>"u"||window.dispatchEvent(new Event(Cs))},nm=()=>Rs(),rm=(e,t={})=>{if(!(typeof window>"u")){try{mr().setItem(Bl,e?"true":"false"),tm()}catch{}t.persist!==!1&&ft({directoryShowHidden:e})}},CT=()=>{const e=bc.c(2),[t,n]=no.useState(Rs);let r,o;return e[0]===Symbol.for("react.memo_cache_sentinel")?(r=()=>{if(typeof window>"u")return;const s=()=>{n(Rs())};return window.addEventListener("storage",s),window.addEventListener(Cs,s),()=>{window.removeEventListener("storage",s),window.removeEventListener(Cs,s)}},o=[],e[0]=r,e[1]=o):(r=e[0],o=e[1]),no.useEffect(r,o),t},Hl=[{name:"explore",icon:"compass-3",labelKey:"chat.draftPresets.explore.label",command:"/explore"},{name:"catch-up",icon:"history",labelKey:"chat.draftPresets.catchup.label",command:"/catch-up"},{name:"weigh",icon:"scales-3",labelKey:"chat.draftPresets.weigh.label",command:"/weigh"},{name:"plan-feature",icon:"survey",labelKey:"chat.draftPresets.plan.label",command:"/plan-feature"},{name:"craft-goal",icon:"target",labelKey:"chat.draftPresets.craftGoal.label",command:"/craft-goal"},{name:"schedule-task",icon:"calendar-schedule",labelKey:"chat.draftPresets.scheduleTask.label",command:"/schedule-task"},{name:"debug",icon:"bug",labelKey:"chat.draftPresets.debug.label",command:"/debug"},{name:"review",icon:"search-eye",labelKey:"chat.draftPresets.review.label",command:"/workspace-review"}],om=new Map(Hl.map(e=>[e.name,e])),RT=e=>om.get(e),DT=Hl.map(e=>({type:"command",name:e.name})),OT="terminal-box",MT="book-open",_T=e=>`${e.type}:${e.name}`,LT=(e,t)=>e.type===t.type&&e.name===t.name,FT=e=>{const t=e.replace(/^\//,"").replace(/[-_]+/g," ").replace(/\s+/g," ").trim();return t?t.charAt(0).toUpperCase()+t.slice(1):e},sm=e=>{if(!Array.isArray(e))return[];const t=[],n=new Set;for(const r of e){if(!r||typeof r!="object")continue;const o=r,s=o.type==="command"||o.type==="skill"?o.type:null,i=typeof o.name=="string"?o.name.trim():"";if(!s||!i)continue;const a=`${s}:${i}`;n.has(a)||(n.add(a),t.push({type:s,name:i}))}return t},zl="filesViewShowGitignored",Ds="files-view-show-gitignored-change",Os=()=>{if(typeof window>"u")return!1;try{return mr().getItem(zl)==="true"}catch{return!1}},im=()=>{typeof window>"u"||window.dispatchEvent(new Event(Ds))},am=()=>Os(),cm=(e,t={})=>{if(!(typeof window>"u")){try{mr().setItem(zl,e?"true":"false"),im()}catch{}t.persist!==!1&&ft({filesViewShowGitignored:e})}},UT=()=>{const e=bc.c(2),[t,n]=no.useState(Os);let r,o;return e[0]===Symbol.for("react.memo_cache_sentinel")?(r=()=>{if(typeof window>"u")return;const s=()=>{n(Os())};return window.addEventListener("storage",s),window.addEventListener(Ds,s),()=>{window.removeEventListener("storage",s),window.removeEventListener(Ds,s)}},o=[],e[0]=r,e[1]=o):(r=e[0],o=e[1]),no.useEffect(r,o),t},$l="session",Gl=40,lm=1,um=100,Wl=e=>e==="global"||e==="session",wi=e=>e!=null&&Number.isInteger(e)&&e>=lm&&e<=um,dm=["bash","zsh","sh","fish","pwsh","powershell","cmd","dash","ksh","nu"],bi=e=>e==="auto"||typeof e=="string"&&dm.includes(e),bn="openchamber-input-history.v1",fm=8,pm=50,hm=[40,25,10,5,1],is=Object.freeze([]);let lt=null,La=0;const Qn=(e=$l,t=Gl)=>({entryLimit:t,scope:e,globalBuckets:{},sessionBuckets:{}}),ql=()=>(La+=1,Date.now()*1e3+La),Kl=e=>JSON.stringify([e]),Ms=(e,t,n)=>JSON.stringify([e,t,n]),Si=()=>{try{return globalThis.window?.localStorage??null}catch{return null}},mm=()=>{const e=Si(),t=Ge?JSON.stringify(Xr(Ge.base)):lt;if(!e)return t;try{return e.getItem(bn)??(Ge?null:lt)}catch{return t}},Fa=Ve(m(),ue()),gm=v({key:m().min(1),source:Qt([U("file-url"),U("vscode-file")]),filename:m().min(1),mimeType:m().min(1),size:C().finite().nonnegative(),reference:m().min(1)}),ym=v({text:m(),attachmentKeys:N(m()),restorableAttachments:N(gm),submittedAt:C().finite().nonnegative()}),wm=v({touchedAt:C().finite().nonnegative(),entries:N(ue())}),bm=(e,t)=>{try{const n=JSON.parse(e),o=(t===1?ji([m().trim().min(1)]):ji([m().trim().min(1),m().trim().min(1),m().trim().min(1)])).safeParse(n);if(!o.success)return null;if(t===3){const s=Ye(o.data[1]);if(!s||s!==o.data[1])return null}return o.data}catch{return null}},Ua=(e,t)=>{const n=[];for(const[r,o]of Object.entries(e)){if(!bm(r,t))continue;const s=wm.safeParse(o);if(!s.success)continue;const i=s.data.entries.map(a=>ym.safeParse(a)).filter(a=>a.success).map(a=>a.data);n.push([r,{touchedAt:s.data.touchedAt,entries:i}])}return Object.fromEntries(n)},Sm=()=>{const e=mm();if(e===null)return Qn();try{const t=JSON.parse(e),n=v({version:U(1),entryLimit:C().int().optional(),scope:Qt([U("global"),U("session")]).optional(),global:Fa.default({}),session:Fa.default({})}).safeParse(t);return n.success?{entryLimit:wi(n.data.entryLimit)?n.data.entryLimit:Gl,scope:n.data.scope??$l,globalBuckets:Ua(n.data.global,1),sessionBuckets:Ua(n.data.session,3)}:Qn()}catch{const t=Si();if(t)try{t.removeItem(bn)}catch{}return lt=null,Qn()}};let Ge=null,Qr=Qn();const ja=(e,t,n)=>{const r={...e};for(const o of new Set([...Object.keys(t),...Object.keys(n)])){if(JSON.stringify(t[o])===JSON.stringify(n[o]))continue;const s=n[o];if(!s){delete r[o];continue}const i=new Set((t[o]?.entries??[]).map(u=>JSON.stringify(u))),a=new Set(s.entries.map(u=>JSON.stringify(u))),c=(e[o]?.entries??[]).filter(u=>{const d=JSON.stringify(u);return!i.has(d)||a.has(d)}),l=new Set(c.map(u=>JSON.stringify(u)));for(const u of s.entries){const d=JSON.stringify(u);!i.has(d)&&!l.has(d)&&c.push(u)}c.sort((u,d)=>u.submittedAt-d.submittedAt),r[o]={touchedAt:Math.max(s.touchedAt,e[o]?.touchedAt??0),entries:c}}return r},$n=()=>{const e=Sm();if(Qr=e,!Ge)return e;const{base:t,value:n}=Ge;return _s({entryLimit:n.entryLimit===t.entryLimit?e.entryLimit:n.entryLimit,scope:n.scope===t.scope?e.scope:n.scope,globalBuckets:ja(e.globalBuckets,t.globalBuckets,n.globalBuckets),sessionBuckets:ja(e.sessionBuckets,t.sessionBuckets,n.sessionBuckets)})},Vl=(e,t)=>e.slice(Math.max(0,e.length-t)),Na=(e,t,n)=>{const r=Object.entries(e).map(([o,s])=>[o,{touchedAt:s.touchedAt,entries:Vl(s.entries,n)}]).sort((o,s)=>s[1].touchedAt-o[1].touchedAt).slice(0,t);return Object.fromEntries(r)},_s=(e,t=e.entryLimit)=>({entryLimit:e.entryLimit,scope:e.scope,globalBuckets:Na(e.globalBuckets,fm,t),sessionBuckets:Na(e.sessionBuckets,pm,t)}),Xr=e=>({version:1,entryLimit:e.entryLimit,scope:e.scope,global:e.globalBuckets,session:e.sessionBuckets}),Ba=e=>e instanceof DOMException?e.name==="QuotaExceededError":e instanceof Error&&/quota/i.test(e.message),Gn=e=>{const t=_s(e),n=JSON.stringify(Xr(t));Ge={base:Qr,value:t};const r=Si();if(!r)return lt=n,t;try{return r.setItem(bn,n),Ge=null,lt=n,t}catch(i){if(!(i instanceof Error)||!Ba(i))return lt=n,t}try{r.removeItem(bn)}catch{}for(const i of hm){const a=_s(t,i),c=JSON.stringify(Xr(a));try{return r.setItem(bn,c),Ge=null,lt=c,a}catch(l){if(!(l instanceof Error)||!Ba(l))return Ge={base:Qr,value:a},lt=c,a}}const o=Qn(t.scope,t.entryLimit),s=JSON.stringify(Xr(o));try{r.setItem(bn,s),Ge=null}catch{Ge={base:Qr,value:o}}return lt=s,o},Tm=(e,t,n)=>{const r=e.trim(),o=Ye(t),s=n.trim();return!r||!o||!s?null:{runtimeKey:r,directory:o,sessionId:s}},Jl=e=>e.source==="vscode"&&e.vscodeSource==="file"?Ye(e.vscodePath??null):e.dataUrl.trim()||null,vm=e=>!(!e||e.startsWith("data:")||(e.startsWith("http://")||e.startsWith("https://"))&&e.includes("?")),Ls=e=>{const t=Jl(e),n=t===null?"none":t.startsWith("data:")?"data":t.slice(0,512);return[e.source,e.filename,e.mimeType,String(e.size),n].join("|")},km=e=>{const t=Jl(e);return!t||!vm(t)?null:e.source==="vscode"&&e.vscodeSource==="file"?{key:Ls(e),source:"vscode-file",filename:e.filename,mimeType:e.mimeType,size:e.size,reference:t}:{key:Ls(e),source:"file-url",filename:e.filename,mimeType:e.mimeType,size:e.size,reference:t}},Em=(e,t)=>({text:e,attachmentKeys:t.map(Ls),restorableAttachments:t.map(km).filter(n=>n!==null)}),Pm=(e,t)=>e.length===t.length&&e.every((n,r)=>{const o=t[r];return o!==void 0&&n.key===o.key&&n.source===o.source&&n.filename===o.filename&&n.mimeType===o.mimeType&&n.size===o.size&&n.reference===o.reference}),Am=(e,t)=>e!==void 0&&e.text===t.text&&e.attachmentKeys.length===t.attachmentKeys.length&&e.attachmentKeys.every((n,r)=>n===t.attachmentKeys[r])&&Pm(e.restorableAttachments,t.restorableAttachments),Ha=(e,t,n,r)=>{const o=e?[...e.entries]:[];for(const s of t){const i=o.at(-1);Am(i,s)||o.push({text:s.text,attachmentKeys:[...s.attachmentKeys],restorableAttachments:s.restorableAttachments.map(a=>({...a})),submittedAt:ql()})}return{touchedAt:n,entries:Vl(o,r)}},Im=Gn($n()),Wn=gt(e=>({...Im,applyEntryLimit:t=>{wi(t)&&e(n=>{const r=$n();if(r.entryLimit===t)return{...n,...r};const o=Gn({entryLimit:t,scope:r.scope,globalBuckets:r.globalBuckets,sessionBuckets:r.sessionBuckets});return{...n,...o}})},applyScope:t=>{Wl(t)&&e(n=>{const r=$n();if(r.scope===t)return{...n,...r};const o=Gn({entryLimit:r.entryLimit,scope:t,globalBuckets:r.globalBuckets,sessionBuckets:r.sessionBuckets});return{...n,...o}})},appendSubmissions:(t,n)=>{n.length!==0&&e(r=>{const o=$n(),s=ql(),i=Kl(t.runtimeKey),a=Ms(t.runtimeKey,t.directory,t.sessionId),c=Gn({entryLimit:o.entryLimit,scope:o.scope,globalBuckets:{...o.globalBuckets,[i]:Ha(o.globalBuckets[i],n,s,o.entryLimit)},sessionBuckets:{...o.sessionBuckets,[a]:Ha(o.sessionBuckets[a],n,s,o.entryLimit)}});return{...r,...c}})},clearSession:t=>{e(n=>{const r=$n(),o=Ms(t.runtimeKey,t.directory,t.sessionId);if(!(o in r.sessionBuckets))return{...n,...r};const s={...r.sessionBuckets};delete s[o];const i=Gn({entryLimit:r.entryLimit,scope:r.scope,globalBuckets:r.globalBuckets,sessionBuckets:s});return{...n,...i}})}})),jT=(e,t)=>t?e.scope==="session"?e.sessionBuckets[Ms(t.runtimeKey,t.directory,t.sessionId)]?.entries??is:e.globalBuckets[Kl(t.runtimeKey)]?.entries??is:is,xm=/\n*<terminal_context>\n([\s\S]*?)\n<\/terminal_context>\s*$/,Cm=e=>{const t=e.terminalId.trim(),n=e.terminalLabel.trim(),r=e.text.replace(/\r\n?/g,`
|
|
3
|
-
`).replace(/^\n+|\n+$/g,"");if(!t||!n||!r)return null;const o=Math.max(1,Math.floor(e.startLine));return{terminalId:t,terminalLabel:n,startLine:o,endLine:Math.max(o,Math.floor(e.endLine)),text:r}},Rm=(e,t)=>{const n=t.map(Cm).filter(s=>s!==null);if(n.length===0)return e;const o=["<terminal_context>",...n.flatMap((s,i)=>[`- ${s.terminalLabel} lines ${s.startLine}-${s.endLine}:`,...s.text.split(`
|
|
4
|
-
`).map((a,c)=>` ${s.startLine+c} | ${a}`),...i===n.length-1?[]:[""]]),"</terminal_context>"].join(`
|
|
5
|
-
`);return e.trim()?`${e.trim()}
|
|
6
|
-
|
|
7
|
-
${o}`:o},NT=e=>{const t=xm.exec(e);if(!t)return{visibleText:e,contexts:[]};const n=[];let r=null;for(const o of(t[1]??"").split(`
|
|
8
|
-
`)){const s=/^- (.+) lines (\d+)-(\d+):$/.exec(o);if(s){r&&n.push(r),r={terminalLabel:s[1],startLine:Number(s[2]),endLine:Number(s[3]),text:""};continue}const i=/^\s{2}\d+ \| ?(.*)$/.exec(o);r&&i&&(r.text+=`${r.text?`
|
|
9
|
-
`:""}${i[1]}`)}return r&&n.push(r),{visibleText:e.slice(0,t.index).trimEnd(),contexts:n}},Ti="openchamberContext",vi="opencodeComment";function Dm(e){switch(e.kind){case"code-comment":{const t=`lines ${e.startLine}-${e.endLine}`,n=e.source==="diff"&&e.side?` (${e.side})`:"";return`Comment on \`${e.fileLabel}\` ${t}${n}:
|
|
10
|
-
\`\`\`${e.language}
|
|
11
|
-
${e.code}
|
|
12
|
-
\`\`\`
|
|
13
|
-
|
|
14
|
-
${e.text}`}case"terminal":return Rm("",[{terminalId:e.terminalId,terminalLabel:e.terminalLabel,startLine:e.startLine,endLine:e.endLine,text:e.output}]);case"browser-annotation":return e.text?`${e.prompt}
|
|
15
|
-
|
|
16
|
-
${e.text}`:e.prompt;case"pr-comment":return`Attached GitHub PR comment (${e.label}):
|
|
17
|
-
|
|
18
|
-
${e.body}${e.text?`
|
|
19
|
-
|
|
20
|
-
${e.text}`:""}`;case"file-quote":{const t=e.startLine!=null&&e.endLine!=null?` lines ${e.startLine}-${e.endLine}`:"",n=e.quote.split(`
|
|
21
|
-
`).map(r=>`> ${r}`).join(`
|
|
22
|
-
`);return`Comment on this fragment of \`${e.fileLabel}\`${t}:
|
|
23
|
-
${n}${e.text?`
|
|
24
|
-
|
|
25
|
-
${e.text}`:""}`}case"chat-quote":return`Comment on this fragment of an earlier message in this conversation:
|
|
26
|
-
${e.quote.split(`
|
|
27
|
-
`).map(n=>`> ${n}`).join(`
|
|
28
|
-
`)}${e.text?`
|
|
29
|
-
|
|
30
|
-
${e.text}`:""}`;case"pr-check":return`Attached failed GitHub PR check (${e.label}):
|
|
31
|
-
\`\`\`
|
|
32
|
-
${e.output}
|
|
33
|
-
\`\`\`${e.text?`
|
|
34
|
-
|
|
35
|
-
${e.text}`:""}`;case"github-issue":case"github-pr":case"linear-issue":case"guest-issue":case"guest-pr":return""}}function BT(e,t){const n=t??Dm(e),r={[Ti]:e};return e.kind==="code-comment"&&(r[vi]={path:e.fileLabel,selection:{startLine:e.startLine,endLine:e.endLine,startChar:0,endChar:0},comment:e.text,preview:e.code,origin:e.source==="diff"?"review":"file"}),{text:n,synthetic:!0,metadata:r}}function HT(e){switch(e.source){case"terminal":return{kind:"terminal",terminalId:e.terminalId??"",terminalLabel:e.fileLabel,startLine:e.startLine,endLine:e.endLine,output:e.code};case"preview-annotation":return{kind:"browser-annotation",pageUrl:e.fileLabel,prompt:e.code,text:e.text};case"pr-comment":return{kind:"pr-comment",label:e.fileLabel,body:e.code,text:e.text};case"pr-check":return{kind:"pr-check",label:e.fileLabel,output:e.code,text:e.text};case"file-quote":{const t={kind:"file-quote",fileLabel:e.fileLabel,quote:e.code,text:e.text};return e.startLine>0&&e.endLine>0&&(t.startLine=e.startLine,t.endLine=e.endLine),t}case"chat-quote":{const t={kind:"chat-quote",quote:e.code,text:e.text};return e.fileLabel&&(t.messageId=e.fileLabel),t}case"diff":case"file":case"plan":{const t={kind:"code-comment",source:e.source,fileLabel:e.fileLabel,startLine:e.startLine,endLine:e.endLine,language:e.language,code:e.code,text:e.text};return e.source==="diff"&&e.side&&(t.side=e.side),t}}}const Yl=dr("kind",[v({kind:U("code-comment"),source:Te(["diff","file","plan"]),fileLabel:m(),startLine:C(),endLine:C(),side:Te(["original","modified"]).optional(),language:m(),code:m(),text:m()}),v({kind:U("terminal"),terminalId:m(),terminalLabel:m(),startLine:C(),endLine:C(),output:m()}),v({kind:U("browser-annotation"),pageUrl:m(),prompt:m(),text:m()}),v({kind:U("pr-comment"),label:m(),body:m(),text:m()}),v({kind:U("pr-check"),label:m(),output:m(),text:m()}),v({kind:U("file-quote"),fileLabel:m(),startLine:C().optional(),endLine:C().optional(),quote:m(),text:m()}),v({kind:U("chat-quote"),messageId:m().optional(),quote:m(),text:m()}),v({kind:U("github-issue"),number:C().int().positive(),title:m(),url:m()}),v({kind:U("github-pr"),number:C().int().positive(),title:m(),url:m()}),v({kind:U("linear-issue"),identifier:m().min(1),title:m(),url:m()}),v({kind:U("guest-issue"),providerId:m().min(1),id:m().min(1),title:m(),url:m(),data:Ni().optional()}),v({kind:U("guest-pr"),providerId:m().min(1),id:m().min(1),title:m(),url:m(),data:Ni().optional()})]),Ql=v({path:m(),selection:v({startLine:C().finite(),endLine:C().finite(),startChar:C().finite().optional(),endChar:C().finite().optional()}).optional(),comment:m(),preview:m().optional(),origin:Te(["file","review"]).optional()}),Om=v({[Ti]:Yl,[vi]:Ql.optional()});function Mm(e){if(e.type!=="text")return null;const t=Yl.safeParse(e.metadata?.[Ti]);if(t.success)return t.data;const n=Ql.safeParse(e.metadata?.[vi]);if(n.success){const r=n.data;return r.selection?{kind:"code-comment",source:r.origin==="review"?"diff":"file",fileLabel:r.path,startLine:r.selection.startLine,endLine:r.selection.endLine,language:"",code:r.preview??"",text:r.comment}:{kind:"file-quote",fileLabel:r.path,quote:r.preview??"",text:r.comment}}return null}function zT(e){return e.some(t=>Mm(t)!==null)}function $T(e){switch(e.kind){case"code-comment":{const t={source:e.source,fileLabel:e.fileLabel,startLine:e.startLine,endLine:e.endLine,code:e.code,language:e.language,text:e.text};return e.side&&(t.side=e.side),t}case"terminal":return{source:"terminal",fileLabel:e.terminalLabel,startLine:e.startLine,endLine:e.endLine,code:e.output,language:"",text:"",terminalId:e.terminalId};case"browser-annotation":return{source:"preview-annotation",fileLabel:e.pageUrl,startLine:0,endLine:0,code:e.prompt,language:"",text:e.text};case"pr-comment":return{source:"pr-comment",fileLabel:e.label,startLine:0,endLine:0,code:e.body,language:"",text:e.text};case"pr-check":return{source:"pr-check",fileLabel:e.label,startLine:0,endLine:0,code:e.output,language:"",text:e.text};case"file-quote":return{source:"file-quote",fileLabel:e.fileLabel,startLine:e.startLine??0,endLine:e.endLine??0,code:e.quote,language:"",text:e.text};case"chat-quote":return{source:"chat-quote",fileLabel:e.messageId??"",startLine:0,endLine:0,code:e.quote,language:"",text:e.text};case"github-issue":case"github-pr":case"linear-issue":case"guest-issue":case"guest-pr":return null}}function _m(e){switch(e.kind){case"code-comment":return e.text.trim()||e.code.trim()||e.fileLabel;case"chat-quote":case"file-quote":return e.text.trim()||e.quote;case"browser-annotation":return e.text.trim()||e.prompt.trim()||e.pageUrl;case"pr-comment":return e.text.trim()||e.body.trim()||e.label;case"pr-check":return e.text.trim()||e.label.trim()||e.output;case"terminal":return e.output.trim()||e.terminalLabel;case"github-issue":case"github-pr":case"linear-issue":case"guest-issue":case"guest-pr":return e.title.trim()||e.url}}function Lm(e){let t=e.content.trim()||e.contextPreview?.trim()||"";if(!t){for(const r of e.context??[])if(r.kind!=="instruction"&&(t=(r.kind==="context"?_m(r.metadata.openchamberContext):r.text).trim(),t))break}t||=e.attachments?.[0]?.filename??"";const n=t.split(`
|
|
36
|
-
`,1)[0];return n.slice(0,100)+(t.length>n.length||n.length>100?"...":"")}const Xl="queue",Fm=e=>e==="steer"||e==="queue",Um=(e,t)=>e==="immediate"?"steer":Fm(e)?e:t===!1?"steer":t===!0?"queue":Xl,Et=()=>!Me(),za=50,Fs=(e,t,n=G())=>{const r=Ye(t);return!n||!r||!e?null:{runtimeKey:n,directory:r,sessionId:e}},Le=e=>`${e.runtimeKey}
|
|
37
|
-
${e.directory}
|
|
38
|
-
${e.sessionId}`,Kt=e=>{const[t,n,...r]=e.split(`
|
|
39
|
-
`);return Fs(r.join(`
|
|
40
|
-
`),n,t)},jm=v({providerID:m().min(1),modelID:m().min(1),agent:m().optional(),variant:m().optional()}),Nm=v({id:m(),filename:m(),mimeType:m(),size:C(),source:Te(["local","server","vscode"]),serverPath:m().optional(),dataUrl:m().optional()}),Bm=dr("kind",[v({kind:U("context"),text:m(),metadata:Om,instructions:m().optional()}),v({kind:U("instruction"),text:m()}),v({kind:U("synthetic"),text:m()})]),ki=v({id:m().min(1),createdAt:C(),content:m(),text:m(),agentMention:m().optional(),attachments:N(Nm),context:N(Bm).optional(),contextPreview:m().optional(),sendConfig:jm}),Ei=v({sessionId:m().min(1),directory:m(),items:N(ki),sendingId:m().nullable()}),$a=v({revision:C(),sessions:N(Ei)}),Xn=v({revision:C(),session:Ei}),Hm=Xn.extend({item:ki}),zm=Xn.extend({items:N(ki)}),$m=e=>{const t=e.indexOf(",");if(!e.startsWith("data:")||t===-1)return null;const n=e.slice(5,t),r=e.slice(t+1);try{if(n.endsWith(";base64")){const i=atob(r),a=new ArrayBuffer(i.length),c=new Uint8Array(a);for(let l=0;l<i.length;l+=1)c[l]=i.charCodeAt(l);return a}const o=new TextEncoder().encode(decodeURIComponent(r)),s=new ArrayBuffer(o.byteLength);return new Uint8Array(s).set(o),s}catch{return null}},Gm=e=>{const t=e.dataUrl??"",n=t?$m(t):null,r={id:e.id,file:new File(n?[n]:[],e.filename,{type:e.mimeType}),dataUrl:t,mimeType:e.mimeType,filename:e.filename,size:e.size,source:e.source};return e.serverPath&&(r.serverPath=e.serverPath),r},jr=e=>{const t={id:e.id,content:e.content,text:e.text,createdAt:e.createdAt,sendConfig:{...e.sendConfig}};return e.agentMention&&(t.agentMention=e.agentMention),e.attachments.length>0&&(t.attachments=e.attachments.map(Gm)),e.context&&(t.context=e.context),e.contextPreview&&(t.contextPreview=e.contextPreview),t},Wm=e=>{const t={id:e.id,filename:e.filename,mimeType:e.mimeType,size:e.size,source:e.source,dataUrl:e.dataUrl};return e.serverPath&&(t.serverPath=e.serverPath),t},Ga=(e,t)=>{const n={content:e.content,text:e.text??e.content,attachments:(e.attachments??[]).filter(o=>!!o.dataUrl).map(Wm),context:e.context??[],sendConfig:t};e.agentMention&&(n.agentMention=e.agentMention);const r=Lm({content:"",context:e.context});return r&&(n.contextPreview=r),n},Ht=async(e,t,n)=>{const r=await y(t,n);if(!r.ok){const s=new Error(`Message queue request failed (${r.status})`);throw s.status=r.status,s}const o=e.safeParse(await r.json());if(!o.success)throw new Error("Invalid message queue response");return o.data},Tt=(e,t)=>t===void 0?{method:e}:{method:e,headers:{"Content-Type":"application/json"},body:JSON.stringify(t)},vt=e=>`/api/message-queue/sessions/${encodeURIComponent(e)}`,as=new Set,Wa=new Map,tt=new Map,Nr=new Map;let cs=0;const qa=e=>Object.fromEntries(Object.entries(e).map(([t,n])=>[t,n.map(r=>({...r,text:r.text??r.content}))])),qm=(e,t)=>{const n=e??{},r=t<2?n.queuedMessages??{}:{};return{queuedMessages:t<2?{}:qa(n.queuedMessages??{}),quarantinedLegacyMessages:qa({...n.quarantinedLegacyMessages??{},...r}),followUpBehavior:Um(n.followUpBehavior,n.queueModeEnabled??null)}},nt=(e,t)=>{const{[t]:n,...r}=e;return r},Br=(e,t,n)=>{const r=(e.queuedMessages[t]??[]).filter(o=>o.id!==n);return r.length===0?{queuedMessages:nt(e.queuedMessages,t)}:{queuedMessages:{...e.queuedMessages,[t]:r}}},Km=(e,t,n,r)=>{let o=e.queuedMessages,s=e.sendingIds;for(const i of new Set([...Object.keys(o),...Object.keys(s)])){const a=Kt(i);a?.runtimeKey!==t||a.sessionId!==n||(tt.get(i)??-1)>r||(tt.set(i,r),o=nt(o,i),s=nt(s,i))}return{queuedMessages:o,sendingIds:s}},Us=gt()(xn(fr((e,t)=>{let n=null,r=!1;const o=(a,c,l)=>{if(l!==G()||(Nr.get(l)??-1)>c)return;const u=Fs(a.sessionId,a.directory,l);if(!u){if(a.items.length>0)return;e(f=>Km(f,l,a.sessionId,c));return}const d=Le(u);(tt.get(d)??-1)>c||(tt.set(d,c),e(f=>{const p=a.items.map(jr),g=p.length>0?{...f.queuedMessages,[d]:p}:nt(f.queuedMessages,d),b=a.sendingId?{...f.sendingIds,[d]:[a.sendingId]}:nt(f.sendingIds,d);return{queuedMessages:g,sendingIds:b}}))},s=async a=>{try{const c=await Ht($a,"/api/message-queue"),l=c.sessions.find(u=>u.sessionId===a.sessionId)??{sessionId:a.sessionId,directory:a.directory,items:[],sendingId:null};o(l,c.revision,a.runtimeKey)}catch{}},i=async(a,c,l)=>{try{const u=await Ht(Xn,c,l);o(u.session,u.revision,a.runtimeKey)}catch(u){console.warn("[queue] server update failed:",u),await s(a)}};return{queuedMessages:{},quarantinedLegacyMessages:{},followUpBehavior:Xl,sendingIds:{},addToQueue:async(a,c)=>{const l=Le(a),u=`queued-${Date.now()}-${Math.random().toString(36).substring(2,9)}`,d={id:u,content:c.content,text:c.text??c.content,createdAt:Date.now(),sendConfig:c.sendConfig};if(c.agentMention&&(d.agentMention=c.agentMention),c.attachments&&c.attachments.length>0&&(d.attachments=c.attachments),c.context&&c.context.length>0&&(d.context=c.context),e(g=>{const b=g.queuedMessages[l]??[],w={...g.queuedMessages,[l]:[...b,d].slice(-20)},E=Object.keys(w);if(E.length>za){E.sort((k,F)=>(w[k]?.[0]?.createdAt??0)-(w[F]?.[0]?.createdAt??0));for(const k of E.slice(0,E.length-za))delete w[k]}return{queuedMessages:w}}),!Et())return;if(!c.sendConfig)throw e(g=>Br(g,l,u)),new Error("A queued message needs a provider and model to be delivered later.");const f=Tm(a.runtimeKey,a.directory,a.sessionId),p=Em(c.content,c.attachments??[]);try{const g=await Ht(Xn,`${vt(a.sessionId)}/items`,Tt("POST",{directory:a.directory,item:Ga(c,c.sendConfig)}));e(b=>Br(b,l,u)),o(g.session,g.revision,a.runtimeKey),f&&Wn.getState().appendSubmissions(f,[p])}catch(g){throw e(b=>Br(b,l,u)),g}},removeFromQueue:(a,c)=>{const l=Le(a);e(u=>Br(u,l,c)),Et()&&i(a,`${vt(a.sessionId)}/items/${encodeURIComponent(c)}`,Tt("DELETE"))},reorderQueue:(a,c,l)=>{if(c===l)return;const u=Le(a),d=t().queuedMessages[u];if(!d)return;const f=d.findIndex(w=>w.id===c),p=d.findIndex(w=>w.id===l);if(f===-1||p===-1)return;const g=d.slice(),[b]=g.splice(f,1);if(g.splice(p,0,b),e(w=>({queuedMessages:{...w.queuedMessages,[u]:g}})),Et()){const w=g.map(E=>E.id);i(a,`${vt(a.sessionId)}/order`,Tt("PUT",{itemIds:w}))}},popToInput:async(a,c)=>{const[l]=await t().takeForSend(a,c);return l??null},takeForSend:async(a,c)=>{const l=Le(a);if(Et())try{if(c){const b=await Ht(Hm,`${vt(a.sessionId)}/items/${encodeURIComponent(c)}/take`,Tt("POST"));return o(b.session,b.revision,a.runtimeKey),[jr(b.item)]}const g=await Ht(zm,`${vt(a.sessionId)}/take`,Tt("POST"));return o(g.session,g.revision,a.runtimeKey),g.items.map(jr)}catch(g){throw await s(a),g}const u=t(),d=u.sendingIds[l]??[],f=(u.queuedMessages[l]??[]).filter(g=>(c?g.id===c:!0)&&!d.includes(g.id));if(f.length===0)return[];const p=new Set(f.map(g=>g.id));return e(g=>{const b=(g.queuedMessages[l]??[]).filter(w=>!p.has(w.id));return b.length===0?{queuedMessages:nt(g.queuedMessages,l)}:{queuedMessages:{...g.queuedMessages,[l]:b}}}),f},clearQueue:a=>{const c=Le(a);e(l=>{const u=l.sendingIds[c]??[],d=(l.queuedMessages[c]??[]).filter(f=>u.includes(f.id));return d.length>0?{queuedMessages:{...l.queuedMessages,[c]:d}}:{queuedMessages:nt(l.queuedMessages,c)}}),Et()&&i(a,vt(a.sessionId),Tt("DELETE"))},forgetQueue:a=>{const c=Le(a);tt.delete(c),e(l=>({queuedMessages:nt(l.queuedMessages,c),sendingIds:nt(l.sendingIds,c)}))},clearAllQueues:()=>{e({queuedMessages:{},sendingIds:{}})},markSending:(a,c)=>{const l=Le(a);e(u=>{const d=u.sendingIds[l]??[];return d.includes(c)?u:{sendingIds:{...u.sendingIds,[l]:[...d,c]}}})},clearSending:(a,c)=>{const l=Le(a);e(u=>{const d=u.sendingIds[l];if(!d||!d.includes(c))return u;const f=d.filter(p=>p!==c);return f.length===0?{sendingIds:nt(u.sendingIds,l)}:{sendingIds:{...u.sendingIds,[l]:f}}})},getSendableQueue:a=>{const c=Le(a),l=t(),u=l.queuedMessages[c]??[],d=l.sendingIds[c];return!d||d.length===0?u:u.filter(f=>!d.includes(f.id))},setFollowUpBehavior:a=>{e({followUpBehavior:a}),ft({followUpBehavior:a})},getQueueForTarget:a=>t().queuedMessages[Le(a)]??[],hydrate:()=>{if(!Et())return Promise.resolve();const a=G();if(n?.runtimeKey===a)return n.promise;const c=++cs,l=()=>c===cs&&a===G(),u=(async()=>{let p=Wa.get(a);for(p||(p={items:Object.entries(t().queuedMessages).flatMap(([b,w])=>{const E=Kt(b);return!E||E.runtimeKey!==a?[]:w.map(k=>({target:E,message:k}))}),pending:null},Wa.set(a,p));p.pending||p.items.length>0;){if(!l())return;if(p.pending){await p.pending;continue}const g=p.items.shift();if(!g?.message.sendConfig)continue;const{target:b,message:w}=g,E=Ht(Xn,`${vt(b.sessionId)}/items`,Tt("POST",{directory:b.directory,item:Ga(w,g.message.sendConfig)})).then(()=>{}).catch(F=>{console.warn("[queue] failed to migrate a locally queued message to the server:",F)});p.pending=E;const k=p;E.then(()=>{k.pending===E&&(k.pending=null)}),await E}if(l())do{r=!1;let g;try{g=await Ht($a,"/api/message-queue",{signal:AbortSignal.timeout(15e3)})}catch(b){if(!l())return;if(r)continue;throw b}if(!l())return;as.add(a),!((Nr.get(a)??-1)>g.revision)&&(Nr.set(a,g.revision),e(b=>{const w=O=>(tt.get(O)??-1)>g.revision,E=O=>Kt(O)?.runtimeKey!==a||w(O),k={},F={};for(const[O,K]of Object.entries(b.queuedMessages))E(O)&&(k[O]=K);for(const[O,K]of Object.entries(b.sendingIds))E(O)&&(F[O]=K);for(const O of g.sessions){const K=Fs(O.sessionId,O.directory,a);if(!K)continue;const R=Le(K);w(R)||(tt.set(R,g.revision),O.items.length>0&&(k[R]=O.items.map(jr)),O.sendingId&&(F[R]=[O.sendingId]))}return{queuedMessages:k,sendingIds:F}}))}while(r&&l())})(),d={runtimeKey:a,promise:u};n=d;const f=()=>{n===d&&(n=null)};return u.then(f,f),u},resync:()=>(n?.runtimeKey===G()&&(r=!0),t().hydrate()),applyServerSession:o,setServerHold:async(a,c)=>{if(!Et())return;const l=await y(`${vt(a)}/hold`,Tt("PUT",{held:c}));if(!l.ok)throw new Error(`Message queue hold request failed (${l.status})`)},resetForRuntimeSwitch:a=>{if(cs+=1,n=null,r=!1,a){Nr.delete(a);for(const c of tt.keys())Kt(c)?.runtimeKey===a&&tt.delete(c)}!a||!as.has(a)||e(c=>{const l={},u={};for(const[d,f]of Object.entries(c.queuedMessages))Kt(d)?.runtimeKey===a?tt.delete(d):l[d]=f;for(const[d,f]of Object.entries(c.sendingIds))Kt(d)?.runtimeKey!==a&&(u[d]=f);return{queuedMessages:l,sendingIds:u}})}}},{name:"message-queue-store",version:3,storage:pi(),partialize:e=>({queuedMessages:Object.fromEntries(Object.entries(e.queuedMessages).filter(([t])=>{const n=Kt(t)?.runtimeKey;return!n||!as.has(n)})),quarantinedLegacyMessages:e.quarantinedLegacyMessages,followUpBehavior:e.followUpBehavior}),migrate:qm}),{name:"message-queue-store"})),Vm=v({type:U("openchamber:message-queue.updated"),properties:v({revision:C(),session:Ei})}),GT=(e,t)=>{if(!Et())return;const n=Vm.safeParse(e);if(!n.success)return;const{session:r,revision:o}=n.data.properties;Us.getState().applyServerSession(r,o,t)},Jm=e=>{const t=e.replace(/\\/g,"/").replace(/\/+$/g,"").trim();if(!t)return"";const n=new TextEncoder().encode(t);let r="";for(const s of n)r+=String.fromCharCode(s);return`path_${typeof btoa=="function"?btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,""):t.replace(/[^A-Za-z0-9._-]+/g,"_")}`},_=e=>t=>{const n=e.safeParse(t);return n.success?n.data:void 0},Rn=C().refine(Number.isFinite),_e=m().transform(e=>e.trim()),le=_e.pipe(m().min(1)),Mt=Ve(m(),ue()),P=_(Fe()),Be=_(m().min(1)),mn=_(_e),dn=_(le),Ka=e=>_(m().max(e)),Bn=e=>_(_e.transform(t=>t.slice(0,e))),Z=e=>_(_e.pipe(Te(e))),zt=_(Rn),Ym=(e,t)=>_(Rn.transform(n=>Math.max(e,Math.min(t,Math.round(n))))),ls=e=>_(Rn.transform(t=>Math.max(e,Math.round(t)))),Qm=_(Rn.positive().transform(Math.floor)),Xm=_(Qt([tr(),Rn])),Zm=_(Qt([tr(),_e.transform(e=>e.length>0?e:null)])),eg=_(Qt([tr(),_e])),Pi=N(ue()).transform(e=>e.filter(t=>m().min(1).safeParse(t).success)),Hr=_(Pi.transform(e=>Array.from(new Set(e.map(String))))),us=_(Pi.transform(e=>e.map(String))),tg=Mt.transform(e=>{const t={};for(const[n,r]of Object.entries(e)){const o=N(ue()).safeParse(r);o.success&&(t[n]=o.data.filter(s=>m().safeParse(s).success).map(String))}return t}),ds=_(tg.pipe(Ve(m(),N(m())).refine(e=>Object.keys(e).length>0))),ng=v({providerID:le,modelID:le}),fs=e=>_(N(ue()).transform(t=>{const n=[],r=new Set;for(const o of t){const s=ng.safeParse(o);if(!s.success)continue;const i=`${s.data.providerID}/${s.data.modelID}`;if(!r.has(i)&&(r.add(i),n.push(s.data),n.length>=e))break}return n})),rg=_(Mt.transform(e=>{const t={};for(const[n,r]of Object.entries(e)){if(!n)continue;const o=Pi.safeParse(r);if(!o.success)continue;const s=Array.from(new Set(o.data.map(String)));s.length>0&&(t[n]=s.slice(0,5))}return t}).refine(e=>Object.keys(e).length>0)),og=_(Mt.transform(e=>{const t={};for(const[n,r]of Object.entries(e)){const o=n.trim(),s=le.safeParse(r);!o||!s.success||(t[o]=s.data)}return t})),zr={completion:{title:"Task Complete",message:"Your task has finished."},error:{title:"Error Occurred",message:"An error occurred while processing your task."},question:{title:"Input Needed",message:"Please provide input to continue."},subtask:{title:"Subtask Complete",message:"A subtask has finished."}},sg=v({title:m().catch(""),message:m().catch("")}),ig=_(Mt.transform(e=>{const t=i=>{const a=sg.safeParse(e[i]);return a.success?a.data:void 0},n=t("completion"),r=t("error"),o=t("question"),s=t("subtask");if(!(!n&&!r&&!o&&!s))return{completion:n??zr.completion,error:r??zr.error,question:o??zr.question,subtask:s??zr.subtask}}).pipe(wc(e=>e!==void 0))),Va=Mt.transform(e=>Object.fromEntries(Object.entries(e).flatMap(([t,n])=>{const r=m().safeParse(n);return r.success?[[t,r.data]]:[]}))),ag=v({id:ue().transform(e=>String(e??"")),label:ue().transform(e=>String(e??"")),models:N(ue()).transform(e=>e.filter(t=>m().safeParse(t).success).map(String)).catch([]),order:C().catch(0)}),cg=_(Mt.transform(e=>{const t={};for(const[n,r]of Object.entries(e)){const o=Mt.safeParse(r);if(!o.success)continue;const s={},i=N(ue()).safeParse(o.data.customGroups);i.success&&(s.customGroups=i.data.flatMap(l=>{const u=ag.safeParse(l);return u.success?[u.data]:[]}));const a=Va.safeParse(o.data.modelAssignments);a.success&&(s.modelAssignments=a.data);const c=Va.safeParse(o.data.renamedGroups);c.success&&(s.renamedGroups=c.data),Object.keys(s).length>0&&(t[n]=s)}return t}).refine(e=>Object.keys(e).length>0)),lg=v({id:le,name:le,hostname:le.transform(e=>e.toLowerCase())}),ug=_(N(ue()).transform(e=>{const t=[],n=new Set,r=new Set;for(const o of e){const s=lg.safeParse(o);s.success&&(n.has(s.data.id)||r.has(s.data.hostname)||(n.add(s.data.id),r.add(s.data.hostname),t.push(s.data)))}return t})),dg=_(Mt.transform(e=>{const t={};for(const[n,r]of Object.entries(e)){const o=n.trim(),s=le.safeParse(r);!o||!s.success||(t[o]=s.data)}return t}).refine(e=>Object.keys(e).length>0)),fg=v({id:le,label:le,source:le,subpath:_e.optional().catch(void 0),gitIdentityId:_e.optional().catch(void 0)}),pg=_(N(ue()).transform(e=>{const t=[],n=new Set;for(const r of e){const o=fg.safeParse(r);if(!o.success||n.has(o.data.id))continue;n.add(o.data.id);const s={id:o.data.id,label:o.data.label,source:o.data.source};o.data.subpath&&(s.subpath=o.data.subpath),o.data.gitIdentityId&&(s.gitIdentityId=o.data.gitIdentityId),t.push(s)}return t})),hg=/^#(?:[\da-fA-F]{3}|[\da-fA-F]{6})$/,ps=Rn.nonnegative(),mg=v({path:le,label:le.optional().catch(void 0),icon:le.optional().catch(void 0),iconImage:Qt([tr(),v({mime:le,updatedAt:ps.transform(Math.round).pipe(C().positive()),source:Te(["custom","auto"])})]).optional().catch(void 0),color:le.optional().catch(void 0),iconBackground:Qt([tr(),_e.pipe(m().regex(hg)).transform(e=>e.toLowerCase())]).optional().catch(void 0),addedAt:ps.optional().catch(void 0),lastOpenedAt:ps.optional().catch(void 0),sidebarCollapsed:Fe().optional().catch(void 0),defaultModel:le.optional().catch(void 0),defaultAgent:le.optional().catch(void 0),defaultVariant:le.optional().catch(void 0)}),gg=_(N(ue()).transform(e=>{const t=[],n=new Set,r=new Set;for(const o of e){const s=mg.safeParse(o);if(!s.success)continue;const i=Ye(s.data.path);if(!i)continue;const a=Jm(i);if(!a||n.has(a)||r.has(i))continue;n.add(a),r.add(i);const c={id:a,path:i};s.data.label&&(c.label=s.data.label),s.data.icon&&(c.icon=s.data.icon),s.data.iconImage!==void 0&&(c.iconImage=s.data.iconImage),s.data.color&&(c.color=s.data.color),s.data.iconBackground!==void 0&&(c.iconBackground=s.data.iconBackground),s.data.addedAt!==void 0&&(c.addedAt=s.data.addedAt),s.data.lastOpenedAt!==void 0&&(c.lastOpenedAt=s.data.lastOpenedAt),s.data.defaultModel&&(c.defaultModel=s.data.defaultModel),s.data.defaultAgent&&(c.defaultAgent=s.data.defaultAgent),s.data.defaultVariant&&(c.defaultVariant=s.data.defaultVariant),s.data.sidebarCollapsed!==void 0&&(c.sidebarCollapsed=s.data.sidebarCollapsed),t.push(c)}return t}).refine(e=>e.length>0)),yg=Te(["steer","queue"]),wg=(e,t)=>{const n=yg.safeParse(e);if(n.success)return n.data;if(e==="immediate")return"steer";const r=Fe().safeParse(t.queueModeEnabled);if(r.success)return r.data?"queue":"steer"},bg=_(_e.pipe(Te(["local","openai-compatible","server","browser","wasm"])).transform(e=>e==="server"?"openai-compatible":e==="browser"||e==="wasm"?"local":e)),Sg=_(_e.pipe(Te(["left","right","auto"])).transform(e=>e==="left"?"left":"right")),Tg=_(_e.transform(e=>e.replace(/\s+/g," ").slice(0,64))),vg=e=>_(N(ue()).transform(t=>{const n=[];for(const r of t){const o=_e.transform(s=>s.toLowerCase()).safeParse(r);o.success&&e(o.data)&&!n.includes(o.data)&&n.push(o.data)}return n})),Ai=e=>_(wc(e)),cr=(e,t)=>(n,r)=>{const o=e(n,r);return o===void 0?void 0:t(o)},h=e=>e,S=(e,t,n={})=>({read:()=>T.getState()[e],write:t,autoSave:n.autoSave??!0}),$t=e=>t=>{T.setState({[e]:t})},Ja=()=>globalThis.window?.__zustand_config_store__??null,Gt=e=>({read:()=>Ja()?.getState()[e],write:t=>{Ja()?.setState({[e]:t})},autoSave:!1}),$r=e=>({read:()=>xs.getState()[e],write:t=>{xs.setState({[e]:t})},autoSave:!1}),kg=["concise","detailed","mentor","pushback","noFiller","matchEnergy","warmPeer","custom"],Eg=Ai(bi),Pg=Ai(ih),Ag=Ai(ah),Ig=_(m().refine(Wl)),xg=_(C().refine(wi)),Cg=cr(mn,e=>Ro(e,void 0)),Rg=cr(_(N(ue())),sm),Dg=cr(_(N(ue())),e=>Rl(e)),Og=Z(["ask","attach","inline"]),Mg=Z(["default","vim"]),_g=(e,t)=>{let n=e;const r=(o,s)=>{if(n.some(c=>c.type==="command"&&c.name===o))return;const i=n.findIndex(c=>c.type==="command"&&c.name===s),a=i>=0?i+1:n.length;n=[...n.slice(0,a),{type:"command",name:o},...n.slice(a)]};return t.draftStartersCraftGoalAdded!==!0&&r("craft-goal","plan-feature"),t.draftStartersScheduleTaskAdded!==!0&&r("schedule-task","craft-goal"),n},gr={themeId:h({scope:"profile",perSurface:!0,parse:Be}),useSystemTheme:h({scope:"profile",perSurface:!0,parse:P}),themeVariant:h({scope:"profile",derived:!0,parse:Z(["light","dark"])}),lightThemeId:h({scope:"profile",perSurface:!0,parse:Be}),darkThemeId:h({scope:"profile",perSurface:!0,parse:Be}),lastDirectory:h({scope:"instance",adopt:"bootstrap-only",parse:Be}),homeDirectory:h({scope:"instance",parse:Be}),opencodeBinary:h({scope:"instance",parse:mn}),projects:h({scope:"instance",parse:gg}),activeProjectId:h({scope:"instance",adopt:"bootstrap-only",parse:Be}),securityScopedBookmarks:h({scope:"instance",surfaces:["desktop"],parse:us}),pinnedDirectories:h({scope:"instance",parse:Hr}),desktopLanAccessEnabled:h({scope:"instance",surfaces:["desktop"],parse:P}),desktopKeepAwakeEnabled:h({scope:"instance",surfaces:["desktop"],parse:P}),desktopMinimizeToTrayEnabled:h({scope:"instance",surfaces:["desktop"],parse:P}),desktopMacMenuBarEnabled:h({scope:"instance",surfaces:["desktop"],parse:P}),desktopUiPassword:h({scope:"instance",secret:!0,surfaces:["desktop"],parse:mn}),hasDesktopUiPassword:h({scope:"instance",computed:!0,surfaces:["desktop"],parse:P}),desktopLanAccessActive:h({scope:"instance",computed:!0,surfaces:["desktop"],parse:P}),desktopLanAccessBlockedReason:h({scope:"instance",computed:!0,surfaces:["desktop"],parse:mn}),githubClientId:h({scope:"instance",parse:dn}),githubScopes:h({scope:"instance",parse:dn}),skillCatalogs:h({scope:"instance",parse:pg}),defaultGitIdentityId:h({scope:"instance",parse:mn}),permissionAutoAccept:h({scope:"instance",parse:_(v({sessions:Ve(m().min(1),Fe()).catch({}),revision:C().int().nonnegative().catch(0)}))}),agentControlToolEnabled:h({scope:"instance",parse:P,ui:S("agentControlToolEnabled",e=>T.getState().setAgentControlToolEnabled(e))}),agentWebToolEnabled:h({scope:"instance",parse:P,ui:S("agentWebToolEnabled",e=>T.getState().setAgentWebToolEnabled(e))}),agentMemoryToolEnabled:h({scope:"instance",parse:P,ui:S("agentMemoryToolEnabled",e=>T.getState().setAgentMemoryToolEnabled(e))}),agentMemoryFeatureAvailable:h({scope:"instance",computed:!0,parse:P,ui:S("agentMemoryFeatureAvailable",e=>T.getState().setAgentMemoryFeatureAvailable(e),{autoSave:!1})}),routingFeatureAvailable:h({scope:"instance",computed:!0,parse:P,ui:S("routingFeatureAvailable",e=>T.getState().setRoutingFeatureAvailable(e),{autoSave:!1})}),openCodeUpdateToastDismissedVersion:h({scope:"instance",parse:Bn(128)}),autoDeleteEnabled:h({scope:"instance",parse:P,ui:S("autoDeleteEnabled",e=>T.getState().setAutoDeleteEnabled(e))}),autoDeleteAfterDays:h({scope:"instance",parse:Ym(1,365),ui:S("autoDeleteAfterDays",e=>T.getState().setAutoDeleteAfterDays(e))}),sessionRetentionOnlyArchived:h({scope:"instance",parse:P,ui:S("sessionRetentionOnlyArchived",e=>T.getState().setSessionRetentionOnlyArchived(e))}),sessionRetentionAction:h({scope:"instance",parse:Z(["archive","delete"]),ui:S("sessionRetentionAction",e=>T.getState().setSessionRetentionAction(e))}),terminalShell:h({scope:"instance",parse:Eg,ui:S("terminalShell",e=>T.getState().setTerminalShell(e))}),terminalLoginShells:h({scope:"instance",parse:vg(bi),ui:S("terminalLoginShells",e=>T.getState().setTerminalLoginShells(e))}),openInAppId:h({scope:"instance",parse:dn}),dictationEnabled:h({scope:"profile",parse:P,ui:Gt("dictationEnabled")}),sttProvider:h({scope:"instance",parse:bg,ui:Gt("sttProvider")}),sttServerUrl:h({scope:"instance",parse:Bn(2048),ui:Gt("sttServerUrl")}),sttModel:h({scope:"instance",parse:Bn(256),ui:Gt("sttModel")}),sttLocalModel:h({scope:"instance",parse:Bn(256),ui:Gt("sttLocalModel")}),sttLanguage:h({scope:"profile",parse:Bn(64),ui:Gt("sttLanguage")}),tunnelProvider:h({scope:"instance",parse:cr(dn,e=>e.toLowerCase())}),tunnelMode:h({scope:"instance",parse:_(m().transform(e=>e.trim().toLowerCase()).pipe(Te(["quick","managed-remote","managed-local"])))}),tunnelBootstrapTtlMs:h({scope:"instance",parse:Xm}),tunnelSessionTtlMs:h({scope:"instance",parse:zt}),managedLocalTunnelConfigPath:h({scope:"instance",parse:Zm}),managedRemoteTunnelHostname:h({scope:"instance",parse:mn}),managedRemoteTunnelToken:h({scope:"instance",secret:!0,parse:eg}),hasManagedRemoteTunnelToken:h({scope:"instance",computed:!0,parse:P}),managedRemoteTunnelPresets:h({scope:"instance",parse:ug}),managedRemoteTunnelSelectedPresetId:h({scope:"instance",parse:dn}),managedRemoteTunnelPresetTokens:h({scope:"instance",secret:!0,parse:dg}),sidebarProjectDisplayMode:h({scope:"profile",parse:Z(["all","single"]),ui:$r("projectDisplayMode")}),sidebarSessionGroupingMode:h({scope:"profile",parse:Z(["by-worktree","flat"]),ui:$r("sessionGroupingMode")}),sidebarProjectSortOrder:h({scope:"profile",parse:Z(["manual","a-z","z-a","date-added","recent"]),ui:$r("projectSortOrder")}),sidebarShowRecentSection:h({scope:"profile",parse:P,ui:$r("showRecentSection")}),workStatusSectionOrder:h({scope:"profile",parse:cr(us,Is),ui:S("workStatusSectionOrder",e=>T.getState().setWorkStatusSectionOrder(e))}),workStatusPanelEnabled:h({scope:"profile",parse:P,ui:S("workStatusPanelEnabled",e=>T.getState().setWorkStatusPanelEnabled(e))}),workStatusHiddenSections:h({scope:"profile",parse:Dg,ui:{read:()=>T.getState().workStatusHiddenSections,write:(e,t)=>{const n=t.workStatusHiddenSectionsExplicit===!0;T.setState({workStatusHiddenSections:Rl(e,n),workStatusHiddenSectionsExplicit:n})},autoSave:!0}}),workStatusHiddenSectionsExplicit:h({scope:"profile",parse:P,ui:S("workStatusHiddenSectionsExplicit",()=>{})}),showReasoningTraces:h({scope:"profile",parse:P,ui:S("showReasoningTraces",e=>T.getState().setShowReasoningTraces(e))}),streamingAutoFollowEnabled:h({scope:"profile",perSurface:!0,parse:P,ui:S("streamingAutoFollowEnabled",e=>T.getState().setStreamingAutoFollowEnabled(e))}),collapsibleThinkingBlocks:h({scope:"profile",parse:P,ui:S("collapsibleThinkingBlocks",e=>T.getState().setCollapsibleThinkingBlocks(e))}),showTextJustificationActivity:h({scope:"profile",parse:P}),chatRenderMode:h({scope:"profile",parse:Z(["sorted","live"]),ui:S("chatRenderMode",e=>T.getState().setChatRenderMode(e))}),activityRenderMode:h({scope:"profile",parse:Z(["collapsed","summary"]),ui:S("activityRenderMode",e=>T.getState().setActivityRenderMode(e))}),mermaidRenderingMode:h({scope:"profile",parse:Z(["svg","ascii"]),ui:S("mermaidRenderingMode",e=>T.getState().setMermaidRenderingMode(e))}),userMessageRenderingMode:h({scope:"profile",parse:Z(["markdown","plain"]),ui:S("userMessageRenderingMode",e=>T.getState().setUserMessageRenderingMode(e))}),collapsibleUserMessages:h({scope:"profile",parse:P,ui:S("collapsibleUserMessages",e=>T.getState().setCollapsibleUserMessages(e))}),stickyUserHeader:h({scope:"profile",perSurface:!0,parse:P,ui:S("stickyUserHeader",e=>T.getState().setStickyUserHeader(e))}),promptNavigatorEnabled:h({scope:"profile",perSurface:!0,parse:P,ui:S("promptNavigatorEnabled",e=>T.getState().setPromptNavigatorEnabled(e))}),wideChatLayoutEnabled:h({scope:"profile",perSurface:!0,parse:P,ui:S("wideChatLayoutEnabled",e=>T.getState().setWideChatLayoutEnabled(e))}),showSplitAssistantMessageActions:h({scope:"profile",parse:P,ui:S("showSplitAssistantMessageActions",e=>T.getState().setShowSplitAssistantMessageActions(e))}),showToolFileIcons:h({scope:"profile",parse:P,ui:S("showToolFileIcons",e=>T.getState().setShowToolFileIcons(e))}),codeBlockLineWrap:h({scope:"profile",parse:P,ui:S("codeBlockLineWrap",e=>T.getState().setCodeBlockLineWrap(e))}),showTurnChangedFiles:h({scope:"profile",parse:P,ui:S("showTurnChangedFiles",e=>T.getState().setShowTurnChangedFiles(e))}),showExpandedBashTools:h({scope:"profile",parse:P,ui:S("showExpandedBashTools",e=>T.getState().setShowExpandedBashTools(e))}),showExpandedEditTools:h({scope:"profile",parse:P,ui:S("showExpandedEditTools",e=>T.getState().setShowExpandedEditTools(e))}),toolJsonViewMode:h({scope:"profile",parse:Z(["summary","formatted","raw"]),ui:S("toolJsonViewMode",e=>T.getState().setToolJsonViewMode(e))}),timeFormatPreference:h({scope:"profile",parse:Z(["auto","12h","24h"]),ui:S("timeFormatPreference",e=>T.getState().setTimeFormatPreference(e))}),weekStartPreference:h({scope:"profile",parse:Z(["auto","sunday","monday"]),ui:S("weekStartPreference",e=>T.getState().setWeekStartPreference(e))}),messageStreamTransport:h({scope:"profile",parse:Z(["auto","ws","sse"]),ui:Gt("settingsMessageStreamTransport")}),diffLayoutPreference:h({scope:"profile",parse:Z(["dynamic","inline","side-by-side"]),ui:S("diffLayoutPreference",e=>T.getState().setDiffLayoutPreference(e))}),diffWrapLines:h({scope:"profile",parse:P,ui:S("diffWrapLines",e=>T.getState().setDiffWrapLines(e))}),gitChangesViewMode:h({scope:"profile",parse:Z(["flat","tree"]),ui:S("gitChangesViewMode",e=>T.getState().setGitChangesViewMode(e))}),gitmojiEnabled:h({scope:"profile",parse:P}),defaultFileViewerPreview:h({scope:"profile",parse:P}),directoryShowHidden:h({scope:"profile",parse:P,ui:{read:nm,write:e=>rm(e,{persist:!1}),autoSave:!1}}),filesViewShowGitignored:h({scope:"profile",parse:P,ui:{read:am,write:e=>cm(e,{persist:!1}),autoSave:!1}}),fileEditorKeymap:h({scope:"profile",parse:Mg,ui:S("fileEditorKeymap",e=>T.getState().setFileEditorKeymap(e))}),autoSaveEnabled:h({scope:"profile",parse:P,ui:S("autoSaveEnabled",e=>T.getState().setAutoSaveEnabled(e))}),autoCreateWorktree:h({scope:"profile",parse:P}),sessionTabsEnabled:h({scope:"profile",surfaces:["web","desktop","vscode"],parse:P,ui:S("sessionTabsEnabled",e=>T.getState().setSessionTabsEnabled(e))}),showOpenCodeRestartConfirm:h({scope:"profile",parse:P,ui:S("showOpenCodeRestartConfirm",e=>T.getState().setShowOpenCodeRestartConfirm(e))}),allowPromptingSubagentSessions:h({scope:"profile",parse:P,ui:S("allowPromptingSubagentSessions",e=>T.getState().setAllowPromptingSubagentSessions(e))}),inputSpellcheckEnabled:h({scope:"profile",parse:P,ui:S("inputSpellcheckEnabled",e=>T.getState().setInputSpellcheckEnabled(e))}),enterToSend:h({scope:"profile",parse:P,ui:S("enterToSend",e=>T.getState().setEnterToSend(e))}),enterToSendConfigured:h({scope:"profile",parse:P,ui:S("enterToSendConfigured",e=>T.getState().setEnterToSendConfigured(e))}),persistChatDraft:h({scope:"profile",parse:P,ui:S("persistChatDraft",e=>T.getState().setPersistChatDraft(e))}),largeTextPasteBehavior:h({scope:"profile",parse:Og,ui:S("largeTextPasteBehavior",e=>T.getState().setLargeTextPasteBehavior(e))}),followUpBehavior:h({scope:"profile",parse:wg,ui:{read:()=>Us.getState().followUpBehavior,write:e=>Us.getState().setFollowUpBehavior(e),autoSave:!1}}),queueModeEnabled:h({scope:"profile",parse:P}),inputHistoryScope:h({scope:"profile",parse:Ig,ui:{read:()=>Wn.getState().scope,write:e=>Wn.getState().applyScope(e),autoSave:!1}}),inputHistoryLimit:h({scope:"profile",parse:xg,ui:{read:()=>Wn.getState().entryLimit,write:e=>Wn.getState().applyEntryLimit(e),autoSave:!1}}),draftStarters:h({scope:"profile",parse:Rg,ui:{read:()=>T.getState().globalDraftStarters??void 0,write:(e,t)=>T.getState().setGlobalDraftStarters(_g(e,t)),autoSave:!1}}),draftStartersVisible:h({scope:"profile",parse:P,ui:S("draftStartersVisible",e=>T.getState().setDraftStartersVisible(e))}),draftStartersCraftGoalAdded:h({scope:"profile",parse:P}),draftStartersScheduleTaskAdded:h({scope:"profile",parse:P}),fontSize:h({scope:"profile",perSurface:!0,parse:zt,ui:S("fontSize",e=>T.getState().setFontSize(e))}),terminalFontSize:h({scope:"profile",perSurface:!0,parse:zt,ui:S("terminalFontSize",e=>T.getState().setTerminalFontSize(e))}),editorFontSize:h({scope:"profile",perSurface:!0,parse:zt,ui:S("editorFontSize",e=>T.getState().setEditorFontSize(e))}),uiFont:h({scope:"profile",parse:Pg,ui:S("uiFont",e=>T.getState().setUiFont(e))}),monoFont:h({scope:"profile",parse:Ag,ui:S("monoFont",e=>T.getState().setMonoFont(e))}),padding:h({scope:"profile",perSurface:!0,parse:zt,ui:S("padding",e=>T.getState().setPadding(e))}),cornerRadius:h({scope:"profile",perSurface:!0,parse:zt,ui:S("cornerRadius",e=>T.getState().setCornerRadius(e))}),shortcutOverrides:h({scope:"profile",parse:og,ui:S("shortcutOverrides",$t("shortcutOverrides"))}),defaultModel:h({scope:"profile",parse:Be}),defaultVariant:h({scope:"profile",parse:Be}),defaultAgent:h({scope:"profile",parse:Be}),smallModelUseDefault:h({scope:"profile",parse:P}),smallModelOverride:h({scope:"profile",parse:Be}),walkthroughModelOverride:h({scope:"profile",parse:Be}),zenModel:h({scope:"profile",parse:dn}),favoriteModels:h({scope:"profile",parse:fs(64),ui:S("favoriteModels",$t("favoriteModels"),{autoSave:!1})}),hiddenModels:h({scope:"profile",parse:fs(1024),ui:S("hiddenModels",$t("hiddenModels"),{autoSave:!1})}),collapsedModelProviders:h({scope:"profile",parse:Hr,ui:S("collapsedModelProviders",$t("collapsedModelProviders"),{autoSave:!1})}),recentModels:h({scope:"profile",parse:fs(16),ui:S("recentModels",$t("recentModels"),{autoSave:!1})}),recentAgents:h({scope:"profile",parse:Hr,ui:S("recentAgents",$t("recentAgents"),{autoSave:!1})}),recentEfforts:h({scope:"profile",parse:rg,ui:S("recentEfforts",$t("recentEfforts"),{autoSave:!1})}),providerOrder:h({scope:"profile",parse:Hr,ui:S("providerOrder",e=>T.getState().setProviderOrder(e))}),sessionRecapEnabled:h({scope:"profile",parse:P,ui:S("sessionRecapEnabled",e=>T.getState().setSessionRecapEnabled(e))}),sessionSuggestionEnabled:h({scope:"profile",parse:P,ui:S("sessionSuggestionEnabled",e=>T.getState().setSessionSuggestionEnabled(e))}),sessionGoalEnabled:h({scope:"profile",parse:P,ui:S("sessionGoalEnabled",e=>T.getState().setSessionGoalEnabled(e))}),sessionGoalDefaultBudgetEnabled:h({scope:"profile",parse:P,ui:S("sessionGoalDefaultBudgetEnabled",e=>T.getState().setSessionGoalDefaultBudgetEnabled(e))}),sessionGoalDefaultBudget:h({scope:"profile",parse:Qm,ui:S("sessionGoalDefaultBudget",e=>T.getState().setSessionGoalDefaultBudget(e))}),summarizeLastMessage:h({scope:"profile",parse:P,ui:S("summarizeLastMessage",e=>T.getState().setSummarizeLastMessage(e))}),summaryThreshold:h({scope:"profile",parse:ls(0),ui:S("summaryThreshold",e=>T.getState().setSummaryThreshold(e))}),summaryLength:h({scope:"profile",parse:ls(10),ui:S("summaryLength",e=>T.getState().setSummaryLength(e))}),maxLastMessageLength:h({scope:"profile",parse:ls(10),ui:S("maxLastMessageLength",e=>T.getState().setMaxLastMessageLength(e))}),showDeletionDialog:h({scope:"profile",parse:P,ui:S("showDeletionDialog",e=>T.getState().setShowDeletionDialog(e))}),nativeNotificationsEnabled:h({scope:"profile",parse:P,ui:S("nativeNotificationsEnabled",e=>T.getState().setNativeNotificationsEnabled(e))}),notificationMode:h({scope:"profile",parse:Z(["always","hidden-only"]),ui:S("notificationMode",e=>T.getState().setNotificationMode(e))}),notifyOnSubtasks:h({scope:"profile",parse:P,ui:S("notifyOnSubtasks",e=>T.getState().setNotifyOnSubtasks(e))}),notifyOnCompletion:h({scope:"profile",parse:P,ui:S("notifyOnCompletion",e=>T.getState().setNotifyOnCompletion(e))}),notifyOnError:h({scope:"profile",parse:P,ui:S("notifyOnError",e=>T.getState().setNotifyOnError(e))}),notifyOnQuestion:h({scope:"profile",parse:P,ui:S("notifyOnQuestion",e=>T.getState().setNotifyOnQuestion(e))}),notificationTemplates:h({scope:"profile",parse:ig,ui:S("notificationTemplates",e=>T.getState().setNotificationTemplates(e))}),showOpenCodeUpdateNotifications:h({scope:"profile",parse:P,ui:S("showOpenCodeUpdateNotifications",e=>T.getState().setShowOpenCodeUpdateNotifications(e))}),reportUsage:h({scope:"profile",parse:P,ui:S("reportUsage",e=>T.getState().setReportUsage(e))}),usageDisplayMode:h({scope:"profile",parse:Z(["usage","remaining"])}),usageDropdownProviders:h({scope:"profile",parse:us}),usageSelectedModels:h({scope:"profile",parse:ds}),usageCollapsedFamilies:h({scope:"profile",parse:ds}),usageExpandedFamilies:h({scope:"profile",parse:ds}),usageModelGroups:h({scope:"profile",parse:cg}),globalBehaviorPrompt:h({scope:"profile",parse:Ka(1024*1024)}),responseStyleEnabled:h({scope:"profile",parse:P}),responseStylePreset:h({scope:"profile",parse:Z(kg)}),responseStyleCustomInstructions:h({scope:"profile",parse:Ka(5e4)}),optimizeSystemPrompt:h({scope:"profile",parse:P}),pwaAppName:h({scope:"instance",surfaces:["web"],parse:Tg}),pwaOrientation:h({scope:"instance",surfaces:["web"],parse:Z(["system","portrait","landscape"])}),mobileKeyboardMode:h({scope:"device",surfaces:["mobile"],parse:Cg,ui:S("mobileKeyboardMode",e=>T.getState().setMobileKeyboardMode(e))}),desktopWindowControlsPosition:h({scope:"device",surfaces:["desktop"],parse:Sg,ui:S("desktopWindowControlsPosition",e=>T.getState().setDesktopWindowControlsPosition(e))}),desktopWindowControlsStyle:h({scope:"device",surfaces:["desktop"],parse:Z(["classic","traffic-lights"]),ui:S("desktopWindowControlsStyle",e=>T.getState().setDesktopWindowControlsStyle(e))}),inputBarOffset:h({scope:"device",surfaces:["mobile","web"],parse:zt,ui:S("inputBarOffset",e=>T.getState().setInputBarOffset(e))})},Lg=e=>Object.prototype.hasOwnProperty.call(gr,e),yr=Object.keys(gr).filter(Lg),Zl=e=>gr[e].scope==="device",wr=e=>gr[e],Fg=e=>!gr[e].computed&&!Zl(e),Ug=Ve(m(),ue()),jg=e=>{const t=Ug.safeParse(e);if(!t.success)return null;const n=t.data,r={};for(const o of yr){const i=wr(o).parse(n[o],n);i!==void 0&&Object.assign(r,{[o]:i})}return r},Ng=(e,t)=>e===t?!0:e===void 0||t===void 0?!1:JSON.stringify(e)===JSON.stringify(t),Bg=e=>{for(const t of yr){const n=wr(t);if(!n.ui)continue;const r=e[t];r!==void 0&&(Ng(n.ui.read(),r)||n.ui.write(r,e))}},Hg=yr.filter(e=>wr(e).ui?.autoSave===!0),WT=()=>{const e={};for(const t of Hg){const r=wr(t).ui?.read();r!==void 0&&Object.assign(e,{[t]:r})}return e},zg=yr.filter(e=>{const t=wr(e);return t.scope!=="device"&&!t.secret&&!t.computed}),$g=768,Gg=800,Wg=()=>{if(typeof window>"u")return!1;const e=typeof window.matchMedia=="function"?window.matchMedia("(pointer: coarse)").matches||window.matchMedia("(hover: none)").matches:!1,t=typeof navigator<"u"?navigator.maxTouchPoints??0:0;return e||t>0},qg=()=>{if(typeof window>"u")return!1;const e=new URLSearchParams(window.location.search).get("surface");return e==="mobile"||e==="desktop"},eu=()=>{if(typeof window>"u")return!1;const e=Math.min(window.innerWidth||Number.POSITIVE_INFINITY,window.screen?.width||Number.POSITIVE_INFINITY);return Number.isFinite(e)&&e<=$g&&Wg()},tu=()=>{if(typeof window>"u")return"desktop";const e=window.__OPENCHAMBER_SURFACE__;if(e==="mobile"||e==="desktop")return e;const t=new URLSearchParams(window.location.search).get("surface");return t==="mobile"||t==="desktop"?t:pr()?"mobile":Je()||Me()?"desktop":eu()?"mobile":"desktop"},qT=()=>{const e=tu();return typeof window<"u"&&(window.__OPENCHAMBER_SURFACE__=e),e},Kg=()=>tu()==="mobile",KT=()=>{if(typeof window>"u")return()=>{};if(pr()||Je()||Me())return()=>{};if(qg())return()=>{};let e=null;const t=()=>{e&&clearTimeout(e),e=setTimeout(()=>{e=null;const n=window.__OPENCHAMBER_SURFACE__,r=eu()?"mobile":"desktop";n&&n!==r&&(window.__OPENCHAMBER_SURFACE__=void 0,window.location.reload())},Gg)};return window.addEventListener("resize",t),()=>{e&&clearTimeout(e),window.removeEventListener("resize",t)}},nu="surface",ru=()=>{try{if(Me())return"vscode";if(Je())return"desktop";if(pr()||Kg())return"mobile"}catch{}return"web"},Vg=e=>{if(!(typeof window>"u")&&!(typeof window.__OPENCHAMBER_HOME__=="string"&&window.__OPENCHAMBER_HOME__.length>0))try{window.__OPENCHAMBER_HOME__=e}catch{}},Ya="openchamber.settingsMirror.v2.index",Jg="openchamber.deviceSeeded.v1:",Yg=e=>`${Jg}${encodeURIComponent(e)}`,Qg=(e,t)=>{const n=Yg(t);let r=!1;try{r=localStorage.getItem(n)===null,r&&localStorage.setItem(n,String(Date.now()))}catch{r=!1}if(r)return e;const o={};for(const s of yr)e[s]===void 0||Zl(s)||Object.assign(o,{[s]:e[s]});return o},Xg="openchamber.settingsMirror.v2:",Zg=5,Qa=e=>`${Xg}${encodeURIComponent(e)}`,fn=(e,t)=>{t===null?localStorage.removeItem(e):localStorage.setItem(e,t)},ey=(e,t)=>{const n={};for(const s of zg)e[s]!==void 0&&Object.assign(n,{[s]:e[s]});localStorage.setItem(Qa(t),JSON.stringify(n));let r=[];try{const s=JSON.parse(localStorage.getItem(Ya)??"[]");Array.isArray(s)&&(r=s.filter(i=>typeof i=="string"))}catch{r=[]}const o=[t,...r.filter(s=>s!==t)].slice(0,Zg);for(const s of r)o.includes(s)||localStorage.removeItem(Qa(s));localStorage.setItem(Ya,JSON.stringify(o))},ty=e=>{if(!(typeof window>"u")){if(ey(e,G()),fn("lastDirectory",e.lastDirectory||null),e.homeDirectory?(localStorage.setItem("homeDirectory",e.homeDirectory),Vg(e.homeDirectory)):localStorage.removeItem("homeDirectory"),Array.isArray(e.projects)&&e.projects.length>0?localStorage.setItem("projects",JSON.stringify(e.projects)):localStorage.removeItem("projects"),e.activeProjectId?localStorage.setItem("activeProjectId",e.activeProjectId):localStorage.removeItem("activeProjectId"),Array.isArray(e.pinnedDirectories)&&e.pinnedDirectories.length>0?localStorage.setItem("pinnedDirectories",JSON.stringify(e.pinnedDirectories)):localStorage.removeItem("pinnedDirectories"),Array.isArray(e.projects)&&e.projects.length>0){const t=e.projects.filter(n=>n.sidebarCollapsed===!0).map(n=>n.id).filter(n=>typeof n=="string"&&n.length>0);t.length>0?localStorage.setItem("oc.sessions.projectCollapse",JSON.stringify(t)):localStorage.removeItem("oc.sessions.projectCollapse")}else localStorage.removeItem("oc.sessions.projectCollapse");if(typeof e.gitmojiEnabled=="boolean"?localStorage.setItem("gitmojiEnabled",String(e.gitmojiEnabled)):localStorage.removeItem("gitmojiEnabled"),typeof e.directoryShowHidden=="boolean"?localStorage.setItem("directoryTreeShowHidden",e.directoryShowHidden?"true":"false"):localStorage.removeItem("directoryTreeShowHidden"),typeof e.filesViewShowGitignored=="boolean"?localStorage.setItem("filesViewShowGitignored",e.filesViewShowGitignored?"true":"false"):localStorage.removeItem("filesViewShowGitignored"),fn("openInAppId",typeof e.openInAppId=="string"&&e.openInAppId.length>0?e.openInAppId:null),typeof e.pwaAppName=="string"){const t=e.pwaAppName.trim().replace(/\s+/g," ").slice(0,64);t.length>0?localStorage.setItem("openchamber.pwaName",t):localStorage.removeItem("openchamber.pwaName")}else localStorage.removeItem("openchamber.pwaName");if(xl(e.mobileKeyboardMode),typeof e.openCodeUpdateToastDismissedVersion=="string"){const t=e.openCodeUpdateToastDismissedVersion.trim();t?localStorage.setItem("opencode-update-toast-dismissed-version",t):localStorage.removeItem("opencode-update-toast-dismissed-version")}else localStorage.removeItem("opencode-update-toast-dismissed-version");typeof e.dictationEnabled=="boolean"?localStorage.setItem("dictationEnabled",String(e.dictationEnabled)):localStorage.removeItem("dictationEnabled"),e.sttProvider==="local"||e.sttProvider==="openai-compatible"?localStorage.setItem("sttProvider",e.sttProvider):localStorage.removeItem("sttProvider"),fn("sttServerUrl",typeof e.sttServerUrl=="string"?e.sttServerUrl:null),fn("sttModel",typeof e.sttModel=="string"?e.sttModel:null),fn("sttLocalModel",typeof e.sttLocalModel=="string"?e.sttLocalModel:null),fn("sttLanguage",typeof e.sttLanguage=="string"?e.sttLanguage:null)}},js=(e,t,n=t)=>{typeof window>"u"||window.dispatchEvent(new CustomEvent("openchamber:settings-synced",{detail:{settings:e,bootstrap:t,adoptTheme:n}}))};let Ns="idle",Gr=null;const Bs=new Set,VT=()=>Ns,JT=e=>(Bs.add(e),()=>Bs.delete(e)),YT=e=>{Oo(),We(e)},We=e=>{Gr&&(clearTimeout(Gr),Gr=null);const t=e==="saved"?"idle":e;t!==Ns&&(Ns=t,Bs.forEach(n=>n())),t==="error"&&(Gr=setTimeout(()=>We("saved"),6e3)),!(typeof window>"u")&&window.dispatchEvent(new CustomEvent("openchamber:settings-save-state",{detail:e}))},ou=()=>{const e=T.persist;if(e&&typeof e=="object")return e},su=()=>Po()?.settings??null,iu=()=>`/api/config/settings?${nu}=${ru()}`,ny=e=>{Bg(e)},bo=e=>jg(e);class ry{revision=0;mutations=[];operations=new Set;record(t){if(this.revision+=1,this.operations.size>0){const n=this.mutations.at(-1),r=n?[...this.operations].some(o=>o.revision>=n.revision):!0;n&&!r?(n.revision=this.revision,n.changes={...n.changes,...t}):this.mutations.push({revision:this.revision,changes:t})}return this.revision}begin(t=this.revision){const n={revision:t};return this.operations.add(n),n}reconcile(t,n){let r=t;for(const o of this.mutations)o.revision<=n.revision||(r={...r,...o.changes});return r}finish(t){if(!this.operations.delete(t))return;if(this.operations.size===0){this.mutations=[];return}const n=Math.min(...[...this.operations].map(({revision:r})=>r));this.mutations=this.mutations.filter(r=>r.revision>n)}reset(){this.mutations=[],this.operations.clear()}}let Ii=0,Ct=null,An={},Hs=!1;const QT=()=>Hs,zs=e=>{Hs=!0;try{ny(e)}finally{Hs=!1}};let Vt=null,Ke=null,ot=null,Ie=null,Zn=[],Xa=!1,So=0,Zr=[];const Oe=new ry,oy=2e3,sy=200,xi=()=>({runtimeKey:G(),generation:Ii}),Do=e=>Object.keys(e),au=(e,t)=>e===t?!0:e===void 0||t===void 0?!1:JSON.stringify(e)===JSON.stringify(t),eo=e=>{An={...An,...e}},iy=e=>{const t={...An};for(const n of e)delete t[n];An=t},ay=e=>{const t={};for(const n of Do(e))au(e[n],An[n])||Object.assign(t,{[n]:e[n]});return t},lr=(e,t)=>e.runtimeKey===t.runtimeKey&&e.generation===t.generation,cu=e=>{let t=null;for(const n of Zr)lr(n.context,e)&&(t={...t??{},...n.changes});return Ke&&ot&&lr(ot,e)&&(t={...t??{},...Ke}),t},Za=(e,t)=>{const n=cu(t);return e&&n?{...e,...n}:e},re=e=>e.generation===Ii&&e.runtimeKey===G(),Hn=()=>{Ke&&(Ie&&(clearTimeout(Ie),Ie=null),To({keepalive:!0}))},Oo=()=>{if(!(Xa||typeof window>"u")){Xa=!0,Nd(e=>{e.runtimeKey!==e.previousRuntimeKey&&(Ie&&clearTimeout(Ie),Ke&&To())}),Hc(e=>{e.runtimeKey!==e.previousRuntimeKey&&(Ii+=1,Oe.reset(),So=0,Ct=null,Vt=null,An={},We("saved"))});try{window.addEventListener("pagehide",Hn,{capture:!0}),window.addEventListener("beforeunload",Hn,{capture:!0}),typeof document<"u"&&(document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&Hn()}),document.addEventListener("freeze",Hn)),pr()&&Xs(async()=>{const{App:e}=await import("./vendor-capacitor-app-BrDJj9I_.js");return{App:e}},__vite__mapDeps([3,4,5])).then(({App:e})=>e.addListener("appStateChange",({isActive:t})=>{t||Hn()})).catch(()=>{})}catch{}}},lu=async(e=xi())=>{if(Oo(),Ct&&lr(Ct.context,e)&&Date.now()-Ct.at<oy)return Za(Ct.value,e);if(Vt&&lr(Vt.context,e))return Vt.promise;const t=Oe.begin(),n=cu(e),r=s=>{if(!re(e)||!s)return null;const i=Za(Oe.reconcile({...s,...n},t),e);Ct={value:i,at:Date.now(),context:e};const a={};for(const c of Do(s))au(s[c],i?.[c])&&Object.assign(a,{[c]:s[c]});return eo(a),i},o={context:e,promise:(async()=>{const s=su();if(s)try{const i=await s.load();if(!re(e))return null;const a=bo(i.settings);return r(a)}catch(i){if(!re(e))return null;console.warn("Failed to load shared settings from runtime settings API:",i)}if(!re(e))return null;try{const i=await y(iu(),{method:"GET",headers:{Accept:"application/json"}});if(!re(e)||!i.ok)return null;const a=await i.json().catch(()=>null);if(!re(e))return null;const c=bo(a);return r(c)}catch(i){return re(e)&&console.warn("Failed to load shared settings from server:",i),null}})()};return Vt=o,o.promise.finally(()=>{Oe.finish(t),Vt===o&&(Vt=null)}),o.promise},XT=async e=>{const t=e?.bootstrap!==!1,n=e?.adoptTheme??t;if(typeof window>"u")return;Oo();const r=xi(),o=Oe.begin(),s=[ou(),xs.persist],i=u=>!u?.hasHydrated||u.hasHydrated()||!u.onFinishHydration?Promise.resolve():new Promise(d=>{let f=!1;const p=()=>{f||(f=!0,d())},g=u.onFinishHydration(()=>{g?.(),p()});u.hasHydrated?.()&&p()}),a=()=>Promise.all(s.map(i)).then(()=>{}),c=u=>!Ke||!ot||!re(ot)?u:{...u,...Ke},l=async u=>{if(!re(r))return;let d=c(Oe.reconcile(u,o));if(await a(),!!re(r)){d=Qg(c(Oe.reconcile(u,o)),r.runtimeKey);try{ty(d)}catch(f){console.warn("persistToLocalStorage failed:",f)}try{zs(d)}catch(f){console.warn("applyDesktopUiPreferences failed:",f)}js(d,t,n)}};try{const u=await lu(r);u&&re(r)?await l(u):re(r)&&window.dispatchEvent(new Event("openchamber:settings-sync-failed"))}catch(u){re(r)&&window.dispatchEvent(new Event("openchamber:settings-sync-failed")),console.warn("Failed to synchronise settings:",u)}finally{Oe.finish(o)}};async function To({keepalive:e=!1}={}){let t=!1;const n=Ke,r=ot,o=So,s=Zn;Ke=null,ot=null,So=0,Ie=null,Zn=[];try{if(!n||!r||Object.keys(n).length===0||!re(r)){t=!0,We("saved");return}const i=Oe.begin(o),a={context:r,changes:{...n}};Zr.push(a),eo(n);const c=()=>iy(Do(n));try{const l=su();if(l)try{const u=bo(await l.save(n));if(!re(r))return;if(u){eo(u);const d=Oe.reconcile(u,i);zs(d),js(d,!1),Ct=null}u||c(),t=!!u,We(u?"saved":"error");return}catch(u){if(!re(r))return;console.warn("Failed to update settings via runtime settings API:",u)}if(!re(r))return;try{const u=await y(iu(),{method:"PUT",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(n),keepalive:e});if(!re(r))return;if(!u.ok){console.warn("Failed to update shared settings via API:",u.status,u.statusText),c(),We("error");return}const d=bo(await u.json().catch(()=>null));if(!re(r))return;if(d){eo(d);const f=Oe.reconcile(d,i);zs(f),js(f,!1),t=!0,We("saved"),Ct=null}else c(),We("error")}catch(u){re(r)&&(console.warn("Failed to update shared settings via API:",u),c(),We("error"))}}finally{Zr=Zr.filter(l=>l!==a),Oe.finish(i)}}finally{s.forEach(i=>i({ok:t}))}}const ZT=()=>lu(),ft=async e=>{if(typeof window>"u")return{ok:!1};Oo();const t=xi();ot&&!lr(ot,t)&&(Ie&&clearTimeout(Ie),To());const n={};for(const i of Do(e))Fg(i)&&Object.assign(n,{[i]:e[i]});const r=Oe.record(n),o=ay({...Ke??{},...n});if(Object.keys(o).length===0){Ke=null,ot=null,Ie&&(clearTimeout(Ie),Ie=null);const i=Zn;return Zn=[],i.forEach(a=>a({ok:!0})),We("saved"),{ok:!0}}Ke=o,ot=t,So=r,We("saving"),Ie&&clearTimeout(Ie);const s=new Promise(i=>{Zn.push(i)});return Ie=setTimeout(()=>{To()},sy),s},ev=async()=>{if(typeof window>"u")return;const e=ou();try{const t=await Zh();if(!t)return;const n=()=>Xh(t);if(e?.hasHydrated?.()){n();return}if(n(),e?.onFinishHydration){const r=e.onFinishHydration(()=>{r?.(),n()})}}catch(t){console.warn("Failed to load appearance preferences:",t)}},cy=3e4,ly=40,uy=60,dy=(e,t,n,r,o,s,i)=>{const a=t.trim(),c=n.trim().toLowerCase();return JSON.stringify([e,a,c,r,o,s,i])},ec=(e,t)=>{try{const n=JSON.parse(e);return Array.isArray(n)&&n[1]===t}catch{return!1}},fy=gt()(xn((e,t)=>({cache:{},cacheKeys:[],inFlight:{},async searchFiles(n,r,o=uy,s){if(!n||n.trim().length===0)return[];const i=n.trim(),a=G(),c=typeof r=="string"?r.trim():"",l=!!s?.includeHidden,u=s?.respectGitignore??!0,d=s?.type==="directory"?"directory":"file",f=dy(a,i,c,o,l,u,d),p=Date.now(),g=t().cache[f];if(g&&p-g.timestamp<cy)return g.files;const b=t().inFlight[f];if(b)return b;const w=rt.searchFiles(c,{directory:i,limit:o,includeHidden:l,respectGitignore:u,dirs:d!=="file",type:d}).then(E=>(e(k=>{if(k.inFlight[f]!==w)return k;const F={...k.cache,[f]:{files:E,timestamp:Date.now()}},O=k.cacheKeys.filter(K=>K!==f);for(O.push(f);O.length>ly;){const K=O.shift();K&&delete F[K]}return{cache:F,cacheKeys:O}}),E)).finally(()=>{e(E=>{if(E.inFlight[f]!==w)return E;const k={...E.inFlight};return delete k[f],{inFlight:k}})});return e(E=>({inFlight:{...E.inFlight,[f]:w}})),w},invalidateDirectory(n){if(!n||n.trim().length===0){e({cache:{},cacheKeys:[],inFlight:{}});return}const r=n.trim();e(o=>{const s={...o.cache},i=o.cacheKeys.filter(l=>ec(l,r)?(delete s[l],!1):!0),a=Object.entries(o.inFlight).filter(([l])=>!ec(l,r)),c=Object.fromEntries(a);return{cache:s,cacheKeys:i,inFlight:c}})},resetForRuntimeSwitch(){e({cache:{},cacheKeys:[],inFlight:{}})}}),{name:"file-search-store"})),py=()=>{if(typeof window>"u")return!1;try{return window.localStorage.getItem("openchamber_stream_debug")==="1"}catch{return!1}},$s="openchamber_stream_perf",hy=()=>{if(typeof window>"u")return!1;try{return window.localStorage.getItem($s)==="1"}catch{return!1}};let uu=hy(),du=!1;const rn=()=>uu||du,fu=()=>{rn()||!globalThis.window||(delete window.__openchamberStreamPerfState,delete window.__openchamberVsCodeStreamPerfState)},tc=()=>typeof performance<"u"&&typeof performance.now=="function"?performance.now():Date.now(),pu=()=>{if(!rn()||typeof window>"u")return null;if(!window.__openchamberStreamPerfState){const e=Date.now();window.__openchamberStreamPerfState={counters:new Map,startedAt:e,lastUpdatedAt:e}}return window.__openchamberStreamPerfState},hu=e=>Array.from(e.entries()).map(([t,n])=>({metric:t,count:n.count,avg:n.count>0?Number((n.total/n.count).toFixed(3)):0,max:Number(n.max.toFixed(3)),total:Number(n.total.toFixed(3)),last:Number(n.last.toFixed(3))})).sort((t,n)=>n.total-t.total||n.count-t.count),Ci=(e,t)=>{const n=pu();if(!n)return;const r=n.counters.get(e)??{count:0,total:0,max:0,last:0};r.count+=1,r.total+=t,r.max=Math.max(r.max,t),r.last=t,n.counters.set(e,r),n.lastUpdatedAt=Date.now()},my=e=>{if(uu=e,!(typeof window>"u"))try{if(e){window.localStorage.setItem($s,"1"),window.__openchamberStreamPerfState={counters:new Map,startedAt:Date.now(),lastUpdatedAt:Date.now()};return}window.localStorage.removeItem($s),fu()}catch{}},tv=e=>{if(du=e,!(typeof window>"u")){if(e){pu();return}fu()}},gy=()=>{typeof window>"u"||(rn()&&(window.__openchamberStreamPerfState={counters:new Map,startedAt:Date.now(),lastUpdatedAt:Date.now()}),window.__openchamberVsCodeStreamPerfState&&(window.__openchamberVsCodeStreamPerfState={...window.__openchamberVsCodeStreamPerfState,counters:new Map,startedAt:Date.now(),lastUpdatedAt:Date.now()}))},yy=()=>{if(typeof window>"u")return{enabled:!1,startedAt:null,lastUpdatedAt:null,durationMs:0,entries:[]};const e=window.__openchamberStreamPerfState;return!rn()||!e?{enabled:!1,startedAt:null,lastUpdatedAt:null,durationMs:0,entries:[]}:{enabled:!0,startedAt:e.startedAt,lastUpdatedAt:e.lastUpdatedAt,durationMs:Math.max(0,Date.now()-e.startedAt),entries:hu(e.counters)}},nv=()=>{if(typeof window>"u")return{enabled:!1,startedAt:null,lastUpdatedAt:null,durationMs:0,entries:[]};const e=window.__openchamberVsCodeStreamPerfState;if(!rn()||!e)return{enabled:!1,startedAt:null,lastUpdatedAt:null,durationMs:0,entries:[]};const t=typeof e.startedAt=="number"?e.startedAt:null,n=typeof e.lastUpdatedAt=="number"?e.lastUpdatedAt:null;return{enabled:!0,startedAt:t,lastUpdatedAt:n,durationMs:t?Math.max(0,Date.now()-t):0,entries:hu(e.counters)}},rv=(e,t=1)=>{Ci(e,t)},ov=(e,t)=>{Ci(e,t)},sv=e=>{!rn()||typeof performance>"u"||typeof performance.mark!="function"||performance.mark(`openchamber.${e}`)},iv=(e,t)=>{if(!rn())return t();const n=tc();try{return t()}finally{Ci(e,tc()-n)}};typeof window<"u"&&(window.__openchamberStreamPerformance={setEnabled:my,reset:gy,getSnapshot:yy});var wy={};let st=null,nc=0;const qe=mr(),rc=qe.getItem("lastDirectory"),by=typeof rc=="string"&&rc.length>0,Wr=e=>{try{fy.getState().invalidateDirectory(e)}catch(t){console.warn("Failed to invalidate file search cache:",t)}},In=e=>Ye(e)??"",Sy=(e,t)=>{const n=e.trim();return n.startsWith("~")?n==="~"?t||n:(n.startsWith("~/")||n.startsWith("~\\"))&&t?`${t}${n.slice(1)}`:n:n},to=(e,t)=>{const n=Sy(e,t);return In(n)},Ty=()=>{const e=qe.getItem("homeDirectory");if(typeof e!="string"||e.trim().length===0)return null;const t=In(e);return t.length>0?t:null},vy=()=>{const e=qe.getItem("lastDirectory");if(typeof e!="string"||e.trim().length===0)return null;const t=In(e);return t.length>0?t:null},ky=()=>{if(typeof process>"u")return null;const e=wy,t=e?.HOME||e?.USERPROFILE||(e?.HOMEDRIVE&&e?.HOMEPATH?`${e.HOMEDRIVE}${e.HOMEPATH}`:void 0);if(typeof t=="string"&&t.trim().length>0){const r=In(t);return r.length>0?r:null}const n=process?.cwd?.();if(typeof n=="string"&&n.trim().length>0){const r=In(n);return r.length>0?r:null}return null},Ri=()=>{if(typeof window<"u"){if(st)return st;const t=typeof window.__OPENCHAMBER_HOME__=="string"&&window.__OPENCHAMBER_HOME__.length>0?window.__OPENCHAMBER_HOME__:null;if(t&&t.length>0)return st=t,qe.setItem("homeDirectory",t),t;const n=Ty();if(n&&!Me())return st=n,n}const e=ky();return e||"/"},Ey=e=>{const t=Ye(e);return t&&t!=="/"?t:null},Py=e=>(st=e,typeof window<"u"&&qe.setItem("homeDirectory",e),ft({homeDirectory:e}),e),Gs=async()=>{const e=r=>{const o=Ey(r);return o?Py(o):null};try{const r=await rt.getFilesystemHome(),o=e(r);if(o)return o}catch(r){console.warn("Failed to obtain filesystem home directory:",r)}try{const r=await rt.getSystemInfo(),o=e(r?.homeDirectory);if(o)return o}catch(r){console.warn("Failed to get home directory from system info:",r)}try{const r=await Gc(),o=e(r);if(o)return o}catch(r){console.warn("Failed to obtain desktop-integrated home directory:",r)}const t=Ri(),n=e(t);return n||t},Ay=()=>{if(!Me())return null;const e=zc()?.workspaceFolder;if(typeof e!="string"||e.trim().length===0)return null;const t=In(e);return t.length>0?t:null},ur=Ay()||Ri(),vo=(()=>{const e=vy();return e&&!Me()?to(e,ur):ur})();vo&&rt.setDirectory(vo);const Iy=!!(ur&&ur!=="/"),Ws=gt()(xn((e,t)=>({currentDirectory:vo,directoryHistory:[vo],historyIndex:0,homeDirectory:ur,hasPersistedDirectory:by,isHomeReady:Iy,isSwitchingDirectory:!1,setDirectory:(n,r)=>{const o=st||t().homeDirectory||qe.getItem("homeDirectory"),s=to(n,o);py()&&console.log("[DirectoryStore] setDirectory called with path:",s),rt.setDirectory(s),Wr(),e(i=>{const a=i.directoryHistory[i.historyIndex]===s,c=a?i.directoryHistory:[...i.directoryHistory.slice(0,i.historyIndex+1),s];return qe.setItem("lastDirectory",s),ft({lastDirectory:s}),{currentDirectory:s,directoryHistory:c,historyIndex:a?i.historyIndex:c.length-1,hasPersistedDirectory:!0,isHomeReady:!0,isSwitchingDirectory:!1}})},goBack:()=>{const n=t();if(n.historyIndex>0){const r=n.historyIndex-1,o=n.directoryHistory[r];rt.setDirectory(o),Wr(),qe.setItem("lastDirectory",o),ft({lastDirectory:o}),e({currentDirectory:o,historyIndex:r,hasPersistedDirectory:!0,isHomeReady:!0,isSwitchingDirectory:!1})}},goForward:()=>{const n=t();if(n.historyIndex<n.directoryHistory.length-1){const r=n.historyIndex+1,o=n.directoryHistory[r];rt.setDirectory(o),Wr(),qe.setItem("lastDirectory",o),ft({lastDirectory:o}),e({currentDirectory:o,historyIndex:r,hasPersistedDirectory:!0,isHomeReady:!0,isSwitchingDirectory:!1})}},goToParent:()=>{const{currentDirectory:n,setDirectory:r}=t(),o=st||t().homeDirectory||Ri();if(n===o)return;const s=wp(n);s&&r(s)},goHome:async()=>{const n=st||t().homeDirectory||await Gs();t().setDirectory(n)},synchronizeHomeDirectory:n=>{const r=t(),o=n;st=o;const s=r.homeDirectory!==o,i=qe.getItem("lastDirectory"),a=typeof i=="string"&&i.length>0,c=!a&&(r.currentDirectory==="/"||r.currentDirectory===r.homeDirectory||!r.currentDirectory);if(!s&&!c){r.isHomeReady||e({isHomeReady:!0});return}const l=typeof o=="string"&&o!==""&&o!=="/",u=r.currentDirectory?to(r.currentDirectory,o):r.currentDirectory,d=r.directoryHistory.map(b=>to(b,o)),f=d.some((b,w)=>b!==r.directoryHistory[w]),p=!!(u&&u!==r.currentDirectory),g={homeDirectory:o,hasPersistedDirectory:a,isHomeReady:l};if(c?(g.currentDirectory=o,g.directoryHistory=[o],g.historyIndex=0,g.isSwitchingDirectory=!1):(p||f)&&(g.currentDirectory=u,g.directoryHistory=d,g.historyIndex=Math.min(r.historyIndex,d.length-1),g.isSwitchingDirectory=!1),e(()=>g),(c||p)&&l){const b=c?o:u;rt.setDirectory(b),Wr(),qe.setItem("lastDirectory",b),ft({lastDirectory:b})}ft({homeDirectory:o})}}),{name:"directory-store"}));typeof window<"u"&&(Gs().then(e=>{Ws.getState().synchronizeHomeDirectory(e)}),Hc(()=>{st=null;const e=++nc;Gs().then(t=>{e===nc&&Ws.getState().synchronizeHomeDirectory(t)})}));const xy=(e,t)=>{const n=Ao();return n?n.openWebSocket(Sd(e),t):tf(new WebSocket(e))},mu=1,oc=512*1024,Cy=0,pn=1,Ry=15e3,Di=new TextEncoder,gu=new TextDecoder,Oi=Te(["interactive","command"]),yu=Te(["running","exited","error"]),Dy=Te(["node","bun"]),Mi=dr("type",[v({type:U("terminal")}),v({type:U("project-action"),actionId:m(),executionId:m()})]),Oy=v({sessionId:m(),cols:C(),rows:C(),status:yu,mode:Oi.optional(),purpose:Mi.optional()}),My=v({sessionId:m(),cwd:m(),status:Te(["running","exited"]),createdAt:C().nullable().optional().transform(e=>e??null),mode:Oi.optional(),purpose:Mi.optional()}),sc={mode:Oi.optional(),purpose:Mi.optional()},_y=dr("t",[v({t:U("hello")}),v({t:U("pong")}),v({t:U("error"),s:m().optional(),message:m().optional(),code:m().optional(),fatal:Fe().optional()}),v({t:U("snapshot"),s:m(),q:C().int().nonnegative().default(0),history:m().default(""),status:yu,cols:C().int().positive().optional(),rows:C().int().positive().optional(),exitCode:C().nullish().transform(e=>e??void 0),signal:C().nullable().optional(),runtime:Dy.optional(),ptyBackend:m().optional(),...sc}),v({t:U("output"),s:m(),q:C().int().nonnegative(),d:m(),r:m().optional()}),v({t:U("exit"),s:m(),q:C().int().nonnegative(),exitCode:C().nullish().transform(e=>e??void 0),signal:C().nullable().optional()}),v({t:U("restarted"),s:m(),q:C().int().nonnegative(),history:m().default(""),...sc})]),Ly=e=>{const t=Di.encode(JSON.stringify(e)),n=new Uint8Array(t.length+1);return n[0]=mu,n.set(t,1),n},Fy=e=>{let t=e instanceof ArrayBuffer?new Uint8Array(e):Di.encode(e);t[0]===mu&&(t=t.subarray(1));try{return _y.safeParse(JSON.parse(gu.decode(t))).data??null}catch{return null}};class Uy extends Error{code;constructor(t,n){super(t),this.name="TerminalRequestError",this.code=n}}const av=e=>e.cols!==void 0&&e.rows!==void 0?{cols:e.cols,rows:e.rows}:void 0,jy=v({error:m().optional(),code:m().optional()}),Mo=async(e,t)=>{const n=jy.safeParse(await e.json().catch(()=>null)).data;return new Uy(n?.error??t,n?.code??null)},Ny=e=>{const t=Di.encode(e);if(t.byteLength<=oc)return e;let n=t.byteLength-oc;for(;n<t.byteLength&&(t[n]&192)===128;)n+=1;return gu.decode(t.subarray(n))},By=v({sessions:N(ue())});class wu{constructor(t={refreshAuth:Co,openSocket:()=>xy(Ee().websocket("/api/terminal/ws")),clearUrlAuthToken:hr}){this.dependencies=t}socket=null;opening=null;subscribers=new Map;projections=new Map;reconnectTimer=null;keepaliveTimer=null;idleCloseTimer=null;failures=0;wakeCleanup=null;generation=0;disposed=!1;subscribe(t,n){this.cancelIdleClose();const r={handlers:n,lastSequence:-1},o=this.subscribers.get(t)??new Set,s=o.size===0;o.add(r),this.subscribers.set(t,o);const i=this.projections.get(t);i&&(r.lastSequence=i.sequence,n.onEvent({type:"snapshot",sequence:i.sequence,data:i.history,cols:i.cols,rows:i.rows,status:i.status,mode:i.mode,purpose:i.purpose,exitCode:i.exitCode,signal:i.signal,runtime:i.runtime,ptyBackend:i.ptyBackend}));const a=this.socket?.readyState===pn;return this.ensureConnected().then(()=>{const c=this.subscribers.get(t);s&&a&&c===o&&c.size>0&&this.send({t:"attach",v:3,s:t})}).catch(c=>{o.has(r)&&(n.onError?.(c,!1),this.scheduleReconnect())}),()=>{const c=this.subscribers.get(t);if(c?.delete(r),c?.size===0&&(this.subscribers.delete(t),this.projections.delete(t),this.send({t:"detach",v:3,s:t})),this.subscribers.size===0){if(this.cancelReconnect(),this.failures=0,this.socket?.readyState===pn){this.scheduleIdleClose();return}this.generation+=1,this.opening=null,this.closeSocket()}}}async write(t,n){if(n&&(await this.ensureConnected(),!this.send({t:"write",v:3,s:t,d:n})&&(this.closeSocket(),await this.ensureConnected(),!this.send({t:"write",v:3,s:t,d:n}))))throw new Error("Terminal connection is unavailable")}dispose(){this.disposed=!0,this.generation+=1,this.opening=null,this.subscribers.clear(),this.projections.clear(),this.reconnectTimer&&clearTimeout(this.reconnectTimer),this.reconnectTimer=null,this.cancelIdleClose(),this.wakeCleanup?.(),this.wakeCleanup=null,this.closeSocket()}forget(t){this.projections.delete(t)}noteResize(t,n,r){const o=this.projections.get(t);o&&this.projections.set(t,{...o,cols:n,rows:r})}async ensureConnected(){if(this.disposed)throw new Error("Terminal runtime changed");if(this.socket?.readyState===pn)return;if(this.opening)return await this.opening,this.socket?.readyState===pn?void 0:this.ensureConnected();const t=this.generation,n=(async()=>{if(await this.dependencies.refreshAuth(),t!==this.generation||this.disposed)throw new Error("Terminal runtime changed");await new Promise((r,o)=>{let s=!1,i=!1,a=!1,c=null;const l=()=>t===this.generation&&!this.disposed&&c!==null&&this.socket===c,u=()=>{a||i||!l()||(a=!0,this.dependencies.clearUrlAuthToken?.())},d=p=>{s||(s=!0,clearTimeout(f),p?o(p):r())},f=setTimeout(()=>{u(),c?.close(),d(new Error("Terminal connection timed out"))},1e4);try{const p=this.dependencies.openSocket();c=p,p.binaryType="arraybuffer",this.socket=p,p.onopen=()=>{if(!l()){p.close(),d(new Error("Terminal runtime changed"));return}i=!0,this.failures=0,this.send({t:"hello",v:3});for(const g of this.subscribers.keys())this.send({t:"attach",v:3,s:g});this.startKeepalive(),d()},p.onmessage=g=>{this.handleMessage(g.data)},p.onerror=()=>{const g=l();g&&u(),d(new Error("Terminal WebSocket failed")),g&&this.subscribers.size>0&&this.scheduleReconnect()},p.onclose=()=>{const g=l();g&&(this.stopKeepalive(),u()),this.socket===p&&(this.socket=null),d(new Error("Terminal WebSocket closed")),g&&this.subscribers.size>0&&this.scheduleReconnect()}}catch(p){d(p instanceof Error?p:new Error("Terminal WebSocket failed")),!this.disposed&&this.subscribers.size>0&&this.scheduleReconnect()}})})();this.opening=n;try{await n}finally{this.opening===n&&(this.opening=null)}}handleMessage(t){const n=Fy(t);if(!n||n.t==="hello"||n.t==="pong")return;if(n.t==="error"){const s=new Error(n.message??"Terminal error");s.code=n.code;const i=n.s?[n.s]:[...this.subscribers.keys()];for(const a of i)for(const c of this.subscribers.get(a)??[])c.handlers.onError?.(s,n.fatal===!0);return}if(!n.s)return;const r=this.subscribers.get(n.s);if(!r)return;if(n.t==="snapshot"){const s={sequence:n.q??0,history:n.history??"",cols:n.cols,rows:n.rows,status:n.status,mode:n.mode,purpose:n.purpose,exitCode:n.exitCode,signal:n.signal??null,runtime:n.runtime,ptyBackend:n.ptyBackend};this.projections.set(n.s,s);for(const i of r)i.lastSequence=s.sequence,i.handlers.onEvent({type:"snapshot",sequence:s.sequence,data:s.history,cols:s.cols,rows:s.rows,status:s.status,mode:s.mode,purpose:s.purpose,exitCode:s.exitCode,signal:s.signal,runtime:s.runtime,ptyBackend:s.ptyBackend});return}const o=this.projections.get(n.s);o&&n.q>o.sequence&&(n.t==="output"?this.projections.set(n.s,{...o,sequence:n.q,history:Ny(o.history+(n.r??n.d))}):n.t==="exit"?this.projections.set(n.s,{...o,sequence:n.q,status:"exited",exitCode:n.exitCode,signal:n.signal??null}):n.t==="restarted"&&this.projections.set(n.s,{...o,sequence:n.q,history:n.history??"",status:"running",mode:n.mode??o.mode,purpose:n.purpose??o.purpose,exitCode:void 0,signal:null}));for(const s of r)n.q<=s.lastSequence||(s.lastSequence=n.q,n.t==="output"?s.handlers.onEvent({type:"data",sequence:n.q,data:n.d,replayData:n.r}):n.t==="exit"?s.handlers.onEvent({type:"exit",sequence:n.q,exitCode:n.exitCode,signal:n.signal??null}):n.t==="restarted"&&s.handlers.onEvent({type:"snapshot",sequence:n.q,data:n.history??"",status:"running",mode:n.mode??o?.mode,purpose:n.purpose??o?.purpose}))}send(t){if(!this.socket||this.socket.readyState!==pn)return!1;try{return this.socket.send(Ly(t)),!0}catch{return!1}}scheduleReconnect(){if(this.reconnectTimer||this.disposed||this.subscribers.size===0)return;this.failures+=1;const n=typeof document<"u"&&document.visibilityState==="hidden"||typeof navigator<"u"&&!navigator.onLine?6e4:Math.min(500*2**Math.min(this.failures-1,10),8e3);for(const o of this.subscribers.values())for(const s of o)s.handlers.onEvent({type:"reconnecting",attempt:this.failures,maxAttempts:Number.POSITIVE_INFINITY});const r=()=>{typeof document<"u"&&document.visibilityState==="hidden"||typeof navigator<"u"&&!navigator.onLine||(this.reconnectTimer&&clearTimeout(this.reconnectTimer),this.reconnectTimer=null,this.wakeCleanup?.(),this.wakeCleanup=null,this.ensureConnected().catch(()=>this.scheduleReconnect()))};typeof window<"u"&&window.addEventListener("online",r),typeof document<"u"&&document.addEventListener("visibilitychange",r),this.wakeCleanup=()=>{typeof window<"u"&&window.removeEventListener("online",r),typeof document<"u"&&document.removeEventListener("visibilitychange",r)},this.reconnectTimer=setTimeout(r,n)}scheduleIdleClose(){this.idleCloseTimer||this.disposed||(this.idleCloseTimer=setTimeout(()=>{this.idleCloseTimer=null,!(this.disposed||this.subscribers.size>0)&&(this.generation+=1,this.opening=null,this.closeSocket())},Ry))}cancelIdleClose(){this.idleCloseTimer&&(clearTimeout(this.idleCloseTimer),this.idleCloseTimer=null)}startKeepalive(){this.stopKeepalive(),this.keepaliveTimer=setInterval(()=>this.send({t:"ping",v:3}),45e3)}stopKeepalive(){this.keepaliveTimer&&clearInterval(this.keepaliveTimer),this.keepaliveTimer=null}cancelReconnect(){this.reconnectTimer&&clearTimeout(this.reconnectTimer),this.reconnectTimer=null,this.wakeCleanup?.(),this.wakeCleanup=null}closeSocket(){this.stopKeepalive();const t=this.socket;this.socket=null,t&&(t.readyState===Cy||t.readyState===pn)&&t.close()}}let _t=new wu;async function Hy(e){const t=await y("/api/terminal/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});if(!t.ok)throw await Mo(t,"Failed to create terminal session");const n=await t.json().catch(()=>null),r=Oy.safeParse(n).data;if(!r)throw new Error("Failed to create terminal session");return r}async function zy(e){const t=await y(`/api/terminal/sessions?cwd=${encodeURIComponent(e)}`);if(!t.ok)throw await Mo(t,"Failed to list terminal sessions");const n=await t.json().catch(()=>null),r=By.safeParse(n).data?.sessions;if(!Array.isArray(r))throw new Error("Failed to list terminal sessions");const o=[];for(const s of r){const i=My.safeParse(s).data;i&&o.push(i)}return o}async function $y(e){e.length!==0&&await Dn("/api/terminal/touch","POST",{sessionIds:e})}async function Gy(){const e=await y("/api/terminal/shells");if(!e.ok)throw await Mo(e,"Failed to list terminal shells");const t=await e.json().catch(()=>[]);return Array.isArray(t)?t.filter(n=>n&&typeof n=="object"&&bi(n.id)&&typeof n.name=="string"&&typeof n.supportsLogin=="boolean"):[]}function Wy(e,t,n){return _t.subscribe(e,{onEvent:t,onError:n})}async function qy(e,t){await _t.write(e,t)}async function Dn(e,t,n){const r={method:t};n!==void 0&&(r.headers={"Content-Type":"application/json"},r.body=JSON.stringify(n));const o=await y(e,r);if(!o.ok)throw await Mo(o,"Terminal command failed");return o}async function Ky(e,t,n){await Dn(`/api/terminal/${e}/resize`,"POST",{cols:t,rows:n}),_t.noteResize(e,t,n)}async function Vy(e,t){await Dn(`/api/terminal/${e}/appearance`,"POST",t)}async function Jy(e){await Dn(`/api/terminal/${e}`,"DELETE"),_t.forget(e)}async function Yy(e,t){return(await Dn(`/api/terminal/${e}/restart`,"POST",t)).json()}async function Qy(e){const n=await(await Dn("/api/terminal/force-kill","POST",e)).json().catch(()=>null);if(Array.isArray(n?.killedSessionIds))for(const r of n.killedSessionIds)typeof r=="string"&&_t.forget(r);else e.sessionId&&_t.forget(e.sessionId)}function cv(){_t.dispose(),_t=new wu}const Xy=()=>({async listShells(){return Gy()},async listSessions(e){return zy(e)},async touchSessions(e){await $y(e)},async createSession(e){return Hy(e)},connect(e,t){const n=Wy(e,t.onEvent,t.onError);return{close:()=>n()}},async sendInput(e,t){await qy(e,t)},async resize(e){await Ky(e.sessionId,e.cols,e.rows)},async updateAppearance(e,t){await Vy(e,t)},async close(e){await Jy(e)},async restartSession(e,t){return Yy(e,{cwd:t.cwd??"",cols:t.cols,rows:t.rows,themeMode:t.themeMode,terminalBackground:t.terminalBackground,terminalForeground:t.terminalForeground,shell:t.shell,loginShell:t.loginShell})},async forceKill(e){await Qy(e)}}),qs=new Set,Zy=e=>(qs.add(e),()=>{qs.delete(e)}),ew=e=>{for(const t of qs)t(e)},Ks=new Set,tw=(e,t)=>JSON.stringify([t,Ye(e)]);function lv(e){return Ks.add(e),()=>{Ks.delete(e)}}function nw(e,t){const n=tw(e,t);for(const r of Ks)r(n)}class rw extends Error{reason;constructor(t,n){super(t),this.name="GitPathUnavailableError",this.reason=n}}const ow=v({error:m(),code:Te(["path_not_found","nested_repository","untracked_directory"])}),bu=v({headCommit:m().nullable(),indexCommit:m().nullable(),worktreeCommit:m().nullable(),hasTrackedChanges:Fe(),hasUntrackedFiles:Fe(),hasConflict:Fe()}),A="/api/git",Su=v({diff:m()}),sw=v({files:N(v({path:m(),status:m()}))}),iw=v({error:m()}),aw=v({files:N(v({path:m(),previousPath:m().optional(),changeType:m(),insertions:C(),deletions:C(),isBinary:Fe()}))}),ic=v({hash:m(),date:m(),message:m(),refs:m(),body:m(),author_name:m(),author_email:m(),filesChanged:C(),insertions:C(),deletions:C(),parents:N(m())}),cw=v({all:N(ic),latest:ic.nullable(),total:C()}),lw=v({diff:m(),submodule:bu.nullable().default(null)}),uw=v({original:m(),modified:m(),path:m(),isBinary:Fe().optional(),submodule:bu.nullable().default(null)});async function Tu(e,t){const n=ow.safeParse(await e.json().catch(()=>null));return n.success&&(e.status===404||e.status===422)?new rw(n.data.error,n.data.code):new Error(`${t}: ${e.statusText}`)}async function _o(e,t){const n=iw.safeParse(await e.json().catch(()=>null));return new Error(n.success?n.data.error:`${t}: ${e.statusText}`)}const dw=1200,fw=5e3,Vs=new Map,qn=new Map,vu=new Map,ac=new Map,qr=new Map,ku=e=>e.trim(),_i=(e,t)=>JSON.stringify([e,ku(t)]),Eu=(e,t,n)=>JSON.stringify([e,ku(t),n??"full"]),Js=(e,t)=>vu.get(_i(e,t))??0,Pu=(e,t)=>{const n=_i(e,t);vu.set(n,Js(e,t)+1);for(const r of[void 0,"light"]){const o=Eu(e,t,r);Vs.delete(o),qn.delete(o)}};Zy(e=>{Pu(G(),e)});const br=e=>{ew(e)},ee=async(e,t)=>{const n=await t.json();return br(e),n};function I(e,t,n){const r={...n};return t&&(r.directory=t),Ee().api(e,r)}async function pw(e){const t=_i(G(),e),n=Date.now(),r=ac.get(t);if(r&&r.expiresAt>n)return r.value;const o=qr.get(t);if(o)return o;const s=(async()=>{const i=await y(I(`${A}/check`,e));if(!i.ok)throw new Error(`Failed to check git repository: ${i.statusText}`);const c=!!(await i.json()).isGitRepository;return ac.set(t,{value:c,expiresAt:Date.now()+fw}),c})();qr.set(t,s);try{return await s}finally{qr.get(t)===s&&qr.delete(t)}}class hw extends Error{constructor(){super("Nested git repository discovery is not supported by this runtime"),this.name="GitDirectoriesUnsupportedError"}}async function uv(e){const t=await y("/api/fs/git-dirs",{query:{path:e,directory:e}});if(t.status===501)throw new hw;if(!t.ok)throw new Error(`Failed to list git directories: ${t.statusText}`);const n=await t.json();if(!Array.isArray(n?.repositories))throw new Error("Unexpected git directories response");return n.repositories.map(r=>Ye(r?.path??null)).filter(r=>r!==null)}async function mw(e,t){const n=t?.mode,r=G();t?.fresh&&Pu(r,e);const o=Eu(r,e,n),s=Date.now(),i=Vs.get(o);if(i&&i.expiresAt>s)return i.value;const a=qn.get(o);if(a)return a;const c=(async()=>{const l=Js(r,e),u=await y(I(`${A}/status`,e,n?{mode:n}:void 0));if(!u.ok)throw new Error(`Failed to get git status: ${u.statusText}`);const d=await u.json();return Js(r,e)===l&&Vs.set(o,{value:d,expiresAt:Date.now()+dw}),d})();qn.set(o,c);try{return await c}finally{qn.get(o)===c&&qn.delete(o)}}async function dv(e){const t=await y(I(`${A}/primary-root`,e));if(!t.ok)throw new Error(`Failed to resolve git primary root: ${t.statusText}`);const n=await t.json().catch(()=>({}));return{root:typeof n.root=="string"&&n.root?n.root:e}}async function fv(e){const t=await y(I(`${A}/toplevel`,e));if(!t.ok)throw new Error(`Failed to resolve git toplevel: ${t.statusText}`);const n=await t.json().catch(()=>({}));return{root:typeof n.root=="string"&&n.root?n.root:e}}async function pv(e,t){const n=await y(I(`${A}/commit-summaries`,e),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({shas:t})});if(!n.ok)throw new Error(`Failed to get git commit summaries: ${n.statusText}`);const r=await n.json().catch(()=>({}));return{commits:Array.isArray(r.commits)?r.commits.map(o=>({sha:typeof o.sha=="string"?o.sha:"",short:typeof o.short=="string"?o.short:"",subject:typeof o.subject=="string"?o.subject:""})).filter(o=>o.sha&&o.short):[]}}async function gw(e,t){const{path:n,staged:r,contextLines:o}=t;if(!n)throw new Error("path is required to fetch git diff");const s=await y(I(`${A}/diff`,e,{path:n,staged:r?"true":void 0,context:o}));if(!s.ok)throw await Tu(s,"Failed to get git diff");return lw.parse(await s.json())}async function yw(e,t){const{base:n,head:r,path:o,contextLines:s,includeWorkingTree:i}=t;if(!n||!r)throw new Error("base and head are required to fetch git range diff");const a=await y(I(`${A}/range-diff`,e,{base:n,head:r,path:o||void 0,context:s,includeWorkingTree:i}));if(!a.ok)throw await _o(a,"Failed to get git range diff");return Su.parse(await a.json())}async function ww(e,t){const n=await y(I(`${A}/commit-diff`,e,{hash:t.hash,path:t.path,previousPath:t.previousPath,context:t.contextLines}));if(!n.ok)throw await _o(n,"Failed to get commit diff");return Su.parse(await n.json())}async function bw(e,t){const{base:n,head:r,includeWorkingTree:o}=t;if(!n||!r)throw new Error("base and head are required to fetch git range files");const s=await y(I(`${A}/range-files`,e,{base:n,head:r,includeWorkingTree:o}));if(!s.ok)throw await _o(s,"Failed to get git range files");return sw.parse(await s.json()).files}async function Sw(e,t){if(!t)throw new Error("branch is required to get branch base");const n=await y(I(`${A}/branch-base`,e,{branch:t}));if(!n.ok)throw new Error(`Failed to get branch base: ${n.statusText}`);return n.json()}async function Tw(e,t){const{path:n,staged:r}=t;if(!n)throw new Error("path is required to fetch git file diff");const o=await y(I(`${A}/file-diff`,e,{path:n,staged:r?"true":void 0}));if(!o.ok)throw await Tu(o,"Failed to get git file diff");return uw.parse(await o.json())}async function vw(e,t,n){if(!t)throw new Error("path is required to revert git changes");const r=await y(I(`${A}/revert`,e),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:t,scope:n?.scope})});if(!r.ok){const o=await r.json().catch(()=>({error:r.statusText}));throw new Error(o.error||"Failed to revert git changes")}br(e)}async function kw(e,t){await Au(e,[t])}async function Au(e,t){const n=t.map(o=>o.trim()).filter(Boolean);if(n.length===0)throw new Error("path is required to stage git changes");const r=await y(I(`${A}/stage`,e),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({paths:n})});if(!r.ok){const o=await r.json().catch(()=>({error:r.statusText}));throw new Error(o.error||"Failed to stage git changes")}br(e)}async function Ew(e,t){await Iu(e,[t])}async function Iu(e,t){const n=t.map(o=>o.trim()).filter(Boolean);if(n.length===0)throw new Error("path is required to unstage git changes");const r=await y(I(`${A}/unstage`,e),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({paths:n})});if(!r.ok){const o=await r.json().catch(()=>({error:r.statusText}));throw new Error(o.error||"Failed to unstage git changes")}br(e)}async function Pw(e,t,n){await Li(e,t,n,"stage")}async function Aw(e,t,n){await Li(e,t,n,"unstage")}async function Iw(e,t,n){await Li(e,t,n,"discard")}async function Li(e,t,n,r){if(!t)throw new Error("path is required to apply a git hunk");if(typeof n!="string"||!n.trim())throw new Error("patch is required to apply a git hunk");const o=await y(I(`${A}/apply-hunk`,e),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:t,patch:n,action:r})});if(!o.ok){const s=await o.json().catch(()=>({error:o.statusText}));throw new Error(s.error||"Failed to apply git hunk")}br(e)}async function xw(e){if(!e)return!1;const t=await y(I(`${A}/worktree-type`,e));if(!t.ok)throw new Error(`Failed to detect worktree type: ${t.statusText}`);return!!(await t.json()).linked}async function Cw(e){const t=await y(I(`${A}/branches`,e));if(!t.ok)throw new Error(`Failed to get branches: ${t.statusText}`);return t.json()}async function Rw(e,t){const n=await y(I(`${A}/branch-push-status`,e),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({branches:t})});if(!n.ok)throw new Error(`Failed to get branch push status: ${n.statusText}`);return n.json()}async function Dw(e,t){if(!t?.branch)throw new Error("branch is required to delete a branch");const n=await y(I(`${A}/branches`,e),{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});if(!n.ok){const r=await n.json().catch(()=>({error:n.statusText}));throw new Error(r.error||"Failed to delete branch")}return ee(e,n)}async function Ow(e,t){if(!t?.branch)throw new Error("branch is required to delete remote branch");const n=await y(I(`${A}/remote-branches`,e),{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});if(!n.ok){const r=await n.json().catch(()=>({error:n.statusText}));throw new Error(r.error||"Failed to delete remote branch")}return ee(e,n)}async function Mw(e,t){const n=t?.remote?.trim();if(!n)throw new Error("remote is required to remove a remote");const r=await y(I(`${A}/remotes`,e),{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({remote:n})});if(!r.ok){const o=await r.json().catch(()=>({error:r.statusText}));throw new Error(o.error||"Failed to remove remote")}return ee(e,r)}async function _w(e,t,n){if(!Array.isArray(t)||t.length===0)throw new Error("No files provided to generate commit message");const r={files:t};n?.zenModel&&(r.zenModel=n.zenModel),n?.providerId&&(r.providerId=n.providerId),n?.modelId&&(r.modelId=n.modelId);const o=await y(I(`${A}/commit-message`,e),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});if(!o.ok){const c=await o.json().catch(()=>({error:o.statusText}));console.error("[git-generation][browser] http error",{status:o.status,statusText:o.statusText,error:c});const l=typeof c?.traceId=="string"&&c.traceId?` (traceId: ${c.traceId})`:"";throw new Error(`${c.error||"Failed to generate commit message"}${l}`)}const s=await o.json();if(!s?.message||typeof s.message!="object")throw new Error("Malformed commit generation response");const i=typeof s.message.subject=="string"&&s.message.subject.trim().length>0?s.message.subject.trim():"",a=Array.isArray(s.message.highlights)?s.message.highlights.filter(c=>typeof c=="string"&&c.trim().length>0).map(c=>c.trim()):[];return{message:{subject:i,highlights:a}}}async function Lw(e,t){const{base:n,head:r,context:o,zenModel:s,providerId:i,modelId:a}=t;if(!n||!r)throw new Error("base and head are required");const c={base:n,head:r};o?.trim()&&(c.context=o.trim()),s&&(c.zenModel=s),i&&(c.providerId=i),a&&(c.modelId=a);const l=await y(I(`${A}/pr-description`,e),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(c)});if(!l.ok){const p=await l.json().catch(()=>({error:l.statusText}));throw new Error(p.error||"Failed to generate PR description")}const u=await l.json().catch(()=>null),d=typeof u?.title=="string"?u.title:"",f=typeof u?.body=="string"?u.body:"";if(!d&&!f)throw new Error("Malformed PR description response");return{title:d,body:f}}async function cc(e){const t=await y(I(`${A}/worktrees`,e));if(!t.ok){const n=await t.json().catch(()=>({error:t.statusText}));throw new Error(n.error||"Failed to list worktrees")}return t.json()}async function lc(e,t){const n=await y(I(`${A}/worktrees/validate`,e),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t??{})});if(!n.ok){const r=await n.json().catch(()=>({error:n.statusText}));throw new Error(r.error||"Failed to validate worktree")}return n.json()}async function Fw(e){const t=await y(I(`${A}/worktrees/bootstrap-status`,e));if(!t.ok){const n=await t.json().catch(()=>({error:t.statusText}));throw new Error(n.error||"Failed to get worktree bootstrap status")}return t.json()}async function Uw(e,t){const n=await y(I(`${A}/worktrees/preview`,e),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t??{})});if(!n.ok){const r=await n.json().catch(()=>({error:n.statusText}));throw new Error(r.error||"Failed to preview worktree")}return n.json()}async function uc(e,t){const n=await y(I(`${A}/worktrees`,e),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t??{})});if(!n.ok){const r=await n.json().catch(()=>({error:n.statusText}));throw new Error(r.error||"Failed to create worktree")}return n.json()}async function dc(e,t){const n=await y(I(`${A}/worktrees`,e),{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify(t??{})});if(!n.ok){const r=await n.json().catch(()=>({error:n.statusText}));throw new Error(r.error||"Failed to delete worktree")}return n.json()}async function jw(e,t,n={}){const r=await y(I(`${A}/commit`,e),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:t,addAll:n.addAll??!1,files:n.files,stageFiles:n.stageFiles})});if(!r.ok){const o=await r.json().catch(()=>({error:r.statusText}));throw new Error(o.error||"Failed to create commit")}return ee(e,r)}async function Nw(e,t={}){const n=G(),r=await y(I(`${A}/push`,e),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});if(!r.ok){const s=await r.json().catch(()=>({error:r.statusText}));throw new Error(s.error||"Failed to push")}const o=await ee(e,r);return o.success&&nw(e,n),o}async function Bw(e,t={}){const n=await y(I(`${A}/pull`,e),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});if(!n.ok){const r=await n.json().catch(()=>({error:n.statusText}));throw new Error(r.error||"Failed to pull")}return ee(e,n)}async function Hw(e,t={}){const n=await y(I(`${A}/fetch`,e),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});if(!n.ok){const r=await n.json().catch(()=>({error:n.statusText}));throw new Error(r.error||"Failed to fetch")}return ee(e,n)}async function zw(e){const t=await y(I(`${A}/stashes`,e));if(!t.ok){const n=await t.json().catch(()=>({error:t.statusText}));throw new Error(n.error||"Failed to list stashes")}return t.json()}async function $w(e,t){const n=await y(I(`${A}/stashes/file-counts`,e),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refs:t})});if(!n.ok){const r=await n.json().catch(()=>({error:n.statusText}));throw new Error(r.error||"Failed to count stash files")}return n.json()}async function xu(e,t={}){const n=await y(I(`${A}/stash`,e),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});if(!n.ok){const r=await n.json().catch(()=>({error:n.statusText}));throw new Error(r.error||"Failed to stash changes")}return ee(e,n)}const Fi=async(e,t,n)=>{const r=await y(I(`${A}/${t}`,e),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)});if(!r.ok){const o=await r.json().catch(()=>({error:r.statusText}));throw new Error(o.error||`Failed to ${t}`)}return ee(e,r)},Gw=(e,t)=>Fi(e,"stash/apply",t),Cu=(e,t)=>Fi(e,"stash/pop",t),Ww=(e,t)=>Fi(e,"stash/drop",t);async function qw(e,t){const n=await y(I(`${A}/checkout`,e),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({branch:t})});if(!n.ok){const r=await n.json().catch(()=>({error:n.statusText}));throw new Error(r.error||"Failed to checkout branch")}return ee(e,n)}async function Kw(e,t,n){const r=await y(I(`${A}/branches`,e),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:t,startPoint:n})});if(!r.ok){const o=await r.json().catch(()=>({error:r.statusText}));throw new Error(o.error||"Failed to create branch")}return ee(e,r)}async function Vw(e,t,n){const r=await y(I(`${A}/branches/rename`,e),{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldName:t,newName:n})});if(!r.ok){const o=await r.json().catch(()=>({error:r.statusText}));throw new Error(o.error||"Failed to rename branch")}return ee(e,r)}async function Jw(e,t={}){const n=await y(I(`${A}/log`,e,{maxCount:t.maxCount,from:t.from,to:t.to,file:t.file,all:t.all?"true":void 0}));if(!n.ok){const r=await n.json().catch(()=>({error:n.statusText}));throw new Error(`Failed to get git log: ${r.error||n.statusText}`)}return cw.parse(await n.json())}async function Yw(e,t){const n=await y(I(`${A}/commit-files`,e,{hash:t}));if(!n.ok)throw await _o(n,"Failed to get commit files");return aw.parse(await n.json())}async function hv(e,t,n,r){const o=await y(I(`${A}/commit-file-diff`,e,{hash:t,path:n,binary:r?"true":void 0}));if(!o.ok)throw new Error(`Failed to get commit file diff: ${o.statusText}`);return o.json()}async function Qw(){const e=await y(I(`${A}/identities`,void 0));if(!e.ok)throw new Error(`Failed to get git identities: ${e.statusText}`);return e.json()}async function Xw(e){const t=await y(I(`${A}/identities`,void 0),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});if(!t.ok){const n=await t.json().catch(()=>({error:t.statusText}));throw new Error(n.error||"Failed to create git identity")}return t.json()}async function Zw(e,t){const n=await y(I(`${A}/identities/${e}`,void 0),{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});if(!n.ok){const r=await n.json().catch(()=>({error:n.statusText}));throw new Error(r.error||"Failed to update git identity")}return n.json()}async function eb(e){const t=await y(I(`${A}/identities/${e}`,void 0),{method:"DELETE"});if(!t.ok){const n=await t.json().catch(()=>({error:t.statusText}));throw new Error(n.error||"Failed to delete git identity")}}async function tb(e){if(!e)return null;const t=await y(I(`${A}/current-identity`,e));if(!t.ok)throw new Error(`Failed to get current git identity: ${t.statusText}`);const n=await t.json();return n?{userName:n.userName??null,userEmail:n.userEmail??null,sshCommand:n.sshCommand??null}:null}async function nb(e){if(!e)return!1;const t=await y(I(`${A}/has-local-identity`,e));if(!t.ok)throw new Error(`Failed to check local identity: ${t.statusText}`);return(await t.json().catch(()=>null))?.hasLocalIdentity===!0}async function mv(){const e=await y(I(`${A}/global-identity`,void 0));if(!e.ok)throw new Error(`Failed to get global git identity: ${e.statusText}`);const t=await e.json();return!t||!t.userName&&!t.userEmail?null:{userName:t.userName??null,userEmail:t.userEmail??null,sshCommand:t.sshCommand??null}}async function rb(e,t){const n=await y(I(`${A}/set-identity`,e),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({profileId:t})});if(!n.ok){const r=await n.json().catch(()=>({error:n.statusText}));throw new Error(r.error||"Failed to set git identity")}return n.json()}async function gv(){const e=await y(I(`${A}/discover-credentials`,void 0));if(!e.ok)throw new Error(`Failed to discover git credentials: ${e.statusText}`);return e.json()}async function yv(e,t){if(!e)return null;const n=await y(I(`${A}/remote-url`,e,{remote:t}));return n.ok?(await n.json()).url??null:null}async function ob(e){const t=await y(I(`${A}/remotes`,e));if(!t.ok)throw new Error(`Failed to get remotes: ${t.statusText}`);return t.json()}async function sb(e,t){const n=await y(I(`${A}/rebase`,e),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});if(!n.ok){const r=await n.json().catch(()=>({error:n.statusText}));throw new Error(r.error||"Failed to rebase")}return ee(e,n)}async function ib(e){const t=await y(I(`${A}/rebase/abort`,e),{method:"POST"});if(!t.ok){const n=await t.json().catch(()=>({error:t.statusText}));throw new Error(n.error||"Failed to abort rebase")}return ee(e,t)}async function ab(e,t){const n=await y(I(`${A}/merge`,e),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});if(!n.ok){const r=await n.json().catch(()=>({error:n.statusText}));throw new Error(r.error||"Failed to merge")}return ee(e,n)}async function cb(e,t){const n=await y(I(`${A}/checkout-commit`,e),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({hash:t})});if(!n.ok){const r=await n.json().catch(()=>({error:n.statusText}));throw new Error(r.error||"Failed to checkout commit")}return ee(e,n)}async function lb(e,t){const n=await y(I(`${A}/cherry-pick`,e),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({hash:t})});if(!n.ok){const r=await n.json().catch(()=>({error:n.statusText}));throw new Error(r.error||"Failed to cherry-pick")}return ee(e,n)}async function ub(e,t){const n=await y(I(`${A}/revert-commit`,e),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({hash:t})});if(!n.ok){const r=await n.json().catch(()=>({error:n.statusText}));throw new Error(r.error||"Failed to revert commit")}return ee(e,n)}async function db(e,t,n,r){const o=await y(I(`${A}/reset-to-commit`,e),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({hash:t,mode:n,force:r})});if(!o.ok){const s=await o.json().catch(()=>({error:o.statusText}));throw new Error(s.error||"Failed to reset")}return ee(e,o)}async function fb(e){const t=await y(I(`${A}/merge/abort`,e),{method:"POST"});if(!t.ok){const n=await t.json().catch(()=>({error:t.statusText}));throw new Error(n.error||"Failed to abort merge")}return ee(e,t)}async function pb(e){const t=await y(I(`${A}/rebase/continue`,e),{method:"POST"});if(!t.ok){const n=await t.json().catch(()=>({error:t.statusText}));throw new Error(n.error||"Failed to continue rebase")}return ee(e,t)}async function hb(e){const t=await y(I(`${A}/merge/continue`,e),{method:"POST"});if(!t.ok){const n=await t.json().catch(()=>({error:t.statusText}));throw new Error(n.error||"Failed to continue merge")}return ee(e,t)}async function mb(e,t){return await xu(e,{message:t?.message}),{success:!0}}async function gb(e){return await Cu(e,{ref:"stash@{0}"}),{success:!0}}async function yb(e){const t=await y(I(`${A}/conflict-details`,e));if(!t.ok)throw new Error(`Failed to get conflict details: ${t.statusText}`);return t.json()}async function wb(e,t){const n=await y(`${A}/validate-directory`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({directory:e,worktreeRoot:t})});if(!n.ok)throw new Error(`Failed to validate worktree directory: ${n.statusText}`);return n.json()}async function bb(e){const t=await y(`${A}/canonicalize-worktree-state`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({directory:e})});if(!t.ok)throw new Error(`Failed to canonicalize worktree state: ${t.statusText}`);return t.json()}const Sb=()=>({checkIsGitRepository:pw,getGitStatus:mw,getGitDiff:gw,getGitFileDiff:Tw,getGitRangeDiff:yw,getGitRangeFiles:bw,getBranchBase:Sw,revertGitFile:vw,stageGitFile:kw,stageGitFiles:Au,unstageGitFile:Ew,unstageGitFiles:Iu,stageGitHunk:Pw,unstageGitHunk:Aw,revertGitHunk:Iw,isLinkedWorktree:xw,getGitBranches:Cw,getGitUnpushedBranchCounts:Rw,deleteGitBranch:Dw,deleteRemoteBranch:Ow,removeRemote:Mw,generateCommitMessage:_w,generatePullRequestDescription:Lw,listGitWorktrees:cc,validateGitWorktree:lc,createGitWorktree:uc,deleteGitWorktree:dc,validateWorktreeDirectory:wb,canonicalizeWorktreeState:bb,createGitCommit(e,t,n){return jw(e,t,n)},gitPush:Nw,gitPull:Bw,gitFetch:Hw,listGitStashes:zw,countGitStashFiles:$w,stashGitChanges:xu,applyGitStash:Gw,popGitStash:Cu,dropGitStash:Ww,checkoutBranch:qw,createBranch:Kw,renameBranch:Vw,getGitLog(e,t){return Jw(e,t)},getCommitFiles:Yw,getGitCommitDiff:ww,getCurrentGitIdentity:tb,hasLocalIdentity:nb,setGitIdentity:rb,getGitIdentities:Qw,createGitIdentity:Xw,updateGitIdentity:Zw,deleteGitIdentity:eb,getRemotes:ob,rebase:sb,abortRebase:ib,continueRebase:pb,merge:ab,abortMerge:fb,continueMerge:hb,checkoutCommit:cb,cherryPick:lb,revertCommit:ub,resetToCommit:db,stash:mb,stashPop:gb,getConflictDetails:yb,worktree:{list:cc,validate:lc,bootstrapStatus:Fw,preview:Uw,create:uc,remove:dc}}),ce=e=>e.replace(/\\/g,"/"),Tb=(e,t)=>{if(!t||!Array.isArray(t.entries))throw new Yt("Directory listing returned an invalid response",{reason:"invalid-response"});return{directory:ce(t?.directory||t?.path||e),entries:t.entries.filter(r=>!!(r&&typeof r.name=="string"&&typeof r.path=="string")).map(r=>({name:r.name,path:ce(r.path),isDirectory:!!r.isDirectory}))}},He=(e,t)=>{const n=t||e?.();return n?{"x-opencode-directory":n}:void 0},vb=({getDirectory:e})=>({async listDirectory(t,n){const r=ce(t),o=new URLSearchParams;r&&o.set("path",r),n?.respectGitignore&&o.set("respectGitignore","true");const s=await y("/api/fs/list",{query:o,headers:He(e)});if(!s.ok){const a=await s.json().catch(()=>({error:s.statusText}));throw new Yt(a.error||"Failed to list directory",{reason:mo(a.reason),status:s.status})}const i=await s.json();return Tb(r,i)},async search(t){const n=new URLSearchParams,r=ce(t.directory);r&&n.set("directory",r),n.set("query",t.query),n.set("dirs","false"),n.set("type","file"),typeof t.maxResults=="number"&&Number.isFinite(t.maxResults)&&n.set("limit",String(t.maxResults));const o=await y("/api/find/file",{query:n,headers:He(e)});if(!o.ok){const a=await o.json().catch(()=>({error:o.statusText}));throw new Error(a.error||"Failed to search files")}const s=await o.json();return(Array.isArray(s)?s:[]).map(a=>({path:ce(`${r}/${a}`),preview:[ce(a)]}))},async createDirectory(t){const n=ce(t),r=await y("/api/fs/mkdir",{method:"POST",headers:{"Content-Type":"application/json",...He(e)},body:JSON.stringify({path:n})});if(!r.ok){const s=await r.json().catch(()=>({error:r.statusText}));throw new Error(s.error||"Failed to create directory")}const o=await r.json();return{success:!!o?.success,path:typeof o?.path=="string"?ce(o.path):n}},async statFile(t,n){const r=ce(t),o=new URLSearchParams({path:r});n?.allowOutsideWorkspace&&o.set("allowOutsideWorkspace","true"),n?.outsideFileGrant&&o.set("outsideFileGrant",n.outsideFileGrant);const s=await y("/api/fs/stat",{query:o,headers:He(e,n?.directory)});if(!s.ok){const a=await s.json().catch(()=>({error:s.statusText}));throw new Error(a.error||"Failed to stat file")}const i=await s.json().catch(()=>({}));return{path:typeof i.path=="string"?ce(i.path):r,isFile:!!i.isFile,size:typeof i.size=="number"?i.size:0,mtimeMs:typeof i.mtimeMs=="number"?i.mtimeMs:void 0}},async readFile(t,n){const r=ce(t),o=new URLSearchParams({path:r});n?.allowOutsideWorkspace&&o.set("allowOutsideWorkspace","true"),n?.outsideFileGrant&&o.set("outsideFileGrant",n.outsideFileGrant),n?.optional&&o.set("optional","true");const s=await y("/api/fs/read",{query:o,cache:n?.optional||n?.fresh?"no-store":"default",headers:He(e,n?.directory)});if(!s.ok){const a=await s.json().catch(()=>({error:s.statusText}));throw new Error(a.error||"Failed to read file")}return{content:await s.text(),path:r}},async writeFile(t,n){const r=ce(t),o=await y("/api/fs/write",{method:"POST",headers:{"Content-Type":"application/json",...He(e)},body:JSON.stringify({path:r,content:n})});if(!o.ok){const i=await o.json().catch(()=>({error:o.statusText}));throw new Error(i.error||"Failed to write file")}const s=await o.json().catch(()=>({}));return{success:!!s.success,path:typeof s.path=="string"?ce(s.path):r}},async uploadFile(t,n,r){const o=ce(t),s=await y("/api/fs/upload",{method:"POST",query:{path:o,overwrite:r?.overwrite?"true":void 0},headers:{"Content-Type":"application/octet-stream",...He(e,r?.directory)},body:n});if(!s.ok){const a=await s.json().catch(()=>({error:s.statusText}));throw new Yt(a.error||"Failed to upload file",{reason:mo(a.reason),status:s.status})}const i=await s.json().catch(()=>({}));return{success:!!i.success,path:i.path?ce(i.path):o}},async delete(t){const n=ce(t),r=await y("/api/fs/delete",{method:"POST",headers:{"Content-Type":"application/json",...He(e)},body:JSON.stringify({path:n})});if(!r.ok){const s=await r.json().catch(()=>({error:r.statusText}));throw new Error(s.error||"Failed to delete file")}return{success:!!(await r.json().catch(()=>({}))).success}},async rename(t,n){const r=await y("/api/fs/rename",{method:"POST",headers:{"Content-Type":"application/json",...He(e)},body:JSON.stringify({oldPath:t,newPath:n})});if(!r.ok){const s=await r.json().catch(()=>({error:r.statusText}));throw new Error(s.error||"Failed to rename file")}const o=await r.json().catch(()=>({}));return{success:!!o.success,path:typeof o.path=="string"?ce(o.path):n}},async revealPath(t){const n=await y("/api/fs/reveal",{method:"POST",headers:{"Content-Type":"application/json",...He(e)},body:JSON.stringify({path:ce(t)})});if(!n.ok){const o=await n.json().catch(()=>({error:n.statusText}));throw new Error(o.error||"Failed to reveal path")}return{success:!!(await n.json().catch(()=>({}))).success}},async downloadFile(t){const n=ce(t),r=await y("/api/fs/raw",{query:{path:n,download:!0},headers:He(e)});if(!r.ok)throw new Error(`Download failed (${r.status})`);const o=await r.blob(),s=n.split("/").pop()||"file",i=window.Capacitor,a=new File([o],s,{type:o.type||"application/octet-stream"});if(i?.isNativePlatform?.()===!0&&navigator.canShare?.({files:[a]})){await navigator.share({files:[a]});return}const c=URL.createObjectURL(o),l=document.createElement("a");l.href=c,l.download=s,document.body.appendChild(l),l.click(),document.body.removeChild(l),setTimeout(()=>URL.revokeObjectURL(c),100)}}),kb="/api/config/settings",fc=()=>`${kb}?${nu}=${ru()}`,Eb="/api/config/reload",pc=e=>{if(!e||typeof e!="object"||Array.isArray(e))throw new Error("Invalid settings response");return e},Pb=()=>({async load(){const e=await y(fc(),{method:"GET",headers:{Accept:"application/json"}});if(!e.ok)throw new Error(`Failed to load settings: ${e.statusText}`);return{settings:pc(await e.json()),source:"web"}},async save(e){const t=await y(fc(),{method:"PUT",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(e)});if(!t.ok){const r=await t.json().catch(()=>({error:t.statusText}));throw new Error(r.error||"Failed to save settings")}return pc(await t.json())},async restartOpenCode(){const e=await y(Eb,{method:"POST"});if(!e.ok){const t=await e.json().catch(()=>({error:e.statusText}));throw new Error(t.error||"Failed to restart OpenCode")}return{restarted:!0}}}),Ab=()=>({async requestDirectoryAccess(e){return{success:!0,path:e.path}},async startAccessingDirectory(e){return{success:!0}},async stopAccessingDirectory(e){return{success:!0}}}),Ib=1500,Ys=5e3,xb="openchamber-notification-claim:",er=new Map,Cb=()=>typeof document>"u"?!0:document.visibilityState==="visible"&&document.hasFocus(),Rb=e=>{const t=typeof e?.tag=="string"?e.tag.trim():"";return t||[e?.sessionId,e?.kind,e?.title,e?.body].filter(n=>typeof n=="string"&&n.trim().length>0).map(n=>n.trim()).join("|")},Db=e=>{for(const[t,n]of er)e-n>Ys&&er.delete(t)},Ob=e=>{const t=Rb(e);if(!t)return!0;const n=Date.now();Db(n);const r=er.get(t)??0;if(n-r<Ys)return!1;try{if(typeof window<"u"&&window.localStorage){const o=`${xb}${t}`,s=Number(window.localStorage.getItem(o)??"0");if(Number.isFinite(s)&&n-s<Ys)return er.set(t,s),!1;Number.isFinite(s)&&s>0&&window.localStorage.removeItem(o),window.localStorage.setItem(o,String(n))}}catch{}return er.set(t,n),!0},Ru=async()=>{if(typeof navigator>"u"||!("serviceWorker"in navigator))return null;let e=null;try{e=await navigator.serviceWorker.getRegistration()??null}catch{e=null}if(e?.active)return e;if(!e)return null;try{return await Promise.race([navigator.serviceWorker.ready,new Promise(n=>{setTimeout(()=>n(null),Ib)})])??e}catch{return e}},Mb=async e=>{const t=await Ru();if(!t||typeof t.showNotification!="function")return!1;try{return await t.showNotification(e?.title??"OpenChamber",{body:e?.body,tag:e?.tag}),!0}catch(n){return console.warn("Failed to send notification via service worker",n),!1}},_b=async()=>{const e=await Ru();if(!e||!("pushManager"in e)||!e.pushManager)return!1;try{return!!await e.pushManager.getSubscription()}catch{return!1}},Lb=async e=>{if(e?.requireHidden&&typeof document<"u"&&document.hasFocus())return!0;if(typeof Notification>"u")return console.info("Notifications not supported in this environment",e),!1;if(Notification.permission==="default"&&await Notification.requestPermission()!=="granted"||Notification.permission!=="granted")return console.warn("Notification permission not granted"),!1;if(!Cb()&&await _b()||!Ob(e))return!0;try{return await Mb(e)||new Notification(e?.title??"OpenChamber",{body:e?.body,tag:e?.tag}),!0}catch(t){return console.warn("Failed to send notification",t),!1}},Fb=async e=>{if(typeof window>"u")return!1;const t=window.__OPENCHAMBER_DESKTOP__;if(!t?.invoke)return!1;try{return await t.invoke("desktop_notify",{payload:{title:e?.title,body:e?.body,tag:e?.tag,kind:e?.kind,sessionId:e?.sessionId,directory:e?.directory,requireHidden:e?.requireHidden}}),!0}catch(n){return console.warn("Failed to send native notification (desktop)",n),!1}},Ub=()=>({async notifyAgentCompletion(e){return await Fb(e)||await Lb(e)},canNotify:()=>typeof window<"u"&&window.__OPENCHAMBER_DESKTOP__?.invoke?!0:typeof Notification<"u"?Notification.permission==="granted":!1}),jb=()=>({async getAvailableTools(){const e=await y("/api/experimental/tool/ids");if(!e.ok)throw new Error(`Tools API returned ${e.status} ${e.statusText}`);const t=await e.json();if(!Array.isArray(t))throw new Error("Tools API returned invalid data format");return t.filter(n=>typeof n=="string"&&n!=="invalid").sort()}}),hn=async(e,t)=>{try{const n=await y(e,{...t,credentials:"include",headers:{Accept:"application/json",...t?.headers??{}}});return n.ok?await n.json():null}catch{return null}},Nb=()=>({async getVapidPublicKey(){return hn("/api/push/vapid-public-key")},async subscribe(e){return hn("/api/push/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)})},async unsubscribe(e){return hn("/api/push/subscribe",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)})},async setVisibility(e){return hn("/api/push/visibility",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e),keepalive:!0})},async registerApnsToken(e){return hn("/api/push/apns-token",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)})},async unregisterApnsToken(e){return hn("/api/push/apns-token",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)})}}),ae=async e=>await e.json().catch(()=>null),Bb=({urls:e})=>({async authStatus(){const t=await y("/api/github/auth/status",{method:"GET",headers:{Accept:"application/json"}}),n=await ae(t);if(!t.ok||!n)throw new Error(n?.error||t.statusText||"Failed to load GitHub status");return n},async authStart(){const t=await y("/api/github/auth/start",{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({})}),n=await ae(t);if(!t.ok||!n||!("deviceCode"in n))throw new Error(n?.error||t.statusText||"Failed to start GitHub auth");return n},async authComplete(t){const n=await y("/api/github/auth/complete",{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({deviceCode:t})}),r=await ae(n);if(!n.ok||!r)throw new Error(r?.error||n.statusText||"Failed to complete GitHub auth");return r},async authDisconnect(){const t=await y("/api/github/auth",{method:"DELETE",headers:{Accept:"application/json"}}),n=await ae(t);if(!t.ok)throw new Error(n?.error||t.statusText||"Failed to disconnect GitHub");return{removed:!!n?.removed}},async authActivate(t){const n=await y("/api/github/auth/activate",{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({accountId:t})}),r=await ae(n);if(!n.ok||!r)throw new Error(r?.error||n.statusText||"Failed to activate GitHub account");return r},async authSetGhCliDisabled(t){const n=await y("/api/github/auth/gh-cli",{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({disabled:t})}),r=await ae(n);if(!n.ok||!r)throw new Error(r?.error||n.statusText||"Failed to update gh CLI setting");return{disabled:!!r.disabled}},async me(){const t=await y("/api/github/me",{method:"GET",headers:{Accept:"application/json"}}),n=await ae(t);if(!t.ok||!n)throw new Error(n?.error||t.statusText||"Failed to fetch GitHub user");return n},async prStatus(t,n,r,o){const s=new URLSearchParams({directory:t,branch:n,...r?{remote:r}:{},...o?.force?{force:"true"}:{}}),i=await y(`/api/github/pr/status?${s.toString()}`,{method:"GET",headers:{Accept:"application/json"}}),a=await ae(i);if(!i.ok||!a)throw new Error(a?.error||i.statusText||"Failed to load PR status");return a},async prCreate(t){const n=await y("/api/github/pr/create",{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(t)}),r=await ae(n);if(!n.ok||!r)throw new Error(r?.error||n.statusText||"Failed to create PR");return r},async prUpdate(t){const n=await y("/api/github/pr/update",{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(t)}),r=await ae(n);if(!n.ok||!r)throw new Error(r?.error||n.statusText||"Failed to update PR");return r},async prMerge(t){const n=await y("/api/github/pr/merge",{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(t)}),r=await ae(n);if(!n.ok||!r)throw new Error(r?.error||n.statusText||"Failed to merge PR");return r},async prReady(t){const n=await y("/api/github/pr/ready",{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(t)}),r=await ae(n);if(!n.ok||!r)throw new Error(r?.error||n.statusText||"Failed to mark PR ready");return r},async repoUpstream(t){const n=await y(`/api/github/repo/upstream?directory=${encodeURIComponent(t)}`,{method:"GET",headers:{Accept:"application/json"}}),r=await ae(n);if(!n.ok||!r)throw new Error(r?.error||n.statusText||"Failed to detect upstream repo");return r},async repoBranches(t,n){const r=await y(`/api/github/repo/branches?owner=${encodeURIComponent(t)}&repo=${encodeURIComponent(n)}`,{method:"GET",headers:{Accept:"application/json"}}),o=await ae(r);if(!r.ok||!o)throw new Error(o?.error||r.statusText||"Failed to fetch repo branches");return o.branches??[]},async prsList(t,n){const r=n?.page??1,o=new URLSearchParams({directory:t,page:String(r)});n?.query&&o.set("query",n.query);const s=await y(`/api/github/pulls/list?${o.toString()}`,{method:"GET",headers:{Accept:"application/json"}}),i=await ae(s);if(!s.ok||!i)throw new Error(i?.error||s.statusText||"Failed to load pull requests");return i},async prContext(t,n,r){const o=new URLSearchParams({directory:t,number:String(n)});r?.includeDiff&&o.set("diff","1"),r?.includeCheckDetails&&o.set("checkDetails","1"),r?.sourceRepo?.owner&&r.sourceRepo.repo&&(o.set("owner",r.sourceRepo.owner),o.set("repo",r.sourceRepo.repo));const s=await y(e.api("/api/github/pulls/context",o),{method:"GET",headers:{Accept:"application/json"}}),i=await ae(s);if(!s.ok||!i)throw new Error(i?.error||s.statusText||"Failed to load pull request context");return i},async issuesList(t,n){const r=n?.page??1,o=new URLSearchParams({directory:t,page:String(r)});n?.query&&o.set("query",n.query);const s=await y(`/api/github/issues/list?${o.toString()}`,{method:"GET",headers:{Accept:"application/json"}}),i=await ae(s);if(!s.ok||!i)throw new Error(i?.error||s.statusText||"Failed to load issues");return i},async issueGet(t,n,r){const o=new URLSearchParams({directory:t,number:String(n)});r?.sourceRepo?.owner&&r.sourceRepo.repo&&(o.set("owner",r.sourceRepo.owner),o.set("repo",r.sourceRepo.repo));const s=await y(e.api("/api/github/issues/get",o),{method:"GET",headers:{Accept:"application/json"}}),i=await ae(s);if(!s.ok||!i)throw new Error(i?.error||s.statusText||"Failed to load issue");return i},async issueComments(t,n,r){const o=new URLSearchParams({directory:t,number:String(n)});r?.sourceRepo?.owner&&r.sourceRepo.repo&&(o.set("owner",r.sourceRepo.owner),o.set("repo",r.sourceRepo.repo));const s=await y(e.api("/api/github/issues/comments",o),{method:"GET",headers:{Accept:"application/json"}}),i=await ae(s);if(!s.ok||!i)throw new Error(i?.error||s.statusText||"Failed to load issue comments");return i}});async function Ce(e){try{return await e.json()}catch{return null}}function Re(e,t){return e?.error?.trim()||t}function Du(e){return Number.isFinite(e)?e??null:null}function Ou(e){return Object.prototype.toString.call(e)==="[object String]"?`${e}`:null}function Mu(e){const t=e?.id?.trim();return t?{id:t,name:e?.name?.trim()||null,displayName:e?.displayName?.trim()||null,email:e?.email?.trim()||null,avatarUrl:e?.avatarUrl?.trim()||null}:null}function Hb(e){const t=e?.id?.trim(),n=e?.name?.trim();return!t||!n?null:{id:t,name:n,urlKey:e?.urlKey?.trim()||null}}function zb(e){const t=e?.id?.trim();if(!t)return null;const n=e?.authorizedAt;return{id:t,name:e?.name?.trim()||null,urlKey:e?.urlKey?.trim()||null,current:e?.current===!0,user:Mu(e?.user),authorizedAt:Du(n)}}function hc(e){if(e?.connected!==!0&&e?.connected!==!1)return null;const t=Array.isArray(e.workspaces)?e.workspaces.map(zb).filter(n=>n!=null):[];return{connected:e.connected,user:Mu(e.user),organization:Hb(e.organization),scope:e.scope?.trim()||void 0,workspaces:e.connected?t:void 0}}function $b(e){const t=e?.authorizationUrl?.trim(),n=e?.expiresIn,r=e?.scope?.trim();return!t||!Number.isFinite(n)||n==null||!r?null:{authorizationUrl:t,expiresIn:n,scope:r}}function Gb(e){const t=e?.id?.trim()||null,n=e?.name?.trim()||null,r=e?.type?.trim()||null;return!t&&!n&&!r?null:{id:t,name:n,type:r}}function Wb(e){const t=e?.id?.trim(),n=e?.name?.trim();if(!t||!n)return null;const r=e?.position;return{id:t,name:n,type:e?.type?.trim()||null,position:Du(r)??0}}function qb(e){const t=e?.name?.trim()||null,n=e?.displayName?.trim()||null,r=e?.avatarUrl?.trim()||null;return!t&&!n&&!r?null:{name:t,displayName:n,avatarUrl:r}}function Kb(e){const t=e?.id?.trim(),n=e?.key?.trim(),r=e?.name?.trim();return!t||!n||!r?null:{id:t,key:n,name:r}}function Vb(e){return e!==0&&e!==1&&e!==2&&e!==3&&e!==4?null:e}function Jb(e){const t=e?.trim();if(!t)return null;const n=t.startsWith("#")?t.slice(1):t;return/^[0-9A-Fa-f]{6}$/.test(n)?`#${n.toLowerCase()}`:null}function Yb(e){if(!e)return null;const t=e?.id?.trim(),n=e?.name?.trim();return!t||!n?null:{id:t,name:n,color:Jb(e.color)}}function Qb(e){return Array.isArray(e)?e.map(Yb).filter(t=>t!=null):[]}function _u(e){if(!e)return null;const t=e?.id?.trim(),n=e?.identifier?.trim(),r=e?.title?.trim(),o=e?.url?.trim();return!t||!n||!r||!o?null:{id:t,identifier:n,title:r,url:o,state:Gb(e.state),assignee:qb(e.assignee),team:Kb(e.team),priority:Vb(e.priority),labels:Qb(e.labels)}}function Xb(e){const t=e?.id?.trim();if(!t)return null;const n=e?.body;return{id:t,body:Ou(n)??"",createdAt:e?.createdAt?.trim()||null,user:e?.user?{name:e.user.name?.trim()||null,displayName:e.user.displayName?.trim()||null,avatarUrl:e.user.avatarUrl?.trim()||null}:null}}function Lu(e){const t=_u(e);if(!t)return null;const n=Array.isArray(e?.comments)?e.comments.map(Xb).filter(o=>o!=null):[],r=e?.description;return{...t,description:Ou(r),comments:n}}function Zb(e){return e?.connected!==!0&&e?.connected!==!1?null:e.connected===!1?{connected:!1}:{connected:!0,issues:Array.isArray(e.issues)?e.issues.map(_u).filter(n=>n!=null):[],cursor:e.cursor?.trim()||null,hasMore:e.hasMore===!0}}function eS(e){return e?.connected!==!0&&e?.connected!==!1?null:e.connected===!1?{connected:!1}:{connected:!0,issue:Lu(e.issue)}}function tS(e){return e?.connected!==!0&&e?.connected!==!1?null:e.connected===!1?{connected:!1}:{connected:!0,states:Array.isArray(e.states)?e.states.map(Wb).filter(n=>n!=null):[]}}function nS(e){return e?.connected!==!0&&e?.connected!==!1?null:e.connected===!1?{connected:!1}:{connected:!0,issue:Lu(e.issue)}}function rS(e){const t=e?.id?.trim(),n=e?.key?.trim(),r=e?.name?.trim();if(!t||!n||!r)return null;const o=e?.projectPath?.trim()||null;return{id:t,key:n,name:r,projectPath:o}}function mc(e){if(e?.connected!==!0&&e?.connected!==!1)return null;if(e.connected===!1)return{connected:!1};const t=Array.isArray(e.teams)?e.teams.map(rS).filter(n=>n!=null):[];return{connected:!0,defaultProjectPath:e.defaultProjectPath?.trim()||null,teams:t}}const oS=["already-posted","issue-not-found","not-started","disabled","origin-not-public"];function sS(e){return oS.find(t=>t===e)??null}function gc(e){return e?.sessionComments!==!0&&e?.sessionComments!==!1?null:{sessionComments:e.sessionComments}}function iS(e){if(e?.connected!==!0&&e?.connected!==!1)return null;if(e.connected===!1)return{connected:!1};if(e.posted===!0)return{connected:!0,posted:!0,commentId:e.commentId?.trim()||null};const t=sS(e.skipped);return e.posted===!1&&t?{connected:!0,posted:!1,skipped:t}:null}const aS=()=>({async authStatus(){const e=await y("/api/linear/auth/status",{method:"GET",headers:{Accept:"application/json"}}),t=await Ce(e),n=hc(t);if(!e.ok||!n)throw new Error(Re(t,e.statusText||"Failed to load Linear status"));return n},async authStart(e){const t=await y("/api/linear/auth/start",{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(e?{origin:e}:{})}),n=await Ce(t),r=$b(n);if(!t.ok||!r)throw new Error(Re(n,t.statusText||"Failed to start Linear auth"));return r},async authDisconnect(){const e=await y("/api/linear/auth",{method:"DELETE",headers:{Accept:"application/json"}}),t=await Ce(e);if(!e.ok)throw new Error(Re(t,e.statusText||"Failed to disconnect Linear"));return{removed:t?.removed===!0}},async authActivate(e){const t=await y("/api/linear/auth/activate",{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({organizationId:e})}),n=await Ce(t),r=hc(n);if(!t.ok||!r)throw new Error(Re(n,t.statusText||"Failed to switch Linear workspace"));return r},async issuesList(e){const t=new URLSearchParams,n=e?.query?.trim(),r=e?.cursor?.trim(),o=e?.status?.trim(),s=e?.assignee?.trim(),i=e?.teamId?.trim(),a=e?.priority?.trim();n&&t.set("query",n),r&&t.set("cursor",r),o&&t.set("status",o),s&&t.set("assignee",s),i&&t.set("teamId",i),a&&t.set("priority",a);const c=t.toString(),l=c?`?${c}`:"",u=await y(`/api/linear/issues/list${l}`,{method:"GET",headers:{Accept:"application/json"}}),d=await Ce(u),f=Zb(d);if(!u.ok||!f)throw new Error(Re(d,u.statusText||"Failed to load Linear issues"));return f},async issueGet(e){const t=new URLSearchParams({id:e}),n=await y(`/api/linear/issues/get?${t.toString()}`,{method:"GET",headers:{Accept:"application/json"}}),r=await Ce(n),o=eS(r);if(!n.ok||!o)throw new Error(Re(r,n.statusText||"Failed to load Linear issue"));return o},async issueStates(e){const t=new URLSearchParams({teamId:e}),n=await y(`/api/linear/issues/states?${t.toString()}`,{method:"GET",headers:{Accept:"application/json"}}),r=await Ce(n),o=tS(r);if(!n.ok||!o)throw new Error(Re(r,n.statusText||"Failed to load Linear workflow states"));return o},async issueUpdate(e){const t=await y("/api/linear/issues/update",{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({id:e.id,stateId:e.stateId})}),n=await Ce(t),r=nS(n);if(!t.ok||!r)throw new Error(Re(n,t.statusText||"Failed to update Linear issue"));return r},async mappingGet(){const e=await y("/api/linear/mapping",{method:"GET",headers:{Accept:"application/json"}}),t=await Ce(e),n=mc(t);if(!e.ok||!n)throw new Error(Re(t,e.statusText||"Failed to load Linear mapping"));return n},async mappingSet(e){const t=await y("/api/linear/mapping",{method:"PUT",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({defaultProjectPath:e.defaultProjectPath,teamProjectPaths:e.teamProjectPaths})}),n=await Ce(t),r=mc(n);if(!t.ok||!r)throw new Error(Re(n,t.statusText||"Failed to save Linear mapping"));return r},async sessionStatusPost(e){const t=await y("/api/linear/session-status",{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({kind:e.kind,sessionId:e.sessionId,issueIdentifier:e.issueIdentifier,sessionOrigin:e.sessionOrigin})}),n=await Ce(t),r=iS(n);if(!t.ok||!r)throw new Error(Re(n,t.statusText||"Failed to post Linear session status"));return r},async preferencesGet(){const e=await y("/api/linear/preferences",{method:"GET",headers:{Accept:"application/json"}}),t=await Ce(e),n=gc(t);if(!e.ok||!n)throw new Error(Re(t,e.statusText||"Failed to load Linear preferences"));return n},async preferencesSet(e){const t=await y("/api/linear/preferences",{method:"PUT",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({sessionComments:e.sessionComments})}),n=await Ce(t),r=gc(n);if(!t.ok||!r)throw new Error(Re(n,t.statusText||"Failed to save Linear preferences"));return r}}),kt=async e=>await e.json().catch(()=>null),cS=()=>({async listClients(){const e=await y("/api/client-auth/clients",{method:"GET",headers:{Accept:"application/json"}}),t=await kt(e);if(!e.ok||!t)throw new Error(t?.error||e.statusText||"Failed to load remote clients");return Array.isArray(t.clients)?t.clients:[]},async createClient(e={}){const t=await y("/api/client-auth/clients",{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({label:e.label??""})}),n=await kt(t);if(!t.ok||!n?.client||typeof n.token!="string")throw new Error(n?.error||t.statusText||"Failed to create remote client token");return n},async createPairingSession(e={}){const t=await y("/api/client-auth/pairing/sessions",{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({label:e.label??"",...e.allowedClientKinds?{allowedClientKinds:e.allowedClientKinds}:{},...e.serverUrl?{serverUrl:e.serverUrl}:{},...typeof e.includeRelay=="boolean"?{includeRelay:e.includeRelay}:{},...typeof e.includeDirect=="boolean"?{includeDirect:e.includeDirect}:{}})}),n=await kt(t);if(!t.ok||typeof n?.pairing?.secret!="string"||!n?.server)throw new Error(n?.error||t.statusText||"Failed to create pairing session");return n},async listPendingPairings(){const e=await y("/api/client-auth/pairing/sessions",{method:"GET",headers:{Accept:"application/json"}}),t=await kt(e);if(!e.ok||!t)throw new Error(t?.error||e.statusText||"Failed to load pending pairings");return Array.isArray(t.pending)?t.pending:[]},async getPairingTransports(){const e=await y("/api/client-auth/pairing/transports",{method:"GET",headers:{Accept:"application/json"}}),t=await kt(e);if(!e.ok||!t)throw new Error(t?.error||e.statusText||"Failed to load pairing transports");return{local:t.local??null,lan:t.lan??null,relayAvailable:t.relayAvailable!==!1}},async cancelPairing(e){const t=await y(`/api/client-auth/pairing/sessions/${encodeURIComponent(e)}`,{method:"DELETE",headers:{Accept:"application/json"}}),n=await kt(t);if(!t.ok||!n)throw new Error(n?.error||t.statusText||"Failed to cancel pairing");return{cancelled:n.cancelled===!0}},async revokeClient(e){const t=await y(`/api/client-auth/clients/${encodeURIComponent(e)}`,{method:"DELETE",headers:{Accept:"application/json"}}),n=await kt(t);if(!t.ok||!n)throw new Error(n?.error||t.statusText||"Failed to revoke remote client");return n},async purgeRevokedClients(){const e=await y("/api/client-auth/clients",{method:"DELETE",headers:{Accept:"application/json"}}),t=await kt(e);if(!e.ok||!t)throw new Error(t?.error||e.statusText||"Failed to clear revoked clients");return t}}),lS=()=>({api:(...e)=>Ee().api(...e),authenticatedAsset:(...e)=>Ee().authenticatedAsset(...e),assetWithUrlToken:(...e)=>Ee().assetWithUrlToken(...e),auth:(...e)=>Ee().auth(...e),health:(...e)=>Ee().health(...e),rawFile:(...e)=>Ee().rawFile(...e),sse:(...e)=>Ee().sse(...e),websocket:(...e)=>Ee().websocket(...e)}),uS=(e={})=>{const t=e.urls??ei();Ld(t);const n=lS();return{themeFiles:Gd(),runtime:{platform:"web",isDesktop:!1,isVSCode:!1,label:"web"},terminal:Xy(),git:Sb(),files:vb({getDirectory:()=>Ws.getState().currentDirectory}),settings:Pb(),permissions:Ab(),notifications:Ub(),github:Bb({urls:n}),linear:aS(),push:Nb(),clientAuth:cS(),tools:jb()}},dS=3e3,yc=(e,t)=>{if(!e||!t)return!1;try{return new URL(e).origin===new URL(t).origin}catch{return!1}},fS=()=>{const e=t=>typeof t=="string"?t.trim():"";return{apiBaseUrl:e(window.__OPENCHAMBER_API_BASE_URL__),clientToken:e(window.__OPENCHAMBER_CLIENT_TOKEN__),localOrigin:e(window.__OPENCHAMBER_LOCAL_ORIGIN__),runtimeHeaders:window.__OPENCHAMBER_RUNTIME_HEADERS__,relayHostId:e(window.__OPENCHAMBER_RELAY_HOST_ID__)}};let Qs=Promise.resolve();const wv=()=>Qs,bv=e=>{const{apiBaseUrl:t,clientToken:n,localOrigin:r,runtimeHeaders:o,relayHostId:s,relay:i}=e??fS(),a=e?null:_c(),c=s||(a?.target==="remote"?a.hostId:""),l=Fc({apiBaseUrl:t||void 0,realtimeBaseUrl:t||void 0});return jd({apiBaseUrl:t,runtimeKey:yc(t,r)?"local":c?`host:${c}`:null}),Xc(n||null),Zc(o||null),i&&ao({apiBaseUrl:t,clientToken:n||null,requestHeaders:o||null,runtimeKey:s?`host:${s}`:null,relay:i}),rt.reconnectToRuntimeBaseUrl(),Co(t||void 0).catch(()=>{}),r&&!yc(t,r)&&Object.keys(xo()).length>0&&il(r).catch(()=>{}),fl(),Qs=i?Promise.resolve():Promise.race([gp(s||void 0).catch(()=>{}),new Promise(u=>{window.setTimeout(u,1e4)})]).then(()=>{rt.reconnectToRuntimeBaseUrl()}),Qs.then(()=>{window.setTimeout(()=>{dp().catch(()=>{})},dS)}),uS({urls:l})};export{fy as $,Hc as A,rt as B,ev as C,XT as D,Je as E,ke as F,rw as G,VS as H,Jd as I,Yr as J,av as K,rv as L,Fd as M,Cn as N,Me as O,ui as P,ml as Q,fT as R,op as S,Dt as T,hl as U,oe as V,el as W,MS as X,LS as Y,CT as Z,UT as _,G as a,Kg as a$,gT as a0,pi as a1,Ao as a2,Co as a3,Ee as a4,xy as a5,xo as a6,Oh as a7,Lh as a8,XS as a9,HS as aA,zS as aB,tn as aC,YT as aD,ZT as aE,NS as aF,BS as aG,Mm as aH,Nd as aI,US as aJ,dh as aK,rh as aL,sh as aM,cv as aN,Us as aO,vS as aP,kS as aQ,ES as aR,ET as aS,Bd as aT,zc as aU,dn as aV,Jm as aW,py as aX,wT as aY,Al as aZ,ew as a_,kT as aa,Gh as ab,_S as ac,vT as ad,wp as ae,bp as af,sv as ag,$c as ah,FS as ai,yy as aj,nv as ak,gy as al,Dr as am,Yn as an,Xp as ao,$e as ap,yT as aq,xd as ar,_c as as,wS as at,tv as au,TT as av,bS as aw,SS as ax,GS as ay,$S as az,Wc as b,Uw as b$,Fs as b0,Et as b1,Tm as b2,Wn as b3,Pd as b4,$T as b5,Oc as b6,Fw as b7,sm as b8,hr as b9,Yw as bA,yb as bB,tb as bC,Cw as bD,ww as bE,pv as bF,gw as bG,Tw as bH,Qw as bI,Jw as bJ,yw as bK,bw as bL,mw as bM,Rw as bN,mv as bO,yv as bP,ob as bQ,lc as bR,cc as bS,Hw as bT,Bw as bU,Nw as bV,nb as bW,xw as bX,zw as bY,ab as bZ,Cu as b_,Sp as ba,Vm as bb,GT as bc,fb as bd,ib as be,Gw as bf,bb as bg,pw as bh,qw as bi,cb as bj,lb as bk,hb as bl,pb as bm,$w as bn,Kw as bo,jw as bp,Xw as bq,uc as br,Dw as bs,eb as bt,dc as bu,Ow as bv,gv as bw,Ww as bx,Sw as by,hv as bz,bv as c,Hl as c$,sb as c0,Mw as c1,Vw as c2,db as c3,dv as c4,fv as c5,ub as c6,vw as c7,Iw as c8,rb as c9,di as cA,rp as cB,mT as cC,lT as cD,dT as cE,uT as cF,Qf as cG,mp as cH,oT as cI,NT as cJ,Mr as cK,Qo as cL,ov as cM,uv as cN,hw as cO,Zy as cP,jS as cQ,KS as cR,qS as cS,Lm as cT,Le as cU,RT as cV,OT as cW,FT as cX,MT as cY,DT as cZ,_T as c_,kw as ca,Au as cb,Pw as cc,mb as cd,xu as ce,gb as cf,Ew as cg,Iu as ch,Aw as ci,Zw as cj,wb as ck,ve as cl,bT as cm,Zp as cn,Uc as co,WT as cp,QT as cq,Hg as cr,QS as cs,pT as ct,hT as cu,Se as cv,Yf as cw,ip as cx,up as cy,sp as cz,mr as d,LT as d0,BT as d1,HT as d2,Em as d3,jT as d4,Ti as d5,iv as d6,DS as d7,Is as d8,IT as d9,Yd as dA,PS as dB,IS as dC,CS as dD,AS as dE,xS as dF,RS as dG,Mh as dH,tT as dI,tw as dJ,lv as dK,YS as dL,nT as dM,rT as dN,JS as dO,cT as dP,dt as dQ,PT as da,AT as db,xT as dc,zT as dd,Kt as de,nh as df,oh as dg,JT as dh,VT as di,Xf as dj,Wf as dk,sT as dl,iT as dm,WS as dn,cm as dp,OS as dq,wi as dr,ST as ds,eh as dt,th as du,bi as dv,um as dw,lm as dx,rm as dy,Ro as dz,Eo as e,ZS as f,wv as g,y as h,pr as i,eT as j,ni as k,Pt as l,aT as m,Ws as n,Ye as o,zf as p,xs as q,qT as r,ao as s,ft as t,T as u,xh as v,KT as w,Po as x,lo as y,TS as z};
|