From 96035ffa1ffa419c19efd72b22e369db4c6abebe Mon Sep 17 00:00:00 2001 From: arkon Date: Wed, 10 Jun 2026 16:47:05 +0200 Subject: [PATCH] feat(settings): Claude Model picker for new sessions; Fable 5 in model dropdowns MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit App Settings → Claude CLI gains a Claude Model select (claudeModel setting) that pins the model for new Claude sessions via the case's .claude/settings.local.json, taking precedence over the 1M Opus toggle. Fable 5 added to the orchestrator default/phase model dropdowns. Co-Authored-By: Claude Fable 5 --- src/web/public/index.html | 20 +++++++++++++++++++- src/web/public/session-ui.js | 4 +++- src/web/public/settings-ui.js | 2 ++ src/web/schemas.ts | 2 ++ 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/web/public/index.html b/src/web/public/index.html index 0c96a5a2..94ea56e8 100644 --- a/src/web/public/index.html +++ b/src/web/public/index.html @@ -1148,13 +1148,26 @@ Enable experimental Agent Teams for all new Claude sessions (disabled by default) +
+ + + Model for new Claude sessions (pinned via the case's .claude/settings.local.json) — takes precedence over the 1M Opus toggle below +
- Use 1M token context window (model: opus[1m]) for all new sessions + Use 1M token context window (model: opus[1m]) for all new sessions — ignored when a Claude Model is selected above
@@ -1203,6 +1216,7 @@ Quick searches, codebase exploration
@@ -1236,6 +1251,7 @@ + Code writing, feature implementation @@ -1246,6 +1262,7 @@ + Writing and running tests @@ -1256,6 +1273,7 @@ + Code review, quality checks diff --git a/src/web/public/session-ui.js b/src/web/public/session-ui.js index 7a43a544..8063490e 100644 --- a/src/web/public/session-ui.js +++ b/src/web/public/session-ui.js @@ -354,8 +354,10 @@ Object.assign(CodemanApp.prototype, { const envOverrides = this.buildEnvOverrides(caseSettings, globalSettings); const hasEnvOverrides = Object.keys(envOverrides).length > 0; const effort = this.getEffortSetting(globalSettings); + // Explicit Claude Model choice (App Settings) wins over the legacy 1M Opus + // toggles; both flow as `modelOverride` → the case's .claude/settings.local.json const useOpus1m = caseSettings.opusContext1m || globalSettings.opusContext1mEnabled; - const modelOverride = useOpus1m ? 'opus[1m]' : ''; + const modelOverride = globalSettings.claudeModel || (useOpus1m ? 'opus[1m]' : ''); // Step 1: Create all sessions in parallel this.terminal.writeln(`\x1b[90m Creating ${tabCount} session(s)...\x1b[0m`); diff --git a/src/web/public/settings-ui.js b/src/web/public/settings-ui.js index 60f3600e..db3e47b5 100644 --- a/src/web/public/settings-ui.js +++ b/src/web/public/settings-ui.js @@ -345,6 +345,7 @@ Object.assign(CodemanApp.prototype, { settings.codexDangerouslyBypassApprovals ?? false; // Claude Permissions settings document.getElementById('appSettingsAgentTeams').checked = settings.agentTeamsEnabled ?? false; + document.getElementById('appSettingsClaudeModel').value = settings.claudeModel ?? ''; document.getElementById('appSettingsOpusContext1m').checked = settings.opusContext1mEnabled ?? false; document.getElementById('appSettingsThinkingEffort').value = settings.thinkingEffort ?? ''; // CPU Priority settings @@ -1349,6 +1350,7 @@ Object.assign(CodemanApp.prototype, { codexDangerouslyBypassApprovals: document.getElementById('appSettingsCodexDangerouslyBypassApprovals').checked, // Claude Permissions settings agentTeamsEnabled: document.getElementById('appSettingsAgentTeams').checked, + claudeModel: document.getElementById('appSettingsClaudeModel').value, opusContext1mEnabled: document.getElementById('appSettingsOpusContext1m').checked, thinkingEffort: document.getElementById('appSettingsThinkingEffort').value, // CPU Priority settings diff --git a/src/web/schemas.ts b/src/web/schemas.ts index a1e9c7c2..78f454cb 100644 --- a/src/web/schemas.ts +++ b/src/web/schemas.ts @@ -305,6 +305,8 @@ export const SettingsUpdateSchema = z tunnelEnabled: z.boolean().optional(), tabTwoRows: z.boolean().optional(), agentTeamsEnabled: z.boolean().optional(), + /** Model for new Claude sessions (e.g. "claude-fable-5[1m]", "opus[1m]"); takes precedence over opusContext1mEnabled */ + claudeModel: z.string().max(50).optional(), opusContext1mEnabled: z.boolean().optional(), thinkingEffort: z.string().max(20).optional(), // UI visibility