Skip to content

Commit 12d2c5d

Browse files
committed
feat: separate code index enable/disable from indexing settings
- Move 'Enable codebase indexing' toggle to global settings in Experimental section - Keep indexing-specific settings (API keys, URLs, models) in dedicated Code Index Settings component - Add codebaseIndexEnabled handler to webview message handler - Update translations with new settings title and disabled message - Ensure code index service properly responds to enable/disable changes - Maintain backward compatibility with existing codebaseIndexConfig structure
1 parent 5fd2c5a commit 12d2c5d

File tree

7 files changed

+64
-26
lines changed

7 files changed

+64
-26
lines changed

src/core/webview/webviewMessageHandler.ts

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1102,6 +1102,21 @@ export const webviewMessageHandler = async (
11021102
break
11031103
case "browserToolEnabled":
11041104
await updateGlobalState("browserToolEnabled", message.bool ?? true)
1105+
await provider.postStateToWebview()
1106+
break
1107+
case "codebaseIndexEnabled":
1108+
// Update the codebaseIndexConfig with the new enabled state
1109+
const currentCodebaseConfig = getGlobalState("codebaseIndexConfig") || {}
1110+
await updateGlobalState("codebaseIndexConfig", {
1111+
...currentCodebaseConfig,
1112+
codebaseIndexEnabled: message.bool ?? false,
1113+
})
1114+
1115+
// Notify the code index manager about the change
1116+
if (provider.codeIndexManager) {
1117+
await provider.codeIndexManager.handleSettingsChange()
1118+
}
1119+
11051120
await provider.postStateToWebview()
11061121
break
11071122
case "language":
@@ -1574,9 +1589,10 @@ export const webviewMessageHandler = async (
15741589
: "undefined",
15751590
})
15761591

