From db83b91ecc0b2d8e4bde82f9dd7979ea69cf3d94 Mon Sep 17 00:00:00 2001 From: Roo Code Date: Tue, 22 Jul 2025 13:51:59 +0000 Subject: [PATCH 01/10] feat: update navigation with Docs rename and Cloud signup pill --- .../src/components/chromes/nav-bar.tsx | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/apps/web-roo-code/src/components/chromes/nav-bar.tsx b/apps/web-roo-code/src/components/chromes/nav-bar.tsx index c9b1df9f2b..71113f043b 100644 --- a/apps/web-roo-code/src/components/chromes/nav-bar.tsx +++ b/apps/web-roo-code/src/components/chromes/nav-bar.tsx @@ -72,7 +72,7 @@ export function NavBar({ stars, downloads }: NavBarProps) { href={EXTERNAL_LINKS.DOCUMENTATION} target="_blank" className="text-muted-foreground transition-transform duration-200 hover:scale-105 hover:text-foreground"> - Documentation + Docs Careers +
+ Roo Code Cloud is coming + · + + Sign up + +
@@ -162,7 +173,7 @@ export function NavBar({ stars, downloads }: NavBarProps) { target="_blank" className="w-full px-8 py-3 text-left text-sm font-medium text-foreground/80 transition-colors hover:bg-accent hover:text-foreground" onClick={() => setIsMenuOpen(false)}> - Documentation + Docs setIsMenuOpen(false)}> Careers +
+ Roo Code Cloud is coming + · + setIsMenuOpen(false)}> + Sign up + +

