From ca529b71fb682a11f54e6bd5945c7f806367e14b Mon Sep 17 00:00:00 2001 From: Jinwoo-H Date: Thu, 11 Jun 2026 13:08:12 -0700 Subject: [PATCH] Fix rebase merge fallout Co-authored-by: Orca --- src/renderer/src/components/NewWorkspaceComposerCard.tsx | 7 ++++--- .../components/feature-wall/FeatureWallBrowserAction.tsx | 1 - src/renderer/src/components/sidebar/WorktreeList.tsx | 3 ++- .../components/sidebar/folder-workspace-composer-submit.ts | 4 +++- src/renderer/src/components/sidebar/host-section-rows.ts | 2 ++ .../sidebar/useCreateRepo.default-checkout.test.ts | 2 +- .../src/components/sidebar/worktree-list-groups.test.ts | 3 +++ src/renderer/src/lib/workspace-session-host-split.ts | 1 + src/renderer/src/web/web-preload-api.ts | 5 +++++ 9 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/renderer/src/components/NewWorkspaceComposerCard.tsx b/src/renderer/src/components/NewWorkspaceComposerCard.tsx index 1f69e7a3a61..8939cfd0ea8 100644 --- a/src/renderer/src/components/NewWorkspaceComposerCard.tsx +++ b/src/renderer/src/components/NewWorkspaceComposerCard.tsx @@ -42,6 +42,7 @@ import type { SshConnectionStatus } from '../../../shared/ssh-types' import { translate } from '@/i18n/i18n' type RepoOption = React.ComponentProps['repos'][number] +const EMPTY_PROJECT_HOST_SETUP_OPTIONS: ProjectHostSetupOption[] = [] type NewWorkspaceComposerCardProps = { contextualTourSource?: string @@ -245,8 +246,8 @@ export default function NewWorkspaceComposerCard({ repoId, selectedRepoIsGit, onRepoChange, - projectHostSetupOptions, - selectedProjectHostSetupId, + projectHostSetupOptions = EMPTY_PROJECT_HOST_SETUP_OPTIONS, + selectedProjectHostSetupId = null, onProjectHostSetupChange, primaryActionLabel, projectLabel, @@ -500,7 +501,7 @@ export default function NewWorkspaceComposerCard({ diff --git a/src/renderer/src/components/feature-wall/FeatureWallBrowserAction.tsx b/src/renderer/src/components/feature-wall/FeatureWallBrowserAction.tsx index bd6acac1314..b098ef41cd6 100644 --- a/src/renderer/src/components/feature-wall/FeatureWallBrowserAction.tsx +++ b/src/renderer/src/components/feature-wall/FeatureWallBrowserAction.tsx @@ -14,7 +14,6 @@ import { promptForSetupGuideProject, useSetupTargetWorktree } from './FeatureWallSetupWorkflowActions' -import { translate } from '@/i18n/i18n' export function BrowserAction(props: { done: boolean }): React.JSX.Element { const targetWorktree = useSetupTargetWorktree() diff --git a/src/renderer/src/components/sidebar/WorktreeList.tsx b/src/renderer/src/components/sidebar/WorktreeList.tsx index 1836b56b083..c34e954d833 100644 --- a/src/renderer/src/components/sidebar/WorktreeList.tsx +++ b/src/renderer/src/components/sidebar/WorktreeList.tsx @@ -14,6 +14,7 @@ import { FolderInput, FolderPlus, FolderX, + Loader2, Plus, Server, ServerOff, @@ -180,7 +181,7 @@ import { pruneWorktreeSelection, updateWorktreeSelection } from './worktree-multi-selection' -import { callRuntimeRpc, getActiveRuntimeTarget } from '@/runtime/runtime-rpc-client' +import { callRuntimeRpc } from '@/runtime/runtime-rpc-client' import { splitWorktreeSortOrderByHost } from '@/lib/worktree-sort-order-host-split' import { getSettingsFocusedExecutionHostId, diff --git a/src/renderer/src/components/sidebar/folder-workspace-composer-submit.ts b/src/renderer/src/components/sidebar/folder-workspace-composer-submit.ts index 8bddb367c2d..cd33ce30709 100644 --- a/src/renderer/src/components/sidebar/folder-workspace-composer-submit.ts +++ b/src/renderer/src/components/sidebar/folder-workspace-composer-submit.ts @@ -67,7 +67,9 @@ export async function submitFolderWorkspaceCreate({ return } - const linkedPromptContext = getLinkedWorkItemPromptContext(linkedWorkItem) + const linkedPromptContext = getLinkedWorkItemPromptContext(linkedWorkItem, { + cliAvailable: false + }) const startupPrompt = buildAgentPromptWithContext( note, [], diff --git a/src/renderer/src/components/sidebar/host-section-rows.ts b/src/renderer/src/components/sidebar/host-section-rows.ts index 53c0145e350..866c3378a73 100644 --- a/src/renderer/src/components/sidebar/host-section-rows.ts +++ b/src/renderer/src/components/sidebar/host-section-rows.ts @@ -59,6 +59,8 @@ function getRowHostId(row: Row, defaultHostId: ExecutionHostId): ExecutionHostId case 'pending-creation': case 'imported-worktrees-card': return getRepoHostId(row.repo, defaultHostId) + case 'folder-workspace': + return getRepoHostId(undefined, defaultHostId) case 'header': return row.repo ? getRepoHostId(row.repo, defaultHostId) : null } diff --git a/src/renderer/src/components/sidebar/useCreateRepo.default-checkout.test.ts b/src/renderer/src/components/sidebar/useCreateRepo.default-checkout.test.ts index bd455724903..84364c97bcb 100644 --- a/src/renderer/src/components/sidebar/useCreateRepo.default-checkout.test.ts +++ b/src/renderer/src/components/sidebar/useCreateRepo.default-checkout.test.ts @@ -200,7 +200,7 @@ describe('useCreateRepo default-checkout handoff', () => { const repo = makeRepo({ connectionId: 'ssh-1', path: '/srv/created' }) mocks.createRemoteRepo.mockResolvedValue({ repo }) mocks.fetchWorktrees.mockResolvedValue(true) - const { useCreateRepo } = await import('./AddRepoCreateStep') + const { useCreateRepo } = await import('./useCreateRepo') const result = useCreateRepo(mocks.fetchWorktrees, vi.fn(), mocks.onGitRepoReady, { sshTargetId: 'ssh-1' diff --git a/src/renderer/src/components/sidebar/worktree-list-groups.test.ts b/src/renderer/src/components/sidebar/worktree-list-groups.test.ts index 274a2d33b6a..01a07d39d1b 100644 --- a/src/renderer/src/components/sidebar/worktree-list-groups.test.ts +++ b/src/renderer/src/components/sidebar/worktree-list-groups.test.ts @@ -1529,6 +1529,7 @@ describe('project groups', () => { new Set(), new Map(), [], + undefined, [folderWorkspace] ) @@ -1605,6 +1606,7 @@ describe('project groups', () => { new Set(), new Map(), [], + undefined, [folderWorkspace] ) @@ -1673,6 +1675,7 @@ describe('project groups', () => { new Set(), new Map(), [], + undefined, [folderWorkspace] ) diff --git a/src/renderer/src/lib/workspace-session-host-split.ts b/src/renderer/src/lib/workspace-session-host-split.ts index 3f4cf477cb6..2be516f48cc 100644 --- a/src/renderer/src/lib/workspace-session-host-split.ts +++ b/src/renderer/src/lib/workspace-session-host-split.ts @@ -63,6 +63,7 @@ const FIELD_OWNERSHIP = { activeGroupIdByWorktree: 'worktreeKeyed', lastVisitedAtByWorktreeId: 'worktreeKeyed', defaultTerminalTabsAppliedByWorktreeId: 'worktreeKeyed', + activeWorkspaceKey: 'global', activeWorktreeIdsOnShutdown: 'worktreeArray', terminalLayoutsByTabId: 'tabKeyed', remoteSessionIdsByTabId: 'tabKeyed', diff --git a/src/renderer/src/web/web-preload-api.ts b/src/renderer/src/web/web-preload-api.ts index 79e60fab7b3..9483190c395 100644 --- a/src/renderer/src/web/web-preload-api.ts +++ b/src/renderer/src/web/web-preload-api.ts @@ -1016,6 +1016,11 @@ function createReposApi(): NonNullable['repos']> { // clients must not pretend they can run that local IPC path directly. throw new Error('SSH clone is unavailable in paired web clients.') }, + createRemote: async () => { + // Why: SSH relay project creation is owned by the desktop main process; + // paired web clients cannot create folders through local SSH IPC. + throw new Error('SSH project creation is unavailable in paired web clients.') + }, cloneAbort: () => Promise.resolve(), addRemote: async ({ remotePath, displayName, kind }) => { invalidateRuntimeWorktreeCaches()