1577-
// Save global state settings atomically
1592+
// Save global state settings atomically (without codebaseIndexEnabled which is now in global settings)
1593+
const currentConfig = getGlobalState("codebaseIndexConfig") || {}
15781594
const globalStateConfig = {
1579-
codebaseIndexEnabled: settings.codebaseIndexEnabled,
1595+
...currentConfig,
15801596
codebaseIndexQdrantUrl: settings.codebaseIndexQdrantUrl,
15811597
codebaseIndexEmbedderProvider: settings.codebaseIndexEmbedderProvider,
15821598
codebaseIndexEmbedderBaseUrl: settings.codebaseIndexEmbedderBaseUrl,

src/services/code-index/manager.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,7 @@ export class CodeIndexManager {
318318
await this._recreateServices()
319319

320320
// Start indexing with new services
321-
await this.startIndexing()
321+
this.startIndexing()
322322
} else {
323323
console.log(`[DEBUG Manager] No restart needed or conditions not met`)
324324
}

src/shared/WebviewMessage.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ export interface WebviewMessage {
138138
| "humanRelayResponse"
139139
| "humanRelayCancel"
140140
| "browserToolEnabled"
141+
| "codebaseIndexEnabled"
141142
| "telemetrySetting"
142143
| "showRooIgnoredFiles"
143144
| "testBrowserConnection"

webview-ui/src/components/settings/CodeIndexSettings.tsx

Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
import React, { useState, useCallback, useEffect } from "react"
2-
import { VSCodeButton, VSCodeCheckbox, VSCodeTextField, VSCodeLink } from "@vscode/webview-ui-toolkit/react"
3-
import { Trans } from "react-i18next"
2+
import { VSCodeButton, VSCodeTextField } from "@vscode/webview-ui-toolkit/react"
43
import * as ProgressPrimitive from "@radix-ui/react-progress"
54

65
import { CodebaseIndexConfig, CodebaseIndexModels } from "@roo-code/types"
76
import { EmbedderProvider } from "@roo/embeddingModels"
87

98
import { vscode } from "@src/utils/vscode"
109
import { useAppTranslation } from "@src/i18n/TranslationContext"
11-
import { buildDocLink } from "@src/utils/docLinks"
1210

1311
import {
1412
Select,
@@ -34,7 +32,6 @@ interface CodeIndexSettingsProps {
3432

3533
interface LocalCodeIndexSettings {
3634
// Global state settings
37-
codebaseIndexEnabled: boolean
3835
codebaseIndexQdrantUrl: string
3936
codebaseIndexEmbedderProvider: EmbedderProvider
4037
codebaseIndexEmbedderBaseUrl?: string
@@ -59,7 +56,6 @@ export const CodeIndexSettings: React.FC<CodeIndexSettingsProps> = ({ codebaseIn
5956

6057
const [localSettings, setLocalSettings] = useState<LocalCodeIndexSettings>({
6158
// Global state settings
62-
codebaseIndexEnabled: codebaseIndexConfig?.codebaseIndexEnabled || false,
6359
codebaseIndexQdrantUrl: codebaseIndexConfig?.codebaseIndexQdrantUrl || "http://localhost:6333",
6460
codebaseIndexEmbedderProvider: codebaseIndexConfig?.codebaseIndexEmbedderProvider || "openai",
6561
codebaseIndexEmbedderBaseUrl: codebaseIndexConfig?.codebaseIndexEmbedderBaseUrl || "",
@@ -98,7 +94,6 @@ export const CodeIndexSettings: React.FC<CodeIndexSettingsProps> = ({ codebaseIn
9894
if (codebaseIndexConfig) {
9995
setLocalSettings((prev) => ({
10096
...prev,
101-
codebaseIndexEnabled: codebaseIndexConfig.codebaseIndexEnabled || false,
10297
codebaseIndexQdrantUrl: codebaseIndexConfig.codebaseIndexQdrantUrl || "http://localhost:6333",
10398
codebaseIndexEmbedderProvider: codebaseIndexConfig.codebaseIndexEmbedderProvider || "openai",
10499
codebaseIndexEmbedderBaseUrl: codebaseIndexConfig.codebaseIndexEmbedderBaseUrl || "",
@@ -168,7 +163,6 @@ export const CodeIndexSettings: React.FC<CodeIndexSettingsProps> = ({ codebaseIn
168163
// Only send fields that have been modified
169164
const settingsToSave: any = {
170165
// Always include non-secret settings
171-
codebaseIndexEnabled: localSettings.codebaseIndexEnabled,
172166
codebaseIndexQdrantUrl: localSettings.codebaseIndexQdrantUrl,
173167
codebaseIndexEmbedderProvider: localSettings.codebaseIndexEmbedderProvider,
174168
codebaseIndexEmbedderBaseUrl: localSettings.codebaseIndexEmbedderBaseUrl,
@@ -254,16 +248,12 @@ export const CodeIndexSettings: React.FC<CodeIndexSettingsProps> = ({ codebaseIn
254248
return (
255249
<>
256250
<div>
257-
<div className="flex items-center justify-between">
251+
<div className="flex items-center justify-between mb-3">
258252
<div className="flex items-center gap-2">
259-
<VSCodeCheckbox
260-
checked={localSettings.codebaseIndexEnabled}
261-
onChange={(e: any) => updateSetting("codebaseIndexEnabled", e.target.checked)}>
262-
<span className="font-medium">{t("settings:codeIndex.enableLabel")}</span>
263-
</VSCodeCheckbox>
253+
<h4 className="font-medium m-0">{t("settings:codeIndex.settingsTitle")}</h4>
264254
</div>
265255

266-
{/* Save Settings Section - Moved to top right */}
256+
{/* Save Settings Section */}
267257
<div className="flex gap-2 items-center">
268258
<VSCodeButton onClick={saveSettings} disabled={saveStatus === "saving" || !hasUnsavedChanges}>
269259
{saveStatus === "saving" ? "Saving..." : "Save Settings"}
@@ -278,17 +268,10 @@ export const CodeIndexSettings: React.FC<CodeIndexSettingsProps> = ({ codebaseIn
278268
)}
279269
</div>
280270
</div>
281-
<p className="text-vscode-descriptionForeground text-sm mt-0">
282-
<Trans i18nKey="settings:codeIndex.enableDescription">
283-
<VSCodeLink
284-
href={buildDocLink("features/experimental/codebase-indexing", "settings")}
285-
style={{ display: "inline" }}></VSCodeLink>
286-
</Trans>
287-
</p>
288271
</div>
289272

290-
{localSettings.codebaseIndexEnabled && (
291-
<div className="flex flex-col gap-3 pl-3 border-l-2 border-vscode-button-background">
273+
{codebaseIndexConfig?.codebaseIndexEnabled && (
274+
<div className="flex flex-col gap-3">
292275
<div className="text-sm text-vscode-descriptionForeground">
293276
<span
294277
className={`
@@ -556,6 +539,12 @@ export const CodeIndexSettings: React.FC<CodeIndexSettingsProps> = ({ codebaseIn
556539
)}
557540
</div>
558541
)}
542+
543+
{!codebaseIndexConfig?.codebaseIndexEnabled && (
544+
<div className="text-vscode-descriptionForeground text-sm">
545+
<p>{t("settings:codeIndex.disabledMessage")}</p>
546+
</div>
547+
)}
559548
</>
560549
)
561550
}

webview-ui/src/components/settings/ExperimentalSettings.tsx

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,41 @@
11
import { HTMLAttributes } from "react"
22
import { FlaskConical } from "lucide-react"
3+
import { VSCodeCheckbox, VSCodeLink } from "@vscode/webview-ui-toolkit/react"
4+
import { Trans } from "react-i18next"
35

46
import type { Experiments, CodebaseIndexConfig, CodebaseIndexModels } from "@roo-code/types"
57

68
import { EXPERIMENT_IDS, experimentConfigsMap } from "@roo/experiments"
79

810
import { useAppTranslation } from "@src/i18n/TranslationContext"
911
import { cn } from "@src/lib/utils"
12+
import { buildDocLink } from "@src/utils/docLinks"
1013

1114
import { SetExperimentEnabled } from "./types"
1215
import { SectionHeader } from "./SectionHeader"
1316
import { Section } from "./Section"
1417
import { ExperimentalFeature } from "./ExperimentalFeature"
1518
import { CodeIndexSettings } from "./CodeIndexSettings"
19+
import { SetCachedStateField } from "./types"
1620

1721
type ExperimentalSettingsProps = HTMLAttributes<HTMLDivElement> & {
1822
experiments: Experiments
1923
setExperimentEnabled: SetExperimentEnabled
2024
// CodeIndexSettings props
2125
codebaseIndexModels: CodebaseIndexModels | undefined
2226
codebaseIndexConfig: CodebaseIndexConfig | undefined
27+
// For codebase index enabled toggle
28+
codebaseIndexEnabled?: boolean
29+
setCachedStateField?: SetCachedStateField<any>
2330
}
2431

2532
export const ExperimentalSettings = ({
2633
experiments,
2734
setExperimentEnabled,
2835
codebaseIndexModels,
2936
codebaseIndexConfig,
37+
codebaseIndexEnabled,
38+
setCachedStateField,
3039
className,
3140
...props
3241
}: ExperimentalSettingsProps) => {
@@ -72,6 +81,25 @@ export const ExperimentalSettings = ({
7281
)
7382
})}
7483

84+
{/* Codebase Indexing Enable/Disable Toggle */}
85+
<div className="mt-4">
86+
<div className="flex items-center gap-2">
87+
<VSCodeCheckbox
88+
checked={codebaseIndexEnabled || false}
89+
onChange={(e: any) => setCachedStateField?.("codebaseIndexEnabled", e.target.checked)}>
90+
<span className="font-medium">{t("settings:codeIndex.enableLabel")}</span>
91+
</VSCodeCheckbox>
92+
</div>
93+
<p className="text-vscode-descriptionForeground text-sm mt-1 ml-6">
94+
<Trans i18nKey="settings:codeIndex.enableDescription">
95+
<VSCodeLink
96+
href={buildDocLink("features/experimental/codebase-indexing", "settings")}
97+
style={{ display: "inline" }}></VSCodeLink>
98+
</Trans>
99+
</p>
100+
</div>
101+
102+
{/* Code Index Settings - Only shown when enabled */}
75103
<CodeIndexSettings
76104
codebaseIndexModels={codebaseIndexModels}
77105
codebaseIndexConfig={codebaseIndexConfig}

webview-ui/src/components/settings/SettingsView.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -686,6 +686,8 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone, t
686686
experiments={experiments}
687687
codebaseIndexModels={codebaseIndexModels}
688688
codebaseIndexConfig={codebaseIndexConfig}
689+
codebaseIndexEnabled={codebaseIndexConfig?.codebaseIndexEnabled}
690+
setCachedStateField={setCachedStateField}
689691
/>
690692
)}
691693

webview-ui/src/i18n/locales/en/settings.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040
"title": "Codebase Indexing",
4141
"enableLabel": "Enable Codebase Indexing",
4242
"enableDescription": "<0>Codebase Indexing</0> is an experimental feature that creates a semantic search index of your project using AI embeddings. This enables Roo Code to better understand and navigate large codebases by finding relevant code based on meaning rather than just keywords.",
43+
"settingsTitle": "Indexing Settings",
44+
"disabledMessage": "Codebase indexing is currently disabled. Enable it in the global settings to configure indexing options.",
4345
"providerLabel": "Embeddings Provider",
4446
"selectProviderPlaceholder": "Select provider",
4547
"openaiProvider": "OpenAI",

0 commit comments

Comments
 (0)