@vantran-se/openchamber-web 2.1.1 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +32 -24
- package/bin/cli.js +1 -3
- package/bin/cli.test.js +40 -16
- package/bin/lib/DOCUMENTATION.md +6 -5
- package/bin/lib/cli-args.js +6 -1
- package/bin/lib/cli-args.test.js +34 -0
- package/bin/lib/cli-lifecycle.js +0 -1
- package/bin/lib/cli-network.js +8 -2
- package/bin/lib/cli-process.js +1 -1
- package/bin/lib/cli-settings-accessors.test.js +21 -13
- package/bin/lib/cli-startup.js +17 -11
- package/bin/lib/cli-startup.test.js +92 -2
- package/bin/lib/commands-connect-url.js +8 -1
- package/bin/lib/commands-schedule.js +8 -2
- package/bin/lib/commands-serve.js +15 -21
- package/bin/lib/commands-update.js +12 -24
- package/bin/lib/commands-update.test.js +14 -46
- package/dist/assets/DiffView-Cv9MSXl1.js +4 -0
- package/dist/assets/FilePreviewCommentMenu-D4kLseHj.js +4 -0
- package/dist/assets/FilesView-BVoD8I2x.js +14 -0
- package/dist/assets/{GitView-DzuzhIPx.js → GitView-Bzb8p-ew.js} +4 -4
- package/dist/assets/GuestSurfacePane-Crdbvsxo.js +1 -0
- package/dist/assets/InProgressOperationBanner-CwMjNQgk.js +2 -0
- package/dist/assets/{JsonTreeView-B_EPRjzy.js → JsonTreeView-DRKHZfsn.js} +1 -1
- package/dist/assets/MarkdownImageGallery-DZtqT1Zn.js +1 -0
- package/dist/assets/MarkdownRendererImpl-CqG7HCNd.js +10 -0
- package/dist/assets/OnboardingScreen-DMIxwYK5.js +1 -0
- package/dist/assets/{PatchDiff-6yh1csza.js → PatchDiff-CUcCg1jk.js} +1 -1
- package/dist/assets/PierreDiffViewer-CnnR-dnD.js +228 -0
- package/dist/assets/PlanView-RCBadcY7.js +5 -0
- package/dist/assets/SettingsView-CjBjZFRO.js +30 -0
- package/dist/assets/SettingsWindow-DyM7QuhI.js +1 -0
- package/dist/assets/SubmoduleDiffSummary-BWIfgMED.js +1 -0
- package/dist/assets/ToolOutputDialog-Q0P3FuAi.js +15 -0
- package/dist/assets/ToolPartDiffPreview-p7qR9FpU.js +8 -0
- package/dist/assets/{VirtualizedFileDiff-BTJVRkyo.js → VirtualizedFileDiff-CFpjL8Ns.js} +3 -3
- package/dist/assets/{Virtualizer-xCEYz34p.js → Virtualizer-C0IsclZn.js} +1 -1
- package/dist/assets/WalkthroughView-DI31zD02.js +4 -0
- package/dist/assets/appThemeRegistry-B9gkFq9i.js +1 -0
- package/dist/assets/{computeVirtualFileMetrics-CmPe29DM.js → computeVirtualFileMetrics-C2WM6JC2.js} +2 -2
- package/dist/assets/de-YKfk5MmC.js +14 -0
- package/dist/assets/es-_gwT0kr-.js +20 -0
- package/dist/assets/fileTreeStatus-D438yi8M.js +1 -0
- package/dist/assets/fr-DqzvXmIm.js +18 -0
- package/dist/assets/index-BLaHKdtx.js +1 -0
- package/dist/assets/index-BkMXRrVQ.css +1 -0
- package/dist/assets/index-DxNa7xYB.js +65 -0
- package/dist/assets/initializeSharedPreferences-Bck5EAWP.js +1 -0
- package/dist/assets/{isDiffPlainText-CQmDCnEv.js → isDiffPlainText-Dgbw8VKk.js} +1 -1
- package/dist/assets/{isFilePlainText-CYBUzW4I.js → isFilePlainText-_ZS5UYRj.js} +1 -1
- package/dist/assets/ja-B-GFYhQE.js +20 -0
- package/dist/assets/ko-mzksfqDC.js +20 -0
- package/dist/assets/main-C5Xx8dn_.js +2 -0
- package/dist/assets/main-CfBSQM1H.js +990 -0
- package/dist/assets/markdownCore-BmWwW1ll.js +7 -0
- package/dist/assets/miniChat-mnKwy4vQ.js +2 -0
- package/dist/assets/mobile-DeEQd0wZ.js +2 -0
- package/dist/assets/nl-CWQr6NSq.js +20 -0
- package/dist/assets/{parseDiffFromFile-Cy0PNxun.js → parseDiffFromFile-BUgn-T9p.js} +2 -2
- package/dist/assets/patchFileDiff-Dt8LhgBh.js +13 -0
- package/dist/assets/pl-UmRcDUX2.js +20 -0
- package/dist/assets/pt-BR-BSLybvVF.js +20 -0
- package/dist/assets/relocateRestoredSession-B5E9xb3T.js +1 -0
- package/dist/assets/renderElectronMiniChatApp-C0a9A5_J.js +2 -0
- package/dist/assets/renderMobileApp-BNncg3Pk.js +25 -0
- package/dist/assets/runtimeEndpointReset-CZ5aafpl.js +62 -0
- package/dist/assets/{selectionMarkdown-TkYk5h9l.js → selectionMarkdown-CUN3wUld.js} +9 -9
- package/dist/assets/{sessionOwnership-Bs1xbRfB.js → sessionOwnership-BSuxCEhb.js} +1 -1
- package/dist/assets/shikiHighlight-DHDx-6eM.js +1 -0
- package/dist/assets/space-apply-DM_2pRW7.js +1 -0
- package/dist/assets/space-close-Bpomt8z0.js +1 -0
- package/dist/assets/{surface-B6n7wJtt.js → surface-C-jQaGnL.js} +1 -1
- package/dist/assets/{textMateThemeFromAppTheme-CDlKffWz.js → textMateThemeFromAppTheme-DlsTphbY.js} +1 -1
- package/dist/assets/tr-gaTrX_HK.js +11 -0
- package/dist/assets/uk-CnJF6ykl.js +20 -0
- package/dist/assets/{useAppFontEffects-DCqCVGlT.js → useAppFontEffects-DGlvOqP_.js} +194 -233
- package/dist/assets/useInlineCommentController-kMN4Wg_D.js +2 -0
- package/dist/assets/{useRootScrollLock-BowwS8kq.js → useRootScrollLock-DMPpvpNP.js} +2 -2
- package/dist/assets/{vendor-base-ui-DX96QhTP.js → vendor-base-ui-Det7U81h.js} +1 -1
- package/dist/assets/{vendor-codemirror-autocomplete-DW1FQz9_.js → vendor-codemirror-autocomplete-BSHQHbKu.js} +1 -1
- package/dist/assets/{vendor-codemirror-commands-DpmhalwN.js → vendor-codemirror-commands-C4G_dPWe.js} +1 -1
- package/dist/assets/{vendor-codemirror-lang-angular-BqExbN1M.js → vendor-codemirror-lang-angular-B6LbBGHB.js} +1 -1
- package/dist/assets/{vendor-codemirror-lang-cpp-DZA36HfS.js → vendor-codemirror-lang-cpp-BWWXBx7W.js} +1 -1
- package/dist/assets/{vendor-codemirror-lang-css-B07blnnZ.js → vendor-codemirror-lang-css-Cayfb29q.js} +1 -1
- package/dist/assets/{vendor-codemirror-lang-go-BM8K9D1-.js → vendor-codemirror-lang-go-BoKlCNKw.js} +1 -1
- package/dist/assets/{vendor-codemirror-lang-html-DaH9adfE.js → vendor-codemirror-lang-html-BQWerHsJ.js} +1 -1
- package/dist/assets/{vendor-codemirror-lang-java-CsdC0viz.js → vendor-codemirror-lang-java-DWX7Fq_K.js} +1 -1
- package/dist/assets/{vendor-codemirror-lang-javascript-CpGYXGuo.js → vendor-codemirror-lang-javascript-DbpEcZM0.js} +2 -2
- package/dist/assets/{vendor-codemirror-lang-jinja-BBeGzXw5.js → vendor-codemirror-lang-jinja-D1JIJRA7.js} +1 -1
- package/dist/assets/{vendor-codemirror-lang-json-58T70Hqs.js → vendor-codemirror-lang-json-BzgckzmB.js} +1 -1
- package/dist/assets/{vendor-codemirror-lang-less-BI-xCA59.js → vendor-codemirror-lang-less-B9EpDXFi.js} +1 -1
- package/dist/assets/{vendor-codemirror-lang-liquid-zEcMa-zy.js → vendor-codemirror-lang-liquid-9U7kRbSf.js} +1 -1
- package/dist/assets/{vendor-codemirror-lang-markdown-BLKnlLP4.js → vendor-codemirror-lang-markdown-D2TEBIvZ.js} +1 -1
- package/dist/assets/{vendor-codemirror-lang-php-9f35M83-.js → vendor-codemirror-lang-php-BT6sDVzE.js} +1 -1
- package/dist/assets/vendor-codemirror-lang-python-jAMtYiA9.js +3 -0
- package/dist/assets/{vendor-codemirror-lang-rust-MNDL_jZQ.js → vendor-codemirror-lang-rust-CVO56EiL.js} +1 -1
- package/dist/assets/{vendor-codemirror-lang-sass-p9epsSNm.js → vendor-codemirror-lang-sass-DZlOoUWu.js} +1 -1
- package/dist/assets/{vendor-codemirror-lang-sql-Bqzh0EXX.js → vendor-codemirror-lang-sql-fZ6t1DPw.js} +1 -1
- package/dist/assets/{vendor-codemirror-lang-vue-BnNUWV-p.js → vendor-codemirror-lang-vue-DxbqrLiE.js} +1 -1
- package/dist/assets/{vendor-codemirror-lang-wast-C2a-oLmk.js → vendor-codemirror-lang-wast-DyU1Gt-I.js} +1 -1
- package/dist/assets/vendor-codemirror-lang-xml-C9a_K5_p.js +1 -0
- package/dist/assets/{vendor-codemirror-lang-yaml-C0sjswB0.js → vendor-codemirror-lang-yaml-Cptq8l0e.js} +1 -1
- package/dist/assets/{vendor-codemirror-language-ByBn5zIW.js → vendor-codemirror-language-DufXoQvE.js} +2 -2
- package/dist/assets/vendor-codemirror-language-data-CtwSWKtX.js +2 -0
- package/dist/assets/{vendor-codemirror-search-ib-sHD5W.js → vendor-codemirror-search-CvXM_pZg.js} +1 -1
- package/dist/assets/{vendor-codemirror-state-G3UuR-be.js → vendor-codemirror-state-Dek9sMtw.js} +1 -1
- package/dist/assets/{vendor-codemirror-view-Bniqp7p5.js → vendor-codemirror-view-1e0FQ6Wn.js} +1 -1
- package/dist/assets/vendor-framer-motion-DxDVhOLc.js +9 -0
- package/dist/assets/vendor-katex-CuQvj9-L.js +257 -0
- package/dist/assets/vendor-katex-DdZNUVNG.css +1 -0
- package/dist/assets/{vendor-motion-dom-DcCgeG69.js → vendor-motion-dom-HXPOMxb7.js} +1 -1
- package/dist/assets/{vendor-opencode-client-DHzhmLwV.js → vendor-opencode-client-BmFcUkbQ.js} +1 -1
- package/dist/assets/{vendor-replit-codemirror-vim-DkzqxN2H.js → vendor-replit-codemirror-vim-BlJRn-cW.js} +2 -2
- package/dist/assets/{vendor-tanstack-react-virtual-H_JmXOFV.js → vendor-tanstack-react-virtual-CvuLsk7D.js} +1 -1
- package/dist/assets/{vendor-tanstack-virtual-core-Dxc8hSTB.js → vendor-tanstack-virtual-core-DPaNcJcT.js} +1 -1
- package/dist/assets/zh-CN-t2vigSB1.js +20 -0
- package/dist/assets/zh-TW-jAgqBokB.js +20 -0
- package/dist/index.html +6 -6
- package/dist/mini-chat.html +6 -6
- package/dist/mobile.html +6 -6
- package/package.json +8 -5
- package/server/index.js +80 -36
- package/server/lib/agent-memory/actions.js +1 -6
- package/server/lib/agent-memory/routes.js +1 -2
- package/server/lib/agent-memory/runtime.js +1 -8
- package/server/lib/agent-tool/DOCUMENTATION.md +7 -3
- package/server/lib/agent-tool/runtime.js +3 -6
- package/server/lib/agent-tool/runtime.test.js +0 -2
- package/server/lib/browser-control/DOCUMENTATION.md +6 -0
- package/server/lib/changelog/update-notes.js +1 -1
- package/server/lib/context-obligatory/runtime.js +1 -2
- package/server/lib/dev-tunnel/DOCUMENTATION.md +8 -0
- package/server/lib/dev-tunnel/client.js +21 -10
- package/server/lib/dev-tunnel/tunnel.test.js +34 -0
- package/server/lib/dispatch-results/runtime.js +1 -1
- package/server/lib/enterprise-mode.d.ts +1 -0
- package/server/lib/enterprise-mode.js +13 -2
- package/server/lib/enterprise-mode.test.js +21 -0
- package/server/lib/event-stream/DOCUMENTATION.md +2 -2
- package/server/lib/event-stream/index.js +1 -3
- package/server/lib/event-stream/translate-v2.js +1 -9
- package/server/lib/event-stream/translate-v2.test.js +0 -11
- package/server/lib/fs/DOCUMENTATION.md +5 -2
- package/server/lib/fs/routes.js +62 -15
- package/server/lib/fs/routes.test.js +278 -48
- package/server/lib/fs/workspace-file-names.js +104 -0
- package/server/lib/fs/workspace-file-names.test.js +62 -0
- package/server/lib/git/DOCUMENTATION.md +17 -5
- package/server/lib/git/contributor-provenance-storage.js +9 -6
- package/server/lib/git/contributor-provenance-storage.test.js +29 -0
- package/server/lib/git/credential-broker.js +1 -1
- package/server/lib/git/credential-resolver.js +1 -4
- package/server/lib/git/credentials.js +1 -0
- package/server/lib/git/discovery-endpoint.js +1 -1
- package/server/lib/git/identity-provisioning.js +2 -1
- package/server/lib/git/identity-storage.js +3 -4
- package/server/lib/git/lfs-discovery.js +14 -14
- package/server/lib/git/lfs-discovery.test.js +16 -6
- package/server/lib/git/network-operation-plan.js +50 -62
- package/server/lib/git/network-operation-plan.test.js +103 -1
- package/server/lib/git/network-operation-registry.js +4 -6
- package/server/lib/git/network-operation-storage.js +4 -6
- package/server/lib/git/network-operations.js +12 -4
- package/server/lib/git/network-operations.test.js +19 -6
- package/server/lib/git/redaction.js +2 -1
- package/server/lib/git/repository-credential-runtime.js +5 -3
- package/server/lib/git/repository-credential-runtime.test.js +22 -0
- package/server/lib/git/routes.js +31 -137
- package/server/lib/git/routes.test.js +2 -2
- package/server/lib/git/service.js +143 -27
- package/server/lib/git/service.test.js +215 -1
- package/server/lib/git/ssh-credential-storage.js +1 -4
- package/server/lib/git/submodule-discovery.js +1 -1
- package/server/lib/git/worktree-bootstrap-storage.js +3 -4
- package/server/lib/git/worktree-bootstrap-storage.test.js +15 -0
- package/server/lib/git/worktree-creation.js +194 -0
- package/server/lib/git/worktree-creation.test.js +155 -0
- package/server/lib/github/DOCUMENTATION.md +11 -6
- package/server/lib/github/auth.js +2 -4
- package/server/lib/github/device-flow.js +2 -2
- package/server/lib/github/gh-cli-credential.js +1 -0
- package/server/lib/github/octokit.js +31 -0
- package/server/lib/github/pr-status.js +35 -18
- package/server/lib/github/pr-status.test.js +271 -3
- package/server/lib/github/reference-search.js +102 -13
- package/server/lib/github/reference-search.test.js +48 -7
- package/server/lib/github/routes.auth.test.js +18 -0
- package/server/lib/github/routes.js +360 -6
- package/server/lib/github/routes.mutations.test.js +239 -0
- package/server/lib/github/routes.test.js +134 -2
- package/server/lib/gitlab/DOCUMENTATION.md +5 -1
- package/server/lib/gitlab/auth-storage.test.js +1 -0
- package/server/lib/gitlab/mappers.js +30 -1
- package/server/lib/gitlab/resources.js +230 -6
- package/server/lib/gitlab/resources.test.js +179 -0
- package/server/lib/gitlab/routes.js +200 -6
- package/server/lib/gitlab/routes.test.js +186 -2
- package/server/lib/gitlab/validation.js +1 -5
- package/server/lib/guests/DOCUMENTATION.md +1 -1
- package/server/lib/guests/oauth.js +2 -2
- package/server/lib/guests/service.js +1 -1
- package/server/lib/guests/sockets.js +1 -1
- package/server/lib/injected-env.d.ts +8 -0
- package/server/lib/injected-env.js +50 -0
- package/server/lib/injected-env.test.js +56 -0
- package/server/lib/linear/DOCUMENTATION.md +5 -6
- package/server/lib/linear/issues.js +62 -4
- package/server/lib/linear/issues.test.js +68 -0
- package/server/lib/linear/oauth.js +5 -5
- package/server/lib/linear/parse.js +2 -9
- package/server/lib/message-queue/DOCUMENTATION.md +23 -1
- package/server/lib/message-queue/runtime.js +85 -12
- package/server/lib/message-queue/runtime.test.js +172 -2
- package/server/lib/notifications/apns-runtime.js +5 -6
- package/server/lib/notifications/apns-runtime.test.js +20 -4
- package/server/lib/openchamber-control/DOCUMENTATION.md +19 -1
- package/server/lib/openchamber-control/actions.js +2 -1
- package/server/lib/openchamber-control/service.js +119 -20
- package/server/lib/openchamber-control/service.test.js +166 -0
- package/server/lib/openchamber-sessions/archive-store.js +1 -6
- package/server/lib/openchamber-sessions/routes.js +47 -12
- package/server/lib/openchamber-sessions/routes.test.js +65 -2
- package/server/lib/openchamber-sessions/session-metadata-store.js +1 -6
- package/server/lib/opencode/DOCUMENTATION.md +22 -8
- package/server/lib/opencode/agents.js +62 -0
- package/server/lib/opencode/auth-state-runtime.js +3 -1
- package/server/lib/opencode/auth.d.ts +1 -1
- package/server/lib/opencode/auth.js +8 -0
- package/server/lib/opencode/auth.test.js +31 -0
- package/server/lib/opencode/config-entity-routes.js +16 -0
- package/server/lib/opencode/config-entity-v2.test.js +16 -1
- package/server/lib/opencode/config-paths.test.js +2 -2
- package/server/lib/opencode/config-v2.js +2 -4
- package/server/lib/opencode/feature-routes-runtime.js +89 -49
- package/server/lib/opencode/lifecycle.js +41 -21
- package/server/lib/opencode/lifecycle.test.js +50 -2
- package/server/lib/opencode/model-discovery.js +1 -1
- package/server/lib/opencode/model-discovery.test.js +17 -0
- package/server/lib/opencode/models-metadata.js +0 -2
- package/server/lib/opencode/openchamber-routes.test.js +3 -3
- package/server/lib/opencode/plugins.js +6 -9
- package/server/lib/opencode/provider-source-route.test.js +101 -3
- package/server/lib/opencode/providers-disabled.test.js +59 -0
- package/server/lib/opencode/providers.js +34 -0
- package/server/lib/opencode/proxy.js +11 -3
- package/server/lib/opencode/routes.js +40 -2
- package/server/lib/opencode/settings-helpers.js +27 -1
- package/server/lib/opencode/settings-helpers.test.js +19 -7
- package/server/lib/opencode/settings-registry.json +27 -16
- package/server/lib/opencode/settings-runtime.test.js +18 -0
- package/server/lib/opencode/shared-service-runtime.js +23 -104
- package/server/lib/opencode/shared.js +77 -46
- package/server/lib/opencode/shared.test.js +12 -12
- package/server/lib/opencode/shutdown-runtime.test.js +2 -3
- package/server/lib/opencode/skill-routes.js +123 -38
- package/server/lib/opencode/skill-routes.test.js +201 -0
- package/server/lib/opencode/skills.js +81 -34
- package/server/lib/opencode/skills.test.js +176 -21
- package/server/lib/opencode/startup-pipeline-runtime.js +6 -3
- package/server/lib/opencode/startup-pipeline-runtime.test.js +2 -1
- package/server/lib/opencode/watcher.test.js +0 -54
- package/server/lib/outbound-proxy.js +52 -0
- package/server/lib/outbound-proxy.test.js +55 -0
- package/server/lib/package-manager.js +23 -17
- package/server/lib/package-manager.test.js +5 -18
- package/server/lib/permission-auto-accept/DOCUMENTATION.md +1 -1
- package/server/lib/permission-auto-accept/runtime.js +19 -47
- package/server/lib/permission-auto-accept/runtime.test.js +2 -2
- package/server/lib/project-context/DOCUMENTATION.md +7 -1
- package/server/lib/project-context/routes.js +1 -2
- package/server/lib/project-context/runtime.js +12 -14
- package/server/lib/project-context/runtime.test.js +78 -2
- package/server/lib/projects/project-config.js +30 -15
- package/server/lib/projects/project-config.test.js +30 -0
- package/server/lib/projects/project-setup.js +1 -2
- package/server/lib/projects/routes.js +1 -2
- package/server/lib/quota/DOCUMENTATION.md +35 -7
- package/server/lib/quota/index.js +1 -0
- package/server/lib/quota/providers/claude/index.js +1 -1
- package/server/lib/quota/providers/cline-pass.js +1 -1
- package/server/lib/quota/providers/exe-dev.js +1 -1
- package/server/lib/quota/providers/google/index.js +1 -1
- package/server/lib/quota/providers/hyper.js +1 -1
- package/server/lib/quota/providers/kimi.js +116 -36
- package/server/lib/quota/providers/kimi.test.js +128 -3
- package/server/lib/quota/providers/opencode-go.js +144 -21
- package/server/lib/quota/providers/opencode-go.test.js +229 -6
- package/server/lib/quota/providers/openrouter.js +1 -1
- package/server/lib/quota/providers/zenmux.js +1 -1
- package/server/lib/quota/utils/auth.js +1 -0
- package/server/lib/quota/utils/transformers.js +2 -6
- package/server/lib/relay/DOCUMENTATION.md +18 -3
- package/server/lib/relay/e2ee.js +7 -7
- package/server/lib/relay/host-client.js +84 -13
- package/server/lib/relay/host-client.test.js +201 -1
- package/server/lib/relay/identity.js +6 -29
- package/server/lib/relay/identity.test.js +18 -28
- package/server/lib/relay/key-store.js +141 -0
- package/server/lib/relay/key-store.test.js +138 -0
- package/server/lib/relay/service.js +8 -8
- package/server/lib/relay/service.test.js +10 -5
- package/server/lib/relay/signing-key.js +13 -36
- package/server/lib/relay/tunnel-codec.js +10 -10
- package/server/lib/route-module-exports.test.js +22 -0
- package/server/lib/routing/DOCUMENTATION.md +23 -3
- package/server/lib/routing/cache.js +87 -0
- package/server/lib/routing/defaults.js +11 -0
- package/server/lib/routing/history.js +12 -4
- package/server/lib/routing/runtime.js +39 -3
- package/server/lib/routing/runtime.test.js +81 -2
- package/server/lib/routing/store.js +12 -1
- package/server/lib/routing/store.test.js +13 -0
- package/server/lib/scheduled-tasks/DOCUMENTATION.md +59 -1
- package/server/lib/scheduled-tasks/existing-session.js +119 -0
- package/server/lib/scheduled-tasks/existing-session.test.js +350 -0
- package/server/lib/scheduled-tasks/loops.js +1 -8
- package/server/lib/scheduled-tasks/routes.js +8 -8
- package/server/lib/scheduled-tasks/runtime.js +103 -13
- package/server/lib/scheduled-tasks/runtime.test.js +48 -0
- package/server/lib/scheduled-tasks/service.js +33 -11
- package/server/lib/scheduled-tasks/service.test.js +128 -2
- package/server/lib/scheduled-tasks/session-defaults.js +27 -0
- package/server/lib/scheduled-tasks/session-defaults.test.js +19 -0
- package/server/lib/session-assist/context.js +1 -0
- package/server/lib/session-folders/routes.js +2 -2
- package/server/lib/session-goal/objectives.js +1 -1
- package/server/lib/session-knowledge/routes.js +2 -2
- package/server/lib/session-knowledge/runtime.js +1 -2
- package/server/lib/session-work/DOCUMENTATION.md +39 -14
- package/server/lib/session-work/questions.js +31 -2
- package/server/lib/session-work/runtime.js +22 -13
- package/server/lib/session-work/runtime.test.js +43 -26
- package/server/lib/session-work/state.js +10 -4
- package/server/lib/session-work/state.test.js +8 -1
- package/server/lib/shared/DOCUMENTATION.md +89 -0
- package/server/lib/shared/guards.js +53 -0
- package/server/lib/shared/guards.test.js +112 -0
- package/server/lib/skills-catalog/DOCUMENTATION.md +10 -8
- package/server/lib/skills-catalog/cache.js +3 -2
- package/server/lib/skills-catalog/curated-sources.js +5 -1
- package/server/lib/skills-catalog/git.js +107 -20
- package/server/lib/skills-catalog/git.test.js +78 -0
- package/server/lib/skills-catalog/install.js +21 -12
- package/server/lib/skills-catalog/scan.js +25 -15
- package/server/lib/skills-catalog/source.js +26 -1
- package/server/lib/skills-catalog/source.test.js +27 -0
- package/server/lib/source-control/DOCUMENTATION.md +2 -1
- package/server/lib/source-control/audit-storage.js +7 -6
- package/server/lib/source-control/audit-storage.test.js +11 -0
- package/server/lib/source-control/binding-service.js +2 -5
- package/server/lib/source-control/change-request-worktree.js +90 -0
- package/server/lib/source-control/change-request-worktree.test.js +121 -0
- package/server/lib/source-control/mutation-executor.js +1 -1
- package/server/lib/source-control/mutation-storage.js +11 -5
- package/server/lib/source-control/provider-instance.js +1 -2
- package/server/lib/source-control/repository-identity.js +1 -1
- package/server/lib/source-control/routes.js +14 -2
- package/server/lib/spaces/DOCUMENTATION.md +42 -17
- package/server/lib/spaces/command-stream.test.js +15 -0
- package/server/lib/spaces/dispatcher.js +7 -0
- package/server/lib/spaces/dispatcher.test.js +17 -0
- package/server/lib/spaces/hardening.js +2 -2
- package/server/lib/spaces/hardening.test.js +1 -1
- package/server/lib/spaces/host.js +2 -0
- package/server/lib/spaces/journey.js +66 -5
- package/server/lib/spaces/journey.test.js +95 -4
- package/server/lib/spaces/layout.js +1 -1
- package/server/lib/spaces/places/docker-disk.js +38 -14
- package/server/lib/spaces/places/docker-disk.test.js +80 -1
- package/server/lib/spaces/places/docker.js +35 -11
- package/server/lib/spaces/places/fake-docker.js +22 -3
- package/server/lib/spaces/places/memory-place.js +3 -0
- package/server/lib/spaces/places/packed.docker.live.test.js +1 -1
- package/server/lib/spaces/routes.js +5 -0
- package/server/lib/spaces/routes.test.js +4 -2
- package/server/lib/spaces/run-command.js +9 -2
- package/server/lib/spaces/tools.js +4 -5
- package/server/lib/spaces/tools.test.js +2 -2
- package/server/lib/terminal/runtime.js +18 -6
- package/server/lib/terminal/runtime.test.js +66 -0
- package/server/lib/tts/index.js +3 -0
- package/server/lib/tts/service.js +4 -2
- package/server/lib/walkthrough/DOCUMENTATION.md +3 -1
- package/server/lib/walkthrough/index.js +2 -3
- package/server/lib/walkthrough/pr-source.test.js +22 -0
- package/server/lib/walkthrough/sources.js +6 -1
- package/server/opencode-proxy.test.js +127 -0
- package/bin/lib/commands-startup.test.js +0 -15
- package/dist/assets/CodeMirrorCommentWidgets-CVDSjcrP.js +0 -1
- package/dist/assets/DiffView-Ct7vL3fD.js +0 -4
- package/dist/assets/FilesView-DT0uEYgT.js +0 -17
- package/dist/assets/GuestSurfacePane-DVvk1VPu.js +0 -1
- package/dist/assets/LinearIssuesView-C10MwA9h.js +0 -1
- package/dist/assets/MarkdownImageGallery-BbN_K_3d.js +0 -1
- package/dist/assets/MarkdownRendererImpl-BLt2Tkk9.js +0 -10
- package/dist/assets/OnboardingScreen-Bgp5A3WB.js +0 -1
- package/dist/assets/PierreDiffViewer-CWJLj-S-.js +0 -210
- package/dist/assets/PlanView-DsRWnsOI.js +0 -5
- package/dist/assets/PublishDialog-CCeKloRu.js +0 -2
- package/dist/assets/SettingsView-BuPPsNPp.js +0 -30
- package/dist/assets/SettingsWindow-CM5fL8Ot.js +0 -1
- package/dist/assets/SubmoduleDiffSummary-CfsMcfiQ.js +0 -1
- package/dist/assets/ToolOutputDialog-mZrfSofz.js +0 -15
- package/dist/assets/ToolPartDiffPreview-BUGCRYEL.js +0 -8
- package/dist/assets/WalkthroughView-ClBo7PPd.js +0 -4
- package/dist/assets/appThemeRegistry-CxzMxR-H.js +0 -1
- package/dist/assets/de-CBla4hjd.js +0 -14
- package/dist/assets/es-BmnZtxTD.js +0 -20
- package/dist/assets/fileTreeStatus-BSHFIGEg.js +0 -1
- package/dist/assets/fr-OVKIBUZO.js +0 -18
- package/dist/assets/index-CKCFKmjF.js +0 -1
- package/dist/assets/index-Dbx4V4GN.css +0 -1
- package/dist/assets/index-vQ1Pg1cr.js +0 -61
- package/dist/assets/ja-6v-yr-gE.js +0 -20
- package/dist/assets/ko-I_ZLvgQ9.js +0 -20
- package/dist/assets/main-CmO4dRtR.js +0 -2
- package/dist/assets/main-b9vqhlYM.js +0 -999
- package/dist/assets/markdownCore-BPEZRQfP.js +0 -7
- package/dist/assets/miniChat-B5Oi7B-6.js +0 -2
- package/dist/assets/mobile-CVtShif9.js +0 -2
- package/dist/assets/nl-DcvIJf46.js +0 -20
- package/dist/assets/patchFileDiff-CW3wCH1O.js +0 -13
- package/dist/assets/pl-JxCUl0sd.js +0 -20
- package/dist/assets/pt-BR-L89mjja2.js +0 -20
- package/dist/assets/relocateRestoredSession-DYh_9oBa.js +0 -1
- package/dist/assets/renderElectronMiniChatApp-BD-1JHSg.js +0 -2
- package/dist/assets/renderMobileApp-7s5InXt1.js +0 -25
- package/dist/assets/runtimeEndpointReset-DqLJC6L1.js +0 -53
- package/dist/assets/shikiHighlight-CXgZnvHh.js +0 -1
- package/dist/assets/space-apply-1trGVIl8.js +0 -1
- package/dist/assets/space-close-y7j-NuBv.js +0 -1
- package/dist/assets/tr-ka5J1flt.js +0 -11
- package/dist/assets/uk-PyGe6Q_u.js +0 -20
- package/dist/assets/useInlineCommentController-CrjSGCpi.js +0 -2
- package/dist/assets/vendor-codemirror-lang-python-B7ClrMIT.js +0 -3
- package/dist/assets/vendor-codemirror-lang-xml-C8tGnS64.js +0 -1
- package/dist/assets/vendor-codemirror-language-data-q2bKO1EM.js +0 -2
- package/dist/assets/vendor-framer-motion-Bq3iTZ6r.js +0 -1
- package/dist/assets/vendor-katex-CHD9BdDO.js +0 -257
- package/dist/assets/vendor-katex-Cp579UoJ.css +0 -1
- package/dist/assets/zh-CN-B0P2tybJ.js +0 -20
- package/dist/assets/zh-TW-Bs9C5cN8.js +0 -20
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import{R as j,j as z,c as Re,f as pt,r as f}from"./vendor-react-BUCujlKS.js";import{p as mt,a as gt}from"./parseDiffFromFile-BUgn-T9p.js";import{b as Ge}from"./isDiffPlainText-Dgbw8VKk.js";import{V as yt,F as xt}from"./VirtualizedFileDiff-CFpjL8Ns.js";import{V as vt}from"./Virtualizer-C0IsclZn.js";import{f as lt,fC as bt,fD as Xe,bJ as wt,cA as Lt,h as Ye}from"./useAppFontEffects-DGlvOqP_.js";import"./index-DxNa7xYB.js";import{I as Je,a as kt,u as Rt}from"./useInlineCommentController-kMN4Wg_D.js";import{bw as St}from"./runtimeEndpointReset-CZ5aafpl.js";import{ensurePierreThemeRegistered as Qe,getResolvedShikiTheme as Ze}from"./appThemeRegistry-B9gkFq9i.js";const Se=t=>{if(t.type==="new"){const e=Math.min(t.selection.start,t.selection.end),i=Math.max(t.selection.start,t.selection.end);return`new-comment-${t.selection.side??"additions"}-${e}-${i}`}return`draft-${t.draft.id}`},Ct=t=>{const{drafts:e,editingDraftId:i,selection:r}=t,a=[];for(const d of e){if(!Number.isFinite(d.endLine))continue;const s=Math.max(1,Math.floor(d.endLine)),m=d.side==="original"?"deletions":"additions";a.push({lineNumber:s,side:m,metadata:{type:d.id===i?"edit":"saved",draft:d}})}return r&&!i&&a.push({lineNumber:Math.max(r.start,r.end),side:r.side??"additions",metadata:{type:"new",selection:r}}),a};function Et(t){const e=t.trim();if(!e)return null;if(/^-?\d+(\.\d+)?$/.test(e)){const i=Number.parseFloat(e);return Number.isFinite(i)?i:null}if(e.endsWith("px")){const i=Number.parseFloat(e.slice(0,-2));return Number.isFinite(i)?i:null}return null}function et(t){if(!(!t||t<=0))return Math.max(200,Math.floor(t))}function It(t){const{diffRootRef:e,drafts:i,selection:r,editingDraftId:a,commentText:d,onTextChange:s,fileLabel:m,onSave:l,onCancel:h,onEdit:L,onDelete:b}=t,[M,E]=j.useState(0),[F,N]=j.useState(null),A=j.useMemo(()=>!r||a?null:Se({type:"new",selection:r}),[a,r]),$=j.useMemo(()=>{const p=i.map(S=>Se({type:S.id===a?"edit":"saved",draft:S}));return A&&p.push(A),p},[i,a,A]),V=j.useCallback(p=>{const S=e.current;if(!S)return null;const H=S.querySelector("diffs-container");if(!(H instanceof HTMLElement))return null;const B=H.querySelector(`[data-annotation-id="${p}"]`);if(B instanceof HTMLElement)return B;const W=H.shadowRoot;return W?W.querySelector(`[data-annotation-id="${p}"]`):null},[e]);j.useEffect(()=>{if($.length===0)return;let p=!1,S=0;const H=12,B=()=>{p||$.every(P=>!!V(P))||S>=H||(S+=1,requestAnimationFrame(()=>{p||(E(P=>P+1),B())}))};return B(),()=>{p=!0}},[$,V]),j.useEffect(()=>{const p=e.current;if(!p)return;const S=()=>{const B=getComputedStyle(p),W=Et(B.getPropertyValue("--oc-context-panel-width")),P=p.getBoundingClientRect(),O=W??P.width;N(O>0?O:null)};S();const H=new ResizeObserver(()=>{S()});return H.observe(p),window.addEventListener("resize",S),()=>{H.disconnect(),window.removeEventListener("resize",S)}},[e]);const _=j.useCallback(p=>{const H=e.current?.getBoundingClientRect(),B=p.closest("[data-annotation-content]"),W=B instanceof HTMLElement?B.getBoundingClientRect():p.getBoundingClientRect(),P=[W.width];H&&P.push(H.right-W.left);const O=P.filter(ie=>Number.isFinite(ie)&&ie>0);return O.length>0?et(Math.min(...O)):et(F)},[e,F]),ae=()=>{const p=e.current?.querySelector("diffs-container")?.shadowRoot,S=p?Array.from(p.querySelectorAll("[data-line][data-selected-line]")).at(-1):void 0;if(S)return getComputedStyle(S).getPropertyValue("--diffs-computed-selected-line-bg").trim()||void 0};return z.jsxs(z.Fragment,{children:[i.map(p=>{const S=Se({type:p.id===a?"edit":"saved",draft:p}),H=V(S);if(!H)return null;const B=_(H);return p.id===a?Re.createPortal(z.jsx(Je,{initialText:d,onTextChange:s,fileLabel:m,lineRange:{start:p.startLine,end:p.endLine,side:p.side==="original"?"deletions":"additions"},isEditing:!0,onSave:l,onCancel:h,maxWidth:B,bandColor:ae()}),H,`draft-edit-${p.id}`):Re.createPortal(z.jsx(kt,{draft:p,onEdit:()=>L(p),onDelete:()=>b(p),maxWidth:B}),H,`draft-card-${p.id}`)}),r&&!a&&A&&(()=>{const p=V(A);if(!p)return null;const S=_(p);return Re.createPortal(z.jsx(Je,{initialText:d,onTextChange:s,fileLabel:m,lineRange:r,isEditing:!1,onSave:l,onCancel:h,maxWidth:S,bandColor:ae()}),p,A)})()]})}const De=3,Tt=1e6,tt=new WeakMap,Mt=t=>{const e=tt.get(t);if(e)return e;let i=!1;const r=[];for(const d of t.hunks){const s=[];for(const m of d.hunkContent){if(m.type==="context"){ze(s,{...m});continue}const l=At(t,m);(l.length>1||l[0]?.type==="context")&&(i=!0);for(const h of l)ze(s,h)}r.push(...Ft(d,s))}const a=i?Ht(t,r):t;return tt.set(t,a),a},nt=t=>t.replace(/\s+/g,""),At=(t,e)=>{if(e.deletions===0||e.additions===0)return[{...e}];const i=t.deletionLines.slice(e.deletionLineIndex,e.deletionLineIndex+e.deletions),r=t.additionLines.slice(e.additionLineIndex,e.additionLineIndex+e.additions),a=[];let d=0,s=0;for(const[m,l]of Pt(i,r))(m>d||l>s)&&a.push({type:"change",deletions:m-d,deletionLineIndex:e.deletionLineIndex+d,additions:l-s,additionLineIndex:e.additionLineIndex+s}),ze(a,{type:"context",lines:1,deletionLineIndex:e.deletionLineIndex+m,additionLineIndex:e.additionLineIndex+l}),d=m+1,s=l+1;return(d<e.deletions||s<e.additions)&&a.push({type:"change",deletions:e.deletions-d,deletionLineIndex:e.deletionLineIndex+d,additions:e.additions-s,additionLineIndex:e.additionLineIndex+s}),a},Pt=(t,e)=>{const i=t.map(nt),r=e.map(nt),a=[];let d=0;for(;d<i.length&&d<r.length&&i[d]===r[d];)a.push([d,d]),d+=1;let s=0;for(;s<i.length-d&&s<r.length-d&&i[i.length-1-s]===r[r.length-1-s];)s+=1;const m=i.length-d-s,l=r.length-d-s;if(m>0&&l>0&&(m+1)*(l+1)<=Tt){const h=l+1,L=new Uint32Array((m+1)*h);for(let E=m-1;E>=0;E-=1)for(let F=l-1;F>=0;F-=1)L[E*h+F]=i[d+E]===r[d+F]?L[(E+1)*h+F+1]+1:Math.max(L[(E+1)*h+F],L[E*h+F+1]);let b=0,M=0;for(;b<m&&M<l;)i[d+b]===r[d+M]?(a.push([d+b,d+M]),b+=1,M+=1):L[(b+1)*h+M]>=L[b*h+M+1]?b+=1:M+=1}for(let h=s;h>0;h-=1)a.push([i.length-h,r.length-h]);return a},ze=(t,e)=>{const i=t.at(-1);if(i?.type==="context"&&e.type==="context"){i.lines+=e.lines;return}t.push(e)},it=(t,e,i)=>({type:"context",lines:i,deletionLineIndex:t.deletionLineIndex+e,additionLineIndex:t.additionLineIndex+e}),Ft=(t,e)=>{const i=[];let r=null;for(const[d,s]of e.entries()){if(s.type==="change"){if(!r){r=[];const l=e[d-1];if(l?.type==="context"){const h=Math.min(l.lines,De);r.push(it(l,l.lines-h,h))}}r.push(s);continue}if(!r)continue;if(d<e.length-1&&s.lines<=De*2){r.push(s);continue}r.push(it(s,0,Math.min(s.lines,De))),i.push(r),r=null}r&&i.push(r);const a=e.at(-1);return i.map(d=>{const s=d.at(-1),m=s!==void 0&&a!==void 0&&Le(s,"deletion")===Le(a,"deletion")&&Le(s,"addition")===Le(a,"addition");return Nt(t,d,m)})},Le=(t,e)=>e==="deletion"?t.deletionLineIndex+(t.type==="context"?t.lines:t.deletions):t.additionLineIndex+(t.type==="context"?t.lines:t.additions),Nt=(t,e,i)=>{let r=0,a=0,d=0,s=0,m=0;for(const N of e)N.type==="context"?(d+=N.lines,s+=N.lines,m+=N.lines):(r+=N.additions,a+=N.deletions,s+=Math.max(N.additions,N.deletions),m+=N.additions+N.deletions);const l=e[0],h=d+r,L=d+a,b=rt(Ce(t.additionStart,t.additionCount)+l.additionLineIndex-t.additionLineIndex,h),M=rt(Ce(t.deletionStart,t.deletionCount)+l.deletionLineIndex-t.deletionLineIndex,L),F=l.additionLineIndex===t.additionLineIndex&&l.deletionLineIndex===t.deletionLineIndex?t.hunkContext:void 0;return{collapsedBefore:0,additionStart:b,additionCount:h,additionLines:r,additionLineIndex:l.additionLineIndex,deletionStart:M,deletionCount:L,deletionLines:a,deletionLineIndex:l.deletionLineIndex,hunkContent:e,hunkContext:F,hunkSpecs:`@@ -${M},${L} +${b},${h} @@${F?` ${F}`:""}
|
|
2
|
+
`,splitLineStart:0,splitLineCount:s,unifiedLineStart:0,unifiedLineCount:m,noEOFCRDeletions:i&&t.noEOFCRDeletions,noEOFCRAdditions:i&&t.noEOFCRAdditions}},Ce=(t,e)=>t-(e===0?0:1),rt=(t,e)=>t+(e===0?0:1),Ht=(t,e)=>{let i=0,r=0,a=0;for(const s of e)s.collapsedBefore=Math.max(Ce(s.additionStart,s.additionCount)-a,0),s.splitLineStart=i+s.collapsedBefore,s.unifiedLineStart=r+s.collapsedBefore,i+=s.collapsedBefore+s.splitLineCount,r+=s.collapsedBefore+s.unifiedLineCount,a=Ce(s.additionStart,s.additionCount)+s.additionCount;if(e.at(-1)&&!t.isPartial&&t.additionLines.length>0&&t.deletionLines.length>0){const s=Math.max(t.additionLines.length-a,0);i+=s,r+=s}return{...t,hunks:e,splitLineCount:i,unifiedLineCount:r,cacheKey:t.cacheKey===void 0?void 0:`${t.cacheKey}:hide-whitespace`}},ot=[],Dt=`
|
|
3
|
+
[data-gutter-buffer="annotation"] { min-height: 0; }
|
|
4
|
+
[data-code] { min-height: 2.5rem; align-content: start; }
|
|
5
|
+
`,st=5e5,$t=`
|
|
6
|
+
:host {
|
|
7
|
+
font-family: var(--font-mono);
|
|
8
|
+
font-size: var(--text-code);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
pre, [data-code] {
|
|
12
|
+
font-family: var(--font-mono);
|
|
13
|
+
font-size: var(--text-code);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/* Mobile touch selection support */
|
|
17
|
+
[data-line-number] {
|
|
18
|
+
touch-action: manipulation;
|
|
19
|
+
-webkit-tap-highlight-color: transparent;
|
|
20
|
+
cursor: pointer;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/* Ensure interactive line numbers work on touch */
|
|
24
|
+
pre[data-interactive-line-numbers] [data-line-number] {
|
|
25
|
+
touch-action: manipulation;
|
|
26
|
+
}
|
|
27
|
+
`,at=`
|
|
28
|
+
${$t}
|
|
29
|
+
|
|
30
|
+
/* While a multi-line content drag is being mapped to a line selection the
|
|
31
|
+
row highlight is the feedback; the native blue text selection on top of
|
|
32
|
+
it reads as double-selection, so it is painted transparent for the drag's
|
|
33
|
+
duration only (single-line selections keep the normal look for copying). */
|
|
34
|
+
:host([data-oc-comment-drag]) {
|
|
35
|
+
user-select: none;
|
|
36
|
+
-webkit-user-select: none;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/* Gutter "+" comment utility: theme primary, and smaller than Pierre's
|
|
40
|
+
1lh default, which reads oversized next to our 13px line numbers. */
|
|
41
|
+
[data-utility-button] {
|
|
42
|
+
width: 16px;
|
|
43
|
+
height: 16px;
|
|
44
|
+
align-self: center;
|
|
45
|
+
margin-right: calc(-16px + 1ch);
|
|
46
|
+
border-radius: 5px;
|
|
47
|
+
background-color: var(--primary-base);
|
|
48
|
+
color: var(--primary-foreground);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
:host {
|
|
52
|
+
--diffs-bg-separator-override: var(--surface-elevated);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/* Selected rows: Pierre mixes the selection colour in at 18-25%, and the
|
|
56
|
+
theme's selection is a soft neutral, so the selection barely showed on
|
|
57
|
+
dark themes. Half the selection colour stays readable while added and
|
|
58
|
+
deleted rows keep their tint. */
|
|
59
|
+
[data-line][data-selected-line],
|
|
60
|
+
[data-line-annotation][data-selected-line],
|
|
61
|
+
[data-no-newline][data-selected-line] {
|
|
62
|
+
--mix-selection-light: 62%;
|
|
63
|
+
--mix-selection-dark: 50%;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
[data-gutter-buffer][data-selected-line],
|
|
67
|
+
[data-column-number][data-selected-line] {
|
|
68
|
+
--mix-selection-light: 55%;
|
|
69
|
+
--mix-selection-dark: 40%;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
[data-diff-header],
|
|
73
|
+
[data-diff] {
|
|
74
|
+
[data-separator] {
|
|
75
|
+
height: 24px !important;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
[data-separator="line-info-basic"] {
|
|
80
|
+
height: 24px !important;
|
|
81
|
+
background: var(--diffs-bg) !important;
|
|
82
|
+
position: relative;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
[data-diff-type="single"] [data-gutter],
|
|
86
|
+
[data-diff-type="split"] [data-deletions] [data-gutter] {
|
|
87
|
+
[data-separator-wrapper] {
|
|
88
|
+
position: absolute;
|
|
89
|
+
left: 100%;
|
|
90
|
+
display: flex;
|
|
91
|
+
align-items: center;
|
|
92
|
+
gap: unset;
|
|
93
|
+
width: max-content;
|
|
94
|
+
background: transparent;
|
|
95
|
+
color: var(--diffs-fg-number);
|
|
96
|
+
font-family: var(--diffs-header-font-family, var(--font-sans));
|
|
97
|
+
font-size: 0.75rem;
|
|
98
|
+
line-height: 1;
|
|
99
|
+
margin-left: calc(-2ch - 2px);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
[data-separator-wrapper][data-separator-multi-button] {
|
|
103
|
+
margin-left: calc(-3ch - 2px);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
[data-expand-button],
|
|
107
|
+
[data-separator-content] {
|
|
108
|
+
display: block;
|
|
109
|
+
align-self: unset;
|
|
110
|
+
min-width: unset;
|
|
111
|
+
min-height: unset;
|
|
112
|
+
padding: 0;
|
|
113
|
+
flex-shrink: 0;
|
|
114
|
+
grid-column: unset;
|
|
115
|
+
border: none;
|
|
116
|
+
width: auto;
|
|
117
|
+
height: auto;
|
|
118
|
+
background-color: transparent;
|
|
119
|
+
color: inherit;
|
|
120
|
+
font: inherit;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
[data-expand-button]:not([data-expand-all-button]) {
|
|
124
|
+
&[data-expand-down]::before {
|
|
125
|
+
content: '\\2191';
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
&[data-expand-up]::before {
|
|
129
|
+
content: '\\2193';
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
&[data-expand-both]::before {
|
|
133
|
+
content: '\\2195';
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
svg {
|
|
137
|
+
display: none;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
[data-separator-content] {
|
|
142
|
+
background: transparent;
|
|
143
|
+
margin-left: calc(2px + 1ch);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
[data-expand-all-button] {
|
|
147
|
+
position: relative;
|
|
148
|
+
margin-left: 14px;
|
|
149
|
+
text-transform: lowercase;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
[data-expand-all-button]::before {
|
|
153
|
+
content: '';
|
|
154
|
+
display: block;
|
|
155
|
+
position: absolute;
|
|
156
|
+
top: 50%;
|
|
157
|
+
left: -8px;
|
|
158
|
+
margin-top: -1px;
|
|
159
|
+
width: 3px;
|
|
160
|
+
height: 3px;
|
|
161
|
+
border-radius: 2px;
|
|
162
|
+
background-color: var(--diffs-fg-number);
|
|
163
|
+
pointer-events: none;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
[data-separator-content]:hover,
|
|
167
|
+
[data-expand-button]:hover,
|
|
168
|
+
[data-expand-all-button]:hover {
|
|
169
|
+
color: var(--diffs-fg);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
[data-expand-all-button]:hover {
|
|
173
|
+
text-decoration: underline;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/* Partial diffs get no expand buttons from Pierre (the lines are not
|
|
178
|
+
loaded). When the owner can load them on demand, the gutter separator
|
|
179
|
+
itself becomes the button and shows the same glyphs as the real one. */
|
|
180
|
+
:host([data-oc-expand-on-demand]) [data-diff-type="single"] [data-gutter] [data-separator-wrapper],
|
|
181
|
+
:host([data-oc-expand-on-demand]) [data-diff-type="split"] [data-deletions] [data-gutter] [data-separator-wrapper] {
|
|
182
|
+
cursor: pointer;
|
|
183
|
+
|
|
184
|
+
&::before {
|
|
185
|
+
content: '\\2195';
|
|
186
|
+
display: block;
|
|
187
|
+
flex-shrink: 0;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
&:hover {
|
|
191
|
+
color: var(--diffs-fg);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
:host([data-oc-expand-on-demand]) [data-diff-type="single"] [data-gutter] [data-separator-first] [data-separator-wrapper]::before,
|
|
196
|
+
:host([data-oc-expand-on-demand]) [data-diff-type="split"] [data-deletions] [data-gutter] [data-separator-first] [data-separator-wrapper]::before {
|
|
197
|
+
content: '\\2191';
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/* Full file requested: the glyph becomes a spinner and the separators stop
|
|
201
|
+
taking clicks until the highlighted full diff replaces this one. */
|
|
202
|
+
:host([data-oc-expand-loading]) [data-diff-type="single"] [data-gutter] [data-separator-wrapper],
|
|
203
|
+
:host([data-oc-expand-loading]) [data-diff-type="split"] [data-deletions] [data-gutter] [data-separator-wrapper] {
|
|
204
|
+
cursor: default;
|
|
205
|
+
pointer-events: none;
|
|
206
|
+
opacity: 0.6;
|
|
207
|
+
|
|
208
|
+
&::before {
|
|
209
|
+
content: '';
|
|
210
|
+
width: 9px;
|
|
211
|
+
height: 9px;
|
|
212
|
+
margin-right: 3px;
|
|
213
|
+
border-radius: 50%;
|
|
214
|
+
border: 1.5px solid currentColor;
|
|
215
|
+
border-right-color: transparent;
|
|
216
|
+
animation: oc-expand-spin 0.8s linear infinite;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
@keyframes oc-expand-spin {
|
|
221
|
+
to { transform: rotate(360deg); }
|
|
222
|
+
}
|
|
223
|
+
`;function zt(t){let e=2166136261;for(let i=0;i<t.length;i+=1)e^=t.charCodeAt(i),e=e+((e<<1)+(e<<4)+(e<<7)+(e<<8)+(e<<24))>>>0;return e.toString(16)}function Ee(t){const e=t.length>400?`${t.slice(0,200)}${t.slice(-200)}`:t;return`${t.length}:${zt(e)}`}const Bt=2e3,Ot=(t,e)=>{const[i,r]=j.useState(t),a=f.useRef(t);return f.useEffect(()=>{if(t===a.current)return;const d=a.current,s=()=>{a.current=t,r(t)};if(!(d!==void 0&&t!==void 0&&d.isPartial&&!t.isPartial&&d.name===t.name&&e?.isWorkingPool()===!0)){s();return}t.cacheKey??=["diff",t.name,t.prevObjectId??Ee(t.deletionLines.join(`
|
|
224
|
+
`)),t.newObjectId??Ee(t.additionLines.join(`
|
|
225
|
+
`))].join(":");let l=!1,h,L;const b=()=>{l||(l=!0,h?.(),clearTimeout(L))},M=()=>{l||(b(),s())},E=()=>{e.getDiffResultCache(t)&&M()};if(h=e.subscribeToStatChanges(E),l){h();return}return L=setTimeout(M,Bt),e.primeDiffHighlightCache(t),E(),b},[t,e]),i},qt=(t,e,i,r)=>{const a=r.side==="deletions",s=(i?(a?i.deletionLines:i.additionLines).join(""):a?t:e).split(`
|
|
226
|
+
`),m=Math.min(r.start,r.end),l=Math.max(r.start,r.end),h=Math.max(1,m),L=Math.min(s.length,l);return h>L?"":s.slice(h-1,L).join(`
|
|
227
|
+
`)},Wt=(t,e)=>t===e?!0:!t||!e?!1:t.start===e.start&&t.end===e.end&&t.side===e.side,jt=t=>t==="auto"||t==="scroll"||t==="overlay",Vt=t=>{let e=t?.parentElement??null;for(;e;){const i=window.getComputedStyle(e);if(jt(i.overflowY))return e;e=e.parentElement}return null},_t=(t,e)=>{if(!t||!e||typeof window>"u")return()=>{};const i=Vt(t);if(!i)return()=>{};const r=e.getBoundingClientRect().height;if(!r)return()=>{};const a=t.getBoundingClientRect().top-i.getBoundingClientRect().top,d=e.style.minHeight;e.style.minHeight=`${Math.ceil(r)}px`;let s=!1;return()=>{if(s)return;s=!0,e.style.minHeight=d;const l=t.getBoundingClientRect().top-i.getBoundingClientRect().top-a;l&&(i.scrollTop+=l)}},Ut=(t,e)=>{const i=t.find(h=>h instanceof HTMLElement&&h.hasAttribute("data-separator"));if(!i)return null;let r=i.nextElementSibling;for(;r&&!r.hasAttribute("data-line-index");)r=r.nextElementSibling;const[a,d]=r?.getAttribute("data-line-index")?.split(",")??[],s=Number.parseInt(a??"",10),m=Number.parseInt(d??"",10);if(Number.isNaN(s)||Number.isNaN(m))return null;const l=e.hunks.find(h=>h.unifiedLineStart<=s&&s<h.unifiedLineStart+h.unifiedLineCount&&h.splitLineStart<=m&&m<h.splitLineStart+h.splitLineCount);return l?{gap:"before-hunk",additionStart:l.additionStart,direction:i.hasAttribute("data-separator-first")?"down":"both"}:null},Kt=3,Gt=t=>{if(t.type==="new"||t.type==="deleted")return null;const e=t.hunks.at(-1),i=e?.hunkContent.at(-1);return!e||i?.type!=="context"||i.lines<Kt||e.noEOFCRAdditions||e.noEOFCRDeletions?null:{side:"deletions",lineNumber:e.deletionStart+e.deletionCount-1,metadata:{type:"trailing-expand"}}},$e=(t,e)=>{if(typeof window>"u")return()=>{};let i=null,r=null,a=!1;const d=()=>{a||(r?.disconnect(),r=null,i=window.requestAnimationFrame(()=>{i=window.requestAnimationFrame(()=>{a||e()})}))},s=()=>t.querySelector("diffs-container")?.shadowRoot??void 0,m=(l=s())=>!!l?.querySelector("[data-line]");return m()?d():typeof MutationObserver<"u"?(r=new MutationObserver(()=>{const l=s();if(l){if(m(l)){d();return}r?.disconnect(),r=new MutationObserver(()=>{m(l)&&d()}),r.observe(l,{childList:!0,subtree:!0})}}),r.observe(t,{childList:!0,subtree:!0})):i=window.requestAnimationFrame(d),()=>{a=!0,r?.disconnect(),i!==null&&window.cancelAnimationFrame(i)}},ke=new WeakMap,Xt={lineHeight:24,hunkSeparatorHeight:24,spacing:0};function Yt(t){const e=t.closest("[data-diff-virtual-root]");if(e instanceof HTMLElement){const i=e.querySelector("[data-diff-virtual-content]");return{key:e,root:e,content:i instanceof HTMLElement?i:void 0}}return{key:document,root:document,content:void 0}}function Jt(t){if(typeof document>"u")return null;const e=Yt(t);let i=ke.get(e.key);if(!i){const a=new vt;a.setup(e.root,e.content),i={virtualizer:a,refs:0},ke.set(e.key,i)}i.refs+=1;let r=!1;return{virtualizer:i.virtualizer,root:e.root,release:()=>{if(r)return;r=!0;const a=ke.get(e.key);a&&(a.refs-=1,!(a.refs>0)&&(a.virtualizer.cleanUp(),ke.delete(e.key)))}}}const Qt=(t,e,i)=>{if(typeof window>"u")return()=>{};const r=[],a=()=>{try{t.rerender()}catch{}const d=e?.root;d instanceof HTMLElement?d.dispatchEvent(new Event("scroll",{bubbles:!1})):document.dispatchEvent(new Event("scroll",{bubbles:!1})),window.dispatchEvent(new Event("resize")),i()};return r.push(window.requestAnimationFrame(a)),r.push(window.requestAnimationFrame(()=>{r.push(window.requestAnimationFrame(a))})),()=>{for(const d of r)window.cancelAnimationFrame(d)}},un=t=>{const e=pt.c(19);let i,r;e[0]!==t?({hideWhitespace:r,...i}=t,e[0]=t,e[1]=i,e[2]=r):(i=e[1],r=e[2]);const a=r===void 0?!1:r,{t:d}=lt(),{original:s,modified:m,fileDiff:l,fileName:h}=i;let L;e:{if(!a||l){L=l;break e}let A;e[3]!==h||e[4]!==m||e[5]!==s?(A=mt({name:h??"",contents:s},{name:h??"",contents:m}),e[3]=h,e[4]=m,e[5]=s,e[6]=A):A=e[6],L=A}const b=L;let M;e[7]!==l||e[8]!==a||e[9]!==b?(M=a&&b?Mt(b):l,e[7]=l,e[8]=a,e[9]=b,e[10]=M):M=e[10];const E=M;if(a&&b&&b.hunks.length>0&&E?.hunks.length===0){let A;e[11]!==d?(A=d("diffView.state.whitespaceOnly"),e[11]=d,e[12]=A):A=e[12];let $;return e[13]!==A?($=z.jsx("div",{className:"px-3 py-2 typography-meta text-muted-foreground",children:A}),e[13]=A,e[14]=$):$=e[14],$}const F=a?void 0:i.hunkActions;let N;return e[15]!==i||e[16]!==F||e[17]!==E?(N=z.jsx(Zt,{...i,fileDiff:E,hunkActions:F}),e[15]=i,e[16]=F,e[17]=E,e[18]=N):N=e[18],N},Zt=({original:t,modified:e,fileDiff:i,language:r,fileName:a,renderSideBySide:d,wrapLines:s,layout:m="fill",enableComments:l=!0,hunkActions:h,onExpandContextRequest:L,pendingContextExpansion:b=null,contextLoading:M=!1})=>{const E=bt(),{t:F}=lt(),N=F("diffView.actions.showLinesBelow"),A=f.useRef(()=>{}),$=E?.currentTheme.metadata.variant==="dark",V=E?.availableThemes.find(n=>n.metadata.id===E.lightThemeId)??Xe(!1),_=E?.availableThemes.find(n=>n.metadata.id===E.darkThemeId)??Xe(!0),{isMobile:ae}=wt(),p=h?.anchors??ot,[S,H]=j.useState(()=>({fileDiff:void 0,anchors:ot,targets:new Map})),B=Rt({source:"diff",fileLabel:a||"unknown",language:r,getCodeForRange:n=>qt(t,e,i,n),toStoreRange:n=>({startLine:n.start,endLine:n.end,side:n.side==="deletions"?"original":"modified"}),fromDraftRange:n=>({start:n.startLine,end:n.endLine,side:n.side==="original"?"deletions":"additions"})}),{drafts:W,selection:P,setSelection:O,commentText:ie,setCommentText:U,editingDraftId:le,saveComment:Be,cancel:Oe,startEdit:dt,deleteDraft:ct}=B,ge=f.useRef(null),Z=f.useRef(null),de=f.useRef(""),K=f.useRef(!1),ye=f.useRef(null);f.useEffect(()=>{ge.current=P},[P]),f.useEffect(()=>{Z.current=le},[le]),f.useEffect(()=>{de.current=ie},[ie]);const xe=f.useCallback(n=>{if(!l||K.current)return;const o=ge.current;if(!(!n&&o&&de.current.trim())){if(ae&&o&&n&&n.side===o.side){const c=Math.min(o.start,n.start),u=Math.max(o.end,n.end);O({...n,start:c,end:u})}else O(n);n&&(Z.current||U(""))}},[l,ae,U,O]),ut=f.useCallback(()=>{Oe()},[Oe]),qe=f.useCallback(n=>{const o=document.createElement("div");if(o.style.position="relative",n.metadata.type==="hunk-action")return o.dataset.hunkActionTarget=String(n.metadata.index),o.style.height="0px",o;if(n.metadata.type==="trailing-expand"){const u=document.createElement("button");return u.type="button",u.dataset.ocTrailingExpand="",u.textContent=N,u.addEventListener("click",x=>{x.stopPropagation(),A.current()}),o.append(u),o}const c=Se(n.metadata);return o.dataset.annotationId=c,o.dataset.annotationSide=n.side,o.dataset.annotationLine=String(n.lineNumber),o},[N]),We=f.useCallback((n,o,c)=>{const u=new Map;if(c!=="unmount"){const g=Number.parseFloat(getComputedStyle(document.documentElement).fontSize)*2,k=new Map,T=[];for(const I of n.shadowRoot?.querySelectorAll("slot")??[])for(const D of I.assignedElements()){const R=D.querySelector("[data-hunk-action-target]"),y=Number(R?.dataset.hunkActionTarget);if(!R||!Number.isInteger(y)||y<0)continue;u.set(y,R);const v=I.closest("[data-code]");if(!v)continue;let w=k.get(v);w||(w=v.getBoundingClientRect(),k.set(v,w));const Q=R.getBoundingClientRect().top,pe=Math.max(w.top+4,Math.min(Q+4,w.bottom-g-4));T.push({target:R,offset:pe-Q})}for(const{target:I,offset:D}of T){const R=`${D}px`;I.style.getPropertyValue("--oc-hunk-action-offset")!==R&&I.style.setProperty("--oc-hunk-action-offset",R)}}const x=o.fileDiff;H(g=>g.fileDiff===x&&g.anchors===p&&g.targets.size===u.size&&[...u].every(([k,T])=>g.targets.get(k)===T)?g:{fileDiff:x,anchors:p,targets:u})},[p]),ft=f.useCallback((n,o)=>{Be(n,o??P??void 0)},[Be,P]),ee=f.useCallback(n=>{O(n);const o=q.current;if(o)try{K.current=!0,o.setSelectedLines(n),ye.current=n}catch{}finally{K.current=!1}},[O]),ce=f.useRef(null),Ie=f.useRef(null);f.useEffect(()=>{if(!l)return;const n=oe.current;if(!n)return;const o=()=>{const y=n.querySelector("diffs-container");return y instanceof HTMLElement?y.shadowRoot:null},c=y=>{const v=n.querySelector("diffs-container");v instanceof HTMLElement&&(y?v.setAttribute("data-oc-comment-drag",""):v.removeAttribute("data-oc-comment-drag"))},u=(y,v)=>{const Q=o()?.elementFromPoint(y,v)??document.elementFromPoint(y,v);if(!(Q instanceof Element))return null;const pe=!!Q.closest("[data-column-number]"),me=Q.closest("[data-line]");if(!(me instanceof HTMLElement))return null;const He=Number.parseInt(me.getAttribute("data-line")??"",10);if(!Number.isFinite(He)||He<=0)return null;const ht=me.getAttribute("data-line-type")==="change-deletion"||me.closest("[data-code][data-deletions]")!=null?"deletions":"additions";return{line:He,side:ht,numberColumn:pe}};let x=null,g=!1,k=null;const T=y=>{ce.current=y;const v=q.current;if(v)try{K.current=!0,v.setSelectedLines(y)}catch{}finally{K.current=!1}},I=y=>{if(y.button!==0||y.pointerType!=="mouse")return;const v=u(y.clientX,y.clientY);if(!v||v.numberColumn){x=null;return}x={line:v.line,side:v.side},g=!1,k=y.pointerId},D=y=>{if(x==null||y.pointerId!==k)return;const v=u(y.clientX,y.clientY);if(v){if(!g){if(v.line===x.line)return;g=!0,c(!0),window.getSelection()?.removeAllRanges();const w=o();w&&"getSelection"in w&&w.getSelection()?.removeAllRanges()}T({start:Math.min(x.line,v.line),end:Math.max(x.line,v.line),side:x.side})}},R=y=>{if(x==null||y.pointerId!==k)return;const v=g;if(x=null,g=!1,k=null,c(!1),!v)return;const w=ce.current;ce.current=null,w&&(ge.current&&de.current.trim()&&!Z.current||(ee(w),Z.current||U("")))};return n.addEventListener("pointerdown",I),document.addEventListener("pointermove",D,{passive:!0}),document.addEventListener("pointerup",R),()=>{n.removeEventListener("pointerdown",I),document.removeEventListener("pointermove",D),document.removeEventListener("pointerup",R),c(!1)}},[ee,l,U]);const je=f.useCallback(n=>{if(!l)return;const o=ce.current,c=o&&n.start>=o.start&&n.end<=o.end&&(n.side==null||n.side===o.side);Ie.current!==null&&(window.clearTimeout(Ie.current),Ie.current=null),ce.current=null,ee(c&&o?o:n),Z.current||U("")},[ee,l,U]),Ve=f.useCallback(n=>{if(!l||n.numberColumn||window.getSelection()?.toString().trim())return;const o=n.annotationSide,c={start:n.lineNumber,end:n.lineNumber,side:o},u=ge.current;if(u&&u.start===c.start&&u.end===c.end&&u.side===c.side){if(!de.current.trim()){O(null);const x=q.current;try{K.current=!0,x?.setSelectedLines(null)}finally{K.current=!1}}return}u&&de.current.trim()&&!Z.current||(ee(c),Z.current||U(""))},[ee,l,U,O]),_e=f.useCallback(n=>{const o=n.closest("[data-line-type]")?.getAttribute("data-line-type")??n.getAttribute("data-line-type");if(o==="change-deletion")return"deletions";if(o==="change-addition")return"additions";const c=n.getAttribute("data-column-side")??n.getAttribute("data-side")??n.closest("[data-column-side]")?.getAttribute("data-column-side");if(c==="deletions"||c==="left"||c==="original")return"deletions";if(c==="additions"||c==="right"||c==="modified")return"additions";const u=n.closest("[data-line-type]");if(u instanceof HTMLElement){const x=u.getBoundingClientRect(),g=n.getBoundingClientRect(),k=x.left+x.width/2;return g.left+g.width/2<k?"deletions":"additions"}return"additions"},[]);Qe(V),Qe(_);const re=`${V.metadata.id}:${_.metadata.id}:${$?"dark":"light"}`,ue=f.useMemo(()=>{if(i){const n=i.deletionLines.reduce((c,u)=>c+u.length,0),o=i.additionLines.reduce((c,u)=>c+u.length,0);return Math.max(n,o)>st}return Math.max(t.length,e.length)>st},[i,e.length,t.length]),oe=f.useRef(null),G=f.useRef(null),q=f.useRef(null),fe=f.useRef(null),Te=f.useRef(null),Me=f.useRef(null),Ae=f.useRef(void 0),ve=f.useRef(void 0),be=f.useRef(void 0),we=f.useRef(void 0),[,Pe]=j.useReducer(n=>n+1,0),te=St(ue?"unified":d?"split":"unified"),C=Ot(i,te),X=!!L&&C?.isPartial===!0,se=X&&(M||i!==C),Y=f.useMemo(()=>Ze(V),[V]),J=f.useMemo(()=>Ze(_),[_]);j.useLayoutEffect(()=>{const n=oe.current;if(!n)return;const o=n.querySelector("diffs-container");if(!o)return;const c=$?J:Y,u=(Q,pe)=>Q.colors?.[pe],x=u(Y,"terminal.ansiGreen"),g=u(Y,"terminal.ansiRed"),k=u(Y,"terminal.ansiBlue"),T=u(J,"terminal.ansiGreen"),I=u(J,"terminal.ansiRed"),D=u(J,"terminal.ansiBlue");o.style.setProperty("--shiki-light",Y.fg),o.style.setProperty("--shiki-light-bg",Y.bg),x&&o.style.setProperty("--shiki-light-addition-color",x),g&&o.style.setProperty("--shiki-light-deletion-color",g),k&&o.style.setProperty("--shiki-light-modified-color",k),o.style.setProperty("--shiki-dark",J.fg),o.style.setProperty("--shiki-dark-bg",J.bg),T&&o.style.setProperty("--shiki-dark-addition-color",T),I&&o.style.setProperty("--shiki-dark-deletion-color",I),D&&o.style.setProperty("--shiki-dark-modified-color",D),o.style.setProperty("--diffs-bg",c.bg),o.style.setProperty("--diffs-fg",c.fg);const R=$?T:x,y=$?I:g,v=$?D:k;R&&o.style.setProperty("--diffs-addition-color-override",R),y&&o.style.setProperty("--diffs-deletion-color-override",y),v&&o.style.setProperty("--diffs-modified-color-override",v);const w=o.shadowRoot?.querySelector("pre");w&&(w.style.setProperty("--shiki-light",Y.fg),w.style.setProperty("--shiki-light-bg",Y.bg),x&&w.style.setProperty("--shiki-light-addition-color",x),g&&w.style.setProperty("--shiki-light-deletion-color",g),k&&w.style.setProperty("--shiki-light-modified-color",k),w.style.setProperty("--shiki-dark",J.fg),w.style.setProperty("--shiki-dark-bg",J.bg),T&&w.style.setProperty("--shiki-dark-addition-color",T),I&&w.style.setProperty("--shiki-dark-deletion-color",I),D&&w.style.setProperty("--shiki-dark-modified-color",D),w.style.setProperty("--diffs-bg",c.bg),w.style.setProperty("--diffs-fg",c.fg),R&&w.style.setProperty("--diffs-addition-color-override",R),y&&w.style.setProperty("--diffs-deletion-color-override",y),v&&w.style.setProperty("--diffs-modified-color-override",v))},[J,re,$,Y]);const ne=f.useMemo(()=>({theme:{dark:_.metadata.id,light:V.metadata.id},themeType:$?"dark":"light",diffStyle:d?"split":"unified",diffIndicators:"none",hunkSeparators:"line-info-basic",lineDiffType:"none",maxLineDiffLength:ue?0:1e3,maxLineLengthForHighlighting:ue?1:1e3,tokenizeMaxLineLength:ue?1:1e3,collapsedContextThreshold:0,expansionLineCount:20,overflow:s?"wrap":"scroll",disableFileHeader:!0,enableLineSelection:l,enableGutterUtility:l,onGutterUtilityClick:l?je:void 0,onLineClick:l?Ve:void 0,onLineSelected:l?xe:void 0,unsafeCSS:p.length>0?`${at}
|
|
228
|
+
${Dt}`:at,renderAnnotation:l||p.length>0||X?qe:void 0,onPostRender:p.length>0?We:void 0}),[We,p.length,_.metadata.id,l,X,$,ue,V.metadata.id,d,s,xe,je,Ve,qe]),he=f.useMemo(()=>{const n=l?Ct({drafts:W,editingDraftId:le,selection:P}):[];for(const c of p)n.push({side:c.side,lineNumber:c.lineNumber,metadata:{type:"hunk-action",index:c.index}});const o=X&&C?Gt(C):null;return o&&n.push(o),n},[le,l,X,C,W,p,P]),Fe=f.useRef(he);f.useEffect(()=>{Fe.current=he},[he]),f.useEffect(()=>{const n=G.current;return()=>{q.current?.cleanUp(),q.current=null,fe.current?.release(),fe.current=null,Te.current=null,Me.current=null,Ae.current=void 0,ve.current=void 0,be.current=void 0,we.current=void 0,n&&(n.innerHTML="")}},[]),f.useEffect(()=>{if(typeof window>"u")return;const n=G.current,o=oe.current;if(!n||!te)return;const c=_t(o,n);let u=fe.current;u||(u=Jt(n),fe.current=u),fe.current=u;const x=u?.virtualizer??null,g=C?void 0:{name:a||"",contents:t,lang:r,cacheKey:`old:${re}:${a}:${Ee(t)}`},k=C?void 0:{name:a||"",contents:e,lang:r,cacheKey:`new:${re}:${a}:${Ee(e)}`},T=C?ve.current!==C:ve.current!==void 0||!g||!k||!be.current||!we.current||!Ge(be.current,g)||!Ge(we.current,k),I=q.current,D=!!(I&&(Te.current!==x||Me.current!==te||x&&(Ae.current!==ne.hunkSeparators||T)));D&&(I?.cleanUp(),q.current=null,n.innerHTML="");let R=q.current;const y=!D&&I?!gt(I.options,ne):!1;if(R?R.setOptions(ne):(R=u?new yt(ne,u.virtualizer,Xt,te):new xt(ne,te),q.current=R,ye.current=null),Te.current=x,Me.current=te,Ae.current=x?ne.hunkSeparators:void 0,ve.current=C,be.current=g,we.current=k,C)R.render({fileDiff:C,forceRender:y,lineAnnotations:Fe.current,containerWrapper:n});else{if(!g||!k)return;R.render({oldFile:g,newFile:k,forceRender:y,lineAnnotations:Fe.current,containerWrapper:n})}const v=$e(n,()=>{c(),Qt(R,u,Pe)});return()=>{v(),c()}},[re,C,a,r,e,ne,t,te]),f.useEffect(()=>{const n=q.current;if(n){try{n.setLineAnnotations(he)}catch(o){console.error("Failed to apply diff line annotations",o);try{n.setLineAnnotations([])}catch{}}requestAnimationFrame(()=>{if(q.current===n){try{n.rerender()}catch{}Pe()}})}},[he]),f.useEffect(()=>{const n=q.current;if(!n||P!==null)return;const o=ye.current;if(!Wt(P,o))try{K.current=!0,n.setSelectedLines(P),ye.current=P}catch{}finally{K.current=!1}},[P]),f.useEffect(()=>{if(!l)return;const n=G.current;if(!n)return;let o=null,c=()=>{};const u=()=>{const g=n.querySelector("diffs-container")?.shadowRoot;if(!g){o=requestAnimationFrame(u);return}const k=T=>{if(!(T instanceof MouseEvent)||T.button!==0||!(T.target instanceof Element))return;const I=T.target.closest("[data-column-number]");if(!(I instanceof HTMLElement))return;const D=I.getAttribute("data-column-number"),R=D?parseInt(D,10):NaN;if(Number.isNaN(R))return;const y=_e(I);xe({start:R,end:R,side:y}),T.preventDefault(),T.stopPropagation()};g.addEventListener("click",k,!0),c=()=>{g.removeEventListener("click",k,!0)}};return u(),()=>{o!==null&&cancelAnimationFrame(o),c()}},[re,l,a,xe,_e]),f.useEffect(()=>{const n=G.current;if(!n)return;let o=null,c=null;const x=setTimeout(()=>{const g=n.querySelector("diffs-container");if(!(g instanceof HTMLElement))return;const k=g.shadowRoot;o=new MutationObserver(()=>{c&&cancelAnimationFrame(c),c=requestAnimationFrame(()=>{Pe(),c=null})}),o.observe(g,{childList:!0,subtree:!0}),k&&o.observe(k,{childList:!0,subtree:!0})},100);return()=>{clearTimeout(x),c&&cancelAnimationFrame(c),o?.disconnect()}},[re,a]),f.useEffect(()=>{A.current=()=>{se||L?.({gap:"after-last-hunk"})}},[se,L]),f.useEffect(()=>{const n=G.current;if(n)return $e(n,()=>{const o=n.querySelector("diffs-container");o instanceof HTMLElement&&(o.toggleAttribute("data-oc-expand-on-demand",X),o.toggleAttribute("data-oc-expand-loading",se))})},[se,X,C]),f.useEffect(()=>{const n=G.current;if(!n||!X||se||!C||!L)return;const o=c=>{if(c.button!==0)return;const u=Ut(c.composedPath(),C);u&&(c.preventDefault(),c.stopPropagation(),L(u))};return n.addEventListener("click",o),()=>n.removeEventListener("click",o)},[se,X,C,L]);const Ne=f.useRef(null);if(f.useEffect(()=>{if(!b||!C||C.isPartial||Ne.current===b)return;const n=G.current;if(n)return $e(n,()=>{const o=q.current;if(!o||o.fileDiff!==C||Ne.current===b)return;if(Ne.current=b,b.gap==="after-last-hunk"){o.expandHunk(C.hunks.length,"up");return}const c=C.hunks.findIndex(u=>u.additionStart<=b.additionStart&&b.additionStart<u.additionStart+Math.max(u.additionCount,1));c<0||o.expandHunk(c,b.direction)})},[C,b]),typeof window>"u")return null;const Ue=l?z.jsx(It,{diffRootRef:oe,drafts:W,selection:P,editingDraftId:le,commentText:ie,onTextChange:U,fileLabel:a?.split("/").pop()??"",onSave:ft,onCancel:ut,onEdit:n=>{ee({start:n.startLine,end:n.endLine,side:n.side==="original"?"deletions":"additions"}),dt(n)},onDelete:ct}):null,Ke=h&&C&&S.fileDiff===C&&S.anchors===p?[...S.targets].map(([n,o])=>Re.createPortal(h.render(n),o,`hunk-${n}`)):null;return m==="fill"?z.jsx("div",{className:Ye("flex flex-col relative","size-full"),"data-diff-virtual-root":!0,children:z.jsxs("div",{className:"flex-1 relative min-h-0",children:[z.jsx(Lt,{outerClassName:"pierre-diff-wrapper size-full",disableHorizontal:!1,fillContainer:!0,"data-diff-virtual-content":!0,children:z.jsx("div",{ref:oe,className:"size-full relative",children:z.jsx("div",{ref:G,className:"size-full"})})}),Ue,Ke]})}):z.jsxs("div",{className:Ye("relative","w-full"),children:[z.jsx("div",{ref:oe,className:"pierre-diff-wrapper w-full overflow-x-auto overflow-y-visible relative",children:z.jsx("div",{ref:G,className:"w-full"})}),Ue,Ke]})};export{un as P};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import{R as t,j as n}from"./vendor-react-BUCujlKS.js";import{q as Rt,u as Ze,a as ve,C as Pt,I as et,h as tt,J as Mt}from"./index-DxNa7xYB.js";import{c as Tt,s as kt,P as Nt,C as Et}from"./shikiHighlight-DHDx-6eM.js";import{f as It,z as $,dj as Dt,bd as Vt,b as nt,L as Ft,ay as Lt,N as At,bJ as Ot,_ as zt,i9 as Kt,l6 as Wt,l as rt,ij as _t,aY as st,jS as Bt,ia as $t,gS as it,il as Gt,im as Jt,m as Ut,l7 as Ht,aR as ot,at as ge,au as we,aS as at,B as ee,I as G,av as Se,aU as lt,bH as te,g as Yt,cA as Qt,b2 as qt,fG as Xt,l8 as Zt}from"./useAppFontEffects-DGlvOqP_.js";import{u as en,n as tn}from"./useInlineCommentController-kMN4Wg_D.js";import{b as nn,F as rn}from"./FilePreviewCommentMenu-D4kLseHj.js";import{getResolvedShikiTheme as sn}from"./appThemeRegistry-B9gkFq9i.js";import{E as on}from"./vendor-codemirror-view-1e0FQ6Wn.js";import{br as an}from"./runtimeEndpointReset-CZ5aafpl.js";import"./vendor-scheduler-7OC5HNn7.js";import"./vendor-zod-CxRSdNoV.js";import"./vendor-vite-runtime-DD1OZmLC.js";import"./vendor-zustand-BAGL70zf.js";import"./vendor-opencode-client-BmFcUkbQ.js";import"./vendor-codemirror-state-Dek9sMtw.js";import"./vendor-marijn-find-cluster-break-DXwl3gUT.js";import"./vendor-codemirror-commands-C4G_dPWe.js";import"./vendor-codemirror-language-DufXoQvE.js";import"./vendor-lezer-common-B3-cUCR_.js";import"./vendor-lezer-highlight-CDMHUZ74.js";import"./vendor-style-mod-NZ5MEPvj.js";import"./vendor-codemirror-search-CvXM_pZg.js";import"./vendor-crelt-C8TCjufn.js";import"./vendor-replit-codemirror-vim-BlJRn-cW.js";import"./vendor-replit-codemirror-vim-core-FHzKdNUS.js";import"./vendor-simplewebauthn-browser-VDA66rT_.js";import"./vendor-class-variance-authority-5VPnzWs2.js";import"./vendor-clsx-B-dksMZM.js";import"./vendor-base-ui-Det7U81h.js";import"./vendor-floating-ui-utils-D6FqdtJt.js";import"./vendor-floating-ui-dom-BTvzWks8.js";import"./vendor-floating-ui-core-PuGzNPnN.js";import"./vendor-floating-ui-react-dom-DxYCWdHj.js";import"./vendor-use-sync-external-store-D6wYuSt-.js";import"./vendor-dnd-kit-core-BZknOX2w.js";import"./vendor-dnd-kit-utilities-B_MdXhJC.js";import"./vendor-dnd-kit-accessibility-BHxJPORy.js";import"./vendor-dnd-kit-sortable-CsEagZ81.js";import"./vendor-tanstack-react-virtual-CvuLsk7D.js";import"./vendor-tanstack-virtual-core-DPaNcJcT.js";import"./vendor-framer-motion-DxDVhOLc.js";import"./vendor-motion-dom-HXPOMxb7.js";import"./vendor-motion-utils-BGh8QBgx.js";import"./vendor-codemirror-lang-javascript-DbpEcZM0.js";import"./vendor-lezer-javascript-D7Tj24ot.js";import"./vendor-lezer-lr-bhwg1HMg.js";import"./vendor-codemirror-autocomplete-BSHQHbKu.js";import"./vendor-w3c-keyname-Vcq4gwWv.js";import"./vendor-codemirror-lang-json-BzgckzmB.js";import"./vendor-lezer-json-Iaex0UN-.js";import"./vendor-codemirror-lang-css-Cayfb29q.js";import"./vendor-lezer-css-C5xB6jxd.js";import"./vendor-codemirror-lang-html-BQWerHsJ.js";import"./vendor-lezer-html-C0I1p52t.js";import"./vendor-codemirror-lang-markdown-D2TEBIvZ.js";import"./vendor-lezer-markdown-C6g-d6P3.js";import"./vendor-codemirror-language-data-CtwSWKtX.js";import"./vendor-codemirror-lang-python-jAMtYiA9.js";import"./vendor-lezer-python-CvuFxeZl.js";import"./vendor-sonner-DFyL3AvE.js";import"./vendor-capacitor-core-B4EWRrHz.js";import"./vendor-cmdk-DgLInKvT.js";import"./vendor-radix-ui-react-dialog-B94Bt2qq.js";import"./vendor-radix-ui-primitive-Dc_FVRD7.js";import"./vendor-radix-ui-react-compose-refs-DcAh5WdT.js";import"./vendor-radix-ui-react-context-Czxm7Z62.js";import"./vendor-radix-ui-react-id-f5BLKEVw.js";import"./vendor-radix-ui-react-use-layout-effect-D_3IhJdJ.js";import"./vendor-radix-ui-react-use-controllable-state-BFT5YmkA.js";import"./vendor-radix-ui-react-dismissable-layer-D7kXcwgJ.js";import"./vendor-radix-ui-react-primitive-DhVoX9SD.js";import"./vendor-radix-ui-react-slot-BQgQOasS.js";import"./vendor-radix-ui-react-use-callback-ref-BZPnuXAC.js";import"./vendor-radix-ui-react-use-escape-keydown-oph88g-F.js";import"./vendor-radix-ui-react-focus-scope-CiaxW4dD.js";import"./vendor-radix-ui-react-portal-BMJYHWck.js";import"./vendor-radix-ui-react-presence-CNxf-uq4.js";import"./vendor-radix-ui-react-focus-guards-B6qJXYua.js";import"./vendor-react-remove-scroll-DO7dCTnK.js";import"./vendor-tslib-De9GV7Vy.js";import"./vendor-react-remove-scroll-bar-BcFYyj3E.js";import"./vendor-react-style-singleton-q6EMHnwf.js";import"./vendor-get-nonce-C-Z93AgS.js";import"./vendor-use-sidecar-zDC0RhA3.js";import"./vendor-use-callback-ref-D3RC8gqK.js";import"./vendor-aria-hidden-DvXkyWUv.js";import"./vendor-legendapp-list-DViGR95I.js";import"./vendor-tailwind-merge-CPcsbTWB.js";import"./vendor-fuse.js-Dw8P0qyA.js";import"./textMateThemeFromAppTheme-DlsTphbY.js";import"./themeResolver-BmJyTmjJ.js";import"./vendor-pierre-theming-C6Z4M5_u.js";import"./vendor-shikijs-core-CGM_jqPK.js";import"./vendor-shikijs-types-CPSbSeK6.js";import"./vendor-shikijs-vscode-textmate-BgLrS_2D.js";import"./vendor-hast-util-to-html-BKBhbTDb.js";import"./vendor-html-void-elements-CkdplsNl.js";import"./vendor-property-information-rJCbAzvX.js";import"./vendor-zwitch-C2o2j-tx.js";import"./vendor-stringify-entities-CsH1VEn9.js";import"./vendor-character-entities-legacy-BpoLgcEt.js";import"./vendor-character-entities-html4-D7taRCQ7.js";import"./vendor-ccount-c2V3InAJ.js";import"./vendor-comma-separated-tokens-D8TqSuIK.js";import"./vendor-space-separated-tokens-DD3iYX1K.js";import"./vendor-hast-util-whitespace-D4Wp6AEg.js";import"./space-apply-DM_2pRW7.js";import"./vendor-cron-parser-CjvYVigk.js";import"./vendor-luxon-BZ0puJYg.js";const ln=()=>{const l=new Map,d=new Map;return{schedule:(c,s,m)=>{if(s<=(d.get(c)??Number.NEGATIVE_INFINITY))return l.get(c)??Promise.resolve();d.set(c,s);const h=(l.get(c)??Promise.resolve()).then(m,m);return l.set(c,h.catch(()=>{d.get(c)===s&&d.delete(c)})),h},pendingFor:async c=>{await l.get(c)},reset:c=>{d.delete(c)}}},y=l=>{if(!l)return"";const d=l.replace(/\\/g,"/");return d==="/"?"/":d.replace(/\/+$/,"")},cn=(l,d)=>{const c=y(d.currentDirectory),s=y(d.homeDirectory),m=y(l);return c&&m.startsWith(c+"/")?m.slice(c.length+1):s&&m===s?"~":s&&m.startsWith(s+"/")?`~${m.slice(s.length)}`:m},un=(l,d,c)=>{const s=y(l.trim());if(!s)return null;const m=c?d.find(h=>h.id===c)??null:null;if(m?.path){const h=y(m.path);if(s===h||s.startsWith(`${h}/`))return{id:m.id,path:m.path}}const R=d.filter(h=>{const P=y(h.path);return s===P||s.startsWith(`${P}/`)}).sort((h,P)=>y(P.path).length-y(h.path).length)[0];return R?{id:R.id,path:R.path}:null},dn=l=>Mt(()=>l()),ps=({targetPath:l=null,savedProjectPlan:d=null,onNavigatedToChat:c})=>{const{t:s}=It(),m=$(e=>e.currentSessionId),R=$(e=>e.createSession),h=$(e=>e.initializeNewOpenChamberSession),P=$(e=>e.sendMessage),ye=$(e=>e.setCurrentSession),je=Dt(),J=Rt(e=>e.homeDirectory),be=Vt(e=>e.planModeEnabled),xe=nt(e=>e.projects),Ce=nt(e=>e.activeProjectId),Re=Ft(e=>e.directories),Pe=Lt()??"",Me=Ze(e=>e.setSessionSwitcherOpen),L=At(),A=t.useSyncExternalStore(dn,ve,ve),{isMobile:Te}=Ot(),{currentTheme:U}=zt(),ne=t.useMemo(()=>m?je.find(e=>e.id===m)??null:null,[m,je]),E=t.useMemo(()=>{const e=typeof ne?.directory=="string"?ne.directory:"";return y(e||"")},[ne?.directory]),ke=t.useMemo(()=>y(Pe||E),[Pe,E]),O=t.useMemo(()=>un(ke,xe,Ce),[Ce,ke,xe]),re=d?.projectRef.id??null,se=d?.projectRef.path??null,v=t.useMemo(()=>re&&se?{id:re,path:se}:null,[re,se]),b=d?.planId??null,z=v&&b?JSON.stringify(["saved-plan",A,Kt(v),b]):null,I=v?.id===Pt,H=t.useMemo(()=>{const e=v??O;return e?Re.get(e.path)?.isGitRepo===!0:!1},[O,Re,v]),[M,D]=t.useState(null),[Ne,Ee]=t.useState(!1),[u,K]=t.useState(null),[ie,oe]=t.useState(null),[ct,ae]=t.useState(null),ut=!!u||!!ie,le=t.useMemo(()=>!u||!E||!J?u:cn(u,{currentDirectory:E,homeDirectory:J}),[u,E,J]),[f,T]=t.useState(""),{isPlaying:Y,play:dt,stop:mt}=Wt(),pt=rt(e=>e.showMessageTTSButtons),[Ie,ce]=t.useState(null),[De,ue]=t.useState(null),de=t.useMemo(()=>le&&le.split("/").pop()||s("planView.file.defaultName"),[le,s]),Ve=u??ct??de,me=t.useMemo(()=>f.trim()?_t(f,s("planView.title.default")).title:s("planView.title.default"),[f,s]),Q=t.useMemo(()=>me.trim()||s("planView.title.default"),[me,s]),[ft,W]=t.useState(!1),[ht,Fe]=t.useState(!1),[q,Le]=t.useState("edit"),_=t.useRef(null),[a,w]=t.useState(null),Ae=t.useRef(null),vt=t.useRef(null),Oe=t.useRef(null),ze="openchamber:plan:md-viewer-mode";t.useEffect(()=>{try{const e=localStorage.getItem(ze);if(!e)return;const i=JSON.parse(e);(i==="preview"||i==="edit")&&Le(i)}catch{}},[]);const gt=t.useCallback(e=>{Le(e);try{localStorage.setItem(ze,JSON.stringify(e))}catch{}},[]),V=t.useRef(!1),x=t.useRef(null),[Ke,F]=t.useState(!1);t.useEffect(()=>{const e=()=>{V.current=!1,x.current=null,F(!1)};return document.addEventListener("mouseup",e),()=>document.removeEventListener("mouseup",e)},[]);const wt=t.useCallback((e,i)=>{const o=e.split(`
|
|
2
|
+
`),r=Math.max(1,i.start),p=Math.min(o.length,i.end);return r>p?"":o.slice(r-1,p).join(`
|
|
3
|
+
`)},[]),St=en({source:"plan",fileLabel:Ve,language:u&&st(u)||"markdown",getCodeForRange:e=>wt(f,tn(e)),toStoreRange:e=>({startLine:e.start,endLine:e.end}),fromDraftRange:e=>({start:e.startLine,end:e.endLine})}),{drafts:We,commentText:X,setCommentText:_e,editingDraftId:pe,setSelection:Be,saveComment:$e,cancel:B,reset:Ge,startEdit:Je,deleteDraft:Ue}=St;t.useEffect(()=>{w(null),Ge()},[f,Ge]),t.useEffect(()=>{Be(a)},[a,Be]);const He=t.useCallback(()=>{w(null),B()},[B]),Ye=t.useCallback((e,i)=>{i&&w(i),$e(e,i??a??void 0),w(null)},[a,$e]);t.useEffect(()=>{if(!a)return;const e=o=>{const r=o.target;r.closest('[data-comment-card="true"]')||r.closest('[data-comment-input="true"]')||r.closest(".oc-block-widget")||r.closest(".cm-gutterElement")||r.closest("[data-sonner-toast]")||r.closest("[data-sonner-toaster]")||X.trim()||(w(null),B())},i=window.setTimeout(()=>{document.addEventListener("click",e)},100);return()=>{window.clearTimeout(i),document.removeEventListener("click",e)}},[B,X,pe,Te,a]);const fe=Ze(e=>e.editorFontSize),yt=t.useMemo(()=>{const e=u?st(u):null,i=!!e&&e!=="markdown",o=[Tt(U,i?{syntaxColors:!1,fontSize:fe}:{fontSize:fe})],r=Bt(u||"plan.md");return r&&o.push(r),i&&e&&o.push(kt({language:e,themeName:U.metadata.id,theme:sn(U)})),o.push(on.lineWrapping),o},[U,u,fe]),j=t.useRef({key:null,target:null,content:"",editRevision:0,savedRevision:0,runtimeKey:""}),k=t.useState(ln)[0],Qe=t.useCallback(async(e,i)=>{if("filePath"in e){const r=L.files??et()?.files;if(r?.writeFile){if(!(await r.writeFile(e.filePath,i))?.success)throw new Error("Plan file write failed");return}const p=await tt("/api/fs/write",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:e.filePath,content:i})});if(!p.ok)throw new Error(`Failed to write plan file (${p.status})`);return}if(!await $t.getState().savePlan(e.projectRef,e.planId,i))throw new Error("Plan save rejected: the plan no longer exists")},[L.files]),qe=t.useRef(Qe);qe.current=Qe;const N=t.useCallback(()=>{const e=j.current;if(!e.key||!e.target||e.editRevision<=e.savedRevision)return;const i={key:e.key,target:e.target,content:e.content,revision:e.editRevision,runtimeKey:e.runtimeKey,write:qe.current};k.schedule(i.key,i.revision,async()=>{if(ve()!==i.runtimeKey)return;await i.write(i.target,i.content);const o=j.current;o.key===i.key&&(o.savedRevision=Math.max(o.savedRevision,i.revision),ce(null))}).catch(o=>{j.current.key===i.key&&ce(o instanceof Error?o.message:"Plan save failed")})},[k]);t.useEffect(()=>{if(!be&&!l&&!b){N(),j.current={key:null,target:null,content:"",editRevision:0,savedRevision:0,runtimeKey:""},K(null),oe(null),ae(null),T(""),W(!1);return}let e=!1;const i=async r=>{if(L.files?.readFile)return(await L.files.readFile(r))?.content??"";const p=et()?.files;if(p?.readFile)return(await p.readFile(r,{optional:!0}))?.content??"";const g=await tt(`/api/fs/read?path=${encodeURIComponent(r)}&optional=true`,{cache:"no-store"});if(!g.ok)throw new Error(`Failed to read plan file (${g.status})`);return g.text()};return(async()=>{if(N(),j.current={key:null,target:null,content:"",editRevision:0,savedRevision:0,runtimeKey:""},K(null),oe(null),ae(null),T(""),ce(null),ue(null),b&&v&&z){if(await k.pendingFor(z),e)return;k.reset(z),W(!0);try{const r=await Zt(v,b);if(e)return;if(!r){ue("Plan not found");return}j.current={key:z,target:{projectRef:v,planId:b},content:r.raw,editRevision:0,savedRevision:0,runtimeKey:A},T(r.raw),oe(b),ae(r.path??null)}catch(r){if(e)return;ue(r instanceof Error?r.message:"Plan load failed")}finally{e||W(!1)}return}if(l){const r=JSON.stringify(["plan-file",A,l]);if(await k.pendingFor(r),e)return;k.reset(r),W(!0);try{const p=await i(l);if(e)return;j.current={key:r,target:{filePath:l},content:p,editRevision:0,savedRevision:0,runtimeKey:A},K(l),T(p)}catch{if(e)return;K(null),T("")}finally{e||W(!1)}return}K(null),T("")})(),()=>{e=!0}},[A,J,be,L.files,b,z,v,k,N,E,l]);const jt=t.useCallback(e=>{j.current.content=e,j.current.editRevision+=1,T(e)},[]);t.useEffect(()=>{if(!u&&!ie)return;const e=window.setTimeout(()=>{N()},350);return()=>{window.clearTimeout(e)}},[f,ie,u,N]),t.useEffect(()=>()=>{N()},[N]),t.useEffect(()=>()=>{_.current!==null&&window.clearTimeout(_.current)},[]);const Xe=t.useCallback(()=>{Me(!1),c?.()},[c,Me]),bt=t.useCallback(async e=>{const i=v??O;if(!i||!M||I)return;const o=await it(M.action==="improve"?"plan.improve.visible":"plan.implement.visible",{plan_title:Q}),r=await it(M.action==="improve"?"plan.improve.instructions":"plan.implement.instructions",{plan_title:Q,plan_path:u??""}),g=[{synthetic:!0,text:u?r:[r,"","The plan is not stored as a file in the repository and has no file path. Its full current contents follow below this note and are the source of truth for the plan. Where the instructions above refer to the plan file, treat the plan as stored in OpenChamber project knowledge (it is edited through the OpenChamber UI): propose plan revisions as plan text in the chat rather than editing a file.","",f].join(`
|
|
4
|
+
`)}];Ee(!0);try{Xe();let S=null,he=i.path;if(M.target==="worktree"){if(!H)return;const C=await Gt(i.path,Jt());if(!C?.id)return;S=C.id,he=C.path}else{const C=await R(void 0,i.path,void 0,{model:{providerID:e.providerID,id:e.modelID,variant:e.variant||void 0},agent:e.agent.trim()||void 0});if(!C?.id)return;S=C.id,he=C.directory??i.path,h(C.id,rt.getState().agents??[])}if(!S)return;const Z=Ut.getState();Z.saveSessionModelSelection(S,e.providerID,e.modelID),e.agent.trim()&&(Z.saveSessionAgentSelection(S,e.agent),Z.saveAgentModelForSession(S,e.agent,e.providerID,e.modelID),Z.saveAgentModelVariantForSession(S,e.agent,e.providerID,e.modelID,e.variant||void 0)),ye(S,he);const Ct=e.runAsGoal===!0?[`Implement the plan "${Q}" end-to-end${u?` (plan file: ${u})`:" (the full plan follows)"}.`,u?"Re-read that file for full details — it is the source of truth.":"The full plan follows in this message and is the source of truth.","",f].join(`
|
|
5
|
+
`):null;Ht.getState().setArmed(e.runAsGoal===!0,Ct),await P(o,e.providerID,e.modelID,e.agent.trim()||void 0,void 0,void 0,g,e.variant||void 0),D(null)}finally{Ee(!1)}},[H,f,R,O,h,I,M,u,Xe,v,P,Q,ye]),xt=t.useMemo(()=>nn({drafts:We,editingDraftId:pe,commentText:X,onTextChange:_e,selection:a,isDragging:Ke,fileLabel:de,newWidgetId:"plan-new-comment-input",mapDraftToRange:e=>({start:e.startLine,end:e.endLine}),onSave:Ye,onCancel:He,onEdit:e=>{Je(e),w({start:e.startLine,end:e.endLine})},onDelete:Ue}),[X,Ue,pe,He,Ye,Ke,a,We,de,_e,Je]);return n.jsxs("div",{className:"relative flex h-full min-h-0 min-w-0 w-full flex-col overflow-hidden bg-background",children:[n.jsxs("div",{className:"flex min-w-0 items-center gap-2 border-b border-border/40 px-3 py-1.5 flex-shrink-0",children:[n.jsxs("div",{className:"min-w-0 flex-1",children:[n.jsx("div",{className:"typography-ui-label font-medium truncate",children:me}),De?n.jsx("div",{className:"typography-micro text-[color:var(--status-error)] truncate",title:De,children:s("planView.error.loadFailed")}):null,Ie?n.jsx("div",{className:"typography-micro text-[color:var(--status-error)] truncate",title:Ie,children:s("planView.error.saveFailed")}):null]}),ut?n.jsxs("div",{className:"flex items-center gap-1",children:[n.jsxs(ot,{children:[n.jsxs(ge,{children:[n.jsx(we,{asChild:!0,children:n.jsx(at,{asChild:!0,children:n.jsx(ee,{variant:"ghost",size:"sm",className:"h-5 w-5 p-0","aria-label":s("planView.actions.improvePlanAria"),disabled:!f.trim()||I,children:n.jsx(G,{name:"loop-right-ai",className:"size-4"})})})}),n.jsx(Se,{sideOffset:8,children:s("planView.actions.improve")})]}),n.jsxs(lt,{align:"end",children:[n.jsx(te,{onClick:()=>D({action:"improve",target:"session"}),disabled:I,children:s("planView.actions.sendToNewSession")}),n.jsx(te,{onClick:()=>D({action:"improve",target:"worktree"}),disabled:!H,children:s("planView.actions.sendToNewWorktreeSession")})]})]}),n.jsxs(ot,{children:[n.jsxs(ge,{children:[n.jsx(we,{asChild:!0,children:n.jsx(at,{asChild:!0,children:n.jsx(ee,{variant:"ghost",size:"sm",className:"h-5 w-5 p-0","aria-label":s("planView.actions.implementPlanAria"),disabled:!f.trim()||I,children:n.jsx(G,{name:"code-ai",className:"size-4"})})})}),n.jsx(Se,{sideOffset:8,children:s("planView.actions.implement")})]}),n.jsxs(lt,{align:"end",children:[n.jsx(te,{onClick:()=>D({action:"implement",target:"session"}),disabled:I,children:s("planView.actions.sendToNewSession")}),n.jsx(te,{onClick:()=>D({action:"implement",target:"worktree"}),disabled:!H,children:s("planView.actions.sendToNewWorktreeSession")})]})]}),n.jsx(Nt,{currentMode:q,onToggle:()=>gt(q==="preview"?"edit":"preview")}),q==="preview"&&pt&&n.jsxs(ge,{children:[n.jsx(we,{asChild:!0,children:n.jsx(ee,{variant:"ghost",size:"sm",className:"h-5 w-5 p-0","aria-label":s(Y?"planView.tts.stopSpeaking":"planView.tts.readAloud"),onClick:()=>{Y?mt():f.trim()&&dt(f)},children:n.jsx(G,{name:"volume-up",className:Y?"h-4 w-4 animate-pulse text-[var(--primary-text)]":"h-4 w-4"})})}),n.jsx(Se,{sideOffset:8,children:s(Y?"planView.tts.stopSpeaking":"planView.tts.readAloud")})]}),n.jsx(ee,{variant:"ghost",size:"sm",onClick:async()=>{(await Yt(f)).ok&&(Fe(!0),_.current!==null&&window.clearTimeout(_.current),_.current=window.setTimeout(()=>{Fe(!1)},1200))},className:"h-5 w-5 p-0",title:s("planView.actions.copyPlanContents"),"aria-label":s("planView.actions.copyPlanContents"),children:ht?n.jsx(G,{name:"check",className:"h-4 w-4 text-[color:var(--status-success)]"}):n.jsx(G,{name:"clipboard",className:"h-4 w-4"})})]}):null]}),n.jsx(an,{open:M!==null,onOpenChange:e=>{!e&&!Ne&&D(null)},target:M?.target??"session",projectDirectory:v?.path??O?.path??null,submitting:Ne,allowRunAsGoal:!0,onConfirm:bt}),n.jsx("div",{className:"flex-1 min-h-0 min-w-0 relative",children:n.jsx(Qt,{outerClassName:"h-full min-w-0",className:"h-full min-w-0",children:ft?n.jsx("div",{className:"p-3 typography-ui text-muted-foreground",children:s("planView.state.loading")}):n.jsx("div",{className:"relative h-full",children:n.jsx("div",{className:"h-full",children:q==="preview"?n.jsxs("div",{className:"h-full overflow-auto p-3",ref:Oe,children:[n.jsx(rn,{containerRef:Oe,filePath:Ve,fileContent:f}),n.jsx(qt,{fallback:n.jsxs("div",{className:"rounded-md border border-destructive/20 bg-destructive/10 px-3 py-2",children:[n.jsx("div",{className:"mb-1 font-medium text-destructive",children:s("planView.error.previewUnavailable")}),n.jsx("div",{className:"text-sm text-muted-foreground",children:s("planView.error.switchToEditMode")})]}),children:n.jsx(Xt,{content:f,className:"typography-markdown-body",enableFileReferences:!1})})]}):n.jsx("div",{className:"relative h-full",ref:vt,children:n.jsx(Et,{value:f,onChange:jt,readOnly:!1,className:"h-full",extensions:yt,onViewReady:e=>{Ae.current=e},onViewDestroy:()=>{Ae.current=null},blockWidgets:xt,highlightLines:a?{start:Math.min(a.start,a.end),end:Math.max(a.start,a.end)}:void 0,lineNumbersConfig:{domEventHandlers:{mousedown:(e,i,o)=>{if(!(o instanceof MouseEvent)||o.button!==0)return!1;o.preventDefault();const r=e.state.doc.lineAt(i.from).number;if(a&&!o.shiftKey&&Math.min(a.start,a.end)===r&&Math.max(a.start,a.end)===r)return w(null),B(),V.current=!1,x.current=null,F(!1),!0;if(Te&&a&&!o.shiftKey){const p=Math.min(a.start,a.end,r),g=Math.max(a.start,a.end,r);return w({start:p,end:g}),V.current=!1,x.current=null,F(!1),!0}if(V.current=!0,x.current=r,F(!0),a&&o.shiftKey){const p=Math.min(a.start,r),g=Math.max(a.end,r);w({start:p,end:g})}else w({start:r,end:r});return!0},mouseover:(e,i,o)=>{if(!(o instanceof MouseEvent)||o.buttons!==1||!V.current||x.current===null)return!1;const r=e.state.doc.lineAt(i.from).number,p=Math.min(x.current,r),g=Math.max(x.current,r);return w({start:p,end:g}),F(!0),!1},mouseup:()=>(V.current=!1,x.current=null,F(!1),!1)}}})})})})})})]})};export{ps as PlanView};
|