summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--packages/app/src/pages/session.tsx13
-rw-r--r--packages/app/src/pages/session/session-model-helpers.test.ts77
-rw-r--r--packages/app/src/pages/session/session-model-helpers.ts15
3 files changed, 103 insertions, 2 deletions
diff --git a/packages/app/src/pages/session.tsx b/packages/app/src/pages/session.tsx
index ba9b14c12..302541d5e 100644
--- a/packages/app/src/pages/session.tsx
+++ b/packages/app/src/pages/session.tsx
@@ -36,7 +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 { resetSessionModel, 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"
@@ -424,6 +424,17 @@ export default function Page() {
),
)
+ createEffect(
+ on(
+ () => params.id,
+ (id, prev) => {
+ if (id || !prev) return
+ resetSessionModel(local)
+ },
+ { defer: true },
+ ),
+ )
+
const [store, setStore] = createStore({
messageId: undefined as string | undefined,
mobileTab: "session" as "session" | "changes",
diff --git a/packages/app/src/pages/session/session-model-helpers.test.ts b/packages/app/src/pages/session/session-model-helpers.test.ts
index ae8700ccd..5f554dcd3 100644
--- a/packages/app/src/pages/session/session-model-helpers.test.ts
+++ b/packages/app/src/pages/session/session-model-helpers.test.ts
@@ -1,6 +1,6 @@
import { describe, expect, test } from "bun:test"
import type { UserMessage } from "@opencode-ai/sdk/v2"
-import { syncSessionModel } from "./session-model-helpers"
+import { resetSessionModel, syncSessionModel } from "./session-model-helpers"
const message = (input?: Partial<Pick<UserMessage, "agent" | "model" | "variant">>) =>
({
@@ -20,6 +20,9 @@ describe("syncSessionModel", () => {
syncSessionModel(
{
agent: {
+ current() {
+ return undefined
+ },
set(value) {
calls.push(["agent", value])
},
@@ -54,6 +57,9 @@ describe("syncSessionModel", () => {
syncSessionModel(
{
agent: {
+ current() {
+ return undefined
+ },
set(value) {
calls.push(["agent", value])
},
@@ -81,3 +87,72 @@ describe("syncSessionModel", () => {
])
})
})
+
+describe("resetSessionModel", () => {
+ test("restores the current agent defaults", () => {
+ const calls: unknown[] = []
+
+ resetSessionModel({
+ agent: {
+ current() {
+ return {
+ model: { providerID: "anthropic", modelID: "claude-sonnet-4" },
+ variant: "high",
+ }
+ },
+ set() {},
+ },
+ model: {
+ set(value) {
+ calls.push(["model", value])
+ },
+ current() {
+ return undefined
+ },
+ variant: {
+ set(value) {
+ calls.push(["variant", value])
+ },
+ },
+ },
+ })
+
+ expect(calls).toEqual([
+ ["model", { providerID: "anthropic", modelID: "claude-sonnet-4" }],
+ ["variant", "high"],
+ ])
+ })
+
+ test("clears the variant when the agent has none", () => {
+ const calls: unknown[] = []
+
+ resetSessionModel({
+ agent: {
+ current() {
+ return {
+ model: { providerID: "anthropic", modelID: "claude-sonnet-4" },
+ }
+ },
+ set() {},
+ },
+ model: {
+ set(value) {
+ calls.push(["model", value])
+ },
+ current() {
+ return undefined
+ },
+ variant: {
+ set(value) {
+ calls.push(["variant", value])
+ },
+ },
+ },
+ })
+
+ expect(calls).toEqual([
+ ["model", { providerID: "anthropic", modelID: "claude-sonnet-4" }],
+ ["variant", undefined],
+ ])
+ })
+})
diff --git a/packages/app/src/pages/session/session-model-helpers.ts b/packages/app/src/pages/session/session-model-helpers.ts
index ab181df59..7600f16d5 100644
--- a/packages/app/src/pages/session/session-model-helpers.ts
+++ b/packages/app/src/pages/session/session-model-helpers.ts
@@ -3,6 +3,12 @@ import { batch } from "solid-js"
type Local = {
agent: {
+ current():
+ | {
+ model?: UserMessage["model"]
+ variant?: string
+ }
+ | undefined
set(name: string | undefined): void
}
model: {
@@ -19,6 +25,15 @@ type Local = {
}
}
+export const resetSessionModel = (local: Local) => {
+ const agent = local.agent.current()
+ if (!agent) return
+ batch(() => {
+ local.model.set(agent.model)
+ local.model.variant.set(agent.variant)
+ })
+}
+
export const syncSessionModel = (local: Local, msg: UserMessage) => {
batch(() => {
local.agent.set(msg.agent)