Преглед на файлове

Settings tweaks: add terminal & language sections, fix whell scroll in editor tab (#1763)

Chris Estreich преди 9 месеца
родител
ревизия
878b3820d2
променени са 39 файла, в които са добавени 653 реда и са изтрити 396 реда
  1. 2 3
      .vscode/extensions.json
  2. 1 0
      package-lock.json
  3. 5 8
      src/activate/registerCommands.ts
  4. 15 15
      src/core/prompts/__tests__/__snapshots__/system.test.ts.snap
  5. 1 4
      src/core/prompts/sections/rules.ts
  6. 8 6
      src/core/webview/ClineProvider.ts
  7. 1 0
      src/core/webview/__tests__/ClineProvider.test.ts
  8. 1 1
      src/extension.ts
  9. 3 1
      src/integrations/terminal/Terminal.ts
  10. 1 0
      src/shared/ExtensionMessage.ts
  11. 30 6
      webview-ui/src/components/common/Tab.tsx
  12. 1 0
      webview-ui/src/components/prompts/PromptsView.tsx
  13. 79 0
      webview-ui/src/components/settings/About.tsx
  14. 0 2
      webview-ui/src/components/settings/AdvancedSettings.tsx
  15. 51 45
      webview-ui/src/components/settings/BrowserSettings.tsx
  16. 1 29
      webview-ui/src/components/settings/ContextManagementSettings.tsx
  17. 1 0
      webview-ui/src/components/settings/ExperimentalSettings.tsx
  18. 66 0
      webview-ui/src/components/settings/LanguageSettings.tsx
  19. 0 116
      webview-ui/src/components/settings/SettingsFooter.tsx
  20. 82 69
      webview-ui/src/components/settings/SettingsView.tsx
  21. 91 0
      webview-ui/src/components/settings/TerminalSettings.tsx
  22. 0 14
      webview-ui/src/components/settings/__tests__/ContextManagementSettings.test.tsx
  23. 2 1
      webview-ui/src/context/ExtensionStateContext.tsx
  24. 1 0
      webview-ui/src/context/__tests__/ExtensionStateContext.test.tsx
  25. 14 5
      webview-ui/src/i18n/locales/ca/settings.json
  26. 14 5
      webview-ui/src/i18n/locales/de/settings.json
  27. 14 6
      webview-ui/src/i18n/locales/en/settings.json
  28. 14 5
      webview-ui/src/i18n/locales/es/settings.json
  29. 14 5
      webview-ui/src/i18n/locales/fr/settings.json
  30. 14 5
      webview-ui/src/i18n/locales/hi/settings.json
  31. 14 5
      webview-ui/src/i18n/locales/it/settings.json
  32. 14 5
      webview-ui/src/i18n/locales/ja/settings.json
  33. 14 5
      webview-ui/src/i18n/locales/ko/settings.json
  34. 14 5
      webview-ui/src/i18n/locales/pl/settings.json
  35. 14 5
      webview-ui/src/i18n/locales/pt-BR/settings.json
  36. 14 5
      webview-ui/src/i18n/locales/tr/settings.json
  37. 14 5
      webview-ui/src/i18n/locales/vi/settings.json
  38. 14 5
      webview-ui/src/i18n/locales/zh-CN/settings.json
  39. 14 5
      webview-ui/src/i18n/locales/zh-TW/settings.json

+ 2 - 3
.vscode/extensions.json

@@ -3,10 +3,9 @@
 	// for the documentation about the extensions.json format
 	"recommendations": [
 		"dbaeumer.vscode-eslint",
-		"connor4312.esbuild-problem-matchers",
-		"ms-vscode.extension-test-runner",
+		"esbenp.prettier-vscode",
 		"csstools.postcss",
 		"bradlc.vscode-tailwindcss",
-		"tobermory.es6-string-html"
+		"connor4312.esbuild-problem-matchers"
 	]
 }

+ 1 - 0
package-lock.json

@@ -12547,6 +12547,7 @@
 			"resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz",
 			"integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==",
 			"dev": true,
