diff --git a/webview-ui/src/components/chat/ChatTextArea.tsx b/webview-ui/src/components/chat/ChatTextArea.tsx
index 993912f240..d54d043db6 100644
--- a/webview-ui/src/components/chat/ChatTextArea.tsx
+++ b/webview-ui/src/components/chat/ChatTextArea.tsx
@@ -45,7 +45,7 @@ interface ChatTextAreaProps {
onSelectImages: () => void
shouldDisableImages: boolean
onHeightChange?: (height: number) => void
- mode: Mode
+ mode: Mode | undefined | null
setMode: (value: Mode) => void
modeShortcutText: string
// Edit mode props
diff --git a/webview-ui/src/components/chat/ModeSelector.tsx b/webview-ui/src/components/chat/ModeSelector.tsx
index 3f843344a2..d5bc3c2923 100644
--- a/webview-ui/src/components/chat/ModeSelector.tsx
+++ b/webview-ui/src/components/chat/ModeSelector.tsx
@@ -4,7 +4,7 @@ import { Check, X } from "lucide-react"
import { type ModeConfig, type CustomModePrompts, TelemetryEventName } from "@roo-code/types"
-import { type Mode, getAllModes } from "@roo/modes"
+import { type Mode, getAllModes, defaultModeSlug } from "@roo/modes"
import { vscode } from "@/utils/vscode"
import { telemetryClient } from "@/utils/TelemetryClient"
@@ -19,7 +19,7 @@ import { IconButton } from "./IconButton"
const SEARCH_THRESHOLD = 6
interface ModeSelectorProps {
- value: Mode
+ value: Mode | undefined | null
onChange: (value: Mode) => void
disabled?: boolean
title: string
@@ -71,8 +71,21 @@ export const ModeSelector = ({
}))
}, [customModes, customModePrompts])
+ // Ensure we have a valid mode value, fallback to default if undefined/null
+ const effectiveValue = React.useMemo(() => {
+ if (!value) {
+ return defaultModeSlug
+ }
+ // Check if the value exists in available modes
+ const modeExists = modes.some((mode) => mode.slug === value)
+ return modeExists ? value : defaultModeSlug
+ }, [value, modes])
+
// Find the selected mode.
- const selectedMode = React.useMemo(() => modes.find((mode) => mode.slug === value), [modes, value])
+ const selectedMode = React.useMemo(
+ () => modes.find((mode) => mode.slug === effectiveValue),
+ [modes, effectiveValue],
+ )
// Memoize searchable items for fuzzy search with separate name and
// description search.
@@ -209,7 +222,7 @@ export const ModeSelector = ({
? "bg-primary opacity-90 hover:bg-primary-hover text-vscode-button-foreground"
: null,
)}>
- {selectedMode?.name || ""}
+ {selectedMode?.name || modes[0]?.name || "Code"}
{filteredModes.map((mode) => {
- const isSelected = mode.slug === value
+ const isSelected = mode.slug === effectiveValue
return (