summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src/pages
diff options
context:
space:
mode:
Diffstat (limited to 'packages/app/src/pages')
-rw-r--r--packages/app/src/pages/session.tsx7
-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
3 files changed, 118 insertions, 5 deletions
diff --git a/packages/app/src/pages/session.tsx b/packages/app/src/pages/session.tsx
index cba49f5fb..ba9b14c12 100644
--- a/packages/app/src/pages/session.tsx
+++ b/packages/app/src/pages/session.tsx
@@ -36,6 +36,7 @@ import { createSessionComposerState, SessionComposerRegion } from "@/pages/sessi
import { createOpenReviewFile, createSizing } from "@/pages/session/helpers"
import { MessageTimeline } from "@/pages/session/message-timeline"
import { type DiffStyle, SessionReviewTab, type SessionReviewTabProps } from "@/pages/session/review-tab"
+import { syncSessionModel } from "@/pages/session/session-model-helpers"
import { createScrollSpy } from "@/pages/session/scroll-spy"
import { SessionMobileTabs } from "@/pages/session/session-mobile-tabs"
import { SessionSidePanel } from "@/pages/session/session-side-panel"
@@ -418,11 +419,7 @@ export default function Page() {
() => {
const msg = lastUserMessage()
if (!msg) return
- if (msg.agent) {
- local.agent.set(msg.agent)
- if (local.agent.current()?.model) return
- }
- if (msg.model) local.model.set(msg.model)
+ syncSessionModel(local, msg)
},
),
)
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)
+}