refactor(renderer): group startup platform and runtime owners (#40777)

* refactor(renderer): group startup platform and runtime owners

* refactor(renderer): reconcile imports and retained validation metadata

* test: clear runtime pairing revisions between repo generation cases
This commit is contained in:
Neil
2026-11-10 06:30:52 -08:00
committed by GitHub
parent d1466f6017
commit b07b3d318a
1268 changed files with 1848 additions and 19246 deletions
@@ -29,7 +29,6 @@ on:
- 'src/main/codex-usage/scanner-incremental-append.test.ts'
- 'src/main/usage/jsonl-file-reader.test.ts'
- 'src/main/usage/jsonl-file-snapshot.test.ts'
- 'src/renderer/src/lib/pane-manager/pane-terminal-output-scheduler-queue-retention.test.ts'
- 'src/main/claude-usage/scanner-incremental-append.test.ts'
- 'src/main/claude-usage/store-checkpoint-persistence.test.ts'
+1 -3
View File
@@ -30,7 +30,6 @@
3 test-no-in-test-import-actual:src/renderer/src/components/terminal-pane/snapshots/remote-snapshot-alt-screen-host-chain.test.ts
1 test-no-in-test-import-actual:src/renderer/src/hooks/useIpcEvents-agent-status-pane-teardown.test.ts
1 test-no-in-test-import-actual:src/renderer/src/hooks/useIpcEvents-agent-status-snapshot-hydration.test.ts
1 test-no-in-test-import-actual:src/renderer/src/lib/agent-session/launch/new-tab/agent-launch-caller-routing.test.ts
1 test-no-polling-loop:src/main/browser/cookies/browser-cookie-import-concurrency.test.ts
1 test-no-polling-loop:src/main/claude/claude-stop-ack-race.test.ts
1 test-no-polling-loop:src/main/claude/claude-stream-json-connection.test.ts
@@ -635,7 +634,7 @@
1 test-no-wall-clock:src/renderer/src/components/native-chat/session/structured/delivery/NativeChatMessageList.unsent-message.test.tsx
3 test-no-wall-clock:src/renderer/src/components/native-chat/surfaces/integration/NativeChatMessageList.test.tsx
2 test-no-wall-clock:src/renderer/src/components/native-chat/tools/tasks/NativeChatStructuredSessionStatus.test.tsx
3 test-no-wall-clock:src/renderer/src/components/sidebar/workspace-card/review/use-workspace-reference-details.test.tsx
1 test-no-wall-clock:src/renderer/src/components/sidebar/workspace-card/review/use-workspace-reference-details.test.tsx
1 test-no-wall-clock:src/renderer/src/components/sidebar/worktree-list/listing/WorktreeList.lineage-agent-expansion-coupling.test.tsx
2 test-no-wall-clock:src/renderer/src/components/task-page/jira/task-page-jira-cache-selectors.test.ts
2 test-no-wall-clock:src/renderer/src/components/terminal-pane/pty-connection/emulation/fish-color-scheme-child-stdin.node-pty.test.ts
@@ -645,7 +644,6 @@
1 test-no-wall-clock:src/renderer/src/components/worktree-jump/WorktreeJumpPalette.recent-tabs.behavior.test.tsx
4 test-no-wall-clock:src/renderer/src/components/worktree-jump/WorktreeJumpPalette.recent-tabs.test.tsx
2 test-no-wall-clock:src/renderer/src/hooks/ipc-events/agent-status-terminal-title-tab-write.test.ts
1 test-no-wall-clock:src/renderer/src/hooks/useIpcEvents-agent-status-hook-titles.test.ts
1 test-no-wall-clock:src/renderer/src/lib/paired-runtime-closed-tab-resume.test.ts
2 test-no-wall-clock:src/renderer/src/lib/use-tab-agent-observed-signal-dispatch.test.tsx
2 test-no-wall-clock:src/renderer/src/lib/wake-sleeping-agents-live-unmounted-pane.test.ts
+1 -1
View File
@@ -707,7 +707,7 @@
6 src/renderer/src/hooks/useVirtualizedScrollAnchor.ts
1 src/renderer/src/lib/agent-session/launch/inventory/host-chat-program-acquisition.ts
1 src/renderer/src/lib/files/search/quick-open-file-history.ts
2 src/renderer/src/lib/worker-auto-close.ts
2 src/renderer/src/runtime/agent-orchestration/worker-auto-close.ts
1 src/renderer/src/runtime/native-chat/naming/structured-chat-name-observation.ts
1 src/renderer/src/store/plugins/appearance/plugin-icon-themes.ts
5 src/renderer/src/store/retained-views/app-state-view.ts
+3 -3
View File
@@ -85,9 +85,9 @@
1 src/renderer/src/components/terminal-pane/render-health/terminal-render-desync-sentinel.ts
1 src/renderer/src/hooks/use-now.ts
1 src/renderer/src/lib/agent-session/hibernation/agent-hibernation-coordinator.ts
1 src/renderer/src/lib/crash-diagnostics.ts
1 src/renderer/src/lib/window-visibility-interval.ts
1 src/renderer/src/lib/worker-auto-close.ts
1 src/renderer/src/diagnostics/crash-reporting/crash-diagnostics.ts
1 src/renderer/src/lib/window-activity/window-visibility-interval.ts
1 src/renderer/src/runtime/agent-orchestration/worker-auto-close.ts
1 src/renderer/src/runtime/hosts/wsl/wsl-refused-read-watch.ts
1 src/shared/remote-runtime/control/remote-runtime-shared-control-app-heartbeat.ts
1 src/shared/remote-runtime/remote-runtime-socket-liveness.ts
File diff suppressed because one or more lines are too long
@@ -4622,11 +4622,9 @@
"src/preload/usage-provider-api.test.ts": 46,
"src/renderer/src/app-shell/app-command-handlers-tab-rename.test.ts": 1786,
"src/renderer/src/app-shell/shutdown-checkpoint-persist.test.ts": 65,
"src/renderer/src/app-shell/shutdown-checkpoint-restart-lifecycle.test.ts": 210,
"src/renderer/src/app-shell/startup-window-parity.test.ts": 2306,
"src/renderer/src/app-shell/use-profile-state-save-delay-notice.sonner.test.tsx": 355,
"src/renderer/src/app-shell/use-profile-state-save-delay-notice.test.tsx": 293,
"src/renderer/src/app-shell/use-visible-hosted-review-refresh.test.tsx": 572,
"src/renderer/src/app-shell/visible-review-reporting.test.ts": 1872,
"src/renderer/src/app-shell/workspace-view-cross-client-sync.test.tsx": 1170,
"src/renderer/src/app-shell/worktree-creation-chat-handoff.test.tsx": 2824,
@@ -4711,7 +4709,6 @@
"src/renderer/src/components/automations/runs/use-automation-runs-dashboard.test.tsx": 854,
"src/renderer/src/components/automations/use-selected-automation-run-history.test.tsx": 2104,
"src/renderer/src/components/browser-favicon.test.tsx": 333,
"src/renderer/src/components/browser-pane/ClientHostedBrowserPagePane.dead-guest.test.tsx": 6219,
"src/renderer/src/components/browser-pane/ClientHostedBrowserPagePane.drag-focus.test.tsx": 5826,
"src/renderer/src/components/browser-pane/ClientHostedBrowserPagePane.failure-remount.test.tsx": 3085,
"src/renderer/src/components/browser-pane/ClientHostedBrowserPagePane.markup.test.tsx": 4575,
@@ -4808,7 +4805,6 @@
"src/renderer/src/components/dashboard-popout/preview-terminal-box-fit-lifecycle.test.ts": 192,
"src/renderer/src/components/dashboard-popout/preview-terminal-ime-bridge-kitty-bytes.test.ts": 479,
"src/renderer/src/components/dashboard-popout/remote-runtime-terminal-preview-api.test.ts": 81,
"src/renderer/src/components/dashboard-popout/use-agent-dashboard-telemetry.test.ts": 2108,
"src/renderer/src/components/dashboard-popout/useDashboardSnapshot.test.tsx": 432,
"src/renderer/src/components/dashboard/AgentDashboardDrawer.focus.test.tsx": 2567,
"src/renderer/src/components/dashboard/AgentDashboardDrawer.test.tsx": 1981,
@@ -4830,14 +4826,11 @@
"src/renderer/src/components/diff-comments/diff-comment-popover-outside-click.test.tsx": 1889,
"src/renderer/src/components/diff-comments/useDiffCommentDecorator.lifecycle.test.tsx": 2669,
"src/renderer/src/components/diff-comments/useDiffCommentDecorator.range-selection.test.tsx": 1782,
"src/renderer/src/components/editor/check-details/panel/CheckRunDetailsPanel.captured-failure.test.tsx": 2412,
"src/renderer/src/components/editor/check-details/panel/CheckRunDetailsPanel.copy.test.tsx": 3108,
"src/renderer/src/components/editor/check-details/panel/CheckRunDetailsPanel.log-outcomes.test.tsx": 3230,
"src/renderer/src/components/editor/DiagramViewerModal.test.tsx": 2539,
"src/renderer/src/components/editor/diff/sections/DiffSectionBody.word-wrap-lifecycle.test.tsx": 3036,
"src/renderer/src/components/editor/diff/monaco-view/DiffViewer.word-wrap-lifecycle.test.tsx": 2499,
"src/renderer/src/components/editor/EditorConflictReviewSurface.live-record.test.tsx": 1193,
"src/renderer/src/components/editor/EditorContent.monaco-lifecycle.test.tsx": 3162,
"src/renderer/src/components/editor/EditorEditFileSurface.monaco-containment.test.tsx": 2666,
"src/renderer/src/components/editor/EditorFileLoadErrorView.test.tsx": 660,
"src/renderer/src/components/editor/EditorFileLocationMenuItems.test.tsx": 846,
@@ -4849,17 +4842,13 @@
"src/renderer/src/components/editor/notebook/document/IpynbRendering.test.tsx": 2143,
"src/renderer/src/components/editor/markdown-preview/surface/MarkdownPreview.link-routing.interaction.test.tsx": 1127,
"src/renderer/src/components/editor/MediaViewer.test.tsx": 308,
"src/renderer/src/components/editor/MermaidViewer.test.tsx": 3079,
"src/renderer/src/components/editor/MonacoEditor.owner-view-state.test.tsx": 7073,
"src/renderer/src/components/editor/PdfFind.test.tsx": 581,
"src/renderer/src/components/editor/PluginBytesCustomEditorSurface.test.tsx": 641,
"src/renderer/src/components/editor/PluginEditorNeedsDesktopNotice.test.tsx": 2107,
"src/renderer/src/components/editor/PluginFileTypeSuggestion.test.tsx": 2062,
"src/renderer/src/components/editor/rich-markdown/instance/RichMarkdownEditor.focus-leave.test.tsx": 4927,
"src/renderer/src/components/editor/rich-markdown/instance/RichMarkdownErrorBoundary.lazy-chunk.test.tsx": 367,
"src/renderer/src/components/editor/ai-vault-session-log-content.test.tsx": 1899,
"src/renderer/src/components/editor/check-details/actions/check-annotation-path.test.ts": 53,
"src/renderer/src/components/editor/check-details/reading/check-details-reading-viewport.test.ts": 259,
"src/renderer/src/components/editor/model-lifetime/retention/closed-editor-model-lifetime.test.ts": 7921,
"src/renderer/src/components/editor/model-lifetime/retention/closed-editor-model-shell.test.tsx": 4492,
"src/renderer/src/components/editor/model-lifetime/retention/closed-editor-tab-disposal.test.ts": 121,
@@ -4963,7 +4952,6 @@
"src/renderer/src/components/editor/monaco-programmatic-sync.test.ts": 46,
"src/renderer/src/components/editor/pdf-orca-media-range-transport.test.ts": 282,
"src/renderer/src/components/editor/pdf-view-position.test.ts": 74,
"src/renderer/src/components/editor/pdf-viewer-failed-load-recovery.test.tsx": 2363,
"src/renderer/src/components/editor/pdf-viewer-zoom-ownership.test.tsx": 789,
"src/renderer/src/components/editor/plugin-custom-editor-host.test.ts": 480,
"src/renderer/src/components/editor/rich-markdown/raw-source/raw-markdown-html-line-break.test.ts": 2188,
@@ -5034,7 +5022,6 @@
"src/renderer/src/components/editor/use-monaco-editor-mount.cursor-owner.test.tsx": 1332,
"src/renderer/src/components/editor/use-monaco-editor-mount.stale-cache.test.tsx": 877,
"src/renderer/src/components/editor/use-monaco-reveal-scheduler.test.tsx": 273,
"src/renderer/src/components/editor/use-pdf-viewer-find-shortcut.test.tsx": 907,
"src/renderer/src/components/editor/use-preserve-section-during-external-edit.test.tsx": 268,
"src/renderer/src/components/editor/rich-markdown/tables/use-rich-markdown-table-context-menu.test.tsx": 2238,
"src/renderer/src/components/editor/external-changes/useEditorPanelExternalContentEvents.test.tsx": 2018,
@@ -5042,7 +5029,6 @@
"src/renderer/src/components/editor/useEditorPanelHostUnresolvedContentState.test.tsx": 1952,
"src/renderer/src/components/editor/notebook/kernel/useIpynbCellExecution.test.tsx": 695,
"src/renderer/src/components/editor/notebook/document/useIpynbDocumentEditing.test.tsx": 2192,
"src/renderer/src/components/editor/notebook/document/useIpynbScrollRestoration.test.tsx": 323,
"src/renderer/src/components/editor/rich-markdown/links/useLinkBubble.test.tsx": 493,
"src/renderer/src/components/editor/rich-markdown/images/useLocalImagePick.test.tsx": 1319,
"src/renderer/src/components/editor/document-images/useLocalImageSrc.test.ts": 736,
@@ -5066,11 +5052,7 @@
"src/renderer/src/components/emulator-pane/emulator-screen-stream-content.test.tsx": 408,
"src/renderer/src/components/emulator-pane/use-emulator-pane-session.test.tsx": 1968,
"src/renderer/src/components/emulator-pane/use-mobile-emulator-tab-intro-actions.test.tsx": 1828,
"src/renderer/src/components/error-boundaries/RecoverableRenderErrorBoundary.lazy-chunk.test.tsx": 451,
"src/renderer/src/components/error-boundaries/RecoverableRenderErrorBoundary.never-landed-reload.test.tsx": 449,
"src/renderer/src/components/feature-tips/ChatUiHereCornerCard.test.tsx": 2798,
"src/renderer/src/components/feature-tips/ChatUiHereFeatureTipVisual.test.tsx": 1093,
"src/renderer/src/components/feature-tips/ChatUiHereTip.test.tsx": 6788,
"src/renderer/src/components/feature-tips/feature-tip-modal-state.test.ts": 244,
"src/renderer/src/components/feature-wall/FeatureWallSetupWorkflowActions.test.tsx": 2028,
"src/renderer/src/components/feature-wall/FullDiskAccessSetupPrompt.test.ts": 466,
@@ -5215,7 +5197,6 @@
"src/renderer/src/components/native-chat/attachments/intake/native-chat-composer-drop-scope.test.tsx": 1409,
"src/renderer/src/components/native-chat/attachments/intake/native-chat-composer-ime-file-drop.test.tsx": 1326,
"src/renderer/src/components/native-chat/drafts/native-chat-composer-prompt-recall.test.tsx": 1724,
"src/renderer/src/components/native-chat/composer/focus/native-chat-composer-reveal-focus.test.tsx": 526,
"src/renderer/src/components/native-chat/attachments/intake/native-chat-composer-workspace-file-drop.test.tsx": 1166,
"src/renderer/src/components/native-chat/drafts/native-chat-draft-retention.test.ts": 1415,
"src/renderer/src/components/native-chat/attachments/intake/native-chat-external-attachments-destination.test.tsx": 951,
@@ -5279,7 +5260,6 @@
"src/renderer/src/components/native-chat/conversation/projection/use-native-chat-context-clear-floor.test.tsx": 271,
"src/renderer/src/components/native-chat/pane/actions/use-native-chat-context-menu.targets.test.tsx": 3071,
"src/renderer/src/components/native-chat/attachments/intake/use-native-chat-external-attachments.test.tsx": 797,
"src/renderer/src/components/native-chat/viewport/find/use-native-chat-find.test.tsx": 1458,
"src/renderer/src/components/native-chat/session/status/use-native-chat-hook-status.test.ts": 1927,
"src/renderer/src/components/native-chat/host-access/use-native-chat-host-outage.test.tsx": 2131,
"src/renderer/src/components/native-chat/drafts/use-native-chat-launch-draft-adoption.test.tsx": 319,
@@ -5328,7 +5308,6 @@
"src/renderer/src/components/new-workspace/use-recent-project-ids.test.ts": 1730,
"src/renderer/src/components/new-workspace/use-smart-workspace-name-field-foundation.source.test.tsx": 2290,
"src/renderer/src/components/new-workspace/work-item-source-selection.test.ts": 1736,
"src/renderer/src/components/onboarding/OnboardingInlineCommandTerminal.command-finished.test.tsx": 681,
"src/renderer/src/components/onboarding/OnboardingLanguageLoading.test.tsx": 2167,
"src/renderer/src/components/onboarding/onboarding-feature-setup.test.ts": 76,
"src/renderer/src/components/pet/pet-blob-cache.test.ts": 64,
@@ -5392,7 +5371,6 @@
"src/renderer/src/components/right-sidebar/ai-vault/scanning/ai-vault-panel-session-list-request.test.tsx": 3044,
"src/renderer/src/components/right-sidebar/ai-vault/search/ai-vault-search-session.test.ts": 201,
"src/renderer/src/components/right-sidebar/ai-vault/accounts/ai-vault-session-account-render.test.tsx": 2885,
"src/renderer/src/components/right-sidebar/ai-vault/scanning/ai-vault-session-conditional-refresh-hook.test.tsx": 2370,
"src/renderer/src/components/right-sidebar/ai-vault/session-list/ai-vault-session-filters.test.ts": 105,
"src/renderer/src/components/right-sidebar/ai-vault/scope/ai-vault-session-projects.test.ts": 117,
"src/renderer/src/components/right-sidebar/ai-vault/scanning/ai-vault-session-refresh.test.ts": 2034,
@@ -5408,7 +5386,6 @@
"src/renderer/src/components/right-sidebar/checks-panel/gitlab-review-client.test.ts": 321,
"src/renderer/src/components/right-sidebar/checks-panel/comments/review-comment-markdown.test.tsx": 2171,
"src/renderer/src/components/right-sidebar/checks-panel/refresh/use-checks-panel-manual-refresh-recovery.test.tsx": 2909,
"src/renderer/src/components/right-sidebar/checks-panel/refresh/use-checks-panel-polling.test.tsx": 2189,
"src/renderer/src/lib/repository-refresh/coalesced-poll-runner.test.ts": 61,
"src/renderer/src/components/right-sidebar/file-explorer/mutations/file-explorer-delete-undo-precondition.test.tsx": 2023,
"src/renderer/src/components/right-sidebar/file-explorer/tree/file-explorer-dir-pages.test.ts": 1767,
@@ -5430,7 +5407,6 @@
"src/renderer/src/components/right-sidebar/plugin-panels/health/plugin-panel-watchdog.test.ts": 116,
"src/renderer/src/components/right-sidebar/checks-panel/comments/pr-comments-ai-launch-ack.test.ts": 118,
"src/renderer/src/components/right-sidebar/checks-panel/comments/pr-comments-list-selection.test.tsx": 3290,
"src/renderer/src/components/right-sidebar/right-sidebar-titlebar-drag-regions.render.test.tsx": 1044,
"src/renderer/src/components/right-sidebar/source-control/ai/runSourceControlAgentActionStart.test.ts": 1917,
"src/renderer/src/components/right-sidebar/source-control/review/source-control-create-pr-intent-flow.test.ts": 71,
"src/renderer/src/components/right-sidebar/source-control/review/source-control-manual-review-url.test.ts": 77,
@@ -5475,7 +5451,6 @@
"src/renderer/src/components/settings/browser/BrowserSitePermissionsSetting.test.tsx": 739,
"src/renderer/src/components/settings/browser/BrowserUserAgentSetting.test.tsx": 2325,
"src/renderer/src/components/settings/chat/ChatNamingSetting.test.tsx": 2454,
"src/renderer/src/components/settings/chat/ChatPermissionSetting.test.tsx": 834,
"src/renderer/src/components/settings/chat/ChatSettingsSection.test.tsx": 2718,
"src/renderer/src/lib/skills/runtime/skill-runtime-command.test.ts": 1670,
"src/renderer/src/components/settings/virtual-machines/recipes/EphemeralVmsPane.test.tsx": 1025,
@@ -5488,7 +5463,6 @@
"src/renderer/src/components/settings/advanced/network/NodeDistMirrorDialog.test.tsx": 2412,
"src/renderer/src/components/plugins/list/PluginsSettingsSection.lifecycle.test.tsx": 5402,
"src/renderer/src/components/settings/runtime-environments/pairing/RuntimePairingGeneratorForm.test.tsx": 461,
"src/renderer/src/components/settings/session-history/SessionHistorySettingsPane.test.tsx": 1474,
"src/renderer/src/components/settings/appearance/fonts/FontAutocomplete.test.tsx": 1202,
"src/renderer/src/components/settings/form-controls/SettingsFormControls.segmented-control.test.tsx": 730,
"src/renderer/src/components/settings/shortcuts/ShortcutFilterRail.test.ts": 273,
@@ -5503,7 +5477,6 @@
"src/renderer/src/components/settings/TerminalAppearanceSection.ghostty.test.ts": 549,
"src/renderer/src/components/settings/terminal/appearance/TerminalContrastSetting.test.tsx": 798,
"src/renderer/src/components/settings/terminal/session-management/TerminalLimitSetting.test.tsx": 1015,
"src/renderer/src/components/settings/terminal/TerminalPane.section-lifetime.test.tsx": 1237,
"src/renderer/src/components/settings/developer-permissions/TerminalTccAttributionNotice.test.tsx": 401,
"src/renderer/src/components/settings/voice/VoiceMicrophoneSetting.test.tsx": 957,
"src/renderer/src/components/settings/voice/VoicePane.test.tsx": 1042,
@@ -5538,7 +5511,6 @@
"src/renderer/src/components/session-search/use-session-search-status.test.tsx": 477,
"src/renderer/src/components/settings/accounts/usage/use-zcode-plan-credentials.test.tsx": 880,
"src/renderer/src/components/setup-guide/SetupGuideModal.mount-gating.test.tsx": 2348,
"src/renderer/src/components/shared/MacFolderAccessFixDialog.test.tsx": 1356,
"src/renderer/src/components/shared/kill-all-terminal-surfaces.test.ts": 1925,
"src/renderer/src/components/shared/useDaemonActions.test.tsx": 332,
"src/renderer/src/components/sidebar/host-admission/ssh/AddRemoteHostDialog.config-picker.test.tsx": 1178,
@@ -5560,7 +5532,6 @@
"src/renderer/src/components/sidebar/SeveredTerminalDaemonBanner.test.tsx": 574,
"src/renderer/src/components/sidebar/Sidebar.test.tsx": 833,
"src/renderer/src/components/sidebar/SidebarAgentsList.test.tsx": 2985,
"src/renderer/src/components/sidebar/sidebar-feedback/SidebarFeedbackDialog.test.tsx": 2529,
"src/renderer/src/components/sidebar/StalledTerminalDaemonBanner.test.tsx": 320,
"src/renderer/src/components/sidebar/workspace-board/viewport/WorkspaceKanbanLaneGrid.test.tsx": 360,
"src/renderer/src/components/sidebar/workspace-card/surface/WorktreeCard.single-reference-details.test.tsx": 2032,
@@ -5663,7 +5634,6 @@
"src/renderer/src/components/stats/usage-daily-chart.test.tsx": 333,
"src/renderer/src/components/stats/usage-overview-model.test.ts": 364,
"src/renderer/src/components/status-bar/ClaudeSwitcherMenu.owner-lifetime.test.tsx": 2317,
"src/renderer/src/components/status-bar/PortsStatusSegment.render-stability.test.tsx": 2161,
"src/renderer/src/components/status-bar/SshStatusSegment.large-host-list.test.tsx": 1838,
"src/renderer/src/components/status-bar/StatusBarUsageChangeNotices.test.tsx": 785,
@@ -5685,7 +5655,6 @@
"src/renderer/src/components/status-bar/use-resource-pty-actions.test.tsx": 879,
"src/renderer/src/components/status-bar/use-resource-usage-derived-model.test.tsx": 742,
"src/renderer/src/components/tab-bar/CopyTabIdMenuItem.test.tsx": 428,
"src/renderer/src/components/tab-bar/NativeChatNamingFailure.test.tsx": 1062,
"src/renderer/src/components/tab-bar/TabBarCreateEntry.search.test.tsx": 3224,
"src/renderer/src/components/tab-bar/TabBarItemRow.test.tsx": 2116,
"src/renderer/src/components/tab-bar/TabBarQuickCommandItem.test.tsx": 384,
@@ -5808,7 +5777,6 @@
"src/renderer/src/components/terminal-pane/layout/close/pending-pane-close-confirmation.test.ts": 4695,
"src/renderer/src/components/terminal-pane/layout/close/pending-runtime-pane-close.test.ts": 3487,
"src/renderer/src/components/terminal-pane/layout/close/pending-split-close.test.ts": 4680,
"tests/e2e/terminal-agent-pane-launch.unit.test.ts": 8045,
"src/renderer/src/components/terminal-pane/snapshots/pty-buffer-serializer.test.ts": 53,
"src/renderer/src/components/terminal-pane/pty-connection/agent-identity/pty-connection-command-finished-late-done.test.ts": 10940,
"src/renderer/src/components/terminal-pane/pty-connection/tests/pty-connection-completion-and-notification.test.ts": 18380,
@@ -5856,7 +5824,6 @@
"src/renderer/src/components/terminal-pane/pty-connection/host-ownership/unserved-ssh-pane-bridge.test.ts": 70,
"src/renderer/src/components/terminal-pane/pty-transport/delivery/pty-dispatcher-delivery-resync.test.ts": 85,
"src/renderer/src/components/terminal-pane/pty-transport/delivery/pty-dispatcher-pi-routing.test.ts": 1362,
"src/renderer/src/components/terminal-pane/pty-transport/delivery/pty-dispatcher-push-reattach.test.ts": 108,
"src/renderer/src/components/terminal-pane/pty-transport/input/pty-input-write-queue.test.ts": 787,
"src/renderer/src/components/terminal-pane/pty-transport/delivery/pty-model-restore-channel.test.ts": 44,
"src/renderer/src/components/terminal-pane/pty-transport/output/pty-output-processor-program-activity.test.ts": 160,
@@ -5893,7 +5860,6 @@
"src/renderer/src/components/terminal-pane/pty-transport/remote-runtime/remote-runtime-pty-query-reply-immediate.test.ts": 1556,
"src/renderer/src/components/terminal-pane/pty-transport/remote-runtime/recovery/remote-runtime-pty-recovery-state.test.ts": 85,
"src/renderer/src/components/terminal-pane/pty-transport/remote-runtime/remote-runtime-pty-transport-activation-inventory-fallback.test.ts": 1311,
"src/renderer/src/components/terminal-pane/pty-transport/remote-runtime/remote-runtime-pty-transport-attach-subscription.test.ts": 2346,
"src/renderer/src/components/terminal-pane/pty-transport/remote-runtime/remote-runtime-pty-transport-create-handoff.test.ts": 14353,
"src/renderer/src/components/terminal-pane/pty-transport/remote-runtime/remote-runtime-pty-transport-create-outcome-recovery.test.ts": 2041,
"src/renderer/src/components/terminal-pane/pty-transport/remote-runtime/remote-runtime-pty-transport-empty-initial-snapshot.test.ts": 1491,
@@ -5994,10 +5960,8 @@
"src/renderer/src/components/terminal-pane/layout/reconciliation/terminal-pane-frame-reconciliation.test.ts": 903,
"src/renderer/src/components/terminal-pane/host-state/terminal-pane-host-state-memo.test.ts": 4534,
"src/renderer/src/components/terminal-pane/mounting/terminal-pane-mount-bootstrap.test.ts": 1723,
"src/renderer/src/components/terminal-pane/render-health/recovery/terminal-pane-recovery-unsettled-fallback.test.ts": 831,
"src/renderer/src/components/terminal-pane/render-health/recovery/terminal-pane-recovery.test.ts": 949,
"src/renderer/src/components/terminal-pane/layout/split/terminal-pane-split-request-routing.test.ts": 2015,
"src/renderer/src/components/terminal-pane/pty-transport/recovery/terminal-pane-surface-ownership.test.ts": 426,
"src/renderer/src/components/terminal-pane/layout/detach/terminal-pane-tab-detach-main-commit.test.ts": 2090,
"src/renderer/src/components/terminal-pane/layout/detach/terminal-pane-tab-detach-main-move.test.ts": 2147,
"src/renderer/src/components/terminal-pane/parking/verdict/terminal-park-verdict-flip-telemetry.test.ts": 123,
@@ -6187,7 +6151,6 @@
"src/renderer/src/hooks/useImmediateMutation.test.ts": 618,
"src/renderer/src/hooks/skills/discovery/useInstalledAgentSkills.react.test.tsx": 2093,
"src/renderer/src/hooks/useIpcEvents-agent-status-connection-attribution.test.ts": 5510,
"src/renderer/src/hooks/useIpcEvents-agent-status-hook-titles.test.ts": 5621,
"src/renderer/src/hooks/useIpcEvents-agent-status-pane-teardown.test.ts": 5268,
"src/renderer/src/hooks/useIpcEvents-agent-status-queue-ordering.test.ts": 3680,
"src/renderer/src/hooks/useIpcEvents-agent-status-snapshot-hydration.test.ts": 7403,
@@ -6204,7 +6167,6 @@
"src/renderer/src/hooks/useIpcEvents-runtime-environment-selectors.test.ts": 530,
"src/renderer/src/hooks/useIpcEvents-session-tab-close-request.test.ts": 2252,
"src/renderer/src/hooks/useIssueMetadata.test.tsx": 344,
"src/renderer/src/hooks/useMacTccAttributionSeveredNotice.test.tsx": 2358,
"src/renderer/src/hooks/useMetadataListRequest.test.tsx": 266,
"src/renderer/src/hooks/useModalReturnFocus.test.tsx": 1938,
"src/renderer/src/hooks/clipboard/primary-selection/usePrimarySelectionPaste.terminal-native-paste.test.tsx": 388,
@@ -6240,8 +6202,6 @@
"src/renderer/src/lib/agent-session/hibernation/agent-hibernation-pane-age.test.ts": 41,
"src/renderer/src/lib/agent-session/hibernation/agent-hibernation-planner.test.ts": 341,
"src/renderer/src/lib/agent-session/hibernation/agent-hibernation-runtime-liveness-race.test.ts": 1914,
"src/renderer/src/lib/agent-session/launch/new-tab/agent-launch-caller-prompt-transport.test.ts": 1326,
"src/renderer/src/lib/agent-session/launch/new-tab/agent-launch-caller-routing.test.ts": 1266,
"src/renderer/src/lib/agent-session/launch/pane/agent-launch-pane-verdict-application.test.ts": 1869,
"src/renderer/src/lib/agent-session/launch/routing/agent-launch-route-input.test.ts": 1659,
"src/renderer/src/lib/agent-session/launch/routing/agent-launch-route-registered-agents.test.ts": 1749,
@@ -6312,7 +6272,6 @@
"src/renderer/src/lib/source-control/review/comments/comment-body-submit-state.test.ts": 55,
"src/renderer/src/lib/composer-submit-cancellation.test.ts": 41,
"src/renderer/src/lib/workspace/ownership/connection-context.test.ts": 1817,
"src/renderer/src/lib/crash-diagnostics.test.ts": 176,
"src/renderer/src/lib/create-untitled-markdown.test.ts": 566,
"src/renderer/src/lib/desktop-created-server-tabs.test.ts": 1933,
"src/renderer/src/lib/workspace/ownership/direct-ssh-target-scope.test.ts": 48,
@@ -6324,8 +6283,7 @@
"src/renderer/src/runtime/repo-hooks/ensure-hooks-confirmed.test.ts": 799,
"src/renderer/src/lib/simulator/tabs/ensure-simulator-tab-behavior.test.ts": 3601,
"src/renderer/src/runtime/hosts/platform/execution-host-facts.test.ts": 1796,
"src/renderer/src/lib/feature-education-telemetry.test.ts": 52,
"src/renderer/src/lib/feedback-image-attachments.test.ts": 557,
"src/renderer/src/components/sidebar/sidebar-feedback/feedback-image-attachments.test.ts": 557,
"src/renderer/src/lib/files/search/file-search-selection.test.ts": 51,
"src/renderer/src/lib/finished-agent-resume-resurrection.test.ts": 1872,
"src/renderer/src/components/terminal-pane/parking/retention/foreground-terminal-tabs.test.ts": 55,
@@ -6351,10 +6309,7 @@
"src/renderer/src/lib/workspace/creation/work-item/launch-work-item-direct-accepted.test.tsx": 2754,
"src/renderer/src/lib/workspace/creation/work-item/launch-work-item-direct-defaults.test.ts": 1594,
"src/renderer/src/lib/workspace/creation/work-item/launch-work-item-direct-setup.test.tsx": 3435,
"src/renderer/src/lib/lazy-chunk-recovery-reload.test.ts": 246,
"src/renderer/src/lib/lazy-with-retry.never-landed-reload.test.ts": 194,
"src/renderer/src/lib/lazy-with-retry.preload.test.tsx": 208,
"src/renderer/src/lib/lazy-with-retry.test.ts": 282,
"src/renderer/src/app-shell/startup/lazy-with-retry.never-landed-reload.test.ts": 194,
"src/renderer/src/lib/work-items/linear/linear-board-drag-payload.test.ts": 58,
"src/renderer/src/lib/work-items/linear/linear-issue-workspace-attachment.test.ts": 99,
"src/renderer/src/lib/link-source-local-open-owner.test.ts": 433,
@@ -6384,7 +6339,6 @@
"src/renderer/src/lib/pane-manager/pane-cursor-blink-suspension.test.ts": 429,
"src/renderer/src/lib/pane-manager/pane-drag-window-blur.test.ts": 618,
"src/renderer/src/lib/pane-manager/pane-fit-resize-observer.test.ts": 94,
"src/renderer/src/lib/pane-manager/pane-fit.test.ts": 166,
"src/renderer/src/lib/pane-manager/pane-inline-image-recovery.test.ts": 61,
"src/renderer/src/lib/pane-manager/pane-inline-images.test.ts": 74,
"src/renderer/src/lib/pane-manager/pane-layout-geometry-apply.test.ts": 897,
@@ -6394,11 +6348,6 @@
"src/renderer/src/lib/pane-manager/pane-terminal-foreground-render-settle.test.ts": 43,
"src/renderer/src/lib/pane-manager/pane-terminal-mouse-wheel.test.ts": 88,
"src/renderer/src/lib/pane-manager/pane-terminal-output-queue-chunks.test.ts": 44,
"src/renderer/src/lib/pane-manager/pane-terminal-output-scheduler-ack-credit.test.ts": 173,
"src/renderer/src/lib/pane-manager/pane-terminal-output-scheduler-disposed-writes.test.ts": 121,
"src/renderer/src/lib/pane-manager/pane-terminal-output-scheduler-queue-retention.test.ts": 301,
"src/renderer/src/lib/pane-manager/pane-terminal-output-scheduler-synchronized-frames.test.ts": 213,
"src/renderer/src/lib/pane-manager/pane-terminal-output-scheduler.test.ts": 236,
"src/renderer/src/lib/pane-manager/pane-tree-equalization-parity.test.ts": 182,
"src/renderer/src/lib/pane-manager/pane-tree-equalization-scaling.test.ts": 239,
"src/renderer/src/lib/pane-manager/pane-tree-match-moves.test.ts": 662,
@@ -6415,7 +6364,6 @@
"src/renderer/src/lib/pane-manager/terminal-indic-cluster-ranges.test.ts": 50,
"src/renderer/src/lib/pane-manager/terminal-kitty-file-reader.test.ts": 83,
"src/renderer/src/lib/pane-manager/terminal-ligatures-addon.test.ts": 59,
"src/renderer/src/lib/pane-manager/terminal-link-provider-guard.test.ts": 48,
"src/renderer/src/lib/pane-manager/terminal-linkifier-hover-reset-on-write.test.ts": 59,
"src/renderer/src/lib/pane-manager/terminal-mouse-encoding-tracker.test.ts": 95,
"src/renderer/src/lib/pane-manager/terminal-mouse-report-finite-coordinates.test.ts": 272,
@@ -6433,7 +6381,6 @@
"src/renderer/src/lib/pane-manager/xterm-instance-disposed.test.ts": 57,
"src/renderer/src/lib/pane-manager/xterm-parse-barrier.test.ts": 154,
"src/renderer/src/lib/pane-manager/xterm-user-scrolling-contract.test.ts": 1266,
"src/renderer/src/lib/pane-manager/xterm-write-callback-guard.test.ts": 53,
"src/renderer/src/components/terminal-pane/session-restore/spawn-deferral/pane-spawn-deferral-drain.test.ts": 61,
"src/renderer/src/components/terminal-pane/mounting/parked-terminal-host-hydration.test.ts": 274,
"src/renderer/src/lib/text-input/paste/paste-payload-metadata.test.ts": 53,
@@ -6448,15 +6395,10 @@
"src/renderer/src/lib/workspace/creation/project-clone-url-prefill.test.ts": 61,
"src/renderer/src/lib/workspace/creation/project-host-workspace-target.jira-mapping.test.ts": 76,
"src/renderer/src/lib/workspace/creation/project-host-workspace-target.test.ts": 92,
"src/renderer/src/lib/react-commit-cascade-observer.react185.test.tsx": 285,
"src/renderer/src/lib/react-commit-cascade-observer.test.ts": 189,
"src/renderer/src/lib/react-commit-cascade-telemetry.test.ts": 159,
"src/renderer/src/lib/react-error-boundary-reporting.test.ts": 55,
"src/renderer/src/lib/editor/file-operations/remap-open-editor-tabs-for-path-change.test.ts": 2178,
"src/renderer/src/lib/rename-user-named-tab-access.test.ts": 2804,
"src/renderer/src/lib/renderer-agent-status-observation-ingress.test.ts": 81,
"src/renderer/src/lib/renderer-app-platform.test.ts": 197,
"src/renderer/src/lib/renderer-memory-profile.test.ts": 70,
"src/renderer/src/diagnostics/memory/renderer-memory-profile.test.ts": 70,
"src/renderer/src/lib/repo-search.test.ts": 54,
"src/renderer/src/lib/repo-slug-cache.test.ts": 52,
"src/renderer/src/lib/repo-slug-index.test.ts": 2240,
@@ -6479,7 +6421,6 @@
"src/renderer/src/lib/script-textarea-rows.test.ts": 93,
"src/renderer/src/lib/session-write-subscriber-acknowledgment.test.ts": 1823,
"src/renderer/src/lib/session-write-subscriber.test.ts": 1882,
"src/renderer/src/lib/shutdown-checkpoint-guard.test.ts": 209,
"src/renderer/src/lib/sidebar-ended-creations.test.ts": 1889,
"src/renderer/src/lib/sidebar-pending-layer.test.ts": 338,
"src/renderer/src/lib/sidebar-shadow/workspace-activity-shadow.test.ts": 1728,
@@ -6490,7 +6431,7 @@
"src/renderer/src/lib/simulator/tabs/simulator-tab-palette-activation.test.ts": 1903,
"src/renderer/src/lib/source-control/remote/source-control-remote-error.test.ts": 340,
"src/renderer/src/lib/ssh-config-passive-sync.test.ts": 1513,
"src/renderer/src/lib/state-collection-byte-estimate.test.ts": 86,
"src/renderer/src/diagnostics/memory/state-collection-byte-estimate.test.ts": 86,
"src/renderer/src/lib/agent-session/launch/structured-agent-session-launch-draft.test.ts": 1042,
"src/renderer/src/lib/agent-session/launch/structured-agent-session-launch-prerequisites.test.ts": 2427,
"src/renderer/src/lib/agent-session/options/structured-agent-session-selection-lifetime.test.tsx": 2947,
@@ -6515,8 +6456,6 @@
"src/renderer/src/lib/use-tab-agent-opencode-native-title.test.ts": 2093,
"src/renderer/src/lib/use-tab-agent.test.ts": 1961,
"src/renderer/src/lib/wake-sleeping-agents-live-unmounted-pane.test.ts": 2432,
"src/renderer/src/lib/window-visibility-interval.test.ts": 48,
"src/renderer/src/lib/window-visibility-timeout-poller.test.ts": 207,
"src/renderer/src/runtime/hosts/capabilities/windows-terminal-capabilities-race.test.ts": 450,
"src/renderer/src/lib/workspace/activation/workspace-activation-path-gate.test.ts": 2107,
"src/renderer/src/lib/browser/workspace/workspace-browser-tab-open-placement.test.ts": 1996,
@@ -6625,11 +6564,6 @@
"src/renderer/src/runtime/browser/creation/web-runtime-browser-creation-placement.test.ts": 1927,
"src/renderer/src/runtime/browser/creation/web-runtime-browser-link-open.test.ts": 2217,
"src/renderer/src/runtime/browser/creation/web-runtime-browser-link-session.test.ts": 1964,
"src/renderer/src/runtime/browser/creation/web-runtime-session-browser-create-split-placement.test.ts": 949,
"src/renderer/src/runtime/web-session-tabs-sync/closing/web-runtime-session-tab-activate-close.test.ts": 1426,
"src/renderer/src/runtime/hosted-terminals/actions/web-runtime-session-terminal-pane-delegation.test.ts": 1341,
"src/renderer/src/runtime/hosted-terminals/creation/web-runtime-session-terminal-workspace-routing.test.ts": 768,
"src/renderer/src/runtime/web-session-tabs-sync/inventory/web-runtime-session.test.ts": 743,
"src/renderer/src/runtime/web-session-tabs-sync/closing/web-session-close-replay.test.ts": 1119,
"src/renderer/src/runtime/web-session-tabs-sync/placement/web-session-open-files-batch-equivalence.test.ts": 1478,
"src/renderer/src/runtime/web-session-tabs-sync/identity/web-session-restored-placeholder-identity.test.ts": 985,
@@ -6638,7 +6572,6 @@
"src/renderer/src/runtime/web-session-tabs-sync/subscriptions/web-session-tabs-stream-end-resubscribe.test.tsx": 2282,
"src/renderer/src/runtime/web-session-tabs-sync/agent-status/web-session-tabs-sync-agent-status.test.ts": 987,
"src/renderer/src/runtime/web-session-tabs-sync/placement/web-session-tabs-sync-browser-tabs.test.ts": 925,
"src/renderer/src/runtime/web-session-tabs-sync/subscriptions/web-session-tabs-sync-completion-on-reveal.test.tsx": 2249,
"src/renderer/src/runtime/web-session-tabs-sync/identity/web-session-tabs-sync-cross-runtime-worktree.test.ts": 964,
"src/renderer/src/runtime/web-session-tabs-sync/placement/web-session-tabs-sync-editor-ownership.test.ts": 1902,
"src/renderer/src/runtime/web-session-tabs-sync/placement/web-session-tabs-sync-editor-tabs.test.ts": 1073,
@@ -6732,7 +6665,6 @@
"src/renderer/src/store/slices/browser/pages/browser-workspace-doc-location.test.ts": 2007,
"src/renderer/src/store/slices/browser/browser.test.ts": 2001,
"src/renderer/src/store/slices/worktrees/teardown/bulk-worktree-purge-terminal-maps-leak.test.ts": 1727,
"src/renderer/src/store/workspaces/creation/active-workspace-create-actions.test.ts": 1879,
"src/renderer/src/store/terminals/codex-restart-notice-lifecycle.test.ts": 1685,
"src/renderer/src/store/slices/tabs/content-tabs-from-main-frames.test.ts": 2025,
"src/renderer/src/store/slices/tabs/content-tabs-paired-server-workspace.test.ts": 1923,
@@ -8009,7 +7941,6 @@
"tests/e2e/terminal-binding-crash-hydration.unit.test.ts": 1769,
"tests/e2e/terminal-foreground-confirmation.unit.test.ts": 644,
"tests/e2e/terminal-perf-presentation.unit.test.ts": 60,
"tests/e2e/web-runtime-session-terminal-host-authority.unit.test.ts": 1061,
"tests/e2e/worktree-status-warning.unit.test.ts": 2331,
"tests/tools/branch-line-total-renderer.test.mjs": 1222,
"tests/tools/omp-close-lifecycle.test.mjs": 403,
@@ -27,8 +27,6 @@ const NODE_RUNTIME_INCLUDE = [
'src/main/browser/extensions/native-messaging/browser-extension-native-host-process-backpressure.test.ts',
'src/main/daemon/providers/lifecycle/testing/daemon-init-provider-installation.test.ts',
'src/renderer/src/components/terminal-pane/pty-transport/input/pty-input-write-queue.test.ts',
'src/renderer/src/lib/react-commit-cascade-observer.test.ts',
'src/renderer/src/lib/react-commit-cascade-telemetry.test.ts',
// Asserts payloads are collected; Bun's GC scans the stack conservatively and may keep one alive.
'src/shared/ws-inbound-message-queue.test.ts',
'src/renderer/src/lib/agent-session/history/title-sync/ai-vault-tab-title-sync-inputs.test.ts',
-1
View File
@@ -24,7 +24,6 @@
"../src/cli/runtime/runtime-pid-liveness.ts",
"../src/renderer/src/store/slices/worktrees/create/worktree-create-payload.ts",
"../src/renderer/src/runtime/repo-hooks/orca-hook-trust.ts",
"../src/renderer/src/lib/sha256.ts",
"../src/renderer/src/components/native-chat/native-chat-resolution-receipt.ts",
"../src/renderer/src/components/native-chat/structured-agent-question-projection.ts",
"../src/renderer/src/components/native-chat/subagents/native-chat-subagent-delegation.ts",
-1
View File
@@ -3,7 +3,6 @@
"exclude": [
"../src/renderer/src/lib/agent-session/launch/new-tab/launch-agent-in-new-tab-main-surface.test.ts",
"../src/renderer/src/components/task-page/linear/task-page-linear-detail-query.test.tsx",
"../tests/e2e/terminal-agent-pane-launch.unit.test.ts",
"../src/renderer/src/runtime/provider-accounts/observations/provider-account-observation.test-fixture.ts",
"../src/shared/**/*.test.ts",
"../src/shared/**/*.test.tsx",
-1
View File
@@ -5,7 +5,6 @@
"../src/main/runtime/orchestration/terminal-authority/structured-sessions/structured-chat-coordinator-mail.test.ts",
"../src/main/runtime/rpc/methods/orchestration/orchestration-check-ambiguous-caller.test.ts",
"../src/renderer/src/components/task-page/linear/task-page-linear-detail-query.test.tsx",
"../tests/e2e/terminal-agent-pane-launch.unit.test.ts",
"../src/renderer/src/runtime/observed-provider-accounts.test.tsx",
"../src/renderer/src/components/status-bar/ClaudeSwitcherMenu.observation.test.tsx",
"../src/renderer/src/runtime/provider-accounts/observations/provider-account-observation.test-fixture.ts",
-1
View File
@@ -13,7 +13,6 @@
"exclude": [
"../src/renderer/src/lib/agent-session/launch/new-tab/launch-agent-in-new-tab-main-surface.test.ts",
"../src/renderer/src/components/task-page/linear/task-page-linear-detail-query.test.tsx",
"../tests/e2e/terminal-agent-pane-launch.unit.test.ts",
"../src/renderer/src/runtime/provider-accounts/observations/provider-account-observation.test-fixture.ts"
],
"compilerOptions": {
-1
View File
@@ -17,7 +17,6 @@ const contracts = [
'src/main/codex-usage/scanner-incremental-append.test.ts',
'src/main/usage/jsonl-file-reader.test.ts',
'src/main/usage/jsonl-file-snapshot.test.ts',
'src/renderer/src/lib/pane-manager/pane-terminal-output-scheduler-queue-retention.test.ts',
'config/scripts/static-analysis/oxlint-contracts/app-store-performance-plugin.test.mjs',
'config/scripts/static-analysis/oxlint-contracts/quadratic-buffer-concat-plugin.test.mjs',
'src/main/claude-usage/scanner-incremental-append.test.ts',
@@ -1,5 +1,5 @@
import { Suspense } from 'react'
import { lazyWithRetry as lazy } from '@/lib/lazy-with-retry'
import { lazyWithRetry as lazy } from '@/app-shell/startup/lazy-with-retry'
import { AgentHibernationGate } from '../components/AgentHibernationGate'
import { AiVaultTabTitleSyncGate } from '../components/AiVaultTabTitleSyncGate'
import RetainedAgentsSyncGate from '../components/dashboard/RetainedAgentsSyncGate'
@@ -1,6 +1,6 @@
import { Suspense, type JSX } from 'react'
import type { TopLevelView } from '../../../shared/ui-chrome-types'
import { lazyWithRetry as lazy } from '@/lib/lazy-with-retry'
import { lazyWithRetry as lazy } from '@/app-shell/startup/lazy-with-retry'
import { CodexSharedSettingsNoticeCard } from '../components/CodexSharedSettingsNoticeCard'
import { NotificationCardStack } from '../components/NotificationCardStack'
import { StarNagCard } from '../components/StarNagCard'
@@ -4,7 +4,7 @@ import { OnboardingLanguageLoading } from '../components/onboarding/OnboardingLa
import { useLanguageReadiness } from '../i18n/language-readiness'
import { memo, Suspense } from 'react'
import { createPortal } from 'react-dom'
import { lazyWithRetry as lazy } from '@/lib/lazy-with-retry'
import { lazyWithRetry as lazy } from '@/app-shell/startup/lazy-with-retry'
import { useTranslate } from '@/i18n/use-translate'
import { RecoverableRenderErrorBoundary } from '../components/error-boundaries/RecoverableRenderErrorBoundary'
import NewWorkspaceComposerModal from '../components/NewWorkspaceComposerModal'
@@ -20,7 +20,7 @@ import { ZoomOverlay } from '../components/ZoomOverlay'
import { WslMoveDialogHost } from '../components/wsl-move/WslMoveDialog'
import { MacosUpdateRequirementHost } from '../components/macos-update-requirement/MacosUpdateRequirementHost'
import { shouldRenderPetOverlay } from '../components/pet/pet-overlay-visibility'
import { useAppStore } from '../store'
import { useAppStore } from '../store/index'
import type { UpdateStatus } from '../../../shared/update-status-types'
import { useLazyModalMounts } from './use-lazy-modal-mounts'
import { AppNotificationCards } from './AppNotificationCards'
@@ -1,12 +1,12 @@
import { memo, Suspense, useCallback, useRef } from 'react'
import { lazyWithRetry as lazy } from '@/lib/lazy-with-retry'
import { lazyWithRetry as lazy } from '@/app-shell/startup/lazy-with-retry'
import { useTranslate } from '@/i18n/use-translate'
import { useAppStore } from '@/store'
import { useAppStore } from '@/store/index'
import { usePluginViewCaptureStore } from '@/store/plugins/capture/plugin-view-capture'
import { pendingCreationOpensNativeChat } from '@/lib/workspace/creation/pending-worktree-creation'
import { showsFloatingRightSidebarToggle } from '@/lib/right-sidebar-visibility'
import Sidebar from '../components/Sidebar'
import RightSidebar from '../components/right-sidebar'
import RightSidebar from '../components/right-sidebar/index'
import { RecoverableRenderErrorBoundary } from '../components/error-boundaries/RecoverableRenderErrorBoundary'
import { FloatingTerminalToggleButton } from '../components/floating-terminal/FloatingTerminalToggleButton'
import { TerminalWorkbenchContainer } from '../components/TerminalWorkbenchContainer'
@@ -16,10 +16,10 @@ import {
deleteHoveredWorkspaceImmediately,
resolveHoveredWorkspaceDeleteTarget
} from '../components/sidebar/workspace-actions/deletion/hovered-workspace-delete'
import { useAppStore } from '../store'
import { useAppStore } from '../store/index'
import type { usePluginCommands } from '@/store/plugins/catalog/plugin-contribution-catalog'
import { isGitRepoKind } from '../../../shared/repo-kind'
import { openPluginsSettings } from '@/lib/open-plugins-settings'
import { openPluginsSettings } from '@/components/settings/navigation/open-plugins-settings'
import { resolveActiveTabRenameTarget } from './active-tab-rename-target'
import { createPluginsSettingsShortcutHandler } from './plugin-settings-shortcut-handler'
import type {
@@ -1,5 +1,5 @@
import type { WindowMaterial, WindowMaterialHost } from '../../../../shared/window-material'
import { getRendererAppPlatform } from '../../lib/renderer-app-platform'
import { getRendererAppPlatform } from '../platform/renderer-app-platform'
let material: WindowMaterial | undefined
@@ -1,7 +1,7 @@
import {
formatClientEnvironmentFooter,
type ClientEnvironmentInfo
} from '../../../shared/client-environment-info'
} from '../../../../shared/client-environment-info'
import { getRendererAppPlatform } from './renderer-app-platform'
export async function resolveClientEnvironmentInfo(): Promise<ClientEnvironmentInfo> {
@@ -2,8 +2,8 @@ import {
parseExecutionHostId,
toRuntimeExecutionHostId,
type ExecutionHostId
} from '../../../shared/execution-host'
import { isPairedWebClientWindow } from './desktop-window-chrome'
} from '../../../../shared/execution-host'
import { isPairedWebClientWindow } from '../../lib/desktop-window-chrome'
type HostRouteState = { runtimeEnvironments?: readonly { id: string }[] }
@@ -1,7 +1,7 @@
import type {
ActiveRightSidebarTab,
RightSidebarExplorerView
} from '../../../shared/ui-chrome-types'
} from '../../../../shared/ui-chrome-types'
import type { OpenFile } from '@/store/slices/editor/types/open-file'
const MAC_APP_DATA_SEGMENT_RE = /(^|\/)Library\/(Containers|Group Containers)\//
@@ -1,7 +1,7 @@
import type { PersistedUIState } from '../../../shared/persisted-ui-state-types'
import { formatShutdownCheckpointFailureReason } from '../../../shared/renderer-shutdown-events'
import type { WorkspaceSessionHostSnapshot } from '../lib/workspace/persistence/workspace-session-host-persistence'
import { recordRendererCrashBreadcrumb } from '../lib/crash-breadcrumb-recorder'
import { recordRendererCrashBreadcrumb } from '../diagnostics/crash-reporting/crash-breadcrumb-recorder'
export type ShutdownCheckpointStageArgs = {
sessions: WorkspaceSessionHostSnapshot[]
@@ -1,142 +0,0 @@
// @vitest-environment happy-dom
import { afterEach, describe, expect, it, vi } from 'vitest'
import {
ORCA_APP_RESTART_ABORTED_EVENT,
ORCA_APP_RESTART_STARTED_EVENT,
ORCA_UPDATER_QUIT_AND_INSTALL_ABORTED_EVENT,
ORCA_UPDATER_QUIT_AND_INSTALL_STARTED_EVENT
} from '../../../shared/updater-renderer-events'
import {
ORCA_RENDERER_SHUTDOWN_CHECKPOINT_ABORTED_EVENT,
ORCA_RENDERER_UNLOAD_PREVENTED_EVENT
} from '../../../shared/renderer-shutdown-events'
import { prepareRendererForAppRestart } from '../../../shared/renderer-restart-preparation'
import {
createShutdownCheckpointBeforeUnloadHandler,
createShutdownCheckpointGuard
} from '../lib/shutdown-checkpoint-guard'
import {
isIntentionalAppRestartInProgress,
registerUpdaterBeforeUnloadBypass
} from '../lib/updater-beforeunload'
import {
createShutdownCheckpointPersist,
type ShutdownCheckpointPersistDeps
} from './shutdown-checkpoint-persist'
type LifecycleHarness = {
cleanup: () => void
prepare: () => Promise<void>
stageBeforeUnloadSync: ReturnType<typeof vi.fn>
}
type LifecycleHarnessOverrides = Partial<
Pick<ShutdownCheckpointPersistDeps, 'buildSessionSnapshots' | 'hasDirtyOpenFiles'>
>
function createLifecycleHarness(
startedEventName: string,
abortedEventName: string,
overrides: LifecycleHarnessOverrides = {}
): LifecycleHarness {
const stageBeforeUnloadSync = vi.fn((args: { sessions: unknown[] }) => {
if (args.sessions.length > 0) {
throw new Error('deterministic full-stage failure')
}
})
const persist = createShutdownCheckpointPersist({
shouldCaptureSession: () => true,
captureTerminalBuffers: vi.fn(),
captureSleepingAgentSessions: vi.fn(),
buildSessionSnapshots: () => [{ state: { activeTabId: 't1' } }] as never,
buildUiPatch: () => ({ activeView: 'workspace' }) as never,
hasDirtyOpenFiles: () => false,
isDegradableShutdownInProgress: isIntentionalAppRestartInProgress,
stageBeforeUnloadSync,
...overrides
})
const guard = createShutdownCheckpointGuard(persist.run, persist.abandonAttempt)
const checkpoint = createShutdownCheckpointBeforeUnloadHandler(guard)
const cleanupRestartTracking = registerUpdaterBeforeUnloadBypass()
window.addEventListener('beforeunload', checkpoint)
window.addEventListener(
ORCA_RENDERER_SHUTDOWN_CHECKPOINT_ABORTED_EVENT,
guard.abortAfterCheckpointFailure
)
window.addEventListener(abortedEventName, guard.abandonAttempt)
window.addEventListener(ORCA_RENDERER_UNLOAD_PREVENTED_EVENT, guard.abandonAttempt)
return {
stageBeforeUnloadSync,
prepare: () =>
prepareRendererForAppRestart(window, {
startedEventName,
abortedEventName,
awaitCheckpoint: () => Promise.resolve()
}),
cleanup: () => {
cleanupRestartTracking()
window.removeEventListener('beforeunload', checkpoint)
window.removeEventListener(
ORCA_RENDERER_SHUTDOWN_CHECKPOINT_ABORTED_EVENT,
guard.abortAfterCheckpointFailure
)
window.removeEventListener(abortedEventName, guard.abandonAttempt)
window.removeEventListener(ORCA_RENDERER_UNLOAD_PREVENTED_EVENT, guard.abandonAttempt)
}
}
}
describe('shutdown checkpoint restart lifecycle', () => {
const cleanupFns: (() => void)[] = []
afterEach(() => {
cleanupFns.splice(0).forEach((cleanup) => cleanup())
vi.restoreAllMocks()
})
it.each([
{
lifecycle: 'app restart',
startedEventName: ORCA_APP_RESTART_STARTED_EVENT,
abortedEventName: ORCA_APP_RESTART_ABORTED_EVENT
},
{
lifecycle: 'updater install',
startedEventName: ORCA_UPDATER_QUIT_AND_INSTALL_STARTED_EVENT,
abortedEventName: ORCA_UPDATER_QUIT_AND_INSTALL_ABORTED_EVENT
}
])(
'preserves retry-then-degrade across a checkpoint-caused $lifecycle abort',
async ({ startedEventName, abortedEventName }) => {
vi.spyOn(console, 'error').mockImplementation(() => {})
const harness = createLifecycleHarness(startedEventName, abortedEventName)
cleanupFns.push(harness.cleanup)
await expect(harness.prepare()).rejects.toThrow('deterministic full-stage failure')
expect(isIntentionalAppRestartInProgress()).toBe(false)
await expect(harness.prepare()).resolves.toBeUndefined()
expect(harness.stageBeforeUnloadSync).toHaveBeenCalledTimes(3)
expect(harness.stageBeforeUnloadSync).toHaveBeenLastCalledWith({
sessions: [],
ui: { activeView: 'workspace' }
})
}
)
it('abandons retry state when a later restart attempt is independently canceled', async () => {
vi.spyOn(console, 'error').mockImplementation(() => {})
const harness = createLifecycleHarness(
ORCA_APP_RESTART_STARTED_EVENT,
ORCA_APP_RESTART_ABORTED_EVENT
)
cleanupFns.push(harness.cleanup)
await expect(harness.prepare()).rejects.toThrow('deterministic full-stage failure')
window.dispatchEvent(new Event(ORCA_APP_RESTART_STARTED_EVENT))
window.dispatchEvent(new Event(ORCA_APP_RESTART_ABORTED_EVENT))
await expect(harness.prepare()).rejects.toThrow('deterministic full-stage failure')
expect(harness.stageBeforeUnloadSync).toHaveBeenCalledTimes(2)
})
})
@@ -1,6 +1,6 @@
import { toast } from 'sonner'
import { translate } from '@/i18n/i18n'
import { consumeShutdownCheckpointFailureReason } from '../../../shared/renderer-shutdown-events'
import { consumeShutdownCheckpointFailureReason } from '../../../../shared/renderer-shutdown-events'
export function showShutdownCheckpointFailureToast(
canceledAction: 'quit' | 'reload' = 'quit'
@@ -4,8 +4,8 @@ import {
ORCA_RENDERER_SHUTDOWN_CHECKPOINT_FAILED_EVENT,
ORCA_RENDERER_UNLOAD_PREVENTED_EVENT,
publishShutdownCheckpointFailureReason
} from '../../../shared/renderer-shutdown-events'
import { recordRendererCrashBreadcrumb } from './crash-breadcrumb-recorder'
} from '../../../../shared/renderer-shutdown-events'
import { recordRendererCrashBreadcrumb } from '../../diagnostics/crash-reporting/crash-breadcrumb-recorder'
export type ShutdownCheckpointGuard = {
persistOnce: () => boolean
@@ -1,5 +1,5 @@
import type { PersistedUIState } from '../../../shared/persisted-ui-state-types'
import type { TopLevelView } from '../../../shared/ui-chrome-types'
import type { PersistedUIState } from '../../../../shared/persisted-ui-state-types'
import type { TopLevelView } from '../../../../shared/ui-chrome-types'
type ActiveViewUnloadState = {
activeView: TopLevelView
@@ -1,4 +1,4 @@
import { createE2EConfig } from '../../../shared/e2e-config'
import { createE2EConfig } from '../../../../shared/e2e-config'
const rendererE2EExposeStore = String(import.meta.env.VITE_EXPOSE_STORE) === 'true'
// The paired API installs after module initialization; read the build-gated test URL before caching configuration.
@@ -1,9 +1,9 @@
import { prepareRendererForAppRestart } from '../../../shared/renderer-restart-preparation'
import { ORCA_RENDERER_UNLOAD_PREVENTED_EVENT } from '../../../shared/renderer-shutdown-events'
import { prepareRendererForAppRestart } from '../../../../shared/renderer-restart-preparation'
import { ORCA_RENDERER_UNLOAD_PREVENTED_EVENT } from '../../../../shared/renderer-shutdown-events'
import {
ORCA_APP_RESTART_ABORTED_EVENT,
ORCA_APP_RESTART_STARTED_EVENT
} from '../../../shared/updater-renderer-events'
} from '../../../../shared/updater-renderer-events'
// Bare reloads are vetoed by dirty tabs; restart preparation backs them up first.
@@ -5,8 +5,8 @@ import {
DEFAULT_SHOW_SLEEPING_WORKSPACES,
DEFAULT_STATUS_BAR_ITEMS,
DEFAULT_WORKTREE_CARD_PROPERTIES
} from '../../../shared/constants'
import type { PersistedUIState } from '../../../shared/persisted-ui-state-types'
} from '../../../../shared/constants'
import type { PersistedUIState } from '../../../../shared/persisted-ui-state-types'
export function hydratePersistedUIAfterStartupRead({
persistedUI,
@@ -1,5 +1,5 @@
import type { UpdateCheckOptions } from '../../../shared/update-status-types'
import { getShortcutPlatform } from './keyboard/shortcut-platform'
import type { UpdateCheckOptions } from '../../../../shared/update-status-types'
import { getShortcutPlatform } from '../../lib/keyboard/shortcut-platform'
type UpdateCheckClickEvent = Pick<MouseEvent, 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'>
@@ -3,15 +3,11 @@ import {
ORCA_APP_RESTART_STARTED_EVENT,
ORCA_UPDATER_QUIT_AND_INSTALL_ABORTED_EVENT,
ORCA_UPDATER_QUIT_AND_INSTALL_STARTED_EVENT
} from '../../../shared/updater-renderer-events'
import { ORCA_RENDERER_SHUTDOWN_CHECKPOINT_ABORTED_EVENT } from '../../../shared/renderer-shutdown-events'
} from '../../../../shared/updater-renderer-events'
import { ORCA_RENDERER_SHUTDOWN_CHECKPOINT_ABORTED_EVENT } from '../../../../shared/renderer-shutdown-events'
let intentionalAppRestartInProgress = false
export function isUpdaterQuitAndInstallInProgress(): boolean {
return isIntentionalAppRestartInProgress()
}
export function isIntentionalAppRestartInProgress(): boolean {
return intentionalAppRestartInProgress
}
@@ -1,99 +1,163 @@
import { translate } from '@/i18n/i18n'
import type { LinuxPackageCommandUnavailableReason } from '../../../shared/update-status-types'
import type { LinuxPackageCommandUnavailableReason } from '../../../../shared/update-status-types'
import {
UPDATER_FAILURE_COPY as EN,
UPDATER_FAILURE_COPY,
type UpdaterFailureCode
} from '../../../shared/updater-failure-copy'
} from '../../../../shared/updater-failure-copy'
type Param = (name: string) => string | null
type CountParam = (name: string) => number | null
// null = required params missing; caller shows the host's English message.
const COPY: Record<UpdaterFailureCode, (param: Param, count: CountParam) => string | null> = {
releaseNotReady: () => translate('updates.failure.releaseNotReady', EN.releaseNotReady),
releaseNotReady: () =>
translate('updates.failure.releaseNotReady', UPDATER_FAILURE_COPY.releaseNotReady),
updateServerUnreachable: () =>
translate('updates.failure.updateServerUnreachable', EN.updateServerUnreachable),
translate(
'updates.failure.updateServerUnreachable',
UPDATER_FAILURE_COPY.updateServerUnreachable
),
channelUnsupportedPlatform: (param) => {
const channel = param('channel')
return channel === null
? null
: translate('updates.failure.channelUnsupportedPlatform', EN.channelUnsupportedPlatform, {
channel
})
: translate(
'updates.failure.channelUnsupportedPlatform',
UPDATER_FAILURE_COPY.channelUnsupportedPlatform,
{
channel
}
)
},
unsignedDevChannel: (param) => {
const channel = param('channel')
return channel === null
? null
: translate('updates.failure.unsignedDevChannel', EN.unsignedDevChannel, { channel })
: translate('updates.failure.unsignedDevChannel', UPDATER_FAILURE_COPY.unsignedDevChannel, {
channel
})
},
linuxPackageMissing: () =>
translate('updates.failure.linuxPackageMissing', EN.linuxPackageMissing),
translate('updates.failure.linuxPackageMissing', UPDATER_FAILURE_COPY.linuxPackageMissing),
linuxPackageNotRegular: () =>
translate('updates.failure.linuxPackageNotRegular', EN.linuxPackageNotRegular),
translate(
'updates.failure.linuxPackageNotRegular',
UPDATER_FAILURE_COPY.linuxPackageNotRegular
),
linuxPackageHashMismatch: () =>
translate('updates.failure.linuxPackageHashMismatch', EN.linuxPackageHashMismatch),
translate(
'updates.failure.linuxPackageHashMismatch',
UPDATER_FAILURE_COPY.linuxPackageHashMismatch
),
linuxPackageReadFailed: () =>
translate('updates.failure.linuxPackageReadFailed', EN.linuxPackageReadFailed),
linuxPackageNoSudo: () => translate('updates.failure.linuxPackageNoSudo', EN.linuxPackageNoSudo),
translate(
'updates.failure.linuxPackageReadFailed',
UPDATER_FAILURE_COPY.linuxPackageReadFailed
),
linuxPackageNoSudo: () =>
translate('updates.failure.linuxPackageNoSudo', UPDATER_FAILURE_COPY.linuxPackageNoSudo),
linuxPackageNoPackageManager: () =>
translate('updates.failure.linuxPackageNoPackageManager', EN.linuxPackageNoPackageManager),
translate(
'updates.failure.linuxPackageNoPackageManager',
UPDATER_FAILURE_COPY.linuxPackageNoPackageManager
),
linuxPackageInvalidPath: () =>
translate('updates.failure.linuxPackageInvalidPath', EN.linuxPackageInvalidPath),
translate(
'updates.failure.linuxPackageInvalidPath',
UPDATER_FAILURE_COPY.linuxPackageInvalidPath
),
linuxPackageMarkerUnusable: () =>
translate('updates.failure.linuxPackageMarkerUnusable', EN.linuxPackageMarkerUnusable),
translate(
'updates.failure.linuxPackageMarkerUnusable',
UPDATER_FAILURE_COPY.linuxPackageMarkerUnusable
),
linuxPackageExternallyManaged: () =>
translate('updates.failure.linuxPackageExternallyManaged', EN.linuxPackageExternallyManaged),
translate(
'updates.failure.linuxPackageExternallyManaged',
UPDATER_FAILURE_COPY.linuxPackageExternallyManaged
),
linuxPackageManualInstall: () =>
translate('updates.failure.linuxPackageManualInstall', EN.linuxPackageManualInstall),
translate(
'updates.failure.linuxPackageManualInstall',
UPDATER_FAILURE_COPY.linuxPackageManualInstall
),
linuxPackageMetadataUnusable: () =>
translate('updates.failure.linuxPackageMetadataUnusable', EN.linuxPackageMetadataUnusable),
translate(
'updates.failure.linuxPackageMetadataUnusable',
UPDATER_FAILURE_COPY.linuxPackageMetadataUnusable
),
unknownReleaseChannel: (param) => {
const channel = param('channel')
return channel === null
? null
: translate('updates.failure.unknownReleaseChannel', EN.unknownReleaseChannel, { channel })
: translate(
'updates.failure.unknownReleaseChannel',
UPDATER_FAILURE_COPY.unknownReleaseChannel,
{ channel }
)
},
invalidReleaseTag: (param) => {
const tag = param('tag')
return tag === null
? null
: translate('updates.failure.invalidReleaseTag', EN.invalidReleaseTag, { tag })
: translate('updates.failure.invalidReleaseTag', UPDATER_FAILURE_COPY.invalidReleaseTag, {
tag
})
},
releaseRepoNotFound: (param) => {
const repo = param('repo')
return repo === null
? null
: translate('updates.failure.releaseRepoNotFound', EN.releaseRepoNotFound, { repo })
: translate('updates.failure.releaseRepoNotFound', UPDATER_FAILURE_COPY.releaseRepoNotFound, {
repo
})
},
releaseListFailed: (param, count) => {
const channel = param('channel')
const status = count('status')
return channel === null || status === null
? null
: translate('updates.failure.releaseListFailed', EN.releaseListFailed, { channel, status })
: translate('updates.failure.releaseListFailed', UPDATER_FAILURE_COPY.releaseListFailed, {
channel,
status
})
},
releaseListUnreadable: (param) => {
const channel = param('channel')
return channel === null
? null
: translate('updates.failure.releaseListUnreadable', EN.releaseListUnreadable, { channel })
: translate(
'updates.failure.releaseListUnreadable',
UPDATER_FAILURE_COPY.releaseListUnreadable,
{ channel }
)
},
rateLimitedSoon: () => translate('updates.failure.rateLimitedSoon', EN.rateLimitedSoon),
rateLimitedSoon: () =>
translate('updates.failure.rateLimitedSoon', UPDATER_FAILURE_COPY.rateLimitedSoon),
rateLimitedSoonSignedOut: () =>
translate('updates.failure.rateLimitedSoonSignedOut', EN.rateLimitedSoonSignedOut),
translate(
'updates.failure.rateLimitedSoonSignedOut',
UPDATER_FAILURE_COPY.rateLimitedSoonSignedOut
),
rateLimitedInMinute: () =>
translate('updates.failure.rateLimitedInMinute', EN.rateLimitedInMinute),
translate('updates.failure.rateLimitedInMinute', UPDATER_FAILURE_COPY.rateLimitedInMinute),
rateLimitedInMinuteSignedOut: () =>
translate('updates.failure.rateLimitedInMinuteSignedOut', EN.rateLimitedInMinuteSignedOut),
translate(
'updates.failure.rateLimitedInMinuteSignedOut',
UPDATER_FAILURE_COPY.rateLimitedInMinuteSignedOut
),
rateLimitedInMinutes: (_param, count) => {
const minutes = count('count')
return minutes === null
? null
: translate('updates.failure.rateLimitedInMinutes', EN.rateLimitedInMinutes, {
count: minutes,
defaultValue_one: 'GitHub rate limit reached. Try again in about {{count}} minute.'
})
: translate(
'updates.failure.rateLimitedInMinutes',
UPDATER_FAILURE_COPY.rateLimitedInMinutes,
{
count: minutes,
defaultValue_one: 'GitHub rate limit reached. Try again in about {{count}} minute.'
}
)
},
rateLimitedInMinutesSignedOut: (_param, count) => {
const minutes = count('count')
@@ -101,7 +165,7 @@ const COPY: Record<UpdaterFailureCode, (param: Param, count: CountParam) => stri
? null
: translate(
'updates.failure.rateLimitedInMinutesSignedOut',
EN.rateLimitedInMinutesSignedOut,
UPDATER_FAILURE_COPY.rateLimitedInMinutesSignedOut,
{
count: minutes,
defaultValue_one:
@@ -1,12 +1,12 @@
import { useEffect } from 'react'
import { useAppStore } from '../store'
import { useAppStore } from '../store/index'
import { ORCA_LAYOUT_OWNER_IS_MAIN } from '../../../shared/layout-owner-switch'
import { createSessionWriteSubscriber } from '../lib/workspace/persistence/session-write-subscriber'
import { buildActiveViewUnloadPatch } from '../lib/active-view-persist'
import { buildActiveViewUnloadPatch } from './startup/active-view-persist'
import {
isIntentionalAppRestartInProgress,
registerUpdaterBeforeUnloadBypass
} from '../lib/updater-beforeunload'
} from './updates/updater-beforeunload'
import {
buildWorkspaceSessionPayload,
shouldPersistWorkspaceSession
@@ -18,8 +18,8 @@ import {
import {
createShutdownCheckpointBeforeUnloadHandler,
createShutdownCheckpointGuard
} from '../lib/shutdown-checkpoint-guard'
import { showShutdownCheckpointFailureToast } from '../lib/shutdown-checkpoint-failure-toast'
} from './shutdown/shutdown-checkpoint-guard'
import { showShutdownCheckpointFailureToast } from './shutdown/shutdown-checkpoint-failure-toast'
import { isPairedWebClientWindow } from '../lib/desktop-window-chrome'
import { createShutdownCheckpointPersist } from './shutdown-checkpoint-persist'
import { shutdownBufferCaptures } from '../components/terminal-pane/snapshots/shutdown-buffer-captures'
@@ -3,7 +3,7 @@ import { useEffect, useRef } from 'react'
import { restoreLocalStructuredChatsAtStartup } from '@/runtime/native-chat/local-sessions/local-structured-chats'
import { syncZoomCSSVar } from '@/lib/ui-zoom'
import { installCodexDetachedPaneRestartExecutor } from '@/components/terminal-pane/account-restart/detached/codex-detached-pane-restart-scheduler'
import { useAppStore } from '../store'
import { useAppStore } from '../store/index'
import { reconcileHydratedWorkspaceTabModels } from './reconcile-hydrated-workspace-tab-models'
import { useStartupActions } from './use-app-startup-actions'
import { waitForNativeChatDraftsAtStartup } from './native-chat-draft-startup'
@@ -14,7 +14,7 @@ import {
collectFolderWorkspaceKeysFromSession,
collectWorktreeHydrationRepoIdsFromSession
} from '../lib/workspace/persistence/workspace-session-hydration-keys'
import { hydratePersistedUIAfterStartupRead } from '../lib/startup-ui-hydration'
import { hydratePersistedUIAfterStartupRead } from './startup/startup-ui-hydration'
import {
logRendererStartupDiagnostic,
timeRendererStartupStep,
@@ -13,8 +13,8 @@ import {
trackCmdJPaletteFeatureTipShown,
trackOrcaCliFeatureTipShown
} from '../components/feature-tips/feature-tip-telemetry'
import { useAppStore } from '../store'
import { isWebClientLocation } from '../lib/web-client-location'
import { useAppStore } from '../store/index'
import { isWebClientLocation } from './platform/web-client-location'
import type { OnboardingState } from '../../../shared/onboarding-state-types'
export type OnboardingGate = ReturnType<typeof useOnboardingAndFeatureTips>
@@ -1,54 +0,0 @@
// @vitest-environment happy-dom
import { cleanup, renderHook } from '@testing-library/react'
import { afterEach, expect, it, vi } from 'vitest'
import { useVisibleHostedReviewRefresh } from './use-visible-hosted-review-refresh'
const mocks = vi.hoisted(() => ({
refresh: vi.fn(async () => true),
getState: vi.fn(() => ({})),
subscribe: vi.fn(() => vi.fn()),
web: vi.fn(() => false)
}))
vi.mock('@/store', () => ({
useAppStore: { getState: mocks.getState, subscribe: mocks.subscribe }
}))
vi.mock('@/lib/web-client-location', () => ({ isWebClientLocation: mocks.web }))
vi.mock('@/store/slices/hosted-review/refresh/visible-hosted-review-refresh-targets', () => ({
visibleHostedReviewRefreshInputsChanged: () => true,
getVisibleHostedReviewWorkspaces: () => [],
getVisibleHostedReviewRefreshTargets: () => [
{
key: 'review',
revision: 'head',
selected: true,
intervalMs: 60_000,
fetchedAt: null,
refresh: mocks.refresh
}
]
}))
afterEach(() => {
cleanup()
vi.useRealTimers()
vi.restoreAllMocks()
})
it('waits for workspace readiness and stops timers/subscription when disabled', async () => {
vi.useFakeTimers()
vi.spyOn(document, 'visibilityState', 'get').mockReturnValue('visible')
const hook = renderHook(({ enabled }) => useVisibleHostedReviewRefresh({ enabled }), {
initialProps: { enabled: false }
})
await vi.advanceTimersByTimeAsync(600_000)
expect(mocks.refresh).not.toHaveBeenCalled()
expect(mocks.subscribe).not.toHaveBeenCalled()
hook.rerender({ enabled: true })
await vi.advanceTimersByTimeAsync(0)
expect(mocks.refresh).toHaveBeenCalledOnce()
const unsubscribe = mocks.subscribe.mock.results[0].value
hook.rerender({ enabled: false })
expect(unsubscribe).toHaveBeenCalledOnce()
expect(vi.getTimerCount()).toBe(0)
await vi.advanceTimersByTimeAsync(600_000)
expect(mocks.refresh).toHaveBeenCalledOnce()
})
@@ -1,7 +1,7 @@
import { useEffect } from 'react'
import { useAppStore } from '@/store'
import { isWindowVisible } from '@/lib/window-visibility-interval'
import { isWebClientLocation } from '@/lib/web-client-location'
import { useAppStore } from '@/store/index'
import { isWindowVisible } from '@/lib/window-activity/window-visibility-interval'
import { isWebClientLocation } from '@/app-shell/platform/web-client-location'
import { createVisibleHostedReviewRefreshScheduler } from '@/store/slices/hosted-review/refresh/visible-hosted-review-refresh-scheduler'
import { getWorkspaceReferenceRefreshTargets } from '@/components/sidebar/workspace-card/review/workspace-reference-refresh-targets'
import {
@@ -1,6 +1,6 @@
import { useEffect } from 'react'
import { scheduleAfterInputQuiet } from '@/lib/input-quiet-scheduler'
import { lazyWithPreload } from '@/lib/lazy-with-retry'
import { scheduleAfterInputQuiet } from '@/lib/window-activity/input-quiet-scheduler'
import { lazyWithPreload } from '@/app-shell/startup/lazy-with-retry'
export const WorktreeJumpPalette = lazyWithPreload(
() => import('../components/worktree-jump/WorktreeJumpPalette')
@@ -1,4 +1,4 @@
import { recordRendererCrashBreadcrumb } from '@/lib/crash-breadcrumb-recorder'
import { recordRendererCrashBreadcrumb } from '@/diagnostics/crash-reporting/crash-breadcrumb-recorder'
/** Why a finished agent turn did not mark its workspace unread. */
export type AgentFinishDropCause =
@@ -1,5 +1,5 @@
import React from 'react'
import { cn } from '@/lib/utils'
import { cn } from '@/lib/class-names'
export type AgentProgressRingTone = 'working' | 'attention'
@@ -1,6 +1,6 @@
import React from 'react'
import { MessageCircleQuestion } from 'lucide-react'
import { cn } from '@/lib/utils'
import { cn } from '@/lib/class-names'
// Share the question glyph and --agent-question token across sidebar, tabs, dashboard and kanban; callers choose size.
@@ -1,6 +1,6 @@
import React from 'react'
import { Activity, CircleCheck, CircleDashed } from 'lucide-react'
import { cn } from '@/lib/utils'
import { cn } from '@/lib/class-names'
import { translate } from '@/i18n/i18n'
import { useUiLanguageRevision } from '@/i18n/use-ui-language-revision'
import { AgentQuestionIcon } from '@/components/AgentQuestionIcon'
@@ -1,6 +1,6 @@
import React from 'react'
import { cn } from '@/lib/utils'
import { observeOffscreenAnimation } from '@/lib/offscreen-animation-pause'
import { cn } from '@/lib/class-names'
import { observeOffscreenAnimation } from '@/lib/window-activity/offscreen-animation-pause'
const SPINNER_ANIMATION_NAME = 'agent-spinner-rotate'
@@ -1,7 +1,7 @@
import { useEffect } from 'react'
import { startAiVaultTabTitleSync } from '@/lib/agent-session/history/title-sync/ai-vault-tab-title-sync'
import { scheduleAfterInputQuiet } from '@/lib/input-quiet-scheduler'
import { useAppStore } from '@/store'
import { scheduleAfterInputQuiet } from '@/lib/window-activity/input-quiet-scheduler'
import { useAppStore } from '@/store/index'
const TITLE_SYNC_DELAY_MS = 1_000
const TITLE_SYNC_QUIET_MS = 1_500
@@ -2,7 +2,7 @@ import React from 'react'
import { GitCommitHorizontal } from 'lucide-react'
import { Badge } from '@/components/ui/badge'
import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'
import { cn } from '@/lib/utils'
import { cn } from '@/lib/class-names'
import type { WorktreeGitIdentityDisplay } from '../../../shared/worktree/git-identity-display'
type DetachedHeadDisplay = Extract<WorktreeGitIdentityDisplay, { kind: 'detached' }>
@@ -4,7 +4,11 @@ import { useState } from 'react'
import { X } from 'lucide-react'
import { Button } from './ui/button'
import { acknowledgeBanner, PRIVACY_URL, setOptIn as telemetrySetOptIn } from '../lib/telemetry'
import {
acknowledgeBanner,
PRIVACY_URL,
setOptIn as telemetrySetOptIn
} from '../diagnostics/telemetry/telemetry'
import { useMountedRef } from '@/hooks/useMountedRef'
import { useTranslate } from '@/i18n/use-translate'
import { openAppHttpLink } from '@/lib/browser/navigation/app-http-link-open'
+2 -2
View File
@@ -1,7 +1,7 @@
import { useEffect, useEffectEvent, useMemo, useRef, useState } from 'react'
import { AlertTriangle, ExternalLink, FolderPlus, GitBranchPlus, Star, X } from 'lucide-react'
import { cn } from '../lib/utils'
import { useAppStore } from '../store'
import { cn } from '../lib/class-names'
import { useAppStore } from '../store/index'
import { isGitRepoKind } from '../../../shared/repo-kind'
import type { Repo } from '../../../shared/repo-types'
import {
@@ -14,11 +14,11 @@ import {
} from '@/components/editor/rich-markdown/document/rich-markdown-source-transport'
import { LinearIssueMarkdownToolbar } from '@/components/LinearIssueMarkdownToolbar'
import { RichMarkdownTableControls } from '@/components/editor/rich-markdown/tables/RichMarkdownTableControls'
import { isScreenSubmitShortcut } from '@/lib/screen-submit-shortcut'
import { cn } from '@/lib/utils'
import { isScreenSubmitShortcut } from '@/lib/keyboard/screen-submit-shortcut'
import { cn } from '@/lib/class-names'
import { translate } from '@/i18n/i18n'
import { useTranslate } from '@/i18n/use-translate'
import { useAppStore } from '@/store'
import { useAppStore } from '@/store/index'
import {
getRichMarkdownSpellcheckAttribute,
useRichMarkdownSpellcheckAttribute
@@ -17,7 +17,7 @@ import {
} from 'lucide-react'
import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'
import { cn } from '@/lib/utils'
import { cn } from '@/lib/class-names'
import { translate } from '@/i18n/i18n'
import { useTranslate } from '@/i18n/use-translate'
@@ -7,9 +7,12 @@ import { toast } from 'sonner'
import { LinearIssueMarkdownDescriptionEditor } from '@/components/LinearIssueMarkdownDescriptionEditor'
import { useMountedRef } from '@/hooks/useMountedRef'
import { cn } from '@/lib/utils'
import { useAppStore } from '@/store'
import { getScreenSubmitShortcutLabel, isScreenSubmitShortcut } from '@/lib/screen-submit-shortcut'
import { cn } from '@/lib/class-names'
import { useAppStore } from '@/store/index'
import {
getScreenSubmitShortcutLabel,
isScreenSubmitShortcut
} from '@/lib/keyboard/screen-submit-shortcut'
import { linearUpdateIssue } from '@/runtime/linear/runtime-linear-issue-client'
import type { LinearIssue } from '../../../shared/linear/issue-types'
import type { TaskSourceContext } from '../../../shared/work-items/task-source-context'
@@ -7,7 +7,7 @@ import type {
import { UpdateErrorCardContent } from './UpdateErrorCardContent'
import { translate } from '@/i18n/i18n'
import { useTranslate } from '@/i18n/use-translate'
import { linuxPackageCommandUnavailableText } from '@/lib/updater-message-copy'
import { linuxPackageCommandUnavailableText } from '@/app-shell/updates/updater-message-copy'
import { useMountedRef } from '@/hooks/useMountedRef'
function copiedNote(packageFileName: string): string {
@@ -1,6 +1,6 @@
import React from 'react'
import { Hourglass, Loader2 } from 'lucide-react'
import { cn } from '@/lib/utils'
import { cn } from '@/lib/class-names'
// Reduced motion uses an hourglass rather than a stuck spinner. Hide it only when motion is allowed; hidden plus motion-reduce:block left it hidden.
export function LoadingSpinner({ className }: { className?: string }): React.JSX.Element {
@@ -1,17 +1,17 @@
import React from 'react'
import { useTranslation } from 'react-i18next'
import { toast } from 'sonner'
import { useAppStore } from '@/store'
import { cn } from '@/lib/utils'
import { useAppStore } from '@/store/index'
import { cn } from '@/lib/class-names'
import { getAgentCatalog } from '@/lib/agent-catalog/agent-catalog'
import { getScreenSubmitModifierLabel } from '@/lib/screen-submit-shortcut'
import { getScreenSubmitModifierLabel } from '@/lib/keyboard/screen-submit-shortcut'
import { resolveProjectCloneUrlPrefill } from '@/lib/workspace/creation/project-clone-url-prefill'
import { useContextualTour } from '@/components/contextual-tours/use-contextual-tour'
import {
AddRemoteHostDialog,
type AddRemoteHostMode
} from '@/components/sidebar/host-admission/ssh/AddRemoteHostDialog'
import { lazyWithRetry } from '@/lib/lazy-with-retry'
import { lazyWithRetry } from '@/app-shell/startup/lazy-with-retry'
import type * as SetProjectLocationDialogModule from '@/components/new-workspace/SetProjectLocationDialog'
import { unwrapRuntimeRpcResult } from '@/runtime/rpc/calls/runtime-rpc-result'
import { withUiConnectTimeout } from '@/ssh/ssh-connect-ui-timeout'
@@ -13,7 +13,7 @@ import { agentChoicePending } from '@/lib/agent-session/launch/inventory/host-ch
import type { AgentLaunchSurface } from '@/lib/agent-session/launch/routing/agent-session-launch-plan'
import React, { Suspense, useCallback, useEffect, useMemo, useRef, useState } from 'react'
import { useAppStore } from '@/store/index'
import { lazyWithRetry } from '@/lib/lazy-with-retry'
import { lazyWithRetry } from '@/app-shell/startup/lazy-with-retry'
import {
Dialog,
DialogContent,
@@ -35,7 +35,7 @@ import {
} from '@/lib/workspace/creation/quick-workspace-agent-selection'
import { useAgentsOfferedForLaunch } from '@/lib/agent-session/launch/inventory/host-chat-program-acquisition'
import { shouldAllowComposerEnterSubmitTarget } from '@/lib/workspace/creation/new-workspace-enter-guard'
import { isScreenSubmitShortcut } from '@/lib/screen-submit-shortcut'
import { isScreenSubmitShortcut } from '@/lib/keyboard/screen-submit-shortcut'
import type { TuiAgent } from '../../../shared/agent-launch/catalog/tui-agent'
import { translate } from '@/i18n/i18n'
import { useTranslate } from '@/i18n/use-translate'
@@ -3,8 +3,8 @@ import { toast } from 'sonner'
import { Button } from './ui/button'
import { translate } from '@/i18n/i18n'
import { useTranslate } from '@/i18n/use-translate'
import { cn } from '@/lib/utils'
import { useAppStore } from '../store'
import { cn } from '@/lib/class-names'
import { useAppStore } from '../store/index'
async function copySignInLink(link: string): Promise<void> {
try {
@@ -1,5 +1,5 @@
import React from 'react'
import { cn } from '@/lib/utils'
import { cn } from '@/lib/class-names'
import { useTranslate } from '@/i18n/use-translate'
function KeyCap({
@@ -1,5 +1,5 @@
import { Suspense } from 'react'
import { lazyWithRetry as lazy } from '@/lib/lazy-with-retry'
import { lazyWithRetry as lazy } from '@/app-shell/startup/lazy-with-retry'
import { useTranslate } from '@/i18n/use-translate'
import type { TerminalController } from './use-terminal-controller'
@@ -1,8 +1,8 @@
import { useEffect, useState } from 'react'
import { BookOpen, ChevronDown, CircleUserRound, Files, Smartphone, X } from 'lucide-react'
import { useAppStore } from '../store'
import { useAppStore } from '../store/index'
import { useTranslate } from '@/i18n/use-translate'
import { cn } from '@/lib/utils'
import { cn } from '@/lib/class-names'
import { Button } from './ui/button'
import { Card } from './ui/card'
import { Collapsible, CollapsibleContent, CollapsibleTrigger } from './ui/collapsible'
+2 -2
View File
@@ -2,11 +2,11 @@ import { useCallback, useEffect, useRef, useState } from 'react'
import { X } from 'lucide-react'
import type { ChangelogData } from '../../../shared/update-status-types'
import { usePrefersReducedMotion } from '@/hooks/usePrefersReducedMotion'
import { useAppStore } from '../store'
import { useAppStore } from '../store/index'
import { Card } from './ui/card'
import { Button } from './ui/button'
import { useTranslate } from '@/i18n/use-translate'
import { updaterMessageText } from '@/lib/updater-message-copy'
import { updaterMessageText } from '@/app-shell/updates/updater-message-copy'
import { UpdateCardStateContent } from './maintenance/update-card/UpdateCardStateContent'
import { buildUpdateCardErrorModel } from './maintenance/update-card/update-card-error-model'
import {
@@ -10,10 +10,10 @@ import {
} from '@/components/ui/context-menu'
import { translate } from '@/i18n/i18n'
import { useTranslate, type Translate } from '@/i18n/use-translate'
import { CLOSE_ALL_CONTEXT_MENUS_EVENT } from '@/lib/close-all-context-menus'
import { CLOSE_ALL_CONTEXT_MENUS_EVENT } from '@/lib/overlay-interaction/close-all-context-menus'
import { formatClipboardFilePath } from '@/lib/clipboard/clipboard-file-path'
import { getWorktreeRowLocalPathOpenOwner } from '@/lib/workspace/ownership/worktree-row-open-in-owner'
import { useAppStore } from '@/store'
import { useAppStore } from '@/store/index'
import {
clearActivityThread,
clearCompletedActivity,
@@ -3,7 +3,7 @@ import { ChevronDown } from 'lucide-react'
import { AgentStateDot } from '@/components/AgentStateDot'
import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'
import { useNow } from '@/hooks/use-now'
import { cn } from '@/lib/utils'
import { cn } from '@/lib/class-names'
import { formatShortTimeAgo } from '@/lib/short-time-ago'
import { RepoBadgeMark } from '@/components/repo/RepoBadgeLabel'
import type { Repo } from '../../../../shared/repo-types'
@@ -1,7 +1,7 @@
import React from 'react'
import { MessageSquareText, TerminalSquare } from 'lucide-react'
import { AgentTypeIcon } from '@/components/agent/icons/agent-type-icon'
import { cn } from '@/lib/utils'
import { cn } from '@/lib/class-names'
import { useTranslate } from '@/i18n/use-translate'
import { EventRepoBadge, ThreadAgentStateIndicator } from './activity-thread-controls'
import type { ActivityTerminalPortalSlotId, AgentPaneThread } from './activity-thread-types'
@@ -1,7 +1,7 @@
import React, { useCallback, useMemo } from 'react'
import { Cloud, Copy, FolderGit2, GitBranch, Laptop, LocateFixed, Server } from 'lucide-react'
import { toast } from 'sonner'
import { useAppStore } from '@/store'
import { useAppStore } from '@/store/index'
import { RepoBadgeMark } from '@/components/repo/RepoBadgeLabel'
import { AgentTypeIcon } from '@/components/agent/icons/agent-type-icon'
import { formatAgentTypeLabel } from '../../../../shared/agent-status/presentation/agent-type-label'
@@ -11,7 +11,7 @@ import { translate } from '@/i18n/i18n'
import { useTranslate } from '@/i18n/use-translate'
import { formatClipboardFilePath } from '@/lib/clipboard/clipboard-file-path'
import { getWorktreeRowLocalPathOpenOwner } from '@/lib/workspace/ownership/worktree-row-open-in-owner'
import { cn } from '@/lib/utils'
import { cn } from '@/lib/class-names'
import {
getExecutionHostLabel,
getWorktreeExecutionHostId,
@@ -6,7 +6,7 @@ import {
useVirtualizer,
type Range
} from '@tanstack/react-virtual'
import { cn } from '@/lib/utils'
import { cn } from '@/lib/class-names'
import { useTranslate } from '@/i18n/use-translate'
import { ActivityThreadListToolbar } from './activity-thread-list-toolbar'
import {
@@ -1,5 +1,5 @@
import type React from 'react'
import { cn } from '@/lib/utils'
import { cn } from '@/lib/class-names'
import { useTranslate } from '@/i18n/use-translate'
export function ActivityThreadListResizeHandle({
@@ -11,7 +11,7 @@ import {
} from '@/components/ui/select'
import { Toggle } from '@/components/ui/toggle'
import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'
import { cn } from '@/lib/utils'
import { cn } from '@/lib/class-names'
import { useTranslate } from '@/i18n/use-translate'
import { ActivityThreadOptionsMenu } from './activity-thread-controls'
import type {
@@ -4,7 +4,7 @@ import { AgentTypeIcon } from '@/components/agent/icons/agent-type-icon'
import { formatAgentTypeLabel } from '../../../../shared/agent-status/presentation/agent-type-label'
import { Button } from '@/components/ui/button'
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip'
import { cn } from '@/lib/utils'
import { cn } from '@/lib/class-names'
import { useTranslate } from '@/i18n/use-translate'
import { useUiLanguageRevision } from '@/i18n/use-ui-language-revision'
import '../sidebar/workspace-card/activity/worktree-card-empty-inputs'
@@ -11,7 +11,7 @@ import {
getAgentPickerCommandValue,
searchAgentPickerEntries
} from '@/lib/agent-catalog/agent-picker-search'
import { cn } from '@/lib/utils'
import { cn } from '@/lib/class-names'
import type { TuiAgent } from '../../../../shared/agent-launch/catalog/tui-agent'
import * as state from './agent-combobox-command-state'
import {
@@ -2,7 +2,7 @@ import { terminalPendingLabel } from '../tab-bar/new-tab-agent-menu-model'
import { useImperativeHandle, useRef, type Ref } from 'react'
import { CornerDownLeft, MessageSquare, SquareTerminal } from 'lucide-react'
import { Button } from '@/components/ui/button'
import { cn } from '@/lib/utils'
import { cn } from '@/lib/class-names'
import { ShortcutKeyCombo } from '@/components/ShortcutKeyCombo'
import { translate } from '@/i18n/i18n'
import { useTranslate, type Translate } from '@/i18n/use-translate'
@@ -21,7 +21,7 @@ import {
} from '@/components/ui/command'
import { useTranslate } from '@/i18n/use-translate'
import { agentModelChoiceChips } from './launch-settings/agent-model-choice-chips'
import { isScreenSubmitShortcut } from '@/lib/screen-submit-shortcut'
import { isScreenSubmitShortcut } from '@/lib/keyboard/screen-submit-shortcut'
import { isImeOwnedKeyboardEvent } from '@/lib/text-input/ime/ime-composition-keyboard-event'
import { AgentDefaultArgsInput } from './launch-settings/AgentLaunchDefaultsEditor'
import { NativeChatSessionOptionRows } from '../native-chat/session/options/controls/NativeChatSessionOptionRows'
@@ -1,7 +1,10 @@
import { useAppStateValue, useAppStateViewActive } from '@/store/retained-views/app-state-view'
import React, { useCallback } from 'react'
import { useAppStore } from '@/store'
import { getOverlayFocusOwners, overlayFocusContains } from '@/lib/overlay-focus-ownership'
import { useAppStore } from '@/store/index'
import {
getOverlayFocusOwners,
overlayFocusContains
} from '@/lib/overlay-interaction/overlay-focus-ownership'
import {
Dialog,
DialogContent,
@@ -15,7 +18,7 @@ import {
isWindowsTerminalCapabilityHost,
useLocalWindowsTerminalCapabilities
} from '@/runtime/hosts/capabilities/windows-terminal-capabilities'
import { isWebClientLocation } from '@/lib/web-client-location'
import { isWebClientLocation } from '@/app-shell/platform/web-client-location'
import { useWindowsTerminalCapabilityOwnerKey } from '@/hooks/useWindowsTerminalCapabilityOwnerKey'
import { resolveSettingsHostScope } from '@/components/settings/host-scope/settings-host-scope'
@@ -1,6 +1,6 @@
import React from 'react'
import { MessageSquare, SquareTerminal } from 'lucide-react'
import { cn } from '@/lib/utils'
import { cn } from '@/lib/class-names'
type AgentSurfaceLaunchButtonProps = Omit<React.ComponentProps<'button'>, 'children' | 'title'> & {
title: string
@@ -7,7 +7,7 @@ import {
ContextMenuItem,
ContextMenuTrigger
} from '@/components/ui/context-menu'
import { cn } from '@/lib/utils'
import { cn } from '@/lib/class-names'
import { useTranslate } from '@/i18n/use-translate'
type ItemRenderArgs = {
@@ -13,7 +13,7 @@ import {
rowLabel,
rowTitle
} from '@/components/tab-bar/tab-agent-row-presentation'
import { cn } from '@/lib/utils'
import { cn } from '@/lib/class-names'
import { translate } from '@/i18n/i18n'
import { useTranslate, type Translate } from '@/i18n/use-translate'
import type { TuiAgent } from '../../../../shared/agent-launch/catalog/tui-agent'
@@ -1,5 +1,5 @@
import React from 'react'
import { cn } from '../../../lib/utils'
import { cn } from '../../../lib/class-names'
export function PiIcon({
size = 14,
@@ -19,7 +19,7 @@ import { useIntlLocale, useTranslate } from '@/i18n/use-translate'
import { AgentIcon } from '@/components/agent/icons/AgentIcon'
import { buildFontFamily } from '../../../../../shared/monospace-font-family'
import { resolveEffectiveTerminalAppearance } from '@/lib/terminal-theme'
import { cn } from '@/lib/utils'
import { cn } from '@/lib/class-names'
// The tip's chat miniature, finished and denser so it fits a tile; nothing here animates.
const CHAT_SCALE: CSSProperties & { '--chat-font-size': string } = { '--chat-font-size': '10px' }
@@ -1,5 +1,5 @@
import { useTranslate } from '../../../i18n/use-translate'
import { cn } from '../../../lib/utils'
import { cn } from '../../../lib/class-names'
import { ChevronDown } from 'lucide-react'
import { Button } from '../../ui/button'
import { Label } from '../../ui/label'
@@ -3,12 +3,12 @@ import { Loader2 } from 'lucide-react'
import type { ArtifactListItem } from '../../../../shared/artifacts/artifacts'
import { Button } from '@/components/ui/button'
import { useTranslate } from '@/i18n/use-translate'
import { cn } from '@/lib/utils'
import { cn } from '@/lib/class-names'
import { clampArtifactListSearchQuery, filterArtifactsBySearchQuery } from './artifact-list-search'
import { ArtifactListRows } from './ArtifactListRows'
import { ArtifactListTableHeader } from './ArtifactListTableHeader'
import { ArtifactListToolbar } from './ArtifactListToolbar'
import { LIST_TABLE_CONTAINER_CLASS } from '@/lib/list-table-layout'
import { LIST_TABLE_CONTAINER_CLASS } from '@/lib/list-interaction/list-table-layout'
export function ArtifactCollection({
artifacts,
@@ -19,8 +19,11 @@ import {
} from '@/components/ui/dropdown-menu'
import { translate } from '@/i18n/i18n'
import { useIntlLocale, useTranslate, type Translate } from '@/i18n/use-translate'
import { cn } from '@/lib/utils'
import { isPortaledRowMenuClick, isRowActivationKey } from '@/lib/list-row-interaction'
import { cn } from '@/lib/class-names'
import {
isPortaledRowMenuClick,
isRowActivationKey
} from '@/lib/list-interaction/list-row-interaction'
import {
artifactName,
artifactTypeLabel,
@@ -34,7 +37,7 @@ import {
LIST_TABLE_ROW_CLASS,
LIST_TABLE_ROW_DIVIDER_CLASS,
LIST_TABLE_ROW_SELECTED_CLASS
} from '@/lib/list-table-layout'
} from '@/lib/list-interaction/list-table-layout'
type ArtifactRowAction = {
key: string
@@ -3,7 +3,7 @@ import { Search, X } from 'lucide-react'
import { Button } from '@/components/ui/button'
import { Input } from '@/components/ui/input'
import { useTranslate } from '@/i18n/use-translate'
import { cn } from '@/lib/utils'
import { cn } from '@/lib/class-names'
export function ArtifactListSearchField({
query,
@@ -1,7 +1,7 @@
import { cn } from '@/lib/utils'
import { cn } from '@/lib/class-names'
import { useTranslate } from '@/i18n/use-translate'
import { ARTIFACTS_TABLE_GRID_CLASS } from './artifacts-table-layout'
import { LIST_TABLE_HEADER_CLASS } from '@/lib/list-table-layout'
import { LIST_TABLE_HEADER_CLASS } from '@/lib/list-interaction/list-table-layout'
export function ArtifactListTableHeader(): React.JSX.Element {
const t = useTranslate()
@@ -2,7 +2,7 @@ import { RefreshCw } from 'lucide-react'
import { Button } from '@/components/ui/button'
import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'
import { useTranslate } from '@/i18n/use-translate'
import { cn } from '@/lib/utils'
import { cn } from '@/lib/class-names'
import { ArtifactListSearchField } from './ArtifactListSearchField'
export function ArtifactListToolbar({
@@ -5,8 +5,8 @@ import { Button } from '@/components/ui/button'
import { Popover, PopoverAnchor, PopoverContent, PopoverTrigger } from '@/components/ui/popover'
import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'
import { useTranslate } from '@/i18n/use-translate'
import { cn } from '@/lib/utils'
import { useAppStore } from '@/store'
import { cn } from '@/lib/class-names'
import { useAppStore } from '@/store/index'
import { ArtifactPublishedLinkPanel } from './ArtifactPublishedLinkPanel'
import { getPublishedArtifactLink } from './artifact-published-link-client'
import { publishArtifactFromSurface } from './artifact-publish-flow'
@@ -3,7 +3,7 @@ import { Check, Copy, ExternalLink, Loader2, RefreshCw } from 'lucide-react'
import { Button } from '@/components/ui/button'
import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'
import { useTranslate } from '@/i18n/use-translate'
import { cn } from '@/lib/utils'
import { cn } from '@/lib/class-names'
import { copyArtifactLink, openArtifactInBrowser } from './artifact-link-actions'
export function ArtifactPublishedLinkPanel({
@@ -1,7 +1,10 @@
import { cn } from '@/lib/utils'
import { cn } from '@/lib/class-names'
import { useTranslate } from '@/i18n/use-translate'
import { ARTIFACTS_TABLE_GRID_CLASS } from './artifacts-table-layout'
import { LIST_TABLE_CONTAINER_CLASS, LIST_TABLE_HEADER_CLASS } from '@/lib/list-table-layout'
import {
LIST_TABLE_CONTAINER_CLASS,
LIST_TABLE_HEADER_CLASS
} from '@/lib/list-interaction/list-table-layout'
function SkeletonBar({ className }: { className?: string }): React.JSX.Element {
return <div className={cn('animate-pulse rounded bg-muted/60', className)} />
@@ -1,12 +1,12 @@
import React from 'react'
import { cn } from '@/lib/utils'
import { cn } from '@/lib/class-names'
import { AUTOMATIONS_TABLE_GRID_CLASS } from './listing/automations-table-layout'
import {
LIST_TABLE_CONTAINER_CLASS,
LIST_TABLE_HEADER_CLASS,
LIST_TABLE_STICKY_HEADER_CELL_CLASS,
LIST_TABLE_STICKY_ROW_CELL_CLASS
} from '@/lib/list-table-layout'
} from '@/lib/list-interaction/list-table-layout'
import { useTranslate } from '@/i18n/use-translate'
function SkeletonBar({ className }: { className?: string }): React.JSX.Element {
@@ -1,7 +1,7 @@
import React from 'react'
import { CheckCircle2, CircleAlert } from 'lucide-react'
import { Input } from '@/components/ui/input'
import { cn } from '@/lib/utils'
import { cn } from '@/lib/class-names'
import { describeAutomationSchedule } from '../../../../../shared/automations/scheduling/automation-schedules'
import { getAutomationCronExpressionFields } from '../../../../../shared/automations/scheduling/automation-schedule-parsing'
import { formatUiAutomationScheduleDescriptor } from '../details/automation-schedule-label'
@@ -7,7 +7,7 @@ import { isMonacoFindWidgetOpen } from '@/components/editor/monaco-find-widget'
import { monacoTypographyOptions } from '@/lib/editor/appearance/editor-typography'
import { useEditorTypography } from '@/hooks/use-editor-typography'
import '@/lib/editor/monaco/monaco-setup'
import { cn } from '@/lib/utils'
import { cn } from '@/lib/class-names'
import { buildAutomationPromptEditorOptions } from './automation-editor-prompt-options'
import { useMonacoTheme } from '@/hooks/use-monaco-theme'
@@ -8,7 +8,7 @@ import { useAppStore } from '@/store/index'
import { isGitRepoKind } from '../../../../../shared/repo-kind'
import { getRepoExecutionHostId } from '../../../../../shared/execution-host'
import { isRepoSearchQueryTooLarge, searchRepos } from '@/lib/repo-search'
import { cn } from '@/lib/utils'
import { cn } from '@/lib/class-names'
import { useMountedRef } from '@/hooks/useMountedRef'
import { useTranslate } from '@/i18n/use-translate'
import { projectHostCountLabel } from '@/components/project-host-count-label'
@@ -1,4 +1,4 @@
import { cn } from '@/lib/utils'
import { cn } from '@/lib/class-names'
import {
Select,
SelectContent,
@@ -1,7 +1,7 @@
import React from 'react'
import { Check, ChevronDown } from 'lucide-react'
import { Button } from '@/components/ui/button'
import { cn } from '@/lib/utils'
import { cn } from '@/lib/class-names'
import { useTranslate } from '@/i18n/use-translate'
import { getVisibleAutomationSetupDecision } from './automation-setup-decision'
import type { AutomationDraft } from './AutomationEditorDialog'
@@ -1,7 +1,7 @@
import { ImeInput } from '@/lib/text-input/ime/ime-text-field'
import React from 'react'
import { Clock } from 'lucide-react'
import { cn } from '@/lib/utils'
import { cn } from '@/lib/class-names'
import { useTranslate } from '@/i18n/use-translate'
const TIME_SHELL_CLASS =
@@ -9,7 +9,7 @@ import {
CommandList
} from '@/components/ui/command'
import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'
import { cn } from '@/lib/utils'
import { cn } from '@/lib/class-names'
import type { Worktree } from '../../../../../shared/worktree/types'
import { useTranslate } from '@/i18n/use-translate'

Some files were not shown because too many files have changed in this diff Show More