diff --git a/src/web/public/index.html b/src/web/public/index.html
index 50daf7c7..0a744e40 100644
--- a/src/web/public/index.html
+++ b/src/web/public/index.html
@@ -1095,6 +1095,18 @@
App Settings
Use 1M token context window (model: opus[1m]) for all new sessions
+
+
+
+ Set CLAUDE_CODE_EFFORT_LEVEL for all new sessions (default = no override)
+
diff --git a/src/web/public/keyboard-accessory.js b/src/web/public/keyboard-accessory.js
index e58aebba..4785eda7 100644
--- a/src/web/public/keyboard-accessory.js
+++ b/src/web/public/keyboard-accessory.js
@@ -92,6 +92,7 @@ const KeyboardAccessoryBar = {
+
@@ -125,7 +126,7 @@ const KeyboardAccessoryBar = {
this.handleAction(action, btn);
// Refocus terminal so keyboard stays open (tap blurs terminal → keyboard dismisses → toolbar shifts)
- const refocusActions = new Set(['scroll-up', 'scroll-down', 'arrow-left', 'arrow-right', 'tab', 'shift-tab', 'ctrl-o', 'opt-enter', 'esc']);
+ const refocusActions = new Set(['scroll-up', 'scroll-down', 'arrow-left', 'arrow-right', 'tab', 'shift-tab', 'ctrl-o', 'opt-enter', 'esc', 'effort-max']);
if (refocusActions.has(action) ||
((action === 'clear' || action === 'compact') && this._confirmAction)) {
if (typeof app !== 'undefined' && app.terminal) {
@@ -184,6 +185,9 @@ const KeyboardAccessoryBar = {
case 'ctrl-o':
this.sendKey('\x0f');
break;
+ case 'effort-max':
+ this.sendCommand('/effort max');
+ break;
case 'init':
this.sendCommand('/init');
break;
diff --git a/src/web/public/session-ui.js b/src/web/public/session-ui.js
index 86fccf80..dc1e79b1 100644
--- a/src/web/public/session-ui.js
+++ b/src/web/public/session-ui.js
@@ -323,6 +323,10 @@ Object.assign(CodemanApp.prototype, {
if (caseSettings.agentTeams || globalSettings.agentTeamsEnabled) {
envOverrides.CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS = '1';
}
+ const thinkingEffort = globalSettings.thinkingEffort;
+ if (thinkingEffort) {
+ envOverrides.CLAUDE_CODE_EFFORT_LEVEL = thinkingEffort;
+ }
const hasEnvOverrides = Object.keys(envOverrides).length > 0;
const useOpus1m = caseSettings.opusContext1m || globalSettings.opusContext1mEnabled;
const modelOverride = useOpus1m ? 'opus[1m]' : '';
diff --git a/src/web/public/settings-ui.js b/src/web/public/settings-ui.js
index 3ee0ab24..a29a52be 100644
--- a/src/web/public/settings-ui.js
+++ b/src/web/public/settings-ui.js
@@ -334,6 +334,7 @@ Object.assign(CodemanApp.prototype, {
// Claude Permissions settings
document.getElementById('appSettingsAgentTeams').checked = settings.agentTeamsEnabled ?? false;
document.getElementById('appSettingsOpusContext1m').checked = settings.opusContext1mEnabled ?? false;
+ document.getElementById('appSettingsThinkingEffort').value = settings.thinkingEffort ?? '';
// CPU Priority settings
const niceSettings = settings.nice || {};
document.getElementById('appSettingsNiceEnabled').checked = niceSettings.enabled ?? false;
@@ -1134,6 +1135,7 @@ Object.assign(CodemanApp.prototype, {
// Claude Permissions settings
agentTeamsEnabled: document.getElementById('appSettingsAgentTeams').checked,
opusContext1mEnabled: document.getElementById('appSettingsOpusContext1m').checked,
+ thinkingEffort: document.getElementById('appSettingsThinkingEffort').value,
// CPU Priority settings
nice: {
enabled: document.getElementById('appSettingsNiceEnabled').checked,
diff --git a/src/web/schemas.ts b/src/web/schemas.ts
index 87629d1e..bdc964f6 100644
--- a/src/web/schemas.ts
+++ b/src/web/schemas.ts
@@ -267,6 +267,7 @@ export const SettingsUpdateSchema = z
tunnelEnabled: z.boolean().optional(),
tabTwoRows: z.boolean().optional(),
agentTeamsEnabled: z.boolean().optional(),
+ thinkingEffort: z.string().max(20).optional(),
// UI visibility
showFontControls: z.boolean().optional(),
showSystemStats: z.boolean().optional(),