From 9aa39be8a766668b2e614d7e6eaab37567604a6a Mon Sep 17 00:00:00 2001 From: Bruno Bergher Date: Tue, 22 Jul 2025 15:52:44 +0100 Subject: [PATCH 02/10] Website: Removes 'Security' from top header to make space --- apps/web-roo-code/src/components/chromes/nav-bar.tsx | 7 ------- 1 file changed, 7 deletions(-) diff --git a/apps/web-roo-code/src/components/chromes/nav-bar.tsx b/apps/web-roo-code/src/components/chromes/nav-bar.tsx index 71113f043b..6e6f483c39 100644 --- a/apps/web-roo-code/src/components/chromes/nav-bar.tsx +++ b/apps/web-roo-code/src/components/chromes/nav-bar.tsx @@ -61,13 +61,6 @@ export function NavBar({ stars, downloads }: NavBarProps) { className="text-muted-foreground transition-transform duration-200 hover:scale-105 hover:text-foreground"> Enterprise - - Security - Date: Tue, 22 Jul 2025 15:59:54 +0100 Subject: [PATCH 03/10] Website: Visual fixes for waitlist CTA in navbar --- .../src/components/chromes/nav-bar.tsx | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/apps/web-roo-code/src/components/chromes/nav-bar.tsx b/apps/web-roo-code/src/components/chromes/nav-bar.tsx index 6e6f483c39..96da1c58af 100644 --- a/apps/web-roo-code/src/components/chromes/nav-bar.tsx +++ b/apps/web-roo-code/src/components/chromes/nav-bar.tsx @@ -73,16 +73,19 @@ export function NavBar({ stars, downloads }: NavBarProps) { className="text-muted-foreground transition-transform duration-200 hover:scale-105 hover:text-foreground"> Careers -
- Roo Code Cloud is coming - · - - Sign up - +
+
+ + Roo Code Cloud is coming + + + Sign up + +
@@ -175,7 +178,7 @@ export function NavBar({ stars, downloads }: NavBarProps) { onClick={() => setIsMenuOpen(false)}> Careers -
+
Roo Code Cloud is coming · Date: Tue, 22 Jul 2025 16:23:27 +0100 Subject: [PATCH 04/10] Removes 'cycling' code from RooTips component, since it wasn't being used --- webview-ui/src/components/chat/ChatView.tsx | 2 +- webview-ui/src/components/welcome/RooTips.tsx | 84 ++++--------------- .../welcome/__tests__/RooTips.spec.tsx | 2 +- 3 files changed, 17 insertions(+), 71 deletions(-) diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index f804f7b61e..3dcdb414f1 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/webview-ui/src/components/chat/ChatView.tsx @@ -1709,7 +1709,7 @@ const ChatViewComponent: React.ForwardRefRenderFunction

- +
{/* Show the task history preview if expanded and tasks exist */} {taskHistory.length > 0 && isExpanded && } diff --git a/webview-ui/src/components/welcome/RooTips.tsx b/webview-ui/src/components/welcome/RooTips.tsx index f895dc565c..14d424e5f4 100644 --- a/webview-ui/src/components/welcome/RooTips.tsx +++ b/webview-ui/src/components/welcome/RooTips.tsx @@ -1,7 +1,5 @@ import { VSCodeLink } from "@vscode/webview-ui-toolkit/react" import { useTranslation } from "react-i18next" -import { useState, useEffect } from "react" -import clsx from "clsx" import { buildDocLink } from "@src/utils/docLinks" @@ -20,76 +18,24 @@ const tips = [ }, ] -interface RooTipsProps { - cycle?: boolean -} - -const RooTips = ({ cycle = false }: RooTipsProps) => { +const RooTips = () => { const { t } = useTranslation("chat") - const [currentTipIndex, setCurrentTipIndex] = useState(Math.floor(Math.random() * tips.length)) - const [isFading, setIsFading] = useState(false) - - useEffect(() => { - if (!cycle) return - - let timeoutId: NodeJS.Timeout | undefined = undefined - const intervalId = setInterval(() => { - setIsFading(true) // Start fade out - timeoutId = setTimeout(() => { - setCurrentTipIndex((prevIndex) => (prevIndex + 1) % tips.length) - setIsFading(false) // Start fade in - }, 1000) // Fade duration - }, 11000) // 10s display + 1s fade - - return () => { - clearInterval(intervalId) - if (timeoutId) { - clearTimeout(timeoutId) - } - } - }, [cycle]) - - const currentTip = tips[currentTipIndex] - const topTwoTips = tips.slice(0, 2) return ( -
- {/* If we need real estate, we show a compressed version of the tips. Otherwise, we expand it. */} - {cycle ? ( - <> -
Did you know about...
-
- {" "} - - - {t(currentTip.titleKey)}:{" "} - {t(currentTip.descriptionKey)} - -
- - ) : ( - topTwoTips.map((tip) => ( -
- - - - {t(tip.titleKey)} - - : {t(tip.descriptionKey)} - -
- )) - )} +
+ {tips.map((tip) => ( +
+ + + + {t(tip.titleKey)} + + : {t(tip.descriptionKey)} + +
+ ))}
) } diff --git a/webview-ui/src/components/welcome/__tests__/RooTips.spec.tsx b/webview-ui/src/components/welcome/__tests__/RooTips.spec.tsx index 8d907e2579..74d1932792 100644 --- a/webview-ui/src/components/welcome/__tests__/RooTips.spec.tsx +++ b/webview-ui/src/components/welcome/__tests__/RooTips.spec.tsx @@ -25,7 +25,7 @@ describe("RooTips Component", () => { describe("when cycle is false (default)", () => { beforeEach(() => { - render() + render() }) test("renders only the top two tips", () => { From db3cb8e3946077fa7dad12342be63a639b41c24c Mon Sep 17 00:00:00 2001 From: Bruno Bergher Date: Tue, 22 Jul 2025 17:34:47 +0100 Subject: [PATCH 05/10] Shows Roo Code Cloud CTA in the extension home screen --- webview-ui/src/components/chat/ChatView.tsx | 38 +++++++++------- webview-ui/src/components/welcome/RooTips.tsx | 43 +++++++++++++------ 2 files changed, 52 insertions(+), 29 deletions(-) diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index 3dcdb414f1..f1449c6533 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/webview-ui/src/components/chat/ChatView.tsx @@ -3,7 +3,6 @@ import { useDeepCompareEffect, useEvent, useMount } from "react-use" import debounce from "debounce" import { Virtuoso, type VirtuosoHandle } from "react-virtuoso" import removeMd from "remove-markdown" -import { Trans } from "react-i18next" import { VSCodeButton } from "@vscode/webview-ui-toolkit/react" import useSound from "use-sound" import { LRUCache } from "lru-cache" @@ -32,7 +31,6 @@ import { parseCommand, } from "@src/utils/command-validation" import { useTranslation } from "react-i18next" -import { buildDocLink } from "@src/utils/docLinks" import { useAppTranslation } from "@src/i18n/TranslationContext" import { useExtensionState } from "@src/context/ExtensionStateContext" import { useSelectedModel } from "@src/components/ui/hooks/useSelectedModel" @@ -1696,20 +1694,30 @@ const ChatViewComponent: React.ForwardRefRenderFunction {telemetrySetting === "unset" && } -

- - the docs - - ), - }} - /> -

+
- + {taskHistory.length < 4 ? ( + + ) : ( +
+ +
+

+ Roo Code Cloud is coming soon! +
+ + Run Roomote agents in the cloud, access your tasks from anywhere, + collaborate with others, and more. + +

+

+ + Join the waitlist to get early access. + +

+
+
+ )}
{/* Show the task history preview if expanded and tasks exist */} {taskHistory.length > 0 && isExpanded && } diff --git a/webview-ui/src/components/welcome/RooTips.tsx b/webview-ui/src/components/welcome/RooTips.tsx index 14d424e5f4..c0d6682d56 100644 --- a/webview-ui/src/components/welcome/RooTips.tsx +++ b/webview-ui/src/components/welcome/RooTips.tsx @@ -1,5 +1,6 @@ import { VSCodeLink } from "@vscode/webview-ui-toolkit/react" import { useTranslation } from "react-i18next" +import { Trans } from "react-i18next" import { buildDocLink } from "@src/utils/docLinks" @@ -22,20 +23,34 @@ const RooTips = () => { const { t } = useTranslation("chat") return ( -
- {tips.map((tip) => ( -
- - - - {t(tip.titleKey)} - - : {t(tip.descriptionKey)} - -
- ))} +
+

+ + the docs + + ), + }} + /> +

+
+ {tips.map((tip) => ( +
+ + + + {t(tip.titleKey)} + + : {t(tip.descriptionKey)} + +
+ ))} +
) } From ea732f59739ed9de061c8f407cf7a0fbdf77ebec Mon Sep 17 00:00:00 2001 From: Bruno Bergher Date: Tue, 22 Jul 2025 17:56:04 +0100 Subject: [PATCH 06/10] Don't show Cloud CTA if authenticated --- webview-ui/src/components/chat/ChatView.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index f1449c6533..bcec16e197 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/webview-ui/src/components/chat/ChatView.tsx @@ -113,6 +113,7 @@ const ChatViewComponent: React.ForwardRefRenderFunction}
- {taskHistory.length < 4 ? ( + {cloudIsAuthenticated || taskHistory.length < 4 ? ( ) : (
From 62a738e502c0f7b033fd096962b637783bc263c0 Mon Sep 17 00:00:00 2001 From: Bruno Bergher Date: Tue, 22 Jul 2025 18:11:26 +0100 Subject: [PATCH 07/10] Extracts Cloud CTA component and translates strings --- webview-ui/src/components/chat/ChatView.tsx | 24 ++---------------- .../src/components/welcome/RooCloudCTA.tsx | 25 +++++++++++++++++++ webview-ui/src/i18n/locales/ca/chat.json | 5 ++++ webview-ui/src/i18n/locales/de/chat.json | 5 ++++ webview-ui/src/i18n/locales/en/chat.json | 5 ++++ webview-ui/src/i18n/locales/es/chat.json | 5 ++++ webview-ui/src/i18n/locales/fr/chat.json | 5 ++++ webview-ui/src/i18n/locales/hi/chat.json | 5 ++++ webview-ui/src/i18n/locales/id/chat.json | 5 ++++ webview-ui/src/i18n/locales/it/chat.json | 5 ++++ webview-ui/src/i18n/locales/ja/chat.json | 5 ++++ webview-ui/src/i18n/locales/ko/chat.json | 5 ++++ webview-ui/src/i18n/locales/nl/chat.json | 6 +++-- webview-ui/src/i18n/locales/pl/chat.json | 6 +++-- webview-ui/src/i18n/locales/pt-BR/chat.json | 6 +++-- webview-ui/src/i18n/locales/ru/chat.json | 5 ++++ webview-ui/src/i18n/locales/tr/chat.json | 6 +++-- webview-ui/src/i18n/locales/vi/chat.json | 6 +++-- webview-ui/src/i18n/locales/zh-CN/chat.json | 6 +++-- webview-ui/src/i18n/locales/zh-TW/chat.json | 6 +++-- 20 files changed, 110 insertions(+), 36 deletions(-) create mode 100644 webview-ui/src/components/welcome/RooCloudCTA.tsx diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index bcec16e197..efd2db856c 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/webview-ui/src/components/chat/ChatView.tsx @@ -36,6 +36,7 @@ import { useExtensionState } from "@src/context/ExtensionStateContext" import { useSelectedModel } from "@src/components/ui/hooks/useSelectedModel" import RooHero from "@src/components/welcome/RooHero" import RooTips from "@src/components/welcome/RooTips" +import RooCloudCTA from "@src/components/welcome/RooCloudCTA" import { StandardTooltip } from "@src/components/ui" import { useAutoApprovalState } from "@src/hooks/useAutoApprovalState" import { useAutoApprovalToggles } from "@src/hooks/useAutoApprovalToggles" @@ -1697,28 +1698,7 @@ const ChatViewComponent: React.ForwardRefRenderFunction}
- {cloudIsAuthenticated || taskHistory.length < 4 ? ( - - ) : ( -
- -
-

- Roo Code Cloud is coming soon! -
- - Run Roomote agents in the cloud, access your tasks from anywhere, - collaborate with others, and more. - -

-

- - Join the waitlist to get early access. - -

-
-
- )} + {cloudIsAuthenticated || taskHistory.length < 4 ? : }
{/* Show the task history preview if expanded and tasks exist */} {taskHistory.length > 0 && isExpanded && } diff --git a/webview-ui/src/components/welcome/RooCloudCTA.tsx b/webview-ui/src/components/welcome/RooCloudCTA.tsx new file mode 100644 index 0000000000..1b2418f303 --- /dev/null +++ b/webview-ui/src/components/welcome/RooCloudCTA.tsx @@ -0,0 +1,25 @@ +import { useTranslation } from "react-i18next" + +export function RooCloudCTA() { + const { t } = useTranslation("chat") + + return ( +
+ +
+

+ {t("rooCloudCTA.title")} +
+ {t("rooCloudCTA.description")} +

+

+ + {t("rooCloudCTA.joinWaitlist")} + +

+
+
+ ) +} + +export default RooCloudCTA diff --git a/webview-ui/src/i18n/locales/ca/chat.json b/webview-ui/src/i18n/locales/ca/chat.json index 10f7ad3dba..01d9ee1c1a 100644 --- a/webview-ui/src/i18n/locales/ca/chat.json +++ b/webview-ui/src/i18n/locales/ca/chat.json @@ -323,6 +323,11 @@ "versionIndicator": { "ariaLabel": "Versió {{version}} - Feu clic per veure les notes de llançament" }, + "rooCloudCTA": { + "title": "Roo Code Cloud arribarà aviat!", + "description": "Executa agents remots al núvol, accedeix a les teves tasques des de qualsevol lloc, col·labora amb altres i molt més.", + "joinWaitlist": "Uneix-te a la llista d'espera per obtenir accés anticipat." + }, "editMessage": { "placeholder": "Edita el teu missatge..." } diff --git a/webview-ui/src/i18n/locales/de/chat.json b/webview-ui/src/i18n/locales/de/chat.json index 95620eefdf..032145234d 100644 --- a/webview-ui/src/i18n/locales/de/chat.json +++ b/webview-ui/src/i18n/locales/de/chat.json @@ -323,6 +323,11 @@ "versionIndicator": { "ariaLabel": "Version {{version}} - Klicken Sie, um die Versionshinweise anzuzeigen" }, + "rooCloudCTA": { + "title": "Roo Code Cloud kommt bald!", + "description": "Führe Remote-Agenten in der Cloud aus, greife von überall auf deine Aufgaben zu, arbeite mit anderen zusammen und vieles mehr.", + "joinWaitlist": "Tritt der Warteliste bei, um frühen Zugang zu erhalten." + }, "editMessage": { "placeholder": "Bearbeite deine Nachricht..." } diff --git a/webview-ui/src/i18n/locales/en/chat.json b/webview-ui/src/i18n/locales/en/chat.json index aed3bcfdc5..3bbb3fbf72 100644 --- a/webview-ui/src/i18n/locales/en/chat.json +++ b/webview-ui/src/i18n/locales/en/chat.json @@ -324,5 +324,10 @@ }, "versionIndicator": { "ariaLabel": "Version {{version}} - Click to view release notes" + }, + "rooCloudCTA": { + "title": "Roo Code Cloud is coming soon!", + "description": "Run Roomote agents in the cloud, access your tasks from anywhere, collaborate with others, and more.", + "joinWaitlist": "Join the waitlist to get early access." } } diff --git a/webview-ui/src/i18n/locales/es/chat.json b/webview-ui/src/i18n/locales/es/chat.json index a091aed1a6..adcfd1d40c 100644 --- a/webview-ui/src/i18n/locales/es/chat.json +++ b/webview-ui/src/i18n/locales/es/chat.json @@ -323,6 +323,11 @@ "versionIndicator": { "ariaLabel": "Versión {{version}} - Haz clic para ver las notas de la versión" }, + "rooCloudCTA": { + "title": "¡Roo Code Cloud llegará pronto!", + "description": "Ejecuta agentes remotos en la nube, accede a tus tareas desde cualquier lugar, colabora con otros y mucho más.", + "joinWaitlist": "Únete a la lista de espera para obtener acceso anticipado." + }, "editMessage": { "placeholder": "Edita tu mensaje..." } diff --git a/webview-ui/src/i18n/locales/fr/chat.json b/webview-ui/src/i18n/locales/fr/chat.json index 59b22149fb..3e49a64867 100644 --- a/webview-ui/src/i18n/locales/fr/chat.json +++ b/webview-ui/src/i18n/locales/fr/chat.json @@ -323,6 +323,11 @@ "versionIndicator": { "ariaLabel": "Version {{version}} - Cliquez pour voir les notes de version" }, + "rooCloudCTA": { + "title": "Roo Code Cloud arrive bientôt !", + "description": "Exécutez des agents distants dans le cloud, accédez à vos tâches de n'importe où, collaborez avec d'autres et bien plus encore.", + "joinWaitlist": "Rejoignez la liste d'attente pour obtenir un accès anticipé." + }, "editMessage": { "placeholder": "Modifiez votre message..." } diff --git a/webview-ui/src/i18n/locales/hi/chat.json b/webview-ui/src/i18n/locales/hi/chat.json index 08c7cc030a..3b5c7b8a67 100644 --- a/webview-ui/src/i18n/locales/hi/chat.json +++ b/webview-ui/src/i18n/locales/hi/chat.json @@ -323,6 +323,11 @@ "versionIndicator": { "ariaLabel": "संस्करण {{version}} - रिलीज़ नोट्स देखने के लिए क्लिक करें" }, + "rooCloudCTA": { + "title": "Roo Code Cloud जल्द आ रहा है!", + "description": "क्लाउड में रिमोट एजेंट चलाएं, कहीं से भी अपने कार्यों तक पहुंचें, दूसरों के साथ सहयोग करें, और बहुत कुछ।", + "joinWaitlist": "जल्दी पहुंच पाने के लिए प्रतीक्षा सूची में शामिल हों।" + }, "editMessage": { "placeholder": "अपना संदेश संपादित करें..." } diff --git a/webview-ui/src/i18n/locales/id/chat.json b/webview-ui/src/i18n/locales/id/chat.json index e242ebcf6c..2ef1cb75e7 100644 --- a/webview-ui/src/i18n/locales/id/chat.json +++ b/webview-ui/src/i18n/locales/id/chat.json @@ -329,6 +329,11 @@ "versionIndicator": { "ariaLabel": "Versi {{version}} - Klik untuk melihat catatan rilis" }, + "rooCloudCTA": { + "title": "Roo Code Cloud segera hadir!", + "description": "Jalankan agen jarak jauh di cloud, akses tugas Anda dari mana saja, berkolaborasi dengan orang lain, dan banyak lagi.", + "joinWaitlist": "Bergabunglah dengan daftar tunggu untuk mendapatkan akses awal." + }, "editMessage": { "placeholder": "Edit pesan Anda..." } diff --git a/webview-ui/src/i18n/locales/it/chat.json b/webview-ui/src/i18n/locales/it/chat.json index 9f2d1b523a..eb3984f1be 100644 --- a/webview-ui/src/i18n/locales/it/chat.json +++ b/webview-ui/src/i18n/locales/it/chat.json @@ -323,6 +323,11 @@ "versionIndicator": { "ariaLabel": "Versione {{version}} - Clicca per visualizzare le note di rilascio" }, + "rooCloudCTA": { + "title": "Roo Code Cloud arriva presto!", + "description": "Esegui agenti remoti nel cloud, accedi alle tue attività da qualsiasi luogo, collabora con altri e molto altro.", + "joinWaitlist": "Unisciti alla lista d'attesa per ottenere l'accesso anticipato." + }, "editMessage": { "placeholder": "Modifica il tuo messaggio..." } diff --git a/webview-ui/src/i18n/locales/ja/chat.json b/webview-ui/src/i18n/locales/ja/chat.json index 986b1d48bf..2f6e6bfab7 100644 --- a/webview-ui/src/i18n/locales/ja/chat.json +++ b/webview-ui/src/i18n/locales/ja/chat.json @@ -323,6 +323,11 @@ "versionIndicator": { "ariaLabel": "バージョン {{version}} - クリックしてリリースノートを表示" }, + "rooCloudCTA": { + "title": "Roo Code Cloud が間もなく登場!", + "description": "クラウドでリモートエージェントを実行し、どこからでもタスクにアクセスし、他の人と協力し、その他多くの機能を利用できます。", + "joinWaitlist": "早期アクセスを取得するためにウェイトリストに参加してください。" + }, "editMessage": { "placeholder": "メッセージを編集..." } diff --git a/webview-ui/src/i18n/locales/ko/chat.json b/webview-ui/src/i18n/locales/ko/chat.json index 295f11584c..f4a5c33602 100644 --- a/webview-ui/src/i18n/locales/ko/chat.json +++ b/webview-ui/src/i18n/locales/ko/chat.json @@ -323,6 +323,11 @@ "versionIndicator": { "ariaLabel": "버전 {{version}} - 릴리스 노트를 보려면 클릭하세요" }, + "rooCloudCTA": { + "title": "Roo Code Cloud가 곧 출시됩니다!", + "description": "클라우드에서 원격 에이전트를 실행하고, 어디서나 작업에 액세스하고, 다른 사람들과 협업하는 등 다양한 기능을 이용하세요.", + "joinWaitlist": "얼리 액세스를 받으려면 대기 목록에 가입하세요." + }, "editMessage": { "placeholder": "메시지 편집..." } diff --git a/webview-ui/src/i18n/locales/nl/chat.json b/webview-ui/src/i18n/locales/nl/chat.json index 9d8bd6b202..617eeced8e 100644 --- a/webview-ui/src/i18n/locales/nl/chat.json +++ b/webview-ui/src/i18n/locales/nl/chat.json @@ -323,7 +323,9 @@ "versionIndicator": { "ariaLabel": "Versie {{version}} - Klik om release notes te bekijken" }, - "editMessage": { - "placeholder": "Bewerk je bericht..." + "rooCloudCTA": { + "title": "Roo Code Cloud komt binnenkort!", + "description": "Voer externe agenten uit in de cloud, krijg overal toegang tot je taken, werk samen met anderen en nog veel meer.", + "joinWaitlist": "Sluit je aan bij de wachtlijst voor vroege toegang." } } diff --git a/webview-ui/src/i18n/locales/pl/chat.json b/webview-ui/src/i18n/locales/pl/chat.json index a5460909fb..f6ac2999c5 100644 --- a/webview-ui/src/i18n/locales/pl/chat.json +++ b/webview-ui/src/i18n/locales/pl/chat.json @@ -323,7 +323,9 @@ "versionIndicator": { "ariaLabel": "Wersja {{version}} - Kliknij, aby wyświetlić informacje o wydaniu" }, - "editMessage": { - "placeholder": "Edytuj swoją wiadomość..." + "rooCloudCTA": { + "title": "Roo Code Cloud już wkrótce!", + "description": "Uruchamiaj zdalne agenty w chmurze, uzyskuj dostęp do swoich zadań z dowolnego miejsca, współpracuj z innymi i wiele więcej.", + "joinWaitlist": "Dołącz do listy oczekujących, aby uzyskać wczesny dostęp." } } diff --git a/webview-ui/src/i18n/locales/pt-BR/chat.json b/webview-ui/src/i18n/locales/pt-BR/chat.json index 96cb0c7660..02305dc798 100644 --- a/webview-ui/src/i18n/locales/pt-BR/chat.json +++ b/webview-ui/src/i18n/locales/pt-BR/chat.json @@ -323,7 +323,9 @@ "versionIndicator": { "ariaLabel": "Versão {{version}} - Clique para ver as notas de lançamento" }, - "editMessage": { - "placeholder": "Edite sua mensagem..." + "rooCloudCTA": { + "title": "Roo Code Cloud chegará em breve!", + "description": "Execute agentes remotos na nuvem, acesse suas tarefas de qualquer lugar, colabore com outros e muito mais.", + "joinWaitlist": "Junte-se à lista de espera para obter acesso antecipado." } } diff --git a/webview-ui/src/i18n/locales/ru/chat.json b/webview-ui/src/i18n/locales/ru/chat.json index 90387a620c..0660d3e1d6 100644 --- a/webview-ui/src/i18n/locales/ru/chat.json +++ b/webview-ui/src/i18n/locales/ru/chat.json @@ -323,6 +323,11 @@ "versionIndicator": { "ariaLabel": "Версия {{version}} - Нажмите, чтобы просмотреть примечания к выпуску" }, + "rooCloudCTA": { + "title": "Roo Code Cloud скоро появится!", + "description": "Запускайте удаленные агенты в облаке, получайте доступ к своим задачам из любого места, сотрудничайте с другими и многое другое.", + "joinWaitlist": "Присоединитесь к списку ожидания для получения раннего доступа." + }, "editMessage": { "placeholder": "Редактировать сообщение..." } diff --git a/webview-ui/src/i18n/locales/tr/chat.json b/webview-ui/src/i18n/locales/tr/chat.json index 2188756f7f..cb5044d33e 100644 --- a/webview-ui/src/i18n/locales/tr/chat.json +++ b/webview-ui/src/i18n/locales/tr/chat.json @@ -323,7 +323,9 @@ "versionIndicator": { "ariaLabel": "Sürüm {{version}} - Sürüm notlarını görüntülemek için tıklayın" }, - "editMessage": { - "placeholder": "Mesajını düzenle..." + "rooCloudCTA": { + "title": "Roo Code Cloud yakında geliyor!", + "description": "Bulutta uzak ajanlar çalıştırın, görevlerinize her yerden erişin, başkalarıyla işbirliği yapın ve daha fazlası.", + "joinWaitlist": "Erken erişim için bekleme listesine katılın." } } diff --git a/webview-ui/src/i18n/locales/vi/chat.json b/webview-ui/src/i18n/locales/vi/chat.json index cdab5bf1e5..7c62db8b94 100644 --- a/webview-ui/src/i18n/locales/vi/chat.json +++ b/webview-ui/src/i18n/locales/vi/chat.json @@ -323,7 +323,9 @@ "versionIndicator": { "ariaLabel": "Phiên bản {{version}} - Nhấp để xem ghi chú phát hành" }, - "editMessage": { - "placeholder": "Chỉnh sửa tin nhắn của bạn..." + "rooCloudCTA": { + "title": "Roo Code Cloud sắp ra mắt!", + "description": "Chạy các agent từ xa trên cloud, truy cập các tác vụ của bạn từ mọi nơi, cộng tác với người khác và nhiều hơn nữa.", + "joinWaitlist": "Tham gia danh sách chờ để được truy cập sớm." } } diff --git a/webview-ui/src/i18n/locales/zh-CN/chat.json b/webview-ui/src/i18n/locales/zh-CN/chat.json index 58945ddf12..bf0dd67c59 100644 --- a/webview-ui/src/i18n/locales/zh-CN/chat.json +++ b/webview-ui/src/i18n/locales/zh-CN/chat.json @@ -323,7 +323,9 @@ "versionIndicator": { "ariaLabel": "版本 {{version}} - 点击查看发布说明" }, - "editMessage": { - "placeholder": "编辑消息..." + "rooCloudCTA": { + "title": "Roo Code Cloud 即将推出!", + "description": "在云端运行远程代理,随时随地访问任务,与他人协作等更多功能。", + "joinWaitlist": "加入等待列表获取早期访问权限。" } } diff --git a/webview-ui/src/i18n/locales/zh-TW/chat.json b/webview-ui/src/i18n/locales/zh-TW/chat.json index fab99e69ae..e8911b8a0e 100644 --- a/webview-ui/src/i18n/locales/zh-TW/chat.json +++ b/webview-ui/src/i18n/locales/zh-TW/chat.json @@ -323,7 +323,9 @@ "versionIndicator": { "ariaLabel": "版本 {{version}} - 點擊查看發布說明" }, - "editMessage": { - "placeholder": "編輯訊息..." + "rooCloudCTA": { + "title": "Roo Code Cloud 即將推出!", + "description": "在雲端執行遠端代理,隨時隨地存取您的工作,與他人協作等更多功能。", + "joinWaitlist": "加入等候名單以獲得早期存取權限。" } } From 856a5908f1ceb3002949cbdc3748ac6817d24915 Mon Sep 17 00:00:00 2001 From: Bruno Bergher Date: Tue, 22 Jul 2025 18:13:12 +0100 Subject: [PATCH 08/10] --amend --- webview-ui/src/i18n/locales/nl/chat.json | 3 +++ webview-ui/src/i18n/locales/pl/chat.json | 3 +++ webview-ui/src/i18n/locales/pt-BR/chat.json | 3 +++ webview-ui/src/i18n/locales/tr/chat.json | 3 +++ webview-ui/src/i18n/locales/vi/chat.json | 3 +++ webview-ui/src/i18n/locales/zh-CN/chat.json | 3 +++ webview-ui/src/i18n/locales/zh-TW/chat.json | 3 +++ 7 files changed, 21 insertions(+) diff --git a/webview-ui/src/i18n/locales/nl/chat.json b/webview-ui/src/i18n/locales/nl/chat.json index 617eeced8e..1d11db2668 100644 --- a/webview-ui/src/i18n/locales/nl/chat.json +++ b/webview-ui/src/i18n/locales/nl/chat.json @@ -327,5 +327,8 @@ "title": "Roo Code Cloud komt binnenkort!", "description": "Voer externe agenten uit in de cloud, krijg overal toegang tot je taken, werk samen met anderen en nog veel meer.", "joinWaitlist": "Sluit je aan bij de wachtlijst voor vroege toegang." + }, + "editMessage": { + "placeholder": "Bewerk je bericht..." } } diff --git a/webview-ui/src/i18n/locales/pl/chat.json b/webview-ui/src/i18n/locales/pl/chat.json index f6ac2999c5..88c58418ad 100644 --- a/webview-ui/src/i18n/locales/pl/chat.json +++ b/webview-ui/src/i18n/locales/pl/chat.json @@ -327,5 +327,8 @@ "title": "Roo Code Cloud już wkrótce!", "description": "Uruchamiaj zdalne agenty w chmurze, uzyskuj dostęp do swoich zadań z dowolnego miejsca, współpracuj z innymi i wiele więcej.", "joinWaitlist": "Dołącz do listy oczekujących, aby uzyskać wczesny dostęp." + }, + "editMessage": { + "placeholder": "Edytuj swoją wiadomość..." } } diff --git a/webview-ui/src/i18n/locales/pt-BR/chat.json b/webview-ui/src/i18n/locales/pt-BR/chat.json index 02305dc798..3784d6cc64 100644 --- a/webview-ui/src/i18n/locales/pt-BR/chat.json +++ b/webview-ui/src/i18n/locales/pt-BR/chat.json @@ -327,5 +327,8 @@ "title": "Roo Code Cloud chegará em breve!", "description": "Execute agentes remotos na nuvem, acesse suas tarefas de qualquer lugar, colabore com outros e muito mais.", "joinWaitlist": "Junte-se à lista de espera para obter acesso antecipado." + }, + "editMessage": { + "placeholder": "Edite sua mensagem..." } } diff --git a/webview-ui/src/i18n/locales/tr/chat.json b/webview-ui/src/i18n/locales/tr/chat.json index cb5044d33e..75bc126dff 100644 --- a/webview-ui/src/i18n/locales/tr/chat.json +++ b/webview-ui/src/i18n/locales/tr/chat.json @@ -327,5 +327,8 @@ "title": "Roo Code Cloud yakında geliyor!", "description": "Bulutta uzak ajanlar çalıştırın, görevlerinize her yerden erişin, başkalarıyla işbirliği yapın ve daha fazlası.", "joinWaitlist": "Erken erişim için bekleme listesine katılın." + }, + "editMessage": { + "placeholder": "Mesajını düzenle..." } } diff --git a/webview-ui/src/i18n/locales/vi/chat.json b/webview-ui/src/i18n/locales/vi/chat.json index 7c62db8b94..944eabcb94 100644 --- a/webview-ui/src/i18n/locales/vi/chat.json +++ b/webview-ui/src/i18n/locales/vi/chat.json @@ -327,5 +327,8 @@ "title": "Roo Code Cloud sắp ra mắt!", "description": "Chạy các agent từ xa trên cloud, truy cập các tác vụ của bạn từ mọi nơi, cộng tác với người khác và nhiều hơn nữa.", "joinWaitlist": "Tham gia danh sách chờ để được truy cập sớm." + }, + "editMessage": { + "placeholder": "Chỉnh sửa tin nhắn của bạn..." } } diff --git a/webview-ui/src/i18n/locales/zh-CN/chat.json b/webview-ui/src/i18n/locales/zh-CN/chat.json index bf0dd67c59..616cd14fec 100644 --- a/webview-ui/src/i18n/locales/zh-CN/chat.json +++ b/webview-ui/src/i18n/locales/zh-CN/chat.json @@ -327,5 +327,8 @@ "title": "Roo Code Cloud 即将推出!", "description": "在云端运行远程代理,随时随地访问任务,与他人协作等更多功能。", "joinWaitlist": "加入等待列表获取早期访问权限。" + }, + "editMessage": { + "placeholder": "编辑消息..." } } diff --git a/webview-ui/src/i18n/locales/zh-TW/chat.json b/webview-ui/src/i18n/locales/zh-TW/chat.json index e8911b8a0e..662421900e 100644 --- a/webview-ui/src/i18n/locales/zh-TW/chat.json +++ b/webview-ui/src/i18n/locales/zh-TW/chat.json @@ -327,5 +327,8 @@ "title": "Roo Code Cloud 即將推出!", "description": "在雲端執行遠端代理,隨時隨地存取您的工作,與他人協作等更多功能。", "joinWaitlist": "加入等候名單以獲得早期存取權限。" + }, + "editMessage": { + "placeholder": "編輯訊息..." } } From 5cfee3c9d01f089a7eac01e3a7998704f0386f2a Mon Sep 17 00:00:00 2001 From: Bruno Bergher Date: Wed, 23 Jul 2025 11:50:59 +0100 Subject: [PATCH 09/10] Moves waitlist form to a redirect on the website, cleans up mobile version of CTA --- apps/web-roo-code/next.config.ts | 6 ++++ .../src/components/chromes/nav-bar.tsx | 28 +++++++++---------- .../src/components/welcome/RooCloudCTA.tsx | 4 +-- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/apps/web-roo-code/next.config.ts b/apps/web-roo-code/next.config.ts index 27f71d6b57..2bc1736483 100644 --- a/apps/web-roo-code/next.config.ts +++ b/apps/web-roo-code/next.config.ts @@ -21,6 +21,12 @@ const nextConfig: NextConfig = { destination: "https://roocode.com/:path*", permanent: true, }, + // Redirect cloud waitlist to Notion page + { + source: "/cloud-waitlist", + destination: "https://shard-dogwood-daf.notion.site/238fd1401b0a8087b858e1ad431507cf?pvs=105", + permanent: false, + }, ] }, } diff --git a/apps/web-roo-code/src/components/chromes/nav-bar.tsx b/apps/web-roo-code/src/components/chromes/nav-bar.tsx index 96da1c58af..336c6236e1 100644 --- a/apps/web-roo-code/src/components/chromes/nav-bar.tsx +++ b/apps/web-roo-code/src/components/chromes/nav-bar.tsx @@ -79,8 +79,7 @@ export function NavBar({ stars, downloads }: NavBarProps) { Roo Code Cloud is coming Sign up @@ -126,6 +125,19 @@ export function NavBar({ stars, downloads }: NavBarProps) {
From b3ac38b55acf527bfe0bf6247c91c4e059bfd27f Mon Sep 17 00:00:00 2001 From: Bruno Bergher Date: Wed, 23 Jul 2025 12:18:31 +0100 Subject: [PATCH 10/10] Tests --- .../chat/__tests__/ChatView.spec.tsx | 197 ++++++++++++++++++ .../welcome/__tests__/RooTips.spec.tsx | 14 +- 2 files changed, 209 insertions(+), 2 deletions(-) diff --git a/webview-ui/src/components/chat/__tests__/ChatView.spec.tsx b/webview-ui/src/components/chat/__tests__/ChatView.spec.tsx index ba758fbe3b..7545dae140 100644 --- a/webview-ui/src/components/chat/__tests__/ChatView.spec.tsx +++ b/webview-ui/src/components/chat/__tests__/ChatView.spec.tsx @@ -85,6 +85,40 @@ vi.mock("@src/components/modals/Announcement", () => ({ }, })) +// Mock RooCloudCTA component +vi.mock("@src/components/welcome/RooCloudCTA", () => ({ + default: function MockRooCloudCTA() { + return ( +
+
rooCloudCTA.title
+
rooCloudCTA.description
+
rooCloudCTA.joinWaitlist
+
+ ) + }, +})) + +// Mock RooTips component +vi.mock("@src/components/welcome/RooTips", () => ({ + default: function MockRooTips() { + return
Tips content
+ }, +})) + +// Mock RooHero component +vi.mock("@src/components/welcome/RooHero", () => ({ + default: function MockRooHero() { + return
Hero content
+ }, +})) + +// Mock TelemetryBanner component +vi.mock("../common/TelemetryBanner", () => ({ + default: function MockTelemetryBanner() { + return null // Don't render anything to avoid interference + }, +})) + // Mock i18n vi.mock("react-i18next", () => ({ useTranslation: () => ({ @@ -191,6 +225,8 @@ const mockPostMessage = (state: Partial) => { shouldShowAnnouncement: false, allowedCommands: [], alwaysAllowExecute: false, + cloudIsAuthenticated: false, + telemetrySetting: "enabled", ...state, }, }, @@ -1310,3 +1346,164 @@ describe("ChatView - Version Indicator Tests", () => { expect(versionButton).not.toBeInTheDocument() }) }) + +describe("ChatView - RooCloudCTA Display Tests", () => { + beforeEach(() => vi.clearAllMocks()) + + it("does not show RooCloudCTA when user is authenticated to Cloud", () => { + const { queryByTestId, getByTestId } = renderChatView() + + // Hydrate state with user authenticated to cloud and some task history + mockPostMessage({ + cloudIsAuthenticated: true, + taskHistory: [ + { id: "1", ts: Date.now() - 4000 }, + { id: "2", ts: Date.now() - 3000 }, + { id: "3", ts: Date.now() - 2000 }, + { id: "4", ts: Date.now() - 1000 }, + { id: "5", ts: Date.now() }, + ], + clineMessages: [], // No active task + }) + + // Should not show RooCloudCTA but should show RooTips + expect(queryByTestId("roo-cloud-cta")).not.toBeInTheDocument() + expect(getByTestId("roo-tips")).toBeInTheDocument() + }) + + it("does not show RooCloudCTA when user has only run 3 tasks in their history", () => { + const { queryByTestId, getByTestId } = renderChatView() + + // Hydrate state with user not authenticated and only 3 tasks in history + mockPostMessage({ + cloudIsAuthenticated: false, + taskHistory: [ + { id: "1", ts: Date.now() - 2000 }, + { id: "2", ts: Date.now() - 1000 }, + { id: "3", ts: Date.now() }, + ], + clineMessages: [], // No active task + }) + + // Should not show RooCloudCTA but should show RooTips + expect(queryByTestId("roo-cloud-cta")).not.toBeInTheDocument() + expect(getByTestId("roo-tips")).toBeInTheDocument() + }) + + it("shows RooCloudCTA when user is not authenticated and has run 4 or more tasks", async () => { + const { getByTestId, queryByTestId } = renderChatView() + + // Hydrate state with user not authenticated and 4+ tasks in history + mockPostMessage({ + cloudIsAuthenticated: false, + taskHistory: [ + { id: "1", ts: Date.now() - 3000 }, + { id: "2", ts: Date.now() - 2000 }, + { id: "3", ts: Date.now() - 1000 }, + { id: "4", ts: Date.now() }, + ], + clineMessages: [], // No active task + }) + + // Should show RooCloudCTA and not RooTips + await waitFor(() => { + expect(getByTestId("roo-cloud-cta")).toBeInTheDocument() + }) + expect(queryByTestId("roo-tips")).not.toBeInTheDocument() + }) + + it("shows RooCloudCTA when user is not authenticated and has run 5 tasks", async () => { + const { getByTestId, queryByTestId } = renderChatView() + + // Hydrate state with user not authenticated and 5 tasks in history + mockPostMessage({ + cloudIsAuthenticated: false, + taskHistory: [ + { id: "1", ts: Date.now() - 4000 }, + { id: "2", ts: Date.now() - 3000 }, + { id: "3", ts: Date.now() - 2000 }, + { id: "4", ts: Date.now() - 1000 }, + { id: "5", ts: Date.now() }, + ], + clineMessages: [], // No active task + }) + + // Should show RooCloudCTA and not RooTips + await waitFor(() => { + expect(getByTestId("roo-cloud-cta")).toBeInTheDocument() + }) + expect(queryByTestId("roo-tips")).not.toBeInTheDocument() + }) + + it("does not show RooCloudCTA when there is an active task (regardless of auth status)", async () => { + const { queryByTestId } = renderChatView() + + // Hydrate state with user not authenticated, 4+ tasks, but with an active task + mockPostMessage({ + cloudIsAuthenticated: false, + taskHistory: [ + { id: "1", ts: Date.now() - 3000 }, + { id: "2", ts: Date.now() - 2000 }, + { id: "3", ts: Date.now() - 1000 }, + { id: "4", ts: Date.now() }, + ], + clineMessages: [ + { + type: "say", + say: "task", + ts: Date.now(), + text: "Active task in progress", + }, + ], + }) + + // Wait for the state to be updated and the task view to be shown + await waitFor(() => { + // Should not show RooCloudCTA when there's an active task + expect(queryByTestId("roo-cloud-cta")).not.toBeInTheDocument() + // Should not show RooTips either since the entire welcome screen is hidden during active tasks + expect(queryByTestId("roo-tips")).not.toBeInTheDocument() + // Should not show RooHero either since the entire welcome screen is hidden during active tasks + expect(queryByTestId("roo-hero")).not.toBeInTheDocument() + }) + }) + + it("shows RooTips when user is authenticated (instead of RooCloudCTA)", () => { + const { queryByTestId, getByTestId } = renderChatView() + + // Hydrate state with user authenticated to cloud + mockPostMessage({ + cloudIsAuthenticated: true, + taskHistory: [ + { id: "1", ts: Date.now() - 3000 }, + { id: "2", ts: Date.now() - 2000 }, + { id: "3", ts: Date.now() - 1000 }, + { id: "4", ts: Date.now() }, + ], + clineMessages: [], // No active task + }) + + // Should not show RooCloudCTA but should show RooTips + expect(queryByTestId("roo-cloud-cta")).not.toBeInTheDocument() + expect(getByTestId("roo-tips")).toBeInTheDocument() + }) + + it("shows RooTips when user has fewer than 4 tasks (instead of RooCloudCTA)", () => { + const { queryByTestId, getByTestId } = renderChatView() + + // Hydrate state with user not authenticated but fewer than 4 tasks + mockPostMessage({ + cloudIsAuthenticated: false, + taskHistory: [ + { id: "1", ts: Date.now() - 2000 }, + { id: "2", ts: Date.now() - 1000 }, + { id: "3", ts: Date.now() }, + ], + clineMessages: [], // No active task + }) + + // Should not show RooCloudCTA but should show RooTips + expect(queryByTestId("roo-cloud-cta")).not.toBeInTheDocument() + expect(getByTestId("roo-tips")).toBeInTheDocument() + }) +}) diff --git a/webview-ui/src/components/welcome/__tests__/RooTips.spec.tsx b/webview-ui/src/components/welcome/__tests__/RooTips.spec.tsx index 74d1932792..eb121aaadf 100644 --- a/webview-ui/src/components/welcome/__tests__/RooTips.spec.tsx +++ b/webview-ui/src/components/welcome/__tests__/RooTips.spec.tsx @@ -7,6 +7,16 @@ vi.mock("react-i18next", () => ({ useTranslation: () => ({ t: (key: string) => key, // Simple mock that returns the key }), + Trans: ({ + children, + components, + }: { + children?: React.ReactNode + components?: Record + }) => { + // Simple mock that renders children or the first component if no children + return children || (components && Object.values(components)[0]) || null + }, })) vi.mock("@vscode/webview-ui-toolkit/react", () => ({ @@ -29,8 +39,8 @@ describe("RooTips Component", () => { }) test("renders only the top two tips", () => { - // Ensure only two tips are present (check by link role) - expect(screen.getAllByRole("link")).toHaveLength(2) + // Ensure only two tips are present plus the docs link in the Trans component (3 total links) + expect(screen.getAllByRole("link")).toHaveLength(3) }) }) })