diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts index 6ad1864064e4..8b872599bce8 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -2251,6 +2251,48 @@ export const webviewMessageHandler = async ( break } + case "rooCloudManualUrl": { + try { + if (!message.text) { + vscode.window.showErrorMessage(t("common:errors.manual_url_empty")) + break + } + + // Parse the callback URL to extract parameters + const callbackUrl = message.text.trim() + const uri = vscode.Uri.parse(callbackUrl) + + if (!uri.query) { + throw new Error(t("common:errors.manual_url_no_query")) + } + + const query = new URLSearchParams(uri.query) + const code = query.get("code") + const state = query.get("state") + const organizationId = query.get("organizationId") + + if (!code || !state) { + throw new Error(t("common:errors.manual_url_missing_params")) + } + + // Reuse the existing authentication flow + await CloudService.instance.handleAuthCallback( + code, + state, + organizationId === "null" ? null : organizationId, + ) + + await provider.postStateToWebview() + } catch (error) { + provider.log(`ManualUrl#handleAuthCallback failed: ${error}`) + const errorMessage = error instanceof Error ? error.message : t("common:errors.manual_url_auth_failed") + + // Show error message through VS Code UI + vscode.window.showErrorMessage(`${t("common:errors.manual_url_auth_error")}: ${errorMessage}`) + } + + break + } case "saveCodeIndexSettingsAtomic": { if (!message.codeIndexSettings) { diff --git a/src/i18n/locales/ca/common.json b/src/i18n/locales/ca/common.json index 583f82693a6a..379b0d2311f3 100644 --- a/src/i18n/locales/ca/common.json +++ b/src/i18n/locales/ca/common.json @@ -110,6 +110,11 @@ "api": { "invalidKeyInvalidChars": "La clau API conté caràcters no vàlids." }, + "manual_url_empty": "Si us plau, introdueix una URL de callback vàlida", + "manual_url_no_query": "URL de callback no vàlida: falten paràmetres de consulta", + "manual_url_missing_params": "URL de callback no vàlida: falten paràmetres requerits (code i state)", + "manual_url_auth_failed": "Autenticació manual per URL ha fallat", + "manual_url_auth_error": "Autenticació fallida", "mode_import_failed": "Ha fallat la importació del mode: {{error}}" }, "warnings": { @@ -193,6 +198,11 @@ "errors": { "cloud_auth_required": "La teva organització requereix autenticació de Roo Code Cloud. Si us plau, inicia sessió per continuar.", "organization_mismatch": "Has d'estar autenticat amb el compte de Roo Code Cloud de la teva organització.", + "manual_url_empty": "Si us plau, introdueix una URL de callback vàlida", + "manual_url_no_query": "URL de callback no vàlida: falten paràmetres de consulta", + "manual_url_missing_params": "URL de callback no vàlida: falten paràmetres requerits (code i state)", + "manual_url_auth_failed": "Autenticació manual per URL ha fallat", + "manual_url_auth_error": "Autenticació fallida", "verification_failed": "No s'ha pogut verificar l'autenticació de l'organització." }, "info": { diff --git a/src/i18n/locales/de/common.json b/src/i18n/locales/de/common.json index 2d1a2778edcf..1d52866e8379 100644 --- a/src/i18n/locales/de/common.json +++ b/src/i18n/locales/de/common.json @@ -106,7 +106,12 @@ }, "api": { "invalidKeyInvalidChars": "API-Schlüssel enthält ungültige Zeichen." - } + }, + "manual_url_empty": "Bitte gib eine gültige Callback-URL ein", + "manual_url_no_query": "Ungültige Callback-URL: Query-Parameter fehlen", + "manual_url_missing_params": "Ungültige Callback-URL: erforderliche Parameter (code und state) fehlen", + "manual_url_auth_failed": "Manuelle URL-Authentifizierung fehlgeschlagen", + "manual_url_auth_error": "Authentifizierung fehlgeschlagen" }, "warnings": { "no_terminal_content": "Kein Terminal-Inhalt ausgewählt", diff --git a/src/i18n/locales/en/common.json b/src/i18n/locales/en/common.json index 40a897ceb312..2ff203bbb5e5 100644 --- a/src/i18n/locales/en/common.json +++ b/src/i18n/locales/en/common.json @@ -106,7 +106,12 @@ }, "api": { "invalidKeyInvalidChars": "API key contains invalid characters." - } + }, + "manual_url_empty": "Please enter a valid callback URL", + "manual_url_no_query": "Invalid callback URL: missing query parameters", + "manual_url_missing_params": "Invalid callback URL: missing required parameters (code and state)", + "manual_url_auth_failed": "Manual URL authentication failed", + "manual_url_auth_error": "Authentication failed" }, "warnings": { "no_terminal_content": "No terminal content selected", diff --git a/src/i18n/locales/es/common.json b/src/i18n/locales/es/common.json index 0b7c7e12ee8f..f80efa1a95d4 100644 --- a/src/i18n/locales/es/common.json +++ b/src/i18n/locales/es/common.json @@ -106,7 +106,12 @@ }, "api": { "invalidKeyInvalidChars": "La clave API contiene caracteres inválidos." - } + }, + "manual_url_empty": "Por favor, introduce una URL de callback válida", + "manual_url_no_query": "URL de callback inválida: faltan parámetros de consulta", + "manual_url_missing_params": "URL de callback inválida: faltan parámetros requeridos (code y state)", + "manual_url_auth_failed": "Autenticación manual por URL falló", + "manual_url_auth_error": "Error de autenticación" }, "warnings": { "no_terminal_content": "No hay contenido de terminal seleccionado", diff --git a/src/i18n/locales/fr/common.json b/src/i18n/locales/fr/common.json index 9b92cf7240c8..ecc0423e36bb 100644 --- a/src/i18n/locales/fr/common.json +++ b/src/i18n/locales/fr/common.json @@ -106,7 +106,12 @@ }, "api": { "invalidKeyInvalidChars": "La clé API contient des caractères invalides." - } + }, + "manual_url_empty": "Veuillez entrer une URL de callback valide", + "manual_url_no_query": "URL de callback invalide : paramètres de requête manquants", + "manual_url_missing_params": "URL de callback invalide : paramètres requis manquants (code et state)", + "manual_url_auth_failed": "Authentification par URL manuelle échouée", + "manual_url_auth_error": "Échec de l'authentification" }, "warnings": { "no_terminal_content": "Aucun contenu de terminal sélectionné", @@ -193,6 +198,11 @@ "errors": { "cloud_auth_required": "Votre organisation nécessite une authentification Roo Code Cloud. Veuillez vous connecter pour continuer.", "organization_mismatch": "Vous devez être authentifié avec le compte Roo Code Cloud de votre organisation.", + "manual_url_empty": "Veuillez entrer une URL de callback valide", + "manual_url_no_query": "URL de callback invalide : paramètres de requête manquants", + "manual_url_missing_params": "URL de callback invalide : paramètres requis manquants (code et state)", + "manual_url_auth_failed": "Authentification par URL manuelle échouée", + "manual_url_auth_error": "Échec de l'authentification", "verification_failed": "Impossible de vérifier l'authentification de l'organisation." }, "info": { diff --git a/src/i18n/locales/hi/common.json b/src/i18n/locales/hi/common.json index f9bbed0dfcab..90dcb125d288 100644 --- a/src/i18n/locales/hi/common.json +++ b/src/i18n/locales/hi/common.json @@ -106,7 +106,12 @@ }, "api": { "invalidKeyInvalidChars": "API कुंजी में अमान्य वर्ण हैं।" - } + }, + "manual_url_empty": "कृपया एक वैध callback URL दर्ज करें", + "manual_url_no_query": "अवैध callback URL: क्वेरी पैरामीटर गुम हैं", + "manual_url_missing_params": "अवैध callback URL: आवश्यक पैरामीटर गुम हैं (code और state)", + "manual_url_auth_failed": "मैनुअल URL प्रमाणीकरण असफल", + "manual_url_auth_error": "प्रमाणीकरण असफल" }, "warnings": { "no_terminal_content": "कोई टर्मिनल सामग्री चयनित नहीं", @@ -193,6 +198,11 @@ "errors": { "cloud_auth_required": "आपके संगठन को Roo Code Cloud प्रमाणीकरण की आवश्यकता है। कृपया जारी रखने के लिए साइन इन करें।", "organization_mismatch": "आपको अपने संगठन के Roo Code Cloud खाते से प्रमाणित होना होगा।", + "manual_url_empty": "कृपया एक वैध callback URL दर्ज करें", + "manual_url_no_query": "अवैध callback URL: क्वेरी पैरामीटर गुम हैं", + "manual_url_missing_params": "अवैध callback URL: आवश्यक पैरामीटर गुम हैं (code और state)", + "manual_url_auth_failed": "मैनुअल URL प्रमाणीकरण असफल", + "manual_url_auth_error": "प्रमाणीकरण असफल", "verification_failed": "संगठन प्रमाणीकरण सत्यापित करने में असमर्थ।" }, "info": { diff --git a/src/i18n/locales/id/common.json b/src/i18n/locales/id/common.json index 147d88c4e74e..e6b9d4f53631 100644 --- a/src/i18n/locales/id/common.json +++ b/src/i18n/locales/id/common.json @@ -106,7 +106,12 @@ }, "api": { "invalidKeyInvalidChars": "Kunci API mengandung karakter tidak valid." - } + }, + "manual_url_empty": "Silakan masukkan URL callback yang valid", + "manual_url_no_query": "URL callback tidak valid: parameter query hilang", + "manual_url_missing_params": "URL callback tidak valid: parameter yang diperlukan hilang (code dan state)", + "manual_url_auth_failed": "Autentikasi URL manual gagal", + "manual_url_auth_error": "Autentikasi gagal" }, "warnings": { "no_terminal_content": "Tidak ada konten terminal yang dipilih", @@ -193,6 +198,11 @@ "errors": { "cloud_auth_required": "Organisasi kamu memerlukan autentikasi Roo Code Cloud. Silakan masuk untuk melanjutkan.", "organization_mismatch": "Kamu harus diautentikasi dengan akun Roo Code Cloud organisasi kamu.", + "manual_url_empty": "Silakan masukkan URL callback yang valid", + "manual_url_no_query": "URL callback tidak valid: parameter query hilang", + "manual_url_missing_params": "URL callback tidak valid: parameter yang diperlukan hilang (code dan state)", + "manual_url_auth_failed": "Autentikasi URL manual gagal", + "manual_url_auth_error": "Autentikasi gagal", "verification_failed": "Tidak dapat memverifikasi autentikasi organisasi." }, "info": { diff --git a/src/i18n/locales/it/common.json b/src/i18n/locales/it/common.json index c304896163e8..4b235ab54bc0 100644 --- a/src/i18n/locales/it/common.json +++ b/src/i18n/locales/it/common.json @@ -106,7 +106,12 @@ }, "api": { "invalidKeyInvalidChars": "La chiave API contiene caratteri non validi." - } + }, + "manual_url_empty": "Inserisci un URL di callback valido", + "manual_url_no_query": "URL di callback non valido: parametri di query mancanti", + "manual_url_missing_params": "URL di callback non valido: parametri richiesti mancanti (code e state)", + "manual_url_auth_failed": "Autenticazione manuale tramite URL fallita", + "manual_url_auth_error": "Autenticazione fallita" }, "warnings": { "no_terminal_content": "Nessun contenuto del terminale selezionato", @@ -193,6 +198,11 @@ "errors": { "cloud_auth_required": "La tua organizzazione richiede l'autenticazione Roo Code Cloud. Accedi per continuare.", "organization_mismatch": "Devi essere autenticato con l'account Roo Code Cloud della tua organizzazione.", + "manual_url_empty": "Inserisci un URL di callback valido", + "manual_url_no_query": "URL di callback non valido: parametri di query mancanti", + "manual_url_missing_params": "URL di callback non valido: parametri richiesti mancanti (code e state)", + "manual_url_auth_failed": "Autenticazione manuale tramite URL fallita", + "manual_url_auth_error": "Autenticazione fallita", "verification_failed": "Impossibile verificare l'autenticazione dell'organizzazione." }, "info": { diff --git a/src/i18n/locales/ja/common.json b/src/i18n/locales/ja/common.json index 3f2863510814..bf023eca37e7 100644 --- a/src/i18n/locales/ja/common.json +++ b/src/i18n/locales/ja/common.json @@ -106,7 +106,12 @@ }, "api": { "invalidKeyInvalidChars": "APIキーに無効な文字が含まれています。" - } + }, + "manual_url_empty": "有効なコールバック URL を入力してください", + "manual_url_no_query": "無効なコールバック URL:クエリパラメータがありません", + "manual_url_missing_params": "無効なコールバック URL:必要なパラメータ(code と state)がありません", + "manual_url_auth_failed": "手動 URL 認証が失敗しました", + "manual_url_auth_error": "認証に失敗しました" }, "warnings": { "no_terminal_content": "選択されたターミナルコンテンツがありません", @@ -193,6 +198,11 @@ "errors": { "cloud_auth_required": "あなたの組織では Roo Code Cloud 認証が必要です。続行するにはサインインしてください。", "organization_mismatch": "組織の Roo Code Cloud アカウントで認証する必要があります。", + "manual_url_empty": "有効なコールバック URL を入力してください", + "manual_url_no_query": "無効なコールバック URL:クエリパラメータがありません", + "manual_url_missing_params": "無効なコールバック URL:必要なパラメータ(code と state)がありません", + "manual_url_auth_failed": "手動 URL 認証が失敗しました", + "manual_url_auth_error": "認証に失敗しました", "verification_failed": "組織認証の確認ができませんでした。" }, "info": { diff --git a/src/i18n/locales/ko/common.json b/src/i18n/locales/ko/common.json index d1f2ef9c44ad..33ae49ef2a9f 100644 --- a/src/i18n/locales/ko/common.json +++ b/src/i18n/locales/ko/common.json @@ -106,7 +106,12 @@ }, "api": { "invalidKeyInvalidChars": "API 키에 유효하지 않은 문자가 포함되어 있습니다." - } + }, + "manual_url_empty": "유효한 콜백 URL을 입력하세요", + "manual_url_no_query": "유효하지 않은 콜백 URL: 쿼리 매개변수 누락", + "manual_url_missing_params": "유효하지 않은 콜백 URL: 필요한 매개변수 누락 (code와 state)", + "manual_url_auth_failed": "수동 URL 인증 실패", + "manual_url_auth_error": "인증 실패" }, "warnings": { "no_terminal_content": "선택된 터미널 내용이 없습니다", @@ -193,6 +198,11 @@ "errors": { "cloud_auth_required": "조직에서 Roo Code Cloud 인증이 필요합니다. 계속하려면 로그인하세요.", "organization_mismatch": "조직의 Roo Code Cloud 계정으로 인증해야 합니다.", + "manual_url_empty": "유효한 콜백 URL을 입력하세요", + "manual_url_no_query": "유효하지 않은 콜백 URL: 쿼리 매개변수 누락", + "manual_url_missing_params": "유효하지 않은 콜백 URL: 필요한 매개변수 누락 (code와 state)", + "manual_url_auth_failed": "수동 URL 인증 실패", + "manual_url_auth_error": "인증 실패", "verification_failed": "조직 인증을 확인할 수 없습니다." }, "info": { diff --git a/src/i18n/locales/nl/common.json b/src/i18n/locales/nl/common.json index a2b29d8df03c..8c4526889b61 100644 --- a/src/i18n/locales/nl/common.json +++ b/src/i18n/locales/nl/common.json @@ -106,7 +106,12 @@ }, "api": { "invalidKeyInvalidChars": "API-sleutel bevat ongeldige karakters." - } + }, + "manual_url_empty": "Voer een geldige callback-URL in", + "manual_url_no_query": "Ongeldige callback-URL: query-parameters ontbreken", + "manual_url_missing_params": "Ongeldige callback-URL: vereiste parameters ontbreken (code en state)", + "manual_url_auth_failed": "Handmatige URL-authenticatie mislukt", + "manual_url_auth_error": "Authenticatie mislukt" }, "warnings": { "no_terminal_content": "Geen terminalinhoud geselecteerd", @@ -193,6 +198,11 @@ "errors": { "cloud_auth_required": "Je organisatie vereist Roo Code Cloud-authenticatie. Log in om door te gaan.", "organization_mismatch": "Je moet geauthenticeerd zijn met het Roo Code Cloud-account van je organisatie.", + "manual_url_empty": "Voer een geldige callback-URL in", + "manual_url_no_query": "Ongeldige callback-URL: query-parameters ontbreken", + "manual_url_missing_params": "Ongeldige callback-URL: vereiste parameters ontbreken (code en state)", + "manual_url_auth_failed": "Handmatige URL-authenticatie mislukt", + "manual_url_auth_error": "Authenticatie mislukt", "verification_failed": "Kan organisatie-authenticatie niet verifiëren." }, "info": { diff --git a/src/i18n/locales/pl/common.json b/src/i18n/locales/pl/common.json index 45e0651fac6e..35a09be166a8 100644 --- a/src/i18n/locales/pl/common.json +++ b/src/i18n/locales/pl/common.json @@ -106,7 +106,12 @@ }, "api": { "invalidKeyInvalidChars": "Klucz API zawiera nieprawidłowe znaki." - } + }, + "manual_url_empty": "Wprowadź prawidłowy URL callback", + "manual_url_no_query": "Nieprawidłowy URL callback: brak parametrów zapytania", + "manual_url_missing_params": "Nieprawidłowy URL callback: brak wymaganych parametrów (code i state)", + "manual_url_auth_failed": "Ręczne uwierzytelnienie URL nie powiodło się", + "manual_url_auth_error": "Uwierzytelnienie nie powiodło się" }, "warnings": { "no_terminal_content": "Nie wybrano zawartości terminala", @@ -193,6 +198,11 @@ "errors": { "cloud_auth_required": "Twoja organizacja wymaga uwierzytelnienia Roo Code Cloud. Zaloguj się, aby kontynuować.", "organization_mismatch": "Musisz być uwierzytelniony kontem Roo Code Cloud swojej organizacji.", + "manual_url_empty": "Wprowadź prawidłowy URL callback", + "manual_url_no_query": "Nieprawidłowy URL callback: brak parametrów zapytania", + "manual_url_missing_params": "Nieprawidłowy URL callback: brak wymaganych parametrów (code i state)", + "manual_url_auth_failed": "Ręczne uwierzytelnienie URL nie powiodło się", + "manual_url_auth_error": "Uwierzytelnienie nie powiodło się", "verification_failed": "Nie można zweryfikować uwierzytelnienia organizacji." }, "info": { diff --git a/src/i18n/locales/pt-BR/common.json b/src/i18n/locales/pt-BR/common.json index 001457707e02..4d687019ff4d 100644 --- a/src/i18n/locales/pt-BR/common.json +++ b/src/i18n/locales/pt-BR/common.json @@ -110,7 +110,12 @@ }, "api": { "invalidKeyInvalidChars": "A chave API contém caracteres inválidos." - } + }, + "manual_url_empty": "Por favor, insira uma URL de callback válida", + "manual_url_no_query": "URL de callback inválida: parâmetros de consulta ausentes", + "manual_url_missing_params": "URL de callback inválida: parâmetros obrigatórios ausentes (code e state)", + "manual_url_auth_failed": "Autenticação manual por URL falhou", + "manual_url_auth_error": "Falha na autenticação" }, "warnings": { "no_terminal_content": "Nenhum conteúdo do terminal selecionado", @@ -193,6 +198,11 @@ "errors": { "cloud_auth_required": "Sua organização requer autenticação do Roo Code Cloud. Faça login para continuar.", "organization_mismatch": "Você deve estar autenticado com a conta Roo Code Cloud da sua organização.", + "manual_url_empty": "Por favor, insira uma URL de callback válida", + "manual_url_no_query": "URL de callback inválida: parâmetros de consulta ausentes", + "manual_url_missing_params": "URL de callback inválida: parâmetros obrigatórios ausentes (code e state)", + "manual_url_auth_failed": "Autenticação manual por URL falhou", + "manual_url_auth_error": "Falha na autenticação", "verification_failed": "Não foi possível verificar a autenticação da organização." }, "info": { diff --git a/src/i18n/locales/ru/common.json b/src/i18n/locales/ru/common.json index 3500a9a5add6..df864815fab8 100644 --- a/src/i18n/locales/ru/common.json +++ b/src/i18n/locales/ru/common.json @@ -106,7 +106,12 @@ }, "api": { "invalidKeyInvalidChars": "API-ключ содержит недопустимые символы." - } + }, + "manual_url_empty": "Введи действительный URL обратного вызова", + "manual_url_no_query": "Недействительный URL обратного вызова: отсутствуют параметры запроса", + "manual_url_missing_params": "Недействительный URL обратного вызова: отсутствуют обязательные параметры (code и state)", + "manual_url_auth_failed": "Ручная аутентификация по URL не удалась", + "manual_url_auth_error": "Аутентификация не удалась" }, "warnings": { "no_terminal_content": "Не выбрано содержимое терминала", @@ -193,6 +198,11 @@ "errors": { "cloud_auth_required": "Ваша организация требует аутентификации Roo Code Cloud. Войдите в систему, чтобы продолжить.", "organization_mismatch": "Вы должны быть аутентифицированы с учетной записью Roo Code Cloud вашей организации.", + "manual_url_empty": "Введи действительный URL обратного вызова", + "manual_url_no_query": "Недействительный URL обратного вызова: отсутствуют параметры запроса", + "manual_url_missing_params": "Недействительный URL обратного вызова: отсутствуют обязательные параметры (code и state)", + "manual_url_auth_failed": "Ручная аутентификация по URL не удалась", + "manual_url_auth_error": "Аутентификация не удалась", "verification_failed": "Не удается проверить аутентификацию организации." }, "info": { diff --git a/src/i18n/locales/tr/common.json b/src/i18n/locales/tr/common.json index 4089cff21765..5735d7f1ca9f 100644 --- a/src/i18n/locales/tr/common.json +++ b/src/i18n/locales/tr/common.json @@ -106,7 +106,12 @@ }, "api": { "invalidKeyInvalidChars": "API anahtarı geçersiz karakterler içeriyor." - } + }, + "manual_url_empty": "Lütfen geçerli bir callback URL'si girin", + "manual_url_no_query": "Geçersiz callback URL'si: sorgu parametreleri eksik", + "manual_url_missing_params": "Geçersiz callback URL'si: gerekli parametreler eksik (code ve state)", + "manual_url_auth_failed": "Manuel URL kimlik doğrulama başarısız", + "manual_url_auth_error": "Kimlik doğrulama başarısız" }, "warnings": { "no_terminal_content": "Seçili terminal içeriği yok", @@ -193,6 +198,11 @@ "errors": { "cloud_auth_required": "Kuruluşunuz Roo Code Cloud kimlik doğrulaması gerektiriyor. Devam etmek için giriş yapın.", "organization_mismatch": "Kuruluşunuzun Roo Code Cloud hesabıyla kimlik doğrulaması yapmalısınız.", + "manual_url_empty": "Lütfen geçerli bir callback URL'si girin", + "manual_url_no_query": "Geçersiz callback URL'si: sorgu parametreleri eksik", + "manual_url_missing_params": "Geçersiz callback URL'si: gerekli parametreler eksik (code ve state)", + "manual_url_auth_failed": "Manuel URL kimlik doğrulama başarısız", + "manual_url_auth_error": "Kimlik doğrulama başarısız", "verification_failed": "Kuruluş kimlik doğrulaması doğrulanamıyor." }, "info": { diff --git a/src/i18n/locales/vi/common.json b/src/i18n/locales/vi/common.json index ecf686f520e0..d11f91f29457 100644 --- a/src/i18n/locales/vi/common.json +++ b/src/i18n/locales/vi/common.json @@ -106,7 +106,12 @@ }, "api": { "invalidKeyInvalidChars": "Khóa API chứa ký tự không hợp lệ." - } + }, + "manual_url_empty": "Vui lòng nhập URL callback hợp lệ", + "manual_url_no_query": "URL callback không hợp lệ: thiếu tham số truy vấn", + "manual_url_missing_params": "URL callback không hợp lệ: thiếu tham số bắt buộc (code và state)", + "manual_url_auth_failed": "Xác thực URL thủ công thất bại", + "manual_url_auth_error": "Xác thực thất bại" }, "warnings": { "no_terminal_content": "Không có nội dung terminal được chọn", @@ -193,6 +198,11 @@ "errors": { "cloud_auth_required": "Tổ chức của bạn yêu cầu xác thực Roo Code Cloud. Vui lòng đăng nhập để tiếp tục.", "organization_mismatch": "Bạn phải được xác thực bằng tài khoản Roo Code Cloud của tổ chức.", + "manual_url_empty": "Vui lòng nhập URL callback hợp lệ", + "manual_url_no_query": "URL callback không hợp lệ: thiếu tham số truy vấn", + "manual_url_missing_params": "URL callback không hợp lệ: thiếu tham số bắt buộc (code và state)", + "manual_url_auth_failed": "Xác thực URL thủ công thất bại", + "manual_url_auth_error": "Xác thực thất bại", "verification_failed": "Không thể xác minh xác thực tổ chức." }, "info": { diff --git a/src/i18n/locales/zh-CN/common.json b/src/i18n/locales/zh-CN/common.json index 9f4d24f6ebfb..e64339cecd12 100644 --- a/src/i18n/locales/zh-CN/common.json +++ b/src/i18n/locales/zh-CN/common.json @@ -111,7 +111,12 @@ }, "api": { "invalidKeyInvalidChars": "API 密钥包含无效字符。" - } + }, + "manual_url_empty": "请输入有效的回调 URL", + "manual_url_no_query": "无效的回调 URL:缺少查询参数", + "manual_url_missing_params": "无效的回调 URL:缺少必需参数(code 和 state)", + "manual_url_auth_failed": "手动 URL 身份验证失败", + "manual_url_auth_error": "身份验证失败" }, "warnings": { "no_terminal_content": "没有选择终端内容", @@ -198,6 +203,11 @@ "errors": { "cloud_auth_required": "您的组织需要 Roo Code Cloud 身份验证。请登录以继续。", "organization_mismatch": "您必须使用组织的 Roo Code Cloud 账户进行身份验证。", + "manual_url_empty": "请输入有效的回调 URL", + "manual_url_no_query": "无效的回调 URL:缺少查询参数", + "manual_url_missing_params": "无效的回调 URL:缺少必需参数(code 和 state)", + "manual_url_auth_failed": "手动 URL 身份验证失败", + "manual_url_auth_error": "身份验证失败", "verification_failed": "无法验证组织身份验证。" }, "info": { diff --git a/src/i18n/locales/zh-TW/common.json b/src/i18n/locales/zh-TW/common.json index d40b3e094f57..ddf283cf6ca6 100644 --- a/src/i18n/locales/zh-TW/common.json +++ b/src/i18n/locales/zh-TW/common.json @@ -106,6 +106,11 @@ "api": { "invalidKeyInvalidChars": "API 金鑰包含無效字元。" }, + "manual_url_empty": "請輸入有效的回呼 URL", + "manual_url_no_query": "無效的回呼 URL:缺少查詢參數", + "manual_url_missing_params": "無效的回呼 URL:缺少必要參數(code 和 state)", + "manual_url_auth_failed": "手動 URL 身份驗證失敗", + "manual_url_auth_error": "身份驗證失敗", "mode_import_failed": "匯入模式失敗:{{error}}" }, "warnings": { @@ -193,6 +198,11 @@ "errors": { "cloud_auth_required": "您的組織需要 Roo Code Cloud 身份驗證。請登入以繼續。", "organization_mismatch": "您必須使用組織的 Roo Code Cloud 帳戶進行身份驗證。", + "manual_url_empty": "請輸入有效的回呼 URL", + "manual_url_no_query": "無效的回呼 URL:缺少查詢參數", + "manual_url_missing_params": "無效的回呼 URL:缺少必要參數(code 和 state)", + "manual_url_auth_failed": "手動 URL 身份驗證失敗", + "manual_url_auth_error": "身份驗證失敗", "verification_failed": "無法驗證組織身份驗證。" }, "info": { diff --git a/src/shared/WebviewMessage.ts b/src/shared/WebviewMessage.ts index 565712bfbfc2..ae8c72dd04f7 100644 --- a/src/shared/WebviewMessage.ts +++ b/src/shared/WebviewMessage.ts @@ -180,6 +180,7 @@ export interface WebviewMessage { | "cloudButtonClicked" | "rooCloudSignIn" | "rooCloudSignOut" + | "rooCloudManualUrl" | "condenseTaskContextRequest" | "requestIndexingStatus" | "startIndexing" diff --git a/webview-ui/src/components/cloud/CloudView.tsx b/webview-ui/src/components/cloud/CloudView.tsx index 63733ef7d29f..8ca1a951234c 100644 --- a/webview-ui/src/components/cloud/CloudView.tsx +++ b/webview-ui/src/components/cloud/CloudView.tsx @@ -1,5 +1,5 @@ -import { useEffect, useRef } from "react" -import { VSCodeButton } from "@vscode/webview-ui-toolkit/react" +import { useEffect, useRef, useState } from "react" +import { VSCodeButton, VSCodeProgressRing, VSCodeTextField } from "@vscode/webview-ui-toolkit/react" import { type CloudUserInfo, TelemetryEventName } from "@roo-code/types" @@ -25,6 +25,13 @@ export const CloudView = ({ userInfo, isAuthenticated, cloudApiUrl, onDone }: Cl const { t } = useAppTranslation() const { remoteControlEnabled, setRemoteControlEnabled } = useExtensionState() const wasAuthenticatedRef = useRef(false) + const timeoutRef = useRef(null) + const manualUrlInputRef = useRef(null) + + // Manual URL entry state + const [authInProgress, setAuthInProgress] = useState(false) + const [showManualEntry, setShowManualEntry] = useState(false) + const [manualUrl, setManualUrl] = useState("") const rooLogoUri = (window as any).IMAGES_BASE_URI + "/roo-logo.svg" @@ -32,6 +39,13 @@ export const CloudView = ({ userInfo, isAuthenticated, cloudApiUrl, onDone }: Cl useEffect(() => { if (isAuthenticated) { wasAuthenticatedRef.current = true + // Clear auth in progress state when authentication succeeds + setAuthInProgress(false) + setShowManualEntry(false) + if (timeoutRef.current) { + clearTimeout(timeoutRef.current) + timeoutRef.current = null + } } else if (wasAuthenticatedRef.current && !isAuthenticated) { // User just logged out successfully // NOTE: Telemetry events use ACCOUNT_* naming for continuity with existing analytics @@ -41,11 +55,64 @@ export const CloudView = ({ userInfo, isAuthenticated, cloudApiUrl, onDone }: Cl } }, [isAuthenticated]) + // Focus the manual URL input when it becomes visible + useEffect(() => { + if (showManualEntry && manualUrlInputRef.current) { + // Small delay to ensure the DOM is ready + setTimeout(() => { + manualUrlInputRef.current?.focus() + }, 50) + } + }, [showManualEntry]) + + // Cleanup timeout on unmount + useEffect(() => { + return () => { + if (timeoutRef.current) { + clearTimeout(timeoutRef.current) + } + } + }, []) + const handleConnectClick = () => { // Send telemetry for cloud connect action // NOTE: Using ACCOUNT_* telemetry events for backward compatibility with analytics telemetryClient.capture(TelemetryEventName.ACCOUNT_CONNECT_CLICKED) vscode.postMessage({ type: "rooCloudSignIn" }) + + // Start auth in progress state - show "Having trouble?" immediately for debugging + setAuthInProgress(true) + } + + const handleManualUrlChange = (e: any) => { + const url = e.target.value + setManualUrl(url) + + // Auto-trigger authentication when a complete URL is pasted (with slight delay to ensure full paste is processed) + setTimeout(() => { + if (url.trim() && url.includes("://") && url.includes("/auth/clerk/callback")) { + vscode.postMessage({ type: "rooCloudManualUrl", text: url.trim() }) + } + }, 100) + } + + const handleKeyDown = (e: any) => { + if (e.key === "Enter") { + const url = manualUrl.trim() + if (url && url.includes("://") && url.includes("/auth/clerk/callback")) { + vscode.postMessage({ type: "rooCloudManualUrl", text: url }) + } + } + } + + const handleShowManualEntry = () => { + setShowManualEntry(true) + } + + const handleReset = () => { + setAuthInProgress(false) + setShowManualEntry(false) + setManualUrl("") } const handleLogoutClick = () => { @@ -189,9 +256,51 @@ export const CloudView = ({ userInfo, isAuthenticated, cloudApiUrl, onDone }: Cl
- - {t("cloud:connect")} - + {!authInProgress && ( + + {t("cloud:connect")} + + )} + + {/* Manual entry section */} + {authInProgress && !showManualEntry && ( + // Timeout message with "Having trouble?" link +
+
+ + {t("cloud:authWaiting")} +
+ {!showManualEntry && ( + + )} +
+ )} + + {showManualEntry && ( + // Manual URL entry form +
+

+ {t("cloud:pasteCallbackUrl")} +

+ + +
+ )}
)} diff --git a/webview-ui/src/i18n/locales/ca/cloud.json b/webview-ui/src/i18n/locales/ca/cloud.json index 02714c7c4b54..94c12d75e146 100644 --- a/webview-ui/src/i18n/locales/ca/cloud.json +++ b/webview-ui/src/i18n/locales/ca/cloud.json @@ -14,5 +14,9 @@ "remoteControl": "Roomote Control", "remoteControlDescription": "Permet seguir i interactuar amb tasques en aquest espai de treball amb Roo Code Cloud", "visitCloudWebsite": "Visita Roo Code Cloud", - "cloudUrlPillLabel": "URL de Roo Code Cloud" + "cloudUrlPillLabel": "URL de Roo Code Cloud", + "authWaiting": "Esperant que es completi l'autenticació...", + "havingTrouble": "Tens problemes?", + "pasteCallbackUrl": "Copia l'URL de redirect del teu navegador i enganxa-la aquí:", + "startOver": "Torna a començar" } diff --git a/webview-ui/src/i18n/locales/de/cloud.json b/webview-ui/src/i18n/locales/de/cloud.json index cbba34539998..e76245f43047 100644 --- a/webview-ui/src/i18n/locales/de/cloud.json +++ b/webview-ui/src/i18n/locales/de/cloud.json @@ -14,5 +14,9 @@ "remoteControl": "Roomote Control", "remoteControlDescription": "Ermöglicht das Verfolgen und Interagieren mit Aufgaben in diesem Arbeitsbereich mit Roo Code Cloud", "visitCloudWebsite": "Roo Code Cloud besuchen", - "cloudUrlPillLabel": "Roo Code Cloud URL" + "cloudUrlPillLabel": "Roo Code Cloud URL", + "authWaiting": "Warte auf Abschluss der Authentifizierung...", + "havingTrouble": "Probleme?", + "pasteCallbackUrl": "Kopiere die Redirect-URL aus deinem Browser und füge sie hier ein:", + "startOver": "Von vorne beginnen" } diff --git a/webview-ui/src/i18n/locales/en/cloud.json b/webview-ui/src/i18n/locales/en/cloud.json index 88948c91532b..c436f50bc445 100644 --- a/webview-ui/src/i18n/locales/en/cloud.json +++ b/webview-ui/src/i18n/locales/en/cloud.json @@ -13,5 +13,9 @@ "visitCloudWebsite": "Visit Roo Code Cloud", "remoteControl": "Roomote Control", "remoteControlDescription": "Enable following and interacting with tasks in this workspace with Roo Code Cloud", - "cloudUrlPillLabel": "Roo Code Cloud URL" + "cloudUrlPillLabel": "Roo Code Cloud URL", + "authWaiting": "Waiting for browser authentication...", + "havingTrouble": "Having trouble?", + "pasteCallbackUrl": "Copy the redirect URL from your browser and paste it here:", + "startOver": "Start over" } diff --git a/webview-ui/src/i18n/locales/es/cloud.json b/webview-ui/src/i18n/locales/es/cloud.json index 2497edf7bf2b..1515a2a91731 100644 --- a/webview-ui/src/i18n/locales/es/cloud.json +++ b/webview-ui/src/i18n/locales/es/cloud.json @@ -14,5 +14,9 @@ "remoteControl": "Roomote Control", "remoteControlDescription": "Permite seguir e interactuar con tareas en este espacio de trabajo con Roo Code Cloud", "visitCloudWebsite": "Visitar Roo Code Cloud", - "cloudUrlPillLabel": "URL de Roo Code Cloud" + "cloudUrlPillLabel": "URL de Roo Code Cloud", + "authWaiting": "Esperando que se complete la autenticación...", + "havingTrouble": "¿Tienes problemas?", + "pasteCallbackUrl": "Copia la URL de redirect desde tu navegador y pégala aquí:", + "startOver": "Empezar de nuevo" } diff --git a/webview-ui/src/i18n/locales/fr/cloud.json b/webview-ui/src/i18n/locales/fr/cloud.json index 76db922933ef..5ed35af6a7e9 100644 --- a/webview-ui/src/i18n/locales/fr/cloud.json +++ b/webview-ui/src/i18n/locales/fr/cloud.json @@ -14,5 +14,9 @@ "remoteControl": "Roomote Control", "remoteControlDescription": "Permet de suivre et d'interagir avec les tâches dans cet espace de travail avec Roo Code Cloud", "visitCloudWebsite": "Visiter Roo Code Cloud", - "cloudUrlPillLabel": "URL de Roo Code Cloud" + "cloudUrlPillLabel": "URL de Roo Code Cloud", + "authWaiting": "En attente de la fin de l'authentification...", + "havingTrouble": "Des difficultés ?", + "pasteCallbackUrl": "Copie l'URL de redirect depuis ton navigateur et colle-la ici :", + "startOver": "Recommencer" } diff --git a/webview-ui/src/i18n/locales/hi/cloud.json b/webview-ui/src/i18n/locales/hi/cloud.json index 60d7103c2571..c10e7de35cce 100644 --- a/webview-ui/src/i18n/locales/hi/cloud.json +++ b/webview-ui/src/i18n/locales/hi/cloud.json @@ -14,5 +14,9 @@ "remoteControl": "Roomote Control", "remoteControlDescription": "Roo Code Cloud के साथ इस वर्कस्पेस में कार्यों को फॉलो और इंटरैक्ट करने की सुविधा दें", "visitCloudWebsite": "Roo Code Cloud पर जाएं", - "cloudUrlPillLabel": "Roo Code Cloud URL" + "cloudUrlPillLabel": "Roo Code Cloud URL", + "authWaiting": "प्रमाणीकरण पूरा होने की प्रतीक्षा कर रहे हैं...", + "havingTrouble": "समस्या हो रही है?", + "pasteCallbackUrl": "अपने ब्राउज़र से redirect URL कॉपी करें और यहाँ पेस्ट करें:", + "startOver": "फिर से शुरू करें" } diff --git a/webview-ui/src/i18n/locales/id/cloud.json b/webview-ui/src/i18n/locales/id/cloud.json index e48bb16fe8ad..27ea5c4bb785 100644 --- a/webview-ui/src/i18n/locales/id/cloud.json +++ b/webview-ui/src/i18n/locales/id/cloud.json @@ -14,5 +14,9 @@ "remoteControl": "Roomote Control", "remoteControlDescription": "Memungkinkan mengikuti dan berinteraksi dengan tugas di workspace ini dengan Roo Code Cloud", "visitCloudWebsite": "Kunjungi Roo Code Cloud", - "cloudUrlPillLabel": "URL Roo Code Cloud" + "cloudUrlPillLabel": "URL Roo Code Cloud", + "authWaiting": "Menunggu autentikasi selesai...", + "havingTrouble": "Ada masalah?", + "pasteCallbackUrl": "Salin URL redirect dari browser dan tempel di sini:", + "startOver": "Mulai dari awal" } diff --git a/webview-ui/src/i18n/locales/it/cloud.json b/webview-ui/src/i18n/locales/it/cloud.json index 0678fcd7211c..74bd07144cdd 100644 --- a/webview-ui/src/i18n/locales/it/cloud.json +++ b/webview-ui/src/i18n/locales/it/cloud.json @@ -14,5 +14,9 @@ "remoteControl": "Roomote Control", "remoteControlDescription": "Abilita il monitoraggio e l'interazione con le attività in questo workspace con Roo Code Cloud", "visitCloudWebsite": "Visita Roo Code Cloud", - "cloudUrlPillLabel": "URL di Roo Code Cloud" + "cloudUrlPillLabel": "URL di Roo Code Cloud", + "authWaiting": "In attesa del completamento dell'autenticazione...", + "havingTrouble": "Hai problemi?", + "pasteCallbackUrl": "Copia l'URL di redirect dal tuo browser e incollalo qui:", + "startOver": "Ricomincia" } diff --git a/webview-ui/src/i18n/locales/ja/cloud.json b/webview-ui/src/i18n/locales/ja/cloud.json index 4b409af9e060..1ab89d043584 100644 --- a/webview-ui/src/i18n/locales/ja/cloud.json +++ b/webview-ui/src/i18n/locales/ja/cloud.json @@ -14,5 +14,9 @@ "remoteControl": "Roomote Control", "remoteControlDescription": "Roo Code Cloudでこのワークスペースのタスクをフォローし操作することを有効にする", "visitCloudWebsite": "Roo Code Cloudを訪問", - "cloudUrlPillLabel": "Roo Code Cloud URL" + "cloudUrlPillLabel": "Roo Code Cloud URL", + "authWaiting": "認証完了をお待ちください...", + "havingTrouble": "問題が発生していますか?", + "pasteCallbackUrl": "ブラウザからリダイレクトURLをコピーし、ここに貼り付けてください:", + "startOver": "最初からやり直す" } diff --git a/webview-ui/src/i18n/locales/ko/cloud.json b/webview-ui/src/i18n/locales/ko/cloud.json index 4272a94acf80..96b4760ee316 100644 --- a/webview-ui/src/i18n/locales/ko/cloud.json +++ b/webview-ui/src/i18n/locales/ko/cloud.json @@ -14,5 +14,9 @@ "remoteControl": "Roomote Control", "remoteControlDescription": "Roo Code Cloud로 이 워크스페이스의 작업을 팔로우하고 상호작용할 수 있게 합니다", "visitCloudWebsite": "Roo Code Cloud 방문", - "cloudUrlPillLabel": "Roo Code Cloud URL" + "cloudUrlPillLabel": "Roo Code Cloud URL", + "authWaiting": "인증 완료를 기다리는 중...", + "havingTrouble": "문제가 있나요?", + "pasteCallbackUrl": "브라우저에서 리다이렉트 URL을 복사하여 여기에 붙여넣으세요:", + "startOver": "다시 시작" } diff --git a/webview-ui/src/i18n/locales/nl/cloud.json b/webview-ui/src/i18n/locales/nl/cloud.json index f77a37fbf086..5c2651d44aa9 100644 --- a/webview-ui/src/i18n/locales/nl/cloud.json +++ b/webview-ui/src/i18n/locales/nl/cloud.json @@ -14,5 +14,9 @@ "remoteControl": "Roomote Control", "remoteControlDescription": "Schakel het volgen en interacteren met taken in deze workspace in met Roo Code Cloud", "visitCloudWebsite": "Bezoek Roo Code Cloud", - "cloudUrlPillLabel": "Roo Code Cloud URL" + "cloudUrlPillLabel": "Roo Code Cloud URL", + "authWaiting": "Wachten tot authenticatie voltooid is...", + "havingTrouble": "Problemen?", + "pasteCallbackUrl": "Kopieer de redirect-URL uit je browser en plak hem hier:", + "startOver": "Opnieuw beginnen" } diff --git a/webview-ui/src/i18n/locales/pl/cloud.json b/webview-ui/src/i18n/locales/pl/cloud.json index 4f98bf0b9867..0cb860ee1f29 100644 --- a/webview-ui/src/i18n/locales/pl/cloud.json +++ b/webview-ui/src/i18n/locales/pl/cloud.json @@ -14,5 +14,9 @@ "remoteControl": "Roomote Control", "remoteControlDescription": "Umożliwia śledzenie i interakcję z zadaniami w tym obszarze roboczym za pomocą Roo Code Cloud", "visitCloudWebsite": "Odwiedź Roo Code Cloud", - "cloudUrlPillLabel": "URL Roo Code Cloud" + "cloudUrlPillLabel": "URL Roo Code Cloud", + "authWaiting": "Oczekiwanie na zakończenie uwierzytelniania...", + "havingTrouble": "Masz problemy?", + "pasteCallbackUrl": "Skopiuj URL redirect z przeglądarki i wklej tutaj:", + "startOver": "Zacznij od nowa" } diff --git a/webview-ui/src/i18n/locales/pt-BR/cloud.json b/webview-ui/src/i18n/locales/pt-BR/cloud.json index 749395edae64..7e0a29e38b46 100644 --- a/webview-ui/src/i18n/locales/pt-BR/cloud.json +++ b/webview-ui/src/i18n/locales/pt-BR/cloud.json @@ -14,5 +14,9 @@ "remoteControl": "Roomote Control", "remoteControlDescription": "Permite acompanhar e interagir com tarefas neste workspace com Roo Code Cloud", "visitCloudWebsite": "Visitar Roo Code Cloud", - "cloudUrlPillLabel": "URL do Roo Code Cloud " + "cloudUrlPillLabel": "URL do Roo Code Cloud ", + "authWaiting": "Aguardando conclusão da autenticação...", + "havingTrouble": "Tendo problemas?", + "pasteCallbackUrl": "Copie a URL de redirect do seu navegador e cole aqui:", + "startOver": "Recomeçar" } diff --git a/webview-ui/src/i18n/locales/ru/cloud.json b/webview-ui/src/i18n/locales/ru/cloud.json index 5fd6dc372b42..b30d6064a23e 100644 --- a/webview-ui/src/i18n/locales/ru/cloud.json +++ b/webview-ui/src/i18n/locales/ru/cloud.json @@ -14,5 +14,9 @@ "remoteControl": "Roomote Control", "remoteControlDescription": "Позволяет отслеживать и взаимодействовать с задачами в этом рабочем пространстве с Roo Code Cloud", "visitCloudWebsite": "Посетить Roo Code Cloud", - "cloudUrlPillLabel": "URL Roo Code Cloud" + "cloudUrlPillLabel": "URL Roo Code Cloud", + "authWaiting": "Ожидание завершения аутентификации...", + "havingTrouble": "Проблемы?", + "pasteCallbackUrl": "Скопируй URL перенаправления из браузера и вставь его сюда:", + "startOver": "Начать заново" } diff --git a/webview-ui/src/i18n/locales/tr/cloud.json b/webview-ui/src/i18n/locales/tr/cloud.json index 822e837a9fb9..c82661163f23 100644 --- a/webview-ui/src/i18n/locales/tr/cloud.json +++ b/webview-ui/src/i18n/locales/tr/cloud.json @@ -14,5 +14,9 @@ "remoteControl": "Roomote Control", "remoteControlDescription": "Bu çalışma alanındaki görevleri Roo Code Cloud ile takip etme ve etkileşim kurma imkanı sağlar", "visitCloudWebsite": "Roo Code Cloud'u ziyaret et", - "cloudUrlPillLabel": "Roo Code Cloud URL'si" + "cloudUrlPillLabel": "Roo Code Cloud URL'si", + "authWaiting": "Kimlik doğrulama tamamlanması bekleniyor...", + "havingTrouble": "Sorun yaşıyor musun?", + "pasteCallbackUrl": "Tarayıcından redirect URL'sini kopyala ve buraya yapıştır:", + "startOver": "Baştan başla" } diff --git a/webview-ui/src/i18n/locales/vi/cloud.json b/webview-ui/src/i18n/locales/vi/cloud.json index ef444e70bd91..ee5c2683b0c2 100644 --- a/webview-ui/src/i18n/locales/vi/cloud.json +++ b/webview-ui/src/i18n/locales/vi/cloud.json @@ -14,5 +14,9 @@ "remoteControl": "Roomote Control", "remoteControlDescription": "Cho phép theo dõi và tương tác với các tác vụ trong workspace này với Roo Code Cloud", "visitCloudWebsite": "Truy cập Roo Code Cloud", - "cloudUrlPillLabel": "URL Roo Code Cloud" + "cloudUrlPillLabel": "URL Roo Code Cloud", + "authWaiting": "Đang chờ hoàn tất xác thực...", + "havingTrouble": "Gặp vấn đề?", + "pasteCallbackUrl": "Sao chép URL redirect từ trình duyệt và dán vào đây:", + "startOver": "Bắt đầu lại" } diff --git a/webview-ui/src/i18n/locales/zh-CN/cloud.json b/webview-ui/src/i18n/locales/zh-CN/cloud.json index 5a90cb8ccd92..c42647a0967d 100644 --- a/webview-ui/src/i18n/locales/zh-CN/cloud.json +++ b/webview-ui/src/i18n/locales/zh-CN/cloud.json @@ -14,5 +14,9 @@ "remoteControl": "Roomote Control", "remoteControlDescription": "允许通过 Roo Code Cloud 跟踪和操作此工作区中的任务", "visitCloudWebsite": "访问 Roo Code Cloud", - "cloudUrlPillLabel": "Roo Code Cloud URL" + "cloudUrlPillLabel": "Roo Code Cloud URL", + "authWaiting": "等待身份验证完成...", + "havingTrouble": "遇到问题?", + "pasteCallbackUrl": "从浏览器复制重定向 URL 并粘贴到这里:", + "startOver": "重新开始" } diff --git a/webview-ui/src/i18n/locales/zh-TW/cloud.json b/webview-ui/src/i18n/locales/zh-TW/cloud.json index 034c15e2049b..efb2b25ad997 100644 --- a/webview-ui/src/i18n/locales/zh-TW/cloud.json +++ b/webview-ui/src/i18n/locales/zh-TW/cloud.json @@ -14,5 +14,9 @@ "remoteControl": "Roomote Control", "remoteControlDescription": "允許透過 Roo Code Cloud 追蹤和操作此工作區中的工作", "visitCloudWebsite": "造訪 Roo Code Cloud", - "cloudUrlPillLabel": "Roo Code Cloud URL" + "cloudUrlPillLabel": "Roo Code Cloud URL", + "authWaiting": "等待身份驗證完成...", + "havingTrouble": "遇到問題?", + "pasteCallbackUrl": "從瀏覽器複製重新導向 URL 並貼上到這裡:", + "startOver": "重新開始" }