diff --git a/src-tauri/src/config.rs b/src-tauri/src/config.rs index 8a345ef..bdb10c5 100644 --- a/src-tauri/src/config.rs +++ b/src-tauri/src/config.rs @@ -31,6 +31,9 @@ pub struct ClaudeStartOptions { #[serde(default)] pub disable_1m_context: bool, + + #[serde(default)] + pub max_output_tokens: Option, } #[derive(Debug, Clone, Serialize, Deserialize)] @@ -126,6 +129,9 @@ pub struct HikariConfig { #[serde(default)] pub disable_1m_context: bool, + #[serde(default)] + pub max_output_tokens: Option, + #[serde(default)] pub trusted_workspaces: Vec, @@ -172,6 +178,7 @@ impl Default for HikariConfig { discord_rpc_enabled: true, use_worktree: false, disable_1m_context: false, + max_output_tokens: None, trusted_workspaces: Vec::new(), background_image_path: None, background_image_opacity: 0.3, @@ -325,6 +332,7 @@ mod tests { discord_rpc_enabled: true, use_worktree: true, disable_1m_context: false, + max_output_tokens: Some(32000), trusted_workspaces: vec!["/home/naomi/projects/trusted".to_string()], background_image_path: Some("/home/naomi/bg.png".to_string()), background_image_opacity: 0.25, diff --git a/src-tauri/src/wsl_bridge.rs b/src-tauri/src/wsl_bridge.rs index 5df9852..c2da718 100644 --- a/src-tauri/src/wsl_bridge.rs +++ b/src-tauri/src/wsl_bridge.rs @@ -296,6 +296,11 @@ impl WslBridge { cmd.env("CLAUDE_CODE_DISABLE_1M_CONTEXT", "1"); } + // Set max output tokens if specified + if let Some(max_tokens) = options.max_output_tokens { + cmd.env("CLAUDE_CODE_MAX_OUTPUT_TOKENS", max_tokens.to_string()); + } + cmd } else { // Running on Windows - use wsl with bash login shell to ensure PATH is loaded @@ -343,6 +348,11 @@ impl WslBridge { claude_cmd.push_str("CLAUDE_CODE_DISABLE_1M_CONTEXT=1 "); } + // Set max output tokens if specified + if let Some(max_tokens) = options.max_output_tokens { + claude_cmd.push_str(&format!("CLAUDE_CODE_MAX_OUTPUT_TOKENS={} ", max_tokens)); + } + claude_cmd.push_str( "claude --output-format stream-json --input-format stream-json --verbose", ); diff --git a/src/lib/commands/slashCommands.ts b/src/lib/commands/slashCommands.ts index 8d252c8..3e97bb2 100644 --- a/src/lib/commands/slashCommands.ts +++ b/src/lib/commands/slashCommands.ts @@ -63,6 +63,7 @@ async function changeDirectory(path: string): Promise { allowed_tools: allAllowedTools, use_worktree: config.use_worktree ?? false, disable_1m_context: config.disable_1m_context ?? false, + max_output_tokens: config.max_output_tokens ?? null, }, }); @@ -139,6 +140,7 @@ async function startNewConversation(): Promise { allowed_tools: allAllowedTools, use_worktree: config.use_worktree ?? false, disable_1m_context: config.disable_1m_context ?? false, + max_output_tokens: config.max_output_tokens ?? null, }, }); diff --git a/src/lib/components/ConfigSidebar.svelte b/src/lib/components/ConfigSidebar.svelte index dd26102..0ea8270 100644 --- a/src/lib/components/ConfigSidebar.svelte +++ b/src/lib/components/ConfigSidebar.svelte @@ -56,6 +56,7 @@ show_thinking_blocks: true, use_worktree: false, disable_1m_context: false, + max_output_tokens: null, trusted_workspaces: [], background_image_path: null, background_image_opacity: 0.3, @@ -533,6 +534,25 @@ context window

+ + +
+ + +

+ Sets CLAUDE_CODE_MAX_OUTPUT_TOKENS — increase if responses are + being cut off mid-reply +

+
diff --git a/src/lib/components/StatusBar.svelte b/src/lib/components/StatusBar.svelte index bbc3d60..29621fe 100644 --- a/src/lib/components/StatusBar.svelte +++ b/src/lib/components/StatusBar.svelte @@ -107,6 +107,7 @@ show_thinking_blocks: true, use_worktree: false, disable_1m_context: false, + max_output_tokens: null, trusted_workspaces: [], background_image_path: null, background_image_opacity: 0.3, @@ -185,6 +186,7 @@ allowed_tools: allAllowedTools, use_worktree: currentConfig.use_worktree ?? false, disable_1m_context: currentConfig.disable_1m_context ?? false, + max_output_tokens: currentConfig.max_output_tokens ?? null, }, }); @@ -344,6 +346,7 @@ allowed_tools: allAllowedTools, use_worktree: currentConfig.use_worktree ?? false, disable_1m_context: currentConfig.disable_1m_context ?? false, + max_output_tokens: currentConfig.max_output_tokens ?? null, }, }); diff --git a/src/lib/stores/config.test.ts b/src/lib/stores/config.test.ts index 664858c..acb6904 100644 --- a/src/lib/stores/config.test.ts +++ b/src/lib/stores/config.test.ts @@ -196,6 +196,7 @@ describe("config store", () => { show_thinking_blocks: true, use_worktree: false, disable_1m_context: false, + max_output_tokens: null, trusted_workspaces: [], background_image_path: null, background_image_opacity: 0.3, @@ -247,6 +248,7 @@ describe("config store", () => { show_thinking_blocks: true, use_worktree: false, disable_1m_context: false, + max_output_tokens: null, trusted_workspaces: [], background_image_path: null, background_image_opacity: 0.3, @@ -797,6 +799,7 @@ describe("config store", () => { show_thinking_blocks: true, use_worktree: false, disable_1m_context: false, + max_output_tokens: null, trusted_workspaces: [], background_image_path: null, background_image_opacity: 0.3, diff --git a/src/lib/stores/config.ts b/src/lib/stores/config.ts index 174537d..55e73c5 100644 --- a/src/lib/stores/config.ts +++ b/src/lib/stores/config.ts @@ -51,6 +51,8 @@ export interface HikariConfig { use_worktree: boolean; // Disable 1M context window disable_1m_context: boolean; + // Max output tokens for Claude Code responses + max_output_tokens: number | null; // Workspaces the user has explicitly trusted trusted_workspaces: string[]; // Background image settings @@ -98,6 +100,7 @@ const defaultConfig: HikariConfig = { show_thinking_blocks: true, use_worktree: false, disable_1m_context: false, + max_output_tokens: null, trusted_workspaces: [], background_image_path: null, background_image_opacity: 0.3,