summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src/testing/session-composer.ts
blob: 01c809e4cb256fd81784f832938f8944779bc13a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import type { Todo } from "@opencode-ai/sdk/v2"

export const composerEvent = "opencode:e2e:composer"

export type ComposerDriverState = {
  live?: boolean
  todos?: Array<Pick<Todo, "content" | "status" | "priority">>
}

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<string, ComposerState>
    }
  }
}

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: [],
      })
    },
  }
}