From 26a6e3921210c55bc6da2c269fcdf7e7cbcd296e Mon Sep 17 00:00:00 2001 From: imneov Date: Wed, 17 Dec 2025 12:33:25 +0800 Subject: [PATCH] feat: improve debug logging and error handling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added comprehensive debugging and better error messages: Server improvements (server/claude-sdk.js): - Added detailed debug logs for SDK options mapping - Improved error messages with specific hints for common issues - Added stderr capture for better error diagnostics - Provide actionable hints for API errors and session corruption Vite config (vite.config.js): - Added allowedHosts configuration for claudeui.a2d2.dev domain - Enables access through custom domain in development 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- server/claude-sdk.js | 37 ++++++++++++++++++++++++++++++++++++- vite.config.js | 1 + 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/server/claude-sdk.js b/server/claude-sdk.js index 9fea12712a..fe970d0e6b 100644 --- a/server/claude-sdk.js +++ b/server/claude-sdk.js @@ -50,6 +50,7 @@ function mapCliOptionsToSDK(options = {}) { // Handle tool permissions if (settings.skipPermissions && permissionMode !== 'plan') { // When skipping permissions, use bypassPermissions mode + // Note: This will fail if running as root due to Claude Code security restrictions sdkOptions.permissionMode = 'bypassPermissions'; } else { // Map allowed tools @@ -353,9 +354,23 @@ async function queryClaudeSDK(command, options = {}, ws) { let tempDir = null; try { + // Debug: Log incoming options + console.log('🔍 [SDK Debug] Incoming options:', JSON.stringify({ + sessionId: options.sessionId, + cwd: options.cwd, + projectPath: options.projectPath, + permissionMode: options.permissionMode, + model: options.model, + hasImages: !!(options.images && options.images.length), + toolsSettings: options.toolsSettings + }, null, 2)); + // Map CLI options to SDK format const sdkOptions = mapCliOptionsToSDK(options); + // Debug: Log mapped SDK options + console.log('🔍 [SDK Debug] Mapped sdkOptions:', JSON.stringify(sdkOptions, null, 2)); + // Load MCP configuration const mcpServers = await loadMcpConfig(options.cwd); if (mcpServers) { @@ -368,6 +383,11 @@ async function queryClaudeSDK(command, options = {}, ws) { tempImagePaths = imageResult.tempImagePaths; tempDir = imageResult.tempDir; + // Enable stderr capture for better error messages + sdkOptions.stderr = (message) => { + console.error('[Claude CLI stderr]:', message); + }; + // Create SDK query instance const queryInstance = query({ prompt: finalCommand, @@ -456,10 +476,25 @@ async function queryClaudeSDK(command, options = {}, ws) { // Clean up temporary image files on error await cleanupTempFiles(tempImagePaths, tempDir); + // Provide more detailed error messages + let errorMessage = error.message; + let errorHint = ''; + + // Check for specific error patterns + if (error.message && error.message.includes('status code 400')) { + errorMessage = 'API request failed: Invalid request parameters'; + errorHint = 'The session may be corrupted. Try starting a new session instead of resuming this one.'; + } else if (error.message && error.message.includes('process exited')) { + errorMessage = 'Claude Code process terminated unexpectedly'; + errorHint = 'This may be caused by corrupted session data or invalid API request. Consider starting a fresh session.'; + } + // Send error to WebSocket ws.send(JSON.stringify({ type: 'claude-error', - error: error.message + error: errorMessage, + hint: errorHint, + sessionId: capturedSessionId })); throw error; diff --git a/vite.config.js b/vite.config.js index f93c7d5327..691df0d36d 100755 --- a/vite.config.js +++ b/vite.config.js @@ -10,6 +10,7 @@ export default defineConfig(({ command, mode }) => { plugins: [react()], server: { port: parseInt(env.VITE_PORT) || 5173, + allowedHosts: ['claudeui.a2d2.dev'], proxy: { '/api': `http://localhost:${env.PORT || 3001}`, '/ws': {