Let people paste in the auth redirect url (#7805)

Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com>
Co-authored-by: Bruno Bergher <me@brunobergher.com>
This commit is contained in:
Matt Rubens 2025-09-09 09:50:50 -04:00 committed by GitHub
parent 195f4eb245
commit 5780659ae5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
39 changed files with 428 additions and 39 deletions

View file

@ -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) {

View file

@ -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": {

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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": {

View file

@ -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": {

View file

@ -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": {

View file

@ -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": {

View file

@ -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": {

View file

@ -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": {

View file

@ -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": {

View file

@ -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": {

View file

@ -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": {

View file

@ -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": {

View file

@ -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": {

View file

@ -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": {

View file

@ -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": {

View file

@ -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": {

View file

@ -180,6 +180,7 @@ export interface WebviewMessage {
| "cloudButtonClicked"
| "rooCloudSignIn"
| "rooCloudSignOut"
| "rooCloudManualUrl"
| "condenseTaskContextRequest"
| "requestIndexingStatus"
| "startIndexing"

View file

@ -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<NodeJS.Timeout | null>(null)
const manualUrlInputRef = useRef<HTMLInputElement | null>(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
</div>
<div className="flex flex-col items-center gap-4">
<VSCodeButton appearance="primary" onClick={handleConnectClick} className="w-1/2">
{t("cloud:connect")}
</VSCodeButton>
{!authInProgress && (
<VSCodeButton appearance="primary" onClick={handleConnectClick} className="w-1/2">
{t("cloud:connect")}
</VSCodeButton>
)}
{/* Manual entry section */}
{authInProgress && !showManualEntry && (
// Timeout message with "Having trouble?" link
<div className="flex flex-col items-center gap-1">
<div className="flex items-center gap-2 text-sm text-vscode-descriptionForeground">
<VSCodeProgressRing className="size-3 text-vscode-foreground" />
{t("cloud:authWaiting")}
</div>
{!showManualEntry && (
<button
onClick={handleShowManualEntry}
className="text-sm text-vscode-textLink-foreground hover:text-vscode-textLink-activeForeground underline cursor-pointer bg-transparent border-none p-0">
{t("cloud:havingTrouble")}
</button>
)}
</div>
)}
{showManualEntry && (
// Manual URL entry form
<div className="space-y-2 text-center border-border/50 border-t px-2 pt-8 mt-3">
<p className="text-xs text-vscode-descriptionForeground">
{t("cloud:pasteCallbackUrl")}
</p>
<VSCodeTextField
ref={manualUrlInputRef as any}
value={manualUrl}
onChange={handleManualUrlChange}
onKeyDown={handleKeyDown}
placeholder="vscode://RooVeterinaryInc.roo-cline/auth/clerk/callback?state=..."
className="w-full"
/>
<button
onClick={handleReset}
className="text-sm text-vscode-textLink-foreground hover:text-vscode-textLink-activeForeground underline cursor-pointer bg-transparent border-none p-0">
{t("cloud:startOver")}
</button>
</div>
)}
</div>
</>
)}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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": "फिर से शुरू करें"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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": "最初からやり直す"
}

View file

@ -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": "다시 시작"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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": "Начать заново"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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": "重新开始"
}

View file

@ -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": "重新開始"
}