import React, { useState, useEffect } from 'react'; import { Button } from './ui/button'; import { Input } from './ui/input'; import { ScrollArea } from './ui/scroll-area'; import { Badge } from './ui/badge'; import { X, Plus, Settings, Shield, AlertTriangle, Moon, Sun } from 'lucide-react'; import { useTheme } from '../contexts/ThemeContext'; function ToolsSettings({ isOpen, onClose }) { const { isDarkMode, toggleDarkMode } = useTheme(); const [allowedTools, setAllowedTools] = useState([]); const [disallowedTools, setDisallowedTools] = useState([]); const [newAllowedTool, setNewAllowedTool] = useState(''); const [newDisallowedTool, setNewDisallowedTool] = useState(''); const [skipPermissions, setSkipPermissions] = useState(false); const [isSaving, setIsSaving] = useState(false); const [saveStatus, setSaveStatus] = useState(null); const [projectSortOrder, setProjectSortOrder] = useState('name'); // Common tool patterns const commonTools = [ 'Bash(git log:*)', 'Bash(git diff:*)', 'Bash(git status:*)', 'Write', 'Read', 'Edit', 'Glob', 'Grep', 'MultiEdit', 'Task', 'TodoWrite', 'TodoRead', 'WebFetch', 'WebSearch' ]; useEffect(() => { if (isOpen) { loadSettings(); } }, [isOpen]); const loadSettings = () => { try { // Load from localStorage const savedSettings = localStorage.getItem('claude-tools-settings'); if (savedSettings) { const settings = JSON.parse(savedSettings); setAllowedTools(settings.allowedTools || []); setDisallowedTools(settings.disallowedTools || []); setSkipPermissions(settings.skipPermissions || false); setProjectSortOrder(settings.projectSortOrder || 'name'); } else { // Set defaults setAllowedTools([]); setDisallowedTools([]); setSkipPermissions(false); setProjectSortOrder('name'); } } catch (error) { console.error('Error loading tool settings:', error); // Set defaults on error setAllowedTools([]); setDisallowedTools([]); setSkipPermissions(false); setProjectSortOrder('name'); } }; const saveSettings = () => { setIsSaving(true); setSaveStatus(null); try { const settings = { allowedTools, disallowedTools, skipPermissions, projectSortOrder, lastUpdated: new Date().toISOString() }; // Save to localStorage localStorage.setItem('claude-tools-settings', JSON.stringify(settings)); setSaveStatus('success'); setTimeout(() => { onClose(); }, 1000); } catch (error) { console.error('Error saving tool settings:', error); setSaveStatus('error'); } finally { setIsSaving(false); } }; const addAllowedTool = (tool) => { if (tool && !allowedTools.includes(tool)) { setAllowedTools([...allowedTools, tool]); setNewAllowedTool(''); } }; const removeAllowedTool = (tool) => { setAllowedTools(allowedTools.filter(t => t !== tool)); }; const addDisallowedTool = (tool) => { if (tool && !disallowedTools.includes(tool)) { setDisallowedTools([...disallowedTools, tool]); setNewDisallowedTool(''); } }; const removeDisallowedTool = (tool) => { setDisallowedTools(disallowedTools.filter(t => t !== tool)); }; if (!isOpen) return null; return (

Tools Settings

{/* Theme Settings */}
{isDarkMode ? : }

Appearance

Dark Mode
Toggle between light and dark themes
{/* Project Sorting - Moved under Appearance */}
Project Sorting
How projects are ordered in the sidebar
{/* Skip Permissions */}

Permission Settings

{/* Allowed Tools */}

Allowed Tools

Tools that are automatically allowed without prompting for permission

setNewAllowedTool(e.target.value)} placeholder='e.g., "Bash(git log:*)" or "Write"' onKeyPress={(e) => { if (e.key === 'Enter') { addAllowedTool(newAllowedTool); } }} className="flex-1 h-10 touch-manipulation" style={{ fontSize: '16px' }} />
{/* Common tools quick add */}

Quick add common tools:

{commonTools.map(tool => ( ))}
{allowedTools.map(tool => (
{tool}
))} {allowedTools.length === 0 && (
No allowed tools configured
)}
{/* Disallowed Tools */}

Disallowed Tools

Tools that are automatically blocked without prompting for permission

setNewDisallowedTool(e.target.value)} placeholder='e.g., "Bash(rm:*)" or "Write"' onKeyPress={(e) => { if (e.key === 'Enter') { addDisallowedTool(newDisallowedTool); } }} className="flex-1 h-10 touch-manipulation" style={{ fontSize: '16px' }} />
{disallowedTools.map(tool => (
{tool}
))} {disallowedTools.length === 0 && (
No disallowed tools configured
)}
{/* Help Section */}

Tool Pattern Examples:

  • "Bash(git log:*)" - Allow all git log commands
  • "Bash(git diff:*)" - Allow all git diff commands
  • "Write" - Allow all Write tool usage
  • "Read" - Allow all Read tool usage
  • "Bash(rm:*)" - Block all rm commands (dangerous)
{saveStatus === 'success' && (
Settings saved successfully!
)} {saveStatus === 'error' && (
Failed to save settings
)}
); } export default ToolsSettings;