64 lines
1.8 KiB
TypeScript
64 lines
1.8 KiB
TypeScript
import type { UserMessage } from "@opencode-ai/sdk/v2"
|
|
|
|
type Local = {
|
|
session: {
|
|
reset(): void
|
|
restore(msg: UserMessage): void
|
|
}
|
|
}
|
|
|
|
type ModelSelection = {
|
|
model: {
|
|
current(): { id: string; provider: { id: string } } | undefined
|
|
set(model: { providerID: string; modelID: string }): void
|
|
variant: {
|
|
current(): string | undefined
|
|
set(variant: string | undefined): void
|
|
}
|
|
}
|
|
}
|
|
|
|
type PromptState = {
|
|
model: {
|
|
current(): { providerID: string; modelID: string; variant?: string | null } | undefined
|
|
set(model: { providerID: string; modelID: string; variant?: string | null }): void
|
|
}
|
|
}
|
|
|
|
export const resetSessionModel = (local: Local) => {
|
|
local.session.reset()
|
|
}
|
|
|
|
export const syncSessionModel = (local: Local, msg: UserMessage) => {
|
|
local.session.restore(msg)
|
|
}
|
|
|
|
export const syncPromptModel = (local: ModelSelection, prompt: PromptState) => {
|
|
const model = local.model.current()
|
|
if (!model) return
|
|
const next = {
|
|
providerID: model.provider.id,
|
|
modelID: model.id,
|
|
variant: local.model.variant.current(),
|
|
}
|
|
const current = prompt.model.current()
|
|
if (current?.providerID === next.providerID && current.modelID === next.modelID && current.variant === next.variant)
|
|
return
|
|
prompt.model.set(next)
|
|
}
|
|
|
|
export const restorePromptModel = (local: ModelSelection, prompt: PromptState) => {
|
|
const model = prompt.model.current()
|
|
if (!model) return false
|
|
const current = local.model.current()
|
|
if (
|
|
current?.provider.id === model.providerID &&
|
|
current.id === model.modelID &&
|
|
local.model.variant.current() === (model.variant ?? undefined)
|
|
)
|
|
return true
|
|
local.model.set({ providerID: model.providerID, modelID: model.modelID })
|
|
local.model.variant.set(model.variant ?? undefined)
|
|
return true
|
|
}
|