+ )
+}
diff --git a/webview-ui/src/i18n/locales/ca/settings.json b/webview-ui/src/i18n/locales/ca/settings.json
index 0dd08afb29..503b8c36ed 100644
--- a/webview-ui/src/i18n/locales/ca/settings.json
+++ b/webview-ui/src/i18n/locales/ca/settings.json
@@ -367,6 +367,12 @@
"label": "Límit de freqüència",
"description": "Temps mínim entre sol·licituds d'API."
},
+ "consecutiveMistakeLimit": {
+ "label": "Límit d'errors i repeticions",
+ "description": "Nombre d'errors consecutius o accions repetides abans de mostrar el diàleg 'En Roo està tenint problemes'",
+ "unlimitedDescription": "Reintents il·limitats habilitats (procediment automàtic). El diàleg no apareixerà mai.",
+ "warning": "⚠️ Establir a 0 permet reintents il·limitats que poden consumir un ús significatiu de l'API"
+ },
"reasoningEffort": {
"label": "Esforç de raonament del model",
"high": "Alt",
diff --git a/webview-ui/src/i18n/locales/de/settings.json b/webview-ui/src/i18n/locales/de/settings.json
index 923475d3fd..48d0d41a41 100644
--- a/webview-ui/src/i18n/locales/de/settings.json
+++ b/webview-ui/src/i18n/locales/de/settings.json
@@ -367,6 +367,12 @@
"label": "Ratenbegrenzung",
"description": "Minimale Zeit zwischen API-Anfragen."
},
+ "consecutiveMistakeLimit": {
+ "label": "Fehler- & Wiederholungslimit",
+ "description": "Anzahl aufeinanderfolgender Fehler oder wiederholter Aktionen, bevor der Dialog 'Roo hat Probleme' angezeigt wird",
+ "unlimitedDescription": "Unbegrenzte Wiederholungen aktiviert (automatisches Fortfahren). Der Dialog wird niemals angezeigt.",
+ "warning": "⚠️ Das Setzen auf 0 erlaubt unbegrenzte Wiederholungen, was zu erheblichem API-Verbrauch führen kann"
+ },
"reasoningEffort": {
"label": "Modell-Denkaufwand",
"high": "Hoch",
diff --git a/webview-ui/src/i18n/locales/en/settings.json b/webview-ui/src/i18n/locales/en/settings.json
index 25428cfb16..69ca01154d 100644
--- a/webview-ui/src/i18n/locales/en/settings.json
+++ b/webview-ui/src/i18n/locales/en/settings.json
@@ -367,6 +367,12 @@
"label": "Rate limit",
"description": "Minimum time between API requests."
},
+ "consecutiveMistakeLimit": {
+ "label": "Error & Repetition Limit",
+ "description": "Number of consecutive errors or repeated actions before showing 'Roo is having trouble' dialog",
+ "unlimitedDescription": "Unlimited retries enabled (auto-proceed). The dialog will never appear.",
+ "warning": "⚠️ Setting to 0 allows unlimited retries which may consume significant API usage"
+ },
"reasoningEffort": {
"label": "Model Reasoning Effort",
"high": "High",
diff --git a/webview-ui/src/i18n/locales/es/settings.json b/webview-ui/src/i18n/locales/es/settings.json
index 7f6af9bd72..684949488e 100644
--- a/webview-ui/src/i18n/locales/es/settings.json
+++ b/webview-ui/src/i18n/locales/es/settings.json
@@ -367,6 +367,12 @@
"label": "Límite de tasa",
"description": "Tiempo mínimo entre solicitudes de API."
},
+ "consecutiveMistakeLimit": {
+ "label": "Límite de errores y repeticiones",
+ "description": "Número de errores consecutivos o acciones repetidas antes de mostrar el diálogo 'Roo está teniendo problemas'",
+ "unlimitedDescription": "Reintentos ilimitados habilitados (proceder automáticamente). El diálogo nunca aparecerá.",
+ "warning": "⚠️ Establecer en 0 permite reintentos ilimitados que pueden consumir un uso significativo de la API"
+ },
"reasoningEffort": {
"label": "Esfuerzo de razonamiento del modelo",
"high": "Alto",
diff --git a/webview-ui/src/i18n/locales/fr/settings.json b/webview-ui/src/i18n/locales/fr/settings.json
index 5986a5bf17..8080158446 100644
--- a/webview-ui/src/i18n/locales/fr/settings.json
+++ b/webview-ui/src/i18n/locales/fr/settings.json
@@ -367,6 +367,12 @@
"label": "Limite de débit",
"description": "Temps minimum entre les requêtes API."
},
+ "consecutiveMistakeLimit": {
+ "label": "Limite d'erreurs et de répétitions",
+ "description": "Nombre d'erreurs consécutives ou d'actions répétées avant d'afficher la boîte de dialogue 'Roo a des difficultés'",
+ "unlimitedDescription": "Réessais illimités activés (poursuite automatique). La boîte de dialogue n'apparaîtra jamais.",
+ "warning": "⚠️ Mettre à 0 autorise des réessais illimités, ce qui peut consommer une utilisation importante de l'API"
+ },
"reasoningEffort": {
"label": "Effort de raisonnement du modèle",
"high": "Élevé",
diff --git a/webview-ui/src/i18n/locales/hi/settings.json b/webview-ui/src/i18n/locales/hi/settings.json
index 0a99064588..30a34de434 100644
--- a/webview-ui/src/i18n/locales/hi/settings.json
+++ b/webview-ui/src/i18n/locales/hi/settings.json
@@ -367,6 +367,12 @@
"label": "दर सीमा",
"description": "API अनुरोधों के बीच न्यूनतम समय।"
},
+ "consecutiveMistakeLimit": {
+ "label": "त्रुटि और पुनरावृत्ति सीमा",
+ "description": "'रू को समस्या हो रही है' संवाद दिखाने से पहले लगातार त्रुटियों या दोहराए गए कार्यों की संख्या",
+ "unlimitedDescription": "असीमित पुनः प्रयास सक्षम (स्वतः आगे बढ़ें)। संवाद कभी नहीं दिखाई देगा।",
+ "warning": "⚠️ 0 पर सेट करने से असीमित पुनः प्रयास की अनुमति मिलती है जिससे महत्वपूर्ण एपीआई उपयोग हो सकता है"
+ },
"reasoningEffort": {
"label": "मॉडल तर्क प्रयास",
"high": "उच्च",
diff --git a/webview-ui/src/i18n/locales/id/settings.json b/webview-ui/src/i18n/locales/id/settings.json
index 9ae5dd846c..6089d5874e 100644
--- a/webview-ui/src/i18n/locales/id/settings.json
+++ b/webview-ui/src/i18n/locales/id/settings.json
@@ -371,6 +371,12 @@
"label": "Rate limit",
"description": "Waktu minimum antara permintaan API."
},
+ "consecutiveMistakeLimit": {
+ "label": "Batas Kesalahan & Pengulangan",
+ "description": "Jumlah kesalahan berturut-turut atau tindakan berulang sebelum menampilkan dialog 'Roo mengalami masalah'",
+ "unlimitedDescription": "Percobaan ulang tak terbatas diaktifkan (lanjut otomatis). Dialog tidak akan pernah muncul.",
+ "warning": "⚠️ Mengatur ke 0 memungkinkan percobaan ulang tak terbatas yang dapat menghabiskan penggunaan API yang signifikan"
+ },
"reasoningEffort": {
"label": "Upaya Reasoning Model",
"high": "Tinggi",
diff --git a/webview-ui/src/i18n/locales/it/settings.json b/webview-ui/src/i18n/locales/it/settings.json
index a2897496ec..189efe0bed 100644
--- a/webview-ui/src/i18n/locales/it/settings.json
+++ b/webview-ui/src/i18n/locales/it/settings.json
@@ -367,6 +367,12 @@
"label": "Limite di frequenza",
"description": "Tempo minimo tra le richieste API."
},
+ "consecutiveMistakeLimit": {
+ "label": "Limite di errori e ripetizioni",
+ "description": "Numero di errori consecutivi o azioni ripetute prima di mostrare la finestra di dialogo 'Roo sta riscontrando problemi'",
+ "unlimitedDescription": "Tentativi illimitati abilitati (procedi automaticamente). La finestra di dialogo non verrà mai visualizzata.",
+ "warning": "⚠️ L'impostazione a 0 consente tentativi illimitati che possono consumare un notevole utilizzo dell'API"
+ },
"reasoningEffort": {
"label": "Sforzo di ragionamento del modello",
"high": "Alto",
diff --git a/webview-ui/src/i18n/locales/ja/settings.json b/webview-ui/src/i18n/locales/ja/settings.json
index bda4182851..a63d0b6800 100644
--- a/webview-ui/src/i18n/locales/ja/settings.json
+++ b/webview-ui/src/i18n/locales/ja/settings.json
@@ -367,6 +367,12 @@
"label": "レート制限",
"description": "APIリクエスト間の最小時間。"
},
+ "consecutiveMistakeLimit": {
+ "label": "エラーと繰り返しの制限",
+ "description": "「Rooが問題を抱えています」ダイアログを表示するまでの連続エラーまたは繰り返しアクションの数",
+ "unlimitedDescription": "無制限のリトライが有効です(自動進行)。ダイアログは表示されません。",
+ "warning": "⚠️ 0に設定すると無制限のリトライが可能になり、API使用量が大幅に増加する可能性があります"
+ },
"reasoningEffort": {
"label": "モデル推論の労力",
"high": "高",
diff --git a/webview-ui/src/i18n/locales/ko/settings.json b/webview-ui/src/i18n/locales/ko/settings.json
index 5053ed62f3..c4da7c8602 100644
--- a/webview-ui/src/i18n/locales/ko/settings.json
+++ b/webview-ui/src/i18n/locales/ko/settings.json
@@ -367,6 +367,12 @@
"label": "속도 제한",
"description": "API 요청 간 최소 시간."
},
+ "consecutiveMistakeLimit": {
+ "label": "오류 및 반복 제한",
+ "description": "'Roo에 문제가 발생했습니다' 대화 상자를 표시하기 전의 연속 오류 또는 반복 작업 수",
+ "unlimitedDescription": "무제한 재시도 활성화 (자동 진행). 대화 상자가 나타나지 않습니다.",
+ "warning": "⚠️ 0으로 설정하면 무제한 재시도가 허용되어 상당한 API 사용량이 발생할 수 있습니다"
+ },
"reasoningEffort": {
"label": "모델 추론 노력",
"high": "높음",
diff --git a/webview-ui/src/i18n/locales/nl/settings.json b/webview-ui/src/i18n/locales/nl/settings.json
index ab12e1931c..535c462fe2 100644
--- a/webview-ui/src/i18n/locales/nl/settings.json
+++ b/webview-ui/src/i18n/locales/nl/settings.json
@@ -367,6 +367,12 @@
"label": "Snelheidslimiet",
"description": "Minimale tijd tussen API-verzoeken."
},
+ "consecutiveMistakeLimit": {
+ "label": "Fout- & Herhalingslimiet",
+ "description": "Aantal opeenvolgende fouten of herhaalde acties voordat het dialoogvenster 'Roo ondervindt problemen' wordt weergegeven",
+ "unlimitedDescription": "Onbeperkt aantal nieuwe pogingen ingeschakeld (automatisch doorgaan). Het dialoogvenster zal nooit verschijnen.",
+ "warning": "⚠️ Instellen op 0 staat onbeperkte nieuwe pogingen toe, wat aanzienlijk API-gebruik kan verbruiken"
+ },
"reasoningEffort": {
"label": "Model redeneervermogen",
"high": "Hoog",
diff --git a/webview-ui/src/i18n/locales/pl/settings.json b/webview-ui/src/i18n/locales/pl/settings.json
index 266c668606..f7d80cd1a6 100644
--- a/webview-ui/src/i18n/locales/pl/settings.json
+++ b/webview-ui/src/i18n/locales/pl/settings.json
@@ -367,6 +367,12 @@
"label": "Limit szybkości",
"description": "Minimalny czas między żądaniami API."
},
+ "consecutiveMistakeLimit": {
+ "label": "Limit błędów i powtórzeń",
+ "description": "Liczba kolejnych błędów lub powtórzonych akcji przed wyświetleniem okna dialogowego 'Roo ma problemy'",
+ "unlimitedDescription": "Włączono nieograniczone próby (automatyczne kontynuowanie). Okno dialogowe nigdy się nie pojawi.",
+ "warning": "⚠️ Ustawienie na 0 pozwala na nieograniczone próby, co może zużyć znaczną ilość API"
+ },
"reasoningEffort": {
"label": "Wysiłek rozumowania modelu",
"high": "Wysoki",
diff --git a/webview-ui/src/i18n/locales/pt-BR/settings.json b/webview-ui/src/i18n/locales/pt-BR/settings.json
index e9825ae749..a9ccd98838 100644
--- a/webview-ui/src/i18n/locales/pt-BR/settings.json
+++ b/webview-ui/src/i18n/locales/pt-BR/settings.json
@@ -367,6 +367,12 @@
"label": "Limite de taxa",
"description": "Tempo mínimo entre requisições de API."
},
+ "consecutiveMistakeLimit": {
+ "label": "Limite de Erros e Repetições",
+ "description": "Número de erros consecutivos ou ações repetidas antes de exibir o diálogo 'Roo está com problemas'",
+ "unlimitedDescription": "Tentativas ilimitadas ativadas (prosseguimento automático). O diálogo nunca aparecerá.",
+ "warning": "⚠️ Definir como 0 permite tentativas ilimitadas, o que pode consumir um uso significativo da API"
+ },
"reasoningEffort": {
"label": "Esforço de raciocínio do modelo",
"high": "Alto",
diff --git a/webview-ui/src/i18n/locales/ru/settings.json b/webview-ui/src/i18n/locales/ru/settings.json
index 1b74b2253f..696c5ef641 100644
--- a/webview-ui/src/i18n/locales/ru/settings.json
+++ b/webview-ui/src/i18n/locales/ru/settings.json
@@ -367,6 +367,12 @@
"label": "Лимит скорости",
"description": "Минимальное время между запросами к API."
},
+ "consecutiveMistakeLimit": {
+ "label": "Лимит ошибок и повторений",
+ "description": "Количество последовательных ошибок или повторных действий перед показом диалогового окна 'У Roo возникли проблемы'",
+ "unlimitedDescription": "Включены неограниченные повторные попытки (автоматическое продолжение). Диалоговое окно никогда не появится.",
+ "warning": "⚠️ Установка значения 0 разрешает неограниченные повторные попытки, что может значительно увеличить использование API"
+ },
"reasoningEffort": {
"label": "Усилия по рассуждению модели",
"high": "Высокие",
diff --git a/webview-ui/src/i18n/locales/tr/settings.json b/webview-ui/src/i18n/locales/tr/settings.json
index 49d1803ddf..f81bfd98ea 100644
--- a/webview-ui/src/i18n/locales/tr/settings.json
+++ b/webview-ui/src/i18n/locales/tr/settings.json
@@ -367,6 +367,12 @@
"label": "Hız sınırı",
"description": "API istekleri arasındaki minimum süre."
},
+ "consecutiveMistakeLimit": {
+ "label": "Hata ve Tekrar Limiti",
+ "description": "'Roo sorun yaşıyor' iletişim kutusunu göstermeden önceki ardışık hata veya tekrarlanan eylem sayısı",
+ "unlimitedDescription": "Sınırsız yeniden deneme etkin (otomatik devam et). Diyalog asla görünmeyecek.",
+ "warning": "⚠️ 0'a ayarlamak, önemli API kullanımına neden olabilecek sınırsız yeniden denemeye izin verir"
+ },
"reasoningEffort": {
"label": "Model Akıl Yürütme Çabası",
"high": "Yüksek",
diff --git a/webview-ui/src/i18n/locales/vi/settings.json b/webview-ui/src/i18n/locales/vi/settings.json
index c12b5778a2..97f24b4733 100644
--- a/webview-ui/src/i18n/locales/vi/settings.json
+++ b/webview-ui/src/i18n/locales/vi/settings.json
@@ -367,6 +367,12 @@
"label": "Giới hạn tốc độ",
"description": "Thời gian tối thiểu giữa các yêu cầu API."
},
+ "consecutiveMistakeLimit": {
+ "label": "Giới hạn lỗi và lặp lại",
+ "description": "Số lỗi liên tiếp hoặc hành động lặp lại trước khi hiển thị hộp thoại 'Roo đang gặp sự cố'",
+ "unlimitedDescription": "Đã bật thử lại không giới hạn (tự động tiếp tục). Hộp thoại sẽ không bao giờ xuất hiện.",
+ "warning": "⚠️ Đặt thành 0 cho phép thử lại không giới hạn, điều này có thể tiêu tốn mức sử dụng API đáng kể"
+ },
"reasoningEffort": {
"label": "Nỗ lực suy luận của mô hình",
"high": "Cao",
diff --git a/webview-ui/src/i18n/locales/zh-CN/settings.json b/webview-ui/src/i18n/locales/zh-CN/settings.json
index c75578067d..bbe85d0e84 100644
--- a/webview-ui/src/i18n/locales/zh-CN/settings.json
+++ b/webview-ui/src/i18n/locales/zh-CN/settings.json
@@ -367,6 +367,12 @@
"label": "API 请求频率限制",
"description": "设置API请求的最小间隔时间"
},
+ "consecutiveMistakeLimit": {
+ "label": "错误和重复限制",
+ "description": "在显示“Roo遇到问题”对话框前允许的连续错误或重复操作次数",
+ "unlimitedDescription": "已启用无限重试(自动继续)。对话框将永远不会出现。",
+ "warning": "⚠️ 设置为 0 允许无限重试,这可能会消耗大量 API 使用量"
+ },
"reasoningEffort": {
"label": "模型推理强度",
"high": "高",
diff --git a/webview-ui/src/i18n/locales/zh-TW/settings.json b/webview-ui/src/i18n/locales/zh-TW/settings.json
index dec9e936b2..4ca64bbc5c 100644
--- a/webview-ui/src/i18n/locales/zh-TW/settings.json
+++ b/webview-ui/src/i18n/locales/zh-TW/settings.json
@@ -367,6 +367,12 @@
"label": "速率限制",
"description": "API 請求間的最短時間"
},
+ "consecutiveMistakeLimit": {
+ "label": "錯誤和重複限制",
+ "description": "在顯示「Roo 遇到問題」對話方塊前允許的連續錯誤或重複操作次數",
+ "unlimitedDescription": "已啟用無限重試(自動繼續)。對話方塊將永遠不會出現。",
+ "warning": "⚠️ 設定為 0 允許無限重試,這可能會消耗大量 API 使用量"
+ },
"reasoningEffort": {
"label": "模型推理強度",
"high": "高",
diff --git a/webview-ui/vitest.setup.ts b/webview-ui/vitest.setup.ts
index afa37bd96d..12210f0ec2 100644
--- a/webview-ui/vitest.setup.ts
+++ b/webview-ui/vitest.setup.ts
@@ -1,6 +1,12 @@
import "@testing-library/jest-dom"
import "@testing-library/jest-dom/vitest"
+// Force React into development mode for tests
+// This is needed to enable act(...) function in React Testing Library
+globalThis.process = globalThis.process || {}
+globalThis.process.env = globalThis.process.env || {}
+globalThis.process.env.NODE_ENV = "development"
+
class MockResizeObserver {
observe() {}
unobserve() {}