+			"license": "MIT",
 			"dependencies": {
 				"ansi-styles": "^3.2.1",
 				"chalk": "^2.4.1",

+ 5 - 8
src/activate/registerCommands.ts

@@ -89,14 +89,11 @@ const getCommandsMap = ({ context, outputChannel, provider }: RegisterCommandOpt
 }
 
 const openClineInNewTab = async ({ context, outputChannel }: Omit<RegisterCommandOptions, "provider">) => {
-	outputChannel.appendLine("Opening Roo Code in new tab")
-
 	// (This example uses webviewProvider activation event which is necessary to
 	// deserialize cached webview, but since we use retainContextWhenHidden, we
 	// don't need to use that event).
 	// https://github.com/microsoft/vscode-extension-samples/blob/main/webview-sample/src/extension.ts
-	const tabProvider = new ClineProvider(context, outputChannel)
-	// const column = vscode.window.activeTextEditor ? vscode.window.activeTextEditor.viewColumn : undefined
+	const tabProvider = new ClineProvider(context, outputChannel, "editor")
 	const lastCol = Math.max(...vscode.window.visibleTextEditors.map((editor) => editor.viewColumn || 0))
 
 	// Check if there are any visible text editors, otherwise open a new group
@@ -115,10 +112,10 @@ const openClineInNewTab = async ({ context, outputChannel }: Omit<RegisterComman
 		localResourceRoots: [context.extensionUri],
 	})
 
-	// Save as tab type panel
+	// Save as tab type panel.
 	setPanel(newPanel, "tab")
 
-	// TODO: use better svg icon with light and dark variants (see
+	// TODO: Use better svg icon with light and dark variants (see
 	// https://stackoverflow.com/questions/58365687/vscode-extension-iconpath).
 	newPanel.iconPath = {
 		light: vscode.Uri.joinPath(context.extensionUri, "assets", "icons", "rocket.png"),
@@ -127,12 +124,12 @@ const openClineInNewTab = async ({ context, outputChannel }: Omit<RegisterComman
 
 	await tabProvider.resolveWebviewView(newPanel)
 
-	// Handle panel closing events
+	// Handle panel closing events.
 	newPanel.onDidDispose(() => {
 		setPanel(undefined, "tab")
 	})
 
-	// Lock the editor group so clicking on files doesn't open them over the panel
+	// Lock the editor group so clicking on files doesn't open them over the panel.
 	await delay(100)
 	await vscode.commands.executeCommand("workbench.action.lockEditorGroup")
 }

+ 15 - 15
src/core/prompts/__tests__/__snapshots__/system.test.ts.snap

@@ -271,7 +271,7 @@ MODES
 RULES
 
 - The project base directory is: /test/path
-- All all file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
+- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
 - You cannot \`cd\` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path.
 - Do not use the ~ character or $HOME to refer to the home directory.
 - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`.
@@ -691,7 +691,7 @@ MODES
 RULES
 
 - The project base directory is: /test/path
-- All all file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
+- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
 - You cannot \`cd\` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path.
 - Do not use the ~ character or $HOME to refer to the home directory.
 - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`.
@@ -1080,7 +1080,7 @@ MODES
 RULES
 
 - The project base directory is: /test/path
-- All all file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
+- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
 - You cannot \`cd\` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path.
 - Do not use the ~ character or $HOME to refer to the home directory.
 - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`.
@@ -1418,7 +1418,7 @@ MODES
 RULES
 
 - The project base directory is: /test/path
-- All all file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
+- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
 - You cannot \`cd\` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path.
 - Do not use the ~ character or $HOME to refer to the home directory.
 - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`.
@@ -1753,7 +1753,7 @@ MODES
 RULES
 
 - The project base directory is: /test/path
-- All all file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
+- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
 - You cannot \`cd\` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path.
 - Do not use the ~ character or $HOME to refer to the home directory.
 - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`.
@@ -2088,7 +2088,7 @@ MODES
 RULES
 
 - The project base directory is: /test/path
-- All all file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
+- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
 - You cannot \`cd\` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path.
 - Do not use the ~ character or $HOME to refer to the home directory.
 - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`.
@@ -2471,7 +2471,7 @@ MODES
 RULES
 
 - The project base directory is: /test/path
-- All all file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
+- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
 - You cannot \`cd\` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path.
 - Do not use the ~ character or $HOME to refer to the home directory.
 - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`.
@@ -3261,7 +3261,7 @@ MODES
 RULES
 
 - The project base directory is: /test/path
-- All all file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
+- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
 - You cannot \`cd\` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path.
 - Do not use the ~ character or $HOME to refer to the home directory.
 - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`.
@@ -3644,7 +3644,7 @@ MODES
 RULES
 
 - The project base directory is: /test/path
-- All all file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
+- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
 - You cannot \`cd\` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path.
 - Do not use the ~ character or $HOME to refer to the home directory.
 - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`.
@@ -4040,7 +4040,7 @@ MODES
 RULES
 
 - The project base directory is: /test/path
-- All all file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
+- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
 - You cannot \`cd\` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path.
 - Do not use the ~ character or $HOME to refer to the home directory.
 - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`.
@@ -4377,7 +4377,7 @@ MODES
 RULES
 
 - The project base directory is: /test/path
-- All all file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
+- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
 - You cannot \`cd\` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path.
 - Do not use the ~ character or $HOME to refer to the home directory.
 - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`.
@@ -4901,7 +4901,7 @@ MODES
 RULES
 
 - The project base directory is: /test/path
-- All all file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
+- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
 - You cannot \`cd\` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path.
 - Do not use the ~ character or $HOME to refer to the home directory.
 - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`.
@@ -5314,7 +5314,7 @@ MODES
 RULES
 
 - The project base directory is: /test/path
-- All all file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
+- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
 - You cannot \`cd\` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path.
 - Do not use the ~ character or $HOME to refer to the home directory.
 - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`.
@@ -5603,7 +5603,7 @@ MODES
 RULES
 
 - The project base directory is: /test/path
-- All all file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
+- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
 - You cannot \`cd\` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path.
 - Do not use the ~ character or $HOME to refer to the home directory.
 - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`.
@@ -6510,7 +6510,7 @@ MODES
 RULES
 
 - The project base directory is: /test/path
-- All all file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
+- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
 - You cannot \`cd\` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path.
 - Do not use the ~ character or $HOME to refer to the home directory.
 - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`.

+ 1 - 4
src/core/prompts/sections/rules.ts

@@ -1,7 +1,4 @@
 import { DiffStrategy } from "../../diff/DiffStrategy"
-import { modes, ModeConfig } from "../../../shared/modes"
-import * as vscode from "vscode"
-import * as path from "path"
 
 function getEditingInstructions(diffStrategy?: DiffStrategy, experiments?: Record<string, boolean>): string {
 	const instructions: string[] = []
@@ -65,7 +62,7 @@ export function getRulesSection(
 RULES
 
 - The project base directory is: ${cwd.toPosix()}
-- All all file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
+- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
 - You cannot \`cd\` into a different directory to complete a task. You are stuck operating from '${cwd.toPosix()}', so be sure to pass in the correct 'path' parameter when using tools that require a path.
 - Do not use the ~ character or $HOME to refer to the home directory.
 - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '${cwd.toPosix()}', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '${cwd.toPosix()}'). For example, if you needed to run \`npm install\` in a project outside of '${cwd.toPosix()}', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`.

+ 8 - 6
src/core/webview/ClineProvider.ts

@@ -6,7 +6,6 @@ import fs from "fs/promises"
 import os from "os"
 import pWaitFor from "p-wait-for"
 import * as path from "path"
-import { Terminal } from "../../integrations/terminal/Terminal"
 import * as vscode from "vscode"
 
 import { setPanel } from "../../activate/registerCommands"
@@ -28,6 +27,7 @@ import { Mode, PromptComponent, defaultModeSlug, ModeConfig } from "../../shared
 import { checkExistKey } from "../../shared/checkExistApiConfig"
 import { EXPERIMENT_IDS, experiments as Experiments, experimentDefault, ExperimentId } from "../../shared/experiments"
 import { formatLanguage } from "../../shared/language"
+import { Terminal, TERMINAL_SHELL_INTEGRATION_TIMEOUT } from "../../integrations/terminal/Terminal"
 import { downloadTask } from "../../integrations/misc/export-markdown"
 import { openFile, openImage } from "../../integrations/misc/open-file"
 import { selectImages } from "../../integrations/misc/process-images"
@@ -95,6 +95,7 @@ export class ClineProvider extends EventEmitter<ClineProviderEvents> implements
 	constructor(
 		readonly context: vscode.ExtensionContext,
 		private readonly outputChannel: vscode.OutputChannel,
+		private readonly renderContext: "sidebar" | "editor" = "sidebar",
 	) {
 		super()
 
@@ -359,7 +360,7 @@ export class ClineProvider extends EventEmitter<ClineProviderEvents> implements
 		// Initialize out-of-scope variables that need to recieve persistent global state values
 		this.getState().then(({ soundEnabled, terminalShellIntegrationTimeout }) => {
 			setSoundEnabled(soundEnabled ?? false)
-			Terminal.setShellIntegrationTimeout(terminalShellIntegrationTimeout ?? 4000)
+			Terminal.setShellIntegrationTimeout(terminalShellIntegrationTimeout ?? TERMINAL_SHELL_INTEGRATION_TIMEOUT)
 		})
 
 		// Initialize tts enabled state
@@ -2400,11 +2401,10 @@ export class ClineProvider extends EventEmitter<ClineProviderEvents> implements
 			showRooIgnoredFiles,
 			language,
 		} = await this.getState()
+
 		const telemetryKey = process.env.POSTHOG_API_KEY
 		const machineId = vscode.env.machineId
-
 		const allowedCommands = vscode.workspace.getConfiguration("roo-cline").get<string[]>("allowedCommands") || []
-
 		const cwd = this.cwd
 
 		return {
@@ -2442,7 +2442,7 @@ export class ClineProvider extends EventEmitter<ClineProviderEvents> implements
 			remoteBrowserEnabled: remoteBrowserEnabled ?? false,
 			writeDelayMs: writeDelayMs ?? 1000,
 			terminalOutputLineLimit: terminalOutputLineLimit ?? 500,
-			terminalShellIntegrationTimeout: terminalShellIntegrationTimeout ?? 4000,
+			terminalShellIntegrationTimeout: terminalShellIntegrationTimeout ?? TERMINAL_SHELL_INTEGRATION_TIMEOUT,
 			fuzzyMatchThreshold: fuzzyMatchThreshold ?? 1.0,
 			mcpEnabled: mcpEnabled ?? true,
 			enableMcpServerCreation: enableMcpServerCreation ?? true,
@@ -2468,6 +2468,7 @@ export class ClineProvider extends EventEmitter<ClineProviderEvents> implements
 			machineId,
 			showRooIgnoredFiles: showRooIgnoredFiles ?? true,
 			language,
+			renderContext: this.renderContext,
 		}
 	}
 
@@ -2602,7 +2603,8 @@ export class ClineProvider extends EventEmitter<ClineProviderEvents> implements
 			fuzzyMatchThreshold: stateValues.fuzzyMatchThreshold ?? 1.0,
 			writeDelayMs: stateValues.writeDelayMs ?? 1000,
 			terminalOutputLineLimit: stateValues.terminalOutputLineLimit ?? 500,
-			terminalShellIntegrationTimeout: stateValues.terminalShellIntegrationTimeout ?? 4000,
+			terminalShellIntegrationTimeout:
+				stateValues.terminalShellIntegrationTimeout ?? TERMINAL_SHELL_INTEGRATION_TIMEOUT,
 			mode: stateValues.mode ?? defaultModeSlug,
 			language: stateValues.language ?? formatLanguage(vscode.env.language),
 			mcpEnabled: stateValues.mcpEnabled ?? true,

+ 1 - 0
src/core/webview/__tests__/ClineProvider.test.ts

@@ -531,6 +531,7 @@ describe("ClineProvider", () => {
 			browserToolEnabled: true,
 			telemetrySetting: "unset",
 			showRooIgnoredFiles: true,
+			renderContext: "sidebar",
 		}
 
 		const message: ExtensionMessage = {

+ 1 - 1
src/extension.ts

@@ -56,7 +56,7 @@ export function activate(context: vscode.ExtensionContext) {
 		context.globalState.update("allowedCommands", defaultCommands)
 	}
 
-	const provider = new ClineProvider(context, outputChannel)
+	const provider = new ClineProvider(context, outputChannel, "sidebar")
 	telemetryService.setProvider(provider)
 
 	// Validate task history on extension activation

+ 3 - 1
src/integrations/terminal/Terminal.ts

@@ -3,8 +3,10 @@ import pWaitFor from "p-wait-for"
 import { ExitCodeDetails, mergePromise, TerminalProcess, TerminalProcessResultPromise } from "./TerminalProcess"
 import { truncateOutput, applyRunLengthEncoding } from "../misc/extract-text"
 
+export const TERMINAL_SHELL_INTEGRATION_TIMEOUT = 5000
+
 export class Terminal {
-	private static shellIntegrationTimeout: number = 4000
+	private static shellIntegrationTimeout: number = TERMINAL_SHELL_INTEGRATION_TIMEOUT
 
 	public terminal: vscode.Terminal
 	public busy: boolean

+ 1 - 0
src/shared/ExtensionMessage.ts

@@ -156,6 +156,7 @@ export interface ExtensionState {
 	telemetryKey?: string
 	machineId?: string
 	showRooIgnoredFiles: boolean // Whether to show .rooignore'd files in listings
+	renderContext: "sidebar" | "editor"
 }
 
 export type { ClineMessage, ClineAsk, ClineSay }

+ 30 - 6
webview-ui/src/components/common/Tab.tsx

@@ -1,5 +1,6 @@
-import { HTMLAttributes } from "react"
+import { HTMLAttributes, useCallback } from "react"
 
+import { useExtensionState } from "@/context/ExtensionStateContext"
 import { cn } from "@/lib/utils"
 
 type TabProps = HTMLAttributes<HTMLDivElement>
@@ -16,8 +17,31 @@ export const TabHeader = ({ className, children, ...props }: TabProps) => (
 	</div>
 )
 
-export const TabContent = ({ className, children, ...props }: TabProps) => (
-	<div className={cn("flex-1 overflow-auto p-5", className)} {...props}>
-		{children}
-	</div>
-)
+export const TabContent = ({ className, children, ...props }: TabProps) => {
+	const { renderContext } = useExtensionState()
+
+	const onWheel = useCallback(
+		(e: React.WheelEvent<HTMLDivElement>) => {
+			if (renderContext !== "editor") {
+				return
+			}
+
+			const target = e.target as HTMLElement
+
+			// Prevent scrolling if the target is a listbox or option
+			// (e.g. selects, dropdowns, etc).
+			if (target.role === "listbox" || target.role === "option") {
+				return
+			}
+
+			e.currentTarget.scrollTop += e.deltaY
+		},
+		[renderContext],
+	)
+
+	return (
+		<div className={cn("flex-1 overflow-auto p-5", className)} onWheel={onWheel} {...props}>
+			{children}
+		</div>
+	)
+}

+ 1 - 0
webview-ui/src/components/prompts/PromptsView.tsx

@@ -45,6 +45,7 @@ function getGroupName(group: GroupEntry): ToolGroup {
 
 const PromptsView = ({ onDone }: PromptsViewProps) => {
 	const { t } = useAppTranslation()
+
 	const {
 		customModePrompts,
 		customSupportPrompts,

+ 79 - 0
webview-ui/src/components/settings/About.tsx

@@ -0,0 +1,79 @@
+import { HTMLAttributes } from "react"
+import { useAppTranslation } from "@/i18n/TranslationContext"
+import { Trans } from "react-i18next"
+import { Info } from "lucide-react"
+
+import { VSCodeButton, VSCodeCheckbox, VSCodeLink } from "@vscode/webview-ui-toolkit/react"
+
+import { TelemetrySetting } from "../../../../src/shared/TelemetrySetting"
+
+import { vscode } from "@/utils/vscode"
+import { cn } from "@/lib/utils"
+
+import { SectionHeader } from "./SectionHeader"
+import { Section } from "./Section"
+
+type AboutProps = HTMLAttributes<HTMLDivElement> & {
+	version: string
+	telemetrySetting: TelemetrySetting
+	setTelemetrySetting: (setting: TelemetrySetting) => void
+}
+
+export const About = ({ version, telemetrySetting, setTelemetrySetting, className, ...props }: AboutProps) => {
+	const { t } = useAppTranslation()
+
+	return (
+		<div className={cn("flex flex-col gap-2", className)} {...props}>
+			<SectionHeader description={`Version: ${version}`}>
+				<div className="flex items-center gap-2">
+					<Info className="w-4" />
+					<div>{t("settings:sections.about")}</div>
+				</div>
+			</SectionHeader>
+
+			<Section>
+				<div>
+					<VSCodeCheckbox
+						style={{ marginBottom: "5px" }}
+						checked={telemetrySetting === "enabled"}
+						onChange={(e: any) => {
+							const checked = e.target.checked === true
+							setTelemetrySetting(checked ? "enabled" : "disabled")
+						}}>
+						{t("settings:footer.telemetry.label")}
+					</VSCodeCheckbox>
+					<p
+						style={{
+							fontSize: "12px",
+							marginTop: "5px",
+							color: "var(--vscode-descriptionForeground)",
+						}}>
+						{t("settings:footer.telemetry.description")}
+					</p>
+				</div>
+
+				<div>
+					<Trans
+						i18nKey="settings:footer.feedback"
+						components={{
+							githubLink: <VSCodeLink href="https://github.com/RooVetGit/Roo-Code" />,
+							redditLink: <VSCodeLink href="https://reddit.com/r/RooCode" />,
+							discordLink: <VSCodeLink href="https://discord.gg/roocode" />,
+						}}
+					/>
+				</div>
+
+				<div className="flex justify-between items-center gap-3">
+					<p>{t("settings:footer.reset.description")}</p>
+					<VSCodeButton
+						onClick={() => vscode.postMessage({ type: "resetState" })}
+						appearance="secondary"
+						className="shrink-0">
+						<span className="codicon codicon-warning text-vscode-errorForeground mr-1" />
+						{t("settings:footer.reset.button")}
+					</VSCodeButton>
+				</div>
+			</Section>
+		</div>
+	)
+}

+ 0 - 2
webview-ui/src/components/settings/AdvancedSettings.tsx

@@ -150,7 +150,6 @@ export const AdvancedSettings = ({
 								</select>
 							</div>
 
-							{/* Description for selected strategy */}
 							<p className="text-vscode-descriptionForeground text-sm mt-1">
 								{!experiments[EXPERIMENT_IDS.DIFF_STRATEGY] &&
 									!experiments[EXPERIMENT_IDS.MULTI_SEARCH_AND_REPLACE] &&
@@ -161,7 +160,6 @@ export const AdvancedSettings = ({
 									t("settings:advanced.diff.strategy.descriptions.multiBlock")}
 							</p>
 
-							{/* Match precision slider */}
 							<span className="font-medium mt-3">{t("settings:advanced.diff.matchPrecision.label")}</span>
 							<div className="flex items-center gap-2">
 								<input

+ 51 - 45
webview-ui/src/components/settings/BrowserSettings.tsx

@@ -1,14 +1,15 @@
-import React, { HTMLAttributes, useState, useEffect } from "react"
-import { useAppTranslation } from "@/i18n/TranslationContext"
+import { HTMLAttributes, useState, useEffect, useMemo } from "react"
 import { VSCodeButton, VSCodeCheckbox, VSCodeTextField } from "@vscode/webview-ui-toolkit/react"
-import { Dropdown, type DropdownOption } from "vscrui"
 import { SquareMousePointer } from "lucide-react"
 
+import { vscode } from "@/utils/vscode"
+import { useAppTranslation } from "@/i18n/TranslationContext"
+import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue } from "@/components/ui"
+
 import { SetCachedStateField } from "./types"
 import { sliderLabelStyle } from "./styles"
 import { SectionHeader } from "./SectionHeader"
 import { Section } from "./Section"
-import { vscode } from "../../utils/vscode"
 
 type BrowserSettingsProps = HTMLAttributes<HTMLDivElement> & {
 	browserToolEnabled?: boolean
@@ -35,22 +36,22 @@ export const BrowserSettings = ({
 	...props
 }: BrowserSettingsProps) => {
 	const { t } = useAppTranslation()
+
 	const [testingConnection, setTestingConnection] = useState(false)
 	const [testResult, setTestResult] = useState<{ success: boolean; message: string } | null>(null)
 	const [discovering, setDiscovering] = useState(false)
-	// We don't need a local state for useRemoteBrowser since we're using the enableRemoteBrowser prop directly
-	// This ensures the checkbox always reflects the current global state
 
-	// Set up message listener for browser connection results
+	// We don't need a local state for useRemoteBrowser since we're using the
+	// `enableRemoteBrowser` prop directly. This ensures the checkbox always
+	// reflects the current global state.
+
+	// Set up message listener for browser connection results.
 	useEffect(() => {
 		const handleMessage = (event: MessageEvent) => {
 			const message = event.data
 
 			if (message.type === "browserConnectionResult") {
-				setTestResult({
-					success: message.success,
-					message: message.text,
-				})
+				setTestResult({ success: message.success, message: message.text })
 				setTestingConnection(false)
 				setDiscovering(false)
 			}
@@ -68,11 +69,8 @@ export const BrowserSettings = ({
 		setTestResult(null)
 
 		try {
-			// Send a message to the extension to test the connection
-			vscode.postMessage({
-				type: "testBrowserConnection",
-				text: remoteBrowserHost,
-			})
+			// Send a message to the extension to test the connection.
+			vscode.postMessage({ type: "testBrowserConnection", text: remoteBrowserHost })
 		} catch (error) {
 			setTestResult({
 				success: false,
@@ -87,10 +85,8 @@ export const BrowserSettings = ({
 		setTestResult(null)
 
 		try {
-			// Send a message to the extension to discover Chrome instances
-			vscode.postMessage({
-				type: "discoverBrowser",
-			})
+			// Send a message to the extension to discover Chrome instances.
+			vscode.postMessage({ type: "discoverBrowser" })
 		} catch (error) {
 			setTestResult({
 				success: false,
@@ -99,6 +95,23 @@ export const BrowserSettings = ({
 			setDiscovering(false)
 		}
 	}
+
+	const options = useMemo(
+		() => [
+			{
+				value: "1280x800",
+				label: t("settings:browser.viewport.options.largeDesktop"),
+			},
+			{
+				value: "900x600",
+				label: t("settings:browser.viewport.options.smallDesktop"),
+			},
+			{ value: "768x1024", label: t("settings:browser.viewport.options.tablet") },
+			{ value: "360x640", label: t("settings:browser.viewport.options.mobile") },
+		],
+		[t],
+	)
+
 	return (
 		<div {...props}>
 			<SectionHeader>
@@ -126,31 +139,24 @@ export const BrowserSettings = ({
 								borderLeft: "2px solid var(--vscode-button-background)",
 							}}>
 							<div>
-								<label style={{ fontWeight: "500", display: "block", marginBottom: 5 }}>
-									{t("settings:browser.viewport.label")}
-								</label>
-								<div className="dropdown-container">
-									<Dropdown
-										value={browserViewportSize}
-										onChange={(value: unknown) => {
-											setCachedStateField("browserViewportSize", (value as DropdownOption).value)
-										}}
-										style={{ width: "100%" }}
-										options={[
-											{
-												value: "1280x800",
-												label: t("settings:browser.viewport.options.largeDesktop"),
-											},
-											{
-												value: "900x600",
-												label: t("settings:browser.viewport.options.smallDesktop"),
-											},
-											{ value: "768x1024", label: t("settings:browser.viewport.options.tablet") },
-											{ value: "360x640", label: t("settings:browser.viewport.options.mobile") },
-										]}
-									/>
-								</div>
-								<p className="text-vscode-descriptionForeground text-sm mt-0">
+								<label className="block font-medium mb-1">{t("settings:browser.viewport.label")}</label>
+								<Select
+									value={browserViewportSize}
+									onValueChange={(value) => setCachedStateField("browserViewportSize", value)}>
+									<SelectTrigger className="w-full">
+										<SelectValue placeholder="Select" />
+									</SelectTrigger>
+									<SelectContent>
+										<SelectGroup>
+											{options.map(({ value, label }) => (
+												<SelectItem key={value} value={value}>
+													{label}
+												</SelectItem>
+											))}
+										</SelectGroup>
+									</SelectContent>
+								</Select>
+								<p className="text-vscode-descriptionForeground text-sm mt-1">
 									{t("settings:browser.viewport.description")}
 								</p>
 							</div>

+ 1 - 29
webview-ui/src/components/settings/ContextManagementSettings.tsx

@@ -11,17 +11,13 @@ import { SectionHeader } from "./SectionHeader"
 import { Section } from "./Section"
 
 type ContextManagementSettingsProps = HTMLAttributes<HTMLDivElement> & {
-	terminalOutputLineLimit?: number
 	maxOpenTabsContext: number
 	maxWorkspaceFiles: number
 	showRooIgnoredFiles?: boolean
-	setCachedStateField: SetCachedStateField<
-		"terminalOutputLineLimit" | "maxOpenTabsContext" | "maxWorkspaceFiles" | "showRooIgnoredFiles"
-	>
+	setCachedStateField: SetCachedStateField<"maxOpenTabsContext" | "maxWorkspaceFiles" | "showRooIgnoredFiles">
 }
 
 export const ContextManagementSettings = ({
-	terminalOutputLineLimit,
 	maxOpenTabsContext,
 	maxWorkspaceFiles,
 	showRooIgnoredFiles,
@@ -40,30 +36,6 @@ export const ContextManagementSettings = ({
 			</SectionHeader>
 
 			<Section>
-				<div>
-					<div className="flex flex-col gap-2">
-						<span className="font-medium">{t("settings:contextManagement.terminal.label")}</span>
-						<div className="flex items-center gap-2">
-							<input
-								type="range"
-								min="100"
-								max="5000"
-								step="100"
-								value={terminalOutputLineLimit ?? 500}
-								onChange={(e) =>
-									setCachedStateField("terminalOutputLineLimit", parseInt(e.target.value))
-								}
-								className="h-2 focus:outline-0 w-4/5 accent-vscode-button-background"
-								data-testid="terminal-output-limit-slider"
-							/>
-							<span style={{ ...sliderLabelStyle }}>{terminalOutputLineLimit ?? 500}</span>
-						</div>
-					</div>
-					<p className="text-vscode-descriptionForeground text-sm mt-0">
-						{t("settings:contextManagement.terminal.description")}
-					</p>
-				</div>
-
 				<div>
 					<div className="flex flex-col gap-2">
 						<span className="font-medium">{t("settings:contextManagement.openTabs.label")}</span>

+ 1 - 0
webview-ui/src/components/settings/ExperimentalSettings.tsx

@@ -27,6 +27,7 @@ export const ExperimentalSettings = ({
 	...props
 }: ExperimentalSettingsProps) => {
 	const { t } = useAppTranslation()
+
 	return (
 		<div className={cn("flex flex-col gap-2", className)} {...props}>
 			<SectionHeader>

+ 66 - 0
webview-ui/src/components/settings/LanguageSettings.tsx

@@ -0,0 +1,66 @@
+import { HTMLAttributes } from "react"
+import { useAppTranslation } from "@/i18n/TranslationContext"
+import { Globe } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue } from "@/components/ui"
+
+import { SetCachedStateField } from "./types"
+import { SectionHeader } from "./SectionHeader"
+import { Section } from "./Section"
+
+const LANGUAGES: Record<string, string> = {
+	ca: "Català",
+	de: "Deutsch",
+	en: "English",
+	es: "Español",
+	fr: "Français",
+	hi: "हिन्दी",
+	it: "Italiano",
+	ja: "日本語",
+	ko: "한국어",
+	pl: "Polski",
+	"pt-BR": "Português",
+	tr: "Türkçe",
+	vi: "Tiếng Việt",
+	"zh-CN": "简体中文",
+	"zh-TW": "繁體中文",
+}
+
+type LanguageSettingsProps = HTMLAttributes<HTMLDivElement> & {
+	language: string
+	setCachedStateField: SetCachedStateField<"language">
+}
+
+export const LanguageSettings = ({ language, setCachedStateField, className, ...props }: LanguageSettingsProps) => {
+	const { t } = useAppTranslation()
+
+	return (
+		<div className={cn("flex flex-col gap-2", className)} {...props}>
+			<SectionHeader>
+				<div className="flex items-center gap-2">
+					<Globe className="w-4" />
+					<div>{t("settings:sections.language")}</div>
+				</div>
+			</SectionHeader>
+
+			<Section>
+				<Select value={language} onValueChange={(value) => setCachedStateField("language", value)}>
+					<SelectTrigger className="w-full">
+						<SelectValue placeholder="Select" />
+					</SelectTrigger>
+					<SelectContent>
+						<SelectGroup>
+							{Object.entries(LANGUAGES).map(([code, name]) => (
+								<SelectItem key={code} value={code}>
+									{name}
+									<span className="text-muted-foreground">({code})</span>
+								</SelectItem>
+							))}
+						</SelectGroup>
+					</SelectContent>
+				</Select>
+			</Section>
+		</div>
+	)
+}

+ 0 - 116
webview-ui/src/components/settings/SettingsFooter.tsx

@@ -1,116 +0,0 @@
-import { HTMLAttributes } from "react"
-import { useAppTranslation } from "@/i18n/TranslationContext"
-import { Trans } from "react-i18next"
-import { Globe } from "lucide-react"
-
-import { VSCodeButton, VSCodeCheckbox, VSCodeLink } from "@vscode/webview-ui-toolkit/react"
-
-import { vscode } from "@/utils/vscode"
-import { cn } from "@/lib/utils"
-import { TelemetrySetting } from "../../../../src/shared/TelemetrySetting"
-import { SetCachedStateField } from "./types"
-
-// Map of language codes to their display names
-const LANGUAGES: Record<string, string> = {
-	ca: "Català",
-	de: "Deutsch",
-	en: "English",
-	es: "Español",
-	fr: "Français",
-	hi: "हिन्दी",
-	it: "Italiano",
-	ja: "日本語",
-	ko: "한국어",
-	pl: "Polski",
-	"pt-BR": "Português",
-	tr: "Türkçe",
-	vi: "Tiếng Việt",
-	"zh-CN": "简体中文",
-	"zh-TW": "繁體中文",
-}
-
-type SettingsFooterProps = HTMLAttributes<HTMLDivElement> & {
-	version: string
-	telemetrySetting: TelemetrySetting
-	setTelemetrySetting: (setting: TelemetrySetting) => void
-	language: string
-	setCachedStateField: SetCachedStateField<"language">
-}
-
-export const SettingsFooter = ({
-	version,
-	telemetrySetting,
-	setTelemetrySetting,
-	language,
-	setCachedStateField,
-	className,
-	...props
-}: SettingsFooterProps) => {
-	const { t } = useAppTranslation()
-
-	return (
-		<div className={cn("text-vscode-descriptionForeground p-5", className)} {...props}>
-			<p style={{ wordWrap: "break-word", margin: 0, padding: 0 }}>
-				<Trans
-					i18nKey="settings:footer.feedback"
-					components={{
-						githubLink: <VSCodeLink href="https://github.com/RooVetGit/Roo-Code" />,
-						redditLink: <VSCodeLink href="https://reddit.com/r/RooCode" />,
-						discordLink: <VSCodeLink href="https://discord.gg/roocode" />,
-					}}
-				/>
-			</p>
-			<div className="flex items-center gap-4">
-				<div className="flex items-center text-nowrap">
-					<p>Roo Code</p>
-					<p className="italic ml-1">v{version}</p>
-				</div>
-				<div className="relative flex items-center">
-					<Globe className="w-4 h-4 text-vscode-descriptionForeground absolute left-2 pointer-events-none" />
-					<select
-						value={language}
-						onChange={(e) => setCachedStateField("language", e.target.value)}
-						className="appearance-none bg-transparent text-vscode-foreground border border-transparent hover:border-vscode-input-border focus:border-vscode-focusBorder rounded px-2 py-1 pl-7 text-xs min-w-[70px]"
-						title={LANGUAGES[language]}>
-						{Object.entries(LANGUAGES).map(([code, name]) => (
-							<option key={code} value={code}>
-								{name} ({code})
-							</option>
-						))}
-					</select>
-				</div>
-			</div>
-			<div className="mt-4 mb-4">
-				<div>
-					<VSCodeCheckbox
-						style={{ marginBottom: "5px" }}
-						checked={telemetrySetting === "enabled"}
-						onChange={(e: any) => {
-							const checked = e.target.checked === true
-							setTelemetrySetting(checked ? "enabled" : "disabled")
-						}}>
-						{t("settings:footer.telemetry.label")}
-					</VSCodeCheckbox>
-					<p
-						style={{
-							fontSize: "12px",
-							marginTop: "5px",
-							color: "var(--vscode-descriptionForeground)",
-						}}>
-						{t("settings:footer.telemetry.description")}
-					</p>
-				</div>
-			</div>
-			<div className="flex justify-between items-center gap-3">
-				<p>{t("settings:footer.reset.description")}</p>
-				<VSCodeButton
-					onClick={() => vscode.postMessage({ type: "resetState" })}
-					appearance="secondary"
-					className="shrink-0">
-					<span className="codicon codicon-warning text-vscode-errorForeground mr-1" />
-					{t("settings:footer.reset.button")}
-				</VSCodeButton>
-			</div>
-		</div>
-	)
-}

+ 82 - 69
webview-ui/src/components/settings/SettingsView.tsx

@@ -7,19 +7,23 @@ import {
 	Webhook,
 	GitBranch,
 	Bell,
+	Database,
+	SquareTerminal,
 	Cog,
 	FlaskConical,
 	AlertTriangle,
+	Globe,
+	Info,
+	LucideIcon,
 } from "lucide-react"
+import { CaretSortIcon } from "@radix-ui/react-icons"
 
-import { Database } from "lucide-react"
 import { ExperimentId } from "../../../../src/shared/experiments"
 import { TelemetrySetting } from "../../../../src/shared/TelemetrySetting"
 import { ApiConfiguration } from "../../../../src/shared/api"
 
 import { vscode } from "@/utils/vscode"
 import { ExtensionStateContextType, useExtensionState } from "@/context/ExtensionStateContext"
-import { cn } from "@/lib/utils"
 import {
 	AlertDialog,
 	AlertDialogContent,
@@ -30,6 +34,10 @@ import {
 	AlertDialogHeader,
 	AlertDialogFooter,
 	Button,
+	DropdownMenu,
+	DropdownMenuTrigger,
+	DropdownMenuContent,
+	DropdownMenuItem,
 } from "@/components/ui"
 
 import { Tab, TabContent, TabHeader } from "../common/Tab"
@@ -42,21 +50,40 @@ import { BrowserSettings } from "./BrowserSettings"
 import { CheckpointSettings } from "./CheckpointSettings"
 import { NotificationSettings } from "./NotificationSettings"
 import { ContextManagementSettings } from "./ContextManagementSettings"
+import { TerminalSettings } from "./TerminalSettings"
 import { AdvancedSettings } from "./AdvancedSettings"
-import { SettingsFooter } from "./SettingsFooter"
-import { Section } from "./Section"
 import { ExperimentalSettings } from "./ExperimentalSettings"
+import { LanguageSettings } from "./LanguageSettings"
+import { About } from "./About"
+import { Section } from "./Section"
 
 export interface SettingsViewRef {
 	checkUnsaveChanges: (then: () => void) => void
 }
 
+const sectionNames = [
+	"providers",
+	"autoApprove",
+	"browser",
+	"checkpoints",
+	"notifications",
+	"contextManagement",
+	"terminal",
+	"advanced",
+	"experimental",
+	"language",
+	"about",
+] as const
+
+type SectionName = (typeof sectionNames)[number]
+
 type SettingsViewProps = {
 	onDone: () => void
 }
 
 const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone }, ref) => {
 	const { t } = useAppTranslation()
+
 	const extensionState = useExtensionState()
 	const { currentApiConfigName, listApiConfigMeta, uriScheme, version } = extensionState
 
@@ -242,81 +269,64 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone },
 	const providersRef = useRef<HTMLDivElement>(null)
 	const autoApproveRef = useRef<HTMLDivElement>(null)
 	const browserRef = useRef<HTMLDivElement>(null)
-	const checkpointRef = useRef<HTMLDivElement>(null)
+	const checkpointsRef = useRef<HTMLDivElement>(null)
 	const notificationsRef = useRef<HTMLDivElement>(null)
-	const contextRef = useRef<HTMLDivElement>(null)
+	const contextManagementRef = useRef<HTMLDivElement>(null)
+	const terminalRef = useRef<HTMLDivElement>(null)
 	const advancedRef = useRef<HTMLDivElement>(null)
 	const experimentalRef = useRef<HTMLDivElement>(null)
+	const languageRef = useRef<HTMLDivElement>(null)
+	const aboutRef = useRef<HTMLDivElement>(null)
 
-	const [activeSection, setActiveSection] = useState<string>("providers")
-
-	const sections = useMemo(
+	const sections: { id: SectionName; icon: LucideIcon; ref: React.RefObject<HTMLDivElement> }[] = useMemo(
 		() => [
 			{ id: "providers", icon: Webhook, ref: providersRef },
 			{ id: "autoApprove", icon: CheckCheck, ref: autoApproveRef },
 			{ id: "browser", icon: SquareMousePointer, ref: browserRef },
-			{ id: "checkpoint", icon: GitBranch, ref: checkpointRef },
+			{ id: "checkpoints", icon: GitBranch, ref: checkpointsRef },
 			{ id: "notifications", icon: Bell, ref: notificationsRef },
-			{ id: "context", icon: Database, ref: contextRef },
+			{ id: "contextManagement", icon: Database, ref: contextManagementRef },
+			{ id: "terminal", icon: SquareTerminal, ref: terminalRef },
 			{ id: "advanced", icon: Cog, ref: advancedRef },
 			{ id: "experimental", icon: FlaskConical, ref: experimentalRef },
+			{ id: "language", icon: Globe, ref: languageRef },
+			{ id: "about", icon: Info, ref: aboutRef },
 		],
 		[
 			providersRef,
 			autoApproveRef,
 			browserRef,
-			checkpointRef,
+			checkpointsRef,
 			notificationsRef,
-			contextRef,
+			contextManagementRef,
+			terminalRef,
 			advancedRef,
 			experimentalRef,
 		],
 	)
 
-	const handleScroll = useCallback((e: React.UIEvent<HTMLDivElement>) => {
-		const sections = [
-			{ ref: providersRef, id: "providers" },
-			{ ref: autoApproveRef, id: "autoApprove" },
-			{ ref: browserRef, id: "browser" },
-			{ ref: checkpointRef, id: "checkpoint" },
-			{ ref: notificationsRef, id: "notifications" },
-			{ ref: contextRef, id: "context" },
-			{ ref: advancedRef, id: "advanced" },
-			{ ref: experimentalRef, id: "experimental" },
-		]
-
-		for (const section of sections) {
-			const element = section.ref.current
-
-			if (element) {
-				const { top } = element.getBoundingClientRect()
-
-				if (top >= 0 && top <= 50) {
-					setActiveSection(section.id)
-					break
-				}
-			}
-		}
-	}, [])
-
 	const scrollToSection = (ref: React.RefObject<HTMLDivElement>) => ref.current?.scrollIntoView()
 
 	return (
 		<Tab>
 			<TabHeader className="flex justify-between items-center gap-2">
-				<div className="flex items-center gap-2">
+				<div className="flex items-center gap-1">
 					<h3 className="text-vscode-foreground m-0">{t("settings:header.title")}</h3>
-					<div className="hidden [@media(min-width:400px)]:flex items-center">
-						{sections.map(({ id, icon: Icon, ref }) => (
-							<Button
-								key={id}
-								variant="ghost"
-								onClick={() => scrollToSection(ref)}
-								className={cn("w-6 h-6", activeSection === id ? "opacity-100" : "opacity-40")}>
-								<Icon />
+					<DropdownMenu>
+						<DropdownMenuTrigger asChild>
+							<Button variant="ghost" size="icon" className="w-6 h-6">
+								<CaretSortIcon />
 							</Button>
-						))}
-					</div>
+						</DropdownMenuTrigger>
+						<DropdownMenuContent align="start" side="bottom">
+							{sections.map(({ id, icon: Icon, ref }) => (
+								<DropdownMenuItem key={id} onClick={() => scrollToSection(ref)}>
+									<Icon />
+									<span>{t(`settings:sections.${id}`)}</span>
+								</DropdownMenuItem>
+							))}
+						</DropdownMenuContent>
+					</DropdownMenu>
 				</div>
 				<div className="flex gap-2">
 					<VSCodeButton
@@ -343,15 +353,7 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone },
 				</div>
 			</TabHeader>
 
-			<TabContent
-				className="p-0 divide-y divide-vscode-sideBar-background will-change-scroll"
-				style={{
-					WebkitOverflowScrolling: "touch",
-					msOverflowStyle: "-ms-autohiding-scrollbar",
-					scrollbarGutter: "stable",
-				}}
-				onWheel={(e) => (e.currentTarget.scrollTop += e.deltaY)}
-				onScroll={handleScroll}>
+			<TabContent className="p-0 divide-y divide-vscode-sideBar-background">
 				<div ref={providersRef}>
 					<SectionHeader>
 						<div className="flex items-center gap-2">
@@ -426,7 +428,7 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone },
 					/>
 				</div>
 
-				<div ref={checkpointRef}>
+				<div ref={checkpointsRef}>
 					<CheckpointSettings
 						enableCheckpoints={enableCheckpoints}
 						checkpointStorage={checkpointStorage}
@@ -444,9 +446,8 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone },
 					/>
 				</div>
 
-				<div ref={contextRef}>
+				<div ref={contextManagementRef}>
 					<ContextManagementSettings
-						terminalOutputLineLimit={terminalOutputLineLimit}
 						maxOpenTabsContext={maxOpenTabsContext}
 						maxWorkspaceFiles={maxWorkspaceFiles ?? 200}
 						showRooIgnoredFiles={showRooIgnoredFiles}
@@ -454,6 +455,14 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone },
 					/>
 				</div>
 
+				<div ref={terminalRef}>
+					<TerminalSettings
+						terminalOutputLineLimit={terminalOutputLineLimit}
+						terminalShellIntegrationTimeout={terminalShellIntegrationTimeout}
+						setCachedStateField={setCachedStateField}
+					/>
+				</div>
+
 				<div ref={advancedRef}>
 					<AdvancedSettings
 						rateLimitSeconds={rateLimitSeconds}
@@ -474,13 +483,17 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone },
 					/>
 				</div>
 
-				<SettingsFooter
-					version={version}
-					telemetrySetting={telemetrySetting}
-					setTelemetrySetting={setTelemetrySetting}
-					language={language || "en"}
-					setCachedStateField={setCachedStateField}
-				/>
+				<div ref={languageRef}>
+					<LanguageSettings language={language || "en"} setCachedStateField={setCachedStateField} />
+				</div>
+
+				<div ref={aboutRef}>
+					<About
+						version={version}
+						telemetrySetting={telemetrySetting}
+						setTelemetrySetting={setTelemetrySetting}
+					/>
+				</div>
 			</TabContent>
 
 			<AlertDialog open={isDiscardDialogShow} onOpenChange={setDiscardDialogShow}>

+ 91 - 0
webview-ui/src/components/settings/TerminalSettings.tsx

@@ -0,0 +1,91 @@
+import { HTMLAttributes } from "react"
+import { useAppTranslation } from "@/i18n/TranslationContext"
+import { SquareTerminal } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+import { SetCachedStateField } from "./types"
+import { sliderLabelStyle } from "./styles"
+import { SectionHeader } from "./SectionHeader"
+import { Section } from "./Section"
+
+type TerminalSettingsProps = HTMLAttributes<HTMLDivElement> & {
+	terminalOutputLineLimit?: number
+	terminalShellIntegrationTimeout?: number
+	setCachedStateField: SetCachedStateField<"terminalOutputLineLimit" | "terminalShellIntegrationTimeout">
+}
+
+export const TerminalSettings = ({
+	terminalOutputLineLimit,
+	terminalShellIntegrationTimeout,
+	setCachedStateField,
+	className,
+	...props
+}: TerminalSettingsProps) => {
+	const { t } = useAppTranslation()
+
+	return (
+		<div className={cn("flex flex-col gap-2", className)} {...props}>
+			<SectionHeader>
+				<div className="flex items-center gap-2">
+					<SquareTerminal className="w-4" />
+					<div>{t("settings:sections.terminal")}</div>
+				</div>
+			</SectionHeader>
+
+			<Section>
+				<div>
+					<div className="flex flex-col gap-2">
+						<span className="font-medium">{t("settings:terminal.outputLineLimit.label")}</span>
+						<div className="flex items-center gap-2">
+							<input
+								type="range"
+								min="100"
+								max="5000"
+								step="100"
+								value={terminalOutputLineLimit ?? 500}
+								onChange={(e) =>
+									setCachedStateField("terminalOutputLineLimit", parseInt(e.target.value))
+								}
+								className="h-2 focus:outline-0 w-4/5 accent-vscode-button-background"
+								data-testid="terminal-output-limit-slider"
+							/>
+							<span style={{ ...sliderLabelStyle }}>{terminalOutputLineLimit ?? 500}</span>
+						</div>
+					</div>
+					<p className="text-vscode-descriptionForeground text-sm mt-0">
+						{t("settings:terminal.outputLineLimit.description")}
+					</p>
+				</div>
+
+				<div>
+					<div className="flex flex-col gap-2">
+						<span className="font-medium">{t("settings:terminal.shellIntegrationTimeout.label")}</span>
+						<div className="flex items-center gap-2">
+							<input
+								type="range"
+								min="1000"
+								max="60000"
+								step="1000"
+								value={terminalShellIntegrationTimeout}
+								onChange={(e) =>
+									setCachedStateField(
+										"terminalShellIntegrationTimeout",
+										Math.min(60000, Math.max(1000, parseInt(e.target.value))),
+									)
+								}
+								className="h-2 focus:outline-0 w-4/5 accent-vscode-button-background"
+							/>
+							<span style={{ ...sliderLabelStyle }}>
+								{(terminalShellIntegrationTimeout ?? 5000) / 1000}s
+							</span>
+						</div>
+						<p className="text-vscode-descriptionForeground text-sm mt-0">
+							{t("settings:terminal.shellIntegrationTimeout.description")}
+						</p>
+					</div>
+				</div>
+			</Section>
+		</div>
+	)
+}

+ 0 - 14
webview-ui/src/components/settings/__tests__/ContextManagementSettings.test.tsx

@@ -17,11 +17,6 @@ describe("ContextManagementSettings", () => {
 	it("renders all controls", () => {
 		render(<ContextManagementSettings {...defaultProps} />)
 
-		// Terminal output limit
-		const terminalSlider = screen.getByTestId("terminal-output-limit-slider")
-		expect(terminalSlider).toBeInTheDocument()
-		expect(terminalSlider).toHaveValue("500")
-
 		// Open tabs context limit
 		const openTabsSlider = screen.getByTestId("open-tabs-limit-slider")
 		expect(openTabsSlider).toBeInTheDocument()
@@ -38,15 +33,6 @@ describe("ContextManagementSettings", () => {
 		expect(screen.getByTestId("show-rooignored-files-checkbox")).not.toBeChecked()
 	})
 
-	it("updates terminal output limit", () => {
-		render(<ContextManagementSettings {...defaultProps} />)
-
-		const slider = screen.getByTestId("terminal-output-limit-slider")
-		fireEvent.change(slider, { target: { value: "1000" } })
-
-		expect(defaultProps.setCachedStateField).toHaveBeenCalledWith("terminalOutputLineLimit", 1000)
-	})
-
 	it("updates open tabs context limit", () => {
 		render(<ContextManagementSettings {...defaultProps} />)
 

+ 2 - 1
webview-ui/src/context/ExtensionStateContext.tsx

@@ -151,7 +151,8 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode
 		cwd: "",
 		browserToolEnabled: true,
 		telemetrySetting: "unset",
-		showRooIgnoredFiles: true, // Default to showing .rooignore'd files with lock symbol (current behavior)
+		showRooIgnoredFiles: true, // Default to showing .rooignore'd files with lock symbol (current behavior).
+		renderContext: "sidebar",
 	})
 
 	const [didHydrateState, setDidHydrateState] = useState(false)

+ 1 - 0
webview-ui/src/context/__tests__/ExtensionStateContext.test.tsx

@@ -202,6 +202,7 @@ describe("mergeExtensionState", () => {
 			apiConfiguration: { providerId: "openrouter" } as ApiConfiguration,
 			telemetrySetting: "unset",
 			showRooIgnoredFiles: true,
+			renderContext: "sidebar",
 		}
 
 		const prevState: ExtensionState = {

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

@@ -24,8 +24,11 @@
 		"checkpoints": "Punts de control",
 		"notifications": "Notificacions",
 		"contextManagement": "Gestió de context",
+		"terminal": "Terminal",
 		"advanced": "Avançat",
-		"experimental": "Funcions experimentals"
+		"experimental": "Funcions experimentals",
+		"language": "Idioma",
+		"about": "Sobre Roo Code"
 	},
 	"autoApprove": {
 		"description": "Permet que Roo realitzi operacions automàticament sense requerir aprovació. Activeu aquesta configuració només si confieu plenament en la IA i enteneu els riscos de seguretat associats.",
@@ -250,10 +253,6 @@
 	},
 	"contextManagement": {
 		"description": "Controleu quina informació s'inclou a la finestra de context de la IA, afectant l'ús de token i la qualitat de resposta",
-		"terminal": {
-			"label": "Límit de sortida de terminal",
-			"description": "Nombre màxim de línies a incloure a la sortida del terminal en executar comandes. Quan s'excedeix, s'eliminaran línies del mig, estalviant token."
-		},
 		"openTabs": {
 			"label": "Límit de context de pestanyes obertes",
 			"description": "Nombre màxim de pestanyes obertes de VSCode a incloure al context. Valors més alts proporcionen més context però augmenten l'ús de token."
@@ -267,6 +266,16 @@
 			"description": "Quan està habilitat, els fitxers que coincideixen amb els patrons a .rooignore es mostraran en llistes amb un símbol de cadenat. Quan està deshabilitat, aquests fitxers s'ocultaran completament de les llistes de fitxers i cerques."
 		}
 	},
+	"terminal": {
+		"outputLineLimit": {
+			"label": "Límit de sortida de terminal",
+			"description": "Nombre màxim de línies a incloure a la sortida del terminal en executar comandes. Quan s'excedeix, s'eliminaran línies del mig, estalviant token."
+		},
+		"shellIntegrationTimeout": {
+			"label": "Temps d'espera d'integració de shell del terminal",
+			"description": "Temps màxim d'espera per a la inicialització de la integració de shell abans d'executar comandes. Per a usuaris amb temps d'inici de shell llargs, aquest valor pot necessitar ser augmentat si veieu errors \"Shell Integration Unavailable\" al terminal."
+		}
+	},
 	"advanced": {
 		"rateLimit": {
 			"label": "Límit de freqüència",

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

@@ -24,8 +24,11 @@
 		"checkpoints": "Kontrollpunkte",
 		"notifications": "Benachrichtigungen",
 		"contextManagement": "Kontext-Management",
+		"terminal": "Terminal",
 		"advanced": "Erweitert",
-		"experimental": "Experimentelle Funktionen"
+		"experimental": "Experimentelle Funktionen",
+		"language": "Sprache",
+		"about": "Über Roo Code"
 	},
 	"autoApprove": {
 		"description": "Erlaubt Roo, Operationen automatisch ohne Genehmigung durchzuführen. Aktivieren Sie diese Einstellungen nur, wenn Sie der KI vollständig vertrauen und die damit verbundenen Sicherheitsrisiken verstehen.",
@@ -250,10 +253,6 @@
 	},
 	"contextManagement": {
 		"description": "Steuern Sie, welche Informationen im KI-Kontextfenster enthalten sind, was den Token-Verbrauch und die Antwortqualität beeinflusst",
-		"terminal": {
-			"label": "Terminal-Ausgabelimit",
-			"description": "Maximale Anzahl von Zeilen, die in der Terminal-Ausgabe bei der Ausführung von Befehlen enthalten sein sollen. Bei Überschreitung werden Zeilen aus der Mitte entfernt, wodurch Token gespart werden."
-		},
 		"openTabs": {
 			"label": "Geöffnete Tabs Kontextlimit",
 			"description": "Maximale Anzahl von geöffneten VSCode-Tabs, die im Kontext enthalten sein sollen. Höhere Werte bieten mehr Kontext, erhöhen aber den Token-Verbrauch."
@@ -267,6 +266,16 @@
 			"description": "Wenn aktiviert, werden Dateien, die mit Mustern in .rooignore übereinstimmen, in Listen mit einem Schlosssymbol angezeigt. Wenn deaktiviert, werden diese Dateien vollständig aus Dateilisten und Suchen ausgeblendet."
 		}
 	},
+	"terminal": {
+		"outputLineLimit": {
+			"label": "Terminal-Ausgabelimit",
+			"description": "Maximale Anzahl von Zeilen, die in der Terminal-Ausgabe bei der Ausführung von Befehlen enthalten sein sollen. Bei Überschreitung werden Zeilen aus der Mitte entfernt, wodurch Token gespart werden."
+		},
+		"shellIntegrationTimeout": {
+			"label": "Terminal-Shell-Integrationszeit-Limit",
+			"description": "Maximale Wartezeit für die Shell-Integration, bevor Befehle ausgeführt werden. Für Benutzer mit langen Shell-Startzeiten muss dieser Wert möglicherweise erhöht werden, wenn Sie Fehler vom Typ \"Shell Integration Unavailable\" im Terminal sehen."
+		}
+	},
 	"advanced": {
 		"rateLimit": {
 			"label": "Ratenbegrenzung",

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

@@ -24,8 +24,11 @@
 		"checkpoints": "Checkpoints",
 		"notifications": "Notifications",
 		"contextManagement": "Context Management",
+		"terminal": "Terminal",
 		"advanced": "Advanced",
-		"experimental": "Experimental Features"
+		"experimental": "Experimental Features",
+		"language": "Language",
+		"about": "About Roo Code"
 	},
 	"autoApprove": {
 		"description": "Allow Roo to automatically perform operations without requiring approval. Enable these settings only if you fully trust the AI and understand the associated security risks.",
@@ -250,10 +253,6 @@
 	},
 	"contextManagement": {
 		"description": "Control what information is included in the AI's context window, affecting token usage and response quality",
-		"terminal": {
-			"label": "Terminal output limit",
-			"description": "Maximum number of lines to include in terminal output when executing commands. When exceeded lines will be removed from the middle, saving tokens."
-		},
 		"openTabs": {
 			"label": "Open tabs context limit",
 			"description": "Maximum number of VSCode open tabs to include in context. Higher values provide more context but increase token usage."
@@ -267,6 +266,16 @@
 			"description": "When enabled, files matching patterns in .rooignore will be shown in lists with a lock symbol. When disabled, these files will be completely hidden from file lists and searches."
 		}
 	},
+	"terminal": {
+		"outputLineLimit": {
+			"label": "Terminal output limit",
+			"description": "Maximum number of lines to include in terminal output when executing commands. When exceeded lines will be removed from the middle, saving tokens."
+		},
+		"shellIntegrationTimeout": {
+			"label": "Terminal shell integration timeout",
+			"description": "Maximum time to wait for shell integration to initialize before executing commands. For users with long shell startup times, this value may need to be increased if you see \"Shell Integration Unavailable\" errors in the terminal."
+		}
+	},
 	"advanced": {
 		"rateLimit": {
 			"label": "Rate limit",
@@ -347,7 +356,6 @@
 	},
 	"footer": {
 		"feedback": "If you have any questions or feedback, feel free to open an issue at <githubLink>github.com/RooVetGit/Roo-Code</githubLink> or join <redditLink>reddit.com/r/RooCode</redditLink> or <discordLink>discord.gg/roocode</discordLink>",
-		"version": "Roo Code v{{version}}",
 		"telemetry": {
 			"label": "Allow anonymous error and usage reporting",
 			"description": "Help improve Roo Code by sending anonymous usage data and error reports. No code, prompts, or personal information is ever sent. See our privacy policy for more details."

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

@@ -24,8 +24,11 @@
 		"checkpoints": "Puntos de control",
 		"notifications": "Notificaciones",
 		"contextManagement": "Gestión de contexto",
+		"terminal": "Terminal",
 		"advanced": "Avanzado",
-		"experimental": "Funciones experimentales"
+		"experimental": "Funciones experimentales",
+		"language": "Idioma",
+		"about": "Acerca de Roo Code"
 	},
 	"autoApprove": {
 		"description": "Permitir que Roo realice operaciones automáticamente sin requerir aprobación. Habilite esta configuración solo si confía plenamente en la IA y comprende los riesgos de seguridad asociados.",
@@ -250,10 +253,6 @@
 	},
 	"contextManagement": {
 		"description": "Controle qué información se incluye en la ventana de contexto de la IA, afectando el uso de token y la calidad de respuesta",
-		"terminal": {
-			"label": "Límite de salida de terminal",
-			"description": "Número máximo de líneas a incluir en la salida del terminal al ejecutar comandos. Cuando se excede, se eliminarán líneas del medio, ahorrando token."
-		},
 		"openTabs": {
 			"label": "Límite de contexto de pestañas abiertas",
 			"description": "Número máximo de pestañas abiertas de VSCode a incluir en el contexto. Valores más altos proporcionan más contexto pero aumentan el uso de token."
@@ -267,6 +266,16 @@
 			"description": "Cuando está habilitado, los archivos que coinciden con los patrones en .rooignore se mostrarán en listas con un símbolo de candado. Cuando está deshabilitado, estos archivos se ocultarán completamente de las listas de archivos y búsquedas."
 		}
 	},
+	"terminal": {
+		"outputLineLimit": {
+			"label": "Límite de salida de terminal",
+			"description": "Número máximo de líneas a incluir en la salida del terminal al ejecutar comandos. Cuando se excede, se eliminarán líneas del medio, ahorrando token."
+		},
+		"shellIntegrationTimeout": {
+			"label": "Tiempo de espera de integración del shell del terminal",
+			"description": "Tiempo máximo de espera para la inicialización de la integración del shell antes de ejecutar comandos. Para usuarios con tiempos de inicio de shell largos, este valor puede necesitar ser aumentado si ve errores \"Shell Integration Unavailable\" en el terminal."
+		}
+	},
 	"advanced": {
 		"rateLimit": {
 			"label": "Límite de tasa",

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

@@ -24,8 +24,11 @@
 		"checkpoints": "Points de contrôle",
 		"notifications": "Notifications",
 		"contextManagement": "Gestion du contexte",
+		"terminal": "Terminal",
 		"advanced": "Avancé",
-		"experimental": "Fonctionnalités expérimentales"
+		"experimental": "Fonctionnalités expérimentales",
+		"language": "Langue",
+		"about": "À propos de Roo Code"
 	},
 	"autoApprove": {
 		"description": "Permettre à Roo d'effectuer automatiquement des opérations sans requérir d'approbation. Activez ces paramètres uniquement si vous faites entièrement confiance à l'IA et que vous comprenez les risques de sécurité associés.",
@@ -250,10 +253,6 @@
 	},
 	"contextManagement": {
 		"description": "Contrôlez quelles informations sont incluses dans la fenêtre de contexte de l'IA, affectant l'utilisation de token et la qualité des réponses",
-		"terminal": {
-			"label": "Limite de sortie du terminal",
-			"description": "Nombre maximum de lignes à inclure dans la sortie du terminal lors de l'exécution de commandes. Lorsque ce nombre est dépassé, les lignes seront supprimées du milieu, économisant des token."
-		},
 		"openTabs": {
 			"label": "Limite de contexte des onglets ouverts",
 			"description": "Nombre maximum d'onglets VSCode ouverts à inclure dans le contexte. Des valeurs plus élevées fournissent plus de contexte mais augmentent l'utilisation de token."
@@ -267,6 +266,16 @@
 			"description": "Lorsque cette option est activée, les fichiers correspondant aux modèles dans .rooignore seront affichés dans les listes avec un symbole de cadenas. Lorsqu'elle est désactivée, ces fichiers seront complètement masqués des listes de fichiers et des recherches."
 		}
 	},
+	"terminal": {
+		"outputLineLimit": {
+			"label": "Limite de sortie du terminal",
+			"description": "Nombre maximum de lignes à inclure dans la sortie du terminal lors de l'exécution de commandes. Lorsque ce nombre est dépassé, les lignes seront supprimées du milieu, économisant des token."
+		},
+		"shellIntegrationTimeout": {
+			"label": "Délai d'intégration du shell du terminal",
+			"description": "Temps maximum d'attente pour l'initialisation de l'intégration du shell avant d'exécuter des commandes. Pour les utilisateurs avec des temps de démarrage de shell longs, cette valeur peut nécessiter d'être augmentée si vous voyez des erreurs \"Shell Integration Unavailable\" dans le terminal."
+		}
+	},
 	"advanced": {
 		"rateLimit": {
 			"label": "Limite de débit",

+ 14 - 5
webview-ui/src/i18n/locales/hi/settings.json

@@ -24,8 +24,11 @@
 		"checkpoints": "चेकपॉइंट",
 		"notifications": "सूचनाएँ",
 		"contextManagement": "संदर्भ प्रबंधन",
+		"terminal": "टर्मिनल",
 		"advanced": "उन्नत",
-		"experimental": "प्रायोगिक सुविधाएँ"
+		"experimental": "प्रायोगिक सुविधाएँ",
+		"language": "भाषा",
+		"about": "Roo Code के बारे में"
 	},
 	"autoApprove": {
 		"description": "Roo को अनुमोदन की आवश्यकता के बिना स्वचालित रूप से ऑपरेशन करने की अनुमति दें। इन सेटिंग्स को केवल तभी सक्षम करें जब आप AI पर पूरी तरह से भरोसा करते हों और संबंधित सुरक्षा जोखिमों को समझते हों।",
@@ -250,10 +253,6 @@
 	},
 	"contextManagement": {
 		"description": "AI के संदर्भ विंडो में शामिल जानकारी को नियंत्रित करें, जो token उपयोग और प्रतिक्रिया गुणवत्ता को प्रभावित करता है",
-		"terminal": {
-			"label": "टर्मिनल आउटपुट सीमा",
-			"description": "कमांड निष्पादित करते समय टर्मिनल आउटपुट में शामिल करने के लिए पंक्तियों की अधिकतम संख्या। पार होने पर पंक्तियाँ मध्य से हटा दी जाएंगी, token बचाते हुए।"
-		},
 		"openTabs": {
 			"label": "खुले टैब संदर्भ सीमा",
 			"description": "संदर्भ में शामिल करने के लिए VSCode खुले टैब की अधिकतम संख्या। उच्च मान अधिक संदर्भ प्रदान करते हैं लेकिन token उपयोग बढ़ाते हैं।"
@@ -267,6 +266,16 @@
 			"description": "जब सक्षम होता है, .rooignore में पैटर्न से मेल खाने वाली फाइलें लॉक प्रतीक के साथ सूचियों में दिखाई जाएंगी। जब अक्षम होता है, ये फाइलें फाइल सूचियों और खोजों से पूरी तरह छिपा दी जाएंगी।"
 		}
 	},
+	"terminal": {
+		"outputLineLimit": {
+			"label": "टर्मिनल आउटपुट सीमा",
+			"description": "कमांड निष्पादित करते समय टर्मिनल आउटपुट में शामिल करने के लिए पंक्तियों की अधिकतम संख्या। पार होने पर पंक्तियाँ मध्य से हटा दी जाएंगी, token बचाते हुए।"
+		},
+		"shellIntegrationTimeout": {
+			"label": "टर्मिनल शेल एकीकरण टाइमआउट",
+			"description": "कमांड निष्पादित करने से पहले शेल एकीकरण के आरंभ होने के लिए प्रतीक्षा का अधिकतम समय। लंबे शेल स्टार्टअप समय वाले उपयोगकर्ताओं के लिए, यदि आप टर्मिनल में \"Shell Integration Unavailable\" त्रुटियाँ देखते हैं तो इस मान को बढ़ाने की आवश्यकता हो सकती है।"
+		}
+	},
 	"advanced": {
 		"rateLimit": {
 			"label": "दर सीमा",

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

@@ -24,8 +24,11 @@
 		"checkpoints": "Punti di controllo",
 		"notifications": "Notifiche",
 		"contextManagement": "Gestione del contesto",
+		"terminal": "Terminal",
 		"advanced": "Avanzate",
-		"experimental": "Funzionalità sperimentali"
+		"experimental": "Funzionalità sperimentali",
+		"language": "Lingua",
+		"about": "Informazioni su Roo Code"
 	},
 	"autoApprove": {
 		"description": "Permetti a Roo di eseguire automaticamente operazioni senza richiedere approvazione. Abilita queste impostazioni solo se ti fidi completamente dell'IA e comprendi i rischi di sicurezza associati.",
@@ -250,10 +253,6 @@
 	},
 	"contextManagement": {
 		"description": "Controlla quali informazioni sono incluse nella finestra di contesto dell'IA, influenzando l'utilizzo di token e la qualità delle risposte",
-		"terminal": {
-			"label": "Limite output terminale",
-			"description": "Numero massimo di righe da includere nell'output del terminale durante l'esecuzione dei comandi. Quando superato, le righe verranno rimosse dal centro, risparmiando token."
-		},
 		"openTabs": {
 			"label": "Limite contesto schede aperte",
 			"description": "Numero massimo di schede VSCode aperte da includere nel contesto. Valori più alti forniscono più contesto ma aumentano l'utilizzo di token."
@@ -267,6 +266,16 @@
 			"description": "Quando abilitato, i file che corrispondono ai pattern in .rooignore verranno mostrati negli elenchi con un simbolo di blocco. Quando disabilitato, questi file saranno completamente nascosti dagli elenchi di file e dalle ricerche."
 		}
 	},
+	"terminal": {
+		"outputLineLimit": {
+			"label": "Limite output terminale",
+			"description": "Numero massimo di righe da includere nell'output del terminale durante l'esecuzione dei comandi. Quando superato, le righe verranno rimosse dal centro, risparmiando token."
+		},
+		"shellIntegrationTimeout": {
+			"label": "Timeout integrazione shell del terminale",
+			"description": "Tempo massimo di attesa per l'inizializzazione dell'integrazione della shell prima di eseguire i comandi. Per gli utenti con tempi di avvio della shell lunghi, questo valore potrebbe dover essere aumentato se si vedono errori \"Shell Integration Unavailable\" nel terminale."
+		}
+	},
 	"advanced": {
 		"rateLimit": {
 			"label": "Limite di frequenza",

+ 14 - 5
webview-ui/src/i18n/locales/ja/settings.json

@@ -24,8 +24,11 @@
 		"checkpoints": "チェックポイント",
 		"notifications": "通知",
 		"contextManagement": "コンテキスト管理",
+		"terminal": "ターミナル",
 		"advanced": "詳細設定",
-		"experimental": "実験的機能"
+		"experimental": "実験的機能",
+		"language": "言語",
+		"about": "Roo Codeについて"
 	},
 	"autoApprove": {
 		"description": "Rooが承認なしで自動的に操作を実行できるようにします。AIを完全に信頼し、関連するセキュリティリスクを理解している場合にのみ、これらの設定を有効にしてください。",
@@ -250,10 +253,6 @@
 	},
 	"contextManagement": {
 		"description": "AIのコンテキストウィンドウに含まれる情報を制御し、token使用量とレスポンスの品質に影響します",
-		"terminal": {
-			"label": "ターミナル出力制限",
-			"description": "コマンド実行時にターミナル出力に含める最大行数。超過すると中央から行が削除され、tokenを節約します。"
-		},
 		"openTabs": {
 			"label": "オープンタブコンテキスト制限",
 			"description": "コンテキストに含めるVSCodeオープンタブの最大数。高い値はより多くのコンテキストを提供しますが、token使用量が増加します。"
@@ -267,6 +266,16 @@
 			"description": "有効にすると、.rooignoreのパターンに一致するファイルがロックシンボル付きでリストに表示されます。無効にすると、これらのファイルはファイルリストや検索から完全に非表示になります。"
 		}
 	},
+	"terminal": {
+		"outputLineLimit": {
+			"label": "ターミナル出力制限",
+			"description": "コマンド実行時にターミナル出力に含める最大行数。超過すると中央から行が削除され、tokenを節約します。"
+		},
+		"shellIntegrationTimeout": {
+			"label": "ターミナルシェル統合タイムアウト",
+			"description": "コマンドを実行する前にシェル統合の初期化を待つ最大時間。シェルの起動時間が長いユーザーの場合、ターミナルで「Shell Integration Unavailable」エラーが表示される場合は、この値を増やす必要があるかもしれません。"
+		}
+	},
 	"advanced": {
 		"rateLimit": {
 			"label": "レート制限",

+ 14 - 5
webview-ui/src/i18n/locales/ko/settings.json

@@ -24,8 +24,11 @@
 		"checkpoints": "체크포인트",
 		"notifications": "알림",
 		"contextManagement": "컨텍스트 관리",
+		"terminal": "터미널",
 		"advanced": "고급",
-		"experimental": "실험적 기능"
+		"experimental": "실험적 기능",
+		"language": "언어",
+		"about": "Roo Code 정보"
 	},
 	"autoApprove": {
 		"description": "Roo가 승인 없이 자동으로 작업을 수행할 수 있도록 허용합니다. AI를 완전히 신뢰하고 관련 보안 위험을 이해하는 경우에만 이러한 설정을 활성화하세요.",
@@ -250,10 +253,6 @@
 	},
 	"contextManagement": {
 		"description": "AI의 컨텍스트 창에 포함되는 정보를 제어하여 token 사용량과 응답 품질에 영향을 미칩니다",
-		"terminal": {
-			"label": "터미널 출력 제한",
-			"description": "명령 실행 시 터미널 출력에 포함할 최대 라인 수. 초과 시 중간에서 라인이 제거되어 token이 절약됩니다."
-		},
 		"openTabs": {
 			"label": "열린 탭 컨텍스트 제한",
 			"description": "컨텍스트에 포함할 VSCode 열린 탭의 최대 수. 높은 값은 더 많은 컨텍스트를 제공하지만 token 사용량이 증가합니다."
@@ -267,6 +266,16 @@
 			"description": "활성화되면 .rooignore의 패턴과 일치하는 파일이 잠금 기호와 함께 목록에 표시됩니다. 비활성화되면 이러한 파일은 파일 목록 및 검색에서 완전히 숨겨집니다."
 		}
 	},
+	"terminal": {
+		"outputLineLimit": {
+			"label": "터미널 출력 제한",
+			"description": "명령 실행 시 터미널 출력에 포함할 최대 라인 수. 초과 시 중간에서 라인이 제거되어 token이 절약됩니다."
+		},
+		"shellIntegrationTimeout": {
+			"label": "터미널 쉘 통합 타임아웃",
+			"description": "명령을 실행하기 전에 쉘 통합이 초기화될 때까지 기다리는 최대 시간. 쉘 시작 시간이 긴 사용자의 경우, 터미널에서 \"Shell Integration Unavailable\" 오류가 표시되면 이 값을 늘려야 할 수 있습니다."
+		}
+	},
 	"advanced": {
 		"rateLimit": {
 			"label": "속도 제한",

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

@@ -24,8 +24,11 @@
 		"checkpoints": "Punkty kontrolne",
 		"notifications": "Powiadomienia",
 		"contextManagement": "Zarządzanie kontekstem",
+		"terminal": "Terminal",
 		"advanced": "Zaawansowane",
-		"experimental": "Funkcje eksperymentalne"
+		"experimental": "Funkcje eksperymentalne",
+		"language": "Język",
+		"about": "O Roo Code"
 	},
 	"autoApprove": {
 		"description": "Pozwól Roo na automatyczne wykonywanie operacji bez wymagania zatwierdzenia. Włącz te ustawienia tylko jeśli w pełni ufasz AI i rozumiesz związane z tym zagrożenia bezpieczeństwa.",
@@ -250,10 +253,6 @@
 	},
 	"contextManagement": {
 		"description": "Kontroluj, jakie informacje są zawarte w oknie kontekstu AI, wpływając na zużycie token i jakość odpowiedzi",
-		"terminal": {
-			"label": "Limit wyjścia terminala",
-			"description": "Maksymalna liczba linii do uwzględnienia w wyjściu terminala podczas wykonywania poleceń. Po przekroczeniu linie będą usuwane ze środka, oszczędzając token."
-		},
 		"openTabs": {
 			"label": "Limit kontekstu otwartych kart",
 			"description": "Maksymalna liczba otwartych kart VSCode do uwzględnienia w kontekście. Wyższe wartości zapewniają więcej kontekstu, ale zwiększają zużycie token."
@@ -267,6 +266,16 @@
 			"description": "Gdy włączone, pliki pasujące do wzorców w .rooignore będą pokazywane na listach z symbolem kłódki. Gdy wyłączone, te pliki będą całkowicie ukryte z list plików i wyszukiwań."
 		}
 	},
+	"terminal": {
+		"outputLineLimit": {
+			"label": "Limit wyjścia terminala",
+			"description": "Maksymalna liczba linii do uwzględnienia w wyjściu terminala podczas wykonywania poleceń. Po przekroczeniu linie będą usuwane ze środka, oszczędzając token."
+		},
+		"shellIntegrationTimeout": {
+			"label": "Limit czasu integracji powłoki terminala",
+			"description": "Maksymalny czas oczekiwania na inicjalizację integracji powłoki przed wykonaniem poleceń. Dla użytkowników z długim czasem uruchamiania powłoki, ta wartość może wymagać zwiększenia, jeśli widzisz błędy \"Shell Integration Unavailable\" w terminalu."
+		}
+	},
 	"advanced": {
 		"rateLimit": {
 			"label": "Limit szybkości",

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

@@ -24,8 +24,11 @@
 		"checkpoints": "Pontos de verificação",
 		"notifications": "Notificações",
 		"contextManagement": "Gestão de contexto",
+		"terminal": "Terminal",
 		"advanced": "Avançado",
-		"experimental": "Recursos experimentais"
+		"experimental": "Recursos experimentais",
+		"language": "Idioma",
+		"about": "Sobre o Roo Code"
 	},
 	"autoApprove": {
 		"description": "Permitir que o Roo realize operações automaticamente sem exigir aprovação. Ative essas configurações apenas se confiar totalmente na IA e compreender os riscos de segurança associados.",
@@ -250,10 +253,6 @@
 	},
 	"contextManagement": {
 		"description": "Controle quais informações são incluídas na janela de contexto da IA, afetando o uso de token e a qualidade da resposta",
-		"terminal": {
-			"label": "Limite de saída do terminal",
-			"description": "Número máximo de linhas a incluir na saída do terminal ao executar comandos. Quando excedido, as linhas serão removidas do meio, economizando token."
-		},
 		"openTabs": {
 			"label": "Limite de contexto de abas abertas",
 			"description": "Número máximo de abas abertas do VSCode a incluir no contexto. Valores mais altos fornecem mais contexto, mas aumentam o uso de token."
@@ -267,6 +266,16 @@
 			"description": "Quando ativado, os arquivos que correspondem aos padrões em .rooignore serão mostrados em listas com um símbolo de cadeado. Quando desativado, esses arquivos serão completamente ocultos das listas de arquivos e pesquisas."
 		}
 	},
+	"terminal": {
+		"outputLineLimit": {
+			"label": "Limite de saída do terminal",
+			"description": "Número máximo de linhas a incluir na saída do terminal ao executar comandos. Quando excedido, as linhas serão removidas do meio, economizando token."
+		},
+		"shellIntegrationTimeout": {
+			"label": "Tempo limite de integração do shell do terminal",
+			"description": "Tempo máximo de espera para a inicialização da integração do shell antes de executar comandos. Para usuários com tempos de inicialização de shell longos, este valor pode precisar ser aumentado se você vir erros \"Shell Integration Unavailable\" no terminal."
+		}
+	},
 	"advanced": {
 		"rateLimit": {
 			"label": "Limite de taxa",

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

@@ -24,8 +24,11 @@
 		"checkpoints": "Kontrol Noktaları",
 		"notifications": "Bildirimler",
 		"contextManagement": "Bağlam Yönetimi",
+		"terminal": "Terminal",
 		"advanced": "Gelişmiş",
-		"experimental": "Deneysel Özellikler"
+		"experimental": "Deneysel Özellikler",
+		"language": "Dil",
+		"about": "Roo Code Hakkında"
 	},
 	"autoApprove": {
 		"description": "Roo'nun onay gerektirmeden otomatik olarak işlemler gerçekleştirmesine izin verin. Bu ayarları yalnızca yapay zekaya tamamen güveniyorsanız ve ilgili güvenlik risklerini anlıyorsanız etkinleştirin.",
@@ -250,10 +253,6 @@
 	},
 	"contextManagement": {
 		"description": "Yapay zekanın bağlam penceresine hangi bilgilerin dahil edileceğini kontrol edin, token kullanımını ve yanıt kalitesini etkiler",
-		"terminal": {
-			"label": "Terminal çıktısı sınırı",
-			"description": "Komutları yürütürken terminal çıktısına dahil edilecek maksimum satır sayısı. Aşıldığında, token tasarrufu sağlayarak satırlar ortadan kaldırılacaktır."
-		},
 		"openTabs": {
 			"label": "Açık sekmeler bağlam sınırı",
 			"description": "Bağlama dahil edilecek maksimum VSCode açık sekme sayısı. Daha yüksek değerler daha fazla bağlam sağlar ancak token kullanımını artırır."
@@ -267,6 +266,16 @@
 			"description": "Etkinleştirildiğinde, .rooignore'daki desenlerle eşleşen dosyalar kilit sembolü ile listelerde gösterilecektir. Devre dışı bırakıldığında, bu dosyalar dosya listelerinden ve aramalardan tamamen gizlenecektir."
 		}
 	},
+	"terminal": {
+		"outputLineLimit": {
+			"label": "Terminal çıktısı sınırı",
+			"description": "Komutları yürütürken terminal çıktısına dahil edilecek maksimum satır sayısı. Aşıldığında, token tasarrufu sağlayarak satırlar ortadan kaldırılacaktır."
+		},
+		"shellIntegrationTimeout": {
+			"label": "Terminal kabuk entegrasyonu zaman aşımı",
+			"description": "Komutları yürütmeden önce kabuk entegrasyonunun başlatılması için beklenecek maksimum süre. Kabuk başlatma süresi uzun olan kullanıcılar için, terminalde \"Shell Integration Unavailable\" hatalarını görürseniz bu değerin artırılması gerekebilir."
+		}
+	},
 	"advanced": {
 		"rateLimit": {
 			"label": "Hız sınırı",

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

@@ -24,8 +24,11 @@
 		"checkpoints": "Điểm kiểm tra",
 		"notifications": "Thông báo",
 		"contextManagement": "Quản lý ngữ cảnh",
+		"terminal": "Terminal",
 		"advanced": "Nâng cao",
-		"experimental": "Tính năng thử nghiệm"
+		"experimental": "Tính năng thử nghiệm",
+		"language": "Ngôn ngữ",
+		"about": "Về Roo Code"
 	},
 	"autoApprove": {
 		"description": "Cho phép Roo tự động thực hiện các hoạt động mà không cần phê duyệt. Chỉ bật những cài đặt này nếu bạn hoàn toàn tin tưởng AI và hiểu rõ các rủi ro bảo mật liên quan.",
@@ -250,10 +253,6 @@
 	},
 	"contextManagement": {
 		"description": "Kiểm soát thông tin nào được đưa vào cửa sổ ngữ cảnh của AI, ảnh hưởng đến việc sử dụng token và chất lượng phản hồi",
-		"terminal": {
-			"label": "Giới hạn đầu ra terminal",
-			"description": "Số dòng tối đa để đưa vào đầu ra terminal khi thực hiện lệnh. Khi vượt quá, các dòng sẽ bị xóa khỏi phần giữa, tiết kiệm token."
-		},
 		"openTabs": {
 			"label": "Giới hạn ngữ cảnh tab đang mở",
 			"description": "Số lượng tab VSCode đang mở tối đa để đưa vào ngữ cảnh. Giá trị cao hơn cung cấp nhiều ngữ cảnh hơn nhưng tăng sử dụng token."
@@ -267,6 +266,16 @@
 			"description": "Khi được bật, các tệp khớp với mẫu trong .rooignore sẽ được hiển thị trong danh sách với biểu tượng khóa. Khi bị tắt, các tệp này sẽ hoàn toàn bị ẩn khỏi danh sách tệp và tìm kiếm."
 		}
 	},
+	"terminal": {
+		"outputLineLimit": {
+			"label": "Giới hạn đầu ra terminal",
+			"description": "Số dòng tối đa để đưa vào đầu ra terminal khi thực hiện lệnh. Khi vượt quá, các dòng sẽ bị xóa khỏi phần giữa, tiết kiệm token."
+		},
+		"shellIntegrationTimeout": {
+			"label": "Thời gian chờ tích hợp shell terminal",
+			"description": "Thời gian tối đa để chờ tích hợp shell khởi tạo trước khi thực hiện lệnh. Đối với người dùng có thời gian khởi động shell dài, giá trị này có thể cần được tăng lên nếu bạn thấy lỗi \"Shell Integration Unavailable\" trong terminal."
+		}
+	},
 	"advanced": {
 		"rateLimit": {
 			"label": "Giới hạn tốc độ",

+ 14 - 5
webview-ui/src/i18n/locales/zh-CN/settings.json

@@ -24,8 +24,11 @@
 		"checkpoints": "检查点",
 		"notifications": "通知",
 		"contextManagement": "上下文管理",
+		"terminal": "终端",
 		"advanced": "高级",
-		"experimental": "实验性功能"
+		"experimental": "实验性功能",
+		"language": "语言",
+		"about": "关于 Roo Code"
 	},
 	"autoApprove": {
 		"description": "允许 Roo 自动执行操作而无需批准。只有在您完全信任 AI 并了解相关安全风险的情况下才启用这些设置。",
@@ -250,10 +253,6 @@
 	},
 	"contextManagement": {
 		"description": "控制在 AI 的上下文窗口中包含哪些信息,影响 token 使用和响应质量",
-		"terminal": {
-			"label": "终端输出限制",
-			"description": "执行命令时在终端输出中包含的最大行数。超过时将从中间删除行,节省 token。"
-		},
 		"openTabs": {
 			"label": "打开标签上下文限制",
 			"description": "在上下文中包含的 VSCode 打开标签的最大数量。较高的值提供更多上下文,但会增加 token 使用量。"
@@ -267,6 +266,16 @@
 			"description": "启用后,与 .rooignore 中模式匹配的文件将在列表中显示锁定符号。禁用时,这些文件将从文件列表和搜索中完全隐藏。"
 		}
 	},
+	"terminal": {
+		"outputLineLimit": {
+			"label": "终端输出限制",
+			"description": "执行命令时在终端输出中包含的最大行数。超过时将从中间删除行,节省 token。"
+		},
+		"shellIntegrationTimeout": {
+			"label": "终端 Shell 集成超时",
+			"description": "执行命令前等待 Shell 集成初始化的最长时间。对于 Shell 启动时间较长的用户,如果在终端中看到\"Shell Integration Unavailable\"错误,可能需要增加此值。"
+		}
+	},
 	"advanced": {
 		"rateLimit": {
 			"label": "速率限制",

+ 14 - 5
webview-ui/src/i18n/locales/zh-TW/settings.json

@@ -24,8 +24,11 @@
 		"checkpoints": "檢查點",
 		"notifications": "通知",
 		"contextManagement": "內容管理",
+		"terminal": "終端機",
 		"advanced": "進階",
-		"experimental": "實驗性功能"
+		"experimental": "實驗性功能",
+		"language": "語言",
+		"about": "關於 Roo Code"
 	},
 	"autoApprove": {
 		"description": "允許 Roo 自動執行操作而無需核准。僅在您完全信任 AI 並理解相關安全風險的情況下啟用這些設定。",
@@ -250,10 +253,6 @@
 	},
 	"contextManagement": {
 		"description": "控制在 AI 的內容視窗中包含哪些資訊,影響 token 使用和回應品質",
-		"terminal": {
-			"label": "終端機輸出限制",
-			"description": "執行命令時在終端機輸出中包含的最大行數。超過時將從中間刪除行,節省 token。"
-		},
 		"openTabs": {
 			"label": "開啟分頁內容限制",
 			"description": "在內容中包含的 VSCode 開啟分頁的最大數量。較高的值提供更多內容,但會增加 token 使用量。"
@@ -267,6 +266,16 @@
 			"description": "啟用後,與 .rooignore 中模式匹配的檔案將在列表中顯示鎖定符號。禁用時,這些檔案將從檔案列表和搜尋中完全隱藏。"
 		}
 	},
+	"terminal": {
+		"outputLineLimit": {
+			"label": "終端機輸出限制",
+			"description": "執行命令時在終端機輸出中包含的最大行數。超過時將從中間刪除行,節省 token。"
+		},
+		"shellIntegrationTimeout": {
+			"label": "終端機 Shell 整合逾時",
+			"description": "執行命令前等待 Shell 整合初始化的最長時間。對於 Shell 啟動時間較長的使用者,如果在終端機中看到\"Shell Integration Unavailable\"錯誤,可能需要增加此值。"
+		}
+	},
 	"advanced": {
 		"rateLimit": {
 			"label": "速率限制",