From 328c6de80d51704c09bdd962df2ddf5b9d7c82ea Mon Sep 17 00:00:00 2001 From: Luke Parker <10430890+Hona@users.noreply.github.com> Date: Thu, 12 Mar 2026 17:35:26 +1000 Subject: Fix terminal e2e flakiness with a real terminal driver (#17144) --- packages/app/src/testing/terminal.ts | 64 ++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 packages/app/src/testing/terminal.ts (limited to 'packages/app/src/testing') diff --git a/packages/app/src/testing/terminal.ts b/packages/app/src/testing/terminal.ts new file mode 100644 index 000000000..aa1974404 --- /dev/null +++ b/packages/app/src/testing/terminal.ts @@ -0,0 +1,64 @@ +export const terminalAttr = "data-pty-id" + +export type TerminalProbeState = { + connected: boolean + rendered: string + settled: number +} + +export type E2EWindow = Window & { + __opencode_e2e?: { + terminal?: { + enabled?: boolean + terminals?: Record + } + } +} + +const seed = (): TerminalProbeState => ({ + connected: false, + rendered: "", + settled: 0, +}) + +const root = () => { + if (typeof window === "undefined") return + const state = (window as E2EWindow).__opencode_e2e?.terminal + if (!state?.enabled) return + state.terminals ??= {} + return state.terminals +} + +export const terminalProbe = (id: string) => { + const set = (next: Partial) => { + const terms = root() + if (!terms) return + terms[id] = { ...(terms[id] ?? seed()), ...next } + } + + return { + init() { + set(seed()) + }, + connect() { + set({ connected: true }) + }, + render(data: string) { + const terms = root() + if (!terms) return + const prev = terms[id] ?? seed() + terms[id] = { ...prev, rendered: prev.rendered + data } + }, + settle() { + const terms = root() + if (!terms) return + const prev = terms[id] ?? seed() + terms[id] = { ...prev, settled: prev.settled + 1 } + }, + drop() { + const terms = root() + if (!terms) return + delete terms[id] + }, + } +} -- cgit v1.2.3