diff options
| author | Adam <[email protected]> | 2026-03-13 11:05:08 -0500 |
|---|---|---|
| committer | GitHub <[email protected]> | 2026-03-13 11:05:08 -0500 |
| commit | 4ad8116ce37a0e77e7f3c0e9e4e1002bba05b15e (patch) | |
| tree | b7e5ed2b05aabb5ed5134520c4eb485c52eb5333 /packages/app/src/testing | |
| parent | 5c7088338c07ad632834ebd4a87feb23d255fb8a (diff) | |
| download | opencode-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.ts | 80 | ||||
| -rw-r--r-- | packages/app/src/testing/terminal.ts | 6 |
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> |
