Remove Roo Code Cloud welcome CTAs

This commit is contained in:
Bruno Bergher 2026-05-04 17:17:43 +01:00
parent ad25634905
commit 618baddd90
40 changed files with 77 additions and 184 deletions

View file

@ -2,10 +2,8 @@ import React, { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo
import { useDeepCompareEffect, useEvent } from "react-use"
import { Virtuoso, type VirtuosoHandle } from "react-virtuoso"
import removeMd from "remove-markdown"
import { VSCodeLink } from "@vscode/webview-ui-toolkit/react"
import useSound from "use-sound"
import { LRUCache } from "lru-cache"
import { Trans } from "react-i18next"
import { useDebounceEffect } from "@src/utils/useDebounceEffect"
import { appendImages } from "@src/utils/imageUtils"
@ -31,7 +29,6 @@ import { useSelectedModel } from "@src/components/ui/hooks/useSelectedModel"
import RooHero from "@src/components/welcome/RooHero"
import RooTips from "@src/components/welcome/RooTips"
import { StandardTooltip, Button } from "@src/components/ui"
import { CloudUpsellDialog } from "@src/components/cloud/CloudUpsellDialog"
import TelemetryBanner from "../common/TelemetryBanner"
import VersionIndicator from "../common/VersionIndicator"
@ -46,10 +43,7 @@ import { CheckpointWarning } from "./CheckpointWarning"
import { QueuedMessages } from "./QueuedMessages"
import { WorktreeSelector } from "./WorktreeSelector"
import FileChangesPanel from "./FileChangesPanel"
import DismissibleUpsell from "../common/DismissibleUpsell"
import { useCloudUpsell } from "@src/hooks/useCloudUpsell"
import { useScrollLifecycle } from "@src/hooks/useScrollLifecycle"
import { Cloud } from "lucide-react"
export interface ChatViewProps {
isHidden: boolean
@ -90,7 +84,6 @@ const ChatViewComponent: React.ForwardRefRenderFunction<ChatViewRef, ChatViewPro
telemetrySetting,
soundEnabled,
soundVolume,
cloudIsAuthenticated,
messageQueue = [],
showWorktreesInHomeScreen,
} = useExtensionState()
@ -187,15 +180,6 @@ const ChatViewComponent: React.ForwardRefRenderFunction<ChatViewRef, ChatViewPro
clineAskRef.current = clineAsk
}, [clineAsk])
const {
isOpen: isUpsellOpen,
openUpsell,
closeUpsell,
handleConnect,
} = useCloudUpsell({
autoOpenOnAuth: false,
})
// Keep inputValueRef in sync with inputValue state
useEffect(() => {
inputValueRef.current = inputValue
@ -1639,22 +1623,6 @@ const ChatViewComponent: React.ForwardRefRenderFunction<ChatViewRef, ChatViewPro
{/* Everyone should see their task history if any */}
{taskHistory.length > 0 && <HistoryPreview />}
</div>
{/* Logged out users should see a one-time upsell, but not for brand new users */}
{!cloudIsAuthenticated && taskHistory.length >= 6 && (
<DismissibleUpsell
upsellId="taskList2"
icon={<Cloud className="size-5 shrink-0" />}
onClick={() => openUpsell()}
dismissOnClick={false}
className="bg-none mt-6 border-border rounded-xl p-3 !text-base">
<Trans
i18nKey="cloud:upsell.taskList"
components={{
learnMoreLink: <VSCodeLink href="#" />,
}}
/>
</DismissibleUpsell>
)}
</div>
</div>
)}
@ -1825,7 +1793,6 @@ const ChatViewComponent: React.ForwardRefRenderFunction<ChatViewRef, ChatViewPro
)}
<div id="roo-portal" />
<CloudUpsellDialog open={isUpsellOpen} onOpenChange={closeUpsell} onConnect={handleConnect} />
</div>
)
}

View file

