diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts index 8e42707a95..d58e1a15ef 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -2266,7 +2266,32 @@ export const webviewMessageHandler = async ( } if (manager.isFeatureEnabled && manager.isFeatureConfigured) { if (!manager.isInitialized) { - await manager.initialize(provider.contextProxy) + try { + await manager.initialize(provider.contextProxy) + } catch (initError) { + // Initialization failed - send detailed error to user + const errorMessage = initError instanceof Error ? initError.message : String(initError) + provider.log(`Code index initialization failed: ${errorMessage}`) + + // Send error status to webview with user-friendly message + provider.postMessageToWebview({ + type: "indexingStatusUpdate", + values: { + systemStatus: "Error", + message: errorMessage, + processedItems: 0, + totalItems: 0, + currentItemUnit: "items", + }, + }) + + // Show error notification to user + vscode.window.showErrorMessage( + t("embeddings:validation.initializationFailed", { error: errorMessage }) || + `Code indexing initialization failed: ${errorMessage}`, + ) + return + } } // startIndexing now handles error recovery internally @@ -2274,13 +2299,75 @@ export const webviewMessageHandler = async ( // If startIndexing recovered from error, we need to reinitialize if (!manager.isInitialized) { - await manager.initialize(provider.contextProxy) - // Try starting again after initialization - manager.startIndexing() + try { + await manager.initialize(provider.contextProxy) + // Try starting again after initialization + manager.startIndexing() + } catch (reinitError) { + // Re-initialization failed - send detailed error to user + const errorMessage = + reinitError instanceof Error ? reinitError.message : String(reinitError) + provider.log(`Code index re-initialization failed: ${errorMessage}`) + + // Send error status to webview + provider.postMessageToWebview({ + type: "indexingStatusUpdate", + values: { + systemStatus: "Error", + message: errorMessage, + processedItems: 0, + totalItems: 0, + currentItemUnit: "items", + }, + }) + + // Show error notification to user + vscode.window.showErrorMessage( + t("embeddings:validation.initializationFailed", { error: errorMessage }) || + `Code indexing initialization failed: ${errorMessage}`, + ) + } } + } else { + // Feature is not enabled or not configured + const message = !manager.isFeatureEnabled + ? t("embeddings:validation.featureDisabled") || "Code indexing is disabled" + : t("embeddings:validation.notConfigured") || "Code indexing is not properly configured" + + provider.postMessageToWebview({ + type: "indexingStatusUpdate", + values: { + systemStatus: "Error", + message: message, + processedItems: 0, + totalItems: 0, + currentItemUnit: "items", + }, + }) + + vscode.window.showErrorMessage(message) } } catch (error) { - provider.log(`Error starting indexing: ${error instanceof Error ? error.message : String(error)}`) + const errorMessage = error instanceof Error ? error.message : String(error) + provider.log(`Error starting indexing: ${errorMessage}`) + + // Send error status to webview + provider.postMessageToWebview({ + type: "indexingStatusUpdate", + values: { + systemStatus: "Error", + message: errorMessage, + processedItems: 0, + totalItems: 0, + currentItemUnit: "items", + }, + }) + + // Show error notification to user + vscode.window.showErrorMessage( + t("embeddings:validation.startIndexingFailed", { error: errorMessage }) || + `Failed to start indexing: ${errorMessage}`, + ) } break } diff --git a/src/i18n/locales/en/embeddings.json b/src/i18n/locales/en/embeddings.json index 66465d8c35..8ab5da6f53 100644 --- a/src/i18n/locales/en/embeddings.json +++ b/src/i18n/locales/en/embeddings.json @@ -39,7 +39,11 @@ "invalidModel": "Invalid model. Please check your model configuration.", "invalidResponse": "Invalid response from embedder service. Please check your configuration.", "apiKeyRequired": "API key is required for this embedder", - "baseUrlRequired": "Base URL is required for this embedder" + "baseUrlRequired": "Base URL is required for this embedder", + "initializationFailed": "Code indexing initialization failed: {{error}}", + "featureDisabled": "Code indexing is disabled. Please enable it in the settings.", + "notConfigured": "Code indexing is not properly configured. Please check your settings.", + "startIndexingFailed": "Failed to start indexing: {{error}}" }, "serviceFactory": { "openAiConfigMissing": "OpenAI configuration missing for embedder creation", diff --git a/src/shared/embeddingModels.ts b/src/shared/embeddingModels.ts index a3cd61e659..21b314189c 100644 --- a/src/shared/embeddingModels.ts +++ b/src/shared/embeddingModels.ts @@ -40,6 +40,7 @@ export const EMBEDDING_MODEL_PROFILES: EmbeddingModelProfiles = { "text-embedding-3-small": { dimension: 1536, scoreThreshold: 0.4 }, "text-embedding-3-large": { dimension: 3072, scoreThreshold: 0.4 }, "text-embedding-ada-002": { dimension: 1536, scoreThreshold: 0.4 }, + "text-embedding-v4": { dimension: 1536, scoreThreshold: 0.4 }, // Added support for text-embedding-v4 "nomic-embed-code": { dimension: 3584, scoreThreshold: 0.15,