summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src/testing
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-03-13 11:05:08 -0500
committerGitHub <[email protected]>2026-03-13 11:05:08 -0500
commit4ad8116ce37a0e77e7f3c0e9e4e1002bba05b15e (patch)
treeb7e5ed2b05aabb5ed5134520c4eb485c52eb5333 /packages/app/src/testing
parent5c7088338c07ad632834ebd4a87feb23d255fb8a (diff)
downloadopencode-4ad8116ce37a0e77e7f3c0e9e4e1002bba05b15e.tar.gz
opencode-4ad8116ce37a0e77e7f3c0e9e4e1002bba05b15e.zip
fix(app): model selection persist by session (#17348)
Diffstat (limited to 'packages/app/src/testing')
-rw-r--r--packages/app/src/testing/model-selection.ts80
-rw-r--r--packages/app/src/testing/terminal.ts6
2 files changed, 86 insertions, 0 deletions
diff --git a/packages/app/src/testing/model-selection.ts b/packages/app/src/testing/model-selection.ts
new file mode 100644
index 000000000..a5ea199ac
--- /dev/null
+++ b/packages/app/src/testing/model-selection.ts
@@ -0,0 +1,80 @@
+type ModelKey = {
+ providerID: string
+ modelID: string
+}
+
+type State = {
+ agent?: string
+ model?: ModelKey | null
+ variant?: string | null
+}
+
+export type ModelProbeState = {
+ dir?: string
+ sessionID?: string
+ last?: {
+ type: "agent" | "model" | "variant"
+ agent?: string
+ model?: ModelKey | null
+ variant?: string | null
+ }
+ agent?: string
+ model?: (ModelKey & { name?: string }) | undefined
+ variant?: string | null
+ selected?: string | null
+ configured?: string
+ pick?: State
+ base?: State
+ current?: string
+}
+
+export type ModelWindow = Window & {
+ __opencode_e2e?: {
+ model?: {
+ enabled?: boolean
+ current?: ModelProbeState
+ }
+ }
+}
+
+const clone = (state?: State) => {
+ if (!state) return undefined
+ return {
+ ...state,
+ model: state.model ? { ...state.model } : state.model,
+ }
+}
+
+export const modelEnabled = () => {
+ if (typeof window === "undefined") return false
+ return (window as ModelWindow).__opencode_e2e?.model?.enabled === true
+}
+
+const root = () => {
+ if (!modelEnabled()) return
+ return (window as ModelWindow).__opencode_e2e?.model
+}
+
+export const modelProbe = {
+ set(input: ModelProbeState) {
+ const state = root()
+ if (!state) return
+ state.current = {
+ ...input,
+ model: input.model ? { ...input.model } : undefined,
+ last: input.last
+ ? {
+ ...input.last,
+ model: input.last.model ? { ...input.last.model } : input.last.model,
+ }
+ : undefined,
+ pick: clone(input.pick),
+ base: clone(input.base),
+ }
+ },
+ clear() {
+ const state = root()
+ if (!state) return
+ state.current = undefined
+ },
+}
diff --git a/packages/app/src/testing/terminal.ts b/packages/app/src/testing/terminal.ts
index 4c179dee3..af1c33309 100644
--- a/packages/app/src/testing/terminal.ts
+++ b/packages/app/src/testing/terminal.ts
@@ -1,3 +1,5 @@
+import type { ModelProbeState } from "./model-selection"
+
export const terminalAttr = "data-pty-id"
export type TerminalProbeState = {
@@ -13,6 +15,10 @@ type TerminalProbeControl = {
export type E2EWindow = Window & {
__opencode_e2e?: {
+ model?: {
+ enabled?: boolean
+ current?: ModelProbeState
+ }
terminal?: {
enabled?: boolean
terminals?: Record<string, TerminalProbeState>