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