Skip to content

Commit b836def

Browse files
committed
feat(chat): add advanced settings for maximum search results configuration
1 parent ed06361 commit b836def

File tree

2 files changed

+68
-56
lines changed

2 files changed

+68
-56
lines changed

webview-ui/src/components/chat/CodeIndexPopover.tsx

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,13 @@ import {
3131
Popover,
3232
PopoverContent,
3333
PopoverTrigger,
34+
Slider,
35+
StandardTooltip,
3436
} from "@src/components/ui"
3537
import { useRooPortal } from "@src/components/ui/hooks/useRooPortal"
3638
import type { EmbedderProvider } from "@roo/embeddingModels"
3739
import type { IndexingStatus } from "@roo/ExtensionMessage"
40+
import { CODEBASE_INDEX_DEFAULTS } from "@roo-code/types"
3841

3942
interface CodeIndexPopoverProps {
4043
children: React.ReactNode
@@ -48,6 +51,7 @@ interface LocalCodeIndexSettings {
4851
codebaseIndexEmbedderProvider: EmbedderProvider
4952
codebaseIndexEmbedderBaseUrl?: string
5053
codebaseIndexEmbedderModelId: string
54+
codebaseIndexSearchMaxResults?: number
5155

5256
// Secret settings (start empty, will be loaded separately)
5357
codeIndexOpenAiKey?: string
@@ -66,6 +70,7 @@ export const CodeIndexPopover: React.FC<CodeIndexPopoverProps> = ({
6670
const { t } = useAppTranslation()
6771
const { codebaseIndexConfig, codebaseIndexModels } = useExtensionState()
6872
const [open, setOpen] = useState(false)
73+
const [isAdvancedSettingsOpen, setIsAdvancedSettingsOpen] = useState(false)
6974

7075
const [indexingStatus, setIndexingStatus] = useState<IndexingStatus>(externalIndexingStatus)
7176

@@ -79,6 +84,7 @@ export const CodeIndexPopover: React.FC<CodeIndexPopoverProps> = ({
7984
codebaseIndexEmbedderProvider: "openai",
8085
codebaseIndexEmbedderBaseUrl: "",
8186
codebaseIndexEmbedderModelId: "",
87+
codebaseIndexSearchMaxResults: CODEBASE_INDEX_DEFAULTS.DEFAULT_SEARCH_RESULTS,
8288
codeIndexOpenAiKey: "",
8389
codeIndexQdrantApiKey: "",
8490
codebaseIndexOpenAiCompatibleBaseUrl: "",
@@ -107,6 +113,8 @@ export const CodeIndexPopover: React.FC<CodeIndexPopoverProps> = ({
107113
codebaseIndexEmbedderProvider: codebaseIndexConfig.codebaseIndexEmbedderProvider || "openai",
108114
codebaseIndexEmbedderBaseUrl: codebaseIndexConfig.codebaseIndexEmbedderBaseUrl || "",
109115
codebaseIndexEmbedderModelId: codebaseIndexConfig.codebaseIndexEmbedderModelId || "",
116+
codebaseIndexSearchMaxResults:
117+
codebaseIndexConfig.codebaseIndexSearchMaxResults || CODEBASE_INDEX_DEFAULTS.DEFAULT_SEARCH_RESULTS,
110118
codeIndexOpenAiKey: "",
111119
codeIndexQdrantApiKey: "",
112120
codebaseIndexOpenAiCompatibleBaseUrl: "",
@@ -575,6 +583,65 @@ export const CodeIndexPopover: React.FC<CodeIndexPopoverProps> = ({
575583
/>
576584
</div>
577585

586+
{/* Advanced Settings Disclosure */}
587+
<div className="mt-4">
588+
<button
589+
onClick={() => setIsAdvancedSettingsOpen(!isAdvancedSettingsOpen)}
590+
className="flex items-center text-xs text-vscode-foreground hover:text-vscode-textLink-foreground focus:outline-none"
591+
aria-expanded={isAdvancedSettingsOpen}>
592+
<span
593+
className={`codicon codicon-${isAdvancedSettingsOpen ? "chevron-down" : "chevron-right"} mr-1`}></span>
594+
<span>{t("settings:codeIndex.advancedConfigLabel")}</span>
595+
</button>
596+
597+
{isAdvancedSettingsOpen && (
598+
<div className="mt-4 space-y-4 pl-4">
599+
{/* Maximum Search Results Slider */}
600+
<div className="space-y-2">
601+
<div className="flex items-center gap-2">
602+
<label className="text-sm font-medium">
603+
{t("settings:codeIndex.searchMaxResultsLabel")}
604+
</label>
605+
<StandardTooltip content={t("settings:codeIndex.searchMaxResultsDescription")}>
606+
<span className="codicon codicon-info text-xs text-vscode-descriptionForeground cursor-help" />
607+
</StandardTooltip>
608+
</div>
609+
<div className="flex items-center gap-2">
610+
<Slider
611+
min={CODEBASE_INDEX_DEFAULTS.MIN_SEARCH_RESULTS}
612+
max={CODEBASE_INDEX_DEFAULTS.MAX_SEARCH_RESULTS}
613+
step={CODEBASE_INDEX_DEFAULTS.SEARCH_RESULTS_STEP}
614+
value={[
615+
currentSettings.codebaseIndexSearchMaxResults ||
616+
CODEBASE_INDEX_DEFAULTS.DEFAULT_SEARCH_RESULTS,
617+
]}
618+
onValueChange={(values) =>
619+
updateSetting("codebaseIndexSearchMaxResults", values[0])
620+
}
621+
className="flex-1"
622+
data-testid="search-max-results-slider"
623+
/>
624+
<span className="w-12 text-center">
625+
{currentSettings.codebaseIndexSearchMaxResults ||
626+
CODEBASE_INDEX_DEFAULTS.DEFAULT_SEARCH_RESULTS}
627+
</span>
628+
<VSCodeButton
629+
appearance="icon"
630+
title={t("settings:codeIndex.resetToDefault")}
631+
onClick={() =>
632+
updateSetting(
633+
"codebaseIndexSearchMaxResults",
634+
CODEBASE_INDEX_DEFAULTS.DEFAULT_SEARCH_RESULTS,
635+
)
636+
}>
637+
<span className="codicon codicon-discard" />
638+
</VSCodeButton>
639+
</div>
640+
</div>
641+
</div>
642+
)}
643+
</div>
644+
578645
{/* Action Buttons */}
579646
<div className="flex items-center justify-between gap-2 pt-2">
580647
<div className="flex gap-2">

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

Lines changed: 1 addition & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { HTMLAttributes } from "react"
22
import { FlaskConical } from "lucide-react"
3-
import { VSCodeCheckbox, VSCodeLink, VSCodeButton } from "@vscode/webview-ui-toolkit/react"
3+
import { VSCodeCheckbox, VSCodeLink } from "@vscode/webview-ui-toolkit/react"
44
import { Trans } from "react-i18next"
55

66
import type { Experiments, CodebaseIndexConfig, CodebaseIndexModels } from "@roo-code/types"
@@ -10,17 +10,13 @@ import { EXPERIMENT_IDS, experimentConfigsMap } from "@roo/experiments"
1010
import { useAppTranslation } from "@src/i18n/TranslationContext"
1111
import { cn } from "@src/lib/utils"
1212
import { buildDocLink } from "@src/utils/docLinks"
13-
import { Slider } from "@src/components/ui"
1413

1514
import { SetExperimentEnabled } from "./types"
1615
import { SectionHeader } from "./SectionHeader"
1716
import { Section } from "./Section"
1817
import { ExperimentalFeature } from "./ExperimentalFeature"
1918
import { SetCachedStateField } from "./types"
2019

21-
// Import the constant from the backend
22-
const DEFAULT_MAX_SEARCH_RESULTS = 50
23-
2420
type ExperimentalSettingsProps = HTMLAttributes<HTMLDivElement> & {
2521
experiments: Experiments
2622
setExperimentEnabled: SetExperimentEnabled
@@ -109,57 +105,6 @@ export const ExperimentalSettings = ({
109105
</Trans>
110106
</p>
111107
</div>
112-
113-
{/* Max Search Results Slider */}
114-
{codebaseIndexEnabled && (
115-
<div className="mt-4 ml-6">
116-
<div className="flex flex-col gap-2">
117-
<span className="block font-medium mb-1">
118-
{t("settings:codeIndex.searchMaxResultsLabel")}
119-
</span>
120-
<div className="flex items-center gap-4">
121-
<Slider
122-
min={10}
123-
max={200}
124-
step={10}
125-
value={[
126-
codebaseIndexConfig?.codebaseIndexSearchMaxResults ??
127-
DEFAULT_MAX_SEARCH_RESULTS,
128-
]}
129-
onValueChange={([value]) =>
130-
setCachedStateField &&
131-
codebaseIndexConfig &&
132-
setCachedStateField("codebaseIndexConfig", {
133-
...codebaseIndexConfig,
134-
codebaseIndexSearchMaxResults: value,
135-
})
136-
}
137-
data-testid="search-max-results-slider"
138-
aria-label={t("settings:codeIndex.searchMaxResultsLabel")}
139-
/>
140-
<span className="w-10">
141-
{codebaseIndexConfig?.codebaseIndexSearchMaxResults ?? DEFAULT_MAX_SEARCH_RESULTS}
142-
</span>
143-
<VSCodeButton
144-
appearance="icon"
145-
onClick={() =>
146-
setCachedStateField &&
147-
codebaseIndexConfig &&
148-
setCachedStateField("codebaseIndexConfig", {
149-
...codebaseIndexConfig,
150-
codebaseIndexSearchMaxResults: DEFAULT_MAX_SEARCH_RESULTS,
151-
})
152-
}
153-
title={t("settings:codeIndex.resetToDefault")}>
154-
<span className="codicon codicon-discard"></span>
155-
</VSCodeButton>
156-
</div>
157-
<div className="text-vscode-descriptionForeground text-sm mt-1">
158-
{t("settings:codeIndex.searchMaxResultsDescription")}
159-
</div>
160-
</div>
161-
</div>
162-
)}
163108
</Section>
164109
</div>
165110
)

0 commit comments

Comments
 (0)