Selaa lähdekoodia

Webview message handler + terminal settings cleanup (#3189)

Chris Estreich 7 kuukautta sitten
vanhempi
sitoutus
973295835a

+ 73 - 0
src/core/webview/generateSystemPrompt.ts

@@ -0,0 +1,73 @@
+import { WebviewMessage } from "../../shared/WebviewMessage"
+import { defaultModeSlug, getModeBySlug, getGroupName } from "../../shared/modes"
+import { buildApiHandler } from "../../api"
+
+import { SYSTEM_PROMPT } from "../prompts/system"
+import { MultiSearchReplaceDiffStrategy } from "../diff/strategies/multi-search-replace"
+
+import { ClineProvider } from "./ClineProvider"
+
+export const generateSystemPrompt = async (provider: ClineProvider, message: WebviewMessage) => {
+	const {
+		apiConfiguration,
+		customModePrompts,
+		customInstructions,
+		browserViewportSize,
+		diffEnabled,
+		mcpEnabled,
+		fuzzyMatchThreshold,
+		experiments,
+		enableMcpServerCreation,
+		browserToolEnabled,
+		language,
+	} = await provider.getState()
+
+	const diffStrategy = new MultiSearchReplaceDiffStrategy(fuzzyMatchThreshold)
+
+	const cwd = provider.cwd
+
+	const mode = message.mode ?? defaultModeSlug
+	const customModes = await provider.customModesManager.getCustomModes()
+
+	const rooIgnoreInstructions = provider.getCurrentCline()?.rooIgnoreController?.getInstructions()
+
+	// Determine if browser tools can be used based on model support, mode, and user settings
+	let modelSupportsComputerUse = false
+
+	// Create a temporary API handler to check if the model supports computer use
+	// This avoids relying on an active Cline instance which might not exist during preview
+	try {
+		const tempApiHandler = buildApiHandler(apiConfiguration)
+		modelSupportsComputerUse = tempApiHandler.getModel().info.supportsComputerUse ?? false
+	} catch (error) {
+		console.error("Error checking if model supports computer use:", error)
+	}
+
+	// Check if the current mode includes the browser tool group
+	const modeConfig = getModeBySlug(mode, customModes)
+	const modeSupportsBrowser = modeConfig?.groups.some((group) => getGroupName(group) === "browser") ?? false
+
+	// Only enable browser tools if the model supports it, the mode includes browser tools,
+	// and browser tools are enabled in settings
+	const canUseBrowserTool = modelSupportsComputerUse && modeSupportsBrowser && (browserToolEnabled ?? true)
+
+	const systemPrompt = await SYSTEM_PROMPT(
+		provider.context,
+		cwd,
+		canUseBrowserTool,
+		mcpEnabled ? provider.getMcpHub() : undefined,
+		diffStrategy,
+		browserViewportSize ?? "900x600",
+		mode,
+		customModePrompts,
+		customModes,
+		customInstructions,
+		diffEnabled,
+		experiments,
+		enableMcpServerCreation,
+		language,
+		rooIgnoreInstructions,
+	)
+
+	return systemPrompt
+}

+ 45 - 99
src/core/webview/webviewMessageHandler.ts

@@ -32,12 +32,12 @@ import { openMention } from "../mentions"
 import { telemetryService } from "../../services/telemetry/TelemetryService"
 import { TelemetrySetting } from "../../shared/TelemetrySetting"
 import { getWorkspacePath } from "../../utils/path"
-import { Mode, defaultModeSlug, getModeBySlug, getGroupName } from "../../shared/modes"
-import { SYSTEM_PROMPT } from "../prompts/system"
-import { buildApiHandler } from "../../api"
+import { Mode, defaultModeSlug } from "../../shared/modes"
 import { GlobalState } from "../../schemas"
-import { MultiSearchReplaceDiffStrategy } from "../diff/strategies/multi-search-replace"
 import { getModels } from "../../api/providers/fetchers/cache"
+import { generateSystemPrompt } from "./generateSystemPrompt"
+
+const ALLOWED_VSCODE_SETTINGS = new Set(["terminal.integrated.inheritEnv"])
 
 export const webviewMessageHandler = async (provider: ClineProvider, message: WebviewMessage) => {
 	// Utility functions provided for concise get/update of global state via contextProxy API.
@@ -128,14 +128,9 @@ export const webviewMessageHandler = async (provider: ClineProvider, message: We
 			provider.isViewLaunched = true
 			break
 		case "newTask":
-			// Code that should run in response to the hello message command
-			//vscode.window.showInformationMessage(message.text!)
-
-			// Send a message to our webview.
-			// You can send any JSON serializable data.
-			// Could also do this in extension .ts
-			//provider.postMessageToWebview({ type: "text", text: `Extension: ${Date.now()}` })
-			// initializing new instance of Cline will make sure that any agentically running promises in old instance don't affect our new task. this essentially creates a fresh slate for the new task
+			// Initializing new instance of Cline will make sure that any
+			// agentically running promises in old instance don't affect our new
+			// task. This essentially creates a fresh slate for the new task.
 			await provider.initClineWithTask(message.text, message.images)
 			break
 		case "apiConfiguration":
@@ -375,16 +370,29 @@ export const webviewMessageHandler = async (provider: ClineProvider, message: We
 			break
 		case "allowedCommands":
 			await provider.context.globalState.update("allowedCommands", message.commands)
-			// Also update workspace settings
+
+			// Also update workspace settings.
 			await vscode.workspace
 				.getConfiguration("roo-cline")
 				.update("allowedCommands", message.commands, vscode.ConfigurationTarget.Global)
+
+			break
+		case "openCustomModesSettings": {
+			const customModesFilePath = await provider.customModesManager.getCustomModesFilePath()
+
+			if (customModesFilePath) {
+				openFile(customModesFilePath)
+			}
+
 			break
+		}
 		case "openMcpSettings": {
 			const mcpSettingsFilePath = await provider.getMcpHub()?.getMcpSettingsFilePath()
+
 			if (mcpSettingsFilePath) {
 				openFile(mcpSettingsFilePath)
 			}
+
 			break
 		}
 		case "openProjectMcpSettings": {
@@ -400,20 +408,16 @@ export const webviewMessageHandler = async (provider: ClineProvider, message: We
 			try {
 				await fs.mkdir(rooDir, { recursive: true })
 				const exists = await fileExistsAtPath(mcpPath)
+
 				if (!exists) {
 					await fs.writeFile(mcpPath, JSON.stringify({ mcpServers: {} }, null, 2))
 				}
+
 				await openFile(mcpPath)
 			} catch (error) {
 				vscode.window.showErrorMessage(t("common:errors.create_mcp_json", { error: `${error}` }))
 			}
-			break
-		}
-		case "openCustomModesSettings": {
-			const customModesFilePath = await provider.customModesManager.getCustomModesFilePath()
-			if (customModesFilePath) {
-				openFile(customModesFilePath)
-			}
+
 			break
 		}
 		case "deleteMcpServer": {
@@ -559,6 +563,7 @@ export const webviewMessageHandler = async (provider: ClineProvider, message: We
 			if (!message.text) {
 				// Use testBrowserConnection for auto-discovery
 				const chromeHostUrl = await discoverChromeHostUrl()
+
 				if (chromeHostUrl) {
 					// Send the result back to the webview
 					await provider.postMessageToWebview({
@@ -578,6 +583,7 @@ export const webviewMessageHandler = async (provider: ClineProvider, message: We
 				// Test the provided URL
 				const customHostUrl = message.text
 				const hostIsValid = await tryChromeHostUrl(message.text)
+
 				// Send the result back to the webview
 				await provider.postMessageToWebview({
 					type: "browserConnectionResult",
@@ -593,35 +599,40 @@ export const webviewMessageHandler = async (provider: ClineProvider, message: We
 			await provider.postStateToWebview()
 			break
 		case "updateVSCodeSetting": {
-			// Allowlist of VSCode settings that can be updated
-			// Add new settings here when needed for future expansion
-			const ALLOWED_VSCODE_SETTINGS = ["terminal.integrated.inheritEnv"] as const
-
-			if (message.setting && message.value !== undefined) {
-				if (!ALLOWED_VSCODE_SETTINGS.includes(message.setting as (typeof ALLOWED_VSCODE_SETTINGS)[number])) {
-					provider.log(`Attempted to update restricted VSCode setting: ${message.setting}`)
-					vscode.window.showErrorMessage(`Cannot update restricted VSCode setting: ${message.setting}`)
-					break
+			const { setting, value } = message
+
+			if (setting !== undefined && value !== undefined) {
+				if (ALLOWED_VSCODE_SETTINGS.has(setting)) {
+					await vscode.workspace.getConfiguration().update(setting, value, true)
+				} else {
+					vscode.window.showErrorMessage(`Cannot update restricted VSCode setting: ${setting}`)
 				}
-				await vscode.workspace.getConfiguration().update(message.setting, message.value, true)
 			}
+
 			break
 		}
 		case "getVSCodeSetting":
-			if (message.setting) {
+			const { setting } = message
+
+			if (setting) {
 				try {
-					const value = vscode.workspace.getConfiguration().get(message.setting)
-					await provider.postMessageToWebview({ type: "vsCodeSetting", setting: message.setting, value })
+					await provider.postMessageToWebview({
+						type: "vsCodeSetting",
+						setting,
+						value: vscode.workspace.getConfiguration().get(setting),
+					})
 				} catch (error) {
 					console.error(`Failed to get VSCode setting ${message.setting}:`, error)
+
 					await provider.postMessageToWebview({
 						type: "vsCodeSetting",
-						setting: message.setting,
+						setting,
 						error: `Failed to get setting: ${error.message}`,
 						value: undefined,
 					})
 				}
 			}
+
 			break
 		case "alwaysApproveResubmit":
 			await updateGlobalState("alwaysApproveResubmit", message.bool ?? false)
@@ -1290,68 +1301,3 @@ export const webviewMessageHandler = async (provider: ClineProvider, message: We
 		}
 	}
 }
-
-const generateSystemPrompt = async (provider: ClineProvider, message: WebviewMessage) => {
-	const {
-		apiConfiguration,
-		customModePrompts,
-		customInstructions,
-		browserViewportSize,
-		diffEnabled,
-		mcpEnabled,
-		fuzzyMatchThreshold,
-		experiments,
-		enableMcpServerCreation,
-		browserToolEnabled,
-		language,
-	} = await provider.getState()
-
-	const diffStrategy = new MultiSearchReplaceDiffStrategy(fuzzyMatchThreshold)
-
-	const cwd = provider.cwd
-
-	const mode = message.mode ?? defaultModeSlug
-	const customModes = await provider.customModesManager.getCustomModes()
-
-	const rooIgnoreInstructions = provider.getCurrentCline()?.rooIgnoreController?.getInstructions()
-
-	// Determine if browser tools can be used based on model support, mode, and user settings
-	let modelSupportsComputerUse = false
-
-	// Create a temporary API handler to check if the model supports computer use
-	// This avoids relying on an active Cline instance which might not exist during preview
-	try {
-		const tempApiHandler = buildApiHandler(apiConfiguration)
-		modelSupportsComputerUse = tempApiHandler.getModel().info.supportsComputerUse ?? false
-	} catch (error) {
-		console.error("Error checking if model supports computer use:", error)
-	}
-
-	// Check if the current mode includes the browser tool group
-	const modeConfig = getModeBySlug(mode, customModes)
-	const modeSupportsBrowser = modeConfig?.groups.some((group) => getGroupName(group) === "browser") ?? false
-
-	// Only enable browser tools if the model supports it, the mode includes browser tools,
-	// and browser tools are enabled in settings
-	const canUseBrowserTool = modelSupportsComputerUse && modeSupportsBrowser && (browserToolEnabled ?? true)
-
-	const systemPrompt = await SYSTEM_PROMPT(
-		provider.context,
-		cwd,
-		canUseBrowserTool,
-		mcpEnabled ? provider.getMcpHub() : undefined,
-		diffStrategy,
-		browserViewportSize ?? "900x600",
-		mode,
-		customModePrompts,
-		customModes,
-		customInstructions,
-		diffEnabled,
-		experiments,
-		enableMcpServerCreation,
-		language,
-		rooIgnoreInstructions,
-	)
-
-	return systemPrompt
-}

+ 0 - 1
src/shared/ExtensionMessage.ts

@@ -107,7 +107,6 @@ export interface ExtensionMessage {
 	error?: string
 	setting?: string
 	value?: any
-	vscodeSettingValue?: unknown
 }
 
 export type ExtensionState = Pick<

+ 0 - 1
src/shared/WebviewMessage.ts

@@ -137,7 +137,6 @@ export interface WebviewMessage {
 	images?: string[]
 	bool?: boolean
 	value?: number
-	vscodeSettingValue?: unknown
 	commands?: string[]
 	audioType?: AudioType
 	serverName?: string

+ 41 - 30
webview-ui/src/components/settings/TerminalSettings.tsx

@@ -1,8 +1,11 @@
-import { HTMLAttributes, useState, useEffect } from "react"
+import { HTMLAttributes, useState, useCallback } from "react"
 import { useAppTranslation } from "@/i18n/TranslationContext"
 import { vscode } from "@/utils/vscode"
 import { SquareTerminal } from "lucide-react"
 import { VSCodeCheckbox } from "@vscode/webview-ui-toolkit/react"
+import { useEvent, useMount } from "react-use"
+
+import { ExtensionMessage } from "@roo/shared/ExtensionMessage"
 
 import { cn } from "@/lib/utils"
 import { Slider } from "@/components/ui"
@@ -51,31 +54,34 @@ export const TerminalSettings = ({
 	className,
 	...props
 }: TerminalSettingsProps) => {
+	const { t } = useAppTranslation()
+
 	const [inheritEnv, setInheritEnv] = useState<boolean>(true)
 
-	useEffect(() => {
-		// Get initial value from VSCode configuration
-		vscode.postMessage({ type: "getVSCodeSetting", setting: "terminal.integrated.inheritEnv" })
-	}, [])
-	useEffect(() => {
-		const handler = (event: MessageEvent<{ type: string; setting?: string; value?: boolean; error?: string }>) => {
-			const message = event.data
-			if (message.type === "vsCodeSetting" && message.setting === "terminal.integrated.inheritEnv") {
-				if (message.error) {
-					console.error("Failed to get terminal setting:", message.error)
-				} else {
-					setInheritEnv(message.value ?? true)
+	useMount(() => vscode.postMessage({ type: "getVSCodeSetting", setting: "terminal.integrated.inheritEnv" }))
+
+	const onMessage = useCallback((event: MessageEvent) => {
+		const message: ExtensionMessage = event.data
+
+		switch (message.type) {
+			case "vsCodeSetting":
+				switch (message.setting) {
+					case "terminal.integrated.inheritEnv":
+						setInheritEnv(message.value ?? true)
+						break
+					default:
+						break
 				}
-			}
+				break
+			default:
+				break
 		}
-		window.addEventListener("message", handler)
-		return () => window.removeEventListener("message", handler)
 	}, [])
 
-	const { t } = useAppTranslation()
+	useEvent("message", onMessage)
 
 	return (
-		<div className={cn("flex flex-col gap-0", className)} {...props}>
+		<div className={cn("flex flex-col", className)} {...props}>
 			<SectionHeader>
 				<div className="flex items-center gap-2">
 					<SquareTerminal className="w-4" />
@@ -86,11 +92,13 @@ export const TerminalSettings = ({
 			<Section>
 				{/* Basic Settings */}
 				<div className="flex flex-col gap-3">
-					<div className="flex items-center gap-4 font-bold">
-						<span className="codicon codicon-settings-gear" />
-						<div>{t("settings:terminal.basic.label")}</div>
+					<div className="flex flex-col gap-1">
+						<div className="flex items-center gap-2 font-bold">
+							<span className="codicon codicon-settings-gear" />
+							<div>{t("settings:terminal.basic.label")}</div>
+						</div>
 					</div>
-					<div className="pl-3 border-vscode-button-background">
+					<div className="flex flex-col gap-3 pl-3 border-l-2 border-vscode-button-background">
 						<div>
 							<label className="block font-medium mb-1">
 								{t("settings:terminal.outputLineLimit.label")}
@@ -127,15 +135,17 @@ export const TerminalSettings = ({
 				</div>
 
 				{/* Advanced Settings */}
-				<div className="flex flex-col gap-3 mt-6">
-					<div className="flex items-center gap-4 font-bold">
-						<span className="codicon codicon-tools" />
-						<div>{t("settings:terminal.advanced.label")}</div>
+				<div className="flex flex-col gap-3">
+					<div className="flex flex-col gap-1">
+						<div className="flex items-center gap-2 font-bold">
+							<span className="codicon codicon-tools" />
+							<div>{t("settings:terminal.advanced.label")}</div>
+						</div>
+						<div className="text-vscode-descriptionForeground">
+							{t("settings:terminal.advanced.description")}
+						</div>
 					</div>
-					<p className="text-vscode-descriptionForeground text-sm mt-0">
-						{t("settings:terminal.advanced.description")}
-					</p>
-					<div className="pl-3 border-vscode-button-background">
+					<div className="flex flex-col gap-3 pl-3 border-l-2 border-vscode-button-background">
 						<div>
 							<VSCodeCheckbox
 								checked={inheritEnv}
@@ -169,6 +179,7 @@ export const TerminalSettings = ({
 								{t("settings:terminal.shellIntegrationDisabled.description")}
 							</div>
 						</div>
+
 						{!terminalShellIntegrationDisabled && (
 							<>
 								<div>

+ 4 - 4
webview-ui/src/i18n/locales/ca/settings.json

@@ -316,7 +316,7 @@
 		},
 		"advanced": {
 			"label": "Configuració del terminal: Avançada",
-			"description": "Les següents opcions poden requerir reiniciar el terminal per aplicar la configuració"
+			"description": "Les següents opcions poden requerir reiniciar el terminal per aplicar la configuració."
 		},
 		"outputLineLimit": {
 			"label": "Límit de sortida de terminal",
@@ -336,7 +336,7 @@
 		},
 		"zdotdir": {
 			"label": "Habilitar gestió de ZDOTDIR",
-			"description": "Quan està habilitat, crea un directori temporal per a ZDOTDIR per gestionar correctament la integració del shell zsh. Això assegura que la integració del shell de VSCode funcioni correctament amb zsh mentre es preserva la teva configuració de zsh. (experimental)"
+			"description": "Quan està habilitat, crea un directori temporal per a ZDOTDIR per gestionar correctament la integració del shell zsh. Això assegura que la integració del shell de VSCode funcioni correctament amb zsh mentre es preserva la teva configuració de zsh."
 		},
 		"commandDelay": {
 			"label": "Retard de comanda del terminal",
@@ -352,11 +352,11 @@
 		},
 		"zshOhMy": {
 			"label": "Habilita la integració Oh My Zsh",
-			"description": "Quan està habilitat, estableix ITERM_SHELL_INTEGRATION_INSTALLED=Yes per habilitar les característiques d'integració del shell Oh My Zsh. Aplicar aquesta configuració pot requerir reiniciar l'IDE. (experimental)"
+			"description": "Quan està habilitat, estableix ITERM_SHELL_INTEGRATION_INSTALLED=Yes per habilitar les característiques d'integració del shell Oh My Zsh. Aplicar aquesta configuració pot requerir reiniciar l'IDE."
 		},
 		"zshP10k": {
 			"label": "Habilita la integració Powerlevel10k",
-			"description": "Quan està habilitat, estableix POWERLEVEL9K_TERM_SHELL_INTEGRATION=true per habilitar les característiques d'integració del shell Powerlevel10k. (experimental)"
+			"description": "Quan està habilitat, estableix POWERLEVEL9K_TERM_SHELL_INTEGRATION=true per habilitar les característiques d'integració del shell Powerlevel10k."
 		},
 		"inheritEnv": {
 			"label": "Hereta variables d'entorn",

+ 1 - 1
webview-ui/src/i18n/locales/de/settings.json

@@ -316,7 +316,7 @@
 		},
 		"advanced": {
 			"label": "Terminal-Einstellungen: Erweitert",
-			"description": "Die folgenden Optionen erfordern möglicherweise einen Terminal-Neustart, um die Einstellung zu übernehmen"
+			"description": "Die folgenden Optionen erfordern möglicherweise einen Terminal-Neustart, um die Einstellung zu übernehmen."
 		},
 		"outputLineLimit": {
 			"label": "Terminal-Ausgabelimit",

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

@@ -316,7 +316,7 @@
 		},
 		"advanced": {
 			"label": "Terminal Settings: Advanced",
-			"description": "The following options may require a terminal restart to apply the setting"
+			"description": "The following options may require a terminal restart to apply the setting."
 		},
 		"outputLineLimit": {
 			"label": "Terminal output limit",
@@ -348,15 +348,15 @@
 		},
 		"zshOhMy": {
 			"label": "Enable Oh My Zsh integration",
-			"description": "When enabled, sets ITERM_SHELL_INTEGRATION_INSTALLED=Yes to enable Oh My Zsh shell integration features. Applying this setting might require restarting the IDE. (experimental)"
+			"description": "When enabled, sets ITERM_SHELL_INTEGRATION_INSTALLED=Yes to enable Oh My Zsh shell integration features. Applying this setting might require restarting the IDE."
 		},
 		"zshP10k": {
 			"label": "Enable Powerlevel10k integration",
-			"description": "When enabled, sets POWERLEVEL9K_TERM_SHELL_INTEGRATION=true to enable Powerlevel10k shell integration features. (experimental)"
+			"description": "When enabled, sets POWERLEVEL9K_TERM_SHELL_INTEGRATION=true to enable Powerlevel10k shell integration features."
 		},
 		"zdotdir": {
 			"label": "Enable ZDOTDIR handling",
-			"description": "When enabled, creates a temporary directory for ZDOTDIR to handle zsh shell integration properly. This ensures VSCode shell integration works correctly with zsh while preserving your zsh configuration. (experimental)"
+			"description": "When enabled, creates a temporary directory for ZDOTDIR to handle zsh shell integration properly. This ensures VSCode shell integration works correctly with zsh while preserving your zsh configuration."
 		},
 		"inheritEnv": {
 			"label": "Inherit environment variables",

+ 4 - 4
webview-ui/src/i18n/locales/es/settings.json

@@ -316,7 +316,7 @@
 		},
 		"advanced": {
 			"label": "Configuración del terminal: Avanzada",
-			"description": "Las siguientes opciones pueden requerir reiniciar el terminal para aplicar la configuración"
+			"description": "Las siguientes opciones pueden requerir reiniciar el terminal para aplicar la configuración."
 		},
 		"outputLineLimit": {
 			"label": "Límite de salida de terminal",
@@ -336,7 +336,7 @@
 		},
 		"zdotdir": {
 			"label": "Habilitar gestión de ZDOTDIR",
-			"description": "Cuando está habilitado, crea un directorio temporal para ZDOTDIR para manejar correctamente la integración del shell zsh. Esto asegura que la integración del shell de VSCode funcione correctamente con zsh mientras preserva tu configuración de zsh. (experimental)"
+			"description": "Cuando está habilitado, crea un directorio temporal para ZDOTDIR para manejar correctamente la integración del shell zsh. Esto asegura que la integración del shell de VSCode funcione correctamente con zsh mientras preserva tu configuración de zsh."
 		},
 		"commandDelay": {
 			"label": "Retraso de comando del terminal",
@@ -352,11 +352,11 @@
 		},
 		"zshOhMy": {
 			"label": "Habilitar integración Oh My Zsh",
-			"description": "Cuando está habilitado, establece ITERM_SHELL_INTEGRATION_INSTALLED=Yes para habilitar las características de integración del shell Oh My Zsh. Aplicar esta configuración puede requerir reiniciar el IDE. (experimental)"
+			"description": "Cuando está habilitado, establece ITERM_SHELL_INTEGRATION_INSTALLED=Yes para habilitar las características de integración del shell Oh My Zsh. Aplicar esta configuración puede requerir reiniciar el IDE."
 		},
 		"zshP10k": {
 			"label": "Habilitar integración Powerlevel10k",
-			"description": "Cuando está habilitado, establece POWERLEVEL9K_TERM_SHELL_INTEGRATION=true para habilitar las características de integración del shell Powerlevel10k. (experimental)"
+			"description": "Cuando está habilitado, establece POWERLEVEL9K_TERM_SHELL_INTEGRATION=true para habilitar las características de integración del shell Powerlevel10k."
 		},
 		"inheritEnv": {
 			"label": "Heredar variables de entorno",

+ 1 - 1
webview-ui/src/i18n/locales/fr/settings.json

@@ -316,7 +316,7 @@
 		},
 		"advanced": {
 			"label": "Paramètres du terminal : Avancé",
-			"description": "Les options suivantes peuvent nécessiter un redémarrage du terminal pour appliquer le paramètre"
+			"description": "Les options suivantes peuvent nécessiter un redémarrage du terminal pour appliquer le paramètre."
 		},
 		"outputLineLimit": {
 			"label": "Limite de sortie du terminal",

+ 1 - 1
webview-ui/src/i18n/locales/it/settings.json

@@ -316,7 +316,7 @@
 		},
 		"advanced": {
 			"label": "Impostazioni terminale: Avanzate",
-			"description": "Le seguenti opzioni potrebbero richiedere il riavvio del terminale per applicare l'impostazione"
+			"description": "Le seguenti opzioni potrebbero richiedere il riavvio del terminale per applicare l'impostazione."
 		},
 		"outputLineLimit": {
 			"label": "Limite output terminale",

+ 1 - 1
webview-ui/src/i18n/locales/pl/settings.json

@@ -316,7 +316,7 @@
 		},
 		"advanced": {
 			"label": "Ustawienia terminala: Zaawansowane",
-			"description": "Poniższe opcje mogą wymagać ponownego uruchomienia terminala, aby zastosować ustawienie"
+			"description": "Poniższe opcje mogą wymagać ponownego uruchomienia terminala, aby zastosować ustawienie."
 		},
 		"outputLineLimit": {
 			"label": "Limit wyjścia terminala",

+ 4 - 4
webview-ui/src/i18n/locales/pt-BR/settings.json

@@ -316,7 +316,7 @@
 		},
 		"advanced": {
 			"label": "Configurações do terminal: Avançadas",
-			"description": "As seguintes opções podem exigir reiniciar o terminal para aplicar a configuração"
+			"description": "As seguintes opções podem exigir reiniciar o terminal para aplicar a configuração."
 		},
 		"outputLineLimit": {
 			"label": "Limite de saída do terminal",
@@ -336,7 +336,7 @@
 		},
 		"zdotdir": {
 			"label": "Ativar gerenciamento do ZDOTDIR",
-			"description": "Quando ativado, cria um diretório temporário para o ZDOTDIR para lidar corretamente com a integração do shell zsh. Isso garante que a integração do shell do VSCode funcione corretamente com o zsh enquanto preserva sua configuração do zsh. (experimental)"
+			"description": "Quando ativado, cria um diretório temporário para o ZDOTDIR para lidar corretamente com a integração do shell zsh. Isso garante que a integração do shell do VSCode funcione corretamente com o zsh enquanto preserva sua configuração do zsh."
 		},
 		"commandDelay": {
 			"label": "Atraso de comando do terminal",
@@ -352,11 +352,11 @@
 		},
 		"zshOhMy": {
 			"label": "Ativar integração Oh My Zsh",
-			"description": "Quando ativado, define ITERM_SHELL_INTEGRATION_INSTALLED=Yes para habilitar os recursos de integração do shell Oh My Zsh. A aplicação desta configuração pode exigir a reinicialização do IDE. (experimental)"
+			"description": "Quando ativado, define ITERM_SHELL_INTEGRATION_INSTALLED=Yes para habilitar os recursos de integração do shell Oh My Zsh. A aplicação desta configuração pode exigir a reinicialização do IDE."
 		},
 		"zshP10k": {
 			"label": "Ativar integração Powerlevel10k",
-			"description": "Quando ativado, define POWERLEVEL9K_TERM_SHELL_INTEGRATION=true para habilitar os recursos de integração do shell Powerlevel10k. (experimental)"
+			"description": "Quando ativado, define POWERLEVEL9K_TERM_SHELL_INTEGRATION=true para habilitar os recursos de integração do shell Powerlevel10k."
 		},
 		"inheritEnv": {
 			"label": "Herdar variáveis de ambiente",

+ 1 - 1
webview-ui/src/i18n/locales/ru/settings.json

@@ -316,7 +316,7 @@
 		},
 		"advanced": {
 			"label": "Настройки терминала: Расширенные",
-			"description": "Следующие параметры могут потребовать перезапуск терминала для применения настроек"
+			"description": "Следующие параметры могут потребовать перезапуск терминала для применения настроек."
 		},
 		"outputLineLimit": {
 			"label": "Лимит вывода терминала",

+ 1 - 1
webview-ui/src/i18n/locales/tr/settings.json

@@ -316,7 +316,7 @@
 		},
 		"advanced": {
 			"label": "Terminal Ayarları: Gelişmiş",
-			"description": "Aşağıdaki seçeneklerin uygulanması için terminalin yeniden başlatılması gerekebilir"
+			"description": "Aşağıdaki seçeneklerin uygulanması için terminalin yeniden başlatılması gerekebilir."
 		},
 		"outputLineLimit": {
 			"label": "Terminal çıktısı sınırı",

+ 1 - 1
webview-ui/src/i18n/locales/vi/settings.json

@@ -316,7 +316,7 @@
 		},
 		"advanced": {
 			"label": "Cài đặt Terminal: Nâng cao",
-			"description": "Các tùy chọn sau có thể yêu cầu khởi động lại terminal để áp dụng cài đặt"
+			"description": "Các tùy chọn sau có thể yêu cầu khởi động lại terminal để áp dụng cài đặt."
 		},
 		"outputLineLimit": {
 			"label": "Giới hạn đầu ra terminal",