diff --git a/packages/app/e2e/regression/workspaces.spec.ts b/packages/app/e2e/regression/workspaces.spec.ts index d0c90767b62..80fbd5b7aed 100644 --- a/packages/app/e2e/regression/workspaces.spec.ts +++ b/packages/app/e2e/regression/workspaces.spec.ts @@ -96,6 +96,22 @@ test("lists and manually deletes workspaces from settings", async ({ page }) => sessions: [], pageMessages: () => ({ items: [] }), }) + let releaseSessions = () => {} + const sessionsReady = new Promise((resolve) => { + releaseSessions = resolve + }) + await page.route("**/session?**", async (route) => { + const url = new URL(route.request().url()) + if (route.request().method() !== "GET" || url.pathname !== "/session" || url.searchParams.get("limit") !== "1000") + return route.fallback() + await sessionsReady + await route.fulfill({ + status: 200, + contentType: "application/json", + headers: { "access-control-allow-origin": "*" }, + body: "[]", + }) + }) await page.route("**/experimental/worktree**", async (route) => { if (route.request().method() === "OPTIONS") { await route.fulfill({ @@ -125,6 +141,9 @@ test("lists and manually deletes workspaces from settings", async ({ page }) => await page.goto(`/new-session?draftId=${draftID}`) await transport.waitForConnection() await expectAppVisible(page.locator('[data-component="prompt-input"]')) + + const app = page.locator('[data-component="session-new-design"]') + const appNode = await app.elementHandle() await page.getByRole("button", { name: /local|new workspace/i }).click() const workspacesTrigger = page.getByRole("menuitem", { name: /Workspace/ }) if (await workspacesTrigger.isVisible()) await workspacesTrigger.hover() @@ -132,6 +151,8 @@ test("lists and manually deletes workspaces from settings", async ({ page }) => const settings = page.locator(".settings-v2-dialog") await expect(settings.getByRole("tab", { name: "Workspaces" })).toHaveAttribute("data-selected") + expect(await appNode?.evaluate((node) => node.isConnected)).toBe(true) + releaseSessions() await expect(settings.getByText(cleanWorkspace, { exact: true })).toBeVisible() await settings.getByRole("button", { name: 'Delete workspace "feature-clean"?' }).click() diff --git a/packages/app/src/components/settings-v2/dialog-settings-v2.tsx b/packages/app/src/components/settings-v2/dialog-settings-v2.tsx index 1e0443d26e6..df7c37b6845 100644 --- a/packages/app/src/components/settings-v2/dialog-settings-v2.tsx +++ b/packages/app/src/components/settings-v2/dialog-settings-v2.tsx @@ -1,7 +1,7 @@ import { Component, createMemo, createSignal, startTransition } from "solid-js" import { Dialog } from "@opencode-ai/ui/v2/dialog-v2" import { TabsV2 } from "@opencode-ai/ui/v2/tabs-v2" -import { Icon } from "@opencode-ai/ui/v2/icon" +import { Icon } from "@opencode-ai/ui/icon" import { useLanguage } from "@/context/language" import { usePlatform } from "@/context/platform" import { SettingsGeneralV2 } from "./general" @@ -56,11 +56,11 @@ export const DialogSettings: Component<{ {language.t("settings.section.desktop")}
- + {language.t("settings.tab.general")} - + {language.t("settings.tab.shortcuts")}
@@ -70,19 +70,19 @@ export const DialogSettings: Component<{ {language.t("settings.section.server")}
- + {language.t("settings.tab.workspaces")} - + {language.t("status.popover.tab.servers")} - + {language.t("settings.providers.title")} - + {language.t("settings.models.title")}
diff --git a/packages/app/src/components/settings-v2/workspaces.tsx b/packages/app/src/components/settings-v2/workspaces.tsx index cc974bdd68b..3202fe5a024 100644 --- a/packages/app/src/components/settings-v2/workspaces.tsx +++ b/packages/app/src/components/settings-v2/workspaces.tsx @@ -88,7 +88,10 @@ export const SettingsWorkspacesV2: Component<{ activeDirectory?: string }> = (pr queryFn: () => loadSessions(), refetchOnMount: "always", })) - const workspaceSessions = (workspace: Workspace) => sessionsForWorkspace(sessionQuery.data ?? [], workspace.directory) + const workspaceSessions = (workspace: Workspace) => { + if (!sessionQuery.isSuccess) return [] + return sessionsForWorkspace(sessionQuery.data ?? [], workspace.directory) + } const sessionCount = (workspace: Workspace) => { if (sessionQuery.isPending) return language.t("session.messages.loading") if (sessionQuery.isError) return language.t("common.requestFailed") diff --git a/packages/ui/src/components/icon.tsx b/packages/ui/src/components/icon.tsx index a16fad0c32a..babca7c864e 100644 --- a/packages/ui/src/components/icon.tsx +++ b/packages/ui/src/components/icon.tsx @@ -10,6 +10,7 @@ const icons = { prompt: ``, brain: ``, fork: ``, + "workspace-isolated": ``, "bullet-list": ``, "check-small": ``, "chevron-down": ``,