import { expect, type Page } from '@playwright/test'; import { buildHostWorkspaceRoute } from '@/utils/host-routes'; import { gotoHome } from './app'; export async function openNewAgentComposer(page: Page): Promise { await gotoHome(page); } export function workspaceLabelFromPath(value: string): string { const normalized = value.replace(/\\/g, '/').replace(/\/+$/, ''); const parts = normalized.split('/').filter(Boolean); return parts[parts.length - 1] ?? normalized; } function escapeRegex(value: string): string { return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); } function candidateWorkspaceIds(inputPath: string): string[] { const trimmed = inputPath.replace(/\/+$/, ''); const candidates = new Set([trimmed]); if (trimmed.startsWith('/var/')) { candidates.add(`/private${trimmed}`); } if (trimmed.startsWith('/private/var/')) { candidates.add(trimmed.replace(/^\/private/, '')); } return Array.from(candidates); } function workspaceRowLocator(page: Page, serverId: string, workspacePath: string) { const ids = candidateWorkspaceIds(workspacePath).map( (id) => `[data-testid="sidebar-workspace-row-${serverId}:${id}"]` ); return page.locator(ids.join(',')).first(); } export async function switchWorkspaceViaSidebar(input: { page: Page; serverId: string; targetWorkspacePath: string; }): Promise { const row = workspaceRowLocator(input.page, input.serverId, input.targetWorkspacePath); await expect(row).toBeVisible({ timeout: 30_000 }); await row.click(); const targetWorkspaceRoute = buildHostWorkspaceRoute(input.serverId, input.targetWorkspacePath); await expect(input.page).toHaveURL(new RegExp(escapeRegex(targetWorkspaceRoute)), { timeout: 30_000, }); } export async function expectWorkspaceHeader( page: Page, input: { title: string; subtitle: string } ): Promise { const titleLocator = page.getByTestId('workspace-header-title'); const subtitleLocator = page.getByTestId('workspace-header-subtitle'); await expect(titleLocator.first()).toHaveText(input.title, { timeout: 30_000, }); await expect(subtitleLocator.first()).toHaveText(input.subtitle, { timeout: 30_000, }); } export async function seedWorkspaceActivity(page: Page, marker: string): Promise { const input = page.getByRole('textbox', { name: 'Message agent...' }); await expect(input).toBeEditable({ timeout: 30_000 }); await input.fill(marker); await input.press('Enter'); await expect(page).toHaveURL(/\/workspace\//, { timeout: 30_000 }); }