@ -98,13 +98,6 @@ vi.mock("../Announcement", () => ({
},
}))
// Mock DismissibleUpsell component
vi.mock("@/components/common/DismissibleUpsell", () => ({
default: function MockDismissibleUpsell({ children }: { children: React.ReactNode }) {
return <div data-testid="dismissible-upsell">{children}</div>
},
}))
// Mock QueuedMessages component
vi.mock("../QueuedMessages", () => ({
QueuedMessages: function MockQueuedMessages({
@ -670,10 +663,10 @@ describe("ChatView - Version Indicator Tests", () => {
})
})
describe("ChatView - DismissibleUpsell Display Tests", () => {
describe("ChatView - Cloud upsell display tests", () => {
beforeEach(() => vi.clearAllMocks())
it("does not show DismissibleUpsell when user is authenticated to Cloud", () => {
it("does not show Cloud upsell when user is authenticated to Cloud", () => {
const { queryByTestId } = renderChatView()
// Hydrate state with user authenticated to cloud
@ -688,11 +681,11 @@ describe("ChatView - DismissibleUpsell Display Tests", () => {
clineMessages: [], // No active task
})
// Should not show DismissibleUpsell when authenticated
// Should not show Cloud upsell when authenticated
expect(queryByTestId("dismissible-upsell")).not.toBeInTheDocument()
})
it("does not show DismissibleUpsell when user has only run 3 tasks in their history", () => {
it("does not show Cloud upsell when user has only run 3 tasks in their history", () => {
const { queryByTestId } = renderChatView()
// Hydrate state with user not authenticated but only 3 tasks
@ -706,12 +699,12 @@ describe("ChatView - DismissibleUpsell Display Tests", () => {
clineMessages: [], // No active task
})
// Should not show DismissibleUpsell with less than 4 tasks
// Should not show Cloud upsell with less than 4 tasks
expect(queryByTestId("dismissible-upsell")).not.toBeInTheDocument()
})
it("shows DismissibleUpsell when user is not authenticated and has run 6 or more tasks", async () => {
const { getByTestId } = renderChatView()
it("does not show Cloud upsell when user is not authenticated and has run 6 or more tasks", async () => {
const { queryByTestId } = renderChatView()
// Hydrate state with user not authenticated and 4 tasks
mockPostMessage({
@ -728,13 +721,13 @@ describe("ChatView - DismissibleUpsell Display Tests", () => {
clineMessages: [], // No active task
})
// Wait for component to render and show DismissibleUpsell
// The Cloud upsell CTA has been removed from the home screen.
await waitFor(() => {
expect(getByTestId("dismissible-upsell")).toBeInTheDocument()
expect(queryByTestId("dismissible-upsell")).not.toBeInTheDocument()
})
})
it("does not show DismissibleUpsell when there is an active task (regardless of auth status)", async () => {
it("does not show Cloud upsell when there is an active task (regardless of auth status)", async () => {
const { queryByTestId } = renderChatView()
// Hydrate state with active task
@ -758,7 +751,7 @@ describe("ChatView - DismissibleUpsell Display Tests", () => {
// Wait for component to render with active task
await waitFor(() => {
// Should not show DismissibleUpsell during active task
// Should not show Cloud upsell during active task
expect(queryByTestId("dismissible-upsell")).not.toBeInTheDocument()
// Should not show RooTips either since the entire welcome screen is hidden during active tasks
expect(queryByTestId("roo-tips")).not.toBeInTheDocument()
@ -767,7 +760,7 @@ describe("ChatView - DismissibleUpsell Display Tests", () => {
})
})
it("shows RooTips when user is authenticated (instead of DismissibleUpsell)", () => {
it("shows RooTips when user is authenticated", () => {
const { queryByTestId, getByTestId } = renderChatView()
// Hydrate state with user authenticated to cloud
@ -782,12 +775,12 @@ describe("ChatView - DismissibleUpsell Display Tests", () => {
clineMessages: [], // No active task
})
// Should not show DismissibleUpsell but should show RooTips
// Should not show Cloud upsell but should show RooTips
expect(queryByTestId("dismissible-upsell")).not.toBeInTheDocument()
expect(getByTestId("roo-tips")).toBeInTheDocument()
})
it("shows RooTips when user has fewer than 6 tasks (instead of DismissibleUpsell)", () => {
it("shows RooTips when user has fewer than 6 tasks", () => {
const { queryByTestId, getByTestId } = renderChatView()
// Hydrate state with user not authenticated but fewer than 4 tasks
@ -801,7 +794,7 @@ describe("ChatView - DismissibleUpsell Display Tests", () => {
clineMessages: [], // No active task
})
// Should not show DismissibleUpsell but should show RooTips
// Should not show Cloud upsell but should show RooTips
expect(queryByTestId("dismissible-upsell")).not.toBeInTheDocument()
expect(getByTestId("roo-tips")).toBeInTheDocument()
})

View file

@ -91,11 +91,8 @@ const WelcomeViewProvider = () => {
)
const handleGetStarted = useCallback(() => {
// Landing screen - always trigger auth with Roo
if (selectedProvider === null) {
setAuthOrigin("landing")
vscode.postMessage({ type: "rooCloudSignIn", useProviderSignup: true })
setAuthInProgress(true)
setSelectedProvider("roo")
}
// Provider Selection screen
else if (selectedProvider === "roo") {
@ -129,11 +126,6 @@ const WelcomeViewProvider = () => {
}
}, [selectedProvider, cloudIsAuthenticated, apiConfiguration, currentApiConfigName])
const handleNoAccount = useCallback(() => {
// Navigate to Provider Selection, defaulting to Roo option
setSelectedProvider("roo")
}, [])
const handleBackToLanding = useCallback(() => {
// Return to the landing screen
setSelectedProvider(null)
@ -299,18 +291,12 @@ const WelcomeViewProvider = () => {
<p className="text-base text-vscode-foreground">
<Trans i18nKey="welcome:landing.introduction" />
</p>
<p className="mb-0 font-semibold">
<Trans i18nKey="welcome:landing.accountMention" />
</p>
</div>
<div className="mt-2 flex gap-2 items-center">
<Button onClick={handleGetStarted} variant="primary">
{t("welcome:landing.getStarted")}
</Button>
<VSCodeLink onClick={handleNoAccount} className="cursor-pointer">
{t("welcome:landing.noAccount")}
</VSCodeLink>
</div>
<div className="absolute bottom-6 left-6">

View file

@ -128,67 +128,34 @@ describe("WelcomeViewProvider", () => {
// Should show introduction
expect(screen.getByTestId("trans-welcome:landing.introduction")).toBeInTheDocument()
// Should show account mention
expect(screen.getByTestId("trans-welcome:landing.accountMention")).toBeInTheDocument()
// Should show "Get Started" button
expect(screen.getByTestId("button-primary")).toBeInTheDocument()
// Should show "no account" link
const noAccountLink = screen
.getAllByTestId("vscode-link")
.find((link) => link.textContent?.includes("welcome:landing.noAccount"))
expect(noAccountLink).toBeInTheDocument()
// Should not show Cloud account CTA copy
expect(screen.queryByTestId("trans-welcome:landing.accountMention")).not.toBeInTheDocument()
})
it("triggers auth when 'Get Started' is clicked on landing", () => {
it("navigates to provider selection when 'Get Started' is clicked on landing", () => {
renderWelcomeViewProvider()
const getStartedButton = screen.getByTestId("button-primary")
fireEvent.click(getStartedButton)
expect(vscode.postMessage).toHaveBeenCalledWith({
type: "rooCloudSignIn",
useProviderSignup: true,
})
})
it("shows auth in progress after clicking 'Get Started' on landing", () => {
renderWelcomeViewProvider()
const getStartedButton = screen.getByTestId("button-primary")
fireEvent.click(getStartedButton)
// Should show progress ring
expect(screen.getByTestId("progress-ring")).toBeInTheDocument()
// Should show waiting heading
expect(screen.getByText(/welcome:waitingForCloud.heading/)).toBeInTheDocument()
})
it("navigates to provider selection when 'no account' is clicked", () => {
renderWelcomeViewProvider()
// Click the "no account" link
const noAccountLink = screen
.getAllByTestId("vscode-link")
.find((link) => link.textContent?.includes("welcome:landing.noAccount"))
fireEvent.click(noAccountLink!)
// Should now show provider selection screen with radio buttons
expect(screen.getByTestId("radio-group")).toBeInTheDocument()
expect(screen.getByTestId("radio-roo")).toBeInTheDocument()
expect(screen.getByTestId("radio-custom")).toBeInTheDocument()
expect(screen.getByTestId("trans-welcome:providerSignup.chooseProvider")).toBeInTheDocument()
expect(vscode.postMessage).not.toHaveBeenCalledWith({
type: "rooCloudSignIn",
useProviderSignup: true,
})
})
})
describe("Provider Selection Screen", () => {
const navigateToProviderSelection = () => {
const noAccountLink = screen
.getAllByTestId("vscode-link")
.find((link) => link.textContent?.includes("welcome:landing.noAccount"))
fireEvent.click(noAccountLink!)
const getStartedButton = screen.getByTestId("button-primary")
fireEvent.click(getStartedButton)
}
it("shows radio buttons for Roo and Custom providers", () => {
@ -275,11 +242,18 @@ describe("WelcomeViewProvider", () => {
})
describe("Auth In Progress State", () => {
const startProviderAuth = () => {
const landingGetStartedButton = screen.getByTestId("button-primary")
fireEvent.click(landingGetStartedButton)
const providerGetStartedButton = screen.getByTestId("button-primary")
fireEvent.click(providerGetStartedButton)
}
it("shows waiting state with progress ring", () => {
renderWelcomeViewProvider()
const getStartedButton = screen.getByTestId("button-primary")
fireEvent.click(getStartedButton)
startProviderAuth()
// Should show progress ring
expect(screen.getByTestId("progress-ring")).toBeInTheDocument()
@ -294,31 +268,24 @@ describe("WelcomeViewProvider", () => {
it("shows Go Back button in waiting state", () => {
renderWelcomeViewProvider()
const getStartedButton = screen.getByTestId("button-primary")
fireEvent.click(getStartedButton)
startProviderAuth()
// Should show secondary button (Go Back)
expect(screen.getByTestId("button-secondary")).toBeInTheDocument()
expect(screen.getByText(/welcome:waitingForCloud.goBack/)).toBeInTheDocument()
})
it("returns to landing screen when Go Back is clicked (auth from landing)", () => {
it("returns to provider selection when Go Back is clicked", () => {
renderWelcomeViewProvider()
// Start auth from landing
const getStartedButton = screen.getByTestId("button-primary")
fireEvent.click(getStartedButton)
// Verify we're in auth progress
expect(screen.getByTestId("progress-ring")).toBeInTheDocument()
startProviderAuth()
// Click Go Back
const goBackButton = screen.getByTestId("button-secondary")
fireEvent.click(goBackButton)
// Should be back on landing screen
expect(screen.getByText(/welcome:landing.greeting/)).toBeInTheDocument()
expect(screen.getByTestId("trans-welcome:landing.introduction")).toBeInTheDocument()
// Should be back on provider selection screen
expect(screen.getByTestId("radio-group")).toBeInTheDocument()
expect(screen.queryByTestId("progress-ring")).not.toBeInTheDocument()
})
@ -326,10 +293,8 @@ describe("WelcomeViewProvider", () => {
renderWelcomeViewProvider({ cloudIsAuthenticated: false })
// Navigate to provider selection
const noAccountLink = screen
.getAllByTestId("vscode-link")
.find((link) => link.textContent?.includes("welcome:landing.noAccount"))
fireEvent.click(noAccountLink!)
const landingGetStartedButton = screen.getByTestId("button-primary")
fireEvent.click(landingGetStartedButton)
// Start auth from provider selection (Roo is selected by default)
const getStartedButton = screen.getByTestId("button-primary")

View file

@ -27,7 +27,6 @@
"switchAccount": "Canviar Compte de Roo Code Cloud",
"upsell": {
"autoApprovePowerUser": "Donant-li una mica d'independència a Roo? Controla'l des de qualsevol lloc amb Roo Code Cloud. <learnMoreLink>Més informació</learnMoreLink>.",
"longRunningTask": "Això pot trigar una estona. Continua des de qualsevol lloc amb Cloud.",
"taskList": "T'agrada Roo? Fes una ullada a Roo Code Cloud: segueix i controla les teves tasques des de qualsevol lloc, executa agents autònoms al núvol, obtén estadístiques d'ús i més. <learnMoreLink>Aprèn-ne més</learnMoreLink>."
"longRunningTask": "Això pot trigar una estona. Continua des de qualsevol lloc amb Cloud."
}
}

View file

@ -16,7 +16,7 @@
"greeting": "Benvingut a Roo Code!",
"introduction": "Amb una gamma de Modes integrats i ampliables, Roo Code et permet planificar, arquitectar, codificar, depurar i augmentar la teva productivitat com mai abans.",
"accountMention": "Per començar, crea el teu compte Roo Code Cloud. Obtén models potents, control web, analítica, suport i molt més.",
"getStarted": "Crea compte Roo",
"getStarted": "Comença",
"noAccount": "o utilitza sense compte"
},
"providerSignup": {

View file

@ -27,7 +27,6 @@
"cloudUrlPillLabel": "Roo Code Cloud URL",
"upsell": {
"autoApprovePowerUser": "Roo etwas Unabhängigkeit geben? Kontrolliere es von überall mit Roo Code Cloud. <learnMoreLink>Mehr erfahren</learnMoreLink>.",
"longRunningTask": "Das könnte eine Weile dauern. Mit Cloud von überall weitermachen.",
"taskList": "Gefällt dir Roo? Schau dir Roo Code Cloud an: Verfolge und steuere deine Aufgaben von überall, führe autonome Cloud-Agenten aus, erhalte Nutzungsstatistiken und mehr. <learnMoreLink>Erfahre mehr</learnMoreLink>."
"longRunningTask": "Das könnte eine Weile dauern. Mit Cloud von überall weitermachen."
}
}

View file

@ -16,7 +16,7 @@
"greeting": "Willkommen bei Roo Code!",
"introduction": "Mit einer Reihe von integrierten und erweiterbaren Modi ermöglicht dir Roo Code, zu planen, zu architektieren, zu coden, zu debuggen und deine Produktivität wie nie zuvor zu steigern.",
"accountMention": "Um zu beginnen, erstelle dein Roo Code Cloud Konto. Erhalte leistungsstarke Modelle, Webkontrolle, Analysen, Support und mehr.",
"getStarted": "Roo-Konto erstellen",
"getStarted": "Loslegen",
"noAccount": "oder ohne Konto verwenden"
},
"providerSignup": {

View file

@ -27,7 +27,6 @@
"createTeamAccount": "Create Team Account",
"upsell": {
"autoApprovePowerUser": "Giving Roo some independence? Control it from anywhere with Roo Code Cloud. <learnMoreLink>Learn more</learnMoreLink>.",
"longRunningTask": "This might take a while. Continue from anywhere with Cloud.",
"taskList": "Enjoying Roo? Check out Roo Code Cloud: follow and control your tasks from anywhere, run autonomous Cloud agents, get usage stats and more. <learnMoreLink>Learn more</learnMoreLink>."
"longRunningTask": "This might take a while. Continue from anywhere with Cloud."
}
}

View file

@ -16,7 +16,7 @@
"greeting": "Welcome to Roo Code!",
"introduction": "With a range of built-in and extensible Modes, Roo Code lets you plan, architect, code, debug and boost your productivity like never before.",
"accountMention": "To get started, create your Roo Code Cloud account. Get powerful models, web control, analytics, support and more.",
"getStarted": "Create Roo Account",
"getStarted": "Get Started",
"noAccount": "or use without an account"
},
"providerSignup": {

View file

@ -27,7 +27,6 @@
"cloudUrlPillLabel": "URL de Roo Code Cloud",
"upsell": {
"autoApprovePowerUser": "¿Dándole a Roo un poco de independencia? Contrólalo desde cualquier lugar con Roo Code Cloud. <learnMoreLink>Saber más</learnMoreLink>.",
"longRunningTask": "Esto podría tardar un poco. Continúa desde cualquier lugar con la Nube.",
"taskList": "¿Disfrutando de Roo? Echa un vistazo a Roo Code Cloud: sigue y controla tus tareas desde cualquier lugar, ejecuta agentes de la Nube autónomos, obtén estadísticas de uso y más. <learnMoreLink>Aprende más</learnMoreLink>."
"longRunningTask": "Esto podría tardar un poco. Continúa desde cualquier lugar con la Nube."
}
}

View file

@ -16,7 +16,7 @@
"greeting": "¡Bienvenido a Roo Code!",
"introduction": "Con una variedad de Modos integrados y extensibles, Roo Code te permite planificar, arquitectar, codificar, depurar y aumentar tu productividad como nunca antes.",
"accountMention": "Para comenzar, crea tu cuenta de Roo Code Cloud. Obtén modelos potentes, control web, análisis, soporte y más.",
"getStarted": "Crear cuenta de Roo",
"getStarted": "Comenzar",
"noAccount": "o usar sin cuenta"
},
"providerSignup": {

View file

@ -27,7 +27,6 @@
"cloudUrlPillLabel": "URL de Roo Code Cloud",
"upsell": {
"autoApprovePowerUser": "Donner à Roo un peu d'indépendance ? Contrôlez-le de n'importe où avec Roo Code Cloud. <learnMoreLink>En savoir plus</learnMoreLink>.",
"longRunningTask": "Cela peut prendre un certain temps. Continuez de n'importe où avec le Cloud.",
"taskList": "Vous appréciez Roo ? Découvrez Roo Code Cloud : suivez et contrôlez vos tâches de n'importe où, exécutez des agents Cloud autonomes, obtenez des statistiques d'utilisation et plus encore. <learnMoreLink>En savoir plus</learnMoreLink>."
"longRunningTask": "Cela peut prendre un certain temps. Continuez de n'importe où avec le Cloud."
}
}

View file

@ -16,7 +16,7 @@
"greeting": "Bienvenue sur Roo Code !",
"introduction": "Avec une gamme de Modes intégrés et extensibles, Roo Code te permet de planifier, architecturer, coder, déboguer et augmenter ta productivité comme jamais auparavant.",
"accountMention": "Pour commencer, crée ton compte Roo Code Cloud. Obtiens des modèles puissants, le contrôle web, les analyses, le support et bien plus encore.",
"getStarted": "Créer un compte Roo",
"getStarted": "Commencer",
"noAccount": "ou utiliser sans compte"
},
"providerSignup": {

View file

@ -27,7 +27,6 @@
"cloudUrlPillLabel": "Roo Code Cloud URL",
"upsell": {
"autoApprovePowerUser": "रू को थोड़ी स्वतंत्रता दे रहे हैं? रू कोड क्लाउड के साथ इसे कहीं से भी नियंत्रित करें। <learnMoreLink>और जानें</learnMoreLink>।",
"longRunningTask": "इसमें थोड़ा समय लग सकता है। क्लाउड के साथ कहीं से भी जारी रखें।",
"taskList": "रू का आनंद ले रहे हैं? रू कोड क्लाउड देखें: कहीं से भी अपने कार्यों का पालन और नियंत्रण करें, स्वायत्त क्लाउड एजेंट चलाएं, उपयोग के आंकड़े प्राप्त करें और बहुत कुछ। <learnMoreLink>और जानें</learnMoreLink>।"
"longRunningTask": "इसमें थोड़ा समय लग सकता है। क्लाउड के साथ कहीं से भी जारी रखें।"
}
}

View file

@ -16,7 +16,7 @@
"greeting": "Roo Code में आपका स्वागत है!",
"introduction": "अंतर्निहित और विस्तारित मोड्स की एक श्रृंखला के साथ, Roo Code आपको पहले कभी न देखे गए तरीके से योजना बनाने, आर्किटेक्ट करने, कोड करने, डीबग करने और अपनी उत्पादकता बढ़ाने की अनुमति देता है।",
"accountMention": "शुरुआत करने के लिए, अपना Roo Code Cloud खाता बनाएं। शक्तिशाली मॉडल, वेब नियंत्रण, विश्लेषण, समर्थन और अधिक प्राप्त करें।",
"getStarted": "Roo खाता बनाएं",
"getStarted": "शुरू करें",
"noAccount": "या बिना खाते के उपयोग करें"
},
"providerSignup": {

View file

@ -27,7 +27,6 @@
"cloudUrlPillLabel": "URL Roo Code Cloud",
"upsell": {
"autoApprovePowerUser": "Memberi Roo sedikit kebebasan? Kendalikan dari mana saja dengan Roo Code Cloud. <learnMoreLink>Pelajari lebih lanjut</learnMoreLink>.",
"longRunningTask": "Ini mungkin akan memakan waktu cukup lama. Lanjutkan dari mana saja dengan Cloud.",
"taskList": "Menikmati Roo? Coba Roo Code Cloud: ikuti dan kendalikan tugas Anda dari mana saja, jalankan agen Cloud otonom, dapatkan statistik penggunaan, dan lainnya. <learnMoreLink>Pelajari lebih lanjut</learnMoreLink>."
"longRunningTask": "Ini mungkin akan memakan waktu cukup lama. Lanjutkan dari mana saja dengan Cloud."
}
}

View file

@ -16,7 +16,7 @@
"greeting": "Selamat datang di Roo Code!",
"introduction": "Dengan berbagai Mode bawaan dan dapat diperluas, Roo Code memungkinkan Anda merencanakan, merancang, coding, debug, dan meningkatkan produktivitas seperti yang belum pernah terjadi sebelumnya.",
"accountMention": "Untuk memulai, buat akun Roo Code Cloud Anda. Dapatkan model yang kuat, kontrol web, analitik, dukungan, dan banyak lagi.",
"getStarted": "Buat Akun Roo",
"getStarted": "Mulai",
"noAccount": "atau gunakan tanpa akun"
},
"providerSignup": {

View file

@ -27,7 +27,6 @@
"cloudUrlPillLabel": "URL di Roo Code Cloud",
"upsell": {
"autoApprovePowerUser": "Vuoi dare un po' di indipendenza a Roo? Controllalo da qualsiasi luogo con Roo Code Cloud. <learnMoreLink>Scopri di più</learnMoreLink>.",
"longRunningTask": "Potrebbe volerci un po' di tempo. Continua da qualsiasi luogo con il Cloud.",
"taskList": "Ti piace Roo? Dai un'occhiata a Roo Code Cloud: segui e controlla le tue attività da qualsiasi luogo, esegui agenti Cloud autonomi, ottieni statistiche di utilizzo e altro ancora. <learnMoreLink>Scopri di più</learnMoreLink>."
"longRunningTask": "Potrebbe volerci un po' di tempo. Continua da qualsiasi luogo con il Cloud."
}
}

View file

@ -16,7 +16,7 @@
"greeting": "Benvenuto in Roo Code!",
"introduction": "Con una gamma di Modalità integrate ed estensibili, Roo Code ti permette di pianificare, architettare, codificare, debuggare e aumentare la tua produttività come mai prima d'ora.",
"accountMention": "Per iniziare, crea il tuo account Roo Code Cloud. Ottieni modelli potenti, controllo web, analitiche, supporto e altro ancora.",
"getStarted": "Crea account Roo",
"getStarted": "Inizia",
"noAccount": "o usa senza account"
},
"providerSignup": {

View file

@ -27,7 +27,6 @@
"cloudUrlPillLabel": "Roo Code Cloud URL",
"upsell": {
"autoApprovePowerUser": "Rooに少し独立性を与えませんかRoo Code Cloudでどこからでもコントロールできます。<learnMoreLink>詳細</learnMoreLink>。",
"longRunningTask": "これには時間がかかるかもしれません。Cloudを使えばどこからでも続けられます。",
"taskList": "Rooを楽しんでいますかRoo Code Cloudをチェックしてくださいどこからでもタスクを追跡および制御し、自律型クラウドエージェントを実行し、使用状況の統計を取得します。<learnMoreLink>詳細</learnMoreLink>。"
"longRunningTask": "これには時間がかかるかもしれません。Cloudを使えばどこからでも続けられます。"
}
}

View file

@ -16,7 +16,7 @@
"greeting": "Roo Codeへようこそ",
"introduction": "組み込みおよび拡張可能なモードを備えたRoo Codeは、計画、アーキテクチャ設計、コーディング、デバッグ、そして今までにない生産性向上を可能にします。",
"accountMention": "始めるには、Roo Code Cloudアカウントを作成してください。強力なモデル、ウェブコントロール、分析、サポート、その他をご利用いただけます。",
"getStarted": "Rooアカウントを作成",
"getStarted": "開始する",
"noAccount": "またはアカウントなしで使用"
},
"providerSignup": {

View file

@ -27,7 +27,6 @@
"cloudUrlPillLabel": "Roo Code Cloud URL",
"upsell": {
"autoApprovePowerUser": "Roo에게 약간의 독립성을 부여하시겠습니까? Roo Code Cloud로 어디서든 제어하세요. <learnMoreLink>더 알아보기</learnMoreLink>.",
"longRunningTask": "시간이 좀 걸릴 수 있습니다. Cloud로 어디서든 계속하세요.",
"taskList": "Roo를 즐기고 계신가요? Roo Code Cloud를 확인해보세요: 어디서든 작업을 추적하고 제어하며, 자율적인 클라우드 에이전트를 실행하고, 사용 통계를 얻는 등 다양한 기능을 제공합니다. <learnMoreLink>더 알아보기</learnMoreLink>."
"longRunningTask": "시간이 좀 걸릴 수 있습니다. Cloud로 어디서든 계속하세요."
}
}

View file

@ -16,7 +16,7 @@
"greeting": "Roo Code에 오신 것을 환영합니다!",
"introduction": "내장 및 확장 가능한 다양한 모드를 통해 Roo Code는 계획, 아키텍처 설계, 코딩, 디버깅 및 전례 없는 생산성 향상을 가능하게 합니다.",
"accountMention": "시작하려면 Roo Code Cloud 계정을 만드세요. 강력한 모델, 웹 제어, 분석, 지원 등을 얻으세요.",
"getStarted": "Roo 계정 만들기",
"getStarted": "시작하기",
"noAccount": "또는 계정 없이 사용하기"
},
"providerSignup": {

View file

@ -27,7 +27,6 @@
"cloudUrlPillLabel": "Roo Code Cloud URL",
"upsell": {
"autoApprovePowerUser": "Roo wat onafhankelijkheid geven? Bedien het overal met Roo Code Cloud. <learnMoreLink>Meer informatie</learnMoreLink>.",
"longRunningTask": "Dit kan even duren. Ga overal verder met de Cloud.",
"taskList": "Geniet je van Roo? Bekijk Roo Code Cloud: volg en beheer je taken overal, voer autonome Cloud-agents uit, krijg gebruiksstatistieken en meer. <learnMoreLink>Meer informatie</learnMoreLink>."
"longRunningTask": "Dit kan even duren. Ga overal verder met de Cloud."
}
}

View file

@ -16,7 +16,7 @@
"greeting": "Welkom bij Roo Code!",
"introduction": "Met een reeks ingebouwde en uitbreidbare Modi laat Roo Code je plannen, ontwerpen, coderen, debuggen en je productiviteit verhogen als nooit tevoren.",
"accountMention": "Maak je Roo Code Cloud-account aan om te beginnen. Krijg krachtige modellen, webcontrole, analyses, ondersteuning en meer.",
"getStarted": "Roo-account aanmaken",
"getStarted": "Aan de slag",
"noAccount": "of gebruik zonder account"
},
"providerSignup": {

View file

@ -27,7 +27,6 @@
"cloudUrlPillLabel": "URL Roo Code Cloud",
"upsell": {
"autoApprovePowerUser": "Dać Roo trochę niezależności? Kontroluj go z dowolnego miejsca dzięki Roo Code Cloud. <learnMoreLink>Dowiedz się więcej</learnMoreLink>.",
"longRunningTask": "To może chwilę potrwać. Kontynuuj z dowolnego miejsca dzięki Chmurze.",
"taskList": "Podoba ci się Roo? Sprawdź Roo Code Cloud: śledź i kontroluj swoje zadania z dowolnego miejsca, uruchamiaj autonomiczne agenty w chmurze, uzyskuj statystyki użytkowania i wiele więcej. <learnMoreLink>Dowiedz się więcej</learnMoreLink>."
"longRunningTask": "To może chwilę potrwać. Kontynuuj z dowolnego miejsca dzięki Chmurze."
}
}

View file

@ -16,7 +16,7 @@
"greeting": "Witaj w Roo Code!",
"introduction": "Dzięki szerokiej gamie wbudowanych i rozszerzalnych Trybów, Roo Code pozwala planować, projektować architekturę, kodować, debugować i zwiększać produktywność jak nigdy dotąd.",
"accountMention": "Aby rozpocząć, utwórz konto Roo Code Cloud. Otrzymaj potężne modele, kontrolę internetową, analizę, wsparcie i wiele więcej.",
"getStarted": "Utwórz konto Roo",
"getStarted": "Rozpocznij",
"noAccount": "lub używaj bez konta"
},
"providerSignup": {

View file

@ -27,7 +27,6 @@
"cloudUrlPillLabel": "URL do Roo Code Cloud ",
"upsell": {
"autoApprovePowerUser": "Dando um pouco de independência ao Roo? Controle-o de qualquer lugar com o Roo Code Cloud. <learnMoreLink>Saiba mais</learnMoreLink>.",
"longRunningTask": "Isso pode levar um tempo. Continue de qualquer lugar com a Nuvem.",
"taskList": "Gostando do Roo? Confira o Roo Code Cloud: acompanhe e controle suas tarefas de qualquer lugar, execute agentes de nuvem autônomos, obtenha estatísticas de uso e muito mais. <learnMoreLink>Saiba mais</learnMoreLink>."
"longRunningTask": "Isso pode levar um tempo. Continue de qualquer lugar com a Nuvem."
}
}

View file

@ -16,7 +16,7 @@
"greeting": "Bem-vindo ao Roo Code!",
"introduction": "Com uma variedade de Modos integrados e extensíveis, o Roo Code permite que você planeje, arquitete, codifique, depure e aumente sua produtividade como nunca antes.",
"accountMention": "Para começar, crie sua conta Roo Code Cloud. Obtenha modelos poderosos, controle na web, análises, suporte e muito mais.",
"getStarted": "Criar conta Roo",
"getStarted": "Começar",
"noAccount": "ou usar sem conta"
},
"providerSignup": {

View file

@ -27,7 +27,6 @@
"cloudUrlPillLabel": "URL Roo Code Cloud",
"upsell": {
"autoApprovePowerUser": "Предоставить Roo немного независимости? Управляйте им из любого места с помощью Roo Code Cloud. <learnMoreLink>Узнать больше</learnMoreLink>.",
"longRunningTask": "Это может занять некоторое время. Продолжайте из любого места с помощью Облака.",
"taskList": "Нравится Roo? Посмотрите Roo Code Cloud: отслеживайте и контролируйте свои задачи из любого места, запускайте автономных облачных агентов, получайте статистику использования и многое другое. <learnMoreLink>Узнать больше</learnMoreLink>."
"longRunningTask": "Это может занять некоторое время. Продолжайте из любого места с помощью Облака."
}
}

View file

@ -16,7 +16,7 @@
"greeting": "Добро пожаловать в Roo Code!",
"introduction": "С набором встроенных и расширяемых Режимов, Roo Code позволяет вам планировать, проектировать, писать код, отлаживать и повышать продуктивность как никогда раньше.",
"accountMention": "Для начала создайте свой аккаунт Roo Code Cloud. Получите мощные модели, веб-управление, аналитику, поддержку и многое другое.",
"getStarted": "Создать аккаунт Roo",
"getStarted": "Начать",
"noAccount": "или использовать без аккаунта"
},
"providerSignup": {

View file

@ -27,7 +27,6 @@
"cloudUrlPillLabel": "Roo Code Cloud URL'si",
"upsell": {
"autoApprovePowerUser": "Roo'ya biraz bağımsızlık mı veriyorsunuz? Roo Code Cloud ile onu her yerden kontrol edin. <learnMoreLink>Daha fazla bilgi edinin</learnMoreLink>.",
"longRunningTask": "Bu biraz zaman alabilir. Bulut ile her yerden devam edin.",
"taskList": "Roo'dan memnun musunuz? Roo Code Cloud'a göz atın: görevlerinizi her yerden takip edin ve kontrol edin, otonom Bulut ajanlarını çalıştırın, kullanım istatistikleri alın ve daha fazlasını yapın. <learnMoreLink>Daha fazla bilgi edinin</learnMoreLink>."
"longRunningTask": "Bu biraz zaman alabilir. Bulut ile her yerden devam edin."
}
}

View file

@ -16,7 +16,7 @@
"greeting": "Roo Code'a Hoş Geldin!",
"introduction": "Yerleşik ve genişletilebilir Modlar yelpazesiyle Roo Code, daha önce hiç olmadığı gibi planlama, mimari tasarım, kodlama, hata ayıklama ve üretkenliğini artırmanı sağlar.",
"accountMention": "Başlamak için Roo Code Cloud hesabını oluştur. Güçlü modeller, web kontrolü, analizler, destek ve daha fazlasını al.",
"getStarted": "Roo Hesabı Oluştur",
"getStarted": "Başla",
"noAccount": "veya hesap olmadan kullan"
},
"providerSignup": {

View file

@ -27,7 +27,6 @@
"cloudUrlPillLabel": "URL Roo Code Cloud",
"upsell": {
"autoApprovePowerUser": "Trao cho Roo một chút độc lập? Kiểm soát nó từ mọi nơi với Roo Code Cloud. <learnMoreLink>Tìm hiểu thêm</learnMoreLink>.",
"longRunningTask": "Việc này có thể mất một lúc. Tiếp tục từ mọi nơi với Cloud.",
"taskList": "Bạn có thích Roo không? Hãy xem Roo Code Cloud: theo dõi và kiểm soát các tác vụ của bạn từ mọi nơi, chạy các agent đám mây tự trị, nhận số liệu thống kê sử dụng và hơn thế nữa. <learnMoreLink>Tìm hiểu thêm</learnMoreLink>."
"longRunningTask": "Việc này có thể mất một lúc. Tiếp tục từ mọi nơi với Cloud."
}
}

View file

@ -16,7 +16,7 @@
"greeting": "Chào mừng đến với Roo Code!",
"introduction": "Với nhiều Chế độ tích hợp và có thể mở rộng, Roo Code cho phép bạn lập kế hoạch, thiết kế kiến trúc, viết mã, gỡ lỗi và tăng năng suất như chưa từng có trước đây.",
"accountMention": "Để bắt đầu, hãy tạo tài khoản Roo Code Cloud của bạn. Nhận các mô hình mạnh mẽ, kiểm soát web, phân tích, hỗ trợ và hơn thế nữa.",
"getStarted": "Tạo tài khoản Roo",
"getStarted": "Bắt đầu",
"noAccount": "hoặc sử dụng mà không có tài khoản"
},
"providerSignup": {

View file

@ -27,7 +27,6 @@
"cloudUrlPillLabel": "Roo Code Cloud URL",
"upsell": {
"autoApprovePowerUser": "给 Roo 一些独立性?使用 Roo Code Cloud 从任何地方控制它。 <learnMoreLink>了解更多</learnMoreLink>。",
"longRunningTask": "这可能需要一段时间。使用 Cloud 从任何地方继续。",
"taskList": "喜欢Roo吗快来看看Roo Code Cloud随时随地关注和控制您的任务运行自主云代理获取使用统计数据等等。 <learnMoreLink>了解更多</learnMoreLink>。"
"longRunningTask": "这可能需要一段时间。使用 Cloud 从任何地方继续。"
}
}

View file

@ -16,7 +16,7 @@
"greeting": "欢迎使用 Roo Code",
"introduction": "通过一系列内置和可扩展的模式Roo Code 让你能够以前所未有的方式进行规划、架构设计、编码、调试并提升工作效率。",
"accountMention": "开始使用,创建你的 Roo Code Cloud 账户。获得强大模型、网络控制、分析、支持等。",
"getStarted": "创建 Roo 账户",
"getStarted": "开始使用",
"noAccount": "或不使用账户"
},
"providerSignup": {

View file

@ -27,7 +27,6 @@
"cloudUrlPillLabel": "Roo Code Cloud URL",
"upsell": {
"autoApprovePowerUser": "給 Roo 一點獨立性?使用 Roo Code Cloud 隨時隨地掌控工作進度。<learnMoreLink>了解更多</learnMoreLink>。",
"longRunningTask": "這可能需要一些時間。使用雲端隨時隨地繼續。",
"taskList": "喜歡 Roo 嗎?快來看看 Roo Code Cloud隨時隨地追蹤和控制您的任務執行自主雲端代理取得使用統計資料等等。<learnMoreLink>了解更多</learnMoreLink>。"
"longRunningTask": "這可能需要一些時間。使用雲端隨時隨地繼續。"
}
}

View file

@ -16,7 +16,7 @@
"greeting": "歡迎使用 Roo Code",
"introduction": "Roo Code 提供一系列內建和可擴充的模式,讓您以前所未有的方式規劃專案、設計架構、編寫程式碼、除錯並提升工作效率。",
"accountMention": "開始使用,請建立您的 Roo Code Cloud 帳戶。取得強大的模型、網路控制、分析、支援等功能。",
"getStarted": "建立 Roo 帳戶",
"getStarted": "開始使用",
"noAccount": "或不使用帳戶"
},
"providerSignup": {