diff --git a/crates/goose-sdk-types/src/custom_notifications.rs b/crates/goose-sdk-types/src/custom_notifications.rs index 868e3185d..49da57ac2 100644 --- a/crates/goose-sdk-types/src/custom_notifications.rs +++ b/crates/goose-sdk-types/src/custom_notifications.rs @@ -35,6 +35,19 @@ pub enum GooseSessionUpdate { MessageUsage(MessageUsageUpdate), } +/// Dedicated provider notification for OAuth device-code flow. +/// Sent during provider authentication when the ACP client supports +/// `goose.customNotifications` — avoids a fake empty session ID. +#[derive(Debug, Default, Clone, Serialize, Deserialize, JsonSchema, JsonRpcNotification)] +#[notification(method = "_goose/unstable/providers/authentication/device-code")] +#[serde(rename_all = "camelCase")] +pub struct ProviderDeviceCodeNotification { + pub provider_id: String, + pub user_code: String, + pub verification_uri: String, + pub expires_in: u64, +} + impl Default for GooseSessionUpdate { fn default() -> Self { GooseSessionUpdate::UsageUpdate(SessionUsageUpdate::default()) @@ -142,7 +155,10 @@ where /// notification, define the struct above (with `JsonRpcNotification` + /// `Default`) and add one line below. pub fn custom_notification_schemas(generator: &mut SchemaGenerator) -> Vec { - vec![notification_schema::(generator)] + vec![ + notification_schema::(generator), + notification_schema::(generator), + ] } #[cfg(test)] diff --git a/crates/goose/acp-meta.json b/crates/goose/acp-meta.json index 9eeacac19..deeefb78c 100644 --- a/crates/goose/acp-meta.json +++ b/crates/goose/acp-meta.json @@ -570,6 +570,10 @@ { "method": "_goose/unstable/session/update", "paramsType": "GooseSessionNotification_unstable" + }, + { + "method": "_goose/unstable/providers/authentication/device-code", + "paramsType": "ProviderDeviceCodeNotification_unstable" } ], "agentRequests": [ diff --git a/crates/goose/acp-schema.json b/crates/goose/acp-schema.json index 6687771e3..36b641e65 100644 --- a/crates/goose/acp-schema.json +++ b/crates/goose/acp-schema.json @@ -6916,6 +6916,33 @@ ], "description": "Per-message token usage/cost/timing, keyed by the message id used for\nchunk matching. Sent live after a turn's messages and on replay." }, + "ProviderDeviceCodeNotification_unstable": { + "type": "object", + "properties": { + "providerId": { + "type": "string" + }, + "userCode": { + "type": "string" + }, + "verificationUri": { + "type": "string" + }, + "expiresIn": { + "type": "integer", + "minimum": 0 + } + }, + "required": [ + "providerId", + "userCode", + "verificationUri", + "expiresIn" + ], + "description": "Dedicated provider notification for OAuth device-code flow.\nSent during provider authentication when the ACP client supports\n`goose.customNotifications` — avoids a fake empty session ID.", + "x-side": "agent", + "x-method": "_goose/unstable/providers/authentication/device-code" + }, "RequestRecipeParams_unstable": { "type": "object", "properties": { @@ -8697,6 +8724,15 @@ ], "description": "Params for _goose/unstable/session/update", "title": "GooseSessionNotification_unstable" + }, + { + "allOf": [ + { + "$ref": "#/$defs/ProviderDeviceCodeNotification_unstable" + } + ], + "description": "Params for _goose/unstable/providers/authentication/device-code", + "title": "ProviderDeviceCodeNotification_unstable" } ] }, diff --git a/crates/goose/src/acp/server/providers.rs b/crates/goose/src/acp/server/providers.rs index 5f697c7a8..e91eb08b0 100644 --- a/crates/goose/src/acp/server/providers.rs +++ b/crates/goose/src/acp/server/providers.rs @@ -1075,10 +1075,42 @@ impl GooseAcpAgent { .create_with_default_model(Vec::new()) .await .internal_err_ctx("Failed to initialize provider")?; - provider - .configure_oauth() + + if self.supports_goose_custom_notifications() { + let client_cx = self.client_cx.get().cloned(); + let provider_id = req.provider_id.clone(); + let announce: Box = + Box::new(move |user_code, verification_uri, expires_in| { + let _ = arboard::Clipboard::new() + .ok() + .and_then(|mut cb| cb.set_text(&user_code).ok()); + if let Err(e) = webbrowser::open(&verification_uri) { + tracing::warn!("Failed to open browser: {}", e); + } + if let Some(ref cx) = client_cx { + let notification = ProviderDeviceCodeNotification { + provider_id: provider_id.clone(), + user_code, + verification_uri, + expires_in, + }; + if let Err(e) = cx.send_notification(notification) { + tracing::warn!("Failed to send device code notification: {}", e); + } + } + }); + crate::providers::oauth_device_flow::with_device_code_announce( + announce, + provider.configure_oauth(), + ) .await .internal_err_ctx("Failed to authenticate provider")?; + } else { + provider + .configure_oauth() + .await + .internal_err_ctx("Failed to authenticate provider")?; + } } Config::global().invalidate_secrets_cache(); diff --git a/crates/goose/src/providers/githubcopilot.rs b/crates/goose/src/providers/githubcopilot.rs index a7867502c..4f3827e42 100644 --- a/crates/goose/src/providers/githubcopilot.rs +++ b/crates/goose/src/providers/githubcopilot.rs @@ -5,7 +5,7 @@ use crate::providers::openai_compatible::{ handle_status, stream_openai_compat, stream_responses_compat, }; use crate::providers::private_file::write_private_file; -use anyhow::{anyhow, Result}; +use anyhow::Result; use async_trait::async_trait; use axum::http; use chrono::{DateTime, Utc}; @@ -414,17 +414,6 @@ impl GithubCopilotProvider { Ok(info) } - async fn get_access_token(&self) -> Result { - for attempt in 0..3 { - tracing::trace!("attempt {} to get access token", attempt + 1); - match self.login().await { - Ok(token) => return Ok(token), - Err(err) => tracing::warn!("failed to get access token: {}", err), - } - } - Err(anyhow!("failed to get access token after 3 attempts")) - } - async fn login(&self) -> Result { let cfg = DeviceFlowConfig { device_auth_url: Some(&self.urls.device_code_url), @@ -731,7 +720,7 @@ impl Provider for GithubCopilotProvider { } let token = self - .get_access_token() + .login() .await .map_err(|e| ProviderError::Authentication(format!("OAuth flow failed: {}", e)))?; diff --git a/crates/goose/src/providers/oauth_device_flow.rs b/crates/goose/src/providers/oauth_device_flow.rs index 30c49a509..218614508 100644 --- a/crates/goose/src/providers/oauth_device_flow.rs +++ b/crates/goose/src/providers/oauth_device_flow.rs @@ -11,6 +11,23 @@ use reqwest::header::HeaderMap; use reqwest::Client; use serde::{Deserialize, Serialize}; +tokio::task_local! { + /// When set, called instead of the default CLI announce when a device code + /// is obtained. Args: (user_code, verification_uri, expires_in_secs). + /// Set by the ACP server to forward the code to the desktop UI. + static DEVICE_CODE_ANNOUNCE: Box; +} + +pub async fn with_device_code_announce( + announce: Box, + fut: F, +) -> T +where + F: std::future::Future, +{ + DEVICE_CODE_ANNOUNCE.scope(announce, fut).await +} + /// Fallback poll interval when the server omits `interval` (RFC 8628 §3.2). const DEFAULT_POLL_INTERVAL_SECS: u64 = 5; @@ -320,19 +337,32 @@ async fn send_request( } fn announce_user_action(device: &DeviceCodeResponse) { - if let Ok(mut clipboard) = arboard::Clipboard::new() { - if let Err(e) = clipboard.set_text(&device.user_code) { - tracing::warn!("Failed to copy verification code to clipboard: {}", e); - } + let verify_url = device.verification_url().to_string(); + + if DEVICE_CODE_ANNOUNCE + .try_with(|f| { + let expires_in = device + .expires_in + .unwrap_or(DEFAULT_DEVICE_CODE_LIFETIME_SECS); + f(device.user_code.clone(), verify_url.clone(), expires_in) + }) + .is_ok() + { + return; } - let verify_url = device.verification_url(); - if let Err(e) = webbrowser::open(verify_url) { + + let copied = arboard::Clipboard::new() + .ok() + .and_then(|mut cb| cb.set_text(&device.user_code).ok()) + .is_some(); + if let Err(e) = webbrowser::open(&verify_url) { tracing::warn!("Failed to open browser: {}", e); } // stderr keeps stdout clean for CLI workflows parsing provider output. + let clipboard_hint = if copied { " (copied to clipboard)" } else { "" }; eprintln!( - "Please visit {} and enter code {}", - verify_url, device.user_code + "Please visit {} and enter code {}{}", + verify_url, device.user_code, clipboard_hint ); } diff --git a/ui/desktop/src/acp/__tests__/gooseAcpClient.test.ts b/ui/desktop/src/acp/__tests__/gooseAcpClient.test.ts index 995b2a37e..52ec3e339 100644 --- a/ui/desktop/src/acp/__tests__/gooseAcpClient.test.ts +++ b/ui/desktop/src/acp/__tests__/gooseAcpClient.test.ts @@ -39,6 +39,7 @@ function callbacks(): GooseAcpCallbacks { values: { name: 'Ada' }, }), unstable_sessionUpdate: vi.fn(), + unstable_providerDeviceCode: vi.fn(), }; } diff --git a/ui/desktop/src/acp/acpConnection.ts b/ui/desktop/src/acp/acpConnection.ts index efc092363..fc4089343 100644 --- a/ui/desktop/src/acp/acpConnection.ts +++ b/ui/desktop/src/acp/acpConnection.ts @@ -5,6 +5,7 @@ import packageJson from '../../package.json'; import { GOOSE_SERVE_EXITED_USER_MESSAGE } from '../gooseServeLeaseRegistry'; import { handleAcpGooseSessionNotification, + handleAcpProviderDeviceCodeNotification, handleAcpSessionNotification, } from './chatNotifications'; import { requestAcpElicitation } from './elicitationRequests'; @@ -221,6 +222,7 @@ function createClientCallbacks(): GooseAcpCallbacks { unstable_sessionRecipeRequestParams: requestAcpRecipeParams, sessionUpdate: handleAcpSessionNotification, unstable_sessionUpdate: handleAcpGooseSessionNotification, + unstable_providerDeviceCode: handleAcpProviderDeviceCodeNotification, }; } diff --git a/ui/desktop/src/acp/chatNotifications.ts b/ui/desktop/src/acp/chatNotifications.ts index 6e870eed2..a9ac1d0c1 100644 --- a/ui/desktop/src/acp/chatNotifications.ts +++ b/ui/desktop/src/acp/chatNotifications.ts @@ -1,4 +1,7 @@ -import type { GooseSessionNotification_unstable } from '@aaif/goose-sdk'; +import type { + GooseSessionNotification_unstable, + ProviderDeviceCodeNotification_unstable, +} from '@aaif/goose-sdk'; import type { SessionNotification } from '@agentclientprotocol/sdk'; import { AppEvents } from '../constants/events'; import { maybeHandlePlatformEvent } from '../utils/platform_events'; @@ -49,3 +52,10 @@ export function handleAcpGooseSessionNotification( acpChatSessionActions.applyAcpGooseSessionNotification(notification); return Promise.resolve(); } + +export function handleAcpProviderDeviceCodeNotification( + notification: ProviderDeviceCodeNotification_unstable +): Promise { + window.dispatchEvent(new CustomEvent('goose:device-code', { detail: notification })); + return Promise.resolve(); +} diff --git a/ui/desktop/src/acp/gooseAcpClient.ts b/ui/desktop/src/acp/gooseAcpClient.ts index 03c4f091e..9df2a1c46 100644 --- a/ui/desktop/src/acp/gooseAcpClient.ts +++ b/ui/desktop/src/acp/gooseAcpClient.ts @@ -10,13 +10,15 @@ import { GOOSE_EXT_NOTIFICATIONS, GooseExtClient, type GooseSessionNotification_unstable, + type ProviderDeviceCodeNotification_unstable, type RecipeParamsResponse_unstable, type RequestRecipeParams_unstable, zGooseSessionNotification_unstable, + zProviderDeviceCodeNotification_unstable, zRequestRecipeParams_unstable, } from '@aaif/goose-sdk'; -const [gooseSessionUpdate] = GOOSE_EXT_NOTIFICATIONS; +const [gooseSessionUpdate, providerDeviceCode] = GOOSE_EXT_NOTIFICATIONS; const [gooseRecipeParamsRequest] = GOOSE_EXT_AGENT_REQUESTS; export type GooseAcpCallbacks = Required< @@ -26,6 +28,9 @@ export type GooseAcpCallbacks = Required< request: RequestRecipeParams_unstable ) => Promise; unstable_sessionUpdate: (notification: GooseSessionNotification_unstable) => Promise; + unstable_providerDeviceCode: ( + notification: ProviderDeviceCodeNotification_unstable + ) => Promise; }; export type GooseAcpClient = { @@ -52,6 +57,11 @@ export function connectGooseAcpClient( ) .onNotification(gooseSessionUpdate.method, zGooseSessionNotification_unstable, (context) => callbacks.unstable_sessionUpdate(context.params) + ) + .onNotification( + providerDeviceCode.method, + zProviderDeviceCodeNotification_unstable, + (context) => callbacks.unstable_providerDeviceCode(context.params) ); const connection = app.connect(stream); diff --git a/ui/desktop/src/components/onboarding/ProviderConfigForm.tsx b/ui/desktop/src/components/onboarding/ProviderConfigForm.tsx index e0d003f84..07af91a9a 100644 --- a/ui/desktop/src/components/onboarding/ProviderConfigForm.tsx +++ b/ui/desktop/src/components/onboarding/ProviderConfigForm.tsx @@ -1,5 +1,6 @@ import { useState } from 'react'; import { acpAuthenticateProvider } from '../../acp/providers'; +import { useProviderDeviceCode } from '../../hooks/useProviderDeviceCode'; import type { ProviderDetails } from '../../types/providers'; import DefaultProviderSetupForm, { ConfigInput, @@ -23,7 +24,7 @@ const i18n = defineMessages({ deviceCodeFlowHint: { id: 'providerConfigForm.deviceCodeFlowHint', defaultMessage: - 'A browser window will open and the verification code will be copied to your clipboard. Paste it in the browser to complete sign-in.', + 'A browser window will open. The verification code will appear here so you can enter it to complete sign-in.', }, signingIn: { id: 'providerConfigForm.signingIn', @@ -45,6 +46,18 @@ const i18n = defineMessages({ id: 'providerConfigForm.continue', defaultMessage: 'Continue', }, + deviceCodeVisit: { + id: 'providerConfigForm.deviceCodeVisit', + defaultMessage: 'Visit', + }, + deviceCodeAndEnter: { + id: 'providerConfigForm.deviceCodeAndEnter', + defaultMessage: 'and enter:', + }, + deviceCodeCopy: { + id: 'providerConfigForm.deviceCodeCopy', + defaultMessage: 'Copy', + }, }); function parseLinks(text: string) { @@ -78,9 +91,11 @@ function OAuthForm({ }) { const intl = useIntl(); const [isLoading, setIsLoading] = useState(false); + const { deviceCode, clearDeviceCode } = useProviderDeviceCode(provider.name); const handleLogin = async () => { setIsLoading(true); + clearDeviceCode(); try { await acpAuthenticateProvider(provider.name); await onConfigured(provider.name); @@ -106,11 +121,42 @@ function OAuthForm({ ? intl.formatMessage(i18n.signingIn) : intl.formatMessage(i18n.signInWith, { providerName: provider.metadata.display_name })} -

