chore: address code review feedback

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 <noreply@anthropic.com>
This commit is contained in:
Stephan Rieche
2025-12-27 13:13:17 +01:00
parent 348a4d95e9
commit 01e6b7fa52
4 changed files with 9 additions and 116 deletions

View File

@@ -23,8 +23,6 @@ export class ClaudeProvider extends BaseProvider {
* Execute a query using Claude Agent SDK
*/
async *executeQuery(options: ExecuteOptions): AsyncGenerator<ProviderMessage> {
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<any>;
@@ -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);

View File

@@ -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 {

View File

@@ -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
* <ClaudeMdSettings
* autoLoadClaudeMd={autoLoadClaudeMd}
* onAutoLoadClaudeMdChange={setAutoLoadClaudeMd}
* enableSandboxMode={enableSandboxMode}
* onEnableSandboxModeChange={setEnableSandboxMode}
* />
* ```
*/

View File

@@ -224,6 +224,7 @@ export async function syncSettingsToServer(): Promise<boolean> {
enhancementModel: state.enhancementModel,
validationModel: state.validationModel,
autoLoadClaudeMd: state.autoLoadClaudeMd,
enableSandboxMode: state.enableSandboxMode,
keyboardShortcuts: state.keyboardShortcuts,
aiProfiles: state.aiProfiles,
projects: state.projects,