diff --git a/packages/app/e2e/fixtures.ts b/packages/app/e2e/fixtures.ts deleted file mode 100644 index a8fa0110916..00000000000 --- a/packages/app/e2e/fixtures.ts +++ /dev/null @@ -1,211 +0,0 @@ -import { expect, test as base, type Page, type TestInfo } from "@playwright/test" - -const marker = "__OPENCODE_E2E_ERROR_TOAST__" - -type ErrorToastObservation = { - component: "legacy" | "v2" - title: string - description: string - text: string - url: string - timestamp: number -} - -type ErrorToastExpectation = { - pattern: string | RegExp - seen: boolean -} - -export type ErrorToastControl = { - expect: (pattern: string | RegExp) => void - allow: (pattern?: string | RegExp) => void -} - -type ErrorToastState = ErrorToastControl & { - allowed: boolean - allowedPatterns: (string | RegExp)[] - expected: ErrorToastExpectation[] -} - -type Fixtures = { - errorToasts: ErrorToastControl -} - -export const test = base.extend({ - errorToasts: async ({}, use) => use(createErrorToastState()), - page: async ({ page, errorToasts }, use, testInfo) => { - const guard = await guardPage(page, testInfo, errorToasts as ErrorToastState) - try { - await use(page) - } finally { - await guard.finish() - } - }, -}) - -export { expect } -export type { Browser, CDPSession, Locator, Page, Route, TestInfo } from "@playwright/test" - -export async function guardPage(page: Page, testInfo: TestInfo, control = createErrorToastState()) { - const observations: ErrorToastObservation[] = [] - const unexpected: ErrorToastObservation[] = [] - let closing = false - const onConsole = (message: { text: () => string }) => { - const text = message.text() - if (!text.startsWith(marker)) return - - const observation = JSON.parse(text.slice(marker.length)) as ErrorToastObservation - observations.push(observation) - console.error(`E2E_ERROR_TOAST ${JSON.stringify(observation)}`) - - const expected = control.expected.find((item) => !item.seen && matches(item.pattern, observation.text)) - if (expected) { - expected.seen = true - return - } - if (control.allowed || control.allowedPatterns.some((pattern) => matches(pattern, observation.text))) return - - unexpected.push(observation) - if (closing) return - closing = true - void page.close().catch(() => {}) - } - - page.on("console", onConsole) - await page.addInitScript(installErrorToastObserver, marker) - await page.evaluate(installErrorToastObserver, marker) - - return { - async finish() { - if (!page.isClosed()) { - await page - .evaluate(() => { - ;(window as Window & { __flushErrorToastObserver?: () => void }).__flushErrorToastObserver?.() - }) - .catch(() => {}) - } - page.off("console", onConsole) - if (observations.length > 0) { - await testInfo.attach("error-toasts", { - body: JSON.stringify(observations, null, 2), - contentType: "application/json", - }) - } - - const missing = control.expected.filter((item) => !item.seen) - if (unexpected.length === 0 && missing.length === 0) return - - const messages = [ - ...unexpected.map((item) => `Unexpected error toast: ${item.text}`), - ...missing.map((item) => `Expected error toast was not shown: ${String(item.pattern)}`), - ] - throw new Error(messages.join("\n")) - }, - } -} - -function createErrorToastState(): ErrorToastState { - const state: ErrorToastState = { - allowed: false, - allowedPatterns: [], - expected: [], - expect(pattern) { - state.expected.push({ pattern, seen: false }) - }, - allow(pattern) { - if (pattern !== undefined) { - state.allowedPatterns.push(pattern) - return - } - state.allowed = true - }, - } - return state -} - -function matches(pattern: string | RegExp, value: string) { - if (typeof pattern === "string") return value.includes(pattern) - pattern.lastIndex = 0 - return pattern.test(value) -} - -function installErrorToastObserver(marker: string) { - const owner = window as Window & { - __errorToastObserverInstalled?: boolean - __flushErrorToastObserver?: () => void - } - if (owner.__errorToastObserverInstalled) return - owner.__errorToastObserverInstalled = true - - const selector = '[data-component="toast"][data-variant="error"], [data-component="toast-v2"][data-variant="error"]' - const seen = new WeakSet() - const pending = new Set() - let scheduled = false - const inspect = (node: Node) => { - const element = node instanceof HTMLElement ? node : node.parentElement - if (!element) return - const candidates = [ - ...(element.matches(selector) ? [element] : []), - ...element.querySelectorAll(selector), - ...(element.closest(selector) ? [element.closest(selector)!] : []), - ] - candidates.forEach((toast) => { - if (seen.has(toast)) return - const text = toast.textContent?.replace(/\s+/g, " ").trim() - if (!text) return - seen.add(toast) - const component = toast.dataset.component === "toast-v2" ? "v2" : "legacy" - const title = toast.querySelector(`[data-slot="toast${component === "v2" ? "-v2" : ""}-title"]`) - const description = toast.querySelector( - `[data-slot="toast${component === "v2" ? "-v2" : ""}-description"]`, - ) - console.debug( - marker + - JSON.stringify({ - component, - title: title?.textContent?.trim() ?? "", - description: description?.textContent?.trim() ?? "", - text, - url: location.href, - timestamp: Date.now(), - }), - ) - }) - } - const scan = () => { - scheduled = false - pending.forEach(inspect) - pending.clear() - } - const schedule = (node: Node) => { - pending.add(node) - if (scheduled) return - scheduled = true - queueMicrotask(scan) - } - const start = () => { - const root = document.documentElement - if (!root) return - new MutationObserver((records) => { - records.forEach((record) => { - if (record.type !== "childList") schedule(record.target) - record.addedNodes.forEach(schedule) - }) - }).observe(root, { - attributes: true, - attributeFilter: ["data-variant"], - childList: true, - characterData: true, - subtree: true, - }) - schedule(root) - } - owner.__flushErrorToastObserver = () => { - const root = document.documentElement - if (root) pending.add(root) - scan() - } - - if (document.documentElement) start() - else document.addEventListener("readystatechange", start, { once: true }) -} diff --git a/packages/app/e2e/performance/benchmark.ts b/packages/app/e2e/performance/benchmark.ts index 1e4b82834ce..b9f8ea43411 100644 --- a/packages/app/e2e/performance/benchmark.ts +++ b/packages/app/e2e/performance/benchmark.ts @@ -1,4 +1,4 @@ -import { expect, guardPage, test as base, type Browser, type Page, type TestInfo } from "../fixtures" +import { expect, test as base, type Browser, type Page, type TestInfo } from "@playwright/test" import { startChromeTrace } from "./chrome-trace" type BenchmarkFixtures = { @@ -101,21 +101,16 @@ export async function withBenchmarkPage( browser: Browser, name: string, run: (page: Page) => Promise, - testInfo: TestInfo, + testInfo?: TestInfo, ) { const context = await browser.newContext() try { const page = await context.newPage() - const toastGuard = await guardPage(page, testInfo) const diagnostics = await observePerformancePage(page, name) try { return await run(page) } finally { - try { - await reportPerformancePage(name, diagnostics, testInfo) - } finally { - await toastGuard?.finish() - } + await reportPerformancePage(name, diagnostics, testInfo) } } finally { await context.close() diff --git a/packages/app/e2e/performance/timeline-stability/adverse.spec.ts b/packages/app/e2e/performance/timeline-stability/adverse.spec.ts index bfd5929157f..7ce1be90645 100644 --- a/packages/app/e2e/performance/timeline-stability/adverse.spec.ts +++ b/packages/app/e2e/performance/timeline-stability/adverse.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from "../../fixtures" +import { expect, test } from "@playwright/test" import { defineVisualRegions, reportVisualStability, diff --git a/packages/app/e2e/performance/timeline-stability/context-matrix.spec.ts b/packages/app/e2e/performance/timeline-stability/context-matrix.spec.ts index 799eeb44546..b3438b77c06 100644 --- a/packages/app/e2e/performance/timeline-stability/context-matrix.spec.ts +++ b/packages/app/e2e/performance/timeline-stability/context-matrix.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from "../../fixtures" +import { expect, test } from "@playwright/test" import { defineVisualRegions, reportVisualStability, diff --git a/packages/app/e2e/performance/timeline-stability/environment-matrix.spec.ts b/packages/app/e2e/performance/timeline-stability/environment-matrix.spec.ts index 7381250a4c2..3455438a736 100644 --- a/packages/app/e2e/performance/timeline-stability/environment-matrix.spec.ts +++ b/packages/app/e2e/performance/timeline-stability/environment-matrix.spec.ts @@ -1,4 +1,4 @@ -import { test } from "../../fixtures" +import { test } from "@playwright/test" import { defineVisualRegions, reportVisualStability, diff --git a/packages/app/e2e/performance/timeline-stability/file-matrix.spec.ts b/packages/app/e2e/performance/timeline-stability/file-matrix.spec.ts index 4445d26c75b..e0f0d72233b 100644 --- a/packages/app/e2e/performance/timeline-stability/file-matrix.spec.ts +++ b/packages/app/e2e/performance/timeline-stability/file-matrix.spec.ts @@ -1,4 +1,4 @@ -import { test } from "../../fixtures" +import { test } from "@playwright/test" import { defineVisualRegions, reportVisualStability, diff --git a/packages/app/e2e/performance/timeline-stability/file-mutation.spec.ts b/packages/app/e2e/performance/timeline-stability/file-mutation.spec.ts index 5dde1eb1375..798bf0df3b2 100644 --- a/packages/app/e2e/performance/timeline-stability/file-mutation.spec.ts +++ b/packages/app/e2e/performance/timeline-stability/file-mutation.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from "../../fixtures" +import { expect, test } from "@playwright/test" import { defineVisualRegions, reportVisualStability, diff --git a/packages/app/e2e/performance/timeline-stability/interaction.spec.ts b/packages/app/e2e/performance/timeline-stability/interaction.spec.ts index f1f845bc8d9..8cdf4fa8cfa 100644 --- a/packages/app/e2e/performance/timeline-stability/interaction.spec.ts +++ b/packages/app/e2e/performance/timeline-stability/interaction.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from "../../fixtures" +import { expect, test } from "@playwright/test" import { defineVisualRegions, reportVisualStability, diff --git a/packages/app/e2e/performance/timeline-stability/lifecycle.spec.ts b/packages/app/e2e/performance/timeline-stability/lifecycle.spec.ts index 27732039828..40688429a33 100644 --- a/packages/app/e2e/performance/timeline-stability/lifecycle.spec.ts +++ b/packages/app/e2e/performance/timeline-stability/lifecycle.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from "../../fixtures" +import { expect, test } from "@playwright/test" import { defineVisualRegions, mapVisualRegions, diff --git a/packages/app/e2e/performance/timeline-stability/oracle-browser.spec.ts b/packages/app/e2e/performance/timeline-stability/oracle-browser.spec.ts index d2ed1db746d..7891eba5bd9 100644 --- a/packages/app/e2e/performance/timeline-stability/oracle-browser.spec.ts +++ b/packages/app/e2e/performance/timeline-stability/oracle-browser.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from "../../fixtures" +import { expect, test } from "@playwright/test" import { analyzeVisualObservations, defineVisualRegions, diff --git a/packages/app/e2e/performance/timeline-stability/scroll-interaction.spec.ts b/packages/app/e2e/performance/timeline-stability/scroll-interaction.spec.ts index 2d3a19ba3c0..e67545104d4 100644 --- a/packages/app/e2e/performance/timeline-stability/scroll-interaction.spec.ts +++ b/packages/app/e2e/performance/timeline-stability/scroll-interaction.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from "../../fixtures" +import { expect, test } from "@playwright/test" import { defineVisualRegions, reportVisualStability, diff --git a/packages/app/e2e/performance/timeline-stability/shell-matrix.spec.ts b/packages/app/e2e/performance/timeline-stability/shell-matrix.spec.ts index b0c1991c4c8..bab1ca23b4f 100644 --- a/packages/app/e2e/performance/timeline-stability/shell-matrix.spec.ts +++ b/packages/app/e2e/performance/timeline-stability/shell-matrix.spec.ts @@ -1,4 +1,4 @@ -import { test } from "../../fixtures" +import { test } from "@playwright/test" import { defineVisualRegions, reportVisualStability, diff --git a/packages/app/e2e/performance/timeline-stability/tool-mutation.spec.ts b/packages/app/e2e/performance/timeline-stability/tool-mutation.spec.ts index 37bbbb61fed..03690ec9214 100644 --- a/packages/app/e2e/performance/timeline-stability/tool-mutation.spec.ts +++ b/packages/app/e2e/performance/timeline-stability/tool-mutation.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from "../../fixtures" +import { expect, test } from "@playwright/test" import { defineVisualRegions, reportVisualStability, diff --git a/packages/app/e2e/performance/timeline-stability/tools.spec.ts b/packages/app/e2e/performance/timeline-stability/tools.spec.ts index c723f9f2011..d28fdaa65f5 100644 --- a/packages/app/e2e/performance/timeline-stability/tools.spec.ts +++ b/packages/app/e2e/performance/timeline-stability/tools.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from "../../fixtures" +import { expect, test } from "@playwright/test" import { defineVisualRegions, reportVisualStability, diff --git a/packages/app/e2e/performance/timeline-stability/transition-matrix.spec.ts b/packages/app/e2e/performance/timeline-stability/transition-matrix.spec.ts index 52b82a84204..e999e8c50a6 100644 --- a/packages/app/e2e/performance/timeline-stability/transition-matrix.spec.ts +++ b/packages/app/e2e/performance/timeline-stability/transition-matrix.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from "../../fixtures" +import { expect, test } from "@playwright/test" import { defineVisualRegions, reportVisualStability, diff --git a/packages/app/e2e/regression/cross-server-tab-close.spec.ts b/packages/app/e2e/regression/cross-server-tab-close.spec.ts index 32f318b7bc4..159b5a50676 100644 --- a/packages/app/e2e/regression/cross-server-tab-close.spec.ts +++ b/packages/app/e2e/regression/cross-server-tab-close.spec.ts @@ -1,4 +1,4 @@ -import { expect, test, type Page, type Route } from "../fixtures" +import { expect, test, type Page, type Route } from "@playwright/test" import { base64Encode } from "@opencode-ai/core/util/encode" const serverA = "http://127.0.0.1:4096" @@ -45,9 +45,7 @@ test("closing the active server's last tab opens the remaining server tab", asyn ).toBe(true) }) -test("legacy session routes preserve an existing tab's server", async ({ page, errorToasts }) => { - // The legacy route bootstraps against the default server before redirecting to the persisted tab server. - errorToasts.allow(/server-b.*InvalidDirectory/) +test("legacy session routes preserve an existing tab's server", async ({ page }) => { await mockServers(page, []) await page.addInitScript( ({ serverB, sessionB }) => { @@ -83,12 +81,11 @@ async function mockServers(page: Page, requests: string[]) { const url = new URL(route.request().url()) if (url.origin !== serverA && url.origin !== serverB) return route.fallback() requests.push(url.toString()) - const directory = url.searchParams.get("directory") const current = url.origin === serverA ? sessionA : sessionB + const directory = url.searchParams.get("directory") if (directory && directory !== current.directory) return json(route, { name: "InvalidDirectory" }, 500) if (url.pathname === "/global/event" || url.pathname === "/event") return sse(route) if (url.pathname === "/global/health") return json(route, { healthy: true }) - if (url.pathname === "/session/status") return json(route, {}) if (url.pathname === "/session") return json(route, [current]) if (url.pathname === `/session/${current.id}`) return json(route, current) if (/^\/session\/[^/]+$/.test(url.pathname)) return json(route, { name: "NotFoundError" }, 404) diff --git a/packages/app/e2e/regression/error-toast-guard.spec.ts b/packages/app/e2e/regression/error-toast-guard.spec.ts deleted file mode 100644 index c4f8d648132..00000000000 --- a/packages/app/e2e/regression/error-toast-guard.spec.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { glob, readFile } from "node:fs/promises" -import path from "node:path" -import { fileURLToPath } from "node:url" -import { expect, test } from "../fixtures" - -test("requires every browser spec to use the error toast fixture", async () => { - const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..") - const files = await Array.fromAsync(glob("**/*.spec.{ts,tsx}", { cwd: root })) - const unguarded = ( - await Promise.all( - files.map(async (file) => { - const source = await readFile(path.join(root, file), "utf8") - if (/from\s+["'](?:\.\.\/)+fixtures["']/.test(source)) return - if (/from\s+["']\.\.\/benchmark["']/.test(source)) return - return file - }), - ) - ).filter((file): file is string => !!file) - - expect(unguarded).toEqual([]) -}) - -test("allows an explicitly expected error toast", async ({ page, errorToasts }) => { - errorToasts.expect("Expected request failure") - - await page.goto( - `data:text/html,${encodeURIComponent(` -
-
Request failed
-
Expected request failure
-
- `)}`, - ) - - await expect(page.locator('[data-component="toast-v2"]')).toBeVisible() -}) - -test("fails immediately on an unexpected error toast", async ({ page }) => { - test.fail() - - await page.goto( - `data:text/html,${encodeURIComponent(` -
-
Request failed
-
Unexpected request failure
-
- `)}`, - ) - await page.waitForTimeout(10_000) -}) diff --git a/packages/app/e2e/regression/prompt-thinking-level.spec.ts b/packages/app/e2e/regression/prompt-thinking-level.spec.ts index 011dcb89c9a..4219699f28c 100644 --- a/packages/app/e2e/regression/prompt-thinking-level.spec.ts +++ b/packages/app/e2e/regression/prompt-thinking-level.spec.ts @@ -1,4 +1,4 @@ -import { expect, test, type Page } from "../fixtures" +import { expect, test, type Page } from "@playwright/test" import { base64Encode } from "@opencode-ai/core/util/encode" import { mockOpenCodeServer } from "../utils/mock-server" import { expectAppVisible } from "../utils/waits" diff --git a/packages/app/e2e/regression/remote-tab-busy.spec.ts b/packages/app/e2e/regression/remote-tab-busy.spec.ts index 7e44d9d69d6..119fc7ee2da 100644 --- a/packages/app/e2e/regression/remote-tab-busy.spec.ts +++ b/packages/app/e2e/regression/remote-tab-busy.spec.ts @@ -1,4 +1,4 @@ -import { expect, test, type Page, type Route } from "../fixtures" +import { expect, test, type Page, type Route } from "@playwright/test" import { base64Encode } from "@opencode-ai/core/util/encode" const serverA = "http://127.0.0.1:4096" diff --git a/packages/app/e2e/regression/review-image-flash.spec.ts b/packages/app/e2e/regression/review-image-flash.spec.ts index e76b5c3f8c0..dd200384d49 100644 --- a/packages/app/e2e/regression/review-image-flash.spec.ts +++ b/packages/app/e2e/regression/review-image-flash.spec.ts @@ -1,4 +1,4 @@ -import { expect, test, type Page } from "../fixtures" +import { expect, test, type Page } from "@playwright/test" import { base64Encode } from "@opencode-ai/core/util/encode" import { mockOpenCodeServer } from "../utils/mock-server" import { expectAppVisible, expectSessionTitle } from "../utils/waits" diff --git a/packages/app/e2e/regression/review-line-comment.spec.ts b/packages/app/e2e/regression/review-line-comment.spec.ts index 41116131596..042f926c537 100644 --- a/packages/app/e2e/regression/review-line-comment.spec.ts +++ b/packages/app/e2e/regression/review-line-comment.spec.ts @@ -1,4 +1,4 @@ -import { expect, test, type Page } from "../fixtures" +import { expect, test, type Page } from "@playwright/test" import { base64Encode } from "@opencode-ai/core/util/encode" import { mockOpenCodeServer } from "../utils/mock-server" import { expectAppVisible, expectSessionTitle } from "../utils/waits" diff --git a/packages/app/e2e/regression/review-tab-switch.spec.ts b/packages/app/e2e/regression/review-tab-switch.spec.ts index 9993b2698bf..c2ea406c5ab 100644 --- a/packages/app/e2e/regression/review-tab-switch.spec.ts +++ b/packages/app/e2e/regression/review-tab-switch.spec.ts @@ -1,5 +1,5 @@ import { base64Encode } from "@opencode-ai/core/util/encode" -import { expect, test, type Page } from "../fixtures" +import { expect, test, type Page } from "@playwright/test" import { mockOpenCodeServer } from "../utils/mock-server" import { expectAppVisible, expectSessionTitle } from "../utils/waits" diff --git a/packages/app/e2e/regression/session-list-path-loading.spec.ts b/packages/app/e2e/regression/session-list-path-loading.spec.ts index 77375a5c55e..4a3855122a4 100644 --- a/packages/app/e2e/regression/session-list-path-loading.spec.ts +++ b/packages/app/e2e/regression/session-list-path-loading.spec.ts @@ -1,4 +1,4 @@ -import { test } from "../fixtures" +import { test } from "@playwright/test" import { fixture, pageMessages } from "../smoke/session-timeline.fixture" import { mockOpenCodeServer } from "../utils/mock-server" import { expectAppVisible } from "../utils/waits" diff --git a/packages/app/e2e/regression/session-timeline-accessibility.spec.ts b/packages/app/e2e/regression/session-timeline-accessibility.spec.ts index 1aa276079d4..598763c0225 100644 --- a/packages/app/e2e/regression/session-timeline-accessibility.spec.ts +++ b/packages/app/e2e/regression/session-timeline-accessibility.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from "../fixtures" +import { expect, test } from "@playwright/test" import { assistantMessage, setupTimeline, shell, userMessage } from "../performance/timeline-stability/fixture" test("space activates a focused timeline button instead of scrolling", async ({ page }) => { diff --git a/packages/app/e2e/regression/session-timeline-collapse-state.spec.ts b/packages/app/e2e/regression/session-timeline-collapse-state.spec.ts index f84042199bd..5b6e0b127b1 100644 --- a/packages/app/e2e/regression/session-timeline-collapse-state.spec.ts +++ b/packages/app/e2e/regression/session-timeline-collapse-state.spec.ts @@ -1,4 +1,4 @@ -import { expect, test, type Locator, type Page } from "../fixtures" +import { expect, test, type Locator, type Page } from "@playwright/test" import { mockOpenCodeServer } from "../utils/mock-server" import { expectAppVisible, expectSessionTitle } from "../utils/waits" diff --git a/packages/app/e2e/regression/session-timeline-context-resize.spec.ts b/packages/app/e2e/regression/session-timeline-context-resize.spec.ts index 99db4b779e5..a9a4738da92 100644 --- a/packages/app/e2e/regression/session-timeline-context-resize.spec.ts +++ b/packages/app/e2e/regression/session-timeline-context-resize.spec.ts @@ -1,4 +1,4 @@ -import { expect, test, type Page } from "../fixtures" +import { expect, test, type Page } from "@playwright/test" import { mockOpenCodeServer } from "../utils/mock-server" import { expectAppVisible, expectSessionTitle } from "../utils/waits" import { diff --git a/packages/app/e2e/regression/session-timeline-context-state.spec.ts b/packages/app/e2e/regression/session-timeline-context-state.spec.ts index 96ed413327d..37878325e14 100644 --- a/packages/app/e2e/regression/session-timeline-context-state.spec.ts +++ b/packages/app/e2e/regression/session-timeline-context-state.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from "../fixtures" +import { expect, test } from "@playwright/test" import { assistantMessage, partUpdated, diff --git a/packages/app/e2e/regression/session-timeline-file-projection.spec.ts b/packages/app/e2e/regression/session-timeline-file-projection.spec.ts index 55e35d4f21d..f07da121c66 100644 --- a/packages/app/e2e/regression/session-timeline-file-projection.spec.ts +++ b/packages/app/e2e/regression/session-timeline-file-projection.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from "../fixtures" +import { expect, test } from "@playwright/test" import { assistantMessage, setupTimeline, toolPart, userMessage } from "../performance/timeline-stability/fixture" test("renders completed write content", async ({ page }) => { diff --git a/packages/app/e2e/regression/session-timeline-file-state.spec.ts b/packages/app/e2e/regression/session-timeline-file-state.spec.ts index 8ae8e2b2bcf..cb228c13c7a 100644 --- a/packages/app/e2e/regression/session-timeline-file-state.spec.ts +++ b/packages/app/e2e/regression/session-timeline-file-state.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from "../fixtures" +import { expect, test } from "@playwright/test" import { assistantMessage, partUpdated, diff --git a/packages/app/e2e/regression/session-timeline-history-root.spec.ts b/packages/app/e2e/regression/session-timeline-history-root.spec.ts index 1d6c8aaa9c9..15375cafed5 100644 --- a/packages/app/e2e/regression/session-timeline-history-root.spec.ts +++ b/packages/app/e2e/regression/session-timeline-history-root.spec.ts @@ -1,5 +1,5 @@ import { base64Encode } from "@opencode-ai/core/util/encode" -import { expect, test, type Page } from "../fixtures" +import { expect, test, type Page } from "@playwright/test" import { assistantMessage, directory, diff --git a/packages/app/e2e/regression/session-timeline-lifecycle-state.spec.ts b/packages/app/e2e/regression/session-timeline-lifecycle-state.spec.ts index b55941fcb67..3e2b171bca0 100644 --- a/packages/app/e2e/regression/session-timeline-lifecycle-state.spec.ts +++ b/packages/app/e2e/regression/session-timeline-lifecycle-state.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from "../fixtures" +import { expect, test } from "@playwright/test" import { assistantMessage, completedAssistantInfo, diff --git a/packages/app/e2e/regression/session-timeline-locale-projection.spec.ts b/packages/app/e2e/regression/session-timeline-locale-projection.spec.ts index d9d250ef88d..3901f8865e3 100644 --- a/packages/app/e2e/regression/session-timeline-locale-projection.spec.ts +++ b/packages/app/e2e/regression/session-timeline-locale-projection.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from "../fixtures" +import { expect, test } from "@playwright/test" import { assistantMessage, setupTimeline, toolPart, userMessage } from "../performance/timeline-stability/fixture" for (const profile of [ diff --git a/packages/app/e2e/regression/session-timeline-projection.spec.ts b/packages/app/e2e/regression/session-timeline-projection.spec.ts index 4c7a584c6c3..9fd2ca8d0b6 100644 --- a/packages/app/e2e/regression/session-timeline-projection.spec.ts +++ b/packages/app/e2e/regression/session-timeline-projection.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from "../fixtures" +import { expect, test } from "@playwright/test" import { assistantMessage, setupTimeline, diff --git a/packages/app/e2e/regression/session-timeline-reasoning-projection.spec.ts b/packages/app/e2e/regression/session-timeline-reasoning-projection.spec.ts index 483e65faf64..7c0864e5845 100644 --- a/packages/app/e2e/regression/session-timeline-reasoning-projection.spec.ts +++ b/packages/app/e2e/regression/session-timeline-reasoning-projection.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from "../fixtures" +import { expect, test } from "@playwright/test" import { assistantMessage, reasoningPart, diff --git a/packages/app/e2e/regression/session-timeline-reducer-projection.spec.ts b/packages/app/e2e/regression/session-timeline-reducer-projection.spec.ts index 5410b2767b6..ad35eef601c 100644 --- a/packages/app/e2e/regression/session-timeline-reducer-projection.spec.ts +++ b/packages/app/e2e/regression/session-timeline-reducer-projection.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from "../fixtures" +import { expect, test } from "@playwright/test" import { assistantMessage, completedAssistantInfo, diff --git a/packages/app/e2e/regression/session-timeline-tool-projection.spec.ts b/packages/app/e2e/regression/session-timeline-tool-projection.spec.ts index e5813123ed8..99f1acf270b 100644 --- a/packages/app/e2e/regression/session-timeline-tool-projection.spec.ts +++ b/packages/app/e2e/regression/session-timeline-tool-projection.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from "../fixtures" +import { expect, test } from "@playwright/test" import { assistantMessage, partUpdated, diff --git a/packages/app/e2e/regression/session-timeline-tool-state.spec.ts b/packages/app/e2e/regression/session-timeline-tool-state.spec.ts index 8d8af6f37da..63646f4454c 100644 --- a/packages/app/e2e/regression/session-timeline-tool-state.spec.ts +++ b/packages/app/e2e/regression/session-timeline-tool-state.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from "../fixtures" +import { expect, test } from "@playwright/test" import { assistantMessage, partUpdated, diff --git a/packages/app/e2e/regression/session-timeline-transport.spec.ts b/packages/app/e2e/regression/session-timeline-transport.spec.ts index 2b05db85f98..850e966d0b0 100644 --- a/packages/app/e2e/regression/session-timeline-transport.spec.ts +++ b/packages/app/e2e/regression/session-timeline-transport.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from "../fixtures" +import { expect, test } from "@playwright/test" import { assistantMessage, partUpdated, diff --git a/packages/app/e2e/regression/session-todo-dock-navigation.spec.ts b/packages/app/e2e/regression/session-todo-dock-navigation.spec.ts index 1e574de9616..603c411d551 100644 --- a/packages/app/e2e/regression/session-todo-dock-navigation.spec.ts +++ b/packages/app/e2e/regression/session-todo-dock-navigation.spec.ts @@ -1,5 +1,5 @@ import { base64Encode } from "@opencode-ai/core/util/encode" -import { expect, test, type Page } from "../fixtures" +import { expect, test, type Page } from "@playwright/test" import { mockOpenCodeServer } from "../utils/mock-server" import { expectSessionTitle } from "../utils/waits" diff --git a/packages/app/e2e/regression/subagent-child-navigation.spec.ts b/packages/app/e2e/regression/subagent-child-navigation.spec.ts index 388b3bf0e1c..19d2c29af02 100644 --- a/packages/app/e2e/regression/subagent-child-navigation.spec.ts +++ b/packages/app/e2e/regression/subagent-child-navigation.spec.ts @@ -1,5 +1,5 @@ import { base64Encode } from "@opencode-ai/core/util/encode" -import { expect, test, type Page } from "../fixtures" +import { expect, test, type Page } from "@playwright/test" import { mockOpenCodeServer } from "../utils/mock-server" import { expectSessionTitle } from "../utils/waits" diff --git a/packages/app/e2e/regression/tab-navigate-mousedown.spec.ts b/packages/app/e2e/regression/tab-navigate-mousedown.spec.ts index 309d11610a8..94afbc9a9d6 100644 --- a/packages/app/e2e/regression/tab-navigate-mousedown.spec.ts +++ b/packages/app/e2e/regression/tab-navigate-mousedown.spec.ts @@ -1,4 +1,4 @@ -import { expect, test, type Page, type Route } from "../fixtures" +import { expect, test, type Page, type Route } from "@playwright/test" import { base64Encode } from "@opencode-ai/core/util/encode" const server = "http://127.0.0.1:4096" @@ -58,7 +58,6 @@ async function mockServer(page: Page) { if (url.origin !== server) return route.fallback() if (url.pathname === "/global/event" || url.pathname === "/event") return sse(route) if (url.pathname === "/global/health") return json(route, { healthy: true }) - if (url.pathname === "/session/status") return json(route, {}) if (url.pathname === "/session") return json(route, sessions) const byId = sessions.find((item) => url.pathname === `/session/${item.id}`) if (byId) return json(route, byId) diff --git a/packages/app/e2e/regression/terminal-composer-focus.spec.ts b/packages/app/e2e/regression/terminal-composer-focus.spec.ts index 1015dc0f75a..2c2801d4b5b 100644 --- a/packages/app/e2e/regression/terminal-composer-focus.spec.ts +++ b/packages/app/e2e/regression/terminal-composer-focus.spec.ts @@ -1,5 +1,5 @@ import { base64Encode } from "@opencode-ai/core/util/encode" -import { expect, test } from "../fixtures" +import { expect, test } from "@playwright/test" import { mockOpenCodeServer } from "../utils/mock-server" import { expectSessionTitle } from "../utils/waits" diff --git a/packages/app/e2e/regression/terminal-hidden.spec.ts b/packages/app/e2e/regression/terminal-hidden.spec.ts index 31482da478d..73821580af0 100644 --- a/packages/app/e2e/regression/terminal-hidden.spec.ts +++ b/packages/app/e2e/regression/terminal-hidden.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from "../fixtures" +import { expect, test } from "@playwright/test" import { mockOpenCodeServer } from "../utils/mock-server" import { expectSessionTitle } from "../utils/waits" diff --git a/packages/app/e2e/regression/terminal-tab-switch.spec.ts b/packages/app/e2e/regression/terminal-tab-switch.spec.ts index a84dcca9a90..cbb72958ad3 100644 --- a/packages/app/e2e/regression/terminal-tab-switch.spec.ts +++ b/packages/app/e2e/regression/terminal-tab-switch.spec.ts @@ -1,5 +1,5 @@ import { base64Encode } from "@opencode-ai/core/util/encode" -import { expect, test, type Page } from "../fixtures" +import { expect, test, type Page } from "@playwright/test" import { mockOpenCodeServer } from "../utils/mock-server" import { expectSessionTitle } from "../utils/waits" diff --git a/packages/app/e2e/smoke/session-timeline.spec.ts b/packages/app/e2e/smoke/session-timeline.spec.ts index e44b25ae823..a73cc0ccdd7 100644 --- a/packages/app/e2e/smoke/session-timeline.spec.ts +++ b/packages/app/e2e/smoke/session-timeline.spec.ts @@ -1,4 +1,4 @@ -import { expect, test, type Page } from "../fixtures" +import { expect, test, type Page } from "@playwright/test" import { base64Encode } from "@opencode-ai/core/util/encode" import { fixture, pageMessages } from "./session-timeline.fixture" import { trackPageErrors, expectNoSmokeErrors } from "../utils/errors" diff --git a/packages/app/e2e/tsconfig.json b/packages/app/e2e/tsconfig.json index 191295258cd..53aacbda02e 100644 --- a/packages/app/e2e/tsconfig.json +++ b/packages/app/e2e/tsconfig.json @@ -6,14 +6,11 @@ "types": ["node", "bun"] }, "include": [ - "./fixtures.ts", "./performance/timeline-stability/**/*.spec.ts", "./performance/timeline-stability/fixture.test.ts", "./performance/timeline-stability/fixture.ts", "./performance/unit/visual-stability.test.ts", "./regression/new-session-panel-corner.spec.ts", - "./regression/error-toast-guard.spec.ts", - "./regression/session-request-docks.spec.ts", "./regression/session-timeline-context-resize.spec.ts", "./utils/**/*.ts" ] diff --git a/packages/app/e2e/utils/mock-server.ts b/packages/app/e2e/utils/mock-server.ts index 26e5a48302c..e1946b8fba0 100644 --- a/packages/app/e2e/utils/mock-server.ts +++ b/packages/app/e2e/utils/mock-server.ts @@ -20,7 +20,6 @@ export interface MockServerConfig { todos?: (sessionID: string) => unknown[] permissions?: unknown[] | (() => unknown[]) questions?: unknown[] | (() => unknown[]) - onQuestionReply?: (input: { requestID: string; answers?: string[][] }) => unknown | Promise fileList?: (path: string) => unknown | Promise fileContent?: (path: string) => unknown | Promise findFiles?: (input: { query: string; dirs?: string; limit?: number }) => unknown @@ -64,7 +63,8 @@ export async function mockOpenCodeServer(page: Page, config: MockServerConfig) { return json(route, typeof config.questions === "function" ? config.questions() : (config.questions ?? [])) if (path === "/session/status") return json(route, config.sessionStatus ?? {}) if (path === "/vcs/diff" && config.vcsDiff) return json(route, config.vcsDiff) - if (path === "/file") return json(route, (await config.fileList?.(url.searchParams.get("path") ?? "")) ?? []) + if (path === "/file" && config.fileList) + return json(route, await config.fileList(url.searchParams.get("path") ?? "")) if (path === "/file/content" && config.fileContent) return json(route, await config.fileContent(url.searchParams.get("path") ?? "")) if (path === "/find/file" && config.findFiles) @@ -110,18 +110,6 @@ export async function mockOpenCodeServer(page: Page, config: MockServerConfig) { if (todoMatch) return json(route, config.todos?.(todoMatch[1]!) ?? []) if (/^\/session\/[^/]+\/(children|diff)$/.test(path)) return json(route, []) - const permissionRespondMatch = path.match(/^\/session\/([^/]+)\/permissions\/([^/]+)$/) - if (permissionRespondMatch && route.request().method() === "POST") return json(route, true) - - const questionReplyMatch = path.match(/^\/question\/([^/]+)\/reply$/) - if (questionReplyMatch && route.request().method() === "POST") { - const body = route.request().postDataJSON() as { answers?: string[][] } - return json( - route, - (await config.onQuestionReply?.({ requestID: questionReplyMatch[1]!, answers: body.answers })) ?? true, - ) - } - const messagesMatch = path.match(/^\/session\/([^/]+)\/message$/) if (messagesMatch) { const token = url.searchParams.get("before") ?? undefined diff --git a/packages/app/e2e/utils/sse-transport.ts b/packages/app/e2e/utils/sse-transport.ts index 55420485f39..186962998d1 100644 --- a/packages/app/e2e/utils/sse-transport.ts +++ b/packages/app/e2e/utils/sse-transport.ts @@ -162,7 +162,7 @@ export async function installSseTransport( const request = new Request(input, init) const url = new URL(request.url) if (url.origin !== server || (url.pathname !== "/global/event" && url.pathname !== "/event")) - return originalFetch(request) + return originalFetch(input, init) const id = ++nextConnectionID const record = { diff --git a/packages/app/src/components/dialog-custom-provider.tsx b/packages/app/src/components/dialog-custom-provider.tsx index 7bc8576739c..363a2e390a4 100644 --- a/packages/app/src/components/dialog-custom-provider.tsx +++ b/packages/app/src/components/dialog-custom-provider.tsx @@ -161,7 +161,7 @@ export function CustomProviderForm() { }, onError: (err) => { const message = err instanceof Error ? err.message : String(err) - showToast({ variant: "error", title: language.t("common.requestFailed"), description: message }) + showToast({ title: language.t("common.requestFailed"), description: message }) }, })) diff --git a/packages/app/src/components/dialog-fork.tsx b/packages/app/src/components/dialog-fork.tsx index 4d50832840f..601f03084ce 100644 --- a/packages/app/src/components/dialog-fork.tsx +++ b/packages/app/src/components/dialog-fork.tsx @@ -72,7 +72,7 @@ export const DialogFork: Component = () => { .client.session.fork({ sessionID, messageID: item.id }) .then((forked) => { if (!forked.data) { - showToast({ variant: "error", title: language.t("common.requestFailed") }) + showToast({ title: language.t("common.requestFailed") }) return } dialog.close() @@ -81,7 +81,7 @@ export const DialogFork: Component = () => { }) .catch((err: unknown) => { const message = err instanceof Error ? err.message : String(err) - showToast({ variant: "error", title: language.t("common.requestFailed"), description: message }) + showToast({ title: language.t("common.requestFailed"), description: message }) }) } diff --git a/packages/app/src/components/prompt-input/submit.ts b/packages/app/src/components/prompt-input/submit.ts index 38c3f6b1fa2..05d978a947c 100644 --- a/packages/app/src/components/prompt-input/submit.ts +++ b/packages/app/src/components/prompt-input/submit.ts @@ -327,7 +327,6 @@ export function createPromptSubmit(input: PromptSubmitInput) { .then((x) => x.data) .catch((err) => { showToast({ - variant: "error", title: language.t("prompt.toast.worktreeCreateFailed.title"), description: errorMessage(err), }) @@ -336,7 +335,6 @@ export function createPromptSubmit(input: PromptSubmitInput) { if (!createdWorktree?.directory) { showToast({ - variant: "error", title: language.t("prompt.toast.worktreeCreateFailed.title"), description: language.t("common.requestFailed"), }) @@ -368,7 +366,6 @@ export function createPromptSubmit(input: PromptSubmitInput) { .then((x) => x.data ?? undefined) .catch((err) => { showToast({ - variant: "error", title: language.t("prompt.toast.sessionCreateFailed.title"), description: errorMessage(err), }) @@ -388,7 +385,6 @@ export function createPromptSubmit(input: PromptSubmitInput) { } if (!session) { showToast({ - variant: "error", title: language.t("prompt.toast.promptSendFailed.title"), description: language.t("prompt.toast.promptSendFailed.description"), }) @@ -453,7 +449,6 @@ export function createPromptSubmit(input: PromptSubmitInput) { }) .catch((err) => { showToast({ - variant: "error", title: language.t("prompt.toast.shellSendFailed.title"), description: errorMessage(err), }) @@ -486,7 +481,6 @@ export function createPromptSubmit(input: PromptSubmitInput) { }) .catch((err) => { showToast({ - variant: "error", title: language.t("prompt.toast.commandSendFailed.title"), description: formatServerError(err, language.t, language.t("common.requestFailed")), }) @@ -582,7 +576,6 @@ export function createPromptSubmit(input: PromptSubmitInput) { sync().set("session_status", session.id, { type: "idle" }) } showToast({ - variant: "error", title: language.t("prompt.toast.promptSendFailed.title"), description: errorMessage(err), }) diff --git a/packages/app/src/components/settings-providers.tsx b/packages/app/src/components/settings-providers.tsx index 5bc90434ae4..bcd30edbc7d 100644 --- a/packages/app/src/components/settings-providers.tsx +++ b/packages/app/src/components/settings-providers.tsx @@ -113,7 +113,7 @@ const SettingsProvidersContent: Component<{ onBack?: () => void }> = (props) => .catch((err: unknown) => { serverSync().set("config", "disabled_providers", before) const message = err instanceof Error ? err.message : String(err) - showToast({ variant: "error", title: language.t("common.requestFailed"), description: message }) + showToast({ title: language.t("common.requestFailed"), description: message }) }) } @@ -138,7 +138,7 @@ const SettingsProvidersContent: Component<{ onBack?: () => void }> = (props) => }) .catch((err: unknown) => { const message = err instanceof Error ? err.message : String(err) - showToast({ variant: "error", title: language.t("common.requestFailed"), description: message }) + showToast({ title: language.t("common.requestFailed"), description: message }) }) } diff --git a/packages/app/src/components/settings-v2/providers.tsx b/packages/app/src/components/settings-v2/providers.tsx index 0d6b17981ca..f945fa33c64 100644 --- a/packages/app/src/components/settings-v2/providers.tsx +++ b/packages/app/src/components/settings-v2/providers.tsx @@ -107,7 +107,7 @@ export const SettingsProvidersV2: Component<{ onBack?: () => void }> = (props) = .catch((err: unknown) => { serverSync().set("config", "disabled_providers", before) const message = err instanceof Error ? err.message : String(err) - showToast({ variant: "error", title: language.t("common.requestFailed"), description: message }) + showToast({ title: language.t("common.requestFailed"), description: message }) }) } @@ -132,7 +132,7 @@ export const SettingsProvidersV2: Component<{ onBack?: () => void }> = (props) = }) .catch((err: unknown) => { const message = err instanceof Error ? err.message : String(err) - showToast({ variant: "error", title: language.t("common.requestFailed"), description: message }) + showToast({ title: language.t("common.requestFailed"), description: message }) }) } diff --git a/packages/app/src/components/titlebar-tab-nav.tsx b/packages/app/src/components/titlebar-tab-nav.tsx index 98985f019f0..a397046f9b3 100644 --- a/packages/app/src/components/titlebar-tab-nav.tsx +++ b/packages/app/src/components/titlebar-tab-nav.tsx @@ -145,7 +145,6 @@ export function TabNavItem(props: { } catch (err) { props.onTitleChangeFailed?.(original) showToast({ - variant: "error", title: language.t("common.requestFailed"), description: err instanceof Error ? err.message : undefined, }) diff --git a/packages/app/src/components/updater-action.ts b/packages/app/src/components/updater-action.ts index 25be6167b2d..9c13c542b41 100644 --- a/packages/app/src/components/updater-action.ts +++ b/packages/app/src/components/updater-action.ts @@ -44,7 +44,7 @@ export function useUpdaterAction() { }) } if (state?.status === "error") { - showToast({ variant: "error", title: language.t("common.requestFailed"), description: state.message }) + showToast({ title: language.t("common.requestFailed"), description: state.message }) } }, } diff --git a/packages/app/src/pages/home.tsx b/packages/app/src/pages/home.tsx index 8b53e0746b7..c8a89672dfc 100644 --- a/packages/app/src/pages/home.tsx +++ b/packages/app/src/pages/home.tsx @@ -518,7 +518,6 @@ export function NewHome() { ), onError: (error) => showToast({ - variant: "error", title: language.t("common.requestFailed"), description: errorMessage(error, language.t("common.requestFailed")), }), diff --git a/packages/app/src/pages/layout.tsx b/packages/app/src/pages/layout.tsx index ec32964e287..fd9d16b90ad 100644 --- a/packages/app/src/pages/layout.tsx +++ b/packages/app/src/pages/layout.tsx @@ -1391,7 +1391,6 @@ export default function LegacyLayout(props: ParentProps) { .then((x) => x.data) .catch((err) => { showToast({ - variant: "error", title: language.t("workspace.delete.failed.title"), description: errorMessage(err, language.t("common.requestFailed")), }) @@ -1465,7 +1464,6 @@ export default function LegacyLayout(props: ParentProps) { .then((x) => x.data) .catch((err) => { showToast({ - variant: "error", title: language.t("workspace.reset.failed.title"), description: errorMessage(err, language.t("common.requestFailed")), }) @@ -1828,7 +1826,6 @@ export default function LegacyLayout(props: ParentProps) { .then((x) => x.data) .catch((err) => { showToast({ - variant: "error", title: language.t("workspace.create.failed.title"), description: errorMessage(err, language.t("common.requestFailed")), }) diff --git a/packages/app/src/pages/session/composer/session-composer-state.ts b/packages/app/src/pages/session/composer/session-composer-state.ts index 7284f41bd84..45f5e4cb26f 100644 --- a/packages/app/src/pages/session/composer/session-composer-state.ts +++ b/packages/app/src/pages/session/composer/session-composer-state.ts @@ -85,7 +85,7 @@ export function createSessionComposerController(options?: { closeMs?: number | ( .client.permission.respond({ sessionID: perm.sessionID, permissionID: perm.id, response }) .catch((err: unknown) => { const description = err instanceof Error ? err.message : String(err) - showToast({ variant: "error", title: language.t("common.requestFailed"), description }) + showToast({ title: language.t("common.requestFailed"), description }) }) .finally(() => { setStore("responding", (id) => (id === perm.id ? undefined : id)) diff --git a/packages/app/src/pages/session/composer/session-question-dock.tsx b/packages/app/src/pages/session/composer/session-question-dock.tsx index b9ca648b521..445a9f47a08 100644 --- a/packages/app/src/pages/session/composer/session-question-dock.tsx +++ b/packages/app/src/pages/session/composer/session-question-dock.tsx @@ -219,7 +219,7 @@ export const SessionQuestionDock: Component<{ request: QuestionRequest; onSubmit const fail = (err: unknown) => { const message = err instanceof Error ? err.message : String(err) - showToast({ variant: "error", title: language.t("common.requestFailed"), description: message }) + showToast({ title: language.t("common.requestFailed"), description: message }) } const replyMutation = useMutation(() => ({ diff --git a/packages/app/src/pages/session/timeline/message-timeline.tsx b/packages/app/src/pages/session/timeline/message-timeline.tsx index fc5efec6e85..d6cc7be972d 100644 --- a/packages/app/src/pages/session/timeline/message-timeline.tsx +++ b/packages/app/src/pages/session/timeline/message-timeline.tsx @@ -15,12 +15,7 @@ import { createStore, produce } from "solid-js/store" import { Dynamic } from "solid-js/web" import { useNavigate } from "@solidjs/router" import { useMutation } from "@tanstack/solid-query" -import { - createVirtualizer, - defaultRangeExtractor, - elementScroll, - type VirtualItem, -} from "@tanstack/solid-virtual" +import { createVirtualizer, defaultRangeExtractor, elementScroll, type VirtualItem } from "@tanstack/solid-virtual" import { Accordion } from "@opencode-ai/ui/accordion" import { Button } from "@opencode-ai/ui/button" import { Card } from "@opencode-ai/ui/card" @@ -679,7 +674,6 @@ export function MessageTimeline(props: { }, onError: (err) => { showToast({ - variant: "error", title: language.t("common.requestFailed"), description: errorMessage(err), }) @@ -714,7 +708,6 @@ export function MessageTimeline(props: { ) .catch((err: unknown) => showToast({ - variant: "error", title: language.t("common.requestFailed"), description: errorMessage(err), }), @@ -827,7 +820,6 @@ export function MessageTimeline(props: { }) .catch((err) => { showToast({ - variant: "error", title: language.t("common.requestFailed"), description: errorMessage(err), }) @@ -847,7 +839,6 @@ export function MessageTimeline(props: { .then((x) => x.data) .catch((err) => { showToast({ - variant: "error", title: language.t("session.delete.failed.title"), description: errorMessage(err), }) diff --git a/packages/ui/src/v2/components/toast-v2.tsx b/packages/ui/src/v2/components/toast-v2.tsx index 03a96a7ea6b..d2dc1b3605f 100644 --- a/packages/ui/src/v2/components/toast-v2.tsx +++ b/packages/ui/src/v2/components/toast-v2.tsx @@ -90,7 +90,6 @@ export interface ToastV2Options { title?: string description?: string icon?: JSX.Element - variant?: "default" | "success" | "error" | "loading" duration?: number persistent?: boolean actions?: ToastV2Action[] @@ -101,12 +100,7 @@ export function showToastV2(options: ToastV2Options | string) { return toaster.show((props) => { const resolvedIcon = children(() => opts.icon) return ( - +
{resolvedIcon()}