- {isDeviceCodeFlow - ? intl.formatMessage(i18n.deviceCodeFlowHint) - : intl.formatMessage(i18n.browserWindowOpen)} -

+ {isDeviceCodeFlow && isLoading && deviceCode ? ( +
+

+ {intl.formatMessage(i18n.deviceCodeVisit)}{' '} + { + e.preventDefault(); + window.electron.openExternal(deviceCode.verificationUri); + }} + className="underline" + > + {deviceCode.verificationUri} + {' '} + {intl.formatMessage(i18n.deviceCodeAndEnter)} +

+
+ + {deviceCode.userCode} + + +
+
+ ) : ( +

+ {isDeviceCodeFlow + ? intl.formatMessage(i18n.deviceCodeFlowHint) + : intl.formatMessage(i18n.browserWindowOpen)} +

+ )} ); } diff --git a/ui/desktop/src/components/settings/providers/modal/ProviderConfigurationModal.tsx b/ui/desktop/src/components/settings/providers/modal/ProviderConfigurationModal.tsx index f2e68abb5..3e55ed882 100644 --- a/ui/desktop/src/components/settings/providers/modal/ProviderConfigurationModal.tsx +++ b/ui/desktop/src/components/settings/providers/modal/ProviderConfigurationModal.tsx @@ -25,6 +25,7 @@ import { AlertTriangle, LogIn } from 'lucide-react'; import type { ProviderDetails } from '../../../../types/providers'; import { Button } from '../../../../components/ui/button'; import { errorMessage } from '../../../../utils/conversionUtils'; +import { useProviderDeviceCode } from '../../../../hooks/useProviderDeviceCode'; import AcpReadinessPanel from '../AcpReadinessPanel'; import { defineMessages, useIntl } from '../../../../i18n'; import HuggingFaceSignInPrompt from '../../auth/HuggingFaceSignInPrompt'; @@ -94,7 +95,7 @@ const i18n = defineMessages({ deviceCodeFlowHint: { id: 'providerConfigurationModal.deviceCodeFlowHint', defaultMessage: - 'A browser window will open and the verification code will be copied to your clipboard. Paste it in the browser to complete sign-in.', + 'A browser window will open. The verification code will appear here so you can enter it to complete sign-in.', }, externalSetupIntro: { id: 'providerConfigurationModal.externalSetupIntro', @@ -125,6 +126,18 @@ const i18n = defineMessages({ defaultMessage: 'Sign in to use Hugging Face Inference Providers without manually entering an API token.', }, + deviceCodeVisit: { + id: 'providerConfigurationModal.deviceCodeVisit', + defaultMessage: 'Visit', + }, + deviceCodeAndEnter: { + id: 'providerConfigurationModal.deviceCodeAndEnter', + defaultMessage: 'and enter:', + }, + deviceCodeCopy: { + id: 'providerConfigurationModal.deviceCodeCopy', + defaultMessage: 'Copy', + }, }); /** Render a setup step string, turning `backtick` spans into and newlines into
. */ @@ -176,6 +189,7 @@ export default function ProviderConfigurationModal({ const [isActiveProvider, setIsActiveProvider] = useState(false); const [error, setError] = useState(null); const [isOAuthLoading, setIsOAuthLoading] = useState(false); + const { deviceCode, clearDeviceCode } = useProviderDeviceCode(provider.name); let primaryParameters = provider.metadata.config_keys.filter((param) => param.primary); if (primaryParameters.length === 0) { @@ -213,6 +227,7 @@ export default function ProviderConfigurationModal({ const handleOAuthLogin = async () => { setIsOAuthLoading(true); + clearDeviceCode(); setError(null); try { if (hasConfig) { @@ -390,11 +405,42 @@ export default function ProviderConfigurationModal({ providerName: provider.metadata.display_name, })} -

- {hasDeviceCodeFlow - ? intl.formatMessage(i18n.deviceCodeFlowHint) - : intl.formatMessage(i18n.browserWindowHint)} -

+ {hasDeviceCodeFlow && isOAuthLoading && deviceCode ? ( +
+

+ {intl.formatMessage(i18n.deviceCodeVisit)}{' '} + { + e.preventDefault(); + window.electron.openExternal(deviceCode.verificationUri); + }} + className="underline" + > + {deviceCode.verificationUri} + {' '} + {intl.formatMessage(i18n.deviceCodeAndEnter)} +

+
+ + {deviceCode.userCode} + + +
+
+ ) : ( +

+ {hasDeviceCodeFlow + ? intl.formatMessage(i18n.deviceCodeFlowHint) + : intl.formatMessage(i18n.browserWindowHint)} +

+ )} )} diff --git a/ui/desktop/src/hooks/useProviderDeviceCode.test.tsx b/ui/desktop/src/hooks/useProviderDeviceCode.test.tsx new file mode 100644 index 000000000..393300e74 --- /dev/null +++ b/ui/desktop/src/hooks/useProviderDeviceCode.test.tsx @@ -0,0 +1,32 @@ +import { act, renderHook } from '@testing-library/react'; +import { describe, expect, it } from 'vitest'; +import { useProviderDeviceCode } from './useProviderDeviceCode'; + +function dispatchDeviceCode(providerId: string, userCode: string) { + window.dispatchEvent( + new CustomEvent('goose:device-code', { + detail: { + providerId, + userCode, + verificationUri: 'https://example.com/device', + expiresIn: 300, + }, + }) + ); +} + +describe('useProviderDeviceCode', () => { + it('only accepts device codes for the requested provider', () => { + const { result } = renderHook(() => useProviderDeviceCode('github_copilot')); + + act(() => { + dispatchDeviceCode('kimicode', 'KIMI-CODE'); + }); + expect(result.current.deviceCode).toBeNull(); + + act(() => { + dispatchDeviceCode('github_copilot', 'COPILOT-CODE'); + }); + expect(result.current.deviceCode?.userCode).toBe('COPILOT-CODE'); + }); +}); diff --git a/ui/desktop/src/hooks/useProviderDeviceCode.ts b/ui/desktop/src/hooks/useProviderDeviceCode.ts new file mode 100644 index 000000000..2a3d01412 --- /dev/null +++ b/ui/desktop/src/hooks/useProviderDeviceCode.ts @@ -0,0 +1,24 @@ +import { useEffect, useState } from 'react'; +import type { ProviderDeviceCodeNotification_unstable } from '@aaif/goose-sdk'; + +export function useProviderDeviceCode(providerId: string) { + const [deviceCode, setDeviceCode] = useState( + null + ); + + useEffect(() => { + const handler = (event: Event) => { + const detail = (event as CustomEvent).detail; + if (detail.providerId === providerId) { + setDeviceCode(detail); + } + }; + window.addEventListener('goose:device-code', handler); + return () => window.removeEventListener('goose:device-code', handler); + }, [providerId]); + + return { + deviceCode: deviceCode?.providerId === providerId ? deviceCode : null, + clearDeviceCode: () => setDeviceCode(null), + }; +} diff --git a/ui/desktop/src/i18n/messages/de.json b/ui/desktop/src/i18n/messages/de.json index 402dc8ede..e88e35587 100644 --- a/ui/desktop/src/i18n/messages/de.json +++ b/ui/desktop/src/i18n/messages/de.json @@ -2742,7 +2742,7 @@ "defaultMessage": "Weiter" }, "providerConfigForm.deviceCodeFlowHint": { - "defaultMessage": "Es öffnet sich ein Browserfenster und der Bestätigungscode wird in Ihre Zwischenablage kopiert. Fügen Sie ihn im Browser ein, um die Anmeldung abzuschließen." + "defaultMessage": "Ein Browserfenster wird geöffnet. Der Bestätigungscode wird hier angezeigt, damit Sie ihn eingeben und die Anmeldung abschließen können." }, "providerConfigForm.noApiKey": { "defaultMessage": "Sie haben keinen API-Schlüssel?" @@ -2781,7 +2781,7 @@ "defaultMessage": "Dadurch wird die aktuelle Anbieterkonfiguration dauerhaft gelöscht." }, "providerConfigurationModal.deviceCodeFlowHint": { - "defaultMessage": "Es öffnet sich ein Browserfenster und der Bestätigungscode wird in Ihre Zwischenablage kopiert. Fügen Sie ihn im Browser ein, um die Anmeldung abzuschließen." + "defaultMessage": "Ein Browserfenster wird geöffnet. Der Bestätigungscode wird hier angezeigt, damit Sie ihn eingeben und die Anmeldung abschließen können." }, "providerConfigurationModal.errorCheckingConfig": { "defaultMessage": "Beim Überprüfen dieser Anbieterkonfiguration ist ein Fehler aufgetreten." @@ -4666,5 +4666,23 @@ }, "acpReadinessPanel.connectionNotChecked": { "defaultMessage": "Prüfen Sie Ihre Kontoverbindung, bevor Sie fortfahren." + }, + "providerConfigForm.deviceCodeAndEnter": { + "defaultMessage": "und geben Sie ein:" + }, + "providerConfigForm.deviceCodeCopy": { + "defaultMessage": "Kopieren" + }, + "providerConfigForm.deviceCodeVisit": { + "defaultMessage": "Besuchen Sie" + }, + "providerConfigurationModal.deviceCodeAndEnter": { + "defaultMessage": "und geben Sie ein:" + }, + "providerConfigurationModal.deviceCodeCopy": { + "defaultMessage": "Kopieren" + }, + "providerConfigurationModal.deviceCodeVisit": { + "defaultMessage": "Besuchen Sie" } } diff --git a/ui/desktop/src/i18n/messages/en.json b/ui/desktop/src/i18n/messages/en.json index 3d9a83314..baa70ac6d 100644 --- a/ui/desktop/src/i18n/messages/en.json +++ b/ui/desktop/src/i18n/messages/en.json @@ -2768,8 +2768,17 @@ "providerConfigForm.continue": { "defaultMessage": "Continue" }, + "providerConfigForm.deviceCodeAndEnter": { + "defaultMessage": "and enter:" + }, + "providerConfigForm.deviceCodeCopy": { + "defaultMessage": "Copy" + }, "providerConfigForm.deviceCodeFlowHint": { - "defaultMessage": "A browser window will open and the verification code will be copied to your clipboard. Paste it in the browser to complete sign-in." + "defaultMessage": "A browser window will open. The verification code will appear here so you can enter it to complete sign-in." + }, + "providerConfigForm.deviceCodeVisit": { + "defaultMessage": "Visit" }, "providerConfigForm.noApiKey": { "defaultMessage": "Don't have an API key?" @@ -2810,8 +2819,17 @@ "providerConfigurationModal.deleteConfirmation": { "defaultMessage": "This will permanently delete the current provider configuration." }, + "providerConfigurationModal.deviceCodeAndEnter": { + "defaultMessage": "and enter:" + }, + "providerConfigurationModal.deviceCodeCopy": { + "defaultMessage": "Copy" + }, "providerConfigurationModal.deviceCodeFlowHint": { - "defaultMessage": "A browser window will open and the verification code will be copied to your clipboard. Paste it in the browser to complete sign-in." + "defaultMessage": "A browser window will open. The verification code will appear here so you can enter it to complete sign-in." + }, + "providerConfigurationModal.deviceCodeVisit": { + "defaultMessage": "Visit" }, "providerConfigurationModal.errorCheckingConfig": { "defaultMessage": "There was an error checking this provider configuration." diff --git a/ui/desktop/src/i18n/messages/es.json b/ui/desktop/src/i18n/messages/es.json index 68107cf55..c1f8c5aff 100644 --- a/ui/desktop/src/i18n/messages/es.json +++ b/ui/desktop/src/i18n/messages/es.json @@ -2742,7 +2742,7 @@ "defaultMessage": "Continuar" }, "providerConfigForm.deviceCodeFlowHint": { - "defaultMessage": "Se abrirá una ventana del navegador y el código de verificación se copiará en tu portapapeles. Pégalo en el navegador para completar el inicio de sesión." + "defaultMessage": "Se abrirá una ventana del navegador. El código de verificación aparecerá aquí para que puedas introducirlo y completar el inicio de sesión." }, "providerConfigForm.noApiKey": { "defaultMessage": "¿No tienes una clave de API?" @@ -2781,7 +2781,7 @@ "defaultMessage": "Esto eliminará permanentemente la configuración actual del proveedor." }, "providerConfigurationModal.deviceCodeFlowHint": { - "defaultMessage": "Se abrirá una ventana del navegador y el código de verificación se copiará en tu portapapeles. Pégalo en el navegador para completar el inicio de sesión." + "defaultMessage": "Se abrirá una ventana del navegador. El código de verificación aparecerá aquí para que puedas introducirlo y completar el inicio de sesión." }, "providerConfigurationModal.errorCheckingConfig": { "defaultMessage": "Hubo un error al comprobar la configuración de este proveedor." @@ -4666,5 +4666,23 @@ }, "acpReadinessPanel.connectionNotChecked": { "defaultMessage": "Comprueba la conexión de tu cuenta antes de continuar." + }, + "providerConfigForm.deviceCodeAndEnter": { + "defaultMessage": "e ingresa:" + }, + "providerConfigForm.deviceCodeCopy": { + "defaultMessage": "Copiar" + }, + "providerConfigForm.deviceCodeVisit": { + "defaultMessage": "Visita" + }, + "providerConfigurationModal.deviceCodeAndEnter": { + "defaultMessage": "e ingresa:" + }, + "providerConfigurationModal.deviceCodeCopy": { + "defaultMessage": "Copiar" + }, + "providerConfigurationModal.deviceCodeVisit": { + "defaultMessage": "Visita" } } diff --git a/ui/desktop/src/i18n/messages/fr.json b/ui/desktop/src/i18n/messages/fr.json index b751e2690..f1bd4f1b7 100644 --- a/ui/desktop/src/i18n/messages/fr.json +++ b/ui/desktop/src/i18n/messages/fr.json @@ -2742,7 +2742,7 @@ "defaultMessage": "Continuer" }, "providerConfigForm.deviceCodeFlowHint": { - "defaultMessage": "Une fenêtre de navigateur s'ouvrira et le code de vérification sera copié dans votre presse-papiers. Collez-le dans le navigateur pour terminer la connexion." + "defaultMessage": "Une fenêtre de navigateur s’ouvrira. Le code de vérification apparaîtra ici afin que vous puissiez le saisir pour terminer la connexion." }, "providerConfigForm.noApiKey": { "defaultMessage": "Vous n'avez pas de clé API ?" @@ -2781,7 +2781,7 @@ "defaultMessage": "Cette action supprimera définitivement la configuration actuelle du fournisseur." }, "providerConfigurationModal.deviceCodeFlowHint": { - "defaultMessage": "Une fenêtre de navigateur s'ouvrira et le code de vérification sera copié dans votre presse-papiers. Collez-le dans le navigateur pour terminer la connexion." + "defaultMessage": "Une fenêtre de navigateur s’ouvrira. Le code de vérification apparaîtra ici afin que vous puissiez le saisir pour terminer la connexion." }, "providerConfigurationModal.errorCheckingConfig": { "defaultMessage": "Une erreur s'est produite lors de la vérification de la configuration de ce fournisseur." @@ -4666,5 +4666,23 @@ }, "acpReadinessPanel.connectionNotChecked": { "defaultMessage": "Vérifiez la connexion de votre compte avant de continuer." + }, + "providerConfigForm.deviceCodeAndEnter": { + "defaultMessage": "et entrez :" + }, + "providerConfigForm.deviceCodeCopy": { + "defaultMessage": "Copier" + }, + "providerConfigForm.deviceCodeVisit": { + "defaultMessage": "Visitez" + }, + "providerConfigurationModal.deviceCodeAndEnter": { + "defaultMessage": "et entrez :" + }, + "providerConfigurationModal.deviceCodeCopy": { + "defaultMessage": "Copier" + }, + "providerConfigurationModal.deviceCodeVisit": { + "defaultMessage": "Visitez" } } diff --git a/ui/desktop/src/i18n/messages/hi.json b/ui/desktop/src/i18n/messages/hi.json index 2ea5560c6..1177c59fe 100644 --- a/ui/desktop/src/i18n/messages/hi.json +++ b/ui/desktop/src/i18n/messages/hi.json @@ -2742,7 +2742,7 @@ "defaultMessage": "जारी रखें" }, "providerConfigForm.deviceCodeFlowHint": { - "defaultMessage": "एक ब्राउज़र विंडो खुलेगी और सत्यापन कोड आपके क्लिपबोर्ड पर कॉपी हो जाएगा। साइन-इन पूरा करने के लिए इसे ब्राउज़र में पेस्ट करें।" + "defaultMessage": "एक ब्राउज़र विंडो खुलेगी। सत्यापन कोड यहाँ दिखाई देगा, ताकि आप उसे दर्ज करके साइन-इन पूरा कर सकें।" }, "providerConfigForm.noApiKey": { "defaultMessage": "क्या आपके पास API कुंजी नहीं है?" @@ -2781,7 +2781,7 @@ "defaultMessage": "यह वर्तमान प्रदाता कॉन्फ़िगरेशन को स्थायी रूप से हटा देगा।" }, "providerConfigurationModal.deviceCodeFlowHint": { - "defaultMessage": "एक ब्राउज़र विंडो खुलेगी और सत्यापन कोड आपके क्लिपबोर्ड पर कॉपी हो जाएगा। साइन-इन पूरा करने के लिए इसे ब्राउज़र में पेस्ट करें।" + "defaultMessage": "एक ब्राउज़र विंडो खुलेगी। सत्यापन कोड यहाँ दिखाई देगा, ताकि आप उसे दर्ज करके साइन-इन पूरा कर सकें।" }, "providerConfigurationModal.errorCheckingConfig": { "defaultMessage": "इस प्रदाता कॉन्फ़िगरेशन की जाँच करने में त्रुटि हुई।" @@ -4666,5 +4666,23 @@ }, "acpReadinessPanel.connectionNotChecked": { "defaultMessage": "आगे बढ़ने से पहले अपने खाते का कनेक्शन जाँचें।" + }, + "providerConfigForm.deviceCodeAndEnter": { + "defaultMessage": "और दर्ज करें:" + }, + "providerConfigForm.deviceCodeCopy": { + "defaultMessage": "कॉपी करें" + }, + "providerConfigForm.deviceCodeVisit": { + "defaultMessage": "जाएं" + }, + "providerConfigurationModal.deviceCodeAndEnter": { + "defaultMessage": "और दर्ज करें:" + }, + "providerConfigurationModal.deviceCodeCopy": { + "defaultMessage": "कॉपी करें" + }, + "providerConfigurationModal.deviceCodeVisit": { + "defaultMessage": "जाएं" } } diff --git a/ui/desktop/src/i18n/messages/id.json b/ui/desktop/src/i18n/messages/id.json index c5516f2e1..d7b849014 100644 --- a/ui/desktop/src/i18n/messages/id.json +++ b/ui/desktop/src/i18n/messages/id.json @@ -2742,7 +2742,7 @@ "defaultMessage": "Lanjutkan" }, "providerConfigForm.deviceCodeFlowHint": { - "defaultMessage": "Jendela browser akan terbuka dan kode verifikasi akan disalin ke clipboard Anda. Tempelkan di browser untuk menyelesaikan proses masuk." + "defaultMessage": "Jendela browser akan terbuka. Kode verifikasi akan muncul di sini agar Anda dapat memasukkannya untuk menyelesaikan proses masuk." }, "providerConfigForm.noApiKey": { "defaultMessage": "Tidak punya kunci API?" @@ -2781,7 +2781,7 @@ "defaultMessage": "Tindakan ini akan menghapus konfigurasi penyedia saat ini secara permanen." }, "providerConfigurationModal.deviceCodeFlowHint": { - "defaultMessage": "Jendela browser akan terbuka dan kode verifikasi akan disalin ke clipboard Anda. Tempelkan di browser untuk menyelesaikan proses masuk." + "defaultMessage": "Jendela browser akan terbuka. Kode verifikasi akan muncul di sini agar Anda dapat memasukkannya untuk menyelesaikan proses masuk." }, "providerConfigurationModal.errorCheckingConfig": { "defaultMessage": "Terjadi kesalahan saat memeriksa konfigurasi penyedia ini." @@ -4666,5 +4666,23 @@ }, "acpReadinessPanel.connectionNotChecked": { "defaultMessage": "Periksa koneksi akun Anda sebelum melanjutkan." + }, + "providerConfigForm.deviceCodeAndEnter": { + "defaultMessage": "dan masukkan:" + }, + "providerConfigForm.deviceCodeCopy": { + "defaultMessage": "Salin" + }, + "providerConfigForm.deviceCodeVisit": { + "defaultMessage": "Kunjungi" + }, + "providerConfigurationModal.deviceCodeAndEnter": { + "defaultMessage": "dan masukkan:" + }, + "providerConfigurationModal.deviceCodeCopy": { + "defaultMessage": "Salin" + }, + "providerConfigurationModal.deviceCodeVisit": { + "defaultMessage": "Kunjungi" } } diff --git a/ui/desktop/src/i18n/messages/it.json b/ui/desktop/src/i18n/messages/it.json index c61c363cc..45b372522 100644 --- a/ui/desktop/src/i18n/messages/it.json +++ b/ui/desktop/src/i18n/messages/it.json @@ -2742,7 +2742,7 @@ "defaultMessage": "Continua" }, "providerConfigForm.deviceCodeFlowHint": { - "defaultMessage": "Si aprirà una finestra del browser e il codice di verifica verrà copiato negli appunti. Incollalo nel browser per completare l'accesso." + "defaultMessage": "Si aprirà una finestra del browser. Il codice di verifica verrà visualizzato qui, così potrai inserirlo per completare l'accesso." }, "providerConfigForm.noApiKey": { "defaultMessage": "Non hai una chiave API?" @@ -2781,7 +2781,7 @@ "defaultMessage": "Questa operazione eliminerà definitivamente la configurazione attuale del provider." }, "providerConfigurationModal.deviceCodeFlowHint": { - "defaultMessage": "Si aprirà una finestra del browser e il codice di verifica verrà copiato negli appunti. Incollalo nel browser per completare l'accesso." + "defaultMessage": "Si aprirà una finestra del browser. Il codice di verifica verrà visualizzato qui, così potrai inserirlo per completare l'accesso." }, "providerConfigurationModal.errorCheckingConfig": { "defaultMessage": "Si è verificato un errore durante la verifica della configurazione di questo provider." @@ -4666,5 +4666,23 @@ }, "acpReadinessPanel.connectionNotChecked": { "defaultMessage": "Verifica la connessione del tuo account prima di continuare." + }, + "providerConfigForm.deviceCodeAndEnter": { + "defaultMessage": "e inserisci:" + }, + "providerConfigForm.deviceCodeCopy": { + "defaultMessage": "Copia" + }, + "providerConfigForm.deviceCodeVisit": { + "defaultMessage": "Visita" + }, + "providerConfigurationModal.deviceCodeAndEnter": { + "defaultMessage": "e inserisci:" + }, + "providerConfigurationModal.deviceCodeCopy": { + "defaultMessage": "Copia" + }, + "providerConfigurationModal.deviceCodeVisit": { + "defaultMessage": "Visita" } } diff --git a/ui/desktop/src/i18n/messages/ja.json b/ui/desktop/src/i18n/messages/ja.json index c80eac853..9ef43c700 100644 --- a/ui/desktop/src/i18n/messages/ja.json +++ b/ui/desktop/src/i18n/messages/ja.json @@ -2742,7 +2742,7 @@ "defaultMessage": "続行" }, "providerConfigForm.deviceCodeFlowHint": { - "defaultMessage": "ブラウザーウィンドウが開き、確認コードがクリップボードにコピーされます。ブラウザーに貼り付けてサインインを完了してください。" + "defaultMessage": "ブラウザーウィンドウが開きます。確認コードがここに表示されるので、入力してサインインを完了してください。" }, "providerConfigForm.noApiKey": { "defaultMessage": "APIキーをお持ちでないですか?" @@ -2781,7 +2781,7 @@ "defaultMessage": "現在のプロバイダー設定は完全に削除されます。" }, "providerConfigurationModal.deviceCodeFlowHint": { - "defaultMessage": "ブラウザーウィンドウが開き、確認コードがクリップボードにコピーされます。ブラウザーに貼り付けてサインインを完了してください。" + "defaultMessage": "ブラウザーウィンドウが開きます。確認コードがここに表示されるので、入力してサインインを完了してください。" }, "providerConfigurationModal.errorCheckingConfig": { "defaultMessage": "このプロバイダー設定の確認中にエラーが発生しました。" @@ -4666,5 +4666,23 @@ }, "acpReadinessPanel.connectionNotChecked": { "defaultMessage": "続行する前にアカウントの接続を確認してください。" + }, + "providerConfigForm.deviceCodeAndEnter": { + "defaultMessage": "コードを入力してください:" + }, + "providerConfigForm.deviceCodeCopy": { + "defaultMessage": "コピー" + }, + "providerConfigForm.deviceCodeVisit": { + "defaultMessage": "次のURLにアクセスし、" + }, + "providerConfigurationModal.deviceCodeAndEnter": { + "defaultMessage": "コードを入力してください:" + }, + "providerConfigurationModal.deviceCodeCopy": { + "defaultMessage": "コピー" + }, + "providerConfigurationModal.deviceCodeVisit": { + "defaultMessage": "次のURLにアクセスし、" } } diff --git a/ui/desktop/src/i18n/messages/ko.json b/ui/desktop/src/i18n/messages/ko.json index 1566e8e66..eb45acbf2 100644 --- a/ui/desktop/src/i18n/messages/ko.json +++ b/ui/desktop/src/i18n/messages/ko.json @@ -2742,7 +2742,7 @@ "defaultMessage": "계속" }, "providerConfigForm.deviceCodeFlowHint": { - "defaultMessage": "브라우저 창이 열리고 인증 코드가 클립보드에 복사됩니다. 로그인을 완료하려면 브라우저에 붙여넣으세요." + "defaultMessage": "브라우저 창이 열립니다. 인증 코드가 여기에 표시되면 입력하여 로그인을 완료하세요." }, "providerConfigForm.noApiKey": { "defaultMessage": "API 키가 없나요?" @@ -2781,7 +2781,7 @@ "defaultMessage": "현재 제공업체 구성이 영구적으로 삭제됩니다." }, "providerConfigurationModal.deviceCodeFlowHint": { - "defaultMessage": "브라우저 창이 열리고 인증 코드가 클립보드에 복사됩니다. 로그인을 완료하려면 브라우저에 붙여넣으세요." + "defaultMessage": "브라우저 창이 열립니다. 인증 코드가 여기에 표시되면 입력하여 로그인을 완료하세요." }, "providerConfigurationModal.errorCheckingConfig": { "defaultMessage": "이 제공업체 구성을 확인하는 동안 오류가 발생했습니다." @@ -4666,5 +4666,23 @@ }, "acpReadinessPanel.connectionNotChecked": { "defaultMessage": "계속하기 전에 계정 연결을 확인하세요." + }, + "providerConfigForm.deviceCodeAndEnter": { + "defaultMessage": "코드를 입력하세요:" + }, + "providerConfigForm.deviceCodeCopy": { + "defaultMessage": "복사" + }, + "providerConfigForm.deviceCodeVisit": { + "defaultMessage": "방문하여" + }, + "providerConfigurationModal.deviceCodeAndEnter": { + "defaultMessage": "코드를 입력하세요:" + }, + "providerConfigurationModal.deviceCodeCopy": { + "defaultMessage": "복사" + }, + "providerConfigurationModal.deviceCodeVisit": { + "defaultMessage": "방문하여" } } diff --git a/ui/desktop/src/i18n/messages/ms.json b/ui/desktop/src/i18n/messages/ms.json index 8645992e0..92b89c1f4 100644 --- a/ui/desktop/src/i18n/messages/ms.json +++ b/ui/desktop/src/i18n/messages/ms.json @@ -2742,7 +2742,7 @@ "defaultMessage": "Teruskan" }, "providerConfigForm.deviceCodeFlowHint": { - "defaultMessage": "Tetingkap pelayar akan dibuka dan kod pengesahan akan disalin ke papan keratan anda. Tampalkannya dalam pelayar untuk melengkapkan log masuk." + "defaultMessage": "Tetingkap pelayar akan dibuka. Kod pengesahan akan dipaparkan di sini supaya anda boleh memasukkannya untuk melengkapkan log masuk." }, "providerConfigForm.noApiKey": { "defaultMessage": "Tidak mempunyai kunci API?" @@ -2781,7 +2781,7 @@ "defaultMessage": "Ini akan memadamkan konfigurasi penyedia semasa secara kekal." }, "providerConfigurationModal.deviceCodeFlowHint": { - "defaultMessage": "Tetingkap pelayar akan dibuka dan kod pengesahan akan disalin ke papan keratan anda. Tampalkannya dalam pelayar untuk melengkapkan log masuk." + "defaultMessage": "Tetingkap pelayar akan dibuka. Kod pengesahan akan dipaparkan di sini supaya anda boleh memasukkannya untuk melengkapkan log masuk." }, "providerConfigurationModal.errorCheckingConfig": { "defaultMessage": "Terdapat ralat semasa menyemak konfigurasi penyedia ini." @@ -4666,5 +4666,23 @@ }, "acpReadinessPanel.connectionNotChecked": { "defaultMessage": "Semak sambungan akaun anda sebelum meneruskan." + }, + "providerConfigForm.deviceCodeAndEnter": { + "defaultMessage": "dan masukkan:" + }, + "providerConfigForm.deviceCodeCopy": { + "defaultMessage": "Salin" + }, + "providerConfigForm.deviceCodeVisit": { + "defaultMessage": "Lawati" + }, + "providerConfigurationModal.deviceCodeAndEnter": { + "defaultMessage": "dan masukkan:" + }, + "providerConfigurationModal.deviceCodeCopy": { + "defaultMessage": "Salin" + }, + "providerConfigurationModal.deviceCodeVisit": { + "defaultMessage": "Lawati" } } diff --git a/ui/desktop/src/i18n/messages/pt.json b/ui/desktop/src/i18n/messages/pt.json index e1ec43b96..7f5b9d6c2 100644 --- a/ui/desktop/src/i18n/messages/pt.json +++ b/ui/desktop/src/i18n/messages/pt.json @@ -2742,7 +2742,7 @@ "defaultMessage": "Continuar" }, "providerConfigForm.deviceCodeFlowHint": { - "defaultMessage": "Será aberta uma janela do navegador e o código de verificação será copiado para a área de transferência. Cole-o no navegador para concluir o início de sessão." + "defaultMessage": "Será aberta uma janela do navegador. O código de verificação aparecerá aqui para que possa introduzi-lo e concluir o início de sessão." }, "providerConfigForm.noApiKey": { "defaultMessage": "Não tem uma chave de API?" @@ -2781,7 +2781,7 @@ "defaultMessage": "Isto irá eliminar permanentemente a configuração atual do fornecedor." }, "providerConfigurationModal.deviceCodeFlowHint": { - "defaultMessage": "Será aberta uma janela do navegador e o código de verificação será copiado para a área de transferência. Cole-o no navegador para concluir o início de sessão." + "defaultMessage": "Será aberta uma janela do navegador. O código de verificação aparecerá aqui para que possa introduzi-lo e concluir o início de sessão." }, "providerConfigurationModal.errorCheckingConfig": { "defaultMessage": "Ocorreu um erro ao verificar a configuração deste fornecedor." @@ -4666,5 +4666,23 @@ }, "acpReadinessPanel.connectionNotChecked": { "defaultMessage": "Verifique a ligação da sua conta antes de continuar." + }, + "providerConfigForm.deviceCodeAndEnter": { + "defaultMessage": "e insira:" + }, + "providerConfigForm.deviceCodeCopy": { + "defaultMessage": "Copiar" + }, + "providerConfigForm.deviceCodeVisit": { + "defaultMessage": "Acesse" + }, + "providerConfigurationModal.deviceCodeAndEnter": { + "defaultMessage": "e insira:" + }, + "providerConfigurationModal.deviceCodeCopy": { + "defaultMessage": "Copiar" + }, + "providerConfigurationModal.deviceCodeVisit": { + "defaultMessage": "Acesse" } } diff --git a/ui/desktop/src/i18n/messages/ru.json b/ui/desktop/src/i18n/messages/ru.json index 403c0f254..203b6d75f 100644 --- a/ui/desktop/src/i18n/messages/ru.json +++ b/ui/desktop/src/i18n/messages/ru.json @@ -2742,7 +2742,7 @@ "defaultMessage": "Продолжить" }, "providerConfigForm.deviceCodeFlowHint": { - "defaultMessage": "Откроется окно браузера, а код подтверждения будет скопирован в буфер обмена. Вставьте его в браузере, чтобы завершить вход." + "defaultMessage": "Откроется окно браузера. Код подтверждения появится здесь — введите его, чтобы завершить вход." }, "providerConfigForm.noApiKey": { "defaultMessage": "Нет API-ключа?" @@ -2781,7 +2781,7 @@ "defaultMessage": "Это навсегда удалит текущую конфигурацию провайдера." }, "providerConfigurationModal.deviceCodeFlowHint": { - "defaultMessage": "Откроется окно браузера, а код подтверждения будет скопирован в буфер обмена. Вставьте его в браузере, чтобы завершить вход." + "defaultMessage": "Откроется окно браузера. Код подтверждения появится здесь — введите его, чтобы завершить вход." }, "providerConfigurationModal.errorCheckingConfig": { "defaultMessage": "При проверке конфигурации этого провайдера произошла ошибка." @@ -4666,5 +4666,23 @@ }, "acpReadinessPanel.connectionNotChecked": { "defaultMessage": "Проверьте подключение учетной записи, прежде чем продолжить." + }, + "providerConfigForm.deviceCodeAndEnter": { + "defaultMessage": "и введите:" + }, + "providerConfigForm.deviceCodeCopy": { + "defaultMessage": "Копировать" + }, + "providerConfigForm.deviceCodeVisit": { + "defaultMessage": "Перейдите на" + }, + "providerConfigurationModal.deviceCodeAndEnter": { + "defaultMessage": "и введите:" + }, + "providerConfigurationModal.deviceCodeCopy": { + "defaultMessage": "Копировать" + }, + "providerConfigurationModal.deviceCodeVisit": { + "defaultMessage": "Перейдите на" } } diff --git a/ui/desktop/src/i18n/messages/tr.json b/ui/desktop/src/i18n/messages/tr.json index 7d2d7ea5b..e87120181 100644 --- a/ui/desktop/src/i18n/messages/tr.json +++ b/ui/desktop/src/i18n/messages/tr.json @@ -2742,7 +2742,7 @@ "defaultMessage": "Devam et" }, "providerConfigForm.deviceCodeFlowHint": { - "defaultMessage": "Bir tarayıcı penceresi açılacak ve doğrulama kodu panonuza kopyalanacaktır. Oturum açmayı tamamlamak için tarayıcıya yapıştırın." + "defaultMessage": "Bir tarayıcı penceresi açılacak. Doğrulama kodu burada görünecek; oturum açmayı tamamlamak için kodu girin." }, "providerConfigForm.noApiKey": { "defaultMessage": "API anahtarınız yok mu?" @@ -2781,7 +2781,7 @@ "defaultMessage": "Bu, mevcut sağlayıcı yapılandırmasını kalıcı olarak silecektir." }, "providerConfigurationModal.deviceCodeFlowHint": { - "defaultMessage": "Bir tarayıcı penceresi açılacak ve doğrulama kodu panonuza kopyalanacaktır. Oturum açmayı tamamlamak için tarayıcıya yapıştırın." + "defaultMessage": "Bir tarayıcı penceresi açılacak. Doğrulama kodu burada görünecek; oturum açmayı tamamlamak için kodu girin." }, "providerConfigurationModal.errorCheckingConfig": { "defaultMessage": "Bu sağlayıcı yapılandırması kontrol edilirken bir hata oluştu." @@ -4666,5 +4666,23 @@ }, "acpReadinessPanel.connectionNotChecked": { "defaultMessage": "Devam etmeden önce hesap bağlantınızı kontrol edin." + }, + "providerConfigForm.deviceCodeAndEnter": { + "defaultMessage": "ve girin:" + }, + "providerConfigForm.deviceCodeCopy": { + "defaultMessage": "Kopyala" + }, + "providerConfigForm.deviceCodeVisit": { + "defaultMessage": "Ziyaret edin" + }, + "providerConfigurationModal.deviceCodeAndEnter": { + "defaultMessage": "ve girin:" + }, + "providerConfigurationModal.deviceCodeCopy": { + "defaultMessage": "Kopyala" + }, + "providerConfigurationModal.deviceCodeVisit": { + "defaultMessage": "Ziyaret edin" } } diff --git a/ui/desktop/src/i18n/messages/vi.json b/ui/desktop/src/i18n/messages/vi.json index bb150a88e..986d8abc0 100644 --- a/ui/desktop/src/i18n/messages/vi.json +++ b/ui/desktop/src/i18n/messages/vi.json @@ -2742,7 +2742,7 @@ "defaultMessage": "Tiếp tục" }, "providerConfigForm.deviceCodeFlowHint": { - "defaultMessage": "Một cửa sổ trình duyệt sẽ mở ra và mã xác minh sẽ được sao chép vào bộ nhớ tạm của bạn. Dán mã vào trình duyệt để hoàn tất đăng nhập." + "defaultMessage": "Một cửa sổ trình duyệt sẽ mở ra. Mã xác minh sẽ xuất hiện tại đây để bạn nhập và hoàn tất đăng nhập." }, "providerConfigForm.noApiKey": { "defaultMessage": "Bạn chưa có khóa API?" @@ -2781,7 +2781,7 @@ "defaultMessage": "Thao tác này sẽ xóa vĩnh viễn cấu hình nhà cung cấp hiện tại." }, "providerConfigurationModal.deviceCodeFlowHint": { - "defaultMessage": "Một cửa sổ trình duyệt sẽ mở ra và mã xác minh sẽ được sao chép vào bộ nhớ tạm của bạn. Dán mã vào trình duyệt để hoàn tất đăng nhập." + "defaultMessage": "Một cửa sổ trình duyệt sẽ mở ra. Mã xác minh sẽ xuất hiện tại đây để bạn nhập và hoàn tất đăng nhập." }, "providerConfigurationModal.errorCheckingConfig": { "defaultMessage": "Đã xảy ra lỗi khi kiểm tra cấu hình nhà cung cấp này." @@ -4666,5 +4666,23 @@ }, "acpReadinessPanel.connectionNotChecked": { "defaultMessage": "Hãy kiểm tra kết nối tài khoản trước khi tiếp tục." + }, + "providerConfigForm.deviceCodeAndEnter": { + "defaultMessage": "và nhập:" + }, + "providerConfigForm.deviceCodeCopy": { + "defaultMessage": "Sao chép" + }, + "providerConfigForm.deviceCodeVisit": { + "defaultMessage": "Truy cập" + }, + "providerConfigurationModal.deviceCodeAndEnter": { + "defaultMessage": "và nhập:" + }, + "providerConfigurationModal.deviceCodeCopy": { + "defaultMessage": "Sao chép" + }, + "providerConfigurationModal.deviceCodeVisit": { + "defaultMessage": "Truy cập" } } diff --git a/ui/desktop/src/i18n/messages/zh-CN.json b/ui/desktop/src/i18n/messages/zh-CN.json index 9c0fb2d06..b8e53b01d 100644 --- a/ui/desktop/src/i18n/messages/zh-CN.json +++ b/ui/desktop/src/i18n/messages/zh-CN.json @@ -2742,7 +2742,7 @@ "defaultMessage": "继续" }, "providerConfigForm.deviceCodeFlowHint": { - "defaultMessage": "将打开浏览器窗口,验证码将复制到剪贴板。把它粘贴到浏览器即可完成登录。" + "defaultMessage": "将打开浏览器窗口。验证码会显示在此处,输入验证码即可完成登录。" }, "providerConfigForm.noApiKey": { "defaultMessage": "没有 API 密钥?" @@ -2781,7 +2781,7 @@ "defaultMessage": "这将永久删除当前的提供商配置。" }, "providerConfigurationModal.deviceCodeFlowHint": { - "defaultMessage": "将打开浏览器窗口,验证码将复制到剪贴板。把它粘贴到浏览器即可完成登录。" + "defaultMessage": "将打开浏览器窗口。验证码会显示在此处,输入验证码即可完成登录。" }, "providerConfigurationModal.errorCheckingConfig": { "defaultMessage": "检查此提供商配置时出错。" @@ -4666,5 +4666,23 @@ }, "acpReadinessPanel.connectionNotChecked": { "defaultMessage": "请先检查账户连接,然后再继续。" + }, + "providerConfigForm.deviceCodeAndEnter": { + "defaultMessage": "并输入:" + }, + "providerConfigForm.deviceCodeCopy": { + "defaultMessage": "复制" + }, + "providerConfigForm.deviceCodeVisit": { + "defaultMessage": "访问" + }, + "providerConfigurationModal.deviceCodeAndEnter": { + "defaultMessage": "并输入:" + }, + "providerConfigurationModal.deviceCodeCopy": { + "defaultMessage": "复制" + }, + "providerConfigurationModal.deviceCodeVisit": { + "defaultMessage": "访问" } } diff --git a/ui/desktop/src/i18n/messages/zh-TW.json b/ui/desktop/src/i18n/messages/zh-TW.json index 6100f4edb..81d074881 100644 --- a/ui/desktop/src/i18n/messages/zh-TW.json +++ b/ui/desktop/src/i18n/messages/zh-TW.json @@ -2742,7 +2742,7 @@ "defaultMessage": "繼續" }, "providerConfigForm.deviceCodeFlowHint": { - "defaultMessage": "將開啟瀏覽器視窗,且驗證碼會複製到您的剪貼簿。將其貼到瀏覽器中以完成登入。" + "defaultMessage": "將開啟瀏覽器視窗。驗證碼會顯示在此處,輸入驗證碼即可完成登入。" }, "providerConfigForm.noApiKey": { "defaultMessage": "沒有 API 金鑰嗎?" @@ -2781,7 +2781,7 @@ "defaultMessage": "這將永久刪除目前的提供者組態。" }, "providerConfigurationModal.deviceCodeFlowHint": { - "defaultMessage": "將開啟瀏覽器視窗,且驗證碼會複製到您的剪貼簿。將其貼到瀏覽器中以完成登入。" + "defaultMessage": "將開啟瀏覽器視窗。驗證碼會顯示在此處,輸入驗證碼即可完成登入。" }, "providerConfigurationModal.errorCheckingConfig": { "defaultMessage": "檢查此提供者組態時發生錯誤。" @@ -4666,5 +4666,23 @@ }, "acpReadinessPanel.connectionNotChecked": { "defaultMessage": "請先檢查帳戶連線,然後再繼續。" + }, + "providerConfigForm.deviceCodeAndEnter": { + "defaultMessage": "並輸入:" + }, + "providerConfigForm.deviceCodeCopy": { + "defaultMessage": "複製" + }, + "providerConfigForm.deviceCodeVisit": { + "defaultMessage": "前往" + }, + "providerConfigurationModal.deviceCodeAndEnter": { + "defaultMessage": "並輸入:" + }, + "providerConfigurationModal.deviceCodeCopy": { + "defaultMessage": "複製" + }, + "providerConfigurationModal.deviceCodeVisit": { + "defaultMessage": "前往" } } diff --git a/ui/sdk/src/generated/index.ts b/ui/sdk/src/generated/index.ts index 3cfc508c4..89dca4e30 100644 --- a/ui/sdk/src/generated/index.ts +++ b/ui/sdk/src/generated/index.ts @@ -1,6 +1,6 @@ // This file is auto-generated by @hey-api/openapi-ts -export type { AddConfigExtensionRequest_unstable, AddSessionExtensionRequest_unstable, AgentMention, Annotations, AppsDeleteRequest_unstable, AppsDeleteResponse_unstable, AppsExportRequest_unstable, AppsExportResponse_unstable, AppsImportRequest_unstable, AppsImportResponse_unstable, AppsListRequest_unstable, AppsListResponse_unstable, ArchiveSessionRequest_unstable, AudioContent, AvailableCommand, AvailableCommandInput, BlobResourceContents, CanonicalModelInfoDto, CanonicalModelInfoRequest_unstable, CanonicalModelInfoResponse_unstable, ConfigReadAllRequest_unstable, ConfigReadAllResponse_unstable, ConfigReadRequest_unstable, ConfigReadResponse_unstable, ConfigRemoveRequest_unstable, ConfigUpsertRequest_unstable, ContentBlock, CostSourceData, CreateScheduleRequest_unstable, CreateScheduleResponse_unstable, CreateSourceRequest_unstable, CreateSourceResponse_unstable, CustomProviderConfigDto, CustomProviderCreateRequest_unstable, CustomProviderCreateResponse_unstable, CustomProviderDeleteRequest_unstable, CustomProviderDeleteResponse_unstable, CustomProviderReadRequest_unstable, CustomProviderReadResponse_unstable, CustomProviderUpdateRequest_unstable, CustomProviderUpdateResponse_unstable, DecodeRecipeRequest_unstable, DecodeRecipeResponse_unstable, DefaultsClearRequest_unstable, DefaultsReadRequest_unstable, DefaultsReadResponse_unstable, DefaultsSaveRequest_unstable, DeleteRecipeRequest_unstable, DeleteScheduleRequest_unstable, DeleteSourceRequest_unstable, DiagnosticsGetRequest_unstable, DiagnosticsGetResponse_unstable, DiagnosticsReportLevel, DictationConfigRequest_unstable, DictationConfigResponse_unstable, DictationDownloadProgress, DictationLocalModelStatus, DictationModelCancelRequest_unstable, DictationModelDeleteRequest_unstable, DictationModelDownloadProgressRequest_unstable, DictationModelDownloadProgressResponse_unstable, DictationModelDownloadRequest_unstable, DictationModelOption, DictationModelSelectRequest_unstable, DictationModelsListRequest_unstable, DictationModelsListResponse_unstable, DictationProviderStatusEntry, DictationSecretDeleteRequest_unstable, DictationSecretSaveRequest_unstable, DictationTranscribeRequest_unstable, DictationTranscribeResponse_unstable, EmbeddedResource, EmbeddedResourceResource, EmptyResponse, EncodeRecipeRequest_unstable, EncodeRecipeResponse_unstable, EnvVariable, ExportSessionRequest_unstable, ExportSessionResponse_unstable, ExportSourceRequest_unstable, ExportSourceResponse_unstable, ExtAgentRequest, ExtAgentResponse, ExtNotification, ExtRequest, ExtResponse, GetAvailableExtensionsRequest_unstable, GetAvailableExtensionsResponse_unstable, GetConfigExtensionsRequest_unstable, GetConfigExtensionsResponse_unstable, GetPromptRequest_unstable, GetPromptResponse_unstable, GetSessionExtensionsRequest_unstable, GetSessionExtensionsResponse_unstable, GetSessionInfoRequest_unstable, GetSessionInfoResponse_unstable, GetToolsRequest_unstable, GetToolsResponse_unstable, GooseExtension, GooseExtensionEntry, GooseSessionNotification_unstable, GooseSessionUpdate, GooseToolCallRequest_unstable, GooseToolCallResponse_unstable, HttpHeader, ImageContent, ImportSessionRequest_unstable, ImportSessionResponse_unstable, ImportSourcesRequest_unstable, ImportSourcesResponse_unstable, InspectRunningJobRequest_unstable, InspectRunningJobResponse_unstable, KillRunningJobRequest_unstable, KillRunningJobResponse_unstable, ListAgentMentionsRequest_unstable, ListAgentMentionsResponse_unstable, ListPromptsRequest_unstable, ListPromptsResponse_unstable, ListProvidersRequest_unstable, ListProvidersResponse_unstable, ListRecipesRequest_unstable, ListRecipesResponse_unstable, ListScheduleSessionsRequest_unstable, ListScheduleSessionsResponse_unstable, ListSchedulesRequest_unstable, ListSchedulesResponse_unstable, ListSlashCommandsRequest_unstable, ListSlashCommandsResponse_unstable, ListSourcesRequest_unstable, ListSourcesResponse_unstable, LocalInferenceBuiltinChatTemplatesListRequest_unstable, LocalInferenceBuiltinChatTemplatesListResponse_unstable, LocalInferenceChatTemplate, LocalInferenceDownloadProgressDto, LocalInferenceDownloadState, LocalInferenceHfGgufFileDto, LocalInferenceHfModelInfoDto, LocalInferenceHfModelVariantDto, LocalInferenceHuggingFaceRepoVariantsRequest_unstable, LocalInferenceHuggingFaceRepoVariantsResponse_unstable, LocalInferenceHuggingFaceSearchRequest_unstable, LocalInferenceHuggingFaceSearchResponse_unstable, LocalInferenceModelDeleteRequest_unstable, LocalInferenceModelDownloadCancelRequest_unstable, LocalInferenceModelDownloadProgressRequest_unstable, LocalInferenceModelDownloadProgressResponse_unstable, LocalInferenceModelDownloadRequest_unstable, LocalInferenceModelDownloadResponse_unstable, LocalInferenceModelDownloadStatusDto, LocalInferenceModelDto, LocalInferenceModelEvictRequest_unstable, LocalInferenceModelSettingsDto, LocalInferenceModelSettingsReadRequest_unstable, LocalInferenceModelSettingsReadResponse_unstable, LocalInferenceModelSettingsUpdateRequest_unstable, LocalInferenceModelSettingsUpdateResponse_unstable, LocalInferenceModelsListRequest_unstable, LocalInferenceModelsListResponse_unstable, LocalInferenceSamplingConfig, LocalInferenceToolCallingMode, McpServer, McpServerHttp, McpServerSse, McpServerStdio, MessageUsageData, MessageUsageUpdate, OnboardingImportApplyRequest_unstable, OnboardingImportApplyResponse_unstable, OnboardingImportCandidate, OnboardingImportCounts, OnboardingImportScanRequest_unstable, OnboardingImportScanResponse_unstable, OnboardingImportSourceKind, ParseRecipeRequest_unstable, ParseRecipeResponse_unstable, PauseScheduleRequest_unstable, PreferenceKey, PreferencesReadRequest_unstable, PreferencesReadResponse_unstable, PreferencesRemoveRequest_unstable, PreferencesSaveRequest_unstable, PreferenceValue, PromptOperationResponse_unstable, PromptTemplateEntry, ProviderCatalogListRequest_unstable, ProviderCatalogListResponse_unstable, ProviderCatalogTemplateRequest_unstable, ProviderCatalogTemplateResponse_unstable, ProviderConfigAuthenticateRequest_unstable, ProviderConfigChangeResponse_unstable, ProviderConfigDeleteRequest_unstable, ProviderConfigFieldUpdate, ProviderConfigFieldValueDto, ProviderConfigKey, ProviderConfigReadRequest_unstable, ProviderConfigReadResponse_unstable, ProviderConfigSaveRequest_unstable, ProviderConfigStatusDto, ProviderConfigStatusRequest_unstable, ProviderConfigStatusResponse_unstable, ProviderInventoryEntryDto, ProviderInventoryModelDto, ProviderReadinessCheckRequest_unstable, ProviderReadinessCheckResponse_unstable, ProviderSecretDeleteRequest_unstable, ProviderSecretDto, ProviderSecretsListRequest_unstable, ProviderSecretsListResponse_unstable, ProviderSecretStatusDto, ProviderSecretStorageDto, ProviderSetupCatalogEntryDto, ProviderSetupCatalogListRequest_unstable, ProviderSetupCatalogListResponse_unstable, ProviderSetupCategoryDto, ProviderSetupFieldDto, ProviderSetupGroupDto, ProviderSetupMethodDto, ProviderSupportedModelsListRequest_unstable, ProviderSupportedModelsListResponse_unstable, ProviderTemplateCapabilitiesDto, ProviderTemplateCatalogEntryDto, ProviderTemplateDto, ProviderTemplateModelDto, ReadResourceRequest_unstable, ReadResourceResponse_unstable, RecipeAuthorDto, RecipeDto, RecipeExtensionDto, RecipeListEntryDto, RecipeParameterDto, RecipeParameterInputTypeDto, RecipeParameterRequirementDto, RecipeParamsAction, RecipeParamsResponse_unstable, RecipeResponseDto, RecipeRetryConfigDto, RecipeSettingsDto, RecipeSuccessCheckDto, RecipeToYamlRequest_unstable, RecipeToYamlResponse_unstable, RefreshProviderInventoryRequest_unstable, RefreshProviderInventoryResponse_unstable, RefreshProviderInventorySkipDto, RefreshProviderInventorySkipReasonDto, RemoveConfigExtensionRequest_unstable, RemoveSessionExtensionRequest_unstable, RenameSessionRequest_unstable, RequestRecipeParams_unstable, ResetPromptRequest_unstable, ResourceLink, Role, RunScheduleNowRequest_unstable, RunScheduleNowResponse_unstable, RunScheduleNowStatus, SavePromptRequest_unstable, SaveRecipeRequest_unstable, SaveRecipeResponse_unstable, ScanRecipeRequest_unstable, ScanRecipeResponse_unstable, ScheduledJobDto, ScheduleRecipeRequest_unstable, SessionExportFormat, SessionId, SessionImportSource, SessionInfo, SessionSystemPromptMode, SessionUsageUpdate, SetConfigExtensionEnabledRequest_unstable, SetRecipeSlashCommandRequest_unstable, SetSessionSystemPromptRequest_unstable, SetToolPermissionsRequest_unstable, SetToolPermissionsResponse_unstable, ShareSessionNostrRequest_unstable, ShareSessionNostrResponse_unstable, SourceEntry, SourceScope, SourceType, StatusMessage, StatusMessageUpdate, SteerSessionRequest_unstable, SteerSessionResponse_unstable, SubRecipeDto, TextContent, TextResourceContents, ToolListItem, ToolPermissionEntry, ToolPermissionLevel, TruncateSessionConversationRequest_unstable, UnarchiveSessionRequest_unstable, UnpauseScheduleRequest_unstable, UnstructuredCommandInput, UpdateScheduleRequest_unstable, UpdateScheduleResponse_unstable, UpdateSessionProjectRequest_unstable, UpdateSourceRequest_unstable, UpdateSourceResponse_unstable, UpdateWorkingDirRequest_unstable } from './types.gen.js'; +export type { AddConfigExtensionRequest_unstable, AddSessionExtensionRequest_unstable, AgentMention, Annotations, AppsDeleteRequest_unstable, AppsDeleteResponse_unstable, AppsExportRequest_unstable, AppsExportResponse_unstable, AppsImportRequest_unstable, AppsImportResponse_unstable, AppsListRequest_unstable, AppsListResponse_unstable, ArchiveSessionRequest_unstable, AudioContent, AvailableCommand, AvailableCommandInput, BlobResourceContents, CanonicalModelInfoDto, CanonicalModelInfoRequest_unstable, CanonicalModelInfoResponse_unstable, ConfigReadAllRequest_unstable, ConfigReadAllResponse_unstable, ConfigReadRequest_unstable, ConfigReadResponse_unstable, ConfigRemoveRequest_unstable, ConfigUpsertRequest_unstable, ContentBlock, CostSourceData, CreateScheduleRequest_unstable, CreateScheduleResponse_unstable, CreateSourceRequest_unstable, CreateSourceResponse_unstable, CustomProviderConfigDto, CustomProviderCreateRequest_unstable, CustomProviderCreateResponse_unstable, CustomProviderDeleteRequest_unstable, CustomProviderDeleteResponse_unstable, CustomProviderReadRequest_unstable, CustomProviderReadResponse_unstable, CustomProviderUpdateRequest_unstable, CustomProviderUpdateResponse_unstable, DecodeRecipeRequest_unstable, DecodeRecipeResponse_unstable, DefaultsClearRequest_unstable, DefaultsReadRequest_unstable, DefaultsReadResponse_unstable, DefaultsSaveRequest_unstable, DeleteRecipeRequest_unstable, DeleteScheduleRequest_unstable, DeleteSourceRequest_unstable, DiagnosticsGetRequest_unstable, DiagnosticsGetResponse_unstable, DiagnosticsReportLevel, DictationConfigRequest_unstable, DictationConfigResponse_unstable, DictationDownloadProgress, DictationLocalModelStatus, DictationModelCancelRequest_unstable, DictationModelDeleteRequest_unstable, DictationModelDownloadProgressRequest_unstable, DictationModelDownloadProgressResponse_unstable, DictationModelDownloadRequest_unstable, DictationModelOption, DictationModelSelectRequest_unstable, DictationModelsListRequest_unstable, DictationModelsListResponse_unstable, DictationProviderStatusEntry, DictationSecretDeleteRequest_unstable, DictationSecretSaveRequest_unstable, DictationTranscribeRequest_unstable, DictationTranscribeResponse_unstable, EmbeddedResource, EmbeddedResourceResource, EmptyResponse, EncodeRecipeRequest_unstable, EncodeRecipeResponse_unstable, EnvVariable, ExportSessionRequest_unstable, ExportSessionResponse_unstable, ExportSourceRequest_unstable, ExportSourceResponse_unstable, ExtAgentRequest, ExtAgentResponse, ExtNotification, ExtRequest, ExtResponse, GetAvailableExtensionsRequest_unstable, GetAvailableExtensionsResponse_unstable, GetConfigExtensionsRequest_unstable, GetConfigExtensionsResponse_unstable, GetPromptRequest_unstable, GetPromptResponse_unstable, GetSessionExtensionsRequest_unstable, GetSessionExtensionsResponse_unstable, GetSessionInfoRequest_unstable, GetSessionInfoResponse_unstable, GetToolsRequest_unstable, GetToolsResponse_unstable, GooseExtension, GooseExtensionEntry, GooseSessionNotification_unstable, GooseSessionUpdate, GooseToolCallRequest_unstable, GooseToolCallResponse_unstable, HttpHeader, ImageContent, ImportSessionRequest_unstable, ImportSessionResponse_unstable, ImportSourcesRequest_unstable, ImportSourcesResponse_unstable, InspectRunningJobRequest_unstable, InspectRunningJobResponse_unstable, KillRunningJobRequest_unstable, KillRunningJobResponse_unstable, ListAgentMentionsRequest_unstable, ListAgentMentionsResponse_unstable, ListPromptsRequest_unstable, ListPromptsResponse_unstable, ListProvidersRequest_unstable, ListProvidersResponse_unstable, ListRecipesRequest_unstable, ListRecipesResponse_unstable, ListScheduleSessionsRequest_unstable, ListScheduleSessionsResponse_unstable, ListSchedulesRequest_unstable, ListSchedulesResponse_unstable, ListSlashCommandsRequest_unstable, ListSlashCommandsResponse_unstable, ListSourcesRequest_unstable, ListSourcesResponse_unstable, LocalInferenceBuiltinChatTemplatesListRequest_unstable, LocalInferenceBuiltinChatTemplatesListResponse_unstable, LocalInferenceChatTemplate, LocalInferenceDownloadProgressDto, LocalInferenceDownloadState, LocalInferenceHfGgufFileDto, LocalInferenceHfModelInfoDto, LocalInferenceHfModelVariantDto, LocalInferenceHuggingFaceRepoVariantsRequest_unstable, LocalInferenceHuggingFaceRepoVariantsResponse_unstable, LocalInferenceHuggingFaceSearchRequest_unstable, LocalInferenceHuggingFaceSearchResponse_unstable, LocalInferenceModelDeleteRequest_unstable, LocalInferenceModelDownloadCancelRequest_unstable, LocalInferenceModelDownloadProgressRequest_unstable, LocalInferenceModelDownloadProgressResponse_unstable, LocalInferenceModelDownloadRequest_unstable, LocalInferenceModelDownloadResponse_unstable, LocalInferenceModelDownloadStatusDto, LocalInferenceModelDto, LocalInferenceModelEvictRequest_unstable, LocalInferenceModelSettingsDto, LocalInferenceModelSettingsReadRequest_unstable, LocalInferenceModelSettingsReadResponse_unstable, LocalInferenceModelSettingsUpdateRequest_unstable, LocalInferenceModelSettingsUpdateResponse_unstable, LocalInferenceModelsListRequest_unstable, LocalInferenceModelsListResponse_unstable, LocalInferenceSamplingConfig, LocalInferenceToolCallingMode, McpServer, McpServerHttp, McpServerSse, McpServerStdio, MessageUsageData, MessageUsageUpdate, OnboardingImportApplyRequest_unstable, OnboardingImportApplyResponse_unstable, OnboardingImportCandidate, OnboardingImportCounts, OnboardingImportScanRequest_unstable, OnboardingImportScanResponse_unstable, OnboardingImportSourceKind, ParseRecipeRequest_unstable, ParseRecipeResponse_unstable, PauseScheduleRequest_unstable, PreferenceKey, PreferencesReadRequest_unstable, PreferencesReadResponse_unstable, PreferencesRemoveRequest_unstable, PreferencesSaveRequest_unstable, PreferenceValue, PromptOperationResponse_unstable, PromptTemplateEntry, ProviderCatalogListRequest_unstable, ProviderCatalogListResponse_unstable, ProviderCatalogTemplateRequest_unstable, ProviderCatalogTemplateResponse_unstable, ProviderConfigAuthenticateRequest_unstable, ProviderConfigChangeResponse_unstable, ProviderConfigDeleteRequest_unstable, ProviderConfigFieldUpdate, ProviderConfigFieldValueDto, ProviderConfigKey, ProviderConfigReadRequest_unstable, ProviderConfigReadResponse_unstable, ProviderConfigSaveRequest_unstable, ProviderConfigStatusDto, ProviderConfigStatusRequest_unstable, ProviderConfigStatusResponse_unstable, ProviderDeviceCodeNotification_unstable, ProviderInventoryEntryDto, ProviderInventoryModelDto, ProviderReadinessCheckRequest_unstable, ProviderReadinessCheckResponse_unstable, ProviderSecretDeleteRequest_unstable, ProviderSecretDto, ProviderSecretsListRequest_unstable, ProviderSecretsListResponse_unstable, ProviderSecretStatusDto, ProviderSecretStorageDto, ProviderSetupCatalogEntryDto, ProviderSetupCatalogListRequest_unstable, ProviderSetupCatalogListResponse_unstable, ProviderSetupCategoryDto, ProviderSetupFieldDto, ProviderSetupGroupDto, ProviderSetupMethodDto, ProviderSupportedModelsListRequest_unstable, ProviderSupportedModelsListResponse_unstable, ProviderTemplateCapabilitiesDto, ProviderTemplateCatalogEntryDto, ProviderTemplateDto, ProviderTemplateModelDto, ReadResourceRequest_unstable, ReadResourceResponse_unstable, RecipeAuthorDto, RecipeDto, RecipeExtensionDto, RecipeListEntryDto, RecipeParameterDto, RecipeParameterInputTypeDto, RecipeParameterRequirementDto, RecipeParamsAction, RecipeParamsResponse_unstable, RecipeResponseDto, RecipeRetryConfigDto, RecipeSettingsDto, RecipeSuccessCheckDto, RecipeToYamlRequest_unstable, RecipeToYamlResponse_unstable, RefreshProviderInventoryRequest_unstable, RefreshProviderInventoryResponse_unstable, RefreshProviderInventorySkipDto, RefreshProviderInventorySkipReasonDto, RemoveConfigExtensionRequest_unstable, RemoveSessionExtensionRequest_unstable, RenameSessionRequest_unstable, RequestRecipeParams_unstable, ResetPromptRequest_unstable, ResourceLink, Role, RunScheduleNowRequest_unstable, RunScheduleNowResponse_unstable, RunScheduleNowStatus, SavePromptRequest_unstable, SaveRecipeRequest_unstable, SaveRecipeResponse_unstable, ScanRecipeRequest_unstable, ScanRecipeResponse_unstable, ScheduledJobDto, ScheduleRecipeRequest_unstable, SessionExportFormat, SessionId, SessionImportSource, SessionInfo, SessionSystemPromptMode, SessionUsageUpdate, SetConfigExtensionEnabledRequest_unstable, SetRecipeSlashCommandRequest_unstable, SetSessionSystemPromptRequest_unstable, SetToolPermissionsRequest_unstable, SetToolPermissionsResponse_unstable, ShareSessionNostrRequest_unstable, ShareSessionNostrResponse_unstable, SourceEntry, SourceScope, SourceType, StatusMessage, StatusMessageUpdate, SteerSessionRequest_unstable, SteerSessionResponse_unstable, SubRecipeDto, TextContent, TextResourceContents, ToolListItem, ToolPermissionEntry, ToolPermissionLevel, TruncateSessionConversationRequest_unstable, UnarchiveSessionRequest_unstable, UnpauseScheduleRequest_unstable, UnstructuredCommandInput, UpdateScheduleRequest_unstable, UpdateScheduleResponse_unstable, UpdateSessionProjectRequest_unstable, UpdateSourceRequest_unstable, UpdateSourceResponse_unstable, UpdateWorkingDirRequest_unstable } from './types.gen.js'; export const GOOSE_EXT_METHODS = [ { @@ -577,6 +577,10 @@ export const GOOSE_EXT_NOTIFICATIONS = [ method: "_goose/unstable/session/update", paramsType: "GooseSessionNotification_unstable", }, + { + method: "_goose/unstable/providers/authentication/device-code", + paramsType: "ProviderDeviceCodeNotification_unstable", + }, ] as const; export type GooseExtNotification = (typeof GOOSE_EXT_NOTIFICATIONS)[number]; diff --git a/ui/sdk/src/generated/types.gen.ts b/ui/sdk/src/generated/types.gen.ts index c94503d9f..0b1f0ce30 100644 --- a/ui/sdk/src/generated/types.gen.ts +++ b/ui/sdk/src/generated/types.gen.ts @@ -2626,6 +2626,18 @@ export type MessageUsageUpdate = { usage: MessageUsageData; }; +/** + * Dedicated provider notification for OAuth device-code flow. + * Sent during provider authentication when the ACP client supports + * `goose.customNotifications` — avoids a fake empty session ID. + */ +export type ProviderDeviceCodeNotification_unstable = { + providerId: string; + userCode: string; + verificationUri: string; + expiresIn: number; +}; + export type RequestRecipeParams_unstable = { sessionId: string; parameters: Array; @@ -2663,7 +2675,7 @@ export type ExtResponse = { export type ExtNotification = { method: string; - params?: GooseSessionNotification_unstable | { + params?: GooseSessionNotification_unstable | ProviderDeviceCodeNotification_unstable | { [key: string]: unknown; } | null; }; diff --git a/ui/sdk/src/generated/zod.gen.ts b/ui/sdk/src/generated/zod.gen.ts index 514c5e22e..6d1ede15a 100644 --- a/ui/sdk/src/generated/zod.gen.ts +++ b/ui/sdk/src/generated/zod.gen.ts @@ -2163,6 +2163,18 @@ export const zGooseSessionNotification_unstable = z.object({ update: zGooseSessionUpdate }); +/** + * Dedicated provider notification for OAuth device-code flow. + * Sent during provider authentication when the ACP client supports + * `goose.customNotifications` — avoids a fake empty session ID. + */ +export const zProviderDeviceCodeNotification_unstable = z.object({ + providerId: z.string(), + userCode: z.string(), + verificationUri: z.string(), + expiresIn: z.int().gte(0) +}); + export const zRequestRecipeParams_unstable = z.object({ sessionId: z.string(), parameters: z.array(zRecipeParameterDto), @@ -2397,7 +2409,10 @@ export const zExtResponse = z.union([ export const zExtNotification = z.object({ method: z.string(), params: z.union([ - zGooseSessionNotification_unstable, + z.union([ + zGooseSessionNotification_unstable, + zProviderDeviceCodeNotification_unstable + ]), z.record(z.string(), z.unknown()) ]).nullish() });