diff --git a/src/main/daemon/terminal-daemon-errors.ts b/src/main/daemon/terminal-daemon-errors.ts new file mode 100644 index 00000000000..9955e7b3fc2 --- /dev/null +++ b/src/main/daemon/terminal-daemon-errors.ts @@ -0,0 +1,20 @@ +export class TerminalAttachCanceledError extends Error { + constructor(sessionId: string) { + super(`Attach canceled for session ${sessionId}`) + this.name = 'TerminalAttachCanceledError' + } +} + +export class DaemonProtocolError extends Error { + constructor(message: string) { + super(message) + this.name = 'DaemonProtocolError' + } +} + +export class SessionNotFoundError extends Error { + constructor(sessionId: string) { + super(`Session not found: ${sessionId}`) + this.name = 'SessionNotFoundError' + } +} diff --git a/src/main/daemon/types.ts b/src/main/daemon/types.ts index ef341ebac76..2083081d425 100644 --- a/src/main/daemon/types.ts +++ b/src/main/daemon/types.ts @@ -397,23 +397,8 @@ export const FRAME_MAX_PAYLOAD = 1024 * 1024 // 1MB export const NOTIFY_PREFIX = 'notify_' // ─── Error types ──────────────────────────────────────────────────── -export class TerminalAttachCanceledError extends Error { - constructor(sessionId: string) { - super(`Attach canceled for session ${sessionId}`) - this.name = 'TerminalAttachCanceledError' - } -} - -export class DaemonProtocolError extends Error { - constructor(message: string) { - super(message) - this.name = 'DaemonProtocolError' - } -} - -export class SessionNotFoundError extends Error { - constructor(sessionId: string) { - super(`Session not found: ${sessionId}`) - this.name = 'SessionNotFoundError' - } -} +export { + DaemonProtocolError, + SessionNotFoundError, + TerminalAttachCanceledError +} from './terminal-daemon-errors' diff --git a/tests/e2e/artificial-opencode-active-terminal-scroll.ts b/tests/e2e/artificial-opencode-active-terminal-scroll.ts index 1dda9f7d250..fd25082d9b4 100644 --- a/tests/e2e/artificial-opencode-active-terminal-scroll.ts +++ b/tests/e2e/artificial-opencode-active-terminal-scroll.ts @@ -258,3 +258,21 @@ export async function readActiveTerminalScrollState( } }, ptyId ?? null) } + +export async function waitForActiveTerminalViewportChange( + page: Page, + beforeViewportY: number, + timeoutMs: number, + ptyId?: string +): Promise { + const start = performance.now() + let state = await readActiveTerminalScrollState(page, ptyId) + while (performance.now() - start < timeoutMs) { + state = await readActiveTerminalScrollState(page, ptyId) + if (state.viewportY < beforeViewportY) { + break + } + await page.waitForTimeout(5) + } + return state +} diff --git a/tests/e2e/artificial-opencode-scroll-scenario.ts b/tests/e2e/artificial-opencode-scroll-scenario.ts index 0b9fcb8d7e2..7c7a3d87aa6 100644 --- a/tests/e2e/artificial-opencode-scroll-scenario.ts +++ b/tests/e2e/artificial-opencode-scroll-scenario.ts @@ -6,7 +6,7 @@ import { scrollActiveTerminalByApi, scrollActiveTerminalToBottom, scrollActiveTerminalViewportElement, - type ActiveTerminalScrollState + waitForActiveTerminalViewportChange } from './artificial-opencode-active-terminal-scroll' import { getResponsiveScrollPath, @@ -298,21 +298,3 @@ async function measureScrollAttempt( }) return after.viewportY } - -async function waitForActiveTerminalViewportChange( - page: Page, - beforeViewportY: number, - timeoutMs: number, - ptyId?: string -): Promise { - const start = performance.now() - let state = await readActiveTerminalScrollState(page, ptyId) - while (performance.now() - start < timeoutMs) { - state = await readActiveTerminalScrollState(page, ptyId) - if (state.viewportY < beforeViewportY) { - break - } - await page.waitForTimeout(5) - } - return state -}