From 96b1d8f639991e896bc8d31afe64d6309bf3ccd2 Mon Sep 17 00:00:00 2001 From: Luke Parker <10430890+Hona@users.noreply.github.com> Date: Fri, 13 Mar 2026 12:21:50 +1000 Subject: fix(app): stabilize todo dock e2e with composer probe (#17267) --- packages/app/src/testing/session-composer.ts | 84 ++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 packages/app/src/testing/session-composer.ts (limited to 'packages/app/src/testing') diff --git a/packages/app/src/testing/session-composer.ts b/packages/app/src/testing/session-composer.ts new file mode 100644 index 000000000..01c809e4c --- /dev/null +++ b/packages/app/src/testing/session-composer.ts @@ -0,0 +1,84 @@ +import type { Todo } from "@opencode-ai/sdk/v2" + +export const composerEvent = "opencode:e2e:composer" + +export type ComposerDriverState = { + live?: boolean + todos?: Array> +} + +export type ComposerProbeState = { + mounted: boolean + collapsed: boolean + hidden: boolean + count: number + states: Todo["status"][] +} + +type ComposerState = { + driver?: ComposerDriverState + probe?: ComposerProbeState +} + +export type ComposerWindow = Window & { + __opencode_e2e?: { + composer?: { + enabled?: boolean + sessions?: Record + } + } +} + +const clone = (driver: ComposerDriverState) => ({ + live: driver.live, + todos: driver.todos?.map((todo) => ({ ...todo })), +}) + +export const composerEnabled = () => { + if (typeof window === "undefined") return false + return (window as ComposerWindow).__opencode_e2e?.composer?.enabled === true +} + +const root = () => { + if (!composerEnabled()) return + const state = (window as ComposerWindow).__opencode_e2e?.composer + if (!state) return + state.sessions ??= {} + return state.sessions +} + +export const composerDriver = (sessionID?: string) => { + if (!sessionID) return + const state = root()?.[sessionID]?.driver + if (!state) return + return clone(state) +} + +export const composerProbe = (sessionID?: string) => { + const set = (next: ComposerProbeState) => { + if (!sessionID) return + const sessions = root() + if (!sessions) return + const prev = sessions[sessionID] ?? {} + sessions[sessionID] = { + ...prev, + probe: { + ...next, + states: [...next.states], + }, + } + } + + return { + set, + drop() { + set({ + mounted: false, + collapsed: false, + hidden: true, + count: 0, + states: [], + }) + }, + } +} -- cgit v1.2.3