فهرست منبع

UI Glam Sesh: Makeover for TaskHeader, ChatView, HistoryPreview... (#2701)

* - UI Glam Session -> Makeover for TaskHeader, ChatView, HistoryPreview, WelcomeView
- In particular, display a "no tasks in workspace" message when no tasks are found.
- Clean up Inferface Settings (not needed now) on Settings View
- Copy updates throughout these areas.

* Apply suggestions from code review

Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>

* Missing translation string.

* Fix test

* Fix tests

* Improve translations / fix missing strings.

* Support xAI for evals (#2703)

* Make sure the slash commands only fire if they're the first character (#2702)

* Update contributors list (#2675)

docs: update contributors list [skip ci]

Co-authored-by: mrubens <[email protected]>

* v3.12.3 (#2710)

* Changeset version bump (#2711)

* changeset version bump

* Updating CHANGELOG.md format

* Update CHANGELOG.md

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: R00-B0T <[email protected]>
Co-authored-by: Matt Rubens <[email protected]>

* Update translations

---------

Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>
Co-authored-by: cte <[email protected]>
Co-authored-by: Matt Rubens <[email protected]>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: R00-B0T <[email protected]>
Co-authored-by: R00-B0T <[email protected]>
Sacha Sayan 8 ماه پیش
والد
کامیت
159e4005e5
69فایلهای تغییر یافته به همراه293 افزوده شده و 607 حذف شده
  1. 3 0
      assets/images/roo-logo.svg
  2. 1 4
      src/core/webview/ClineProvider.ts
  3. 0 5
      src/core/webview/webviewMessageHandler.ts
  4. 0 1
      src/exports/roo-code.d.ts
  5. 0 1
      src/exports/types.ts
  6. 0 4
      src/schemas/index.ts
  7. 0 1
      src/shared/ExtensionMessage.ts
  8. 0 1
      src/shared/WebviewMessage.ts
  9. 9 5
      webview-ui/src/__tests__/ContextWindowProgress.test.tsx
  10. 2 3
      webview-ui/src/components/chat/ChatRow.tsx
  11. 3 7
      webview-ui/src/components/chat/ChatView.tsx
  12. 66 277
      webview-ui/src/components/chat/TaskHeader.tsx
  13. 3 1
      webview-ui/src/components/chat/__tests__/TaskHeader.test.tsx
  14. 95 77
      webview-ui/src/components/history/HistoryPreview.tsx
  15. 0 40
      webview-ui/src/components/settings/InterfaceSettings.tsx
  16. 0 12
      webview-ui/src/components/settings/SettingsView.tsx
  17. 32 0
      webview-ui/src/components/welcome/RooHero.tsx
  18. 15 11
      webview-ui/src/components/welcome/WelcomeView.tsx
  19. 0 3
      webview-ui/src/context/ExtensionStateContext.tsx
  20. 2 2
      webview-ui/src/i18n/locales/ca/chat.json
  21. 0 6
      webview-ui/src/i18n/locales/ca/settings.json
  22. 1 1
      webview-ui/src/i18n/locales/ca/welcome.json
  23. 2 2
      webview-ui/src/i18n/locales/de/chat.json
  24. 1 1
      webview-ui/src/i18n/locales/de/history.json
  25. 0 6
      webview-ui/src/i18n/locales/de/settings.json
  26. 1 1
      webview-ui/src/i18n/locales/de/welcome.json
  27. 3 3
      webview-ui/src/i18n/locales/en/chat.json
  28. 1 1
      webview-ui/src/i18n/locales/en/history.json
  29. 0 6
      webview-ui/src/i18n/locales/en/settings.json
  30. 1 1
      webview-ui/src/i18n/locales/en/welcome.json
  31. 2 2
      webview-ui/src/i18n/locales/es/chat.json
  32. 0 6
      webview-ui/src/i18n/locales/es/settings.json
  33. 2 2
      webview-ui/src/i18n/locales/es/welcome.json
  34. 2 2
      webview-ui/src/i18n/locales/fr/chat.json
  35. 0 6
      webview-ui/src/i18n/locales/fr/settings.json
  36. 2 2
      webview-ui/src/i18n/locales/fr/welcome.json
  37. 2 2
      webview-ui/src/i18n/locales/hi/chat.json
  38. 1 1
      webview-ui/src/i18n/locales/hi/history.json
  39. 0 6
      webview-ui/src/i18n/locales/hi/settings.json
  40. 2 2
      webview-ui/src/i18n/locales/hi/welcome.json
  41. 2 2
      webview-ui/src/i18n/locales/it/chat.json
  42. 1 1
      webview-ui/src/i18n/locales/it/history.json
  43. 0 6
      webview-ui/src/i18n/locales/it/settings.json
  44. 2 2
      webview-ui/src/i18n/locales/it/welcome.json
  45. 2 2
      webview-ui/src/i18n/locales/ja/chat.json
  46. 1 1
      webview-ui/src/i18n/locales/ja/history.json
  47. 0 6
      webview-ui/src/i18n/locales/ja/settings.json
  48. 2 2
      webview-ui/src/i18n/locales/ja/welcome.json
  49. 2 2
      webview-ui/src/i18n/locales/ko/chat.json
  50. 0 6
      webview-ui/src/i18n/locales/ko/settings.json
  51. 2 2
      webview-ui/src/i18n/locales/ko/welcome.json
  52. 2 2
      webview-ui/src/i18n/locales/pl/chat.json
  53. 0 6
      webview-ui/src/i18n/locales/pl/settings.json
  54. 2 2
      webview-ui/src/i18n/locales/pl/welcome.json
  55. 2 2
      webview-ui/src/i18n/locales/pt-BR/chat.json
  56. 0 6
      webview-ui/src/i18n/locales/pt-BR/settings.json
  57. 2 2
      webview-ui/src/i18n/locales/pt-BR/welcome.json
  58. 2 2
      webview-ui/src/i18n/locales/tr/chat.json
  59. 0 6
      webview-ui/src/i18n/locales/tr/settings.json
  60. 2 2
      webview-ui/src/i18n/locales/tr/welcome.json
  61. 2 2
      webview-ui/src/i18n/locales/vi/chat.json
  62. 0 6
      webview-ui/src/i18n/locales/vi/settings.json
  63. 2 2
      webview-ui/src/i18n/locales/vi/welcome.json
  64. 2 2
      webview-ui/src/i18n/locales/zh-CN/chat.json
  65. 0 6
      webview-ui/src/i18n/locales/zh-CN/settings.json
  66. 2 2
      webview-ui/src/i18n/locales/zh-CN/welcome.json
  67. 2 2
      webview-ui/src/i18n/locales/zh-TW/chat.json
  68. 0 6
      webview-ui/src/i18n/locales/zh-TW/settings.json
  69. 3 3
      webview-ui/src/i18n/locales/zh-TW/welcome.json

+ 3 - 0
assets/images/roo-logo.svg

@@ -0,0 +1,3 @@
+<svg width="106" height="69" viewBox="0 0 106 69" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M88.4719 2.87946L86.5306 9.89906C86.4278 10.2707 86.0399 10.4854 85.6704 10.3752L53.106 0.659112C52.8894 0.594492 52.6549 0.640312 52.4786 0.781722L20.2279 26.6445C20.1338 26.72 20.0214 26.7694 19.9021 26.7878L0.713159 29.745C0.357849 29.7998 0.10453 30.1187 0.13164 30.4772L0.21502 31.5798C0.24165 31.932 0.53052 32.2069 0.88359 32.216L23.1724 32.7922L23.4266 32.7993L39.8958 24.0019C40.1264 23.8788 40.4068 23.8968 40.6197 24.0486L52.2875 32.3659C52.4705 32.4963 52.5783 32.7078 52.5762 32.9325L52.4778 43.9686C52.4765 44.1114 52.5197 44.2511 52.6014 44.3683L69.0144 67.9188C69.1431 68.1034 69.354 68.2135 69.5791 68.2135H74.7748C75.2932 68.2135 75.6255 67.6623 75.3836 67.2039L63.6853 45.0427C63.5709 44.8259 63.5804 44.5647 63.7101 44.3568L69.8094 34.5861C69.8758 34.4797 69.97 34.3935 70.0819 34.3367L91.8879 23.2712C92.1095 23.1588 92.3744 23.1745 92.5812 23.3123L98.8125 27.4657C98.9256 27.5411 99.0584 27.5813 99.1943 27.5813H104.856C105.404 27.5813 105.732 26.9716 105.43 26.514L89.7099 2.6839C89.3844 2.19053 88.6294 2.30979 88.4719 2.87946Z" fill="currentColor"/>
+</svg>

+ 1 - 4
src/core/webview/ClineProvider.ts

@@ -655,7 +655,7 @@ export class ClineProvider extends EventEmitter<ClineProviderEvents> implements
 					<link rel="stylesheet" type="text/css" href="${stylesUri}">
 					<link href="${codiconsUri}" rel="stylesheet" />
 					<script nonce="${nonce}">
-						window.IMAGES_BASE_URI = "${imagesUri}"
+						window.IMAGES_BASE_URI = "${imagesUri}"					
 					</script>
 					<title>Roo Code</title>
 				</head>
@@ -1216,7 +1216,6 @@ export class ClineProvider extends EventEmitter<ClineProviderEvents> implements
 			telemetrySetting,
 			showRooIgnoredFiles,
 			language,
-			showGreeting,
 			maxReadFileLine,
 		} = await this.getState()
 
@@ -1297,7 +1296,6 @@ export class ClineProvider extends EventEmitter<ClineProviderEvents> implements
 			renderContext: this.renderContext,
 			maxReadFileLine: maxReadFileLine ?? 500,
 			settingsImportedAt: this.settingsImportedAt,
-			showGreeting: showGreeting ?? true, // Ensure showGreeting is included in the returned state
 		}
 	}
 
@@ -1385,7 +1383,6 @@ export class ClineProvider extends EventEmitter<ClineProviderEvents> implements
 			telemetrySetting: stateValues.telemetrySetting || "unset",
 			showRooIgnoredFiles: stateValues.showRooIgnoredFiles ?? true,
 			maxReadFileLine: stateValues.maxReadFileLine ?? 500,
-			showGreeting: stateValues.showGreeting ?? true, // Ensure showGreeting is returned by getState
 		}
 	}
 

+ 0 - 5
src/core/webview/webviewMessageHandler.ts

