feat: add StepFun and Nous Portal provider support (#140)

- Add StepFun provider (API key auth, STEPFUN_API_KEY)
- Add Nous Portal provider with full OAuth device code flow
  (device code request → poll for token → mint agent key → save to auth.json)
- Add NousLoginModal component for OAuth UI (user code display + verification link)
- Update ProviderFormModal to handle Nous OAuth flow (hide API key fields)
- Add nous-auth backend controller and routes
- Update PROVIDER_ENV_MAP with stepfun and nous entries
- Add i18n translations for Nous OAuth in all 8 locales

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
ekko
2026-04-23 08:39:19 +08:00
committed by GitHub
parent 696d19298e
commit df797d09b2
16 changed files with 692 additions and 3 deletions
+7
View File
@@ -243,6 +243,13 @@ export default {
codexOpenLink: 'Autorisierungsseite öffnen',
codexApproved: 'Anmeldung erfolgreich',
codexExpired: 'Die Autorisierung ist abgelaufen. Bitte versuchen Sie es erneut.',
nousLoginTitle: 'Nous Portal Login',
nousWaiting: 'Geben Sie diesen Code auf der Autorisierungsseite ein:',
nousCopyCode: 'Code kopiert',
nousOpenLink: 'Autorisierungsseite öffnen',
nousApproved: 'Login erfolgreich',
nousDenied: 'Autorisierung wurde abgelehnt',
nousExpired: 'Autorisierung abgelaufen',
noProviders: 'Keine Anbieter gefunden. Fugen Sie einen benutzerdefinierten Anbieter hinzu, um zu beginnen.',
builtIn: 'Integriert',
customType: 'Benutzerdefiniert',
+7
View File
@@ -268,6 +268,13 @@ export default {
codexOpenLink: 'Open authorization page',
codexApproved: 'Login successful',
codexExpired: 'Authorization expired. Please try again.',
nousLoginTitle: 'Nous Portal Login',
nousWaiting: 'Enter this code at the authorization page to complete login:',
nousCopyCode: 'Code copied',
nousOpenLink: 'Open authorization page',
nousApproved: 'Login successful',
nousDenied: 'Authorization was denied. Please try again.',
nousExpired: 'Authorization expired. Please try again.',
noProviders: 'No providers found. Add a custom provider to get started.',
builtIn: 'Built-in',
customType: 'Custom',
+7
View File
@@ -243,6 +243,13 @@ export default {
codexOpenLink: 'Abrir página de autorización',
codexApproved: 'Inicio de sesión exitoso',
codexExpired: 'La autorización ha expirado. Por favor, inténtelo de nuevo.',
nousLoginTitle: 'Inicio de sesión de Nous Portal',
nousWaiting: 'Ingrese este código en la página de autorización:',
nousCopyCode: 'Código copiado',
nousOpenLink: 'Abrir página de autorización',
nousApproved: 'Inicio de sesión exitoso',
nousDenied: 'Autorización denegada',
nousExpired: 'Autorización expirada',
noProviders: 'No se encontraron proveedores. Anade un proveedor personalizado para comenzar.',
builtIn: 'Integrado',
customType: 'Personalizado',
+7
View File
@@ -243,6 +243,13 @@ export default {
codexOpenLink: 'Ouvrir la page d\'autorisation',
codexApproved: 'Connexion réussie',
codexExpired: 'L\'autorisation a expiré. Veuillez réessayer.',
nousLoginTitle: 'Connexion Nous Portal',
nousWaiting: 'Entrez ce code sur la page d\'autorisation:',
nousCopyCode: 'Code copié',
nousOpenLink: 'Ouvrir la page d\'autorisation',
nousApproved: 'Connexion réussie',
nousDenied: 'Autorisation refusée',
nousExpired: 'Autorisation expirée',
noProviders: 'Aucun fournisseur trouve. Ajoutez un fournisseur personnalise pour commencer.',
builtIn: 'Integre',
customType: 'Personnalise',
+7
View File
@@ -243,6 +243,13 @@ export default {
codexOpenLink: '認証ページを開く',
codexApproved: 'ログイン成功',
codexExpired: '認証の有効期限が切れました。もう一度お試しください。',
nousLoginTitle: 'Nous Portal ログイン',
nousWaiting: '認証ページでこのコードを入力してください:',
nousCopyCode: 'コードをコピーしました',
nousOpenLink: '認証ページを開く',
nousApproved: 'ログイン成功',
nousDenied: '認証が拒否されました',
nousExpired: '認証の有効期限が切れました',
noProviders: 'プロバイダーがありません。カスタムプロバイダーを追加して始めましょう。',
builtIn: '組み込み',
customType: 'カスタム',
+7
View File
@@ -243,6 +243,13 @@ export default {
codexOpenLink: '인증 페이지 열기',
codexApproved: '로그인 성공',
codexExpired: '인증이 만료되었습니다. 다시 시도해주세요.',
nousLoginTitle: 'Nous Portal 로그인',
nousWaiting: '인증 페이지에서 이 코드를 입력하세요:',
nousCopyCode: '코드 복사됨',
nousOpenLink: '인증 페이지 열기',
nousApproved: '로그인 성공',
nousDenied: '인증이 거부되었습니다',
nousExpired: '인증이 만료되었습니다',
noProviders: 'Provider가 없습니다. 사용자 지정 Provider를 추가하여 시작하세요.',
builtIn: '내장',
customType: '사용자 지정',
+7
View File
@@ -243,6 +243,13 @@ export default {
codexOpenLink: 'Abrir página de autorização',
codexApproved: 'Login bem-sucedido',
codexExpired: 'A autorização expirou. Por favor, tente novamente.',
nousLoginTitle: 'Login do Nous Portal',
nousWaiting: 'Insira este código na página de autorização:',
nousCopyCode: 'Código copiado',
nousOpenLink: 'Abrir página de autorização',
nousApproved: 'Login bem-sucedido',
nousDenied: 'Autorização negada',
nousExpired: 'Autorização expirada',
noProviders: 'Nenhum provedor encontrado. Adicione um provedor personalizado para comecar.',
builtIn: 'Integrado',
customType: 'Personalizado',
+7
View File
@@ -268,6 +268,13 @@ export default {
codexOpenLink: '打开授权页面',
codexApproved: '登录成功',
codexExpired: '授权已过期,请重试。',
nousLoginTitle: 'Nous Portal 登录',
nousWaiting: '在授权页面输入此代码完成登录:',
nousCopyCode: '代码已复制',
nousOpenLink: '打开授权页面',
nousApproved: '登录成功',
nousDenied: '授权被拒绝,请重试。',
nousExpired: '授权已过期,请重试。',
noProviders: '暂无 Provider,添加一个开始吧。',
builtIn: '内置',
customType: '自定义',