feat: expose effort level setting in UI (#269)

Adds `--effort <level>` CLI flag support with a dropdown selector in the config sidebar. Valid options are low, medium, high, xhigh (Opus 4.7 only), and max.
This commit is contained in:
2026-05-06 13:37:13 -07:00
committed by Naomi Carrigan
parent bbbddaceaa
commit 3f57937d54
12 changed files with 67 additions and 0 deletions
+2
View File
@@ -77,6 +77,7 @@ async function changeDirectory(path: string): Promise<void> {
bare_mode: config.bare_mode ?? false,
show_clear_context_on_plan_accept: config.show_clear_context_on_plan_accept ?? true,
custom_model_option: config.custom_model_option || null,
effort_level: config.effort_level || null,
},
});
@@ -164,6 +165,7 @@ async function startNewConversation(): Promise<void> {
bare_mode: config.bare_mode ?? false,
show_clear_context_on_plan_accept: config.show_clear_context_on_plan_accept ?? true,
custom_model_option: config.custom_model_option || null,
effort_level: config.effort_level || null,
},
});
+24
View File
@@ -78,6 +78,7 @@
task_loop_auto_commit: false,
task_loop_commit_prefix: "feat",
task_loop_include_summary: false,
effort_level: null,
});
let showCustomThemeEditor = $state(false);
@@ -716,6 +717,29 @@
</p>
</div>
<!-- Effort Level -->
<div class="mb-4">
<label class="block text-sm text-[var(--text-primary)] mb-1" for="effort-level"
>Effort level</label
>
<select
id="effort-level"
bind:value={config.effort_level}
class="w-full px-3 py-2 rounded border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] text-sm focus:outline-none focus:ring-1 focus:ring-[var(--accent-primary)]"
>
<option value={null}>Default (CLI decides)</option>
<option value="low">Low</option>
<option value="medium">Medium</option>
<option value="high">High</option>
<option value="xhigh">Extra High (Opus 4.7 only)</option>
<option value="max">Max</option>
</select>
<p class="text-xs text-[var(--text-tertiary)] mt-1">
Passes <code class="font-mono">--effort</code> to tune speed vs. intelligence. Requires Claude
Code v2.1.111+.
</p>
</div>
<!-- Bare Mode -->
<div class="mb-4">
<label class="flex items-center gap-3 cursor-pointer">
@@ -78,6 +78,7 @@
bare_mode: config.bare_mode ?? false,
show_clear_context_on_plan_accept: config.show_clear_context_on_plan_accept ?? true,
custom_model_option: config.custom_model_option || null,
effort_level: config.effort_level || null,
},
});
+1
View File
@@ -412,6 +412,7 @@ User: ${formattedMessage}`;
bare_mode: config.bare_mode ?? false,
show_clear_context_on_plan_accept: config.show_clear_context_on_plan_accept ?? true,
custom_model_option: config.custom_model_option || null,
effort_level: config.effort_level || null,
},
});
@@ -99,6 +99,7 @@
bare_mode: config.bare_mode ?? false,
show_clear_context_on_plan_accept: config.show_clear_context_on_plan_accept ?? true,
custom_model_option: config.custom_model_option || null,
effort_level: config.effort_level || null,
},
});
+3
View File
@@ -97,6 +97,7 @@
bare_mode: false,
show_clear_context_on_plan_accept: true,
custom_model_option: null,
effort_level: null,
});
let streamerModeActive = $state(false);
@@ -189,6 +190,7 @@
show_clear_context_on_plan_accept:
currentConfig.show_clear_context_on_plan_accept ?? true,
custom_model_option: currentConfig.custom_model_option || null,
effort_level: currentConfig.effort_level || null,
},
});
@@ -357,6 +359,7 @@
show_clear_context_on_plan_accept:
currentConfig.show_clear_context_on_plan_accept ?? true,
custom_model_option: currentConfig.custom_model_option || null,
effort_level: currentConfig.effort_level || null,
},
});
+1
View File
@@ -228,6 +228,7 @@
bare_mode: cfg.bare_mode ?? false,
show_clear_context_on_plan_accept: cfg.show_clear_context_on_plan_accept ?? true,
custom_model_option: cfg.custom_model_option || null,
effort_level: cfg.effort_level || null,
},
});
} catch (error) {
@@ -118,6 +118,7 @@
bare_mode: config.bare_mode ?? false,
show_clear_context_on_plan_accept: config.show_clear_context_on_plan_accept ?? true,
custom_model_option: config.custom_model_option || null,
effort_level: config.effort_level || null,
},
});
+3
View File
@@ -229,6 +229,7 @@ describe("config store", () => {
bare_mode: false,
show_clear_context_on_plan_accept: true,
custom_model_option: null,
effort_level: null,
};
expect(config.model).toBe("claude-sonnet-4");
@@ -297,6 +298,7 @@ describe("config store", () => {
bare_mode: false,
show_clear_context_on_plan_accept: true,
custom_model_option: null,
effort_level: null,
};
expect(config.model).toBeNull();
@@ -920,6 +922,7 @@ describe("config store", () => {
bare_mode: false,
show_clear_context_on_plan_accept: true,
custom_model_option: null,
effort_level: null,
};
const mockInvokeImpl = vi.mocked(invoke);
+3
View File
@@ -99,6 +99,8 @@ export interface HikariConfig {
show_clear_context_on_plan_accept: boolean;
// Custom model option env var (v2.1.81+)
custom_model_option: string | null;
// Effort level for Claude Code (v2.1.111+) — null means use CLI default
effort_level: string | null;
}
const defaultConfig: HikariConfig = {
@@ -161,6 +163,7 @@ const defaultConfig: HikariConfig = {
bare_mode: false,
show_clear_context_on_plan_accept: true,
custom_model_option: null,
effort_level: null,
};
function createConfigStore() {