@@ -645,11 +645,6 @@ export const webviewMessageHandler = async (provider: ClineProvider, message: We
 			await updateGlobalState("diffEnabled", diffEnabled)
 			await provider.postStateToWebview()
 			break
-		case "showGreeting":
-			const showGreeting = message.bool ?? true
-			await updateGlobalState("showGreeting", showGreeting)
-			await provider.postStateToWebview()
-			break
 		case "enableCheckpoints":
 			const enableCheckpoints = message.bool ?? true
 			await updateGlobalState("enableCheckpoints", enableCheckpoints)

+ 0 - 1
src/exports/roo-code.d.ts

@@ -262,7 +262,6 @@ type GlobalSettings = {
 	remoteBrowserHost?: string | undefined
 	cachedChromeHostUrl?: string | undefined
 	enableCheckpoints?: boolean | undefined
-	showGreeting?: boolean | undefined
 	ttsEnabled?: boolean | undefined
 	ttsSpeed?: number | undefined
 	soundEnabled?: boolean | undefined

+ 0 - 1
src/exports/types.ts

@@ -265,7 +265,6 @@ type GlobalSettings = {
 	remoteBrowserHost?: string | undefined
 	cachedChromeHostUrl?: string | undefined
 	enableCheckpoints?: boolean | undefined
-	showGreeting?: boolean | undefined
 	ttsEnabled?: boolean | undefined
 	ttsSpeed?: number | undefined
 	soundEnabled?: boolean | undefined

+ 0 - 4
src/schemas/index.ts

@@ -529,8 +529,6 @@ export const globalSettingsSchema = z.object({
 
 	enableCheckpoints: z.boolean().optional(),
 
-	showGreeting: z.boolean().optional(),
-
 	ttsEnabled: z.boolean().optional(),
 	ttsSpeed: z.number().optional(),
 	soundEnabled: z.boolean().optional(),
@@ -606,8 +604,6 @@ const globalSettingsRecord: GlobalSettingsRecord = {
 
 	enableCheckpoints: undefined,
 
-	showGreeting: undefined,
-
 	ttsEnabled: undefined,
 	ttsSpeed: undefined,
 	soundEnabled: undefined,

+ 0 - 1
src/shared/ExtensionMessage.ts

@@ -142,7 +142,6 @@ export type ExtensionState = Pick<
 	| "remoteBrowserEnabled"
 	| "remoteBrowserHost"
 	// | "enableCheckpoints" // Optional in GlobalSettings, required here.
-	| "showGreeting"
 	| "ttsEnabled"
 	| "ttsSpeed"
 	| "soundEnabled"

+ 0 - 1
src/shared/WebviewMessage.ts

@@ -125,7 +125,6 @@ export interface WebviewMessage {
 		| "maxReadFileLine"
 		| "searchFiles"
 		| "toggleApiConfigPin"
-		| "showGreeting"
 	text?: string
 	disabled?: boolean
 	askResponse?: ClineAskResponse

+ 9 - 5
webview-ui/src/__tests__/ContextWindowProgress.test.tsx

@@ -1,4 +1,5 @@
-import React from "react"
+// npx jest src/__tests__/ContextWindowProgress.test.tsx
+
 import { render, screen } from "@testing-library/react"
 import "@testing-library/jest-dom"
 import TaskHeader from "../components/chat/TaskHeader"
@@ -68,7 +69,9 @@ describe("ContextWindowProgress", () => {
 		})
 
 		// Check for basic elements
-		expect(screen.getByTestId("context-window-label")).toBeInTheDocument()
+		// The context-window-label is not part of the ContextWindowProgress component
+		// but rather part of the parent TaskHeader component in expanded state
+		expect(screen.getByTestId("context-tokens-count")).toBeInTheDocument()
 		expect(screen.getByTestId("context-tokens-count")).toHaveTextContent("1000") // contextTokens
 		// The actual context window might be different than what we pass in
 		// due to the mock returning a default value from the API config
@@ -83,7 +86,8 @@ describe("ContextWindowProgress", () => {
 
 		// In the current implementation, the component is still displayed with zero values
 		// rather than being hidden completely
-		expect(screen.getByTestId("context-window-label")).toBeInTheDocument()
+		// The context-window-label is not part of the ContextWindowProgress component
+		expect(screen.getByTestId("context-tokens-count")).toBeInTheDocument()
 		expect(screen.getByTestId("context-tokens-count")).toHaveTextContent("0")
 	})
 
@@ -117,8 +121,8 @@ describe("ContextWindowProgress", () => {
 
 		// We can't reliably test computed styles in JSDOM, so we'll just check
 		// that the component appears to be working correctly by checking for expected elements
-		expect(screen.getByTestId("context-window-label")).toBeInTheDocument()
+		// The context-window-label is not part of the ContextWindowProgress component
+		expect(screen.getByTestId("context-tokens-count")).toBeInTheDocument()
 		expect(screen.getByTestId("context-tokens-count")).toHaveTextContent("1000")
-		expect(screen.getByText("1000")).toBeInTheDocument()
 	})
 })

+ 2 - 3
webview-ui/src/components/chat/ChatRow.tsx

@@ -854,11 +854,10 @@ export const ChatRowContent = ({
 				case "user_feedback":
 					return (
 						<div
+							className="outline rounded p-4"
 							style={{
-								backgroundColor: "var(--vscode-badge-background)",
 								color: "var(--vscode-badge-foreground)",
-								borderRadius: "3px",
-								padding: "9px",
+								padding: "4px",
 								overflow: "hidden",
 								whiteSpace: "pre-wrap",
 								wordBreak: "break-word",

+ 3 - 7
webview-ui/src/components/chat/ChatView.tsx

@@ -19,6 +19,7 @@ import { getApiMetrics } from "../../../../src/shared/getApiMetrics"
 import { useExtensionState } from "../../context/ExtensionStateContext"
 import { vscode } from "../../utils/vscode"
 import HistoryPreview from "../history/HistoryPreview"
+import RooHero from "../welcome/RooHero"
 import { normalizeApiConfiguration } from "../settings/ApiOptions"
 import Announcement from "./Announcement"
 import BrowserSessionRow from "./BrowserSessionRow"
@@ -76,7 +77,6 @@ const ChatViewComponent: React.ForwardRefRenderFunction<ChatViewRef, ChatViewPro
 		alwaysAllowSubtasks,
 		customModes,
 		telemetrySetting,
-		showGreeting,
 	} = useExtensionState()
 
 	//const task = messages.length > 0 ? (messages[0].say === "task" ? messages[0] : undefined) : undefined) : undefined
@@ -1224,12 +1224,8 @@ const ChatViewComponent: React.ForwardRefRenderFunction<ChatViewRef, ChatViewPro
 					}}>
 					{telemetrySetting === "unset" && <TelemetryBanner />}
 					{showAnnouncement && <Announcement version={version} hideAnnouncement={hideAnnouncement} />}
-					{showGreeting === true && (
-						<div style={{ padding: "0 20px", flexShrink: 0 }}>
-							<h2>{t("chat:greeting")}</h2>
-							<p>{t("chat:aboutMe")}</p>
-						</div>
-					)}
+
+					<RooHero />
 					{taskHistory.length > 0 && <HistoryPreview showHistoryView={showHistoryView} />}
 				</div>
 			)}

+ 66 - 277
webview-ui/src/components/chat/TaskHeader.tsx

@@ -1,4 +1,4 @@
-import React, { memo, useEffect, useMemo, useRef, useState } from "react"
+import React, { memo, useMemo, useRef, useState } from "react"
 import { useWindowSize } from "react-use"
 import { VSCodeButton } from "@vscode/webview-ui-toolkit/react"
 import prettyBytes from "pretty-bytes"
@@ -44,267 +44,87 @@ const TaskHeader: React.FC<TaskHeaderProps> = ({
 	const { t } = useTranslation()
 	const { apiConfiguration, currentTaskItem } = useExtensionState()
 	const { selectedModelInfo } = useMemo(() => normalizeApiConfiguration(apiConfiguration), [apiConfiguration])
-	const [isTaskExpanded, setIsTaskExpanded] = useState(true)
-	const [isTextExpanded, setIsTextExpanded] = useState(false)
-	const [showSeeMore, setShowSeeMore] = useState(false)
+	const [isTaskExpanded, setIsTaskExpanded] = useState(false)
+
 	const textContainerRef = useRef<HTMLDivElement>(null)
 	const textRef = useRef<HTMLDivElement>(null)
 	const contextWindow = selectedModelInfo?.contextWindow || 1
 
-	/*
-	When dealing with event listeners in React components that depend on state
-	variables, we face a challenge. We want our listener to always use the most
-	up-to-date version of a callback function that relies on current state, but
-	we don't want to constantly add and remove event listeners as that function
-	updates. This scenario often arises with resize listeners or other window
-	events. Simply adding the listener in a useEffect with an empty dependency
-	array risks using stale state, while including the callback in the
-	dependencies can lead to unnecessary re-registrations of the listener. There
-	are react hook libraries that provide a elegant solution to this problem by
-	utilizing the useRef hook to maintain a reference to the latest callback
-	function without triggering re-renders or effect re-runs. This approach
-	ensures that our event listener always has access to the most current state
-	while minimizing performance overhead and potential memory leaks from
-	multiple listener registrations. 
-
-	Sources
-	- https://usehooks-ts.com/react-hook/use-event-listener
-	- https://streamich.github.io/react-use/?path=/story/sensors-useevent--docs
-	- https://github.com/streamich/react-use/blob/master/src/useEvent.ts
-	- https://stackoverflow.com/questions/55565444/how-to-register-event-with-useeffect-hooks
-
-	Before:
-	
-	const updateMaxHeight = useCallback(() => {
-		if (isExpanded && textContainerRef.current) {
-			const maxHeight = window.innerHeight * (3 / 5)
-			textContainerRef.current.style.maxHeight = `${maxHeight}px`
-		}
-	}, [isExpanded])
-
-	useEffect(() => {
-		updateMaxHeight()
-	}, [isExpanded, updateMaxHeight])
-
-	useEffect(() => {
-		window.removeEventListener("resize", updateMaxHeight)
-		window.addEventListener("resize", updateMaxHeight)
-		return () => {
-			window.removeEventListener("resize", updateMaxHeight)
-		}
-	}, [updateMaxHeight])
-
-	After:
-	*/
-
-	const { height: windowHeight, width: windowWidth } = useWindowSize()
-
-	useEffect(() => {
-		if (isTextExpanded && textContainerRef.current) {
-			const maxHeight = windowHeight * (1 / 2)
-			textContainerRef.current.style.maxHeight = `${maxHeight}px`
-		}
-	}, [isTextExpanded, windowHeight])
-
-	useEffect(() => {
-		if (textRef.current && textContainerRef.current) {
-			let textContainerHeight = textContainerRef.current.clientHeight
-			if (!textContainerHeight) {
-				textContainerHeight = textContainerRef.current.getBoundingClientRect().height
-			}
-			const isOverflowing = textRef.current.scrollHeight > textContainerHeight
-			// necessary to show see more button again if user resizes window to expand and then back to collapse
-			if (!isOverflowing) {
-				setIsTextExpanded(false)
-			}
-			setShowSeeMore(isOverflowing)
-		}
-	}, [task.text, windowWidth])
-
-	const isCostAvailable = useMemo(() => {
-		return totalCost !== null && totalCost !== undefined && totalCost > 0 && !isNaN(totalCost)
-	}, [totalCost])
+	const { width: windowWidth } = useWindowSize()
 
 	const shouldShowPromptCacheInfo = doesModelSupportPromptCache && apiConfiguration?.apiProvider !== "openrouter"
 
 	return (
-		<div style={{ padding: "10px 13px 10px 13px" }}>
+		<div className="py-[10px] px-[13px]">
 			<div
-				style={{
-					backgroundColor: "var(--vscode-badge-background)",
-					color: "var(--vscode-badge-foreground)",
-					borderRadius: "3px",
-					padding: "9px 10px 9px 14px",
-					display: "flex",
-					flexDirection: "column",
-					gap: 6,
-					position: "relative",
-					zIndex: 1,
-				}}>
-				<div
-					style={{
-						display: "flex",
-						justifyContent: "space-between",
-						alignItems: "center",
-					}}>
+				className={`rounded p-[10px] flex flex-col gap-[6px] relative z-1 outline hover:outline-vscode-badge-foreground hover:text-vscode-badge-foreground transition-color duration-500 ${!!isTaskExpanded ? "outline-vscode-badge-foreground text-vscode-badge-foreground" : "outline-vscode-badge-foreground/80 text-vscode-badge-foreground/80"}`}>
+				<div className="flex justify-between items-center">
 					<div
-						style={{
-							display: "flex",
-							alignItems: "center",
-							cursor: "pointer",
-							marginLeft: -2,
-							userSelect: "none",
-							WebkitUserSelect: "none",
-							MozUserSelect: "none",
-							msUserSelect: "none",
-							flexGrow: 1,
-							minWidth: 0, // This allows the div to shrink below its content size
-						}}
+						className="flex items-center cursor-pointer -ml-0.5 select-none grow min-w-0"
 						onClick={() => setIsTaskExpanded(!isTaskExpanded)}>
-						<div style={{ display: "flex", alignItems: "center", flexShrink: 0 }}>
+						<div className="flex items-center shrink-0">
 							<span className={`codicon codicon-chevron-${isTaskExpanded ? "down" : "right"}`}></span>
 						</div>
-						<div
-							style={{
-								marginLeft: 6,
-								whiteSpace: "nowrap",
-								overflow: "hidden",
-								textOverflow: "ellipsis",
-								flexGrow: 1,
-								minWidth: 0, // This allows the div to shrink below its content size
-							}}>
-							<span style={{ fontWeight: "bold" }}>
+						<div className="ml-1.5 whitespace-nowrap overflow-hidden text-ellipsis grow min-w-0">
+							<span className="font-bold">
 								{t("chat:task.title")}
 								{!isTaskExpanded && ":"}
 							</span>
-							{!isTaskExpanded && (
-								<span style={{ marginLeft: 4 }}>{highlightMentions(task.text, false)}</span>
-							)}
+							{!isTaskExpanded && <span className="ml-1">{highlightMentions(task.text, false)}</span>}
 						</div>
 					</div>
-					{!isTaskExpanded && isCostAvailable && (
-						<div
-							style={{
-								marginLeft: 10,
-								backgroundColor: "color-mix(in srgb, var(--vscode-badge-foreground) 70%, transparent)",
-								color: "var(--vscode-badge-background)",
-								padding: "2px 4px",
-								borderRadius: "500px",
-								fontSize: "11px",
-								fontWeight: 500,
-								display: "inline-block",
-								flexShrink: 0,
-							}}>
-							${totalCost?.toFixed(4)}
-						</div>
-					)}
+
 					<VSCodeButton
 						appearance="icon"
 						onClick={onClose}
-						style={{ marginLeft: 6, flexShrink: 0, color: "var(--vscode-badge-foreground)" }}
+						className="ml-1.5 shrink-0 text-vscode-badge-foreground"
 						title={t("chat:task.closeAndStart")}>
 						<span className="codicon codicon-close"></span>
 					</VSCodeButton>
 				</div>
+				{/* Collapsed state: Track context and cost if we have any */}
+				{!isTaskExpanded && contextWindow > 0 && (
+					<div className={`w-full flex flex-row gap-1 h-auto`}>
+						<ContextWindowProgress
+							contextWindow={contextWindow}
+							contextTokens={contextTokens || 0}
+							maxTokens={getMaxTokensForModel(selectedModelInfo, apiConfiguration)}
+						/>
+						{!!totalCost && (
+							<div className="ml-2.5 bg-vscode-editor-foreground text-vscode-editor-background py-0.5 px-1 rounded-full text-[11px] font-medium inline-block shrink-0">
+								${totalCost?.toFixed(2)}
+							</div>
+						)}
+					</div>
+				)}
+				{/* Expanded state: Show task text and images */}
 				{isTaskExpanded && (
 					<>
 						<div
 							ref={textContainerRef}
-							style={{
-								marginTop: -2,
-								fontSize: "var(--vscode-font-size)",
-								overflowY: isTextExpanded ? "auto" : "hidden",
-								wordBreak: "break-word",
-								overflowWrap: "anywhere",
-								position: "relative",
-							}}>
+							className="-mt-0.5 text-vscode-font-size overflow-y-auto break-words break-anywhere relative">
 							<div
 								ref={textRef}
+								className="overflow-auto max-h-80 whitespace-pre-wrap break-words break-anywhere"
 								style={{
 									display: "-webkit-box",
-									WebkitLineClamp: isTextExpanded ? "unset" : 3,
+									WebkitLineClamp: "unset",
 									WebkitBoxOrient: "vertical",
-									overflow: "hidden",
-									whiteSpace: "pre-wrap",
-									wordBreak: "break-word",
-									overflowWrap: "anywhere",
 								}}>
 								{highlightMentions(task.text, false)}
 							</div>
-							{!isTextExpanded && showSeeMore && (
-								<div
-									style={{
-										position: "absolute",
-										right: 0,
-										bottom: 0,
-										display: "flex",
-										alignItems: "center",
-									}}>
-									<div
-										style={{
-											width: 30,
-											height: "1.2em",
-											background:
-												"linear-gradient(to right, transparent, var(--vscode-badge-background))",
-										}}
-									/>
-									<div
-										style={{
-											cursor: "pointer",
-											color: "var(--vscode-badge-foreground)",
-											fontSize: "11px",
-											paddingRight: 8,
-											paddingLeft: 4,
-											backgroundColor: "var(--vscode-badge-background)",
-										}}
-										onClick={() => setIsTextExpanded(!isTextExpanded)}>
-										{t("chat:task.seeMore")}
-									</div>
-								</div>
-							)}
 						</div>
-						{isTextExpanded && showSeeMore && (
-							<div
-								style={{
-									cursor: "pointer",
-									color: "var(--vscode-badge-foreground)",
-									fontSize: "11px",
-									marginLeft: "auto",
-									textAlign: "right",
-									paddingRight: 8,
-								}}
-								onClick={() => setIsTextExpanded(!isTextExpanded)}>
-								{t("chat:task.seeLess")}
-							</div>
-						)}
-
 						{task.images && task.images.length > 0 && <Thumbnails images={task.images} />}
 
-						<div style={{ display: "flex", flexDirection: "column", gap: "4px" }}>
-							<div className="flex justify-between items-center h-[20px]">
-								<div style={{ display: "flex", alignItems: "center", gap: "4px", flexWrap: "wrap" }}>
-									<span style={{ fontWeight: "bold" }}>{t("chat:task.tokens")}</span>
-									<span style={{ display: "flex", alignItems: "center", gap: "3px" }}>
-										<i
-											className="codicon codicon-arrow-up"
-											style={{ fontSize: "12px", fontWeight: "bold", marginBottom: "-2px" }}
-										/>
-										{formatLargeNumber(tokensIn || 0)}
-									</span>
-									<span style={{ display: "flex", alignItems: "center", gap: "3px" }}>
-										<i
-											className="codicon codicon-arrow-down"
-											style={{ fontSize: "12px", fontWeight: "bold", marginBottom: "-2px" }}
-										/>
-										{formatLargeNumber(tokensOut || 0)}
-									</span>
-								</div>
-								{!isCostAvailable && <TaskActions item={currentTaskItem} />}
-							</div>
-
+						<div className="flex flex-col gap-1">
 							{isTaskExpanded && contextWindow > 0 && (
 								<div
 									className={`w-full flex ${windowWidth < 400 ? "flex-col" : "flex-row"} gap-1 h-auto`}>
+									<div className="flex items-center gap-1 flex-shrink-0">
+										<span className="font-bold" data-testid="context-window-label">
+											{t("chat:task.contextWindow")}
+										</span>
+									</div>
 									<ContextWindowProgress
 										contextWindow={contextWindow}
 										contextTokens={contextTokens || 0}
@@ -312,32 +132,40 @@ const TaskHeader: React.FC<TaskHeaderProps> = ({
 									/>
 								</div>
 							)}
+							<div className="flex justify-between items-center h-[20px]">
+								<div className="flex items-center gap-1 flex-wrap">
+									<span className="font-bold">{t("chat:task.tokens")}</span>
+									<span className="flex items-center gap-[3px]">
+										<i className="codicon codicon-arrow-up text-xs font-bold -mb-0.5" />
+										{formatLargeNumber(tokensIn || 0)}
+									</span>
+									<span className="flex items-center gap-[3px]">
+										<i className="codicon codicon-arrow-down text-xs font-bold -mb-0.5" />
+										{formatLargeNumber(tokensOut || 0)}
+									</span>
+								</div>
+								{!totalCost && <TaskActions item={currentTaskItem} />}
+							</div>
 
 							{shouldShowPromptCacheInfo && (cacheReads !== undefined || cacheWrites !== undefined) && (
 								<div className="flex items-center gap-1 flex-wrap h-[20px]">
-									<span style={{ fontWeight: "bold" }}>{t("chat:task.cache")}</span>
+									<span className="font-bold">{t("chat:task.cache")}</span>
 									<span className="flex items-center gap-1">
-										<i
-											className="codicon codicon-database"
-											style={{ fontSize: "12px", fontWeight: "bold" }}
-										/>
-										+{formatLargeNumber(cacheWrites || 0)}
+										<i className="codicon codicon-database text-xs font-bold" />+
+										{formatLargeNumber(cacheWrites || 0)}
 									</span>
 									<span className="flex items-center gap-1">
-										<i
-											className="codicon codicon-arrow-right"
-											style={{ fontSize: "12px", fontWeight: "bold" }}
-										/>
+										<i className="codicon codicon-arrow-right text-xs font-bold" />
 										{formatLargeNumber(cacheReads || 0)}
 									</span>
 								</div>
 							)}
 
-							{isCostAvailable && (
+							{!!totalCost && (
 								<div className="flex justify-between items-center h-[20px]">
 									<div className="flex items-center gap-1">
 										<span className="font-bold">{t("chat:task.apiCost")}</span>
-										<span>${totalCost?.toFixed(4)}</span>
+										<span>${totalCost?.toFixed(2)}</span>
 									</div>
 									<TaskActions item={currentTaskItem} />
 								</div>
@@ -362,8 +190,7 @@ export const highlightMentions = (text?: string, withShadow = true) => {
 			return (
 				<span
 					key={index}
-					className={withShadow ? "mention-context-highlight-with-shadow" : "mention-context-highlight"}
-					style={{ cursor: "pointer" }}
+					className={`${withShadow ? "mention-context-highlight-with-shadow" : "mention-context-highlight"} cursor-pointer`}
 					onClick={() => vscode.postMessage({ type: "openMention", text: part })}>
 					@{part}
 				</span>
@@ -439,22 +266,12 @@ const ContextWindowProgress = ({ contextWindow, contextTokens, maxTokens }: Cont
 
 	return (
 		<>
-			<div className="flex items-center gap-1 flex-shrink-0">
-				<span className="font-bold" data-testid="context-window-label">
-					{t("chat:task.contextWindow")}
-				</span>
-			</div>
 			<div className="flex items-center gap-2 flex-1 whitespace-nowrap px-2">
 				<div data-testid="context-tokens-count">{formatLargeNumber(safeContextTokens)}</div>
 				<div className="flex-1 relative">
 					{/* Invisible overlay for hover area */}
 					<div
-						className="absolute w-full cursor-pointer"
-						style={{
-							height: "16px",
-							top: "-7px",
-							zIndex: 5,
-						}}
+						className="absolute w-full cursor-pointer h-4 -top-[7px] z-5"
 						title={t("chat:tokenProgress.availableSpace", { amount: formatLargeNumber(availableSize) })}
 						data-testid="context-available-space"
 					/>
@@ -465,13 +282,7 @@ const ContextWindowProgress = ({ contextWindow, contextTokens, maxTokens }: Cont
 						<div className="relative h-full" style={{ width: `${currentPercent}%` }}>
 							{/* Invisible overlay for current tokens section */}
 							<div
-								className="absolute cursor-pointer"
-								style={{
-									height: "16px",
-									top: "-7px",
-									width: "100%",
-									zIndex: 6,
-								}}
+								className="absolute cursor-pointer h-4 -top-[7px] w-full z-6"
 								title={t("chat:tokenProgress.tokensUsed", {
 									used: formatLargeNumber(safeContextTokens),
 									total: formatLargeNumber(safeContextWindow),
@@ -479,37 +290,21 @@ const ContextWindowProgress = ({ contextWindow, contextTokens, maxTokens }: Cont
 								data-testid="context-tokens-used"
 							/>
 							{/* Current tokens used - darkest */}
-							<div
-								className="h-full w-full bg-[var(--vscode-badge-foreground)]"
-								style={{
-									transition: "width 0.3s ease-out",
-								}}
-							/>
+							<div className="h-full w-full bg-[var(--vscode-badge-foreground)] transition-width duration-300 ease-out" />
 						</div>
 
 						{/* Container for reserved tokens */}
 						<div className="relative h-full" style={{ width: `${reservedPercent}%` }}>
 							{/* Invisible overlay for reserved section */}
 							<div
-								className="absolute cursor-pointer"
-								style={{
-									height: "16px",
-									top: "-7px",
-									width: "100%",
-									zIndex: 6,
-								}}
+								className="absolute cursor-pointer h-4 -top-[7px] w-full z-6"
 								title={t("chat:tokenProgress.reservedForResponse", {
 									amount: formatLargeNumber(reservedForOutput),
 								})}
 								data-testid="context-reserved-tokens"
 							/>
 							{/* Reserved for output section - medium gray */}
-							<div
-								className="h-full w-full bg-[color-mix(in_srgb,var(--vscode-badge-foreground)_30%,transparent)]"
-								style={{
-									transition: "width 0.3s ease-out",
-								}}
-							/>
+							<div className="h-full w-full bg-[color-mix(in_srgb,var(--vscode-badge-foreground)_30%,transparent)] transition-width duration-300 ease-out" />
 						</div>
 
 						{/* Empty section (if any) */}
@@ -517,13 +312,7 @@ const ContextWindowProgress = ({ contextWindow, contextTokens, maxTokens }: Cont
 							<div className="relative h-full" style={{ width: `${availablePercent}%` }}>
 								{/* Invisible overlay for available space */}
 								<div
-									className="absolute cursor-pointer"
-									style={{
-										height: "16px",
-										top: "-7px",
-										width: "100%",
-										zIndex: 6,
-									}}
+									className="absolute cursor-pointer h-4 -top-[7px] w-full z-6"
 									title={t("chat:tokenProgress.availableSpace", {
 										amount: formatLargeNumber(availableSize),
 									})}

+ 3 - 1
webview-ui/src/components/chat/__tests__/TaskHeader.test.tsx

@@ -1,3 +1,5 @@
+// npx jest src/components/chat/__tests__/TaskHeader.test.tsx
+
 import React from "react"
 import { render, screen } from "@testing-library/react"
 import TaskHeader from "../TaskHeader"
@@ -45,7 +47,7 @@ describe("TaskHeader", () => {
 				}}
 			/>,
 		)
-		expect(screen.getByText("$0.0500")).toBeInTheDocument()
+		expect(screen.getByText("$0.05")).toBeInTheDocument()
 	})
 
 	it("should not display cost when totalCost is 0", () => {

+ 95 - 77
webview-ui/src/components/history/HistoryPreview.tsx

@@ -2,99 +2,117 @@ import { memo } from "react"
 
 import { vscode } from "@/utils/vscode"
 import { formatLargeNumber, formatDate } from "@/utils/format"
-import { Button, Checkbox } from "@/components/ui"
+import { Button } from "@/components/ui"
 
 import { useAppTranslation } from "../../i18n/TranslationContext"
 import { CopyButton } from "./CopyButton"
 import { useTaskSearch } from "./useTaskSearch"
 
+import { Trans } from "react-i18next"
+
 type HistoryPreviewProps = {
 	showHistoryView: () => void
 }
 const HistoryPreview = ({ showHistoryView }: HistoryPreviewProps) => {
-	const { tasks, showAllWorkspaces, setShowAllWorkspaces } = useTaskSearch()
+	const { tasks, showAllWorkspaces } = useTaskSearch()
 	const { t } = useAppTranslation()
 
 	return (
-		<div className="flex flex-col gap-3 shrink-0 mx-5">
-			<div className="flex items-center justify-between text-vscode-descriptionForeground">
-				<div className="flex items-center gap-1">
-					<span className="codicon codicon-comment-discussion scale-90 mr-1" />
-					<span className="font-medium text-xs uppercase">{t("history:recentTasks")}</span>
-				</div>
-				<Button variant="ghost" size="sm" onClick={() => showHistoryView()} className="uppercase">
-					{t("history:viewAll")}
-				</Button>
-			</div>
-			<div className="flex items-center gap-2 mb-2">
-				<Checkbox
-					id="show-all-workspaces"
-					checked={showAllWorkspaces}
-					onCheckedChange={(checked) => setShowAllWorkspaces(checked === true)}
-					variant="description"
-				/>
-				<label htmlFor="show-all-workspaces" className="text-xs text-vscode-foreground cursor-pointer">
-					{t("history:showAllWorkspaces")}
-				</label>
-			</div>
-			{tasks.slice(0, 3).map((item) => (
-				<div
-					key={item.id}
-					className="bg-vscode-toolbar-hoverBackground/50 hover:bg-vscode-toolbar-hoverBackground/75 rounded-xs relative overflow-hidden opacity-90 hover:opacity-100 cursor-pointer"
-					onClick={() => vscode.postMessage({ type: "showTaskWithId", text: item.id })}>
-					<div className="flex flex-col gap-2 p-3 pt-1">
-						<div className="flex justify-between items-center">
-							<span className="text-xs font-medium text-vscode-descriptionForeground uppercase">
-								{formatDate(item.ts)}
-							</span>
-							<CopyButton itemTask={item.task} />
+		<>
+			<div className="flex flex-col gap-3 shrink-0 mx-5">
+				{!!tasks.length && (
+					<div className="flex items-center justify-between text-vscode-descriptionForeground">
+						<div className="flex items-center gap-1">
+							<span className="codicon codicon-comment-discussion scale-90 mr-1" />
+							<span className="font-medium text-xs uppercase">{t("history:recentTasks")}</span>
 						</div>
-						<div
-							className="text-vscode-descriptionForeground overflow-hidden whitespace-pre-wrap"
-							style={{
-								display: "-webkit-box",
-								WebkitLineClamp: 3,
-								WebkitBoxOrient: "vertical",
-								wordBreak: "break-word",
-								overflowWrap: "anywhere",
-							}}>
-							{item.task}
-						</div>
-						<div className="text-xs text-vscode-descriptionForeground">
-							<span>
-								{t("history:tokens", {
-									in: formatLargeNumber(item.tokensIn || 0),
-									out: formatLargeNumber(item.tokensOut || 0),
-								})}
-							</span>
-							{!!item.cacheWrites && (
-								<>
-									{" • "}
-									<span>
-										{t("history:cache", {
-											writes: formatLargeNumber(item.cacheWrites || 0),
-											reads: formatLargeNumber(item.cacheReads || 0),
-										})}
-									</span>
-								</>
-							)}
-							{!!item.totalCost && (
-								<>
-									{" • "}
-									<span>{t("history:apiCost", { cost: item.totalCost?.toFixed(4) })}</span>
-								</>
+						<Button variant="ghost" size="sm" onClick={() => showHistoryView()} className="uppercase">
+							{t("history:viewAll")}
+						</Button>
+					</div>
+				)}
+				{tasks.length === 0 && (
+					<>
+						<p className="outline rounded p-4">
+							<Trans
+								i18nKey="chat:onboarding"
+								components={{
+									DocsLink: (
+										<a
+											href="https://docs.roocode.com/getting-started/your-first-task"
+											target="_blank"
+											rel="noopener noreferrer">
+											the docs
+										</a>
+									),
+								}}
+							/>
+						</p>
+
+						<Button size="sm" onClick={() => showHistoryView()} className="mx-auto">
+							{t("history:viewAll")}
+						</Button>
+					</>
+				)}
+				{tasks.slice(0, 3).map((item) => (
+					<div
+						key={item.id}
+						className="bg-vscode-toolbar-hoverBackground/50 hover:bg-vscode-toolbar-hoverBackground/75 rounded-xs relative overflow-hidden opacity-90 hover:opacity-100 cursor-pointer"
+						onClick={() => vscode.postMessage({ type: "showTaskWithId", text: item.id })}>
+						<div className="flex flex-col gap-2 p-3 pt-1">
+							<div className="flex justify-between items-center">
+								<span className="text-xs font-medium text-vscode-descriptionForeground uppercase">
+									{formatDate(item.ts)}
+								</span>
+								<CopyButton itemTask={item.task} />
+							</div>
+							<div
+								className="text-vscode-descriptionForeground overflow-hidden whitespace-pre-wrap"
+								style={{
+									display: "-webkit-box",
+									WebkitLineClamp: 3,
+									WebkitBoxOrient: "vertical",
+									wordBreak: "break-word",
+									overflowWrap: "anywhere",
+								}}>
+								{item.task}
+							</div>
+							<div className="text-xs text-vscode-descriptionForeground">
+								<span>
+									{t("history:tokens", {
+										in: formatLargeNumber(item.tokensIn || 0),
+										out: formatLargeNumber(item.tokensOut || 0),
+									})}
+								</span>
+								{!!item.cacheWrites && (
+									<>
+										{" • "}
+										<span>
+											{t("history:cache", {
+												writes: formatLargeNumber(item.cacheWrites || 0),
+												reads: formatLargeNumber(item.cacheReads || 0),
+											})}
+										</span>
+									</>
+								)}
+								{!!item.totalCost && (
+									<>
+										{" • "}
+										<span>{t("history:apiCost", { cost: item.totalCost?.toFixed(4) })}</span>
+									</>
+								)}
+							</div>
+							{showAllWorkspaces && item.workspace && (
+								<div className="flex flex-row gap-1 text-vscode-descriptionForeground text-xs mt-1">
+									<span className="codicon codicon-folder scale-80" />
+									<span>{item.workspace}</span>
+								</div>
 							)}
 						</div>
-						{showAllWorkspaces && item.workspace && (
-							<div className="flex flex-row gap-1 text-vscode-descriptionForeground text-xs mt-1">
-								<span className="codicon codicon-folder scale-80" />
-								<span>{item.workspace}</span>
-							</div>
-						)}
 					</div>
-				</div>
-			))}
-		</div>
+				))}
+			</div>
+		</>
 	)
 }
 

+ 0 - 40
webview-ui/src/components/settings/InterfaceSettings.tsx

@@ -1,40 +0,0 @@
-import { HTMLAttributes } from "react"
-import { useAppTranslation } from "@/i18n/TranslationContext"
-import { VSCodeCheckbox } from "@vscode/webview-ui-toolkit/react"
-import { Monitor } from "lucide-react"
-
-import { SetCachedStateField } from "./types"
-import { SectionHeader } from "./SectionHeader"
-import { Section } from "./Section"
-
-type InterfaceSettingsProps = HTMLAttributes<HTMLDivElement> & {
-	showGreeting?: boolean
-	setCachedStateField: SetCachedStateField<"showGreeting">
-}
-
-export const InterfaceSettings = ({ showGreeting, setCachedStateField, ...props }: InterfaceSettingsProps) => {
-	const { t } = useAppTranslation()
-	return (
-		<div {...props}>
-			<SectionHeader>
-				<div className="flex items-center gap-2">
-					<Monitor className="w-4" />
-					<div>{t("settings:sections.interface")}</div>
-				</div>
-			</SectionHeader>
-
-			<Section>
-				<div>
-					<VSCodeCheckbox
-						checked={showGreeting}
-						onChange={(e: any) => setCachedStateField("showGreeting", e.target.checked)}>
-						<span className="font-medium">{t("settings:interface.showgreeting.label")}</span>
-					</VSCodeCheckbox>
-					<div className="text-vscode-descriptionForeground text-sm mt-1">
-						{t("settings:interface.showgreeting.description")}
-					</div>
-				</div>
-			</Section>
-		</div>
-	)
-}

+ 0 - 12
webview-ui/src/components/settings/SettingsView.tsx

@@ -13,7 +13,6 @@ import {
 	Globe,
 	Info,
 	LucideIcon,
-	Monitor,
 } from "lucide-react"
 import { CaretSortIcon } from "@radix-ui/react-icons"
 
@@ -47,7 +46,6 @@ import ApiOptions from "./ApiOptions"
 import { AutoApproveSettings } from "./AutoApproveSettings"
 import { BrowserSettings } from "./BrowserSettings"
 import { CheckpointSettings } from "./CheckpointSettings"
-import { InterfaceSettings } from "./InterfaceSettings"
 import { NotificationSettings } from "./NotificationSettings"
 import { ContextManagementSettings } from "./ContextManagementSettings"
 import { TerminalSettings } from "./TerminalSettings"
@@ -65,7 +63,6 @@ const sectionNames = [
 	"autoApprove",
 	"browser",
 	"checkpoints",
-	"interface",
 	"notifications",
 	"contextManagement",
 	"terminal",
@@ -138,7 +135,6 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone, t
 		showRooIgnoredFiles,
 		remoteBrowserEnabled,
 		maxReadFileLine,
-		showGreeting,
 	} = cachedState
 
 	// Make sure apiConfiguration is initialized and managed by SettingsView.
@@ -261,7 +257,6 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone, t
 			vscode.postMessage({ type: "alwaysAllowSubtasks", bool: alwaysAllowSubtasks })
 			vscode.postMessage({ type: "upsertApiConfiguration", text: currentApiConfigName, apiConfiguration })
 			vscode.postMessage({ type: "telemetrySetting", text: telemetrySetting })
-			vscode.postMessage({ type: "showGreeting", bool: showGreeting })
 			setChangeDetected(false)
 		}
 	}
@@ -290,7 +285,6 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone, t
 	const autoApproveRef = useRef<HTMLDivElement>(null)
 	const browserRef = useRef<HTMLDivElement>(null)
 	const checkpointsRef = useRef<HTMLDivElement>(null)
-	const interfaceRef = useRef<HTMLDivElement>(null)
 	const notificationsRef = useRef<HTMLDivElement>(null)
 	const contextManagementRef = useRef<HTMLDivElement>(null)
 	const terminalRef = useRef<HTMLDivElement>(null)
@@ -304,7 +298,6 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone, t
 			{ id: "autoApprove", icon: CheckCheck, ref: autoApproveRef },
 			{ id: "browser", icon: SquareMousePointer, ref: browserRef },
 			{ id: "checkpoints", icon: GitBranch, ref: checkpointsRef },
-			{ id: "interface", icon: Monitor, ref: interfaceRef },
 			{ id: "notifications", icon: Bell, ref: notificationsRef },
 			{ id: "contextManagement", icon: Database, ref: contextManagementRef },
 			{ id: "terminal", icon: SquareTerminal, ref: terminalRef },
@@ -317,7 +310,6 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone, t
 			autoApproveRef,
 			browserRef,
 			checkpointsRef,
-			interfaceRef,
 			notificationsRef,
 			contextManagementRef,
 			terminalRef,
@@ -468,10 +460,6 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone, t
 					/>
 				</div>
 
-				<div ref={interfaceRef}>
-					<InterfaceSettings showGreeting={showGreeting} setCachedStateField={setCachedStateField} />
-				</div>
-
 				<div ref={notificationsRef}>
 					<NotificationSettings
 						ttsEnabled={ttsEnabled}

+ 32 - 0
webview-ui/src/components/welcome/RooHero.tsx

@@ -0,0 +1,32 @@
+import { useState } from "react"
+import { useAppTranslation } from "../../i18n/TranslationContext"
+
+const WelcomeView = () => {
+	const { t } = useAppTranslation()
+
+	const [imagesBaseUri] = useState(() => {
+		const w = window as any
+		return w.IMAGES_BASE_URI || ""
+	})
+
+	return (
+		<div style={{ padding: "10px 20px", flexShrink: 0 }} className="flex flex-col items-center mt-8 gap-2">
+			<div
+				style={{
+					backgroundColor: "var(--vscode-foreground)",
+					WebkitMaskImage: `url('${imagesBaseUri}/roo-logo.svg')`,
+					WebkitMaskRepeat: "no-repeat",
+					WebkitMaskSize: "contain",
+					maskImage: `url('${imagesBaseUri}/roo-logo.svg')`,
+					maskRepeat: "no-repeat",
+					maskSize: "contain",
+				}}
+				className="mx-auto">
+				<img src={imagesBaseUri + "/roo-logo.svg"} alt="Roo logo" className="h-8 opacity-0" />
+			</div>
+			<h2 className="">{t("chat:greeting")}</h2>
+		</div>
+	)
+}
+
+export default WelcomeView

+ 15 - 11
webview-ui/src/components/welcome/WelcomeView.tsx

@@ -5,8 +5,10 @@ import { validateApiConfiguration } from "../../utils/validate"
 import { vscode } from "../../utils/vscode"
 import ApiOptions from "../settings/ApiOptions"
 import { Tab, TabContent } from "../common/Tab"
+import { Trans } from "react-i18next"
 import { useAppTranslation } from "../../i18n/TranslationContext"
 import { getRequestyAuthUrl, getOpenRouterAuthUrl } from "../../oauth/urls"
+import RooHero from "./RooHero"
 import knuthShuffle from "knuth-shuffle-seeded"
 
 const WelcomeView = () => {
@@ -35,12 +37,14 @@ const WelcomeView = () => {
 	return (
 		<Tab>
 			<TabContent className="flex flex-col gap-5">
-				<h2 className="m-0 p-0">{t("welcome:greeting")}</h2>
-				<div>{t("welcome:introduction")}</div>
-				<div>{t("welcome:chooseProvider")}</div>
+				<RooHero />
+
+				<div className="outline rounded p-4">
+					<Trans i18nKey="welcome:introduction" />
+				</div>
 
 				<div className="mb-4">
-					<h4 className="mt-3 mb-2">{t("welcome:startRouter")}</h4>
+					<h4 className="mt-3 mb-2 text-center">{t("welcome:startRouter")}</h4>
 
 					<div className="flex gap-4">
 						{/* Define the providers */}
@@ -71,10 +75,11 @@ const WelcomeView = () => {
 								<a
 									key={index}
 									href={provider.authUrl}
-									className="flex-1 border border-vscode-panel-border rounded p-4 flex flex-col items-center cursor-pointer transition-all hover:bg-vscode-button-hoverBackground hover:border-vscode-button-border no-underline text-inherit"
+									className="flex-1 border border-vscode-panel-border rounded p-4 flex flex-col items-center cursor-pointer transition-all  no-underline text-inherit"
 									target="_blank"
 									rel="noopener noreferrer">
-									<div className="w-16 h-16 flex items-center justify-center rounded mb-2 overflow-hidden bg-white relative">
+									<div className="font-bold">{provider.name}</div>
+									<div className="w-16 h-16 flex items-center justify-center rounded m-2 overflow-hidden relative">
 										<img
 											src={`${imagesBaseUri}/${provider.slug}.png`}
 											alt={provider.name}
@@ -82,12 +87,11 @@ const WelcomeView = () => {
 										/>
 									</div>
 									<div className="text-center">
-										<div className="font-bold">{provider.name}</div>
-										<div className="text-sm text-vscode-descriptionForeground">
+										<div className="text-xs text-vscode-descriptionForeground">
 											{provider.description}
 										</div>
 										{provider.incentive && (
-											<div className="text-sm font-bold">{provider.incentive}</div>
+											<div className="text-xs font-bold">{provider.incentive}</div>
 										)}
 									</div>
 								</a>
@@ -95,8 +99,8 @@ const WelcomeView = () => {
 						})()}
 					</div>
 
-					<div className="text-center my-4">{t("welcome:or")}</div>
-					<h4 className="mt-3 mb-2">{t("welcome:startCustom")}</h4>
+					<div className="text-center my-4 text-xl uppercase font-bold">{t("welcome:or")}</div>
+					<h4 className="mt-3 mb-2 text-center">{t("welcome:startCustom")}</h4>
 					<ApiOptions
 						fromWelcomeView
 						apiConfiguration={apiConfiguration || {}}

+ 0 - 3
webview-ui/src/context/ExtensionStateContext.tsx

@@ -86,7 +86,6 @@ export interface ExtensionStateContextType extends ExtensionState {
 	pinnedApiConfigs?: Record<string, boolean>
 	setPinnedApiConfigs: (value: Record<string, boolean>) => void
 	togglePinnedApiConfig: (configName: string) => void
-	setShowGreeting: (value: boolean) => void
 }
 
 export const ExtensionStateContext = createContext<ExtensionStateContextType | undefined>(undefined)
@@ -124,7 +123,6 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode
 		clineMessages: [],
 		taskHistory: [],
 		shouldShowAnnouncement: false,
-		showGreeting: true,
 		allowedCommands: [],
 		soundEnabled: false,
 		soundVolume: 0.5,
@@ -317,7 +315,6 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode
 		setAwsUsePromptCache: (value) => setState((prevState) => ({ ...prevState, awsUsePromptCache: value })),
 		setMaxReadFileLine: (value) => setState((prevState) => ({ ...prevState, maxReadFileLine: value })),
 		setPinnedApiConfigs: (value) => setState((prevState) => ({ ...prevState, pinnedApiConfigs: value })),
-		setShowGreeting: (value) => setState((prevState) => ({ ...prevState, showGreeting: value })),
 		togglePinnedApiConfig: (configId) =>
 			setState((prevState) => {
 				const currentPinned = prevState.pinnedApiConfigs || {}

+ 2 - 2
webview-ui/src/i18n/locales/ca/chat.json

@@ -1,5 +1,5 @@
 {
-	"greeting": "Què pot fer Roo per tu?",
+	"greeting": "Benvingut a Roo",
 	"task": {
 		"title": "Tasca",
 		"seeMore": "Veure més",
@@ -65,7 +65,7 @@
 		"tooltip": "Cancel·la l'operació actual"
 	},
 	"scrollToBottom": "Desplaça't al final del xat",
-	"aboutMe": "Gràcies als últims avenços en capacitats de codificació intel·ligent, puc gestionar tasques complexes de desenvolupament de programari pas a pas. Amb eines que em permeten crear i editar fitxers, explorar projectes complexos, utilitzar el navegador i executar ordres de terminal (després que em donis permís), puc ajudar-te de maneres que van més enllà de la finalització de codi o el suport tècnic. Fins i tot puc utilitzar MCP per crear noves eines i ampliar les meves capacitats.",
+	"onboarding": "<strong> La vostra llista de tasques en aquest espai de treball està buida. </strong> Comença escrivint una tasca a continuació. \nNo esteu segur per on començar? \nMés informació sobre què pot fer Roo als documents.",
 	"selectMode": "Selecciona el mode d'interacció",
 	"selectApiConfig": "Selecciona la configuració de l'API",
 	"enhancePrompt": "Millora la sol·licitud amb context addicional",

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

@@ -479,11 +479,5 @@
 	"labels": {
 		"customArn": "ARN personalitzat",
 		"useCustomArn": "Utilitza ARN personalitzat..."
-	},
-	"interface": {
-		"showgreeting": {
-			"label": "Mostrar missatge de benvinguda",
-			"description": "Quan està activat, Roo mostrarà un missatge de benvinguda i introducció."
-		}
 	}
 }

+ 1 - 1
webview-ui/src/i18n/locales/ca/welcome.json

@@ -1,6 +1,6 @@
 {
 	"greeting": "Hola, sóc en Roo!",
-	"introduction": "Puc fer tot tipus de tasques gràcies als últims avenços en capacitats de codificació agent i accés a eines que em permeten crear i editar fitxers, explorar projectes complexos, utilitzar el navegador i executar ordres de terminal (amb el teu permís, és clar). Fins i tot puc utilitzar MCP per crear noves eines i ampliar les meves pròpies capacitats.",
+	"introduction": "<strong>Roo Code és el principal agent de codificació autònom.</strong> Prepara't per arquitectar, codificar, depurar i augmentar la teva productivitat com mai abans. Per continuar, Roo Code necessita una clau API.",
 	"notice": "Per començar, aquesta extensió necessita un proveïdor d'API.",
 	"start": "Som-hi!",
 	"chooseProvider": "Tria un proveïdor d'API per començar:",

+ 2 - 2
webview-ui/src/i18n/locales/de/chat.json

@@ -1,5 +1,5 @@
 {
-	"greeting": "Was kann Roo für dich tun?",
+	"greeting": "Willkommen in Roo",
 	"task": {
 		"title": "Aufgabe",
 		"seeMore": "Mehr anzeigen",
@@ -65,7 +65,7 @@
 		"tooltip": "Aktuelle Operation abbrechen"
 	},
 	"scrollToBottom": "Zum Chat-Ende scrollen",
-	"aboutMe": "Dank neuester Durchbrüche in agentischen Coding-Fähigkeiten kann ich komplexe Softwareentwicklungsaufgaben schrittweise bearbeiten. Mit Werkzeugen, die mir erlauben, Dateien zu erstellen und zu bearbeiten, komplexe Projekte zu erkunden, den Browser zu nutzen und Terminalbefehle auszuführen (nachdem du die Erlaubnis erteilt hast), kann ich dir auf Weisen helfen, die über Code-Vervollständigung oder technischen Support hinausgehen. Ich kann sogar MCP nutzen, um neue Werkzeuge zu erstellen und meine eigenen Fähigkeiten zu erweitern.",
+	"onboarding": "<strong>Deine Aufgabenliste in diesem Arbeitsbereich ist leer.</strong> Beginne mit der Eingabe einer Aufgabe unten. Du bist dir nicht sicher, wie du anfangen sollst? Lies mehr darüber, was Roo für dich tun kann, in <DocsLink>den Dokumenten</DocsLink>.",
 	"selectMode": "Interaktionsmodus auswählen",
 	"selectApiConfig": "API-Konfiguration auswählen",
 	"enhancePrompt": "Prompt mit zusätzlichem Kontext verbessern",

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

@@ -1,5 +1,5 @@
 {
-	"recentTasks": "Kürzliche Aufgaben",
+	"recentTasks": "Jüngste Aufgaben",
 	"viewAll": "Alle anzeigen",
 	"tokens": "Tokens: ↑{{in}} ↓{{out}}",
 	"cache": "Cache: +{{writes}} → {{reads}}",

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

@@ -479,11 +479,5 @@
 	"labels": {
 		"customArn": "Benutzerdefinierte ARN",
 		"useCustomArn": "Benutzerdefinierte ARN verwenden..."
-	},
-	"interface": {
-		"showgreeting": {
-			"label": "Begrüßungsnachricht anzeigen",
-			"description": "Wenn aktiviert, zeigt Roo eine Willkommensnachricht und Einführung an."
-		}
 	}
 }

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

@@ -1,6 +1,6 @@
 {
 	"greeting": "Hallo, ich bin Roo!",
-	"introduction": "Ich kann alle Arten von Aufgaben erledigen, dank der neuesten Durchbrüche in agentenbasierten Codierungsfähigkeiten und dem Zugang zu Tools, die es mir ermöglichen, Dateien zu erstellen und zu bearbeiten, komplexe Projekte zu erkunden, den Browser zu verwenden und Terminalbefehle auszuführen (natürlich mit deiner Erlaubnis). Ich kann sogar MCP verwenden, um neue Tools zu erstellen und meine eigenen Fähigkeiten zu erweitern.",
+	"introduction": "<strong>Roo Code ist der führende autonome Coding-Agent.</strong> Mach dich bereit, zu architektieren, zu coden, zu debuggen und deine Produktivität wie nie zuvor zu steigern. Um fortzufahren, benötigt Roo Code einen API-Schlüssel.",
 	"notice": "Um loszulegen, benötigt diese Erweiterung einen API-Anbieter.",
 	"start": "Los geht's!",
 	"chooseProvider": "Wähle einen API-Anbieter, um zu beginnen:",

+ 3 - 3
webview-ui/src/i18n/locales/en/chat.json

@@ -1,5 +1,5 @@
 {
-	"greeting": "What can Roo do for you?",
+	"greeting": "Welcome to Roo",
 	"task": {
 		"title": "Task",
 		"seeMore": "See more",
@@ -7,7 +7,7 @@
 		"tokens": "Tokens:",
 		"cache": "Cache:",
 		"apiCost": "API Cost:",
-		"contextWindow": "Context Window:",
+		"contextWindow": "Context Length:",
 		"closeAndStart": "Close task and start a new one",
 		"export": "Export task history",
 		"delete": "Delete Task (Shift + Click to skip confirmation)"
@@ -65,7 +65,7 @@
 		"tooltip": "Cancel the current operation"
 	},
 	"scrollToBottom": "Scroll to bottom of chat",
-	"aboutMe": "Thanks to the latest breakthroughs in agentic coding capabilities, I can handle complex software development tasks step-by-step. With tools that let me create & edit files, explore complex projects, use the browser, and execute terminal commands (after you grant permission), I can assist you in ways that go beyond code completion or tech support. I can even use MCP to create new tools and extend my own capabilities.",
+	"onboarding": "<strong>Your task list in this workspace is empty.</strong> Start by typing in a task below. Not sure how to begin? Read more about what Roo can do for you in <DocsLink>the docs</DocsLink>.",
 	"selectMode": "Select mode for interaction",
 	"selectApiConfig": "Select API configuration",
 	"enhancePrompt": "Enhance prompt with additional context",

+ 1 - 1
webview-ui/src/i18n/locales/en/history.json

@@ -1,6 +1,6 @@
 {
 	"recentTasks": "Recent Tasks",
-	"viewAll": "View All",
+	"viewAll": "View All Tasks",
 	"tokens": "Tokens: ↑{{in}} ↓{{out}}",
 	"cache": "Cache: +{{writes}} → {{reads}}",
 	"apiCost": "API Cost: ${{cost}}",

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

@@ -478,11 +478,5 @@
 	"labels": {
 		"customArn": "Custom ARN",
 		"useCustomArn": "Use custom ARN..."
-	},
-	"interface": {
-		"showgreeting": {
-			"label": "Show greeting message",
-			"description": "When enabled, Roo will display a welcome message and introduction."
-		}
 	}
 }

+ 1 - 1
webview-ui/src/i18n/locales/en/welcome.json

@@ -1,6 +1,6 @@
 {
 	"greeting": "Hi, I'm Roo!",
-	"introduction": "I can do all kinds of tasks thanks to the latest breakthroughs in agentic coding capabilities and access to tools that let me create & edit files, explore complex projects, use the browser, and execute terminal commands (with your permission, of course). I can even use MCP to create new tools and extend my own capabilities.",
+	"introduction": "<strong>Roo Code is the premiere autonomous coding agent.</strong> Get ready to architect, code, debug, and boost your productivity like you've never seen before. To continue, Roo Code requires an API key.",
 	"notice": "To get started, this extension needs an API provider.",
 	"start": "Let's go!",
 	"chooseProvider": "Choose an API provider to get started:",

+ 2 - 2
webview-ui/src/i18n/locales/es/chat.json

@@ -7,7 +7,7 @@
 		"tokens": "Tokens:",
 		"cache": "Caché:",
 		"apiCost": "Costo de API:",
-		"contextWindow": "Ventana de contexto:",
+		"contextWindow": "Longitud del contexto:",
 		"closeAndStart": "Cerrar tarea e iniciar una nueva",
 		"export": "Exportar historial de tareas",
 		"delete": "Eliminar tarea (Shift + Clic para omitir confirmación)"
@@ -65,7 +65,7 @@
 		"tooltip": "Cancelar la operación actual"
 	},
 	"scrollToBottom": "Desplazarse al final del chat",
-	"aboutMe": "Gracias a los últimos avances en capacidades de codificación agentiva, puedo manejar tareas complejas de desarrollo de software paso a paso. Con herramientas que me permiten crear y editar archivos, explorar proyectos complejos, usar el navegador y ejecutar comandos de terminal (después de tu aprobación), puedo ayudarte de maneras que van más allá de la finalización de código o el soporte técnico. Incluso puedo usar MCP para crear nuevas herramientas y ampliar mis propias capacidades.",
+	"onboarding": "",
 	"selectMode": "Seleccionar modo de interacción",
 	"selectApiConfig": "Seleccionar configuración de API",
 	"enhancePrompt": "Mejorar el mensaje con contexto adicional",

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

@@ -479,11 +479,5 @@
 	"labels": {
 		"customArn": "ARN personalizado",
 		"useCustomArn": "Usar ARN personalizado..."
-	},
-	"interface": {
-		"showgreeting": {
-			"label": "Mostrar mensaje de bienvenida",
-			"description": "Cuando está habilitado, Roo mostrará un mensaje de bienvenida e introducción."
-		}
 	}
 }

+ 2 - 2
webview-ui/src/i18n/locales/es/welcome.json

@@ -1,6 +1,6 @@
 {
-	"greeting": "¡Hola, soy Roo!",
-	"introduction": "Puedo realizar todo tipo de tareas gracias a los últimos avances en capacidades de codificación agentica y acceso a herramientas que me permiten crear y editar archivos, explorar proyectos complejos, usar el navegador y ejecutar comandos de terminal (con tu permiso, por supuesto). Incluso puedo usar MCP para crear nuevas herramientas y ampliar mis propias capacidades.",
+	"greeting": "Bienvenido a Roo",
+	"introduction": "<strong>Roo Code es el principal agente de codificación autónomo.</strong> Prepárate para arquitectar, codificar, depurar y aumentar tu productividad como nunca antes. Para continuar, Roo Code requiere una clave API.",
 	"notice": "Para comenzar, esta extensión necesita un proveedor de API.",
 	"start": "¡Vamos!",
 	"chooseProvider": "Elige un proveedor de API para comenzar:",

+ 2 - 2
webview-ui/src/i18n/locales/fr/chat.json

@@ -7,7 +7,7 @@
 		"tokens": "Tokens :",
 		"cache": "Cache :",
 		"apiCost": "Coût API :",
-		"contextWindow": "Fenêtre de contexte :",
+		"contextWindow": "Durée du contexte :",
 		"closeAndStart": "Fermer la tâche et en commencer une nouvelle",
 		"export": "Exporter l'historique des tâches",
 		"delete": "Supprimer la tâche (Shift + Clic pour ignorer la confirmation)"
@@ -65,7 +65,7 @@
 		"tooltip": "Annuler l'opération actuelle"
 	},
 	"scrollToBottom": "Défiler jusqu'au bas du chat",
-	"aboutMe": "Grâce aux dernières avancées en matière de capacités de codage agent, je peux gérer des tâches complexes de développement logiciel étape par étape. Avec des outils qui me permettent de créer et d'éditer des fichiers, d'explorer des projets complexes, d'utiliser le navigateur et d'exécuter des commandes de terminal (après votre autorisation), je peux vous aider de manières qui vont au-delà de la complétion de code ou du support technique. Je peux même utiliser MCP pour créer de nouveaux outils et étendre mes propres capacités.",
+	"onboarding": "Grâce aux dernières avancées en matière de capacités de codage agent, je peux gérer des tâches complexes de développement logiciel étape par étape. Avec des outils qui me permettent de créer et d'éditer des fichiers, d'explorer des projets complexes, d'utiliser le navigateur et d'exécuter des commandes de terminal (après votre autorisation), je peux vous aider de manières qui vont au-delà de la complétion de code ou du support technique. Je peux même utiliser MCP pour créer de nouveaux outils et étendre mes propres capacités.",
 	"selectMode": "Sélectionner le mode d'interaction",
 	"selectApiConfig": "Sélectionner la configuration API",
 	"enhancePrompt": "Améliorer la requête avec un contexte supplémentaire",

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

@@ -479,11 +479,5 @@
 	"labels": {
 		"customArn": "ARN personnalisé",
 		"useCustomArn": "Utiliser un ARN personnalisé..."
-	},
-	"interface": {
-		"showgreeting": {
-			"label": "Afficher le message de bienvenue",
-			"description": "Lorsque cette option est activée, Roo affichera un message de bienvenue et une introduction."
-		}
 	}
 }

+ 2 - 2
webview-ui/src/i18n/locales/fr/welcome.json

@@ -1,6 +1,6 @@
 {
-	"greeting": "Salut, je suis Roo !",
-	"introduction": "Je peux effectuer toutes sortes de tâches grâce aux dernières avancées en matière de capacités de codage agentique et à l'accès à des outils qui me permettent de créer et de modifier des fichiers, d'explorer des projets complexes, d'utiliser le navigateur et d'exécuter des commandes terminal (avec ta permission, bien sûr). Je peux même utiliser MCP pour créer de nouveaux outils et étendre mes propres capacités.",
+	"greeting": "Bienvenue à Roo",
+	"introduction": "<strong>Roo Code est l'agent de codage autonome de premier plan.</strong> Prépare-toi à architecturer, coder, déboguer et à augmenter ta productivité comme jamais auparavant. Pour continuer, Roo Code nécessite une clé API.",
 	"notice": "Pour commencer, cette extension a besoin d'un fournisseur d'API.",
 	"start": "C'est parti !",
 	"chooseProvider": "Choisis un fournisseur d'API pour commencer :",

+ 2 - 2
webview-ui/src/i18n/locales/hi/chat.json

@@ -7,7 +7,7 @@
 		"tokens": "Tokens:",
 		"cache": "कैश:",
 		"apiCost": "API लागत:",
-		"contextWindow": "संदर्भ विंडो:",
+		"contextWindow": "संदर्भ लंबाई:",
 		"closeAndStart": "कार्य बंद करें और नया शुरू करें",
 		"export": "कार्य इतिहास निर्यात करें",
 		"delete": "कार्य हटाएं (पुष्टि को छोड़ने के लिए Shift + क्लिक)"
@@ -65,7 +65,7 @@
 		"tooltip": "वर्तमान ऑपरेशन रद्द करें"
 	},
 	"scrollToBottom": "चैट के निचले हिस्से तक स्क्रॉल करें",
-	"aboutMe": "एजेंटिक कोडिंग क्षमताओं में नवीनतम प्रगति के कारण, मैं जटिल सॉफ्टवेयर विकास कार्यों को चरण-दर-चरण संभाल सकता हूं। ऐसे उपकरणों के साथ जो मुझे फ़ाइलें बनाने और संपादित करने, जटिल प्रोजेक्ट का अन्वेषण करने, ब्राउज़र का उपयोग करने और टर्मिनल कमांड (आपकी अनुमति के बाद) निष्पादित करने की अनुमति देते हैं, मैं आपकी मदद कोड पूर्णता या तकनीकी समर्थन से परे तरीकों से कर सकता हूं। मैं अपनी क्षमताओं का विस्तार करने और नए उपकरण बनाने के लिए MCP का भी उपयोग कर सकता हूं।",
+	"onboarding": "एजेंटिक कोडिंग क्षमताओं में नवीनतम प्रगति के कारण, मैं जटिल सॉफ्टवेयर विकास कार्यों को चरण-दर-चरण संभाल सकता हूं। ऐसे उपकरणों के साथ जो मुझे फ़ाइलें बनाने और संपादित करने, जटिल प्रोजेक्ट का अन्वेषण करने, ब्राउज़र का उपयोग करने और टर्मिनल कमांड (आपकी अनुमति के बाद) निष्पादित करने की अनुमति देते हैं, मैं आपकी मदद कोड पूर्णता या तकनीकी समर्थन से परे तरीकों से कर सकता हूं। मैं अपनी क्षमताओं का विस्तार करने और नए उपकरण बनाने के लिए MCP का भी उपयोग कर सकता हूं।",
 	"selectMode": "इंटरैक्शन मोड चुनें",
 	"selectApiConfig": "API कॉन्फ़िगरेशन चुनें",
 	"enhancePrompt": "अतिरिक्त संदर्भ के साथ प्रॉम्प्ट बढ़ाएँ",

+ 1 - 1
webview-ui/src/i18n/locales/hi/history.json

@@ -1,5 +1,5 @@
 {
-	"recentTasks": "हालिया कार्य",
+	"recentTasks": "हाल के कार्य",
 	"viewAll": "सभी देखें",
 	"tokens": "Tokens: ↑{{in}} ↓{{out}}",
 	"cache": "कैश: +{{writes}} → {{reads}}",

+ 0 - 6
webview-ui/src/i18n/locales/hi/settings.json

@@ -479,11 +479,5 @@
 	"labels": {
 		"customArn": "कस्टम ARN",
 		"useCustomArn": "कस्टम ARN का उपयोग करें..."
-	},
-	"interface": {
-		"showgreeting": {
-			"label": "स्वागत संदेश दिखाएँ",
-			"description": "जब सक्षम किया जाता है, तो Roo एक स्वागत संदेश और परिचय प्रदर्शित करेगा।"
-		}
 	}
 }

+ 2 - 2
webview-ui/src/i18n/locales/hi/welcome.json

@@ -1,6 +1,6 @@
 {
-	"greeting": "नमस्ते, मैं रू हूँ!",
-	"introduction": "मैं सभी प्रकार के कार्य कर सकता हूँ, एजेंटिक कोडिंग क्षमताओं में नवीनतम सफलताओं और उन टूल्स तक पहुंच के लिए धन्यवाद जो मुझे फाइलें बनाने और संपादित करने, जटिल परियोजनाओं का पता लगाने, ब्राउज़र का उपयोग करने और टर्मिनल कमांड निष्पादित करने की अनुमति देते हैं (आपकी अनुमति से, बिल्कुल)। मैं MCP का उपयोग करके नए टूल बना सकता हूँ और अपनी क्षमताओं का विस्तार कर सकता हूँ।",
+	"greeting": "ROO में आपका स्वागत है",
+	"introduction": "<strong>Roo Code प्रमुख स्वायत्त कोडिंग एजेंट है।</strong> आर्किटेक्ट, कोड, डीबग करने और अपनी उत्पादकता को पहले कभी न देखे गए तरीके से बढ़ाने के लिए तैयार हो जाइए। जारी रखने के लिए, Roo Code को एक API कुंजी की आवश्यकता है।",
 	"notice": "शुरू करने के लिए, इस एक्सटेंशन को एक API प्रदाता की आवश्यकता है।",
 	"start": "चलो शुरू करें!",
 	"chooseProvider": "शुरू करने के लिए एक API प्रदाता चुनें:",

+ 2 - 2
webview-ui/src/i18n/locales/it/chat.json

@@ -7,7 +7,7 @@
 		"tokens": "Tokens:",
 		"cache": "Cache:",
 		"apiCost": "Costo API:",
-		"contextWindow": "Finestra di contesto:",
+		"contextWindow": "Lunghezza del contesto:",
 		"closeAndStart": "Chiudi attività e iniziane una nuova",
 		"export": "Esporta cronologia attività",
 		"delete": "Elimina attività (Shift + Clic per saltare la conferma)"
@@ -65,7 +65,7 @@
 		"tooltip": "Annulla l'operazione corrente"
 	},
 	"scrollToBottom": "Scorri fino alla fine della chat",
-	"aboutMe": "Grazie alle più recenti innovazioni nelle capacità di codifica agentica, posso gestire complesse attività di sviluppo software passo dopo passo. Con strumenti che mi permettono di creare e modificare file, esplorare progetti complessi, utilizzare il browser ed eseguire comandi da terminale (dopo la tua autorizzazione), posso aiutarti in modi che vanno oltre il completamento del codice o il supporto tecnico. Posso persino usare MCP per creare nuovi strumenti ed estendere le mie capacità.",
+	"onboarding": "Grazie alle più recenti innovazioni nelle capacità di codifica agentica, posso gestire complesse attività di sviluppo software passo dopo passo. Con strumenti che mi permettono di creare e modificare file, esplorare progetti complessi, utilizzare il browser ed eseguire comandi da terminale (dopo la tua autorizzazione), posso aiutarti in modi che vanno oltre il completamento del codice o il supporto tecnico. Posso persino usare MCP per creare nuovi strumenti ed estendere le mie capacità.",
 	"selectMode": "Seleziona modalità di interazione",
 	"selectApiConfig": "Seleziona configurazione API",
 	"enhancePrompt": "Migliora prompt con contesto aggiuntivo",

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

@@ -1,5 +1,5 @@
 {
-	"recentTasks": "Attività recenti",
+	"recentTasks": "Compiti recenti",
 	"viewAll": "Vedi tutto",
 	"tokens": "Tokens: ↑{{in}} ↓{{out}}",
 	"cache": "Cache: +{{writes}} → {{reads}}",

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

@@ -479,11 +479,5 @@
 	"labels": {
 		"customArn": "ARN personalizzato",
 		"useCustomArn": "Usa ARN personalizzato..."
-	},
-	"interface": {
-		"showgreeting": {
-			"label": "Mostra messaggio di benvenuto",
-			"description": "Quando abilitato, Roo mostrerà un messaggio di benvenuto e un'introduzione."
-		}
 	}
 }

+ 2 - 2
webview-ui/src/i18n/locales/it/welcome.json

@@ -1,6 +1,6 @@
 {
-	"greeting": "Ciao, sono Roo!",
-	"introduction": "Posso svolgere tutti i tipi di attività grazie ai più recenti progressi nelle capacità di codifica agentica e all'accesso a strumenti che mi permettono di creare e modificare file, esplorare progetti complessi, utilizzare il browser ed eseguire comandi terminal (con il tuo permesso, ovviamente). Posso persino utilizzare MCP per creare nuovi strumenti ed estendere le mie capacità.",
+	"greeting": "Benvenuto su Roo",
+	"introduction": "<strong>Roo Code è il principale agente di codifica autonomo.</strong> Preparati ad architettare, codificare, debuggare e aumentare la tua produttività come mai prima d'ora. Per continuare, Roo Code richiede una chiave API.",
 	"notice": "Per iniziare, questa estensione necessita di un fornitore di API.",
 	"start": "Andiamo!",
 	"chooseProvider": "Scegli un fornitore di API per iniziare:",

+ 2 - 2
webview-ui/src/i18n/locales/ja/chat.json

@@ -1,5 +1,5 @@
 {
-	"greeting": "Rooにお手伝いできることはありますか?",
+	"greeting": "ROOへようこそ",
 	"task": {
 		"title": "タスク",
 		"seeMore": "もっと見る",
@@ -65,7 +65,7 @@
 		"tooltip": "現在の操作をキャンセル"
 	},
 	"scrollToBottom": "チャットの最下部にスクロール",
-	"aboutMe": "最新のエージェント型コーディング能力の進歩により、複雑なソフトウェア開発タスクをステップバイステップで処理できます。ファイルの作成や編集、複雑なプロジェクトの探索、ブラウザの使用、ターミナルコマンドの実行(許可後)を可能にするツールにより、コード補完や技術サポート以上の方法であなたをサポートできます。MCPを使用して新しいツールを作成し、自分の能力を拡張することもできます。",
+	"onboarding": "最新のエージェント型コーディング能力の進歩により、複雑なソフトウェア開発タスクをステップバイステップで処理できます。ファイルの作成や編集、複雑なプロジェクトの探索、ブラウザの使用、ターミナルコマンドの実行(許可後)を可能にするツールにより、コード補完や技術サポート以上の方法であなたをサポートできます。MCPを使用して新しいツールを作成し、自分の能力を拡張することもできます。",
 	"selectMode": "対話モードを選択",
 	"selectApiConfig": "API設定を選択",
 	"enhancePrompt": "追加コンテキストでプロンプトを強化",

+ 1 - 1
webview-ui/src/i18n/locales/ja/history.json

@@ -1,5 +1,5 @@
 {
-	"recentTasks": "最近のタスク",
+	"recentTasks": "Recent Tasks",
 	"viewAll": "すべて表示",
 	"tokens": "Tokens: ↑{{in}} ↓{{out}}",
 	"cache": "キャッシュ: +{{writes}} → {{reads}}",

+ 0 - 6
webview-ui/src/i18n/locales/ja/settings.json

@@ -479,11 +479,5 @@
 	"labels": {
 		"customArn": "カスタム ARN",
 		"useCustomArn": "カスタム ARN を使用..."
-	},
-	"interface": {
-		"showgreeting": {
-			"label": "ようこそメッセージを表示",
-			"description": "有効にすると、Rooはようこそメッセージと紹介を表示します。"
-		}
 	}
 }

+ 2 - 2
webview-ui/src/i18n/locales/ja/welcome.json

@@ -1,6 +1,6 @@
 {
-	"greeting": "こんにちは、私はルーです!",
-	"introduction": "エージェント型コーディング能力の最新の進歩と、ファイルの作成・編集、複雑なプロジェクトの探索、ブラウザの使用、ターミナルコマンドの実行(もちろんあなたの許可を得て)を可能にするツールへのアクセスにより、あらゆる種類のタスクを実行できます。MCPを使用して新しいツールを作成し、自分の能力を拡張することもできます。",
+	"greeting": "ROOへようこそ",
+	"introduction": "<strong>Roo Codeは最高の自律型コーディングエージェントです。</strong>アーキテクチャの設計、コーディング、デバッグ、そして今までにない生産性向上を体験する準備をしてください。続行するには、Roo CodeにはAPIキーが必要です。",
 	"notice": "開始するには、この拡張機能にはAPIプロバイダーが必要です。",
 	"start": "さあ、始めましょう!",
 	"chooseProvider": "開始するにはAPIプロバイダーを選択してください:",

+ 2 - 2
webview-ui/src/i18n/locales/ko/chat.json

@@ -1,5 +1,5 @@
 {
-	"greeting": "Roo가 어떻게 도와드릴까요?",
+	"greeting": "Roo에 오신 것을 환영합니다",
 	"task": {
 		"title": "작업",
 		"seeMore": "더 보기",
@@ -65,7 +65,7 @@
 		"tooltip": "현재 작업 취소"
 	},
 	"scrollToBottom": "채팅 하단으로 스크롤",
-	"aboutMe": "최신 에이전트 코딩 기능의 발전 덕분에 복잡한 소프트웨어 개발 작업을 단계별로 처리할 수 있습니다. 파일 생성 및 편집, 복잡한 프로젝트 탐색, 브라우저 사용, 터미널 명령 실행(승인 후)을 가능하게 하는 도구를 통해 코드 완성이나 기술 지원을 넘어서는 방식으로 도움을 드릴 수 있습니다. MCP를 사용하여 새로운 도구를 만들고 자체 기능을 확장할 수도 있습니다.",
+	"onboarding": "<strong>이 작업 공간의 작업 목록이 비어 있습니다.</strong> 아래에 작업을 입력하여 시작하세요. 어떻게 시작해야 할지 모르겠나요? Roo가 무엇을 할 수 있는지 <DocsLink>문서</DocsLink>에서 자세히 알아보세요.",
 	"selectMode": "상호작용 모드 선택",
 	"selectApiConfig": "API 구성 선택",
 	"enhancePrompt": "추가 컨텍스트로 프롬프트 향상",

+ 0 - 6
webview-ui/src/i18n/locales/ko/settings.json

@@ -479,11 +479,5 @@
 	"labels": {
 		"customArn": "사용자 지정 ARN",
 		"useCustomArn": "사용자 지정 ARN 사용..."
-	},
-	"interface": {
-		"showgreeting": {
-			"label": "환영 메시지 표시",
-			"description": "활성화하면 Roo가 환영 메시지와 소개를 표시합니다."
-		}
 	}
 }

+ 2 - 2
webview-ui/src/i18n/locales/ko/welcome.json

@@ -1,6 +1,6 @@
 {
-	"greeting": "안녕하세요, 저는 루입니다!",
-	"introduction": "에이전트 코딩 능력의 최신 발전과 파일 생성 및 편집, 복잡한 프로젝트 탐색, 브라우저 사용, 터미널 명령 실행(물론 사용자의 허락 하에)을 가능하게 하는 도구에 대한 접근 덕분에 모든 종류의 작업을 수행할 수 있습니다. MCP를 사용하여 새로운 도구를 만들고 제 능력을 확장할 수도 있습니다.",
+	"greeting": "Roo에 오신 것을 환영합니다",
+	"introduction": "<strong>Roo Code는 최고의 자율적 코딩 에이전트입니다.</strong> 아키텍처 설계, 코딩, 디버깅, 그리고 전례 없는 생산성 향상을 경험할 준비를 하세요. 계속하려면 Roo Code에 API 키가 필요합니다.",
 	"notice": "시작하려면 이 확장 프로그램에 API 공급자가 필요합니다.",
 	"start": "시작해 봅시다!",
 	"chooseProvider": "시작하려면 API 공급자를 선택하세요:",

+ 2 - 2
webview-ui/src/i18n/locales/pl/chat.json

@@ -1,5 +1,5 @@
 {
-	"greeting": "Co Roo może dla Ciebie zrobić?",
+	"greeting": "Witamy w Roo",
 	"task": {
 		"title": "Zadanie",
 		"seeMore": "Zobacz więcej",
@@ -65,7 +65,7 @@
 		"tooltip": "Anuluj bieżącą operację"
 	},
 	"scrollToBottom": "Przewiń do dołu czatu",
-	"aboutMe": "Dzięki najnowszym przełomom w zdolnościach kodowania agentowego, mogę krok po kroku obsługiwać złożone zadania związane z tworzeniem oprogramowania. Dzięki narzędziom, które pozwalają mi tworzyć i edytować pliki, eksplorować złożone projekty, korzystać z przeglądarki i wykonywać polecenia terminala (po udzieleniu zgody), mogę pomagać w sposób wykraczający poza uzupełnianie kodu czy wsparcie techniczne. Mogę nawet używać MCP do tworzenia nowych narzędzi i rozszerzania własnych możliwości.",
+	"onboarding": "<strong>Twoja lista zadań w tym obszarze roboczym jest pusta.</strong> Zacznij od wpisania zadania poniżej. Nie wiesz, jak zacząć? Przeczytaj więcej o tym, co Roo może dla Ciebie zrobić w <DocsLink>dokumentacji</DocsLink>.",
 	"selectMode": "Wybierz tryb interakcji",
 	"selectApiConfig": "Wybierz konfigurację API",
 	"enhancePrompt": "Ulepsz podpowiedź dodatkowym kontekstem",

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

@@ -479,11 +479,5 @@
 	"labels": {
 		"customArn": "Niestandardowy ARN",
 		"useCustomArn": "Użyj niestandardowego ARN..."
-	},
-	"interface": {
-		"showgreeting": {
-			"label": "Pokaż wiadomość powitalną",
-			"description": "Gdy włączone, Roo wyświetli wiadomość powitalną i wprowadzenie."
-		}
 	}
 }

+ 2 - 2
webview-ui/src/i18n/locales/pl/welcome.json

@@ -1,6 +1,6 @@
 {
-	"greeting": "Cześć, jestem Roo!",
-	"introduction": "Mogę wykonywać wszelkiego rodzaju zadania dzięki najnowszym osiągnięciom w zakresie możliwości kodowania agentowego i dostępu do narzędzi, które pozwalają mi tworzyć i edytować pliki, eksplorować złożone projekty, korzystać z przeglądarki i wykonywać polecenia terminalowe (oczywiście za Twoją zgodą). Mogę nawet używać MCP do tworzenia nowych narzędzi i rozszerzania własnych możliwości.",
+	"greeting": "Witamy w Roo",
+	"introduction": "<strong>Roo Code to wiodący autonomiczny agent kodowania.</strong> Przygotuj się na projektowanie architektury, kodowanie, debugowanie i zwiększenie produktywności jak nigdy dotąd. Aby kontynuować, Roo Code wymaga klucza API.",
 	"notice": "Aby rozpocząć, to rozszerzenie potrzebuje dostawcy API.",
 	"start": "Zaczynajmy!",
 	"chooseProvider": "Wybierz dostawcę API, aby rozpocząć:",

+ 2 - 2
webview-ui/src/i18n/locales/pt-BR/chat.json

@@ -1,5 +1,5 @@
 {
-	"greeting": "O que o Roo pode fazer por você?",
+	"greeting": "Bem-vindo a Roo",
 	"task": {
 		"title": "Tarefa",
 		"seeMore": "Ver mais",
@@ -65,7 +65,7 @@
 		"tooltip": "Cancelar a operação atual"
 	},
 	"scrollToBottom": "Rolar para o final do chat",
-	"aboutMe": "Graças aos mais recentes avanços em capacidades de codificação agentiva, posso lidar com tarefas complexas de desenvolvimento de software passo a passo. Com ferramentas que me permitem criar e editar arquivos, explorar projetos complexos, usar o navegador e executar comandos de terminal (após sua permissão), posso ajudar de maneiras que vão além da conclusão de código ou suporte técnico. Posso até usar o MCP para criar novas ferramentas e expandir minhas próprias capacidades.",
+	"onboarding": "<strong>Sua lista de tarefas neste espaço de trabalho está vazia.</strong> Comece digitando uma tarefa abaixo. Não sabe como começar? Leia mais sobre o que o Roo pode fazer por você nos <DocsLink>documentos</DocsLink>.",
 	"selectMode": "Selecionar modo de interação",
 	"selectApiConfig": "Selecionar configuração de API",
 	"enhancePrompt": "Aprimorar prompt com contexto adicional",

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

@@ -479,11 +479,5 @@
 	"labels": {
 		"customArn": "ARN personalizado",
 		"useCustomArn": "Usar ARN personalizado..."
-	},
-	"interface": {
-		"showgreeting": {
-			"label": "Mostrar mensagem de boas-vindas",
-			"description": "Quando ativado, o Roo exibirá uma mensagem de boas-vindas e introdução."
-		}
 	}
 }

+ 2 - 2
webview-ui/src/i18n/locales/pt-BR/welcome.json

@@ -1,6 +1,6 @@
 {
-	"greeting": "Olá, eu sou o Roo!",
-	"introduction": "Posso realizar todos os tipos de tarefas graças aos últimos avanços nas capacidades de codificação agentica e ao acesso a ferramentas que me permitem criar e editar arquivos, explorar projetos complexos, usar o navegador e executar comandos de terminal (com sua permissão, é claro). Posso até usar o MCP para criar novas ferramentas e expandir minhas próprias capacidades.",
+	"greeting": "Bem-vindo a Roo",
+	"introduction": "<strong>Roo Code é o principal agente de codificação autônomo.</strong> Prepare-se para arquitetar, codificar, depurar e aumentar sua produtividade como nunca antes. Para continuar, o Roo Code necessita de uma chave API.",
 	"notice": "Para começar, esta extensão precisa de um provedor de API.",
 	"start": "Vamos lá!",
 	"chooseProvider": "Escolha um provedor de API para começar:",

+ 2 - 2
webview-ui/src/i18n/locales/tr/chat.json

@@ -7,7 +7,7 @@
 		"tokens": "Tokenlar:",
 		"cache": "Önbellek:",
 		"apiCost": "API Maliyeti:",
-		"contextWindow": "Bağlam Penceresi:",
+		"contextWindow": "Bağlam Uzunluğu:",
 		"closeAndStart": "Görevi kapat ve yeni bir görev başlat",
 		"export": "Görev geçmişini dışa aktar",
 		"delete": "Görevi sil (Onayı atlamak için Shift + Tıkla)"
@@ -65,7 +65,7 @@
 		"tooltip": "Mevcut işlemi iptal et"
 	},
 	"scrollToBottom": "Sohbetin altına kaydır",
-	"aboutMe": "Ajansal kodlama yeteneklerindeki son atılımlar sayesinde, karmaşık yazılım geliştirme görevlerini adım adım ele alabilirim. Dosya oluşturma ve düzenleme, karmaşık projeleri keşfetme, tarayıcıyı kullanma ve terminal komutlarını çalıştırma (izin verdikten sonra) olanağı sağlayan araçlarla, kod tamamlama veya teknik desteğin ötesinde size yardımcı olabilirim. Hatta yeni araçlar oluşturmak ve kendi yeteneklerimi genişletmek için MCP'yi bile kullanabilirim.",
+	"onboarding": "<strong>Bu çalışma alanındaki görev listeniz boş.</strong> Aşağıya bir görev yazarak başlayın. Nasıl başlayacağınızdan emin değil misiniz? Roo'nun sizin için neler yapabileceği hakkında daha fazla bilgiyi <DocsLink>belgelerde</DocsLink> okuyun.",
 	"selectMode": "Etkileşim modunu seçin",
 	"selectApiConfig": "API yapılandırmasını seçin",
 	"enhancePrompt": "Ek bağlamla istemi geliştir",

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

@@ -479,11 +479,5 @@
 	"labels": {
 		"customArn": "Özel ARN",
 		"useCustomArn": "Özel ARN kullan..."
-	},
-	"interface": {
-		"showgreeting": {
-			"label": "Karşılama mesajını göster",
-			"description": "Etkinleştirildiğinde, Roo bir karşılama mesajı ve tanıtım gösterecektir."
-		}
 	}
 }

+ 2 - 2
webview-ui/src/i18n/locales/tr/welcome.json

@@ -1,6 +1,6 @@
 {
-	"greeting": "Merhaba, ben Roo!",
-	"introduction": "Ajan tabanlı kodlama yeteneklerindeki son gelişmeler ve dosya oluşturma ve düzenleme, karmaşık projeleri keşfetme, tarayıcı kullanma ve terminal komutları çalıştırma (tabii ki senin izninle) gibi işlemleri yapmamı sağlayan araçlara erişim sayesinde her türlü görevi gerçekleştirebilirim. Hatta MCP'yi kullanarak yeni araçlar oluşturabilir ve kendi yeteneklerimi genişletebilirim.",
+	"greeting": "Roo'ya Hoş Geldiniz",
+	"introduction": "<strong>Roo Code, önde gelen otonom kodlama aracıdır.</strong> Daha önce hiç görmediğin şekilde mimari tasarım yapmaya, kod yazmaya, hata ayıklamaya ve üretkenliğini artırmaya hazırlan. Devam etmek için Roo Code'un bir API anahtarına ihtiyacı var.",
 	"notice": "Başlamak için bu eklentinin bir API sağlayıcısına ihtiyacı var.",
 	"start": "Hadi başlayalım!",
 	"chooseProvider": "Başlamak için bir API sağlayıcısı seç:",

+ 2 - 2
webview-ui/src/i18n/locales/vi/chat.json

@@ -7,7 +7,7 @@
 		"tokens": "Tokens:",
 		"cache": "Bộ nhớ đệm:",
 		"apiCost": "Chi phí API:",
-		"contextWindow": "Cửa sổ ngữ cảnh:",
+		"contextWindow": "Chiều dài bối cảnh:",
 		"closeAndStart": "Đóng nhiệm vụ và bắt đầu nhiệm vụ mới",
 		"export": "Xuất lịch sử nhiệm vụ",
 		"delete": "Xóa nhiệm vụ (Shift + Click để bỏ qua xác nhận)"
@@ -65,7 +65,7 @@
 		"tooltip": "Hủy thao tác hiện tại"
 	},
 	"scrollToBottom": "Cuộn xuống cuối cuộc trò chuyện",
-	"aboutMe": "Nhờ những đột phá mới nhất trong khả năng lập trình tác nhân, tôi có thể xử lý các nhiệm vụ phát triển phần mềm phức tạp từng bước một. Với các công cụ cho phép tôi tạo và chỉnh sửa tệp, khám phá các dự án phức tạp, sử dụng trình duyệt và thực thi lệnh terminal (sau khi bạn cấp quyền), tôi có thể hỗ trợ bạn theo cách vượt xa việc hoàn thành mã hoặc hỗ trợ kỹ thuật. Tôi thậm chí có thể sử dụng MCP để tạo các công cụ mới và mở rộng khả năng của mình.",
+	"onboarding": "<strong>Danh sách nhiệm vụ của bạn trong không gian làm việc này trống.</strong> Bắt đầu bằng cách nhập nhiệm vụ bên dưới. Bạn không chắc chắn nên bắt đầu như thế nào? Đọc thêm về những gì Roo có thể làm cho bạn trong <DocsLink>tài liệu</DocsLink>.",
 	"selectMode": "Chọn chế độ tương tác",
 	"selectApiConfig": "Chọn cấu hình API",
 	"enhancePrompt": "Nâng cao yêu cầu với ngữ cảnh bổ sung",

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

@@ -479,11 +479,5 @@
 	"labels": {
 		"customArn": "ARN tùy chỉnh",
 		"useCustomArn": "Sử dụng ARN tùy chỉnh..."
-	},
-	"interface": {
-		"showgreeting": {
-			"label": "Hiển thị thông báo chào mừng",
-			"description": "Khi được bật, Roo sẽ hiển thị thông báo chào mừng và giới thiệu."
-		}
 	}
 }

+ 2 - 2
webview-ui/src/i18n/locales/vi/welcome.json

@@ -1,6 +1,6 @@
 {
-	"greeting": "Xin chào, tôi là Roo!",
-	"introduction": "Tôi có thể thực hiện nhiều loại nhiệm vụ nhờ vào những đột phá mới nhất trong khả năng lập trình dạng đại lý và quyền truy cập vào các công cụ cho phép tôi tạo & chỉnh sửa tệp, khám phá các dự án phức tạp, sử dụng trình duyệt và thực thi lệnh terminal (với sự cho phép của bạn, tất nhiên). Tôi thậm chí có thể sử dụng MCP để tạo công cụ mới và mở rộng khả năng của mình.",
+	"greeting": "Chào mừng bạn đến với Roo",
+	"introduction": "<strong>Roo Code là công cụ lập trình tự động hàng đầu.</strong> Hãy sẵn sàng để thiết kế kiến trúc, viết mã, gỡ lỗi và tăng năng suất của bạn như chưa từng có trước đây. Để tiếp tục, Roo Code yêu cầu một khóa API.",
 	"notice": "Để bắt đầu, tiện ích mở rộng này cần một nhà cung cấp API.",
 	"start": "Bắt đầu thôi!",
 	"chooseProvider": "Chọn một nhà cung cấp API để bắt đầu:",

+ 2 - 2
webview-ui/src/i18n/locales/zh-CN/chat.json

@@ -7,7 +7,7 @@
 		"tokens": "Token 用量:",
 		"cache": "缓存:",
 		"apiCost": "API 费用:",
-		"contextWindow": "上下文窗口:",
+		"contextWindow": "上下文长度:",
 		"closeAndStart": "关闭任务并开始新任务",
 		"export": "导出任务历史",
 		"delete": "删除任务(Shift + 点击跳过确认)"
@@ -65,7 +65,7 @@
 		"tooltip": "取消当前操作"
 	},
 	"scrollToBottom": "滚动到聊天底部",
-	"aboutMe": "基于最新的AI编程技术,我可以逐步处理复杂软件开发任务。支持创建编辑文件、分析复杂项目、浏览器操作及运行终端命令,不仅能提供代码补全和基础答疑,还能完成更高阶的开发协助。通过MCP系统,我甚至可以自己制作新工具,持续提升解决问题的能力。",
+	"onboarding": "<strong>此工作区中的任务列表为空。</strong> 请在下方输入任务开始。 不确定如何开始? 在 <DocsLink>文档</DocsLink> 中阅读更多关于 Roo 可以为您做什么的信息。",
 	"selectMode": "选择交互模式",
 	"selectApiConfig": "选择API配置",
 	"enhancePrompt": "增强提示词",

+ 0 - 6
webview-ui/src/i18n/locales/zh-CN/settings.json

@@ -479,11 +479,5 @@
 	"labels": {
 		"customArn": "自定义 ARN",
 		"useCustomArn": "使用自定义 ARN..."
-	},
-	"interface": {
-		"showgreeting": {
-			"label": "显示欢迎消息",
-			"description": "启用后,Roo 将显示欢迎语和简介。"
-		}
 	}
 }

+ 2 - 2
webview-ui/src/i18n/locales/zh-CN/welcome.json

@@ -1,6 +1,6 @@
 {
-	"greeting": "你好,我是 Roo!",
-	"introduction": "基于最新的AI编程技术,我可以逐步处理复杂软件开发任务。支持创建编辑文件、分析复杂项目、浏览器操作及运行终端命令,不仅能提供代码补全和基础答疑,还能完成更高阶的开发协助。通过MCP系统,我甚至可以自己制作新工具,持续提升解决问题的能力。",
+	"greeting": "欢迎来到Roo",
+	"introduction": "<strong>Roo Code 是领先的自主编程助手。</strong>准备好以前所未有的方式进行架构设计、编码、调试并提升你的工作效率。要继续使用,Roo Code 需要一个 API 密钥。",
 	"notice": "请先配置大语言模型API提供商",
 	"start": "开始吧!",
 	"chooseProvider": "选择一个 API 提供商开始:",

+ 2 - 2
webview-ui/src/i18n/locales/zh-TW/chat.json

@@ -7,7 +7,7 @@
 		"tokens": "Tokens:",
 		"cache": "快取:",
 		"apiCost": "API 費用:",
-		"contextWindow": "上下文視窗:",
+		"contextWindow": "上下文長度:",
 		"closeAndStart": "關閉現有工作並開始一項新的工作",
 		"export": "匯出工作紀錄",
 		"delete": "刪除工作(按住 Shift 並點選可跳過確認)"
@@ -65,7 +65,7 @@
 		"tooltip": "取消目前操作"
 	},
 	"scrollToBottom": "捲動至對話框底部",
-	"aboutMe": "由於程式代理功能的最新突破,我能夠逐步處理複雜的軟體開發工作。透過允許我建立和編輯檔案、探索複雜專案、使用瀏覽器和執行終端機命令(在您授權後)的工具,我可以以超越程式碼補全或技術支援的方式協助您。我甚至可以使用 MCP 建立新工具並擴展自己的能力。",
+	"onboarding": "<strong>您在此工作區中的工作清單是空的。</strong> 請在下方輸入工作以開始。 不確定如何開始? 在 <DocsLink>說明文件</DocsLink> 中閱讀更多關於 Roo 能為您做什麼的資訊。",
 	"selectMode": "選擇互動模式",
 	"selectApiConfig": "選擇 API 設定",
 	"enhancePrompt": "使用額外內容增強提示",

+ 0 - 6
webview-ui/src/i18n/locales/zh-TW/settings.json

@@ -478,11 +478,5 @@
 	"labels": {
 		"customArn": "自訂 ARN",
 		"useCustomArn": "使用自訂 ARN..."
-	},
-	"interface": {
-		"showgreeting": {
-			"label": "顯示歡迎訊息",
-			"description": "啟用後,Roo 將顯示歡迎訊息與介紹。"
-		}
 	}
 }

+ 3 - 3
webview-ui/src/i18n/locales/zh-TW/welcome.json

@@ -1,7 +1,7 @@
 {
-	"greeting": "嗨,我是 Roo!",
-	"introduction": "由於程式代理功能的最新突破,以及能夠讓我建立和編輯檔案、探索複雜專案、使用瀏覽器和執行終端機命令的工具(在您授權後),我能完成各種工作。我甚至可以使用 MCP 建立新工具並擴展自己的功能。",
-	"notice": "開始使用,此擴充功能需要一個 API 提供者。",
+	"greeting": "歡迎來到 Roo",
+	"introduction": "<strong>Roo Code 是頂尖的自主編程助手。</strong>準備好以前所未有的方式進行架構設計、編碼、除錯並提升您的工作效率。要繼續使用,Roo Code 需要一個 API 金鑰。",
+	"notice": "開始使用,此擴充功能需要一個 API 提供者。",
 	"start": "讓我們開始吧!",
 	"chooseProvider": "選擇一個 API 提供者開始:",
 	"routers": {