diff --git a/src/core/task/Task.ts b/src/core/task/Task.ts
index c99fe4750a..9672671809 100644
--- a/src/core/task/Task.ts
+++ b/src/core/task/Task.ts
@@ -2426,7 +2426,7 @@ export class Task extends EventEmitter implements TaskLike {
const modelInfo = this.api.getModel().info
const modelSupportsBrowser = (modelInfo as any)?.supportsImages === true
- const canUseBrowserTool = modelSupportsBrowser && modeSupportsBrowser && (browserToolEnabled ?? true)
+ const canUseBrowserTool = modelSupportsBrowser && modeSupportsBrowser && (browserToolEnabled ?? false)
return SYSTEM_PROMPT(
provider.context,
diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts
index 91b8687966..a2e05a9ea6 100644
--- a/src/core/webview/ClineProvider.ts
+++ b/src/core/webview/ClineProvider.ts
@@ -1911,7 +1911,7 @@ export class ClineProvider
maxOpenTabsContext: maxOpenTabsContext ?? 20,
maxWorkspaceFiles: maxWorkspaceFiles ?? 200,
cwd,
- browserToolEnabled: browserToolEnabled ?? true,
+ browserToolEnabled: browserToolEnabled ?? false,
telemetrySetting,
telemetryKey,
machineId,
@@ -2133,7 +2133,7 @@ export class ClineProvider
maxOpenTabsContext: stateValues.maxOpenTabsContext ?? 20,
maxWorkspaceFiles: stateValues.maxWorkspaceFiles ?? 200,
openRouterUseMiddleOutTransform: stateValues.openRouterUseMiddleOutTransform,
- browserToolEnabled: stateValues.browserToolEnabled ?? true,
+ browserToolEnabled: stateValues.browserToolEnabled ?? false,
telemetrySetting: stateValues.telemetrySetting || "unset",
showRooIgnoredFiles: stateValues.showRooIgnoredFiles ?? false,
maxReadFileLine: stateValues.maxReadFileLine ?? -1,
diff --git a/src/core/webview/generateSystemPrompt.ts b/src/core/webview/generateSystemPrompt.ts
index 0920a61648..b575e9358d 100644
--- a/src/core/webview/generateSystemPrompt.ts
+++ b/src/core/webview/generateSystemPrompt.ts
@@ -64,8 +64,8 @@ export const generateSystemPrompt = async (provider: ClineProvider, message: Web
const modelSupportsBrowser = modelInfo && (modelInfo as any)?.supportsImages === true
// Only enable browser tools if the model supports it, the mode includes browser tools,
- // and browser tools are enabled in settings
- const canUseBrowserTool = modelSupportsBrowser && modeSupportsBrowser && (browserToolEnabled ?? true)
+ // and browser tools are enabled in settings (default to OFF when unset)
+ const canUseBrowserTool = modelSupportsBrowser && modeSupportsBrowser && (browserToolEnabled ?? false)
const systemPrompt = await SYSTEM_PROMPT(
provider.context,
diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts
index af5f9925c3..1d83799126 100644
--- a/src/core/webview/webviewMessageHandler.ts
+++ b/src/core/webview/webviewMessageHandler.ts
@@ -1562,7 +1562,7 @@ export const webviewMessageHandler = async (
await provider.postStateToWebview()
break
case "browserToolEnabled":
- await updateGlobalState("browserToolEnabled", message.bool ?? true)
+ await updateGlobalState("browserToolEnabled", message.bool ?? false)
await provider.postStateToWebview()
break
case "language":
diff --git a/webview-ui/src/components/chat/AutoApproveDropdown.tsx b/webview-ui/src/components/chat/AutoApproveDropdown.tsx
index 08e4a90f6b..280d1b479d 100644
--- a/webview-ui/src/components/chat/AutoApproveDropdown.tsx
+++ b/webview-ui/src/components/chat/AutoApproveDropdown.tsx
@@ -23,6 +23,7 @@ export const AutoApproveDropdown = ({ disabled = false, triggerClassName = "" }:
const {
autoApprovalEnabled,
+ browserToolEnabled,
setAutoApprovalEnabled,
alwaysApproveResubmit,
setAlwaysAllowReadOnly,
@@ -109,8 +110,12 @@ export const AutoApproveDropdown = ({ disabled = false, triggerClassName = "" }:
)
const handleSelectAll = React.useCallback(() => {
- // Enable all options
- Object.keys(autoApproveSettingsConfig).forEach((key) => {
+ // Enable all visible options based on current browser tool setting
+ const keys = browserToolEnabled
+ ? Object.keys(autoApproveSettingsConfig)
+ : Object.keys(autoApproveSettingsConfig).filter((k) => k !== "alwaysAllowBrowser")
+
+ keys.forEach((key) => {
onAutoApproveToggle(key as AutoApproveSetting, true)
})
// Enable master auto-approval
@@ -118,14 +123,18 @@ export const AutoApproveDropdown = ({ disabled = false, triggerClassName = "" }:
setAutoApprovalEnabled(true)
vscode.postMessage({ type: "autoApprovalEnabled", bool: true })
}
- }, [onAutoApproveToggle, autoApprovalEnabled, setAutoApprovalEnabled])
+ }, [onAutoApproveToggle, autoApprovalEnabled, setAutoApprovalEnabled, browserToolEnabled])
const handleSelectNone = React.useCallback(() => {
- // Disable all options
- Object.keys(autoApproveSettingsConfig).forEach((key) => {
+ // Disable all visible options based on current browser tool setting
+ const keys = browserToolEnabled
+ ? Object.keys(autoApproveSettingsConfig)
+ : Object.keys(autoApproveSettingsConfig).filter((k) => k !== "alwaysAllowBrowser")
+
+ keys.forEach((key) => {
onAutoApproveToggle(key as AutoApproveSetting, false)
})
- }, [onAutoApproveToggle])
+ }, [onAutoApproveToggle, browserToolEnabled])
const handleOpenSettings = React.useCallback(
() =>
@@ -143,13 +152,21 @@ export const AutoApproveDropdown = ({ disabled = false, triggerClassName = "" }:
// Calculate enabled and total counts as separate properties
const settingsArray = Object.values(autoApproveSettingsConfig)
+ // Filter out Browser toggle when browser tool is disabled
+ const visibleSettingsArray = React.useMemo(
+ () => settingsArray.filter((s) => browserToolEnabled || s.key !== "alwaysAllowBrowser"),
+ [settingsArray, browserToolEnabled],
+ )
+
+ const visibleKeys = React.useMemo(() => visibleSettingsArray.map((s) => s.key), [visibleSettingsArray])
+
const enabledCount = React.useMemo(() => {
- return Object.values(toggles).filter((value) => !!value).length
- }, [toggles])
+ return visibleKeys.filter((key) => !!toggles[key as keyof typeof toggles]).length
+ }, [visibleKeys, toggles])
const totalCount = React.useMemo(() => {
- return Object.keys(toggles).length
- }, [toggles])
+ return visibleKeys.length
+ }, [visibleKeys])
const { effectiveAutoApprovalEnabled } = useAutoApprovalState(toggles, autoApprovalEnabled)
@@ -157,7 +174,7 @@ export const AutoApproveDropdown = ({ disabled = false, triggerClassName = "" }:
!effectiveAutoApprovalEnabled || enabledCount === 0
? t("chat:autoApprove.tooltipManage")
: t("chat:autoApprove.tooltipStatus", {
- toggles: settingsArray
+ toggles: visibleSettingsArray
.filter((setting) => toggles[setting.key])
.map((setting) => t(setting.labelKey))
.join(", "),
@@ -216,7 +233,7 @@ export const AutoApproveDropdown = ({ disabled = false, triggerClassName = "" }:
- {settingsArray.map(({ key, labelKey, descriptionKey, icon }) => {
+ {visibleSettingsArray.map(({ key, labelKey, descriptionKey, icon }) => {
const isEnabled = toggles[key]
return (
diff --git a/webview-ui/src/components/settings/AutoApproveToggle.tsx b/webview-ui/src/components/settings/AutoApproveToggle.tsx
index e6540f3d89..63f87af120 100644
--- a/webview-ui/src/components/settings/AutoApproveToggle.tsx
+++ b/webview-ui/src/components/settings/AutoApproveToggle.tsx
@@ -3,6 +3,7 @@ import type { GlobalSettings } from "@roo-code/types"
import { useAppTranslation } from "@/i18n/TranslationContext"
import { cn } from "@/lib/utils"
import { Button, StandardTooltip } from "@/components/ui"
+import { useExtensionState } from "@/context/ExtensionStateContext"
type AutoApproveToggles = Pick<
GlobalSettings,
@@ -107,10 +108,15 @@ type AutoApproveToggleProps = AutoApproveToggles & {
export const AutoApproveToggle = ({ onToggle, ...props }: AutoApproveToggleProps) => {
const { t } = useAppTranslation()
+ const { browserToolEnabled } = useExtensionState()
+
+ const visibleConfigs = Object.values(autoApproveSettingsConfig).filter(
+ (cfg) => browserToolEnabled || cfg.key !== "alwaysAllowBrowser",
+ )
return (
- {Object.values(autoApproveSettingsConfig).map(({ key, descriptionKey, labelKey, icon, testId }) => (
+ {visibleConfigs.map(({ key, descriptionKey, labelKey, icon, testId }) => (