From 01e6b7fa527c36bb07b5350366a7f0ab66b98836 Mon Sep 17 00:00:00 2001 From: Stephan Rieche Date: Sat, 27 Dec 2025 13:13:17 +0100 Subject: [PATCH] chore: address code review feedback MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Address suggestions from gemini-code-assist and coderabbit-ai: Logging Improvements: - Remove excessive debug logging from ClaudeProvider - Remove sensitive environment variable logging (API key length, HOME, USER) - Remove verbose per-message stream logging from AgentService - Remove redundant SDK options logging - Remove watchdog timer logging (diagnostic tool) Documentation: - Update JSDoc example in ClaudeMdSettings to include sandbox props Persistence Fix: - Add enableSandboxMode to syncSettingsToServer updates object - Ensures sandbox setting is properly persisted to server storage This reduces log volume significantly while maintaining important error and state transition logging. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- apps/server/src/providers/claude-provider.ts | 100 +----------------- apps/server/src/services/agent-service.ts | 17 --- .../claude/claude-md-settings.tsx | 7 +- apps/ui/src/hooks/use-settings-migration.ts | 1 + 4 files changed, 9 insertions(+), 116 deletions(-) diff --git a/apps/server/src/providers/claude-provider.ts b/apps/server/src/providers/claude-provider.ts index 919eeb30..716e94ca 100644 --- a/apps/server/src/providers/claude-provider.ts +++ b/apps/server/src/providers/claude-provider.ts @@ -23,8 +23,6 @@ export class ClaudeProvider extends BaseProvider { * Execute a query using Claude Agent SDK */ async *executeQuery(options: ExecuteOptions): AsyncGenerator { - console.log('[ClaudeProvider] executeQuery() called'); - const { prompt, model, @@ -37,20 +35,6 @@ export class ClaudeProvider extends BaseProvider { sdkSessionId, } = options; - console.log('[ClaudeProvider] Options:', { - model, - cwd, - maxTurns, - promptType: typeof prompt, - promptLength: typeof prompt === 'string' ? prompt.length : 'array', - hasSystemPrompt: !!systemPrompt, - systemPromptLength: systemPrompt?.length, - hasConversationHistory: !!conversationHistory?.length, - conversationHistoryLength: conversationHistory?.length || 0, - sdkSessionId, - allowedToolsCount: allowedTools?.length, - }); - // Build Claude SDK options const defaultTools = ['Read', 'Write', 'Edit', 'Glob', 'Grep', 'Bash', 'WebSearch', 'WebFetch']; const toolsToUse = allowedTools || defaultTools; @@ -73,15 +57,6 @@ export class ClaudeProvider extends BaseProvider { ...(options.sandbox && { sandbox: options.sandbox }), }; - console.log('[ClaudeProvider] SDK options prepared:', { - model: sdkOptions.model, - maxTurns: sdkOptions.maxTurns, - permissionMode: sdkOptions.permissionMode, - sandboxEnabled: sdkOptions.sandbox?.enabled || false, - hasResume: !!(sdkOptions as any).resume, - toolsCount: sdkOptions.allowedTools?.length, - }); - // Build prompt payload let promptPayload: string | AsyncIterable; @@ -106,81 +81,12 @@ export class ClaudeProvider extends BaseProvider { // Execute via Claude Agent SDK try { - console.log('[ClaudeProvider] ANTHROPIC_API_KEY exists:', !!process.env.ANTHROPIC_API_KEY); - console.log( - '[ClaudeProvider] ANTHROPIC_API_KEY length:', - process.env.ANTHROPIC_API_KEY?.length || 0 - ); - console.log('[ClaudeProvider] HOME directory:', process.env.HOME); - console.log('[ClaudeProvider] User:', process.env.USER); - console.log('[ClaudeProvider] Current working directory:', process.cwd()); - - // CRITICAL DEBUG: Log exact SDK options being passed - console.log('[ClaudeProvider] EXACT sdkOptions being passed to query():'); - console.log( - JSON.stringify( - { - model: sdkOptions.model, - maxTurns: sdkOptions.maxTurns, - cwd: sdkOptions.cwd, - allowedTools: sdkOptions.allowedTools, - permissionMode: sdkOptions.permissionMode, - hasSandbox: !!sdkOptions.sandbox, - hasAbortController: !!sdkOptions.abortController, - hasResume: !!(sdkOptions as any).resume, - hasSettingSources: !!sdkOptions.settingSources, - settingSources: sdkOptions.settingSources, - }, - null, - 2 - ) - ); - - console.log('[ClaudeProvider] Calling Claude Agent SDK query()...'); - console.log( - '[ClaudeProvider] About to call query() with prompt payload type:', - typeof promptPayload - ); - const stream = query({ prompt: promptPayload, options: sdkOptions }); - console.log('[ClaudeProvider] query() call returned, stream object type:', typeof stream); - console.log('[ClaudeProvider] SDK query() returned stream, starting iteration...'); - let streamMessageCount = 0; - - // Add a watchdog timer to detect if stream is hanging - let lastMessageTime = Date.now(); - const watchdogInterval = setInterval(() => { - const timeSinceLastMessage = Date.now() - lastMessageTime; - if (timeSinceLastMessage > 10000) { - console.log( - `[ClaudeProvider] WARNING: No messages received for ${Math.floor(timeSinceLastMessage / 1000)}s` - ); - } - }, 5000); - - try { - // Stream messages directly - they're already in the correct format - for await (const msg of stream) { - lastMessageTime = Date.now(); - streamMessageCount++; - console.log(`[ClaudeProvider] Stream message #${streamMessageCount}:`, { - type: msg.type, - subtype: (msg as any).subtype, - hasMessage: !!(msg as any).message, - hasResult: !!(msg as any).result, - session_id: msg.session_id, - }); - yield msg as ProviderMessage; - } - } finally { - clearInterval(watchdogInterval); + // Stream messages directly - they're already in the correct format + for await (const msg of stream) { + yield msg as ProviderMessage; } - - console.log( - '[ClaudeProvider] Stream iteration completed, total messages:', - streamMessageCount - ); } catch (error) { console.error('[ClaudeProvider] ERROR: executeQuery() error during execution:', error); console.error('[ClaudeProvider] ERROR stack:', (error as Error).stack); diff --git a/apps/server/src/services/agent-service.ts b/apps/server/src/services/agent-service.ts index c072803d..b76e9c76 100644 --- a/apps/server/src/services/agent-service.ts +++ b/apps/server/src/services/agent-service.ts @@ -300,7 +300,6 @@ export class AgentService { sdkSessionId: session.sdkSessionId, // Pass SDK session ID for resuming }; - console.log('[AgentService] Building prompt with images...'); // Build prompt content with images const { content: promptContent } = await buildPromptWithImages( message, @@ -321,23 +320,12 @@ export class AgentService { // Execute via provider const stream = provider.executeQuery(options); - console.log('[AgentService] Stream created, starting to iterate...'); let currentAssistantMessage: Message | null = null; let responseText = ''; const toolUses: Array<{ name: string; input: unknown }> = []; - let messageCount = 0; - console.log('[AgentService] Entering stream loop...'); for await (const msg of stream) { - messageCount++; - console.log(`[AgentService] Stream message #${messageCount}:`, { - type: msg.type, - subtype: (msg as any).subtype, - hasContent: !!(msg as any).message?.content, - session_id: msg.session_id, - }); - // Capture SDK session ID from any message and persist it if (msg.session_id && !session.sdkSessionId) { session.sdkSessionId = msg.session_id; @@ -347,7 +335,6 @@ export class AgentService { } if (msg.type === 'assistant') { - console.log('[AgentService] Processing assistant message...'); if (msg.message?.content) { for (const block of msg.message.content) { if (block.type === 'text') { @@ -391,7 +378,6 @@ export class AgentService { } } } else if (msg.type === 'result') { - console.log('[AgentService] Result message received, subtype:', (msg as any).subtype); if (msg.subtype === 'success' && msg.result) { if (currentAssistantMessage) { currentAssistantMessage.content = msg.result; @@ -409,8 +395,6 @@ export class AgentService { } } - console.log('[AgentService] Stream loop completed, total messages:', messageCount); - await this.saveSession(sessionId, session.messages); session.isRunning = false; @@ -825,7 +809,6 @@ export class AgentService { dataKeys: Object.keys(data), }); this.events.emit('agent:stream', { sessionId, ...data }); - console.log('[AgentService] Event emitted to EventEmitter'); } private getSystemPrompt(): string { diff --git a/apps/ui/src/components/views/settings-view/claude/claude-md-settings.tsx b/apps/ui/src/components/views/settings-view/claude/claude-md-settings.tsx index c2a6a3db..ae5a67e4 100644 --- a/apps/ui/src/components/views/settings-view/claude/claude-md-settings.tsx +++ b/apps/ui/src/components/views/settings-view/claude/claude-md-settings.tsx @@ -13,14 +13,17 @@ interface ClaudeMdSettingsProps { /** * ClaudeMdSettings Component * - * UI control for the autoLoadClaudeMd setting which enables automatic loading - * of project instructions from .claude/CLAUDE.md files via the Claude Agent SDK. + * UI controls for Claude Agent SDK settings including: + * - Auto-loading of project instructions from .claude/CLAUDE.md files + * - Sandbox mode for isolated bash command execution * * Usage: * ```tsx * * ``` */ diff --git a/apps/ui/src/hooks/use-settings-migration.ts b/apps/ui/src/hooks/use-settings-migration.ts index 2bca750b..1e989060 100644 --- a/apps/ui/src/hooks/use-settings-migration.ts +++ b/apps/ui/src/hooks/use-settings-migration.ts @@ -224,6 +224,7 @@ export async function syncSettingsToServer(): Promise { enhancementModel: state.enhancementModel, validationModel: state.validationModel, autoLoadClaudeMd: state.autoLoadClaudeMd, + enableSandboxMode: state.enableSandboxMode, keyboardShortcuts: state.keyboardShortcuts, aiProfiles: state.aiProfiles, projects: state.projects,