@@ -1113,6 +1113,21 @@ export const webviewMessageHandler = async (
11131113 break
11141114 case "browserToolEnabled" :
11151115 await updateGlobalState ( "browserToolEnabled" , message . bool ?? true )
1116+ await provider . postStateToWebview ( )
1117+ break
1118+ case "codebaseIndexEnabled" :
1119+ // Update the codebaseIndexConfig with the new enabled state
1120+ const currentCodebaseConfig = getGlobalState ( "codebaseIndexConfig" ) || { }
1121+ await updateGlobalState ( "codebaseIndexConfig" , {
1122+ ...currentCodebaseConfig ,
1123+ codebaseIndexEnabled : message . bool ?? false ,
1124+ } )
1125+
1126+ // Notify the code index manager about the change
1127+ if ( provider . codeIndexManager ) {
1128+ await provider . codeIndexManager . handleSettingsChange ( )
1129+ }
1130+
11161131 await provider . postStateToWebview ( )
11171132 break
11181133 case "language" :
@@ -1806,38 +1821,86 @@ export const webviewMessageHandler = async (
18061821
18071822 break
18081823 }
1809- case "codebaseIndexConfig" : {
1810- const codebaseIndexConfig = message . values ?? {
1811- codebaseIndexEnabled : false ,
1812- codebaseIndexQdrantUrl : "http://localhost:6333" ,
1813- codebaseIndexEmbedderProvider : "openai" ,
1814- codebaseIndexEmbedderBaseUrl : "" ,
1815- codebaseIndexEmbedderModelId : "" ,
1824+
1825+ case "saveCodeIndexSettingsAtomic" : {
1826+ if ( ! message . codeIndexSettings ) {
1827+ break
18161828 }
1817- await updateGlobalState ( "codebaseIndexConfig" , codebaseIndexConfig )
1829+
1830+ const settings = message . codeIndexSettings
18181831
18191832 try {
1833+ // Save global state settings atomically (without codebaseIndexEnabled which is now in global settings)
1834+ const currentConfig = getGlobalState ( "codebaseIndexConfig" ) || { }
1835+ const globalStateConfig = {
1836+ ...currentConfig ,
1837+ codebaseIndexQdrantUrl : settings . codebaseIndexQdrantUrl ,
1838+ codebaseIndexEmbedderProvider : settings . codebaseIndexEmbedderProvider ,
1839+ codebaseIndexEmbedderBaseUrl : settings . codebaseIndexEmbedderBaseUrl ,
1840+ codebaseIndexEmbedderModelId : settings . codebaseIndexEmbedderModelId ,
1841+ codebaseIndexOpenAiCompatibleBaseUrl : settings . codebaseIndexOpenAiCompatibleBaseUrl ,
1842+ codebaseIndexOpenAiCompatibleModelDimension : settings . codebaseIndexOpenAiCompatibleModelDimension ,
1843+ }
1844+
1845+ // Save global state first
1846+ await updateGlobalState ( "codebaseIndexConfig" , globalStateConfig )
1847+
1848+ // Save secrets directly using context proxy
1849+ if ( settings . codeIndexOpenAiKey !== undefined ) {
1850+ await provider . contextProxy . storeSecret ( "codeIndexOpenAiKey" , settings . codeIndexOpenAiKey )
1851+ }
1852+ if ( settings . codeIndexQdrantApiKey !== undefined ) {
1853+ await provider . contextProxy . storeSecret ( "codeIndexQdrantApiKey" , settings . codeIndexQdrantApiKey )
1854+ }
1855+ if ( settings . codebaseIndexOpenAiCompatibleApiKey !== undefined ) {
1856+ await provider . contextProxy . storeSecret (
1857+ "codebaseIndexOpenAiCompatibleApiKey" ,
1858+ settings . codebaseIndexOpenAiCompatibleApiKey ,
1859+ )
1860+ }
1861+ if ( settings . codebaseIndexGeminiApiKey !== undefined ) {
1862+ await provider . contextProxy . storeSecret (
1863+ "codebaseIndexGeminiApiKey" ,
1864+ settings . codebaseIndexGeminiApiKey ,
1865+ )
1866+ }
1867+
1868+ // Verify secrets are actually stored
1869+ const storedOpenAiKey = provider . contextProxy . getSecret ( "codeIndexOpenAiKey" )
1870+
1871+ // Notify code index manager of changes
18201872 if ( provider . codeIndexManager ) {
1821- await provider . codeIndexManager . handleExternalSettingsChange ( )
1873+ await provider . codeIndexManager . handleSettingsChange ( )
18221874
1823- // If now configured and enabled, start indexing automatically
1875+ // Auto-start indexing if now enabled and configured
18241876 if ( provider . codeIndexManager . isFeatureEnabled && provider . codeIndexManager . isFeatureConfigured ) {
18251877 if ( ! provider . codeIndexManager . isInitialized ) {
18261878 await provider . codeIndexManager . initialize ( provider . contextProxy )
18271879 }
1828- // Start indexing in background (no await)
18291880 provider . codeIndexManager . startIndexing ( )
18301881 }
18311882 }
1883+
1884+ // Send success response
1885+ await provider . postMessageToWebview ( {
1886+ type : "codeIndexSettingsSaved" ,
1887+ success : true ,
1888+ settings : globalStateConfig ,
1889+ } )
1890+
1891+ // Update webview state
1892+ await provider . postStateToWebview ( )
18321893 } catch ( error ) {
1833- provider . log (
1834- `[CodeIndexManager] Error during background CodeIndexManager configuration/indexing: ${ error . message || error } ` ,
1835- )
1894+ provider . log ( `Error saving code index settings: ${ error . message || error } ` )
1895+ await provider . postMessageToWebview ( {
1896+ type : "codeIndexSettingsSaved" ,
1897+ success : false ,
1898+ error : error . message || "Failed to save settings" ,
1899+ } )
18361900 }
1837-
1838- await provider . postStateToWebview ( )
18391901 break
18401902 }
1903+
18411904 case "requestIndexingStatus" : {
18421905 const status = provider . codeIndexManager ! . getCurrentStatus ( )
18431906 provider . postMessageToWebview ( {
@@ -1846,6 +1909,26 @@ export const webviewMessageHandler = async (
18461909 } )
18471910 break
18481911 }
1912+ case "requestCodeIndexSecretStatus" : {
1913+ // Check if secrets are set using the VSCode context directly for async access
1914+ const hasOpenAiKey = ! ! ( await provider . context . secrets . get ( "codeIndexOpenAiKey" ) )
1915+ const hasQdrantApiKey = ! ! ( await provider . context . secrets . get ( "codeIndexQdrantApiKey" ) )
1916+ const hasOpenAiCompatibleApiKey = ! ! ( await provider . context . secrets . get (
1917+ "codebaseIndexOpenAiCompatibleApiKey" ,
1918+ ) )
1919+ const hasGeminiApiKey = ! ! ( await provider . context . secrets . get ( "codebaseIndexGeminiApiKey" ) )
1920+
1921+ provider . postMessageToWebview ( {
1922+ type : "codeIndexSecretStatus" ,
1923+ values : {
1924+ hasOpenAiKey,
1925+ hasQdrantApiKey,
1926+ hasOpenAiCompatibleApiKey,
1927+ hasGeminiApiKey,
1928+ } ,
1929+ } )
1930+ break
1931+ }
18491932 case "startIndexing" : {
18501933 try {
18511934 const manager = provider . codeIndexManager !
0 commit comments