import { useState, useEffect, useRef, useCallback } from "react"; import type { ClaudeCodeSettings } from "../../lib/types"; interface Props { settings: ClaudeCodeSettings | null; disabled: boolean; onSave: (settings: ClaudeCodeSettings | null) => Promise; onClose: () => void; } const DEFAULTS: ClaudeCodeSettings = { tui_mode: null, effort: null, auto_scroll_disabled: false, focus_mode: false, show_thinking_summaries: false, enable_session_recap: false, env_scrub: false, prompt_caching_1h: false, }; function isAllDefaults(s: ClaudeCodeSettings): boolean { return ( s.tui_mode === null && s.effort === null && s.auto_scroll_disabled === false && s.focus_mode === false && s.show_thinking_summaries === false && s.enable_session_recap === false && s.env_scrub === false && s.prompt_caching_1h === false ); } export default function ClaudeCodeSettingsModal({ settings, disabled, onSave, onClose }: Props) { const [local, setLocal] = useState(settings ?? { ...DEFAULTS }); const overlayRef = useRef(null); useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { if (e.key === "Escape") onClose(); }; document.addEventListener("keydown", handleKeyDown); return () => document.removeEventListener("keydown", handleKeyDown); }, [onClose]); const handleOverlayClick = useCallback( (e: React.MouseEvent) => { if (e.target === overlayRef.current) onClose(); }, [onClose], ); const update = async (patch: Partial) => { const next = { ...local, ...patch }; setLocal(next); try { await onSave(isAllDefaults(next) ? null : next); } catch (err) { console.error("Failed to save Claude Code settings:", err); } }; const toggleButton = (label: string, description: string, value: boolean, onChange: (v: boolean) => void) => (
{label}
{description}
); return (

Claude Code Settings

{disabled && (
Container must be stopped to change Claude Code settings.
)}
{/* TUI Mode */}
TUI Mode
Enables flicker-free alt-screen rendering
{/* Effort Level */}
Effort Level
Controls how much reasoning Claude applies
{/* Boolean toggles */} {toggleButton( "Focus Mode", "Collapses tool output to one-line summaries", local.focus_mode, (v) => update({ focus_mode: v }), )} {toggleButton( "Thinking Summaries", "Shows thinking process as summaries", local.show_thinking_summaries, (v) => update({ show_thinking_summaries: v }), )} {toggleButton( "Session Recap", "Provides context when returning to a session", local.enable_session_recap, (v) => update({ enable_session_recap: v }), )} {toggleButton( "Auto-Scroll Disabled", "Disables auto-scroll when in fullscreen TUI mode", local.auto_scroll_disabled, (v) => update({ auto_scroll_disabled: v }), )} {toggleButton( "Env Scrub", "Strips credentials from subprocess environments for security", local.env_scrub, (v) => update({ env_scrub: v }), )} {toggleButton( "Prompt Caching (1h)", "Enables 1-hour prompt cache TTL instead of 5 minutes", local.prompt_caching_1h, (v) => update({ prompt_caching_1h: v }), )}
); }