feat: migrate iFlow provider to Qoder AI (#660)

This commit is contained in:
diegosouzapw
2026-03-28 23:35:59 -03:00
parent bf76da3222
commit a5393a3ec4
268 changed files with 1339 additions and 1359 deletions

View File

@@ -890,7 +890,7 @@
}
},
"templateFreeStack": "Free Stack ($0)",
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), iFlow (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
},
"costs": {
"title": "التكاليف",
@@ -2418,7 +2418,7 @@
"waitingForGoogleAuthorization": "في انتظار إذن Google...",
"waitingForOpenAIAuthorization": "في انتظار ترخيص OpenAI...",
"waitingForAntigravityAuthorization": "في انتظار تصريح مكافحة الجاذبية...",
"waitingForIFlowAuthorization": "في انتظار ترخيص iFlow...",
"waitingForQoderAuthorization": "في انتظار ترخيص Qoder...",
"exchangingCodeForTokens": "استبدال الكود بالرموز..."
},
"landing": {

View File

@@ -890,7 +890,7 @@
}
},
"templateFreeStack": "Free Stack ($0)",
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), iFlow (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
},
"costs": {
"title": "Разходи",
@@ -2418,7 +2418,7 @@
"waitingForGoogleAuthorization": "Изчаква се разрешение от Google...",
"waitingForOpenAIAuthorization": "Изчаква се разрешение за OpenAI...",
"waitingForAntigravityAuthorization": "Изчаква се разрешение за антигравитация...",
"waitingForIFlowAuthorization": "Изчаква се разрешение за iFlow...",
"waitingForQoderAuthorization": "Изчаква се разрешение за Qoder...",
"exchangingCodeForTokens": "Размяна на код за токени..."
},
"landing": {

View File

@@ -941,7 +941,7 @@
}
},
"templateFreeStack": "Volný zásobník (0 $)",
"templateFreeStackDesc": "Round-robin mezi všemi bezplatnými poskytovateli: Kiro (Claude), iFlow (5 modelů), Qwen (4 modely), Gemini CLI. Bez nákladů, nikdy nepřestaňte kódovat."
"templateFreeStackDesc": "Round-robin mezi všemi bezplatnými poskytovateli: Kiro (Claude), Qoder (5 modelů), Qwen (4 modely), Gemini CLI. Bez nákladů, nikdy nepřestaňte kódovat."
},
"costs": {
"title": "Náklady",
@@ -2479,7 +2479,7 @@
"waitingForGoogleAuthorization": "Čekám na Google autorizaci...",
"waitingForOpenAIAuthorization": "Čekám na OpenAI autorizaci...",
"waitingForAntigravityAuthorization": "Čekám na Antigravity autorizaci...",
"waitingForIFlowAuthorization": "Čekám na iFlow autorizaci...",
"waitingForQoderAuthorization": "Čekám na Qoder autorizaci...",
"exchangingCodeForTokens": "Vyměňuji kód za tokeny...",
"Authorization": "Autorizace",
"Content-Disposition": "Obsah-Dispozice"

View File

@@ -890,7 +890,7 @@
}
},
"templateFreeStack": "Free Stack ($0)",
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), iFlow (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
},
"costs": {
"title": "Omkostninger",
@@ -2418,7 +2418,7 @@
"waitingForGoogleAuthorization": "Venter på Google-godkendelse...",
"waitingForOpenAIAuthorization": "Venter på OpenAI-godkendelse...",
"waitingForAntigravityAuthorization": "Venter på antigravity-autorisation...",
"waitingForIFlowAuthorization": "Venter på iFlow-godkendelse...",
"waitingForQoderAuthorization": "Venter på Qoder-godkendelse...",
"exchangingCodeForTokens": "Udveksler kode til tokens..."
},
"landing": {

View File

@@ -890,7 +890,7 @@
}
},
"templateFreeStack": "Free Stack ($0)",
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), iFlow (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
},
"costs": {
"title": "Kosten",
@@ -2416,7 +2416,7 @@
"waitingForGoogleAuthorization": "Warte auf Google-Autorisierung...",
"waitingForOpenAIAuthorization": "Warte auf OpenAI-Autorisierung...",
"waitingForAntigravityAuthorization": "Warte auf Antigravity-Autorisierung...",
"waitingForIFlowAuthorization": "Warte auf iFlow-Autorisierung...",
"waitingForQoderAuthorization": "Warte auf Qoder-Autorisierung...",
"exchangingCodeForTokens": "Tausche Code gegen Token aus...",
"Authorization": "Autorisierung",
"Content-Disposition": "Inhaltliche Disposition"

View File

@@ -941,7 +941,7 @@
}
},
"templateFreeStack": "Free Stack ($0)",
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), iFlow (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
},
"costs": {
"title": "Costs",
@@ -2483,7 +2483,7 @@
"waitingForGoogleAuthorization": "Waiting for Google authorization...",
"waitingForOpenAIAuthorization": "Waiting for OpenAI authorization...",
"waitingForAntigravityAuthorization": "Waiting for Antigravity authorization...",
"waitingForIFlowAuthorization": "Waiting for iFlow authorization...",
"waitingForQoderAuthorization": "Waiting for Qoder authorization...",
"exchangingCodeForTokens": "Exchanging code for tokens..."
},
"landing": {

View File

@@ -890,7 +890,7 @@
}
},
"templateFreeStack": "Free Stack ($0)",
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), iFlow (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
},
"costs": {
"title": "Costos",
@@ -2416,7 +2416,7 @@
"waitingForGoogleAuthorization": "Waiting for Google authorization...",
"waitingForOpenAIAuthorization": "Waiting for OpenAI authorization...",
"waitingForAntigravityAuthorization": "Waiting for Antigravity authorization...",
"waitingForIFlowAuthorization": "Waiting for iFlow authorization...",
"waitingForQoderAuthorization": "Waiting for Qoder authorization...",
"exchangingCodeForTokens": "Exchanging code for tokens...",
"Authorization": "Autorización",
"Content-Disposition": "Disposición de contenido"

View File

@@ -890,7 +890,7 @@
}
},
"templateFreeStack": "Free Stack ($0)",
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), iFlow (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
},
"costs": {
"title": "Kustannukset",
@@ -2418,7 +2418,7 @@
"waitingForGoogleAuthorization": "Odotetaan Googlen valtuutusta...",
"waitingForOpenAIAuthorization": "Odotetaan OpenAI-valtuutusta...",
"waitingForAntigravityAuthorization": "Odotetaan antigravitaatiovaltuutusta...",
"waitingForIFlowAuthorization": "Odotetaan iFlow-valtuutusta...",
"waitingForQoderAuthorization": "Odotetaan Qoder-valtuutusta...",
"exchangingCodeForTokens": "Vaihdetaan koodia tokeneihin..."
},
"landing": {

View File

@@ -890,7 +890,7 @@
}
},
"templateFreeStack": "Free Stack ($0)",
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), iFlow (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
},
"costs": {
"title": "Coûts",
@@ -2416,7 +2416,7 @@
"waitingForGoogleAuthorization": "Waiting for Google authorization...",
"waitingForOpenAIAuthorization": "Waiting for OpenAI authorization...",
"waitingForAntigravityAuthorization": "Waiting for Antigravity authorization...",
"waitingForIFlowAuthorization": "Waiting for iFlow authorization...",
"waitingForQoderAuthorization": "Waiting for Qoder authorization...",
"exchangingCodeForTokens": "Exchanging code for tokens...",
"Authorization": "Autorisation",
"Content-Disposition": "Disposition du contenu"

View File

@@ -890,7 +890,7 @@
}
},
"templateFreeStack": "Free Stack ($0)",
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), iFlow (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
},
"costs": {
"title": "עלויות",
@@ -2418,7 +2418,7 @@
"waitingForGoogleAuthorization": "ממתין לאישור Google...",
"waitingForOpenAIAuthorization": "ממתין להרשאת OpenAI...",
"waitingForAntigravityAuthorization": "ממתין לאישור נגד כבידה...",
"waitingForIFlowAuthorization": "ממתין להרשאת iFlow...",
"waitingForQoderAuthorization": "ממתין להרשאת Qoder...",
"exchangingCodeForTokens": "מחליף קוד לאסימונים..."
},
"landing": {

View File

@@ -798,7 +798,7 @@
}
},
"templateFreeStack": "Free Stack ($0)",
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), iFlow (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
},
"costs": {
"title": "लागत",

View File

@@ -890,7 +890,7 @@
}
},
"templateFreeStack": "Free Stack ($0)",
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), iFlow (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
},
"costs": {
"title": "Költségek",
@@ -2418,7 +2418,7 @@
"waitingForGoogleAuthorization": "Várakozás a Google engedélyére...",
"waitingForOpenAIAuthorization": "Várakozás az OpenAI engedélyezésére...",
"waitingForAntigravityAuthorization": "Várakozás az Antigravitációs engedélyezésre...",
"waitingForIFlowAuthorization": "Várakozás az iFlow engedélyezésére...",
"waitingForQoderAuthorization": "Várakozás az Qoder engedélyezésére...",
"exchangingCodeForTokens": "Kód cseréje tokenre..."
},
"landing": {

View File

@@ -890,7 +890,7 @@
}
},
"templateFreeStack": "Free Stack ($0)",
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), iFlow (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
},
"costs": {
"title": "Biaya",
@@ -2416,7 +2416,7 @@
"waitingForGoogleAuthorization": "Waiting for Google authorization...",
"waitingForOpenAIAuthorization": "Waiting for OpenAI authorization...",
"waitingForAntigravityAuthorization": "Waiting for Antigravity authorization...",
"waitingForIFlowAuthorization": "Waiting for iFlow authorization...",
"waitingForQoderAuthorization": "Waiting for Qoder authorization...",
"exchangingCodeForTokens": "Exchanging code for tokens...",
"Authorization": "Otorisasi",
"Content-Disposition": "Disposisi Konten"

View File

@@ -2477,7 +2477,7 @@
"waitingForGoogleAuthorization": "Google प्राधिकरण की प्रतीक्षा की जा रही है...",
"waitingForOpenAIAuthorization": "OpenAI प्राधिकरण की प्रतीक्षा की जा रही है...",
"waitingForAntigravityAuthorization": "एंटीग्रेविटी प्राधिकरण की प्रतीक्षा की जा रही है...",
"waitingForIFlowAuthorization": "iFlow प्राधिकरण की प्रतीक्षा की जा रही है...",
"waitingForQoderAuthorization": "Qoder प्राधिकरण की प्रतीक्षा की जा रही है...",
"exchangingCodeForTokens": "टोकन के लिए कोड का आदान-प्रदान..."
},
"landing": {

View File

@@ -890,7 +890,7 @@
}
},
"templateFreeStack": "Free Stack ($0)",
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), iFlow (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
},
"costs": {
"title": "Costi",
@@ -2416,7 +2416,7 @@
"waitingForGoogleAuthorization": "Waiting for Google authorization...",
"waitingForOpenAIAuthorization": "Waiting for OpenAI authorization...",
"waitingForAntigravityAuthorization": "Waiting for Antigravity authorization...",
"waitingForIFlowAuthorization": "Waiting for iFlow authorization...",
"waitingForQoderAuthorization": "Waiting for Qoder authorization...",
"exchangingCodeForTokens": "Exchanging code for tokens...",
"Authorization": "Autorizzazione",
"Content-Disposition": "Disposizione del contenuto"

View File

@@ -890,7 +890,7 @@
}
},
"templateFreeStack": "Free Stack ($0)",
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), iFlow (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
},
"costs": {
"title": "コスト",
@@ -2416,7 +2416,7 @@
"waitingForGoogleAuthorization": "Waiting for Google authorization...",
"waitingForOpenAIAuthorization": "Waiting for OpenAI authorization...",
"waitingForAntigravityAuthorization": "Waiting for Antigravity authorization...",
"waitingForIFlowAuthorization": "Waiting for iFlow authorization...",
"waitingForQoderAuthorization": "Waiting for Qoder authorization...",
"exchangingCodeForTokens": "Exchanging code for tokens...",
"Authorization": "認可",
"Content-Disposition": "コンテンツの配置"

View File

@@ -890,7 +890,7 @@
}
},
"templateFreeStack": "Free Stack ($0)",
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), iFlow (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
},
"costs": {
"title": "비용",
@@ -2416,7 +2416,7 @@
"waitingForGoogleAuthorization": "Waiting for Google authorization...",
"waitingForOpenAIAuthorization": "Waiting for OpenAI authorization...",
"waitingForAntigravityAuthorization": "Waiting for Antigravity authorization...",
"waitingForIFlowAuthorization": "Waiting for iFlow authorization...",
"waitingForQoderAuthorization": "Waiting for Qoder authorization...",
"exchangingCodeForTokens": "Exchanging code for tokens...",
"Authorization": "승인",
"Content-Disposition": "컨텐츠 처리"

View File

@@ -890,7 +890,7 @@
}
},
"templateFreeStack": "Free Stack ($0)",
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), iFlow (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
},
"costs": {
"title": "Kos",
@@ -2418,7 +2418,7 @@
"waitingForGoogleAuthorization": "Menunggu kebenaran Google...",
"waitingForOpenAIAuthorization": "Menunggu kebenaran OpenAI...",
"waitingForAntigravityAuthorization": "Menunggu kebenaran Antigraviti...",
"waitingForIFlowAuthorization": "Menunggu kebenaran iFlow...",
"waitingForQoderAuthorization": "Menunggu kebenaran Qoder...",
"exchangingCodeForTokens": "Bertukar kod untuk token..."
},
"landing": {

View File

@@ -890,7 +890,7 @@
}
},
"templateFreeStack": "Free Stack ($0)",
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), iFlow (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
},
"costs": {
"title": "Kosten",
@@ -2418,7 +2418,7 @@
"waitingForGoogleAuthorization": "Wachten op Google-autorisatie...",
"waitingForOpenAIAuthorization": "Wachten op OpenAI-autorisatie...",
"waitingForAntigravityAuthorization": "Wachten op toestemming voor anti-zwaartekracht...",
"waitingForIFlowAuthorization": "Wachten op iFlow-autorisatie...",
"waitingForQoderAuthorization": "Wachten op Qoder-autorisatie...",
"exchangingCodeForTokens": "Code uitwisselen voor tokens..."
},
"landing": {

View File

@@ -890,7 +890,7 @@
}
},
"templateFreeStack": "Free Stack ($0)",
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), iFlow (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
},
"costs": {
"title": "Kostnader",
@@ -2418,7 +2418,7 @@
"waitingForGoogleAuthorization": "Venter på Google-autorisasjon...",
"waitingForOpenAIAuthorization": "Venter på OpenAI-godkjenning...",
"waitingForAntigravityAuthorization": "Venter på antigravity-autorisasjon...",
"waitingForIFlowAuthorization": "Venter på iFlow-autorisasjon...",
"waitingForQoderAuthorization": "Venter på Qoder-autorisasjon...",
"exchangingCodeForTokens": "Utveksler kode for tokens..."
},
"landing": {

View File

@@ -890,7 +890,7 @@
}
},
"templateFreeStack": "Free Stack ($0)",
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), iFlow (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
},
"costs": {
"title": "Mga gastos",
@@ -2418,7 +2418,7 @@
"waitingForGoogleAuthorization": "Naghihintay ng pahintulot ng Google...",
"waitingForOpenAIAuthorization": "Naghihintay ng awtorisasyon sa OpenAI...",
"waitingForAntigravityAuthorization": "Naghihintay ng awtorisasyon sa Antigravity...",
"waitingForIFlowAuthorization": "Naghihintay ng awtorisasyon ng iFlow...",
"waitingForQoderAuthorization": "Naghihintay ng awtorisasyon ng Qoder...",
"exchangingCodeForTokens": "Pagpapalit ng code para sa mga token..."
},
"landing": {

View File

@@ -890,7 +890,7 @@
}
},
"templateFreeStack": "Free Stack ($0)",
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), iFlow (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
},
"costs": {
"title": "Koszty",
@@ -2416,7 +2416,7 @@
"waitingForGoogleAuthorization": "Waiting for Google authorization...",
"waitingForOpenAIAuthorization": "Waiting for OpenAI authorization...",
"waitingForAntigravityAuthorization": "Waiting for Antigravity authorization...",
"waitingForIFlowAuthorization": "Waiting for iFlow authorization...",
"waitingForQoderAuthorization": "Waiting for Qoder authorization...",
"exchangingCodeForTokens": "Exchanging code for tokens...",
"Authorization": "Autoryzacja",
"Content-Disposition": "Dyspozycja treści"

View File

@@ -902,7 +902,7 @@
}
},
"templateFreeStack": "Free Stack ($0)",
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), iFlow (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
},
"costs": {
"title": "Custos",
@@ -2436,7 +2436,7 @@
"waitingForGoogleAuthorization": "Aguardando autorização do Google...",
"waitingForOpenAIAuthorization": "Aguardando autorização do OpenAI...",
"waitingForAntigravityAuthorization": "Aguardando autorização antigravidade...",
"waitingForIFlowAuthorization": "Aguardando autorização do iFlow...",
"waitingForQoderAuthorization": "Aguardando autorização do Qoder...",
"exchangingCodeForTokens": "Trocando código por tokens..."
},
"landing": {

View File

@@ -890,7 +890,7 @@
}
},
"templateFreeStack": "Free Stack ($0)",
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), iFlow (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
},
"costs": {
"title": "Custos",
@@ -2428,7 +2428,7 @@
"waitingForGoogleAuthorization": "Waiting for Google authorization...",
"waitingForOpenAIAuthorization": "Waiting for OpenAI authorization...",
"waitingForAntigravityAuthorization": "Waiting for Antigravity authorization...",
"waitingForIFlowAuthorization": "Waiting for iFlow authorization...",
"waitingForQoderAuthorization": "Waiting for Qoder authorization...",
"exchangingCodeForTokens": "Exchanging code for tokens...",
"Authorization": "Autorização",
"Content-Disposition": "Disposição de conteúdo"

View File

@@ -890,7 +890,7 @@
}
},
"templateFreeStack": "Free Stack ($0)",
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), iFlow (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
},
"costs": {
"title": "Costuri",
@@ -2418,7 +2418,7 @@
"waitingForGoogleAuthorization": "Se așteaptă autorizarea Google...",
"waitingForOpenAIAuthorization": "Se așteaptă autorizarea OpenAI...",
"waitingForAntigravityAuthorization": "Se așteaptă autorizația antigravitație...",
"waitingForIFlowAuthorization": "Se așteaptă autorizarea iFlow...",
"waitingForQoderAuthorization": "Se așteaptă autorizarea Qoder...",
"exchangingCodeForTokens": "Se schimbă codul pentru jetoane..."
},
"landing": {

View File

@@ -890,7 +890,7 @@
}
},
"templateFreeStack": "Free Stack ($0)",
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), iFlow (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
},
"costs": {
"title": "Затраты",
@@ -2416,7 +2416,7 @@
"waitingForGoogleAuthorization": "Waiting for Google authorization...",
"waitingForOpenAIAuthorization": "Waiting for OpenAI authorization...",
"waitingForAntigravityAuthorization": "Waiting for Antigravity authorization...",
"waitingForIFlowAuthorization": "Waiting for iFlow authorization...",
"waitingForQoderAuthorization": "Waiting for Qoder authorization...",
"exchangingCodeForTokens": "Exchanging code for tokens...",
"Authorization": "Авторизация",
"Content-Disposition": "Содержание-Расположение"

View File

@@ -890,7 +890,7 @@
}
},
"templateFreeStack": "Free Stack ($0)",
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), iFlow (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
},
"costs": {
"title": "náklady",
@@ -2418,7 +2418,7 @@
"waitingForGoogleAuthorization": "Čaká sa na autorizáciu Google...",
"waitingForOpenAIAuthorization": "Čaká sa na autorizáciu OpenAI...",
"waitingForAntigravityAuthorization": "Čaká sa na antigravitačné povolenie...",
"waitingForIFlowAuthorization": "Čaká sa na autorizáciu iFlow...",
"waitingForQoderAuthorization": "Čaká sa na autorizáciu Qoder...",
"exchangingCodeForTokens": "Výmena kódu za tokeny..."
},
"landing": {

View File

@@ -890,7 +890,7 @@
}
},
"templateFreeStack": "Free Stack ($0)",
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), iFlow (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
},
"costs": {
"title": "Kostnader",
@@ -2418,7 +2418,7 @@
"waitingForGoogleAuthorization": "Väntar på Google-auktorisering...",
"waitingForOpenAIAuthorization": "Väntar på OpenAI-auktorisering...",
"waitingForAntigravityAuthorization": "Väntar på antigravitationstillstånd...",
"waitingForIFlowAuthorization": "Väntar på iFlow-auktorisering...",
"waitingForQoderAuthorization": "Väntar på Qoder-auktorisering...",
"exchangingCodeForTokens": "Byter ut kod för tokens..."
},
"landing": {

View File

@@ -890,7 +890,7 @@
}
},
"templateFreeStack": "Free Stack ($0)",
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), iFlow (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
},
"costs": {
"title": "ค่าใช้จ่าย",
@@ -2418,7 +2418,7 @@
"waitingForGoogleAuthorization": "กำลังรอการอนุญาตจาก Google...",
"waitingForOpenAIAuthorization": "กำลังรอการอนุญาต OpenAI...",
"waitingForAntigravityAuthorization": "กำลังรอการอนุญาตต้านแรงโน้มถ่วง...",
"waitingForIFlowAuthorization": "กำลังรอการอนุญาตจาก iFlow...",
"waitingForQoderAuthorization": "กำลังรอการอนุญาตจาก Qoder...",
"exchangingCodeForTokens": "การเปลี่ยนรหัสเป็นโทเค็น..."
},
"landing": {

View File

@@ -939,7 +939,7 @@
}
},
"templateFreeStack": "Ücretsiz Yığın ($0)",
"templateFreeStackDesc": "Tüm ücretsiz sağlayıcılarda round-robin: Kiro (Claude), iFlow (5 model), Qwen (4 model), Gemini CLI. Sıfır maliyet, kodlama kesintisiz."
"templateFreeStackDesc": "Tüm ücretsiz sağlayıcılarda round-robin: Kiro (Claude), Qoder (5 model), Qwen (4 model), Gemini CLI. Sıfır maliyet, kodlama kesintisiz."
},
"costs": {
"title": "Maliyetler",
@@ -2475,7 +2475,7 @@
"waitingForGoogleAuthorization": "Google yetkilendirmesi bekleniyor...",
"waitingForOpenAIAuthorization": "OpenAI yetkilendirmesi bekleniyor...",
"waitingForAntigravityAuthorization": "Antigravity yetkilendirmesi bekleniyor...",
"waitingForIFlowAuthorization": "iFlow yetkilendirmesi bekleniyor...",
"waitingForQoderAuthorization": "Qoder yetkilendirmesi bekleniyor...",
"exchangingCodeForTokens": "Kod jetonlarla değiştiriliyor..."
},
"landing": {

View File

@@ -890,7 +890,7 @@
}
},
"templateFreeStack": "Free Stack ($0)",
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), iFlow (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
},
"costs": {
"title": "Витрати",
@@ -2418,7 +2418,7 @@
"waitingForGoogleAuthorization": "Очікування авторизації Google...",
"waitingForOpenAIAuthorization": "Очікування авторизації OpenAI...",
"waitingForAntigravityAuthorization": "Очікування авторизації Antigravity...",
"waitingForIFlowAuthorization": "Очікування авторизації iFlow...",
"waitingForQoderAuthorization": "Очікування авторизації Qoder...",
"exchangingCodeForTokens": "Обмін коду на токени..."
},
"landing": {

View File

@@ -890,7 +890,7 @@
}
},
"templateFreeStack": "Free Stack ($0)",
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), iFlow (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
"templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
},
"costs": {
"title": "Chi phí",
@@ -2418,7 +2418,7 @@
"waitingForGoogleAuthorization": "Đang chờ Google ủy quyền...",
"waitingForOpenAIAuthorization": "Đang chờ ủy quyền OpenAI...",
"waitingForAntigravityAuthorization": "Đang chờ ủy quyền chống hấp dẫn...",
"waitingForIFlowAuthorization": "Đang chờ ủy quyền iFlow...",
"waitingForQoderAuthorization": "Đang chờ ủy quyền Qoder...",
"exchangingCodeForTokens": "Đổi mã lấy token..."
},
"landing": {

View File

@@ -941,7 +941,7 @@
}
},
"templateFreeStack": "免费栈($0",
"templateFreeStackDesc": "在所有免费提供商之间进行轮询KiroClaudeiFlow5 个模型、Qwen4 个模型、Gemini CLI。零成本编码不中断。"
"templateFreeStackDesc": "在所有免费提供商之间进行轮询KiroClaudeQoder5 个模型、Qwen4 个模型、Gemini CLI。零成本编码不中断。"
},
"costs": {
"title": "成本",
@@ -2477,7 +2477,7 @@
"waitingForGoogleAuthorization": "正在等待 Google 授权...",
"waitingForOpenAIAuthorization": "正在等待 OpenAI 授权...",
"waitingForAntigravityAuthorization": "正在等待 Antigravity 授权...",
"waitingForIFlowAuthorization": "正在等待 iFlow 授权...",
"waitingForQoderAuthorization": "正在等待 Qoder 授权...",
"exchangingCodeForTokens": "正在用授权码换取 Tokens..."
},
"landing": {

View File

@@ -64,13 +64,13 @@ export const QWEN_CONFIG = {
codeChallengeMethod: "S256",
};
// iFlow OAuth Configuration (Authorization Code)
export const IFLOW_CONFIG = {
clientId: process.env.IFLOW_OAUTH_CLIENT_ID || "10009311001",
clientSecret: process.env.IFLOW_OAUTH_CLIENT_SECRET || "4Z3YjXycVsQvyGF1etiNlIBB4RsqSDtW",
authorizeUrl: "https://iflow.cn/oauth",
tokenUrl: "https://iflow.cn/oauth/token",
userInfoUrl: "https://iflow.cn/api/oauth/getUserInfo",
// Qoder OAuth Configuration (Authorization Code)
export const QODER_CONFIG = {
clientId: process.env.QODER_OAUTH_CLIENT_ID || "10009311001",
clientSecret: process.env.QODER_OAUTH_CLIENT_SECRET || "4Z3YjXycVsQvyGF1etiNlIBB4RsqSDtW",
authorizeUrl: "https://qoder.cn/oauth",
tokenUrl: "https://qoder.cn/oauth/token",
userInfoUrl: "https://qoder.cn/api/oauth/getUserInfo",
extraParams: {
loginMethod: "phone",
type: "phone",
@@ -220,7 +220,7 @@ export const PROVIDERS = {
CODEX: "codex",
GEMINI: "gemini-cli",
QWEN: "qwen",
IFLOW: "iflow",
QODER: "qoder",
ANTIGRAVITY: "antigravity",
OPENAI: "openai",
GITHUB: "github",

View File

@@ -14,7 +14,7 @@ import { claude } from "./claude";
import { codex } from "./codex";
import { gemini } from "./gemini";
import { antigravity } from "./antigravity";
import { iflow } from "./iflow";
import { qoder } from "./qoder";
import { qwen } from "./qwen";
import { kimiCoding } from "./kimi-coding";
import { github } from "./github";
@@ -28,7 +28,7 @@ export const PROVIDERS = {
codex,
"gemini-cli": gemini,
antigravity,
iflow,
qoder,
qwen,
"kimi-coding": kimiCoding,
github,

View File

@@ -1,7 +1,7 @@
import { IFLOW_CONFIG } from "../constants/oauth";
import { QODER_CONFIG } from "../constants/oauth";
export const iflow = {
config: IFLOW_CONFIG,
export const qoder = {
config: QODER_CONFIG,
flowType: "authorization_code",
buildAuthUrl: (config, redirectUri, state) => {
const params = new URLSearchParams({
@@ -50,7 +50,7 @@ export const iflow = {
},
postExchange: async (tokens) => {
const userInfoRes = await fetch(
`${IFLOW_CONFIG.userInfoUrl}?accessToken=${encodeURIComponent(tokens.access_token)}`,
`${QODER_CONFIG.userInfoUrl}?accessToken=${encodeURIComponent(tokens.access_token)}`,
{ headers: { Accept: "application/json" } }
);
const result = userInfoRes.ok ? await userInfoRes.json() : {};

View File

@@ -7,7 +7,7 @@ export { ClaudeService } from "./claude";
export { CodexService } from "./codex";
export { GeminiCLIService } from "./gemini";
export { QwenService } from "./qwen";
export { IFlowService } from "./iflow";
export { QoderService } from "./qoder";
export { AntigravityService } from "./antigravity";
export { OpenAIService } from "./openai";
export { GitHubService } from "./github";

View File

@@ -1,23 +1,23 @@
import crypto from "crypto";
import open from "open";
import { IFLOW_CONFIG } from "../constants/oauth";
import { QODER_CONFIG } from "../constants/oauth";
import { getServerCredentials } from "../config/index";
import { startLocalServer } from "../utils/server";
import { spinner as createSpinner } from "../utils/ui";
/**
* iFlow OAuth Service
* Qoder OAuth Service
* Uses Authorization Code flow with Basic Auth
*/
export class IFlowService {
export class QoderService {
config: any;
constructor() {
this.config = IFLOW_CONFIG;
this.config = QODER_CONFIG;
}
/**
* Build iFlow authorization URL
* Build Qoder authorization URL
*/
buildAuthUrl(redirectUri: string, state: string) {
const params = new URLSearchParams({
@@ -65,7 +65,7 @@ export class IFlowService {
}
/**
* Get user info from iFlow
* Get user info from Qoder
*/
async getUserInfo(accessToken: string) {
const response = await fetch(
@@ -92,12 +92,12 @@ export class IFlowService {
}
/**
* Save iFlow tokens to server
* Save Qoder tokens to server
*/
async saveTokens(tokens: any, userInfo: any) {
const { server, token, userId } = getServerCredentials();
const response = await fetch(`${server}/api/cli/providers/iflow`, {
const response = await fetch(`${server}/api/cli/providers/qoder`, {
method: "POST",
headers: {
"Content-Type": "application/json",
@@ -122,10 +122,10 @@ export class IFlowService {
}
/**
* Complete iFlow OAuth flow
* Complete Qoder OAuth flow
*/
async connect() {
const spinner = createSpinner("Starting iFlow OAuth...").start();
const spinner = createSpinner("Starting Qoder OAuth...").start();
try {
spinner.text = "Starting local server...";
@@ -145,14 +145,14 @@ export class IFlowService {
// Build authorization URL
const authUrl = this.buildAuthUrl(redirectUri, state);
console.log("\nOpening browser for iFlow authentication...");
console.log("\nOpening browser for Qoder authentication...");
console.log(`If browser doesn't open, visit:\n${authUrl}\n`);
// Open browser
await open(authUrl);
// Wait for callback
spinner.start("Waiting for iFlow authorization...");
spinner.start("Waiting for Qoder authorization...");
await new Promise((resolve, reject) => {
const timeout = setTimeout(() => {
@@ -193,7 +193,7 @@ export class IFlowService {
// Save tokens to server
await this.saveTokens(tokens, userInfo);
spinner.succeed(`iFlow connected successfully! (${userInfo.email || userInfo.phone})`);
spinner.succeed(`Qoder connected successfully! (${userInfo.email || userInfo.phone})`);
return true;
} catch (error: any) {
spinner.fail(`Failed: ${error.message}`);

View File

@@ -25,7 +25,7 @@ export async function getUsageForProvider(connection) {
return await getCodexUsage(accessToken, providerSpecificData);
case "qwen":
return await getQwenUsage(accessToken, providerSpecificData);
case "iflow":
case "qoder":
return await getIflowUsage(accessToken);
case "kiro":
return await getKiroUsage(accessToken);
@@ -209,14 +209,14 @@ async function getQwenUsage(accessToken, providerSpecificData) {
}
/**
* iFlow Usage
* Qoder Usage
*/
async function getIflowUsage(accessToken) {
try {
// iFlow may have usage endpoint
return { message: "iFlow connected. Usage tracked per request." };
// Qoder may have usage endpoint
return { message: "Qoder connected. Usage tracked per request." };
} catch (error) {
return { message: "Unable to fetch iFlow usage." };
return { message: "Unable to fetch Qoder usage." };
}
}

View File

@@ -434,7 +434,7 @@ export default function OAuthModal({
}, [authData, exchangeTokens]);
// Fix #344: Detect when OAuth popup is closed without completing authorization
// Some providers (like iFlow) redirect to their own chat UI instead of sending a callback,
// Some providers (like Qoder) redirect to their own chat UI instead of sending a callback,
// leaving the modal stuck at "Waiting for Authorization" forever.
useEffect(() => {
if (step !== "waiting" || isDeviceCode || !popupRef.current) return;
@@ -535,7 +535,7 @@ export default function OAuthModal({
Complete the authorization in the popup window.
</p>
<p className="text-xs text-text-muted mb-4 opacity-70">
If the popup closes without redirecting back (e.g. iFlow), this dialog will
If the popup closes without redirecting back (e.g. Qoder), this dialog will
automatically switch to manual URL input mode.
</p>
<Button variant="ghost" onClick={() => setStep("input")}>

View File

@@ -19,7 +19,7 @@ export const PROVIDER_COLORS = {
codex: { bg: "#10A37F", text: "#fff", label: "Codex" },
gemini: { bg: "#34A853", text: "#fff", label: "Gemini" },
qwen: { bg: "#6366F1", text: "#fff", label: "Qwen" },
iflow: { bg: "#EC4899", text: "#fff", label: "iFlow" },
qoder: { bg: "#EC4899", text: "#fff", label: "Qoder" },
fireworks: { bg: "#F97316", text: "#fff", label: "Fireworks" },
kimi: { bg: "#06B6D4", text: "#fff", label: "Kimi" },
"gemini-cli": { bg: "#34A853", text: "#fff", label: "Gemini CLI" },

View File

@@ -277,7 +277,7 @@ export const DEFAULT_PRICING = {
},
},
// iFlow AI (if)
// Qoder AI (if)
if: {
"qwen3-coder-plus": {
input: 1.0,

View File

@@ -2,7 +2,7 @@
// Free Providers
export const FREE_PROVIDERS = {
iflow: { id: "iflow", alias: "if", name: "iFlow AI", icon: "water_drop", color: "#6366F1" },
qoder: { id: "qoder", alias: "if", name: "Qoder AI", icon: "water_drop", color: "#6366F1" },
qwen: { id: "qwen", alias: "qw", name: "Qwen Code", icon: "psychology", color: "#10B981" },
"gemini-cli": {
id: "gemini-cli",