summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src/pages/session
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-03-07 06:57:00 -0600
committerAdam <[email protected]>2026-03-07 06:57:00 -0600
commitba1edea0ab092a93772f5ad657809279f872f61e (patch)
tree9928731aac186e63d98c7aa6dbf3aa18a5bbb6b9 /packages/app/src/pages/session
parent73c9b685a7aedfecddb07c0fdfaa46914054d4d5 (diff)
downloadopencode-ba1edea0ab092a93772f5ad657809279f872f61e.tar.gz
opencode-ba1edea0ab092a93772f5ad657809279f872f61e.zip
fix(app): model sticks to session
Diffstat (limited to 'packages/app/src/pages/session')
-rw-r--r--packages/app/src/pages/session/session-model-helpers.test.ts83
-rw-r--r--packages/app/src/pages/session/session-model-helpers.ts33
2 files changed, 116 insertions, 0 deletions
diff --git a/packages/app/src/pages/session/session-model-helpers.test.ts b/packages/app/src/pages/session/session-model-helpers.test.ts
new file mode 100644
index 000000000..ae8700ccd
--- /dev/null
+++ b/packages/app/src/pages/session/session-model-helpers.test.ts
@@ -0,0 +1,83 @@
+import { describe, expect, test } from "bun:test"
+import type { UserMessage } from "@opencode-ai/sdk/v2"
+import { syncSessionModel } from "./session-model-helpers"
+
+const message = (input?: Partial<Pick<UserMessage, "agent" | "model" | "variant">>) =>
+ ({
+ id: "msg",
+ sessionID: "session",
+ role: "user",
+ time: { created: 1 },
+ agent: input?.agent ?? "build",
+ model: input?.model ?? { providerID: "anthropic", modelID: "claude-sonnet-4" },
+ variant: input?.variant,
+ }) as UserMessage
+
+describe("syncSessionModel", () => {
+ test("restores the last message model and variant", () => {
+ const calls: unknown[] = []
+
+ syncSessionModel(
+ {
+ agent: {
+ set(value) {
+ calls.push(["agent", value])
+ },
+ },
+ model: {
+ set(value) {
+ calls.push(["model", value])
+ },
+ current() {
+ return { id: "claude-sonnet-4", provider: { id: "anthropic" } }
+ },
+ variant: {
+ set(value) {
+ calls.push(["variant", value])
+ },
+ },
+ },
+ },
+ message({ variant: "high" }),
+ )
+
+ expect(calls).toEqual([
+ ["agent", "build"],
+ ["model", { providerID: "anthropic", modelID: "claude-sonnet-4" }],
+ ["variant", "high"],
+ ])
+ })
+
+ test("skips variant when the model falls back", () => {
+ const calls: unknown[] = []
+
+ syncSessionModel(
+ {
+ agent: {
+ set(value) {
+ calls.push(["agent", value])
+ },
+ },
+ model: {
+ set(value) {
+ calls.push(["model", value])
+ },
+ current() {
+ return { id: "gpt-5", provider: { id: "openai" } }
+ },
+ variant: {
+ set(value) {
+ calls.push(["variant", value])
+ },
+ },
+ },
+ },
+ message({ variant: "high" }),
+ )
+
+ expect(calls).toEqual([
+ ["agent", "build"],
+ ["model", { providerID: "anthropic", modelID: "claude-sonnet-4" }],
+ ])
+ })
+})
diff --git a/packages/app/src/pages/session/session-model-helpers.ts b/packages/app/src/pages/session/session-model-helpers.ts
new file mode 100644
index 000000000..ab181df59
--- /dev/null
+++ b/packages/app/src/pages/session/session-model-helpers.ts
@@ -0,0 +1,33 @@
+import type { UserMessage } from "@opencode-ai/sdk/v2"
+import { batch } from "solid-js"
+
+type Local = {
+ agent: {
+ set(name: string | undefined): void
+ }
+ model: {
+ set(model: UserMessage["model"] | undefined): void
+ current():
+ | {
+ id: string
+ provider: { id: string }
+ }
+ | undefined
+ variant: {
+ set(value: string | undefined): void
+ }
+ }
+}
+
+export const syncSessionModel = (local: Local, msg: UserMessage) => {
+ batch(() => {
+ local.agent.set(msg.agent)
+ local.model.set(msg.model)
+ })
+
+ const model = local.model.current()
+ if (!model) return
+ if (model.provider.id !== msg.model.providerID) return
+ if (model.id !== msg.model.modelID) return
+ local.model.variant.set(msg.variant)
+}