From 403ce776c654aabc05394ef0c7f18815c8383548 Mon Sep 17 00:00:00 2001 From: Richard Solomou Date: Tue, 30 Jun 2026 21:34:32 +0300 Subject: [PATCH 1/5] feat(models): add Claude Sonnet 5 to available models Adds claude-sonnet-5 to the mobile model picker and grants it 1M context + effort support in the Claude adapter, mirroring Sonnet 4.6's capability profile (no xhigh). The desktop/web picker discovers it automatically from the gateway since it is not in BLOCKED_MODELS. Generated-By: PostHog Code Task-Id: f014a1c4-35e9-4468-abe8-7df96fe69786 --- apps/mobile/src/features/tasks/composer/options.ts | 6 ++++++ packages/agent/src/adapters/claude/session/models.test.ts | 7 +++++++ packages/agent/src/adapters/claude/session/models.ts | 2 ++ 3 files changed, 15 insertions(+) diff --git a/apps/mobile/src/features/tasks/composer/options.ts b/apps/mobile/src/features/tasks/composer/options.ts index 02f7c8d58e..b1de507a61 100644 --- a/apps/mobile/src/features/tasks/composer/options.ts +++ b/apps/mobile/src/features/tasks/composer/options.ts @@ -48,6 +48,12 @@ export const MODELS: ModelOption[] = [ description: "Most capable, slower", supportsReasoning: true, }, + { + value: "claude-sonnet-5", + label: "Claude Sonnet 5", + description: "Balanced, fast", + supportsReasoning: true, + }, { value: "claude-sonnet-4-6", label: "Claude Sonnet 4.6", diff --git a/packages/agent/src/adapters/claude/session/models.test.ts b/packages/agent/src/adapters/claude/session/models.test.ts index 3e0fe77ade..67874959fa 100644 --- a/packages/agent/src/adapters/claude/session/models.test.ts +++ b/packages/agent/src/adapters/claude/session/models.test.ts @@ -56,6 +56,13 @@ describe("model capability flags", () => { expect(supportsMcpInjection("claude-fable-5")).toBe(true); }); + it("flags claude-sonnet-5 like Sonnet 4.6 (1M context, effort, no xhigh)", () => { + expect(supports1MContext("claude-sonnet-5")).toBe(true); + expect(supportsEffort("claude-sonnet-5")).toBe(true); + expect(supportsXhighEffort("claude-sonnet-5")).toBe(false); + expect(supportsMcpInjection("claude-sonnet-5")).toBe(true); + }); + it("allows MCP injection for supported Claude models", () => { expect(supportsMcpInjection("claude-opus-4-7")).toBe(true); expect(supportsMcpInjection("claude-sonnet-4-6")).toBe(true); diff --git a/packages/agent/src/adapters/claude/session/models.ts b/packages/agent/src/adapters/claude/session/models.ts index 3338c60af0..39b0dc9b6c 100644 --- a/packages/agent/src/adapters/claude/session/models.ts +++ b/packages/agent/src/adapters/claude/session/models.ts @@ -21,6 +21,7 @@ const MODELS_WITH_1M_CONTEXT = new Set([ "claude-opus-4-7", "claude-opus-4-8", "claude-sonnet-4-6", + "claude-sonnet-5", "claude-fable-5", ]); @@ -32,6 +33,7 @@ const MODELS_WITH_EFFORT = new Set([ "claude-opus-4-7", "claude-opus-4-8", "claude-sonnet-4-6", + "claude-sonnet-5", "claude-fable-5", ]); From 3581d756c78a22b9b63abf1bdadbeeb279ffae39 Mon Sep 17 00:00:00 2001 From: Richard Solomou Date: Tue, 30 Jun 2026 21:48:37 +0300 Subject: [PATCH 2/5] test(ui): add Claude Sonnet 5 to PromptInput story mock Keeps the Storybook model-picker mock representative of the real gateway list now that claude-sonnet-5 is selectable. Generated-By: PostHog Code Task-Id: f014a1c4-35e9-4468-abe8-7df96fe69786 --- .../features/message-editor/components/PromptInput.stories.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/ui/src/features/message-editor/components/PromptInput.stories.tsx b/packages/ui/src/features/message-editor/components/PromptInput.stories.tsx index 4c45d989ad..043d3ebf98 100644 --- a/packages/ui/src/features/message-editor/components/PromptInput.stories.tsx +++ b/packages/ui/src/features/message-editor/components/PromptInput.stories.tsx @@ -24,6 +24,7 @@ const mockModelOption = { name: "Recommended", options: [ { value: "gpt-5.5", name: "gpt-5.5" }, + { value: "claude-sonnet-5", name: "Claude Sonnet 5" }, { value: "claude-sonnet-4-6", name: "Claude Sonnet 4.6" }, ], }, From 54973ef4321c26c8be4722b4f7c2e313f2f2c090 Mon Sep 17 00:00:00 2001 From: Charles Vien Date: Tue, 30 Jun 2026 11:48:23 -0700 Subject: [PATCH 3/5] add claude-sonnet-5 xhigh effort and tests --- packages/agent/src/adapters/claude/session/models.test.ts | 6 ++++++ packages/agent/src/adapters/claude/session/models.ts | 1 + packages/agent/src/gateway-models.test.ts | 1 + 3 files changed, 8 insertions(+) diff --git a/packages/agent/src/adapters/claude/session/models.test.ts b/packages/agent/src/adapters/claude/session/models.test.ts index 67874959fa..7c967e7254 100644 --- a/packages/agent/src/adapters/claude/session/models.test.ts +++ b/packages/agent/src/adapters/claude/session/models.test.ts @@ -26,6 +26,10 @@ describe("toSdkModelId", () => { expect(toSdkModelId("claude-fable-5")).toBe("claude-fable-5"); }); + it("passes claude-sonnet-5 through unchanged (no SDK alias)", () => { + expect(toSdkModelId("claude-sonnet-5")).toBe("claude-sonnet-5"); + }); + it("passes deprecated gateway IDs through unchanged", () => { expect(toSdkModelId("claude-opus-4-6")).toBe("claude-opus-4-6"); expect(toSdkModelId("claude-sonnet-4-5")).toBe("claude-sonnet-4-5"); @@ -84,12 +88,14 @@ describe("resolveEffortForModel", () => { ["claude-opus-4-8", undefined, "high"], ["claude-opus-4-7", undefined, "high"], ["claude-sonnet-4-6", undefined, "high"], + ["claude-sonnet-5", undefined, "high"], // Models without effort support stay unset (SDK disables thinking). ["claude-haiku-4-5", undefined, undefined], ["claude-opus-4-6", undefined, undefined], // An explicit choice is always honored, including on adaptive-only models. ["claude-opus-4-8", "low", "low"], ["claude-fable-5", "max", "max"], + ["claude-sonnet-5", "max", "max"], ] as const)( "resolveEffortForModel(%s, %s) === %s", (modelId, effort, expected) => { diff --git a/packages/agent/src/adapters/claude/session/models.ts b/packages/agent/src/adapters/claude/session/models.ts index 39b0dc9b6c..5fad1e729b 100644 --- a/packages/agent/src/adapters/claude/session/models.ts +++ b/packages/agent/src/adapters/claude/session/models.ts @@ -40,6 +40,7 @@ const MODELS_WITH_EFFORT = new Set([ const MODELS_WITH_XHIGH_EFFORT = new Set([ "claude-opus-4-7", "claude-opus-4-8", + "claude-sonnet-5", "claude-fable-5", ]); diff --git a/packages/agent/src/gateway-models.test.ts b/packages/agent/src/gateway-models.test.ts index cf51196027..b9a98833e1 100644 --- a/packages/agent/src/gateway-models.test.ts +++ b/packages/agent/src/gateway-models.test.ts @@ -79,6 +79,7 @@ describe("getClaudeModelRecency", () => { ["claude-sonnet-4-6", 4006], ["claude-opus-4-7", 4007], ["claude-opus-4-8", 4008], + ["claude-sonnet-5", 5000], ["claude-fable-5", 5000], ])("ranks %s by its embedded version (%i)", (modelId, rank) => { expect(getClaudeModelRecency(modelId)).toBe(rank); From cf9f0e88ae6d3662c38b8e9366ba50fd34cd1251 Mon Sep 17 00:00:00 2001 From: Charles Vien Date: Tue, 30 Jun 2026 11:48:23 -0700 Subject: [PATCH 4/5] add claude-sonnet-5 xhigh effort and tests --- .../adapters/claude/session/models.test.ts | 103 +++++++++++------- 1 file changed, 66 insertions(+), 37 deletions(-) diff --git a/packages/agent/src/adapters/claude/session/models.test.ts b/packages/agent/src/adapters/claude/session/models.test.ts index 7c967e7254..b56c9001cf 100644 --- a/packages/agent/src/adapters/claude/session/models.test.ts +++ b/packages/agent/src/adapters/claude/session/models.test.ts @@ -38,43 +38,72 @@ describe("toSdkModelId", () => { }); describe("model capability flags", () => { - it("flags 1M context support", () => { - expect(supports1MContext("claude-opus-4-6")).toBe(false); - expect(supports1MContext("claude-opus-4-7")).toBe(true); - expect(supports1MContext("claude-sonnet-4-6")).toBe(true); - expect(supports1MContext("claude-haiku-4-5")).toBe(false); - }); - - it("flags effort support and xhigh-effort support", () => { - expect(supportsEffort("claude-opus-4-5")).toBe(false); - expect(supportsEffort("claude-opus-4-6")).toBe(false); - expect(supportsXhighEffort("claude-opus-4-7")).toBe(true); - expect(supportsXhighEffort("claude-opus-4-6")).toBe(false); - expect(supportsEffort("claude-haiku-4-5")).toBe(false); - }); - - it("flags claude-fable-5 as a flagship model", () => { - expect(supports1MContext("claude-fable-5")).toBe(true); - expect(supportsEffort("claude-fable-5")).toBe(true); - expect(supportsXhighEffort("claude-fable-5")).toBe(true); - expect(supportsMcpInjection("claude-fable-5")).toBe(true); - }); - - it("flags claude-sonnet-5 like Sonnet 4.6 (1M context, effort, no xhigh)", () => { - expect(supports1MContext("claude-sonnet-5")).toBe(true); - expect(supportsEffort("claude-sonnet-5")).toBe(true); - expect(supportsXhighEffort("claude-sonnet-5")).toBe(false); - expect(supportsMcpInjection("claude-sonnet-5")).toBe(true); - }); - - it("allows MCP injection for supported Claude models", () => { - expect(supportsMcpInjection("claude-opus-4-7")).toBe(true); - expect(supportsMcpInjection("claude-sonnet-4-6")).toBe(true); - }); - - it("keeps deprecated Haiku sessions excluded from MCP injection", () => { - expect(supportsMcpInjection("claude-haiku-4-5")).toBe(false); - }); + it.each([ + { + modelId: "claude-opus-4-5", + oneMContext: false, + effort: false, + xhighEffort: false, + mcpInjection: true, + }, + { + modelId: "claude-opus-4-6", + oneMContext: false, + effort: false, + xhighEffort: false, + mcpInjection: true, + }, + { + modelId: "claude-opus-4-7", + oneMContext: true, + effort: true, + xhighEffort: true, + mcpInjection: true, + }, + { + modelId: "claude-opus-4-8", + oneMContext: true, + effort: true, + xhighEffort: true, + mcpInjection: true, + }, + { + modelId: "claude-sonnet-4-6", + oneMContext: true, + effort: true, + xhighEffort: false, + mcpInjection: true, + }, + { + modelId: "claude-sonnet-5", + oneMContext: true, + effort: true, + xhighEffort: true, + mcpInjection: true, + }, + { + modelId: "claude-fable-5", + oneMContext: true, + effort: true, + xhighEffort: true, + mcpInjection: true, + }, + { + modelId: "claude-haiku-4-5", + oneMContext: false, + effort: false, + xhighEffort: false, + mcpInjection: false, + }, + ])( + "$modelId capability flags", + ({ modelId, oneMContext, effort, xhighEffort, mcpInjection }) => { + expect(supports1MContext(modelId)).toBe(oneMContext); + expect(supportsEffort(modelId)).toBe(effort); + expect(supportsXhighEffort(modelId)).toBe(xhighEffort); + expect(supportsMcpInjection(modelId)).toBe(mcpInjection); + }, + ); }); describe("resolveEffortForModel", () => { From 7c2015cb022caca836e0f47e885892ded911de88 Mon Sep 17 00:00:00 2001 From: Charles Vien Date: Tue, 30 Jun 2026 12:03:31 -0700 Subject: [PATCH 5/5] Update mobile-build.yml --- .github/workflows/mobile-build.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/mobile-build.yml b/.github/workflows/mobile-build.yml index 7a269bcb1f..dd1f96cf86 100644 --- a/.github/workflows/mobile-build.yml +++ b/.github/workflows/mobile-build.yml @@ -89,4 +89,5 @@ jobs: with: platform: all profile: production - secrets: inherit + secrets: + EXPO_TOKEN: ${{ secrets.EXPO_TOKEN }}