Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 0 additions & 15 deletions webview-ui/src/components/chat/CodeIndexPopover.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import {
VSCodeDropdown,
VSCodeOption,
VSCodeLink,
VSCodeCheckbox,
} from "@vscode/webview-ui-toolkit/react"
import * as ProgressPrimitive from "@radix-ui/react-progress"
import { vscode } from "@src/utils/vscode"
Expand Down Expand Up @@ -513,20 +512,6 @@ export const CodeIndexPopover: React.FC<CodeIndexPopoverProps> = ({
</div>

<div className="p-4">
{/* Enable/Disable Toggle */}
<div className="mb-4">
<div className="flex items-center gap-2">
<VSCodeCheckbox
checked={currentSettings.codebaseIndexEnabled}
onChange={(e: any) => updateSetting("codebaseIndexEnabled", e.target.checked)}>
<span className="font-medium">{t("settings:codeIndex.enableLabel")}</span>
</VSCodeCheckbox>
<StandardTooltip content={t("settings:codeIndex.enableDescription")}>
<span className="codicon codicon-info text-xs text-vscode-descriptionForeground cursor-help" />
</StandardTooltip>
</div>
</div>

{/* Status Section */}
<div className="space-y-2">
<h4 className="text-sm font-medium">{t("settings:codeIndex.statusTitle")}</h4>
Expand Down
8 changes: 8 additions & 0 deletions webview-ui/src/components/chat/IndexingStatusBadge.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { vscode } from "@src/utils/vscode"
import { useAppTranslation } from "@/i18n/TranslationContext"
import { useTooltip } from "@/hooks/useTooltip"
import { CodeIndexPopover } from "./CodeIndexPopover"
import { useExtensionState } from "@/context/ExtensionStateContext"
import type { IndexingStatus, IndexingStatusUpdateMessage } from "@roo/ExtensionMessage"

interface IndexingStatusBadgeProps {
Expand All @@ -15,6 +16,7 @@ export const IndexingStatusBadge: React.FC<IndexingStatusBadgeProps> = ({ classN
const { t } = useAppTranslation()
const { showTooltip, handleMouseEnter, handleMouseLeave, cleanup } = useTooltip({ delay: 300 })
const [isHovered, setIsHovered] = useState(false)
const extensionState = useExtensionState()

const [indexingStatus, setIndexingStatus] = useState<IndexingStatus>({
systemStatus: "Standby",
Expand Down Expand Up @@ -52,6 +54,12 @@ export const IndexingStatusBadge: React.FC<IndexingStatusBadgeProps> = ({ classN
[indexingStatus.processedItems, indexingStatus.totalItems],
)

// Don't render the badge if codebase indexing is disabled
const codebaseIndexEnabled = extensionState.codebaseIndexConfig?.codebaseIndexEnabled ?? true
if (!codebaseIndexEnabled) {
return null
}

// Get tooltip text with internationalization
const getTooltipText = () => {
switch (indexingStatus.systemStatus) {
Expand Down
59 changes: 59 additions & 0 deletions webview-ui/src/components/settings/GeneralSettings.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import React, { type HTMLAttributes } from "react"
import { Settings } from "lucide-react"
import { VSCodeCheckbox } from "@vscode/webview-ui-toolkit/react"
import { useAppTranslation } from "@src/i18n/TranslationContext"
import { SectionHeader } from "./SectionHeader"
import { Section } from "./Section"
import { StandardTooltip } from "@src/components/ui"
import { cn } from "@src/lib/utils"

type GeneralSettingsProps = HTMLAttributes<HTMLDivElement> & {
codebaseIndexEnabled: boolean
setCodebaseIndexEnabled: (enabled: boolean) => void
}

export const GeneralSettings = ({
codebaseIndexEnabled,
setCodebaseIndexEnabled,
className,
...props
}: GeneralSettingsProps) => {
const { t } = useAppTranslation()

return (
<div className={cn("flex flex-col gap-2", className)} {...props}>
<SectionHeader description={t("settings:general.description")}>
<div className="flex items-center gap-2">
<Settings className="w-4" />
<div>{t("settings:sections.general")}</div>
</div>
</SectionHeader>

<Section>
{/* Codebase Indexing Enable/Disable */}
<div className="flex flex-col gap-3">
<div className="flex items-center gap-2 font-bold">
<span className="codicon codicon-database" />
<div>{t("settings:general.codebaseIndexing.label")}</div>
</div>

<div className="flex items-center gap-2">
<VSCodeCheckbox
checked={codebaseIndexEnabled}
onChange={(e: any) => setCodebaseIndexEnabled(e.target.checked)}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The GeneralSettings component cleanly implements the new UI section for codebase indexing. Consider using a specific event type (e.g. React.ChangeEvent) for the onChange handler instead of 'any' for better type safety.

Suggested change
onChange={(e: any) => setCodebaseIndexEnabled(e.target.checked)}
onChange={(e: React.ChangeEvent<HTMLInputElement>) => setCodebaseIndexEnabled(e.target.checked)}

data-testid="codebase-indexing-enabled-checkbox">
<span className="font-medium">{t("settings:general.codebaseIndexing.enableLabel")}</span>
</VSCodeCheckbox>
<StandardTooltip content={t("settings:general.codebaseIndexing.enableDescription")}>
<span className="codicon codicon-info text-xs text-vscode-descriptionForeground cursor-help" />
</StandardTooltip>
</div>

<div className="text-vscode-descriptionForeground text-sm">
{t("settings:general.codebaseIndexing.description")}
</div>
</div>
</Section>
</div>
)
}
49 changes: 48 additions & 1 deletion webview-ui/src/components/settings/SettingsView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import {
Globe,
Info,
MessageSquare,
Settings,
LucideIcon,
} from "lucide-react"

Expand Down Expand Up @@ -65,6 +66,7 @@ import { LanguageSettings } from "./LanguageSettings"
import { About } from "./About"
import { Section } from "./Section"
import PromptsSettings from "./PromptsSettings"
import { GeneralSettings } from "./GeneralSettings"
import { cn } from "@/lib/utils"

export const settingsTabsContainer = "flex flex-1 overflow-hidden [&.narrow_.tab-label]:hidden"
Expand All @@ -79,6 +81,7 @@ export interface SettingsViewRef {
}

const sectionNames = [
"general",
"providers",
"autoApprove",
"browser",
Expand Down Expand Up @@ -111,7 +114,7 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone, t
const [activeTab, setActiveTab] = useState<SectionName>(
targetSection && sectionNames.includes(targetSection as SectionName)
? (targetSection as SectionName)
: "providers",
: "general",
)

const prevApiConfigName = useRef(currentApiConfigName)
Expand Down Expand Up @@ -176,6 +179,7 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone, t
alwaysAllowFollowupQuestions,
alwaysAllowUpdateTodoList,
followupAutoApproveTimeoutMs,
codebaseIndexConfig,
} = cachedState

const apiConfiguration = useMemo(() => cachedState.apiConfiguration ?? {}, [cachedState.apiConfiguration])
Expand Down Expand Up @@ -258,6 +262,24 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone, t
})
}, [])

const setCodebaseIndexEnabled = useCallback((enabled: boolean) => {
setCachedState((prevState) => {
const currentConfig = prevState.codebaseIndexConfig || {}
if (currentConfig.codebaseIndexEnabled === enabled) {
return prevState
}

setChangeDetected(true)
return {
...prevState,
codebaseIndexConfig: {
...currentConfig,
codebaseIndexEnabled: enabled,
},
}
})
}, [])

const isSettingValid = !errorMessage

const handleSubmit = () => {
Expand Down Expand Up @@ -323,6 +345,22 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone, t
vscode.postMessage({ type: "upsertApiConfiguration", text: currentApiConfigName, apiConfiguration })
vscode.postMessage({ type: "telemetrySetting", text: telemetrySetting })
vscode.postMessage({ type: "profileThresholds", values: profileThresholds })

// Save codebase index settings with proper defaults
const codeIndexSettingsToSave = {
codebaseIndexEnabled: codebaseIndexConfig?.codebaseIndexEnabled ?? true,
codebaseIndexQdrantUrl: codebaseIndexConfig?.codebaseIndexQdrantUrl ?? "http://localhost:6333",
codebaseIndexEmbedderProvider: codebaseIndexConfig?.codebaseIndexEmbedderProvider ?? "openai",
codebaseIndexEmbedderBaseUrl: codebaseIndexConfig?.codebaseIndexEmbedderBaseUrl,
codebaseIndexEmbedderModelId: codebaseIndexConfig?.codebaseIndexEmbedderModelId ?? "",
codebaseIndexEmbedderModelDimension: codebaseIndexConfig?.codebaseIndexEmbedderModelDimension,
codebaseIndexSearchMaxResults: codebaseIndexConfig?.codebaseIndexSearchMaxResults,
codebaseIndexSearchMinScore: codebaseIndexConfig?.codebaseIndexSearchMinScore,
codebaseIndexOpenAiCompatibleBaseUrl: codebaseIndexConfig?.codebaseIndexOpenAiCompatibleBaseUrl,
codebaseIndexOpenAiCompatibleModelDimension:
codebaseIndexConfig?.codebaseIndexOpenAiCompatibleModelDimension,
}
vscode.postMessage({ type: "saveCodeIndexSettingsAtomic", codeIndexSettings: codeIndexSettingsToSave })
setChangeDetected(false)
}
}
Expand Down Expand Up @@ -392,6 +430,7 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone, t

const sections: { id: SectionName; icon: LucideIcon }[] = useMemo(
() => [
{ id: "general", icon: Settings },
{ id: "providers", icon: Webhook },
{ id: "autoApprove", icon: CheckCheck },
{ id: "browser", icon: SquareMousePointer },
Expand Down Expand Up @@ -539,6 +578,14 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone, t

{/* Content area */}
<TabContent className="p-0 flex-1 overflow-auto">
{/* General Section */}
{activeTab === "general" && (
<GeneralSettings
codebaseIndexEnabled={codebaseIndexConfig?.codebaseIndexEnabled ?? true}
setCodebaseIndexEnabled={setCodebaseIndexEnabled}
/>
)}

{/* Providers Section */}
{activeTab === "providers" && (
<div>
Expand Down
10 changes: 10 additions & 0 deletions webview-ui/src/i18n/locales/en/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
"discardButton": "Discard changes"
},
"sections": {
"general": "General",
"providers": "Providers",
"autoApprove": "Auto-Approve",
"browser": "Browser",
Expand All @@ -33,6 +34,15 @@
"language": "Language",
"about": "About Roo Code"
},
"general": {
"description": "Configure general application settings and preferences.",
"codebaseIndexing": {
"label": "Codebase Indexing",
"enableLabel": "Enable Codebase Indexing",
"enableDescription": "Enable code indexing for improved search and context understanding",
"description": "When enabled, Roo can index your codebase to provide better search and context understanding capabilities."
}
},
"prompts": {
"description": "Configure support prompts that are used for quick actions like enhancing prompts, explaining code, and fixing issues. These prompts help Roo provide better assistance for common development tasks."
},
Expand Down
Loading