@@ -5,6 +5,18 @@ import { CodeIndexConfig, PreviousConfigSnapshot } from "./interfaces/config"
55import { SEARCH_MIN_SCORE } from "./constants"
66import { getDefaultModelId , getModelDimension } from "../../shared/embeddingModels"
77
8+ // Define a type for the raw config state from globalState
9+ interface RawCodebaseIndexConfigState {
10+ codebaseIndexEnabled ?: boolean
11+ codebaseIndexQdrantUrl ?: string
12+ codebaseIndexSearchMinScore ?: number // Assuming this is also from globalState based on default
13+ codebaseIndexEmbedderProvider ?: "openai" | "ollama" | "gemini"
14+ codebaseIndexEmbedderBaseUrl ?: string
15+ codebaseIndexEmbedderModelId ?: string
16+ geminiEmbeddingTaskType ?: string
17+ geminiEmbeddingDimension ?: number // Ensure this is part of the raw state type
18+ }
19+
820/**
921 * Manages configuration state and validation for the code indexing feature.
1022 * Handles loading, validating, and providing access to configuration values.
@@ -31,15 +43,16 @@ export class CodeIndexConfigManager {
3143 */
3244 private _loadAndSetConfiguration ( ) : void {
3345 // Load configuration from storage
34- const codebaseIndexConfig = this . contextProxy ?. getGlobalState ( "codebaseIndexConfig" ) ?? {
46+ const rawConfig = ( this . contextProxy ?. getGlobalState ( "codebaseIndexConfig" ) ?? {
3547 codebaseIndexEnabled : false ,
3648 codebaseIndexQdrantUrl : "http://localhost:6333" ,
3749 codebaseIndexSearchMinScore : 0.4 ,
3850 codebaseIndexEmbedderProvider : "openai" ,
3951 codebaseIndexEmbedderBaseUrl : "" ,
4052 codebaseIndexEmbedderModelId : "" ,
4153 geminiEmbeddingTaskType : "CODE_RETRIEVAL_QUERY" ,
42- }
54+ geminiEmbeddingDimension : undefined ,
55+ } ) as RawCodebaseIndexConfigState // Cast to our defined raw state type
4356
4457 const {
4558 codebaseIndexEnabled,
@@ -48,11 +61,13 @@ export class CodeIndexConfigManager {
4861 codebaseIndexEmbedderBaseUrl,
4962 codebaseIndexEmbedderModelId,
5063 geminiEmbeddingTaskType,
51- } = codebaseIndexConfig
64+ geminiEmbeddingDimension,
65+ } = rawConfig // Destructure from the typed rawConfig
5266
5367 const openAiKey = this . contextProxy ?. getSecret ( "codeIndexOpenAiKey" ) ?? ""
5468 const qdrantApiKey = this . contextProxy ?. getSecret ( "codeIndexQdrantApiKey" ) ?? ""
5569 const geminiApiKey = this . contextProxy ?. getSecret ( "geminiApiKey" ) ?? ""
70+ const rateLimitSeconds = this . contextProxy ?. getGlobalState ( "rateLimitSeconds" ) ?? undefined
5671
5772 // Update instance variables with configuration
5873 this . isEnabled = codebaseIndexEnabled || false
@@ -79,6 +94,8 @@ export class CodeIndexConfigManager {
7994 geminiApiKey,
8095 geminiEmbeddingTaskType : geminiEmbeddingTaskType || "CODE_RETRIEVAL_QUERY" ,
8196 apiModelId : this . modelId ,
97+ geminiEmbeddingDimension,
98+ rateLimitSeconds,
8299 }
83100 }
84101
@@ -159,6 +176,7 @@ export class CodeIndexConfigManager {
159176 // Gemini requires an API key and Qdrant URL
160177 const geminiApiKey = this . geminiOptions ?. geminiApiKey
161178 const geminiEmbeddingTaskType = this . geminiOptions ?. geminiEmbeddingTaskType
179+
162180 const qdrantUrl = this . qdrantUrl
163181 const isConfigured = ! ! ( geminiApiKey && geminiEmbeddingTaskType && qdrantUrl )
164182 return isConfigured
@@ -180,6 +198,7 @@ export class CodeIndexConfigManager {
180198 const prevOpenAiKey = prev ?. openAiKey ?? ""
181199 const prevOllamaBaseUrl = prev ?. ollamaBaseUrl ?? ""
182200 const prevGeminiApiKey = prev ?. geminiApiKey ?? ""
201+ const prevGeminiEmbeddingDimension = prev ?. geminiEmbeddingDimension // Access from prev
183202 const prevQdrantUrl = prev ?. qdrantUrl ?? ""
184203 const prevQdrantApiKey = prev ?. qdrantApiKey ?? ""
185204
@@ -205,7 +224,9 @@ export class CodeIndexConfigManager {
205224 return true
206225 }
207226
208- if ( this . _hasVectorDimensionChanged ( prevProvider , prevModelId ) ) {
227+ // Check for dimension change, including the new geminiEmbeddingDimension
228+ if ( this . _hasVectorDimensionChanged ( prevProvider , prevModelId , prev . geminiEmbeddingDimension ) ) {
229+ // Use prev.geminiEmbeddingDimension
209230 return true
210231 }
211232
@@ -229,6 +250,11 @@ export class CodeIndexConfigManager {
229250 if ( prevGeminiApiKey !== currentGeminiApiKey ) {
230251 return true
231252 }
253+
254+ const currentGeminiEmbeddingDimension = this . geminiOptions ?. geminiEmbeddingDimension
255+ if ( currentGeminiEmbeddingDimension !== prevGeminiEmbeddingDimension ) {
256+ return true
257+ }
232258 }
233259
234260 // Qdrant configuration changes
@@ -246,19 +272,35 @@ export class CodeIndexConfigManager {
246272 /**
247273 * Checks if model changes result in vector dimension changes that require restart.
248274 */
249- private _hasVectorDimensionChanged ( prevProvider : EmbedderProvider , prevModelId ?: string ) : boolean {
275+ private _hasVectorDimensionChanged (
276+ prevProvider : EmbedderProvider ,
277+ prevModelId ?: string ,
278+ prevGeminiDimension ?: number ,
279+ ) : boolean {
250280 const currentProvider = this . embedderProvider
251281 const currentModelId = this . modelId ?? getDefaultModelId ( currentProvider )
252282 const resolvedPrevModelId = prevModelId ?? getDefaultModelId ( prevProvider )
253283
254284 // If model IDs are the same and provider is the same, no dimension change
255285 if ( prevProvider === currentProvider && resolvedPrevModelId === currentModelId ) {
286+ // If provider and model are same, check if gemini dimension changed
287+ if ( currentProvider === "gemini" && this . geminiOptions ?. geminiEmbeddingDimension !== prevGeminiDimension ) {
288+ return true
289+ }
256290 return false
257291 }
258292
259293 // Get vector dimensions for both models
260- const prevDimension = getModelDimension ( prevProvider , resolvedPrevModelId )
261- const currentDimension = getModelDimension ( currentProvider , currentModelId )
294+ const prevDimension = getModelDimension (
295+ prevProvider ,
296+ resolvedPrevModelId ,
297+ prevProvider === "gemini" ? prevGeminiDimension : undefined ,
298+ )
299+ const currentDimension = getModelDimension (
300+ currentProvider ,
301+ currentModelId ,
302+ currentProvider === "gemini" ? this . geminiOptions ?. geminiEmbeddingDimension : undefined ,
303+ )
262304
263305 // If we can't determine dimensions, be safe and restart
264306 if ( prevDimension === undefined || currentDimension === undefined ) {
@@ -284,6 +326,7 @@ export class CodeIndexConfigManager {
284326 qdrantUrl : this . qdrantUrl ,
285327 qdrantApiKey : this . qdrantApiKey ,
286328 searchMinScore : this . searchMinScore ,
329+ geminiEmbeddingDimension : this . geminiEmbeddingDimension ,
287330 }
288331 }
289332
0 commit comments