mirror of
https://github.com/AutoMaker-Org/automaker.git
synced 2026-02-04 21:23:07 +00:00
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:
@@ -23,8 +23,6 @@ export class ClaudeProvider extends BaseProvider {
|
|||||||
* Execute a query using Claude Agent SDK
|
* Execute a query using Claude Agent SDK
|
||||||
*/
|
*/
|
||||||
async *executeQuery(options: ExecuteOptions): AsyncGenerator<ProviderMessage> {
|
async *executeQuery(options: ExecuteOptions): AsyncGenerator<ProviderMessage> {
|
||||||
console.log('[ClaudeProvider] executeQuery() called');
|
|
||||||
|
|
||||||
const {
|
const {
|
||||||
prompt,
|
prompt,
|
||||||
model,
|
model,
|
||||||
@@ -37,20 +35,6 @@ export class ClaudeProvider extends BaseProvider {
|
|||||||
sdkSessionId,
|
sdkSessionId,
|
||||||
} = options;
|
} = 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
|
// Build Claude SDK options
|
||||||
const defaultTools = ['Read', 'Write', 'Edit', 'Glob', 'Grep', 'Bash', 'WebSearch', 'WebFetch'];
|
const defaultTools = ['Read', 'Write', 'Edit', 'Glob', 'Grep', 'Bash', 'WebSearch', 'WebFetch'];
|
||||||
const toolsToUse = allowedTools || defaultTools;
|
const toolsToUse = allowedTools || defaultTools;
|
||||||
@@ -73,15 +57,6 @@ export class ClaudeProvider extends BaseProvider {
|
|||||||
...(options.sandbox && { sandbox: options.sandbox }),
|
...(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
|
// Build prompt payload
|
||||||
let promptPayload: string | AsyncIterable<any>;
|
let promptPayload: string | AsyncIterable<any>;
|
||||||
|
|
||||||
@@ -106,81 +81,12 @@ export class ClaudeProvider extends BaseProvider {
|
|||||||
|
|
||||||
// Execute via Claude Agent SDK
|
// Execute via Claude Agent SDK
|
||||||
try {
|
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 });
|
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...');
|
// Stream messages directly - they're already in the correct format
|
||||||
let streamMessageCount = 0;
|
for await (const msg of stream) {
|
||||||
|
yield msg as ProviderMessage;
|
||||||
// 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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log(
|
|
||||||
'[ClaudeProvider] Stream iteration completed, total messages:',
|
|
||||||
streamMessageCount
|
|
||||||
);
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('[ClaudeProvider] ERROR: executeQuery() error during execution:', error);
|
console.error('[ClaudeProvider] ERROR: executeQuery() error during execution:', error);
|
||||||
console.error('[ClaudeProvider] ERROR stack:', (error as Error).stack);
|
console.error('[ClaudeProvider] ERROR stack:', (error as Error).stack);
|
||||||
|
|||||||
@@ -300,7 +300,6 @@ export class AgentService {
|
|||||||
sdkSessionId: session.sdkSessionId, // Pass SDK session ID for resuming
|
sdkSessionId: session.sdkSessionId, // Pass SDK session ID for resuming
|
||||||
};
|
};
|
||||||
|
|
||||||
console.log('[AgentService] Building prompt with images...');
|
|
||||||
// Build prompt content with images
|
// Build prompt content with images
|
||||||
const { content: promptContent } = await buildPromptWithImages(
|
const { content: promptContent } = await buildPromptWithImages(
|
||||||
message,
|
message,
|
||||||
@@ -321,23 +320,12 @@ export class AgentService {
|
|||||||
|
|
||||||
// Execute via provider
|
// Execute via provider
|
||||||
const stream = provider.executeQuery(options);
|
const stream = provider.executeQuery(options);
|
||||||
console.log('[AgentService] Stream created, starting to iterate...');
|
|
||||||
|
|
||||||
let currentAssistantMessage: Message | null = null;
|
let currentAssistantMessage: Message | null = null;
|
||||||
let responseText = '';
|
let responseText = '';
|
||||||
const toolUses: Array<{ name: string; input: unknown }> = [];
|
const toolUses: Array<{ name: string; input: unknown }> = [];
|
||||||
let messageCount = 0;
|
|
||||||
|
|
||||||
console.log('[AgentService] Entering stream loop...');
|
|
||||||
for await (const msg of stream) {
|
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
|
// Capture SDK session ID from any message and persist it
|
||||||
if (msg.session_id && !session.sdkSessionId) {
|
if (msg.session_id && !session.sdkSessionId) {
|
||||||
session.sdkSessionId = msg.session_id;
|
session.sdkSessionId = msg.session_id;
|
||||||
@@ -347,7 +335,6 @@ export class AgentService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (msg.type === 'assistant') {
|
if (msg.type === 'assistant') {
|
||||||
console.log('[AgentService] Processing assistant message...');
|
|
||||||
if (msg.message?.content) {
|
if (msg.message?.content) {
|
||||||
for (const block of msg.message.content) {
|
for (const block of msg.message.content) {
|
||||||
if (block.type === 'text') {
|
if (block.type === 'text') {
|
||||||
@@ -391,7 +378,6 @@ export class AgentService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (msg.type === 'result') {
|
} else if (msg.type === 'result') {
|
||||||
console.log('[AgentService] Result message received, subtype:', (msg as any).subtype);
|
|
||||||
if (msg.subtype === 'success' && msg.result) {
|
if (msg.subtype === 'success' && msg.result) {
|
||||||
if (currentAssistantMessage) {
|
if (currentAssistantMessage) {
|
||||||
currentAssistantMessage.content = msg.result;
|
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);
|
await this.saveSession(sessionId, session.messages);
|
||||||
|
|
||||||
session.isRunning = false;
|
session.isRunning = false;
|
||||||
@@ -825,7 +809,6 @@ export class AgentService {
|
|||||||
dataKeys: Object.keys(data),
|
dataKeys: Object.keys(data),
|
||||||
});
|
});
|
||||||
this.events.emit('agent:stream', { sessionId, ...data });
|
this.events.emit('agent:stream', { sessionId, ...data });
|
||||||
console.log('[AgentService] Event emitted to EventEmitter');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private getSystemPrompt(): string {
|
private getSystemPrompt(): string {
|
||||||
|
|||||||
@@ -13,14 +13,17 @@ interface ClaudeMdSettingsProps {
|
|||||||
/**
|
/**
|
||||||
* ClaudeMdSettings Component
|
* ClaudeMdSettings Component
|
||||||
*
|
*
|
||||||
* UI control for the autoLoadClaudeMd setting which enables automatic loading
|
* UI controls for Claude Agent SDK settings including:
|
||||||
* of project instructions from .claude/CLAUDE.md files via the Claude Agent SDK.
|
* - Auto-loading of project instructions from .claude/CLAUDE.md files
|
||||||
|
* - Sandbox mode for isolated bash command execution
|
||||||
*
|
*
|
||||||
* Usage:
|
* Usage:
|
||||||
* ```tsx
|
* ```tsx
|
||||||
* <ClaudeMdSettings
|
* <ClaudeMdSettings
|
||||||
* autoLoadClaudeMd={autoLoadClaudeMd}
|
* autoLoadClaudeMd={autoLoadClaudeMd}
|
||||||
* onAutoLoadClaudeMdChange={setAutoLoadClaudeMd}
|
* onAutoLoadClaudeMdChange={setAutoLoadClaudeMd}
|
||||||
|
* enableSandboxMode={enableSandboxMode}
|
||||||
|
* onEnableSandboxModeChange={setEnableSandboxMode}
|
||||||
* />
|
* />
|
||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -224,6 +224,7 @@ export async function syncSettingsToServer(): Promise<boolean> {
|
|||||||
enhancementModel: state.enhancementModel,
|
enhancementModel: state.enhancementModel,
|
||||||
validationModel: state.validationModel,
|
validationModel: state.validationModel,
|
||||||
autoLoadClaudeMd: state.autoLoadClaudeMd,
|
autoLoadClaudeMd: state.autoLoadClaudeMd,
|
||||||
|
enableSandboxMode: state.enableSandboxMode,
|
||||||
keyboardShortcuts: state.keyboardShortcuts,
|
keyboardShortcuts: state.keyboardShortcuts,
|
||||||
aiProfiles: state.aiProfiles,
|
aiProfiles: state.aiProfiles,
|
||||||
projects: state.projects,
|
projects: state.projects,
|
||||||
|
|||||||
Reference in New Issue
Block a user