Skip to content

Commit 4aad732

Browse files
committed
fix: allow disabling codebase indexing without workspace
- Modified saveCodeIndexSettingsAtomic handler to allow saving settings when disabling the feature without a workspace - Updated requestIndexingStatus, startIndexing, and clearIndexData handlers to only show workspace errors when the feature is enabled - Clear error status when disabling the feature to prevent persistent error messages Fixes #6664
1 parent 4e8b174 commit 4aad732

File tree

1 file changed

+124
-67
lines changed

1 file changed

+124
-67
lines changed

src/core/webview/webviewMessageHandler.ts

Lines changed: 124 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -2057,62 +2057,37 @@ export const webviewMessageHandler = async (
20572057
// Update webview state
20582058
await provider.postStateToWebview()
20592059

2060-
// Then handle validation and initialization
2061-
if (provider.codeIndexManager) {
2062-
// If embedder provider changed, perform proactive validation
2063-
if (embedderProviderChanged) {
2060+
// If the feature is being disabled, we don't need to validate or show workspace errors
2061+
if (!settings.codebaseIndexEnabled) {
2062+
// If there's a code index manager, let it handle the disable
2063+
if (provider.codeIndexManager) {
20642064
try {
2065-
// Force handleSettingsChange which will trigger validation
20662065
await provider.codeIndexManager.handleSettingsChange()
20672066
} catch (error) {
2068-
// Validation failed - the error state is already set by handleSettingsChange
2067+
// Log but don't fail - settings are saved and feature is disabled
20692068
provider.log(
2070-
`Embedder validation failed after provider change: ${error instanceof Error ? error.message : String(error)}`,
2071-
)
2072-
// Send validation error to webview
2073-
await provider.postMessageToWebview({
2074-
type: "indexingStatusUpdate",
2075-
values: provider.codeIndexManager.getCurrentStatus(),
2076-
})
2077-
// Exit early - don't try to start indexing with invalid configuration
2078-
break
2079-
}
2080-
} else {
2081-
// No provider change, just handle settings normally
2082-
try {
2083-
await provider.codeIndexManager.handleSettingsChange()
2084-
} catch (error) {
2085-
// Log but don't fail - settings are saved
2086-
provider.log(
2087-
`Settings change handling error: ${error instanceof Error ? error.message : String(error)}`,
2069+
`Settings change handling error while disabling: ${error instanceof Error ? error.message : String(error)}`,
20882070
)
20892071
}
20902072
}
2073+
// Clear any error status when disabling
2074+
await provider.postMessageToWebview({
2075+
type: "indexingStatusUpdate",
2076+
values: {
2077+
systemStatus: "Standby",
2078+
message: "",
2079+
processedItems: 0,
2080+
totalItems: 0,
2081+
currentItemUnit: "items",
2082+
},
2083+
})
2084+
break
2085+
}
20912086

2092-
// Wait a bit more to ensure everything is ready
2093-
await new Promise((resolve) => setTimeout(resolve, 200))
2094-
2095-
// Auto-start indexing if now enabled and configured
2096-
if (provider.codeIndexManager.isFeatureEnabled && provider.codeIndexManager.isFeatureConfigured) {
2097-
if (!provider.codeIndexManager.isInitialized) {
2098-
try {
2099-
await provider.codeIndexManager.initialize(provider.contextProxy)
2100-
provider.log(`Code index manager initialized after settings save`)
2101-
} catch (error) {
2102-
provider.log(
2103-
`Code index initialization failed: ${error instanceof Error ? error.message : String(error)}`,
2104-
)
2105-
// Send error status to webview
2106-
await provider.postMessageToWebview({
2107-
type: "indexingStatusUpdate",
2108-
values: provider.codeIndexManager.getCurrentStatus(),
2109-
})
2110-
}
2111-
}
2112-
}
2113-
} else {
2114-
// No workspace open - send error status
2115-
provider.log("Cannot save code index settings: No workspace folder open")
2087+
// Feature is being enabled - check if we have a workspace
2088+
if (!provider.codeIndexManager) {
2089+
// No workspace open - send error status only when trying to enable
2090+
provider.log("Cannot enable code indexing: No workspace folder open")
21162091
await provider.postMessageToWebview({
21172092
type: "indexingStatusUpdate",
21182093
values: {
@@ -2123,6 +2098,60 @@ export const webviewMessageHandler = async (
21232098
currentItemUnit: "items",
21242099
},
21252100
})
2101+
break
2102+
}
2103+
2104+
// We have a workspace and feature is enabled - proceed with validation and initialization
2105+
// If embedder provider changed, perform proactive validation
2106+
if (embedderProviderChanged) {
2107+
try {
2108+
// Force handleSettingsChange which will trigger validation
2109+
await provider.codeIndexManager.handleSettingsChange()
2110+
} catch (error) {
2111+
// Validation failed - the error state is already set by handleSettingsChange
2112+
provider.log(
2113+
`Embedder validation failed after provider change: ${error instanceof Error ? error.message : String(error)}`,
2114+
)
2115+
// Send validation error to webview
2116+
await provider.postMessageToWebview({
2117+
type: "indexingStatusUpdate",
2118+
values: provider.codeIndexManager.getCurrentStatus(),
2119+
})
2120+
// Exit early - don't try to start indexing with invalid configuration
2121+
break
2122+
}
2123+
} else {
2124+
// No provider change, just handle settings normally
2125+
try {
2126+
await provider.codeIndexManager.handleSettingsChange()
2127+
} catch (error) {
2128+
// Log but don't fail - settings are saved
2129+
provider.log(
2130+
`Settings change handling error: ${error instanceof Error ? error.message : String(error)}`,
2131+
)
2132+
}
2133+
}
2134+
2135+
// Wait a bit more to ensure everything is ready
2136+
await new Promise((resolve) => setTimeout(resolve, 200))
2137+
2138+
// Auto-start indexing if now enabled and configured
2139+
if (provider.codeIndexManager.isFeatureEnabled && provider.codeIndexManager.isFeatureConfigured) {
2140+
if (!provider.codeIndexManager.isInitialized) {
2141+
try {
2142+
await provider.codeIndexManager.initialize(provider.contextProxy)
2143+
provider.log(`Code index manager initialized after settings save`)
2144+
} catch (error) {
2145+
provider.log(
2146+
`Code index initialization failed: ${error instanceof Error ? error.message : String(error)}`,
2147+
)
2148+
// Send error status to webview
2149+
await provider.postMessageToWebview({
2150+
type: "indexingStatusUpdate",
2151+
values: provider.codeIndexManager.getCurrentStatus(),
2152+
})
2153+
}
2154+
}
21262155
}
21272156
} catch (error) {
21282157
provider.log(`Error saving code index settings: ${error.message || error}`)
@@ -2138,17 +2167,35 @@ export const webviewMessageHandler = async (
21382167
case "requestIndexingStatus": {
21392168
const manager = provider.codeIndexManager
21402169
if (!manager) {
2141-
// No workspace open - send error status
2142-
provider.postMessageToWebview({
2143-
type: "indexingStatusUpdate",
2144-
values: {
2145-
systemStatus: "Error",
2146-
message: t("embeddings:orchestrator.indexingRequiresWorkspace"),
2147-
processedItems: 0,
2148-
totalItems: 0,
2149-
currentItemUnit: "items",
2150-
},
2151-
})
2170+
// No workspace open - check if feature is enabled
2171+
const codebaseIndexConfig = getGlobalState("codebaseIndexConfig") || {}
2172+
const isEnabled = codebaseIndexConfig.codebaseIndexEnabled ?? true
2173+
2174+
if (isEnabled) {
2175+
// Feature is enabled but no workspace - show error
2176+
provider.postMessageToWebview({
2177+
type: "indexingStatusUpdate",
2178+
values: {
2179+
systemStatus: "Error",
2180+
message: t("embeddings:orchestrator.indexingRequiresWorkspace"),
2181+
processedItems: 0,
2182+
totalItems: 0,
2183+
currentItemUnit: "items",
2184+
},
2185+
})
2186+
} else {
2187+
// Feature is disabled - show standby status
2188+
provider.postMessageToWebview({
2189+
type: "indexingStatusUpdate",
2190+
values: {
2191+
systemStatus: "Standby",
2192+
message: "",
2193+
processedItems: 0,
2194+
totalItems: 0,
2195+
currentItemUnit: "items",
2196+
},
2197+
})
2198+
}
21522199
return
21532200
}
21542201
const status = manager.getCurrentStatus()
@@ -2214,14 +2261,24 @@ export const webviewMessageHandler = async (
22142261
try {
22152262
const manager = provider.codeIndexManager
22162263
if (!manager) {
2217-
provider.log("Cannot clear index data: No workspace folder open")
2218-
provider.postMessageToWebview({
2219-
type: "indexCleared",
2220-
values: {
2221-
success: false,
2222-
error: t("embeddings:orchestrator.indexingRequiresWorkspace"),
2223-
},
2224-
})
2264+
// No workspace open - check if feature is enabled
2265+
const codebaseIndexConfig = getGlobalState("codebaseIndexConfig") || {}
2266+
const isEnabled = codebaseIndexConfig.codebaseIndexEnabled ?? true
2267+
2268+
if (isEnabled) {
2269+
// Only show error if feature is enabled
2270+
provider.log("Cannot clear index data: No workspace folder open")
2271+
provider.postMessageToWebview({
2272+
type: "indexCleared",
2273+
values: {
2274+
success: false,
2275+
error: t("embeddings:orchestrator.indexingRequiresWorkspace"),
2276+
},
2277+
})
2278+
} else {
2279+
// Feature is disabled, just return success
2280+
provider.postMessageToWebview({ type: "indexCleared", values: { success: true } })
2281+
}
22252282
return
22262283
}
22272284
await manager.clearIndexData()

0 commit comments

Comments
 (0)