From 37de9ea79617097924208d6c844a2f9476173ec2 Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Tue, 16 Jun 2026 18:57:00 +0700 Subject: [PATCH] Fix workspace-owned Playwright flows --- packages/app/e2e/helpers/composer.ts | 6 ++++-- packages/app/e2e/helpers/pins.ts | 3 +++ packages/app/e2e/helpers/rewind-flow.ts | 1 + packages/app/e2e/terminal-keystroke-stress.spec.ts | 1 + packages/app/src/components/agent-list.tsx | 2 ++ packages/app/src/hooks/use-agent-history.ts | 1 + packages/app/src/hooks/use-aggregated-agents.ts | 1 + packages/app/src/types/agent-directory.ts | 1 + packages/app/src/workspace-pins/store.ts | 8 ++++++++ 9 files changed, 22 insertions(+), 2 deletions(-) diff --git a/packages/app/e2e/helpers/composer.ts b/packages/app/e2e/helpers/composer.ts index f35c6f1dd..4a0aaaef9 100644 --- a/packages/app/e2e/helpers/composer.ts +++ b/packages/app/e2e/helpers/composer.ts @@ -2,7 +2,8 @@ import { expect, type Page } from "@playwright/test"; import { buildHostWorkspaceRoute } from "@/utils/host-routes"; import { createTempGitRepo } from "./workspace"; import { connectSeedClient, type SeedDaemonClient } from "./seed-client"; -import { connectWorkspaceSetupClient, openHomeWithProject } from "./workspace-setup"; +import { gotoAppShell } from "./app"; +import { connectWorkspaceSetupClient } from "./workspace-setup"; import { selectWorkspaceInSidebar } from "./sidebar"; import { getServerId } from "./server-id"; import { waitForTabBar } from "./launcher"; @@ -164,6 +165,7 @@ export async function startRunningMockAgent( const agent = await client.createAgent({ provider: "mock", cwd: repo.path, + workspaceId: opened.workspace.id, model: opts.model, }); const agentUrl = `${buildHostWorkspaceRoute(serverId, opened.workspace.id)}?open=${encodeURIComponent(`agent:${agent.id}`)}`; @@ -188,7 +190,7 @@ export async function openGithubWorkspace( const client = await connectWorkspaceSetupClient(); const opened = await client.openProject(repoPath); if (!opened.workspace) throw new Error(opened.error ?? `Failed to open project ${repoPath}`); - await openHomeWithProject(page, repoPath); + await gotoAppShell(page); await selectWorkspaceInSidebar(page, opened.workspace.id); await waitForTabBar(page); return { cleanup: () => client.close().catch(() => undefined) }; diff --git a/packages/app/e2e/helpers/pins.ts b/packages/app/e2e/helpers/pins.ts index 8ef2ed051..f7a08d3e1 100644 --- a/packages/app/e2e/helpers/pins.ts +++ b/packages/app/e2e/helpers/pins.ts @@ -12,6 +12,9 @@ function pinToggle(page: Page, target: PinnedTabTarget) { } function menuItemFor(page: Page, target: PinnedTabTarget) { + if (target.kind === "draft") { + return page.getByTestId("workspace-new-tab-menu-agent"); + } return page.getByTestId(`workspace-new-tab-menu-${target.kind}`); } diff --git a/packages/app/e2e/helpers/rewind-flow.ts b/packages/app/e2e/helpers/rewind-flow.ts index 58d5347de..46aa7c61d 100644 --- a/packages/app/e2e/helpers/rewind-flow.ts +++ b/packages/app/e2e/helpers/rewind-flow.ts @@ -178,6 +178,7 @@ export async function launchAgent(input: { const agent = await client.createAgent({ ...fullAccessConfig(input.provider), cwd: input.cwd, + workspaceId: opened.workspace.id, title: `rewind-flow-${input.provider}-${randomUUID()}`, }); const handle = { diff --git a/packages/app/e2e/terminal-keystroke-stress.spec.ts b/packages/app/e2e/terminal-keystroke-stress.spec.ts index e808e632a..f12adcbfc 100644 --- a/packages/app/e2e/terminal-keystroke-stress.spec.ts +++ b/packages/app/e2e/terminal-keystroke-stress.spec.ts @@ -139,6 +139,7 @@ async function measureAppBurstEcho(input: { : await input.harness.client.createAgent({ provider: "mock", cwd: input.harness.tempRepo.path, + workspaceId: input.harness.workspaceId, title: "Large WebSocket payload", modeId: "load-test", }); diff --git a/packages/app/src/components/agent-list.tsx b/packages/app/src/components/agent-list.tsx index f50e735b0..3f521758e 100644 --- a/packages/app/src/components/agent-list.tsx +++ b/packages/app/src/components/agent-list.tsx @@ -77,6 +77,7 @@ function buildHistoricalAgentDetail(agent: AggregatedAgent): Agent { }, title: agent.title, cwd: agent.cwd, + workspaceId: agent.workspaceId, model: null, thinkingOptionId: null, requiresAttention: agent.requiresAttention, @@ -101,6 +102,7 @@ function rememberArchivedAgentDetail(agent: AggregatedAgent) { ...existing, archivedAt: existing?.archivedAt ?? agent.archivedAt, cwd: existing?.cwd ?? agent.cwd, + workspaceId: existing?.workspaceId ?? agent.workspaceId, }); return next; }); diff --git a/packages/app/src/hooks/use-agent-history.ts b/packages/app/src/hooks/use-agent-history.ts index 1abfc56c2..2fa731fb6 100644 --- a/packages/app/src/hooks/use-agent-history.ts +++ b/packages/app/src/hooks/use-agent-history.ts @@ -60,6 +60,7 @@ export async function fetchAgentHistoryPage(input: { status: agent.status, lastActivityAt: agent.lastActivityAt, cwd: agent.cwd, + workspaceId: agent.workspaceId, provider: agent.provider, pendingPermissionCount: agent.pendingPermissions.length, requiresAttention: agent.requiresAttention, diff --git a/packages/app/src/hooks/use-aggregated-agents.ts b/packages/app/src/hooks/use-aggregated-agents.ts index 97e2c4fbe..28065fb46 100644 --- a/packages/app/src/hooks/use-aggregated-agents.ts +++ b/packages/app/src/hooks/use-aggregated-agents.ts @@ -78,6 +78,7 @@ export function useAggregatedAgents(options?: { status: agent.status, lastActivityAt: agent.lastActivityAt, cwd: agent.cwd, + workspaceId: agent.workspaceId, provider: agent.provider, pendingPermissionCount: agent.pendingPermissions.length, requiresAttention: agent.requiresAttention, diff --git a/packages/app/src/types/agent-directory.ts b/packages/app/src/types/agent-directory.ts index b7d9be9b3..ab4c94145 100644 --- a/packages/app/src/types/agent-directory.ts +++ b/packages/app/src/types/agent-directory.ts @@ -8,6 +8,7 @@ export type AgentDirectoryEntry = Pick< | "status" | "lastActivityAt" | "cwd" + | "workspaceId" | "provider" | "requiresAttention" | "attentionReason" diff --git a/packages/app/src/workspace-pins/store.ts b/packages/app/src/workspace-pins/store.ts index 524264b43..8fd3178a9 100644 --- a/packages/app/src/workspace-pins/store.ts +++ b/packages/app/src/workspace-pins/store.ts @@ -31,6 +31,14 @@ export const usePinnedTargetsStore = create()( { name: "pinned-tab-targets", version: 1, + merge: (persistedState, currentState) => { + const persisted = persistedState as Partial | null; + return { + ...currentState, + ...persisted, + pinned: persisted?.pinned ?? applyDefaultPinnedTargets([]), + }; + }, storage: createJSONStorage(() => AsyncStorage), partialize: (state) => ({ pinned: state.pinned }), migrate: (persistedState, version) => {