diff --git a/tools/wta/locales/af-ZA.yml b/tools/wta/locales/af-ZA.yml index 4ef4b0f7e..b975eecfe 100644 --- a/tools/wta/locales/af-ZA.yml +++ b/tools/wta/locales/af-ZA.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "Maak seker %{name} is geïnstalleer en op jou PATH." # # ── Agenteaansig (src/ui/agents_view.rs) ───────────────────────────────── agents.loading: "Laai tans..." -# {Locked="Enter","Esc","↑","↓"} - sleutelkombinasies, moenie vertaal nie -agents.footer_hint: "(↑ ↓ om te navigeer • Enter om sessie te begin • Esc om te verlaat)" +# {Locked="Enter","Esc","F5","↑","↓"} - sleutelkombinasies, moenie vertaal nie +agents.footer_hint: "(↑ ↓ om te navigeer • Enter om sessie te begin • Esc om te verlaat • F5 om te verfris)" agents.status.active: "Aktief" agents.status.waiting_for_input: "Wag vir invoer" agents.status.error: "Fout" diff --git a/tools/wta/locales/am-ET.yml b/tools/wta/locales/am-ET.yml index 7697c9aaa..9cc47ed9e 100644 --- a/tools/wta/locales/am-ET.yml +++ b/tools/wta/locales/am-ET.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "Make sure %{name} is installed and on your PATH." # {L # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Loading..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ to navigate • Enter to launch session • Esc to exit)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ to navigate • Enter to launch session • Esc to exit • F5 to refresh)" agents.status.active: "Active" agents.status.waiting_for_input: "Waiting for input" agents.status.error: "Error" diff --git a/tools/wta/locales/ar-SA.yml b/tools/wta/locales/ar-SA.yml index 7fde3a8ba..7f221bd5b 100644 --- a/tools/wta/locales/ar-SA.yml +++ b/tools/wta/locales/ar-SA.yml @@ -117,8 +117,8 @@ agent.custom.auth_hint: "تأكد من أن %{name} مثبّت وموجود في # ── عرض عوامل الذكاء الاصطناعي (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "جارٍ التحميل..." -# {Locked="Enter","Esc","↑","↓"} - مجموعات المفاتيح، لا تترجمها -agents.footer_hint: "(↑ ↓ للتنقل • Enter لبدء جلسة • Esc للخروج)" +# {Locked="Enter","Esc","F5","↑","↓"} - مجموعات المفاتيح، لا تترجمها +agents.footer_hint: "(↑ ↓ للتنقل • Enter لبدء جلسة • Esc للخروج • F5 للتحديث)" agents.status.active: "نشط" agents.status.waiting_for_input: "في انتظار الإدخال" agents.status.error: "خطأ" diff --git a/tools/wta/locales/as-IN.yml b/tools/wta/locales/as-IN.yml index 78d678a8b..2318737e9 100644 --- a/tools/wta/locales/as-IN.yml +++ b/tools/wta/locales/as-IN.yml @@ -117,8 +117,8 @@ agent.custom.auth_hint: "%{name} ইনষ্টল কৰা হৈছে আ # ── এজেণ্ট দৃশ্য (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "ল'ড হৈ আছে..." -# {Locked="Enter","Esc","↑","↓"} - কী সংমিশ্ৰণ, অনুবাদ নকৰিব -agents.footer_hint: "(↑ ↓ নেভিগেট কৰক • Enter ছেশ্বন আৰম্ভ কৰক • Esc ওলাই যাওক)" +# {Locked="Enter","Esc","F5","↑","↓"} - কী সংমিশ্ৰণ, অনুবাদ নকৰিব +agents.footer_hint: "(↑ ↓ নেভিগেট কৰক • Enter ছেশ্বন আৰম্ভ কৰক • Esc ওলাই যাওক • F5 ৰিফ্ৰেশ কৰক)" agents.status.active: "সক্ৰিয়" agents.status.waiting_for_input: "ইনপুটৰ বাবে অপেক্ষা" agents.status.error: "ত্ৰুটি" diff --git a/tools/wta/locales/az-Latn-AZ.yml b/tools/wta/locales/az-Latn-AZ.yml index f95a76105..11821943e 100644 --- a/tools/wta/locales/az-Latn-AZ.yml +++ b/tools/wta/locales/az-Latn-AZ.yml @@ -117,8 +117,8 @@ agent.custom.auth_hint: "%{name} quraşdırıldığına və PATH-də olduğuna # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Yüklənir..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ naviqasiya üçün • Enter sessiya açmaq üçün • Esc çıxmaq üçün)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ naviqasiya üçün • Enter sessiya açmaq üçün • Esc çıxmaq üçün • F5 yeniləmək üçün)" agents.status.active: "Aktiv" agents.status.waiting_for_input: "Giriş gözlənilir" agents.status.error: "Xəta" diff --git a/tools/wta/locales/bg-BG.yml b/tools/wta/locales/bg-BG.yml index 7bd50b993..6b7f76a5a 100644 --- a/tools/wta/locales/bg-BG.yml +++ b/tools/wta/locales/bg-BG.yml @@ -113,8 +113,8 @@ agent.custom.auth_hint: "Уверете се, че %{name} е инсталира # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Зареждане..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ за навигация • Enter за стартиране на сесия • Esc за изход)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ за навигация • Enter за стартиране на сесия • Esc за изход • F5 за обновяване)" agents.status.active: "Активен" agents.status.waiting_for_input: "Очаква въвеждане" agents.status.error: "Грешка" diff --git a/tools/wta/locales/bn-IN.yml b/tools/wta/locales/bn-IN.yml index b734dd08a..05b68b640 100644 --- a/tools/wta/locales/bn-IN.yml +++ b/tools/wta/locales/bn-IN.yml @@ -117,8 +117,8 @@ agent.custom.auth_hint: "নিশ্চিত করুন যে %{name} ই # ── এজেন্ট দৃশ্য (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "লোড হচ্ছে..." -# {Locked="Enter","Esc","↑","↓"} - কী সংমিশ্রণ, অনুবাদ করবেন না -agents.footer_hint: "(↑ ↓ নেভিগেট করুন • Enter সেশন চালু করুন • Esc প্রস্থান)" +# {Locked="Enter","Esc","F5","↑","↓"} - কী সংমিশ্রণ, অনুবাদ করবেন না +agents.footer_hint: "(↑ ↓ নেভিগেট করুন • Enter সেশন চালু করুন • Esc প্রস্থান • F5 রিফ্রেশ করুন)" agents.status.active: "সক্রিয়" agents.status.waiting_for_input: "ইনপুটের জন্য অপেক্ষা" agents.status.error: "ত্রুটি" diff --git a/tools/wta/locales/bs-Latn-BA.yml b/tools/wta/locales/bs-Latn-BA.yml index 41556f4e9..71bbd481c 100644 --- a/tools/wta/locales/bs-Latn-BA.yml +++ b/tools/wta/locales/bs-Latn-BA.yml @@ -113,8 +113,8 @@ agent.custom.auth_hint: "Provjerite da je %{name} instaliran i da se nalazi u PA # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Učitavanje..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ za navigaciju • Enter za otvaranje sesije • Esc za izlaz)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ za navigaciju • Enter za otvaranje sesije • Esc za izlaz • F5 za osvježavanje)" agents.status.active: "Aktivan" agents.status.waiting_for_input: "Čeka na unos" agents.status.error: "Greška" diff --git a/tools/wta/locales/ca-ES.yml b/tools/wta/locales/ca-ES.yml index 4a7dd81f2..0f8955724 100644 --- a/tools/wta/locales/ca-ES.yml +++ b/tools/wta/locales/ca-ES.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "Assegureu-vos que %{name} estigui instal·lat i al vost # ── Vista d'agents (src/ui/agents_view.rs) ───────────────────────────────── agents.loading: "S'està carregant..." -# {Locked="Enter","Esc","↑","↓"} - combinacions de tecles, no traduïu -agents.footer_hint: "(↑ ↓ per navegar • Enter per iniciar la sessió • Esc per sortir)" +# {Locked="Enter","Esc","F5","↑","↓"} - combinacions de tecles, no traduïu +agents.footer_hint: "(↑ ↓ per navegar • Enter per iniciar la sessió • Esc per sortir • F5 per actualitzar)" agents.status.active: "Actiu" agents.status.waiting_for_input: "Esperant entrada" agents.status.error: "Error" diff --git a/tools/wta/locales/ca-Es-VALENCIA.yml b/tools/wta/locales/ca-Es-VALENCIA.yml index 5c77b49d0..10ff21f62 100644 --- a/tools/wta/locales/ca-Es-VALENCIA.yml +++ b/tools/wta/locales/ca-Es-VALENCIA.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "Assegureu-vos que %{name} estiga instal·lat i al vostr # ── Vista d'agents (src/ui/agents_view.rs) ───────────────────────────────── agents.loading: "S'està carregant..." -# {Locked="Enter","Esc","↑","↓"} - combinacions de tecles, no traduïu -agents.footer_hint: "(↑ ↓ per a navegar • Enter per a iniciar la sessió • Esc per a eixir)" +# {Locked="Enter","Esc","F5","↑","↓"} - combinacions de tecles, no traduïu +agents.footer_hint: "(↑ ↓ per a navegar • Enter per a iniciar la sessió • Esc per a eixir • F5 per a actualitzar)" agents.status.active: "Actiu" agents.status.waiting_for_input: "Esperant entrada" agents.status.error: "Error" diff --git a/tools/wta/locales/cs-CZ.yml b/tools/wta/locales/cs-CZ.yml index c12039931..cf04f7fcd 100644 --- a/tools/wta/locales/cs-CZ.yml +++ b/tools/wta/locales/cs-CZ.yml @@ -113,8 +113,8 @@ agent.custom.auth_hint: "Ujistěte se, že %{name} je nainstalován a je v PATH. # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Načítání..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ pro navigaci • Enter pro spuštění relace • Esc pro ukončení)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ pro navigaci • Enter pro spuštění relace • Esc pro ukončení • F5 pro aktualizaci)" agents.status.active: "Aktivní" agents.status.waiting_for_input: "Čeká na vstup" agents.status.error: "Chyba" diff --git a/tools/wta/locales/cy-GB.yml b/tools/wta/locales/cy-GB.yml index a0ba06e82..ab5bf1bb5 100644 --- a/tools/wta/locales/cy-GB.yml +++ b/tools/wta/locales/cy-GB.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "Gwnewch yn siŵr fod %{name} wedi'i osod ac ar eich PAT # ── Golwg asiantau (src/ui/agents_view.rs) ───────────────────────────────── agents.loading: "Yn llwytho..." -# {Locked="Enter","Esc","↑","↓"} - cyfuniadau bysellau, peidiwch â chyfieithu -agents.footer_hint: "(↑ ↓ i lywio • Enter i lansio sesiwn • Esc i adael)" +# {Locked="Enter","Esc","F5","↑","↓"} - cyfuniadau bysellau, peidiwch â chyfieithu +agents.footer_hint: "(↑ ↓ i lywio • Enter i lansio sesiwn • Esc i adael • F5 i adnewyddu)" agents.status.active: "Gweithredol" agents.status.waiting_for_input: "Yn aros am fewnbwn" agents.status.error: "Gwall" diff --git a/tools/wta/locales/da-DK.yml b/tools/wta/locales/da-DK.yml index 709d0b8af..d2d1bdd41 100644 --- a/tools/wta/locales/da-DK.yml +++ b/tools/wta/locales/da-DK.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "Sørg for at %{name} er installeret og på din PATH." # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Indlæser..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ for at navigere • Enter for at starte session • Esc for at afslutte)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ for at navigere • Enter for at starte session • Esc for at afslutte • F5 for at opdatere)" agents.status.active: "Aktiv" agents.status.waiting_for_input: "Venter på input" agents.status.error: "Fejl" diff --git a/tools/wta/locales/de-DE.yml b/tools/wta/locales/de-DE.yml index 192daa53a..bd7cfd0d7 100644 --- a/tools/wta/locales/de-DE.yml +++ b/tools/wta/locales/de-DE.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "Stellen Sie sicher, dass %{name} installiert und im PAT # ── Agentenansicht (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Laden..." -# {Locked="Enter","Esc","↑","↓"} - Tastenkombinationen, nicht übersetzen -agents.footer_hint: "(↑ ↓ navigieren • Enter Sitzung starten • Esc beenden)" +# {Locked="Enter","Esc","F5","↑","↓"} - Tastenkombinationen, nicht übersetzen +agents.footer_hint: "(↑ ↓ navigieren • Enter Sitzung starten • Esc beenden • F5 aktualisieren)" agents.status.active: "Aktiv" agents.status.waiting_for_input: "Wartet auf Eingabe" agents.status.error: "Fehler" diff --git a/tools/wta/locales/el-GR.yml b/tools/wta/locales/el-GR.yml index f7e180ab3..984222edf 100644 --- a/tools/wta/locales/el-GR.yml +++ b/tools/wta/locales/el-GR.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "Βεβαιωθείτε ότι το %{name} είναι # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Φόρτωση..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ για πλοήγηση • Enter για έναρξη συνεδρίας • Esc για έξοδο)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ για πλοήγηση • Enter για έναρξη συνεδρίας • Esc για έξοδο • F5 για ανανέωση)" agents.status.active: "Ενεργός" agents.status.waiting_for_input: "Αναμονή εισόδου" agents.status.error: "Σφάλμα" diff --git a/tools/wta/locales/en-GB.yml b/tools/wta/locales/en-GB.yml index 03fd60a2f..effc45903 100644 --- a/tools/wta/locales/en-GB.yml +++ b/tools/wta/locales/en-GB.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "Make sure %{name} is installed and on your PATH." # {L # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Loading..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ to navigate • Enter to launch session • Esc to exit)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ to navigate • Enter to launch session • Esc to exit • F5 to refresh)" agents.status.active: "Active" agents.status.waiting_for_input: "Waiting for input" agents.status.error: "Error" diff --git a/tools/wta/locales/en-US.yml b/tools/wta/locales/en-US.yml index 7bb750185..cdc470e6d 100644 --- a/tools/wta/locales/en-US.yml +++ b/tools/wta/locales/en-US.yml @@ -141,8 +141,8 @@ agent.custom.auth_hint: "Make sure %{name} is installed and on your PATH." # {L # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Loading..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ to navigate • Enter to launch session • Esc to exit)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ to navigate • Enter to launch session • Esc to exit • F5 to refresh)" # Status badge when agent session is actively processing agents.status.active: "Active" agents.status.waiting_for_input: "Waiting for input" diff --git a/tools/wta/locales/es-ES.yml b/tools/wta/locales/es-ES.yml index 8a0956610..659239353 100644 --- a/tools/wta/locales/es-ES.yml +++ b/tools/wta/locales/es-ES.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "Asegúrese de que %{name} esté instalado y en el PATH. # ── Vista de agentes (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Cargando..." -# {Locked="Enter","Esc","↑","↓"} - combinaciones de teclas, no traducir -agents.footer_hint: "(↑ ↓ navegar • Enter iniciar sesión • Esc salir)" +# {Locked="Enter","Esc","F5","↑","↓"} - combinaciones de teclas, no traducir +agents.footer_hint: "(↑ ↓ navegar • Enter iniciar sesión • Esc salir • F5 actualizar)" agents.status.active: "Activo" agents.status.waiting_for_input: "Esperando entrada" agents.status.error: "Error" diff --git a/tools/wta/locales/es-MX.yml b/tools/wta/locales/es-MX.yml index 587d9f34e..1cd421629 100644 --- a/tools/wta/locales/es-MX.yml +++ b/tools/wta/locales/es-MX.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "Asegúrate de que %{name} esté instalado y en el PATH. # ── Vista de agentes (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Cargando..." -# {Locked="Enter","Esc","↑","↓"} - combinaciones de teclas, no traducir -agents.footer_hint: "(↑ ↓ navegar • Enter iniciar sesión • Esc salir)" +# {Locked="Enter","Esc","F5","↑","↓"} - combinaciones de teclas, no traducir +agents.footer_hint: "(↑ ↓ navegar • Enter iniciar sesión • Esc salir • F5 actualizar)" agents.status.active: "Activo" agents.status.waiting_for_input: "Esperando entrada" agents.status.error: "Error" diff --git a/tools/wta/locales/et-EE.yml b/tools/wta/locales/et-EE.yml index a1d20b715..3782f59fb 100644 --- a/tools/wta/locales/et-EE.yml +++ b/tools/wta/locales/et-EE.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "Veenduge, et %{name} on installitud ja teie PATH-is." # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Laadimine..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ navigeerimiseks • Enter seansi käivitamiseks • Esc väljumiseks)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ navigeerimiseks • Enter seansi käivitamiseks • Esc väljumiseks • F5 värskendamiseks)" agents.status.active: "Aktiivne" agents.status.waiting_for_input: "Ootab sisendit" agents.status.error: "Viga" diff --git a/tools/wta/locales/eu-ES.yml b/tools/wta/locales/eu-ES.yml index 21ae99700..f8748e022 100644 --- a/tools/wta/locales/eu-ES.yml +++ b/tools/wta/locales/eu-ES.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "Ziurtatu %{name} instalatuta dagoela eta zure PATH-ean # ── Agenteen ikuspegia (src/ui/agents_view.rs) ───────────────────────────────── agents.loading: "Kargatzen..." -# {Locked="Enter","Esc","↑","↓"} - tekla-konbinazioak, ez itzuli -agents.footer_hint: "(↑ ↓ nabigatzeko • Enter saioa abiarazteko • Esc irteteko)" +# {Locked="Enter","Esc","F5","↑","↓"} - tekla-konbinazioak, ez itzuli +agents.footer_hint: "(↑ ↓ nabigatzeko • Enter saioa abiarazteko • Esc irteteko • F5 freskatzeko)" agents.status.active: "Aktiboa" agents.status.waiting_for_input: "Sarreraren zain" agents.status.error: "Errorea" diff --git a/tools/wta/locales/fa-IR.yml b/tools/wta/locales/fa-IR.yml index 234456a19..f699fa289 100644 --- a/tools/wta/locales/fa-IR.yml +++ b/tools/wta/locales/fa-IR.yml @@ -117,8 +117,8 @@ agent.custom.auth_hint: "مطمئن شوید که %{name} نصب شده و در # ── نمای عامل‌های هوش مصنوعی (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "در حال بارگذاری..." -# {Locked="Enter","Esc","↑","↓"} - ترکیب کلیدها، ترجمه نکنید -agents.footer_hint: "(↑ ↓ ناوبری • Enter شروع نشست • Esc خروج)" +# {Locked="Enter","Esc","F5","↑","↓"} - ترکیب کلیدها، ترجمه نکنید +agents.footer_hint: "(↑ ↓ ناوبری • Enter شروع نشست • Esc خروج • F5 تازه‌سازی)" agents.status.active: "فعال" agents.status.waiting_for_input: "در انتظار ورودی" agents.status.error: "خطا" diff --git a/tools/wta/locales/fi-FI.yml b/tools/wta/locales/fi-FI.yml index 35be7b0c4..1690d0ee0 100644 --- a/tools/wta/locales/fi-FI.yml +++ b/tools/wta/locales/fi-FI.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "Varmista, että %{name} on asennettu ja PATH-muuttujass # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Ladataan..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ navigoidaksesi • Enter käynnistääksesi istunnon • Esc poistuaksesi)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ navigoidaksesi • Enter käynnistääksesi istunnon • Esc poistuaksesi • F5 päivittääksesi)" agents.status.active: "Aktiivinen" agents.status.waiting_for_input: "Odottaa syötettä" agents.status.error: "Virhe" diff --git a/tools/wta/locales/fil-PH.yml b/tools/wta/locales/fil-PH.yml index 258f65266..783ea0543 100644 --- a/tools/wta/locales/fil-PH.yml +++ b/tools/wta/locales/fil-PH.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "Tiyaking naka-install ang %{name} at nasa iyong PATH." # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Naglo-load..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ para mag-navigate • Enter para magbukas ng session • Esc para lumabas)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ para mag-navigate • Enter para magbukas ng session • Esc para lumabas • F5 para mag-refresh)" agents.status.active: "Aktibo" agents.status.waiting_for_input: "Naghihintay ng input" agents.status.error: "May error" diff --git a/tools/wta/locales/fr-CA.yml b/tools/wta/locales/fr-CA.yml index 99b91560b..69727da82 100644 --- a/tools/wta/locales/fr-CA.yml +++ b/tools/wta/locales/fr-CA.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "Assurez-vous que %{name} est installé et se trouve dan # ── Vue des agents (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Chargement..." -# {Locked="Enter","Esc","↑","↓"} - combinaisons de touches, ne pas traduire -agents.footer_hint: "(↑ ↓ naviguer • Enter lancer la session • Esc quitter)" +# {Locked="Enter","Esc","F5","↑","↓"} - combinaisons de touches, ne pas traduire +agents.footer_hint: "(↑ ↓ naviguer • Enter lancer la session • Esc quitter • F5 actualiser)" agents.status.active: "Actif" agents.status.waiting_for_input: "En attente de saisie" agents.status.error: "Erreur" diff --git a/tools/wta/locales/fr-FR.yml b/tools/wta/locales/fr-FR.yml index 49c4ffbfd..40676c4f0 100644 --- a/tools/wta/locales/fr-FR.yml +++ b/tools/wta/locales/fr-FR.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "Assurez-vous que %{name} est installé et se trouve dan # ── Vue des agents (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Chargement..." -# {Locked="Enter","Esc","↑","↓"} - combinaisons de touches, ne pas traduire -agents.footer_hint: "(↑ ↓ naviguer • Enter lancer la session • Esc quitter)" +# {Locked="Enter","Esc","F5","↑","↓"} - combinaisons de touches, ne pas traduire +agents.footer_hint: "(↑ ↓ naviguer • Enter lancer la session • Esc quitter • F5 actualiser)" agents.status.active: "Actif" agents.status.waiting_for_input: "En attente de saisie" agents.status.error: "Erreur" diff --git a/tools/wta/locales/ga-IE.yml b/tools/wta/locales/ga-IE.yml index a4b4a1415..a7680863e 100644 --- a/tools/wta/locales/ga-IE.yml +++ b/tools/wta/locales/ga-IE.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "Cinntigh go bhfuil %{name} suiteáilte agus ar do PATH. # ── Amharc gníomhairí (src/ui/agents_view.rs) ───────────────────────────────── agents.loading: "Á luchtú..." -# {Locked="Enter","Esc","↑","↓"} - teaglamaí eochracha, ná haistrigh -agents.footer_hint: "(↑ ↓ chun nascleanúint • Enter chun seisiún a sheoladh • Esc chun scor)" +# {Locked="Enter","Esc","F5","↑","↓"} - teaglamaí eochracha, ná haistrigh +agents.footer_hint: "(↑ ↓ chun nascleanúint • Enter chun seisiún a sheoladh • Esc chun scor • F5 chun athnuachan)" agents.status.active: "Gníomhach" agents.status.waiting_for_input: "Ag fanacht le hionchur" agents.status.error: "Earráid" diff --git a/tools/wta/locales/gd-gb.yml b/tools/wta/locales/gd-gb.yml index eb734b081..a4f5f9648 100644 --- a/tools/wta/locales/gd-gb.yml +++ b/tools/wta/locales/gd-gb.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "Dèan cinnteach gu bheil %{name} air a stàladh agus ai # ── Sealladh àidseant (src/ui/agents_view.rs) ───────────────────────────────── agents.loading: "Ga luchdadh..." -# {Locked="Enter","Esc","↑","↓"} - co-mheasgaidhean iuchraichean, na eadar-theangaich -agents.footer_hint: "(↑ ↓ gus seòladh • Enter gus seisean a chur air bhog • Esc gus fàgail)" +# {Locked="Enter","Esc","F5","↑","↓"} - co-mheasgaidhean iuchraichean, na eadar-theangaich +agents.footer_hint: "(↑ ↓ gus seòladh • Enter gus seisean a chur air bhog • Esc gus fàgail • F5 gus ùrachadh)" agents.status.active: "Gnìomhach" agents.status.waiting_for_input: "A' feitheamh ri ion-chur" agents.status.error: "Mearachd" diff --git a/tools/wta/locales/gl-ES.yml b/tools/wta/locales/gl-ES.yml index 4434800ce..652fe06fa 100644 --- a/tools/wta/locales/gl-ES.yml +++ b/tools/wta/locales/gl-ES.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "Asegúrese de que %{name} estea instalado e no seu PATH # ── Vista de axentes (src/ui/agents_view.rs) ───────────────────────────────── agents.loading: "Cargando..." -# {Locked="Enter","Esc","↑","↓"} - combinacións de teclas, non traducir -agents.footer_hint: "(↑ ↓ para navegar • Enter para iniciar sesión • Esc para saír)" +# {Locked="Enter","Esc","F5","↑","↓"} - combinacións de teclas, non traducir +agents.footer_hint: "(↑ ↓ para navegar • Enter para iniciar sesión • Esc para saír • F5 para actualizar)" agents.status.active: "Activo" agents.status.waiting_for_input: "Agardando entrada" agents.status.error: "Erro" diff --git a/tools/wta/locales/gu-IN.yml b/tools/wta/locales/gu-IN.yml index a6685685b..e63dd8231 100644 --- a/tools/wta/locales/gu-IN.yml +++ b/tools/wta/locales/gu-IN.yml @@ -117,8 +117,8 @@ agent.custom.auth_hint: "ખાતરી કરો કે %{name} ઇન્સ # ── એજન્ટ દૃશ્ય (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "લોડ થઈ રહ્યું છે..." -# {Locked="Enter","Esc","↑","↓"} - કી સંયોજનો, અનુવાદ કરશો નહીં -agents.footer_hint: "(↑ ↓ નેવિગેટ કરો • Enter સત્ર શરૂ કરો • Esc બહાર નીકળો)" +# {Locked="Enter","Esc","F5","↑","↓"} - કી સંયોજનો, અનુવાદ કરશો નહીં +agents.footer_hint: "(↑ ↓ નેવિગેટ કરો • Enter સત્ર શરૂ કરો • Esc બહાર નીકળો • F5 રિફ્રેશ કરો)" agents.status.active: "સક્રિય" agents.status.waiting_for_input: "ઇનપુટની રાહ" agents.status.error: "ભૂલ" diff --git a/tools/wta/locales/he-IL.yml b/tools/wta/locales/he-IL.yml index 7fbfec838..3231bc062 100644 --- a/tools/wta/locales/he-IL.yml +++ b/tools/wta/locales/he-IL.yml @@ -117,8 +117,8 @@ agent.custom.auth_hint: "ודא ש-%{name} מותקן ונמצא ב-PATH שלך. # ── תצוגת סוכנים (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "טוען..." -# {Locked="Enter","Esc","↑","↓"} - צירופי מקשים, אין לתרגם -agents.footer_hint: "(↑ ↓ לניווט • Enter להפעלת הפעלה • Esc ליציאה)" +# {Locked="Enter","Esc","F5","↑","↓"} - צירופי מקשים, אין לתרגם +agents.footer_hint: "(↑ ↓ לניווט • Enter להפעלת הפעלה • Esc ליציאה • F5 לרענון)" agents.status.active: "פעיל" agents.status.waiting_for_input: "ממתין לקלט" agents.status.error: "שגיאה" diff --git a/tools/wta/locales/hi-IN.yml b/tools/wta/locales/hi-IN.yml index 54534f2de..d93be7328 100644 --- a/tools/wta/locales/hi-IN.yml +++ b/tools/wta/locales/hi-IN.yml @@ -117,8 +117,8 @@ agent.custom.auth_hint: "सुनिश्चित करें कि %{name} # ── एजेंट दृश्य (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "लोड हो रहा है..." -# {Locked="Enter","Esc","↑","↓"} - कुंजी संयोजन, अनुवाद न करें -agents.footer_hint: "(↑ ↓ नेविगेट करें • Enter सत्र शुरू करें • Esc बाहर निकलें)" +# {Locked="Enter","Esc","F5","↑","↓"} - कुंजी संयोजन, अनुवाद न करें +agents.footer_hint: "(↑ ↓ नेविगेट करें • Enter सत्र शुरू करें • Esc बाहर निकलें • F5 रीफ़्रेश करें)" agents.status.active: "सक्रिय" agents.status.waiting_for_input: "इनपुट की प्रतीक्षा" agents.status.error: "त्रुटि" diff --git a/tools/wta/locales/hr-HR.yml b/tools/wta/locales/hr-HR.yml index 1db8a6ceb..e05efcf91 100644 --- a/tools/wta/locales/hr-HR.yml +++ b/tools/wta/locales/hr-HR.yml @@ -113,8 +113,8 @@ agent.custom.auth_hint: "Provjerite je li %{name} instaliran i nalazi li se u PA # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Učitavanje..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ za navigaciju • Enter za pokretanje sesije • Esc za izlaz)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ za navigaciju • Enter za pokretanje sesije • Esc za izlaz • F5 za osvježavanje)" agents.status.active: "Aktivno" agents.status.waiting_for_input: "Čeka unos" agents.status.error: "Pogreška" diff --git a/tools/wta/locales/hu-HU.yml b/tools/wta/locales/hu-HU.yml index c5ccb8da7..09aced682 100644 --- a/tools/wta/locales/hu-HU.yml +++ b/tools/wta/locales/hu-HU.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "Győződjön meg róla, hogy a(z) %{name} telepítve va # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Betöltés..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ navigáláshoz • Enter munkamenet indításához • Esc kilépéshez)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ navigáláshoz • Enter munkamenet indításához • Esc kilépéshez • F5 frissítéshez)" agents.status.active: "Aktív" agents.status.waiting_for_input: "Bemenetre vár" agents.status.error: "Hiba" diff --git a/tools/wta/locales/hy-AM.yml b/tools/wta/locales/hy-AM.yml index 683206405..c7869d278 100644 --- a/tools/wta/locales/hy-AM.yml +++ b/tools/wta/locales/hy-AM.yml @@ -128,8 +128,8 @@ agent.custom.auth_hint: "Համոզվեք, որ %{name}-ը տեղադրված է # ── Agents view (src/ui/agents_view.rs) ─────────────────────────────────────────────────────────────── agents.loading: "Բեռնվում է..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ նավիգացիա • Enter նիստ գործարկելու համար • Esc դուրս գալու համար)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ նավիգացիա • Enter նիստ գործարկելու համար • Esc դուրս գալու համար • F5 թարմացնելու համար)" # Status badge when agent session is actively processing agents.status.active: "Ակտիվ" agents.status.waiting_for_input: "Սպասում է մուտքի" diff --git a/tools/wta/locales/id-ID.yml b/tools/wta/locales/id-ID.yml index d94a674ce..9477e1d63 100644 --- a/tools/wta/locales/id-ID.yml +++ b/tools/wta/locales/id-ID.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "Pastikan %{name} sudah diinstal dan ada di PATH Anda." # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Memuat..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ untuk navigasi • Enter untuk membuka sesi • Esc untuk keluar)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ untuk navigasi • Enter untuk membuka sesi • Esc untuk keluar • F5 untuk menyegarkan)" agents.status.active: "Aktif" agents.status.waiting_for_input: "Menunggu input" agents.status.error: "Kesalahan" diff --git a/tools/wta/locales/is-IS.yml b/tools/wta/locales/is-IS.yml index 1784dc1f9..e50223b4f 100644 --- a/tools/wta/locales/is-IS.yml +++ b/tools/wta/locales/is-IS.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "Gakktu úr skugga um að %{name} sé uppsett og á PATH # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Hleð..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ til að fletta • Enter til að hefja lotu • Esc til að hætta)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ til að fletta • Enter til að hefja lotu • Esc til að hætta • F5 til að endurnýja)" agents.status.active: "Virk" agents.status.waiting_for_input: "Bíður eftir inntaki" agents.status.error: "Villa" diff --git a/tools/wta/locales/it-IT.yml b/tools/wta/locales/it-IT.yml index 327a44242..83300af7d 100644 --- a/tools/wta/locales/it-IT.yml +++ b/tools/wta/locales/it-IT.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "Assicurati che %{name} sia installato e nel PATH." # { # ── Vista agenti (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Caricamento..." -# {Locked="Enter","Esc","↑","↓"} - combinazioni di tasti, non tradurre -agents.footer_hint: "(↑ ↓ per navigare • Enter per avviare la sessione • Esc per uscire)" +# {Locked="Enter","Esc","F5","↑","↓"} - combinazioni di tasti, non tradurre +agents.footer_hint: "(↑ ↓ per navigare • Enter per avviare la sessione • Esc per uscire • F5 per aggiornare)" agents.status.active: "Attivo" agents.status.waiting_for_input: "In attesa di input" agents.status.error: "Errore" diff --git a/tools/wta/locales/ja-JP.yml b/tools/wta/locales/ja-JP.yml index ae97dfd64..1efefa953 100644 --- a/tools/wta/locales/ja-JP.yml +++ b/tools/wta/locales/ja-JP.yml @@ -102,8 +102,8 @@ agent.custom.auth_hint: "%{name} がインストールされ、PATH 上にある # ── エージェント ビュー (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "読み込み中..." -# {Locked="Enter","Esc","↑","↓"} - キーの組み合わせ、翻訳不要 -agents.footer_hint: "(↑ ↓ 移動 • Enter セッションを起動 • Esc 終了)" +# {Locked="Enter","Esc","F5","↑","↓"} - キーの組み合わせ、翻訳不要 +agents.footer_hint: "(↑ ↓ 移動 • Enter セッションを起動 • Esc 終了 • F5 更新)" agents.status.active: "アクティブ" agents.status.waiting_for_input: "入力待ち" agents.status.error: "エラー" diff --git a/tools/wta/locales/ka-GE.yml b/tools/wta/locales/ka-GE.yml index 2ba42da00..ad5cb210f 100644 --- a/tools/wta/locales/ka-GE.yml +++ b/tools/wta/locales/ka-GE.yml @@ -117,8 +117,8 @@ agent.custom.auth_hint: "დარწმუნდით, რომ %{name} დ # ── აგენტების ხედი (src/ui/agents_view.rs) ───────────────────────────────── agents.loading: "იტვირთება..." -# {Locked="Enter","Esc","↑","↓"} - ღილაკების კომბინაციები, არ ითარგმნება -agents.footer_hint: "(↑ ↓ ნავიგაციისთვის • Enter სესიის გასახსნელად • Esc გასასვლელად)" +# {Locked="Enter","Esc","F5","↑","↓"} - ღილაკების კომბინაციები, არ ითარგმნება +agents.footer_hint: "(↑ ↓ ნავიგაციისთვის • Enter სესიის გასახსნელად • Esc გასასვლელად • F5 განახლებისთვის)" agents.status.active: "აქტიური" agents.status.waiting_for_input: "შეყვანის მოლოდინში" agents.status.error: "შეცდომა" diff --git a/tools/wta/locales/kk-KZ.yml b/tools/wta/locales/kk-KZ.yml index 0d27d47ff..a8d9de22e 100644 --- a/tools/wta/locales/kk-KZ.yml +++ b/tools/wta/locales/kk-KZ.yml @@ -117,8 +117,8 @@ agent.custom.auth_hint: "%{name} орнатылғанына және PATH-те # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Жүктелуде..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ шарлау үшін • Enter сеанс ашу үшін • Esc шығу үшін)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ шарлау үшін • Enter сеанс ашу үшін • Esc шығу үшін • F5 жаңарту үшін)" agents.status.active: "Белсенді" agents.status.waiting_for_input: "Енгізу күтілуде" agents.status.error: "Қате" diff --git a/tools/wta/locales/km-KH.yml b/tools/wta/locales/km-KH.yml index 22f6513ce..5398543fc 100644 --- a/tools/wta/locales/km-KH.yml +++ b/tools/wta/locales/km-KH.yml @@ -117,8 +117,8 @@ agent.custom.auth_hint: "សូមប្រាកដថា %{name} ត្រូ # ── Agents view (src/ui/agents_view.rs) ─────────────────────────────────────────────────────────────── agents.loading: "កំពុងផ្ទុក..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ ដើម្បីរុករក • Enter ដើម្បីចាប់ផ្តើមវគ្គ • Esc ដើម្បីចាកចេញ)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ ដើម្បីរុករក • Enter ដើម្បីចាប់ផ្តើមវគ្គ • Esc ដើម្បីចាកចេញ • F5 ដើម្បីធ្វើឱ្យស្រស់)" # Status badge when agent session is actively processing agents.status.active: "សកម្ម" agents.status.waiting_for_input: "រង់ចាំការបញ្ចូល" diff --git a/tools/wta/locales/kn-IN.yml b/tools/wta/locales/kn-IN.yml index c0fc9ff5c..14f6261d8 100644 --- a/tools/wta/locales/kn-IN.yml +++ b/tools/wta/locales/kn-IN.yml @@ -117,8 +117,8 @@ agent.custom.auth_hint: "%{name} ಇನ್‌ಸ್ಟಾಲ್ ಆಗಿದೆ # ── ಏಜೆಂಟ್‌ಗಳ ವೀಕ್ಷಣೆ (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "ಲೋಡ್ ಆಗುತ್ತಿದೆ..." -# {Locked="Enter","Esc","↑","↓"} - ಕೀ ಸಂಯೋಜನೆಗಳು, ಅನುವಾದಿಸಬೇಡಿ -agents.footer_hint: "(↑ ↓ ನ್ಯಾವಿಗೇಟ್ ಮಾಡಿ • Enter ಸೆಶನ್ ಪ್ರಾರಂಭಿಸಿ • Esc ನಿರ್ಗಮಿಸಿ)" +# {Locked="Enter","Esc","F5","↑","↓"} - ಕೀ ಸಂಯೋಜನೆಗಳು, ಅನುವಾದಿಸಬೇಡಿ +agents.footer_hint: "(↑ ↓ ನ್ಯಾವಿಗೇಟ್ ಮಾಡಿ • Enter ಸೆಶನ್ ಪ್ರಾರಂಭಿಸಿ • Esc ನಿರ್ಗಮಿಸಿ • F5 ರಿಫ್ರೆಶ್ ಮಾಡಿ)" agents.status.active: "ಸಕ್ರಿಯ" agents.status.waiting_for_input: "ಇನ್‌ಪುಟ್‌ಗಾಗಿ ಕಾಯಲಾಗುತ್ತಿದೆ" agents.status.error: "ದೋಷ" diff --git a/tools/wta/locales/ko-KR.yml b/tools/wta/locales/ko-KR.yml index 234e5670e..d717d7028 100644 --- a/tools/wta/locales/ko-KR.yml +++ b/tools/wta/locales/ko-KR.yml @@ -102,8 +102,8 @@ agent.custom.auth_hint: "%{name}이(가) 설치되어 있고 PATH에 있는지 # ── 에이전트 보기 (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "로드 중..." -# {Locked="Enter","Esc","↑","↓"} - 키 조합, 번역하지 마세요 -agents.footer_hint: "(↑ ↓ 탐색 • Enter 세션 시작 • Esc 종료)" +# {Locked="Enter","Esc","F5","↑","↓"} - 키 조합, 번역하지 마세요 +agents.footer_hint: "(↑ ↓ 탐색 • Enter 세션 시작 • Esc 종료 • F5 새로 고침)" agents.status.active: "활성" agents.status.waiting_for_input: "입력 대기 중" agents.status.error: "오류" diff --git a/tools/wta/locales/kok-IN.yml b/tools/wta/locales/kok-IN.yml index 06339d83c..c5edfc141 100644 --- a/tools/wta/locales/kok-IN.yml +++ b/tools/wta/locales/kok-IN.yml @@ -117,8 +117,8 @@ agent.custom.auth_hint: "%{name} इन्स्टॉल आसा आनी # ── एजेंट दृश्य (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "लोड जाता..." -# {Locked="Enter","Esc","↑","↓"} - की संयोजन, अणकार करूं नाका -agents.footer_hint: "(↑ ↓ नेव्हिगेट करात • Enter सत्र सुरू करात • Esc भायर वचात)" +# {Locked="Enter","Esc","F5","↑","↓"} - की संयोजन, अणकार करूं नाका +agents.footer_hint: "(↑ ↓ नेव्हिगेट करात • Enter सत्र सुरू करात • Esc भायर वचात • F5 रिफ्रेश करात)" agents.status.active: "सक्रिय" agents.status.waiting_for_input: "इनपुटाची वाट" agents.status.error: "चूक" diff --git a/tools/wta/locales/lb-LU.yml b/tools/wta/locales/lb-LU.yml index bd9583259..6ec6992c3 100644 --- a/tools/wta/locales/lb-LU.yml +++ b/tools/wta/locales/lb-LU.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "Suergt dofir datt %{name} installéiert ass an op Ärem # ── Agenten-Vue (src/ui/agents_view.rs) ───────────────────────────────── agents.loading: "Gëtt gelueden..." -# {Locked="Enter","Esc","↑","↓"} - Tast-Kombinatiounen, net iwwersetzen -agents.footer_hint: "(↑ ↓ fir ze navigéieren • Enter fir d'Sëtzung ze starten • Esc fir eraus)" +# {Locked="Enter","Esc","F5","↑","↓"} - Tast-Kombinatiounen, net iwwersetzen +agents.footer_hint: "(↑ ↓ fir ze navigéieren • Enter fir d'Sëtzung ze starten • Esc fir eraus • F5 fir ze aktualiséieren)" agents.status.active: "Aktiv" agents.status.waiting_for_input: "Waart op Input" agents.status.error: "Feeler" diff --git a/tools/wta/locales/lo-LA.yml b/tools/wta/locales/lo-LA.yml index 324ebe61e..a8b95ca88 100644 --- a/tools/wta/locales/lo-LA.yml +++ b/tools/wta/locales/lo-LA.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "Make sure %{name} is installed and on your PATH." # {L # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Loading..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ to navigate • Enter to launch session • Esc to exit)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ to navigate • Enter to launch session • Esc to exit • F5 to refresh)" agents.status.active: "Active" agents.status.waiting_for_input: "Waiting for input" agents.status.error: "Error" diff --git a/tools/wta/locales/lt-LT.yml b/tools/wta/locales/lt-LT.yml index ee2d5ae63..47aa91c34 100644 --- a/tools/wta/locales/lt-LT.yml +++ b/tools/wta/locales/lt-LT.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "Įsitikinkite, kad %{name} yra įdiegtas ir yra jūsų # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Įkeliama..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ naršyti • Enter pradėti seansą • Esc išeiti)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ naršyti • Enter pradėti seansą • Esc išeiti • F5 atnaujinti)" agents.status.active: "Aktyvus" agents.status.waiting_for_input: "Laukia įvesties" agents.status.error: "Klaida" diff --git a/tools/wta/locales/lv-LV.yml b/tools/wta/locales/lv-LV.yml index 705f75895..0a87a5e1d 100644 --- a/tools/wta/locales/lv-LV.yml +++ b/tools/wta/locales/lv-LV.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "Pārliecinieties, ka %{name} ir instalēts un atrodas j # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Ielādē..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ lai pārvietotos • Enter lai sāktu sesiju • Esc lai izietu)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ lai pārvietotos • Enter lai sāktu sesiju • Esc lai izietu • F5 atsvaidzināt)" agents.status.active: "Aktīvs" agents.status.waiting_for_input: "Gaida ievadi" agents.status.error: "Kļūda" diff --git a/tools/wta/locales/mi-NZ.yml b/tools/wta/locales/mi-NZ.yml index 264477cbd..b25f11a96 100644 --- a/tools/wta/locales/mi-NZ.yml +++ b/tools/wta/locales/mi-NZ.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "Kia mohio kua tautahia a %{name} a kei runga i to PATH. # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "E uta ana..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ ki te whakatere • Enter ki te whakarewa wahanga • Esc ki te puta)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ ki te whakatere • Enter ki te whakarewa wahanga • Esc ki te puta • F5 ki te tāmata)" agents.status.active: "Hohe" agents.status.waiting_for_input: "E tatari ana mo te tauuru" agents.status.error: "Hapa" diff --git a/tools/wta/locales/mk-MK.yml b/tools/wta/locales/mk-MK.yml index d2fa68053..03f621087 100644 --- a/tools/wta/locales/mk-MK.yml +++ b/tools/wta/locales/mk-MK.yml @@ -113,8 +113,8 @@ agent.custom.auth_hint: "Осигурајте се дека %{name} е инст # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Се вчитува..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ за навигација • Enter за стартување сесија • Esc за излез)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ за навигација • Enter за стартување сесија • Esc за излез • F5 за освежување)" agents.status.active: "Активен" agents.status.waiting_for_input: "Чека внес" agents.status.error: "Грешка" diff --git a/tools/wta/locales/ml-IN.yml b/tools/wta/locales/ml-IN.yml index 9cc391be0..bcaa3e4fb 100644 --- a/tools/wta/locales/ml-IN.yml +++ b/tools/wta/locales/ml-IN.yml @@ -117,8 +117,8 @@ agent.custom.auth_hint: "%{name} ഇന്‍സ്റ്റാള്‍ ചെ # ── ഏജന്റുകളുടെ വ്യൂ (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "ലോഡ് ചെയ്യുന്നു..." -# {Locked="Enter","Esc","↑","↓"} - കീ കോമ്പിനേഷനുകള്‍, വിവര്‍ത്തനം ചെയ്യരുത് -agents.footer_hint: "(↑ ↓ നാവിഗേറ്റ് ചെയ്യുക • Enter സെഷന്‍ ആരംഭിക്കുക • Esc പുറത്തുകടക്കുക)" +# {Locked="Enter","Esc","F5","↑","↓"} - കീ കോമ്പിനേഷനുകള്‍, വിവര്‍ത്തനം ചെയ്യരുത് +agents.footer_hint: "(↑ ↓ നാവിഗേറ്റ് ചെയ്യുക • Enter സെഷന്‍ ആരംഭിക്കുക • Esc പുറത്തുകടക്കുക • F5 പുതുക്കുക)" agents.status.active: "സജീവം" agents.status.waiting_for_input: "ഇന്‍പുട്ടിനായി കാത്തിരിക്കുന്നു" agents.status.error: "പിശക്" diff --git a/tools/wta/locales/mr-IN.yml b/tools/wta/locales/mr-IN.yml index add845d91..18948885e 100644 --- a/tools/wta/locales/mr-IN.yml +++ b/tools/wta/locales/mr-IN.yml @@ -117,8 +117,8 @@ agent.custom.auth_hint: "%{name} इंस्टॉल आहे आणि त # ── एजंट दृश्य (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "लोड होत आहे..." -# {Locked="Enter","Esc","↑","↓"} - की संयोजन, भाषांतर करू नका -agents.footer_hint: "(↑ ↓ नेव्हिगेट करा • Enter सत्र सुरू करा • Esc बाहेर पडा)" +# {Locked="Enter","Esc","F5","↑","↓"} - की संयोजन, भाषांतर करू नका +agents.footer_hint: "(↑ ↓ नेव्हिगेट करा • Enter सत्र सुरू करा • Esc बाहेर पडा • F5 रीफ्रेश करा)" agents.status.active: "सक्रिय" agents.status.waiting_for_input: "इनपुटची प्रतीक्षा" agents.status.error: "त्रुटी" diff --git a/tools/wta/locales/ms-MY.yml b/tools/wta/locales/ms-MY.yml index 6800433e1..9a2a85c9d 100644 --- a/tools/wta/locales/ms-MY.yml +++ b/tools/wta/locales/ms-MY.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "Pastikan %{name} dipasang dan berada dalam PATH anda." # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Memuatkan..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ untuk navigasi • Enter untuk membuka sesi • Esc untuk keluar)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ untuk navigasi • Enter untuk membuka sesi • Esc untuk keluar • F5 untuk segarkan)" agents.status.active: "Aktif" agents.status.waiting_for_input: "Menunggu input" agents.status.error: "Ralat" diff --git a/tools/wta/locales/mt-MT.yml b/tools/wta/locales/mt-MT.yml index 42a96a8d3..452ce3b72 100644 --- a/tools/wta/locales/mt-MT.yml +++ b/tools/wta/locales/mt-MT.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "Kun żgur li %{name} huwa installat u fuq il-PATH tieg # ── Vista tal-aġenti (src/ui/agents_view.rs) ───────────────────────────────── agents.loading: "Qed jitgħabba..." -# {Locked="Enter","Esc","↑","↓"} - kombinazzjonijiet taċ-ċwievet, tittradux -agents.footer_hint: "(↑ ↓ biex tinnaviga • Enter biex tniedi sessjoni • Esc biex toħroġ)" +# {Locked="Enter","Esc","F5","↑","↓"} - kombinazzjonijiet taċ-ċwievet, tittradux +agents.footer_hint: "(↑ ↓ biex tinnaviga • Enter biex tniedi sessjoni • Esc biex toħroġ • F5 biex taġġorna)" agents.status.active: "Attiv" agents.status.waiting_for_input: "Qed jistenna input" agents.status.error: "Żball" diff --git a/tools/wta/locales/nb-NO.yml b/tools/wta/locales/nb-NO.yml index 20b78f646..40a1db7cb 100644 --- a/tools/wta/locales/nb-NO.yml +++ b/tools/wta/locales/nb-NO.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "Kontroller at %{name} er installert og på din PATH." # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Laster..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ for å navigere • Enter for å starte økt • Esc for å avslutte)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ for å navigere • Enter for å starte økt • Esc for å avslutte • F5 for å oppdatere)" agents.status.active: "Aktiv" agents.status.waiting_for_input: "Venter på inndata" agents.status.error: "Feil" diff --git a/tools/wta/locales/ne-NP.yml b/tools/wta/locales/ne-NP.yml index 49de66092..84dd043b5 100644 --- a/tools/wta/locales/ne-NP.yml +++ b/tools/wta/locales/ne-NP.yml @@ -117,8 +117,8 @@ agent.custom.auth_hint: "%{name} स्थापित छ र तपाईँ # ── एजेन्ट दृश्य (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "लोड हुँदैछ..." -# {Locked="Enter","Esc","↑","↓"} - कुञ्जी संयोजनहरू, अनुवाद नगर्नुहोस् -agents.footer_hint: "(↑ ↓ नेभिगेट गर्नुहोस् • Enter सत्र सुरु गर्नुहोस् • Esc बाहिर निस्कनुहोस्)" +# {Locked="Enter","Esc","F5","↑","↓"} - कुञ्जी संयोजनहरू, अनुवाद नगर्नुहोस् +agents.footer_hint: "(↑ ↓ नेभिगेट गर्नुहोस् • Enter सत्र सुरु गर्नुहोस् • Esc बाहिर निस्कनुहोस् • F5 रिफ्रेस गर्नुहोस्)" agents.status.active: "सक्रिय" agents.status.waiting_for_input: "इनपुटको प्रतीक्षा" agents.status.error: "त्रुटि" diff --git a/tools/wta/locales/nl-NL.yml b/tools/wta/locales/nl-NL.yml index f9197da64..52e2351c9 100644 --- a/tools/wta/locales/nl-NL.yml +++ b/tools/wta/locales/nl-NL.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "Zorg dat %{name} is geïnstalleerd en in het PATH staat # ── Agentweergave (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Laden..." -# {Locked="Enter","Esc","↑","↓"} - toetscombinaties, niet vertalen -agents.footer_hint: "(↑ ↓ navigeren • Enter sessie starten • Esc afsluiten)" +# {Locked="Enter","Esc","F5","↑","↓"} - toetscombinaties, niet vertalen +agents.footer_hint: "(↑ ↓ navigeren • Enter sessie starten • Esc afsluiten • F5 vernieuwen)" agents.status.active: "Actief" agents.status.waiting_for_input: "Wachten op invoer" agents.status.error: "Fout" diff --git a/tools/wta/locales/nn-NO.yml b/tools/wta/locales/nn-NO.yml index 77964b327..a48282225 100644 --- a/tools/wta/locales/nn-NO.yml +++ b/tools/wta/locales/nn-NO.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "Kontroller at %{name} er installert og på din PATH." # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Lastar..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ for å navigere • Enter for å starte økt • Esc for å avslutte)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ for å navigere • Enter for å starte økt • Esc for å avslutte • F5 for å oppdatere)" agents.status.active: "Aktiv" agents.status.waiting_for_input: "Ventar på inndata" agents.status.error: "Feil" diff --git a/tools/wta/locales/or-IN.yml b/tools/wta/locales/or-IN.yml index 9650c553b..324068f22 100644 --- a/tools/wta/locales/or-IN.yml +++ b/tools/wta/locales/or-IN.yml @@ -117,8 +117,8 @@ agent.custom.auth_hint: "%{name} ଇନ୍‌ଷ୍ଟଲ୍ ଅଛି ଏବଂ # ── ଏଜେଣ୍ଟ ଦୃଶ୍ୟ (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "ଲୋଡ୍ ହେଉଛି..." -# {Locked="Enter","Esc","↑","↓"} - କୀ ସଂଯୋଜନ, ଅନୁବାଦ କରନ୍ତୁ ନାହିଁ -agents.footer_hint: "(↑ ↓ ନେଭିଗେଟ୍ କରନ୍ତୁ • Enter ସେସନ୍ ଆରମ୍ଭ କରନ୍ତୁ • Esc ବାହାରନ୍ତୁ)" +# {Locked="Enter","Esc","F5","↑","↓"} - କୀ ସଂଯୋଜନ, ଅନୁବାଦ କରନ୍ତୁ ନାହିଁ +agents.footer_hint: "(↑ ↓ ନେଭିଗେଟ୍ କରନ୍ତୁ • Enter ସେସନ୍ ଆରମ୍ଭ କରନ୍ତୁ • Esc ବାହାରନ୍ତୁ • F5 ସତେଜ କରନ୍ତୁ)" agents.status.active: "ସକ୍ରିୟ" agents.status.waiting_for_input: "ଇନ୍‌ପୁଟ୍ ପାଇଁ ଅପେକ୍ଷା" agents.status.error: "ତ୍ରୁଟି" diff --git a/tools/wta/locales/pa-IN.yml b/tools/wta/locales/pa-IN.yml index 3f538da99..010f1a28e 100644 --- a/tools/wta/locales/pa-IN.yml +++ b/tools/wta/locales/pa-IN.yml @@ -117,8 +117,8 @@ agent.custom.auth_hint: "ਯਕੀਨੀ ਬਣਾਓ ਕਿ %{name} ਇੰਸ # ── ਏਜੰਟ ਦ੍ਰਿਸ਼ (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "ਲੋਡ ਹੋ ਰਿਹਾ ਹੈ..." -# {Locked="Enter","Esc","↑","↓"} - ਕੀ ਸੰਯੋਜਨ, ਅਨੁਵਾਦ ਨਾ ਕਰੋ -agents.footer_hint: "(↑ ↓ ਨੈਵੀਗੇਟ ਕਰੋ • Enter ਸੈਸ਼ਨ ਸ਼ੁਰੂ ਕਰੋ • Esc ਬਾਹਰ ਨਿਕਲੋ)" +# {Locked="Enter","Esc","F5","↑","↓"} - ਕੀ ਸੰਯੋਜਨ, ਅਨੁਵਾਦ ਨਾ ਕਰੋ +agents.footer_hint: "(↑ ↓ ਨੈਵੀਗੇਟ ਕਰੋ • Enter ਸੈਸ਼ਨ ਸ਼ੁਰੂ ਕਰੋ • Esc ਬਾਹਰ ਨਿਕਲੋ • F5 ਤਾਜ਼ਾ ਕਰੋ)" agents.status.active: "ਸਰਗਰਮ" agents.status.waiting_for_input: "ਇਨਪੁਟ ਦੀ ਉਡੀਕ" agents.status.error: "ਗਲਤੀ" diff --git a/tools/wta/locales/pl-PL.yml b/tools/wta/locales/pl-PL.yml index a848c6426..477189f7f 100644 --- a/tools/wta/locales/pl-PL.yml +++ b/tools/wta/locales/pl-PL.yml @@ -113,8 +113,8 @@ agent.custom.auth_hint: "Upewnij się, że %{name} jest zainstalowany i znajduje # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Ładowanie..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ do nawigacji • Enter aby uruchomić sesję • Esc aby wyjść)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ do nawigacji • Enter aby uruchomić sesję • Esc aby wyjść • F5 aby odświeżyć)" agents.status.active: "Aktywny" agents.status.waiting_for_input: "Oczekiwanie na dane" agents.status.error: "Błąd" diff --git a/tools/wta/locales/pt-BR.yml b/tools/wta/locales/pt-BR.yml index fa4517952..aec1eddee 100644 --- a/tools/wta/locales/pt-BR.yml +++ b/tools/wta/locales/pt-BR.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "Certifique-se de que %{name} esteja instalado e no PATH # ── Visualização de agentes (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Carregando..." -# {Locked="Enter","Esc","↑","↓"} - combinações de teclas, não traduzir -agents.footer_hint: "(↑ ↓ para navegar • Enter para iniciar sessão • Esc para sair)" +# {Locked="Enter","Esc","F5","↑","↓"} - combinações de teclas, não traduzir +agents.footer_hint: "(↑ ↓ para navegar • Enter para iniciar sessão • Esc para sair • F5 para atualizar)" agents.status.active: "Ativo" agents.status.waiting_for_input: "Aguardando entrada" agents.status.error: "Erro" diff --git a/tools/wta/locales/pt-PT.yml b/tools/wta/locales/pt-PT.yml index 1923f7758..e6ac2558c 100644 --- a/tools/wta/locales/pt-PT.yml +++ b/tools/wta/locales/pt-PT.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "Certifique-se de que %{name} está instalado e no PATH. # ── Vista de agentes (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "A carregar..." -# {Locked="Enter","Esc","↑","↓"} - combinações de teclas, não traduzir -agents.footer_hint: "(↑ ↓ para navegar • Enter para iniciar sessão • Esc para sair)" +# {Locked="Enter","Esc","F5","↑","↓"} - combinações de teclas, não traduzir +agents.footer_hint: "(↑ ↓ para navegar • Enter para iniciar sessão • Esc para sair • F5 para atualizar)" agents.status.active: "Ativo" agents.status.waiting_for_input: "A aguardar entrada" agents.status.error: "Erro" diff --git a/tools/wta/locales/qps-ploc.yml b/tools/wta/locales/qps-ploc.yml index 79dfecf6d..04f72958e 100644 --- a/tools/wta/locales/qps-ploc.yml +++ b/tools/wta/locales/qps-ploc.yml @@ -109,7 +109,7 @@ agent.custom.auth_hint: "[Ḿåķé śûŕé %{name} ïś ïñśţåĺĺéď å # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "[Ĺöåďïñğ...!!]" # {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "[(↑ ↓ ţö ñåṽïğåţé • Enter ţö ĺåûñçĥ śéśśïöñ • Esc ţö éxïţ)!!!! !!!! !!!! !!!!]" +agents.footer_hint: "[(↑ ↓ ţö ñåṽïğåţé • Enter ţö ĺåûñçĥ śéśśïöñ • Esc ţö éxïţ • F5 ţö ŕéƒŕéśĥ)!!!! !!!! !!!! !!!! !!!!]" agents.status.active: "[Àçţïṽé!!]" agents.status.waiting_for_input: "[Ŵåïţïñğ ƒöŕ ïñṗûţ!!!! !!!!]" agents.status.error: "[Éŕŕöŕ!!]" diff --git a/tools/wta/locales/qps-ploca.yml b/tools/wta/locales/qps-ploca.yml index 548572cf2..66a0ae21f 100644 --- a/tools/wta/locales/qps-ploca.yml +++ b/tools/wta/locales/qps-ploca.yml @@ -107,7 +107,7 @@ agent.custom.auth_hint: "[!!_Make sure %{name} is installed and on your PATH._!! # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "[!!_Loading..._!!]" # {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "[!!_(↑ ↓ to navigate • Enter to launch session • Esc to exit)_!!]" +agents.footer_hint: "[!!_(↑ ↓ to navigate • Enter to launch session • Esc to exit • F5 to refresh)_!!]" agents.status.active: "[!!_Active_!!]" agents.status.waiting_for_input: "[!!_Waiting for input_!!]" agents.status.error: "[!!_Error_!!]" diff --git a/tools/wta/locales/qps-plocm.yml b/tools/wta/locales/qps-plocm.yml index 24421c405..5a0773dc3 100644 --- a/tools/wta/locales/qps-plocm.yml +++ b/tools/wta/locales/qps-plocm.yml @@ -107,7 +107,7 @@ agent.custom.auth_hint: "[!! Mak_e sure %{name} is installed and on your PATH. ! # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "[!! Loa_ding... !!]" # {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "[!! (↑_ ↓ to navigate • Enter to launch session • Esc to exit) !!]" +agents.footer_hint: "[!! (↑_ ↓ to navigate • Enter to launch session • Esc to exit • F5 to refresh) !!]" agents.status.active: "[!! Act_ive !!]" agents.status.waiting_for_input: "[!! Wai_ting for input !!]" agents.status.error: "[!! Err_or !!]" diff --git a/tools/wta/locales/quz-PE.yml b/tools/wta/locales/quz-PE.yml index 757899d46..7eeae8519 100644 --- a/tools/wta/locales/quz-PE.yml +++ b/tools/wta/locales/quz-PE.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "%{name} churasqa kasqanta PATH nisqapiña kasqanta qhaw # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Chaqachkan..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ purinapaq • Enter hunt'ata qallarichiy • Esc lluqsinapaq)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ purinapaq • Enter hunt'ata qallarichiy • Esc lluqsinapaq • F5 musuqchanapaq)" agents.status.active: "Llamk'achkan" agents.status.waiting_for_input: "Yaykuyta suyachkan" agents.status.error: "Pantay" diff --git a/tools/wta/locales/ro-RO.yml b/tools/wta/locales/ro-RO.yml index bcabbe22e..578b19ac3 100644 --- a/tools/wta/locales/ro-RO.yml +++ b/tools/wta/locales/ro-RO.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "Asigurați-vă că %{name} este instalat și în PATH." # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Se încarcă..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ pentru navigare • Enter pentru a lansa sesiunea • Esc pentru a ieși)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ pentru navigare • Enter pentru a lansa sesiunea • Esc pentru a ieși • F5 pentru a reîmprospăta)" agents.status.active: "Activ" agents.status.waiting_for_input: "Așteaptă introducere" agents.status.error: "Eroare" diff --git a/tools/wta/locales/ru-RU.yml b/tools/wta/locales/ru-RU.yml index 05ae4dc8d..0b3d3a849 100644 --- a/tools/wta/locales/ru-RU.yml +++ b/tools/wta/locales/ru-RU.yml @@ -113,8 +113,8 @@ agent.custom.auth_hint: "Убедитесь, что %{name} установлен # ── Представление агентов (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Загрузка..." -# {Locked="Enter","Esc","↑","↓"} - комбинации клавиш, не переводить -agents.footer_hint: "(↑ ↓ навигация • Enter запустить сеанс • Esc выход)" +# {Locked="Enter","Esc","F5","↑","↓"} - комбинации клавиш, не переводить +agents.footer_hint: "(↑ ↓ навигация • Enter запустить сеанс • Esc выход • F5 обновить)" agents.status.active: "Активен" agents.status.waiting_for_input: "Ожидание ввода" agents.status.error: "Ошибка" diff --git a/tools/wta/locales/sk-SK.yml b/tools/wta/locales/sk-SK.yml index 617b196da..a391d6c5a 100644 --- a/tools/wta/locales/sk-SK.yml +++ b/tools/wta/locales/sk-SK.yml @@ -113,8 +113,8 @@ agent.custom.auth_hint: "Uistite sa, že %{name} je nainštalovaný a je v PATH. # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Načítava sa..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ na navigáciu • Enter na spustenie relácie • Esc na ukončenie)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ na navigáciu • Enter na spustenie relácie • Esc na ukončenie • F5 na obnovenie)" agents.status.active: "Aktívny" agents.status.waiting_for_input: "Čaká na vstup" agents.status.error: "Chyba" diff --git a/tools/wta/locales/sl-SI.yml b/tools/wta/locales/sl-SI.yml index 668db5bba..e53c62973 100644 --- a/tools/wta/locales/sl-SI.yml +++ b/tools/wta/locales/sl-SI.yml @@ -113,8 +113,8 @@ agent.custom.auth_hint: "Prepričajte se, da je %{name} nameščen in v PATH." # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Nalaganje..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ za krmarjenje • Enter za zagon seje • Esc za izhod)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ za krmarjenje • Enter za zagon seje • Esc za izhod • F5 za osvežitev)" agents.status.active: "Aktivno" agents.status.waiting_for_input: "Čaka na vnos" agents.status.error: "Napaka" diff --git a/tools/wta/locales/sq-AL.yml b/tools/wta/locales/sq-AL.yml index 6056a9aa9..137a605c9 100644 --- a/tools/wta/locales/sq-AL.yml +++ b/tools/wta/locales/sq-AL.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "Sigurohuni që %{name} është i instaluar dhe në PATH # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Po ngarkohet..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ për të naviguar • Enter për të nisur seancën • Esc për të dalë)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ për të naviguar • Enter për të nisur seancën • Esc për të dalë • F5 për të rifreskuar)" agents.status.active: "Aktiv" agents.status.waiting_for_input: "Po pret hyrjen" agents.status.error: "Gabim" diff --git a/tools/wta/locales/sr-Cyrl-BA.yml b/tools/wta/locales/sr-Cyrl-BA.yml index 6bfe4873c..9e4ea3bfb 100644 --- a/tools/wta/locales/sr-Cyrl-BA.yml +++ b/tools/wta/locales/sr-Cyrl-BA.yml @@ -113,8 +113,8 @@ agent.custom.auth_hint: "Провјерите да је %{name} инсталир # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Учитавање..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ за навигацију • Enter за отварање сесије • Esc за излаз)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ за навигацију • Enter за отварање сесије • Esc за излаз • F5 за освежавање)" agents.status.active: "Активан" agents.status.waiting_for_input: "Чека на унос" agents.status.error: "Грешка" diff --git a/tools/wta/locales/sr-Cyrl-RS.yml b/tools/wta/locales/sr-Cyrl-RS.yml index fc9ceea59..1fac92425 100644 --- a/tools/wta/locales/sr-Cyrl-RS.yml +++ b/tools/wta/locales/sr-Cyrl-RS.yml @@ -113,8 +113,8 @@ agent.custom.auth_hint: "Проверите да је %{name} инсталира # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Учитавање..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ за навигацију • Enter за отварање сесије • Esc за излаз)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ за навигацију • Enter за отварање сесије • Esc за излаз • F5 за освежавање)" agents.status.active: "Активан" agents.status.waiting_for_input: "Чека на унос" agents.status.error: "Грешка" diff --git a/tools/wta/locales/sr-Latn-RS.yml b/tools/wta/locales/sr-Latn-RS.yml index e0649d224..cea17df72 100644 --- a/tools/wta/locales/sr-Latn-RS.yml +++ b/tools/wta/locales/sr-Latn-RS.yml @@ -113,8 +113,8 @@ agent.custom.auth_hint: "Proverite da je %{name} instaliran i da se nalazi u PAT # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Učitavanje..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ za navigaciju • Enter za otvaranje sesije • Esc za izlaz)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ za navigaciju • Enter za otvaranje sesije • Esc za izlaz • F5 za osvežavanje)" agents.status.active: "Aktivan" agents.status.waiting_for_input: "Čeka na unos" agents.status.error: "Greška" diff --git a/tools/wta/locales/sv-SE.yml b/tools/wta/locales/sv-SE.yml index f9f072e65..ca5a13b18 100644 --- a/tools/wta/locales/sv-SE.yml +++ b/tools/wta/locales/sv-SE.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "Se till att %{name} är installerat och finns i din PAT # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Laddar..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ för att navigera • Enter för att starta session • Esc för att avsluta)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ för att navigera • Enter för att starta session • Esc för att avsluta • F5 för att uppdatera)" agents.status.active: "Aktiv" agents.status.waiting_for_input: "Väntar på inmatning" agents.status.error: "Fel" diff --git a/tools/wta/locales/ta-IN.yml b/tools/wta/locales/ta-IN.yml index 57a5f64f0..00869abed 100644 --- a/tools/wta/locales/ta-IN.yml +++ b/tools/wta/locales/ta-IN.yml @@ -117,8 +117,8 @@ agent.custom.auth_hint: "%{name} நிறுவப்பட்டுள்ள # ── ஏஜெண்ட்கள் காட்சி (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "ஏற்றப்படுகிறது..." -# {Locked="Enter","Esc","↑","↓"} - விசைச் சேர்க்கைகள், மொழிபெயர்க்க வேண்டாம் -agents.footer_hint: "(↑ ↓ வழிசெலுத்து • Enter அமர்வைத் தொடங்கு • Esc வெளியேறு)" +# {Locked="Enter","Esc","F5","↑","↓"} - விசைச் சேர்க்கைகள், மொழிபெயர்க்க வேண்டாம் +agents.footer_hint: "(↑ ↓ வழிசெலுத்து • Enter அமர்வைத் தொடங்கு • Esc வெளியேறு • F5 புதுப்பிக்க)" agents.status.active: "செயலில்" agents.status.waiting_for_input: "உள்ளீட்டுக்காகக் காத்திருக்கிறது" agents.status.error: "பிழை" diff --git a/tools/wta/locales/te-IN.yml b/tools/wta/locales/te-IN.yml index 07a39e021..0770636f1 100644 --- a/tools/wta/locales/te-IN.yml +++ b/tools/wta/locales/te-IN.yml @@ -117,8 +117,8 @@ agent.custom.auth_hint: "%{name} ఇన్‌స్టాల్ చేయబడ # ── ఏజెంట్‌ల వ్యూ (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "లోడ్ అవుతోంది..." -# {Locked="Enter","Esc","↑","↓"} - కీ కాంబినేషన్‌లు, అనువదించవద్దు -agents.footer_hint: "(↑ ↓ నావిగేట్ చేయండి • Enter సెషన్ ప్రారంభించండి • Esc నిష్క్రమించండి)" +# {Locked="Enter","Esc","F5","↑","↓"} - కీ కాంబినేషన్‌లు, అనువదించవద్దు +agents.footer_hint: "(↑ ↓ నావిగేట్ చేయండి • Enter సెషన్ ప్రారంభించండి • Esc నిష్క్రమించండి • F5 రిఫ్రెష్ చేయండి)" agents.status.active: "సక్రియం" agents.status.waiting_for_input: "ఇన్‌పుట్ కోసం వేచి ఉంది" agents.status.error: "ఎర్రర్" diff --git a/tools/wta/locales/th-TH.yml b/tools/wta/locales/th-TH.yml index 54738214a..840b2a9a3 100644 --- a/tools/wta/locales/th-TH.yml +++ b/tools/wta/locales/th-TH.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "ตรวจสอบว่า %{name} ถูกติ # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "กำลังโหลด..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ เลื่อนเลือก • Enter เพื่อเปิดเซสชัน • Esc เพื่อออก)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ เลื่อนเลือก • Enter เพื่อเปิดเซสชัน • Esc เพื่อออก • F5 เพื่อรีเฟรช)" agents.status.active: "ใช้งานอยู่" agents.status.waiting_for_input: "รอข้อมูลป้อนเข้า" agents.status.error: "ข้อผิดพลาด" diff --git a/tools/wta/locales/tr-TR.yml b/tools/wta/locales/tr-TR.yml index e87bb0ac9..e0d990c87 100644 --- a/tools/wta/locales/tr-TR.yml +++ b/tools/wta/locales/tr-TR.yml @@ -117,8 +117,8 @@ agent.custom.auth_hint: "%{name} yüklü olduğundan ve PATH'te bulunduğundan e # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Yükleniyor..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ gezinmek için • Enter oturum açmak için • Esc çıkmak için)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ gezinmek için • Enter oturum açmak için • Esc çıkmak için • F5 yenilemek için)" agents.status.active: "Aktif" agents.status.waiting_for_input: "Giriş bekleniyor" agents.status.error: "Hata" diff --git a/tools/wta/locales/tt-RU.yml b/tools/wta/locales/tt-RU.yml index 8fe05cd02..abfdfe502 100644 --- a/tools/wta/locales/tt-RU.yml +++ b/tools/wta/locales/tt-RU.yml @@ -117,8 +117,8 @@ agent.custom.auth_hint: "%{name} урнатылуына һәм PATH-та бул # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Йөкләнә..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ навигация өчен • Enter сеансны ачу өчен • Esc чыгу өчен)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ навигация өчен • Enter сеансны ачу өчен • Esc чыгу өчен • F5 яңарту өчен)" agents.status.active: "Актив" agents.status.waiting_for_input: "Кертү көтелә" agents.status.error: "Хата" diff --git a/tools/wta/locales/ug-CN.yml b/tools/wta/locales/ug-CN.yml index 494f07df1..d4f62e181 100644 --- a/tools/wta/locales/ug-CN.yml +++ b/tools/wta/locales/ug-CN.yml @@ -122,8 +122,8 @@ agent.custom.auth_hint: "%{name} نىڭ ئورنىتىلغانلىقى ۋە PATH # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────────────────────────────────── agents.loading: "يۈكلەنۋاتىدۇ..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ يۆتكەش • Enter ئوتتۇرا ئېچىش • Esc چىقىش)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ يۆتكەش • Enter ئوتتۇرا ئېچىش • Esc چىقىش • F5 يېڭىلاش)" agents.status.active: "ئاكتىۋ" agents.status.waiting_for_input: "كىرگۈزۈش كۈتۈلۈۋاتىدۇ" # Status badge when agent session encountered an error diff --git a/tools/wta/locales/uk-UA.yml b/tools/wta/locales/uk-UA.yml index 4c10c3dcb..6e9506969 100644 --- a/tools/wta/locales/uk-UA.yml +++ b/tools/wta/locales/uk-UA.yml @@ -113,8 +113,8 @@ agent.custom.auth_hint: "Переконайтеся, що %{name} встанов # ── Перегляд агентів (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Завантаження..." -# {Locked="Enter","Esc","↑","↓"} - комбінації клавіш, не перекладати -agents.footer_hint: "(↑ ↓ навігація • Enter запустити сеанс • Esc вихід)" +# {Locked="Enter","Esc","F5","↑","↓"} - комбінації клавіш, не перекладати +agents.footer_hint: "(↑ ↓ навігація • Enter запустити сеанс • Esc вихід • F5 оновити)" agents.status.active: "Активний" agents.status.waiting_for_input: "Очікування введення" agents.status.error: "Помилка" diff --git a/tools/wta/locales/ur-PK.yml b/tools/wta/locales/ur-PK.yml index 18c5dec5c..755ad27a9 100644 --- a/tools/wta/locales/ur-PK.yml +++ b/tools/wta/locales/ur-PK.yml @@ -117,8 +117,8 @@ agent.custom.auth_hint: "یقینی بنائیں کہ %{name} انسٹال ہے # ── ایجنٹ منظر (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "لوڈ ہو رہا ہے..." -# {Locked="Enter","Esc","↑","↓"} - کلید کے مجموعے، ترجمہ نہ کریں -agents.footer_hint: "(↑ ↓ نیویگیشن • Enter سیشن شروع کریں • Esc باہر نکلیں)" +# {Locked="Enter","Esc","F5","↑","↓"} - کلید کے مجموعے، ترجمہ نہ کریں +agents.footer_hint: "(↑ ↓ نیویگیشن • Enter سیشن شروع کریں • Esc باہر نکلیں • F5 ریفریش کریں)" agents.status.active: "فعال" agents.status.waiting_for_input: "ان پٹ کا انتظار" agents.status.error: "خرابی" diff --git a/tools/wta/locales/uz-Latn-UZ.yml b/tools/wta/locales/uz-Latn-UZ.yml index 185e6a32c..2e3b170db 100644 --- a/tools/wta/locales/uz-Latn-UZ.yml +++ b/tools/wta/locales/uz-Latn-UZ.yml @@ -117,8 +117,8 @@ agent.custom.auth_hint: "%{name} oʻrnatilganligiga va PATH-da ekanligiga ishonc # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Yuklanmoqda..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ navigatsiya uchun • Enter seansni ochish uchun • Esc chiqish uchun)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ navigatsiya uchun • Enter seansni ochish uchun • Esc chiqish uchun • F5 yangilash uchun)" agents.status.active: "Faol" agents.status.waiting_for_input: "Kiritish kutilmoqda" agents.status.error: "Xatolik" diff --git a/tools/wta/locales/vi-VN.yml b/tools/wta/locales/vi-VN.yml index 65f5d5bc1..00ff94d1d 100644 --- a/tools/wta/locales/vi-VN.yml +++ b/tools/wta/locales/vi-VN.yml @@ -106,8 +106,8 @@ agent.custom.auth_hint: "Hãy đảm bảo %{name} đã được cài đặt và # ── Agents view (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "Đang tải..." -# {Locked="Enter","Esc","↑","↓"} - key combinations, do not translate -agents.footer_hint: "(↑ ↓ để di chuyển • Enter để mở phiên • Esc để thoát)" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "(↑ ↓ để di chuyển • Enter để mở phiên • Esc để thoát • F5 để làm mới)" agents.status.active: "Đang hoạt động" agents.status.waiting_for_input: "Đang chờ nhập liệu" agents.status.error: "Lỗi" diff --git a/tools/wta/locales/zh-CN.yml b/tools/wta/locales/zh-CN.yml index b54bce93e..4cd81f6e9 100644 --- a/tools/wta/locales/zh-CN.yml +++ b/tools/wta/locales/zh-CN.yml @@ -102,8 +102,8 @@ agent.custom.auth_hint: "请确保 %{name} 已安装并位于 PATH 上。" # {L # ── 智能体视图 (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "加载中..." -# {Locked="Enter","Esc","↑","↓"} - 组合键,不翻译 -agents.footer_hint: "(↑ ↓ 导航 • Enter 启动会话 • Esc 退出)" +# {Locked="Enter","Esc","F5","↑","↓"} - 组合键,不翻译 +agents.footer_hint: "(↑ ↓ 导航 • Enter 启动会话 • Esc 退出 • F5 刷新)" agents.status.active: "活动" agents.status.waiting_for_input: "等待输入" agents.status.error: "错误" diff --git a/tools/wta/locales/zh-TW.yml b/tools/wta/locales/zh-TW.yml index d50697da5..641eac92f 100644 --- a/tools/wta/locales/zh-TW.yml +++ b/tools/wta/locales/zh-TW.yml @@ -102,8 +102,8 @@ agent.custom.auth_hint: "請確認 %{name} 已安裝並位於 PATH 上。" # {L # ── 智能體檢視 (src/ui/agents_view.rs) ───────────────────────────────────── agents.loading: "載入中..." -# {Locked="Enter","Esc","↑","↓"} - 組合鍵,請勿翻譯 -agents.footer_hint: "(↑ ↓ 瀏覽 • Enter 啟動工作階段 • Esc 結束)" +# {Locked="Enter","Esc","F5","↑","↓"} - 組合鍵,請勿翻譯 +agents.footer_hint: "(↑ ↓ 瀏覽 • Enter 啟動工作階段 • Esc 結束 • F5 重新整理)" agents.status.active: "使用中" agents.status.waiting_for_input: "等待輸入" agents.status.error: "錯誤" diff --git a/tools/wta/src/app.rs b/tools/wta/src/app.rs index 9a07a9954..75ecb165c 100644 --- a/tools/wta/src/app.rs +++ b/tools/wta/src/app.rs @@ -2968,6 +2968,28 @@ impl App { } } + /// F5 in the F2 view: ask master to reconcile its registry against + /// WT's actual live pane set. Master broadcasts `session_removed` + /// for each dropped row (which our local reducer turns into Ended) + /// and a `sessions/changed` notification, which the existing + /// `AppEvent::SessionsChanged` handler converts into a UI refetch — + /// so we don't schedule the refetch here. + /// + /// Unlike [`schedule_agents_refetch_for_tab`], this is a no-op + /// guard rather than per-tab state: it runs regardless of whether + /// a specific tab's F2 snapshot is open (the broadcast is global) + /// and doesn't take the `refetch_in_flight` lock — multiple + /// near-simultaneous F5 presses just do extra enumerations, which + /// are idempotent. + fn schedule_reconcile_liveness(&mut self) { + let tab = self.current_tab_mut(); + tab.agents_view.next_request_id = tab.agents_view.next_request_id.wrapping_add(1); + let request_id = tab.agents_view.next_request_id; + let _ = self.master_request_tx.send( + crate::protocol::acp::client::MasterExtRequest::ReconcileLiveness { request_id }, + ); + } + fn restore_agents_selection(&mut self, tab_id: &str, old_selected: usize) { let rows = self.agents_rows_for_tab(tab_id); let tab = self.tab_mut(tab_id); @@ -5686,6 +5708,23 @@ impl App { } } } + KeyCode::F(5) => { + // F5 = on-demand pane-liveness reconcile against + // WT. Master compares its registry to the alive + // pane set we send, drops rows whose pane is gone + // (with a race guard so freshly-created sessions + // aren't killed), and broadcasts session_removed + // + sessions/changed. The sessions/changed handler + // schedules the UI refetch automatically, so we + // don't need to schedule one explicitly here. + // + // Why this exists: Gemini-class bugs where the + // agent CLI doesn't exit cleanly when its WT pane + // closes leave the F2 row stuck at Idle/Live + // because master's drop_sessions_for_helper never + // fires. F5 is the user-visible escape hatch. + self.schedule_reconcile_liveness(); + } KeyCode::Esc => { let tab_id = self.active_tab_key().to_string(); self.close_agents_view_for_tab(&tab_id); @@ -10029,6 +10068,52 @@ mod tests { ); } + #[test] + fn f5_in_agents_view_triggers_reconcile_liveness() { + // F5 must dispatch a ReconcileLiveness request to master. The + // helper-side dispatcher then enumerates panes and forwards + // the alive set to master via ext-method; master's broadcast + // of `sessions/changed` is what drives the eventual UI + // refetch — so we don't assert a SessionsList here. + use crossterm::event::{KeyCode, KeyEvent, KeyModifiers}; + let (mut app, mut master_rx) = test_app_with_master_rx(); + app.current_tab_mut().current_view = View::Agents; + app.current_tab_mut().agents_view.snapshot = Some(Vec::new()); + // Drain any request scheduled by prior bootstrap so the assertion + // below observes only what F5 produced. + while master_rx.try_recv().is_ok() {} + + app.handle_key(KeyEvent::new(KeyCode::F(5), KeyModifiers::NONE)); + + match master_rx.try_recv().expect("F5 schedules a reconcile") { + crate::protocol::acp::client::MasterExtRequest::ReconcileLiveness { .. } => {} + other => panic!("expected ReconcileLiveness, got {other:?}"), + } + // No second request — refetch is implicit via the eventual + // sessions/changed broadcast from master, not scheduled here. + assert!( + master_rx.try_recv().is_err(), + "F5 must not also schedule a SessionsList — refetch is driven by master's sessions/changed broadcast" + ); + } + + #[test] + fn f5_outside_agents_view_is_ignored() { + // F5 is scoped to the F2 picker — pressing it from the chat view + // must not generate any master traffic (no reconcile, no refetch). + use crossterm::event::{KeyCode, KeyEvent, KeyModifiers}; + let (mut app, mut master_rx) = test_app_with_master_rx(); + // Leave current_view = Chat (the default); snapshot stays None. + while master_rx.try_recv().is_ok() {} + + app.handle_key(KeyEvent::new(KeyCode::F(5), KeyModifiers::NONE)); + + assert!( + master_rx.try_recv().is_err(), + "F5 outside agents view must not produce master traffic" + ); + } + fn session_info_for_test(id: &str) -> crate::session_registry::SessionInfo { let mut info = crate::session_registry::SessionInfo::new( agent_client_protocol::SessionId::new(id), diff --git a/tools/wta/src/master/mod.rs b/tools/wta/src/master/mod.rs index 45d8ff630..6948eb143 100644 --- a/tools/wta/src/master/mod.rs +++ b/tools/wta/src/master/mod.rs @@ -1120,6 +1120,16 @@ impl acp::Agent for HelperHandler { ); return handle_sessions_list(&self.state, &args.params).await; } + if method == crate::session_registry::INTELLTERM_METHOD_RECONCILE_LIVENESS { + tracing::info!( + target: "master", + op = "ext_method", + method = %method, + helper_id = ?self.helper_id, + "handling intellterm.wta/reconcile_liveness locally" + ); + return handle_reconcile_liveness(&self.state, &args.params).await; + } if method == crate::session_registry::INTELLTERM_METHOD_SESSION_HOOK { tracing::info!( target: "master", @@ -1818,6 +1828,111 @@ async fn handle_sessions_list( Ok(acp::ExtResponse::new(raw.into())) } +/// Slack (ms) applied on top of `enumerated_at_ms` when deciding which +/// rows are "old enough" to drop. Sessions whose `last_activity_at_ms` +/// is newer than `enumerated_at_ms - RECONCILE_MIN_AGE_SLACK_MS` are +/// kept even when their pane isn't in the alive set — this absorbs +/// helper↔master clock skew and any session created after the F5 +/// presser snapshotted WT but before master sees the request. +const RECONCILE_MIN_AGE_SLACK_MS: u64 = 1_000; + +/// Handler for `intellterm.wta/reconcile_liveness`. +/// +/// Walks the registry snapshot and drops any row whose `pane_session_id` +/// (a) is set AND (b) is not in the helper-supplied alive set AND +/// (c) is older than the race-guard cutoff. Per-sid cleanup mirrors +/// [`drop_sessions_for_helper`]: remove from `session_to_helper`, remove +/// from the registry, broadcast `session_removed`. A single +/// `sessions/changed` broadcast follows at the end (cheaper than +/// per-victim and the helper coalesces them anyway). +/// +/// Pane id comparison is case-insensitive — `pane_session_id` is stored +/// as a GUID and WT can return either casing. +async fn handle_reconcile_liveness( + state: &MasterStateInner, + params: &serde_json::value::RawValue, +) -> acp::Result { + let parsed = crate::session_registry::parse_reconcile_liveness_params(params).map_err( + |err| { + tracing::warn!( + target: "master", + op = "reconcile_liveness", + error = %err, + "rejecting malformed reconcile_liveness params" + ); + acp::Error::invalid_params().data(serde_json::json!({ "message": err.to_string() })) + }, + )?; + + let alive: std::collections::HashSet = parsed + .alive_panes + .into_iter() + .map(|p| p.to_ascii_lowercase()) + .collect(); + let max_drop_activity_ms = parsed + .enumerated_at_ms + .saturating_sub(RECONCILE_MIN_AGE_SLACK_MS); + + let snapshot = state.registry.snapshot().await; + let stale: Vec = snapshot + .iter() + .filter(|s| { + let Some(pane) = s.pane_session_id.as_ref() else { + return false; + }; + if alive.contains(&pane.to_ascii_lowercase()) { + return false; + } + // Race guard: sessions with no activity timestamp are + // brand-new (no events yet) and we don't know their age, + // so keep them. Sessions with a timestamp newer than the + // cutoff might have just been created after the F5 + // presser snapshotted WT; also keep. + match s.last_activity_at_ms { + None => false, + Some(ts) => ts <= max_drop_activity_ms, + } + }) + .map(|s| s.session_id.clone()) + .collect(); + + let dropped = stale.len() as u32; + tracing::info!( + target: "master", + op = "reconcile_liveness", + registry_size = snapshot.len(), + alive_panes = alive.len(), + enumerated_at_ms = parsed.enumerated_at_ms, + stale = dropped, + "reconciled registry against WT alive panes" + ); + + for sid in &stale { + // Mirror drop_sessions_for_helper, per-sid. Lock order: take + // session_to_helper, mutate, release, then touch registry. + { + let mut map = state.session_to_helper.lock().await; + map.remove(sid); + } + state.registry.remove(sid).await; + broadcast_ext_to_helpers( + state, + crate::session_registry::build_session_removed_notification(sid), + ) + .await; + } + if dropped > 0 { + broadcast_ext_to_helpers( + state, + crate::session_registry::build_sessions_changed_notification(), + ) + .await; + } + + let raw = crate::session_registry::build_reconcile_liveness_response(dropped); + Ok(acp::ExtResponse::new(raw.into())) +} + /// Pure async handler for the `intellterm.wta/session_hook` ExtRequest. /// /// Decodes the hook event, dispatches it to the master-side registry reducer @@ -2708,6 +2823,202 @@ mod tests { assert_eq!(got, expected); } + /// Build a registry row with a pane binding and an explicit + /// activity timestamp. Reconcile tests use this so they can + /// directly steer the race-guard comparison. + fn reconcile_row( + sid: &str, + pane: Option<&str>, + last_activity_at_ms: Option, + ) -> crate::session_registry::SessionInfo { + let mut info = crate::session_registry::SessionInfo::new( + SessionId::new(sid), + PathBuf::from(format!("/repo/{sid}")), + ); + if let Some(p) = pane { + info = info.with_pane_session_id(p.to_string()); + } + info.last_activity_at_ms = last_activity_at_ms; + info + } + + /// Drive the handler directly without going through the + /// `ext_method` dispatch glue. + async fn invoke_reconcile( + state: &Arc, + alive: Vec<&str>, + enumerated_at_ms: u64, + ) -> crate::session_registry::ReconcileLivenessResponse { + let req = crate::session_registry::build_reconcile_liveness_request( + alive.into_iter().map(|s| s.to_string()).collect(), + enumerated_at_ms, + ); + let resp = handle_reconcile_liveness(state, &req.params) + .await + .expect("handler returns Ok"); + crate::session_registry::parse_reconcile_liveness_response(&resp.0) + .expect("response parses") + } + + /// Reconcile drops registry rows whose pane binding is gone (and + /// is old enough to clear the race guard), broadcasts + /// `session_removed` for each, and a single trailing + /// `sessions/changed`. Rows whose pane is still alive, or which + /// have no pane binding, are untouched. + #[tokio::test] + async fn handle_reconcile_liveness_drops_stale_pane_bindings() { + let state = make_state(); + let now_ms = 10_000_u64; + let old_ms = now_ms - RECONCILE_MIN_AGE_SLACK_MS - 100; + let sid_alive = SessionId::new("alive-1"); + let sid_stale = SessionId::new("stale-1"); + let sid_no_pane = SessionId::new("no-pane-1"); + + state + .registry + .upsert(reconcile_row("alive-1", Some("pane-A"), Some(old_ms))) + .await; + state + .registry + .upsert(reconcile_row("stale-1", Some("pane-B"), Some(old_ms))) + .await; + state + .registry + .upsert(reconcile_row("no-pane-1", None, Some(old_ms))) + .await; + // Peer helper subscribes so we can observe the broadcasts. + let (ext_tx, mut ext_rx) = mpsc::unbounded_channel::(); + { + let mut subs = state.helper_ext_subscribers.lock().await; + subs.insert(HelperId(99), ext_tx); + } + + let resp = invoke_reconcile(&state, vec!["pane-A"], now_ms).await; + + assert_eq!(resp.dropped, 1, "only stale-1 is dropped"); + assert!( + state.registry.lookup(&sid_alive).await.is_some(), + "alive row survives" + ); + assert!( + state.registry.lookup(&sid_stale).await.is_none(), + "stale row removed from registry" + ); + assert!( + state.registry.lookup(&sid_no_pane).await.is_some(), + "no-pane row untouched (we never had a pane to compare against)" + ); + + let mut removed: Vec = Vec::new(); + let mut changed_count = 0; + while let Ok(ext) = ext_rx.try_recv() { + match crate::session_registry::parse_ext_notification(&ext) { + crate::session_registry::WtaExtNotification::SessionRemoved(sid) => { + removed.push(sid) + } + crate::session_registry::WtaExtNotification::SessionsChanged => { + changed_count += 1 + } + other => panic!("unexpected ext: {other:?}"), + } + } + assert_eq!(removed, vec![sid_stale.clone()]); + assert_eq!(changed_count, 1, "single trailing sessions/changed"); + } + + /// Sessions without a `pane_session_id` are Historical / disk-only + /// — reconcile must never demote them, regardless of the alive set + /// (it could be empty if WT has no agent panes open at all). + #[tokio::test] + async fn handle_reconcile_liveness_keeps_rows_without_pane_binding() { + let state = make_state(); + let sid = SessionId::new("hist-1"); + state + .registry + .upsert(reconcile_row("hist-1", None, Some(0))) + .await; + + let resp = invoke_reconcile(&state, vec![], 999_999).await; + + assert_eq!(resp.dropped, 0); + assert!(state.registry.lookup(&sid).await.is_some()); + } + + /// RACE GUARD: a session whose `last_activity_at_ms` is newer than + /// `enumerated_at_ms - slack` is kept even when its pane isn't in + /// the alive set. Models a session created concurrently with the + /// F5 enumeration whose pane hadn't appeared in WT yet when the + /// presser snapshotted the list. + #[tokio::test] + async fn handle_reconcile_liveness_race_guard_keeps_fresh_sessions() { + let state = make_state(); + let enumerated_at_ms = 10_000; + // "Just created" — activity ms is AFTER enumeration started. + let fresh_ms = enumerated_at_ms - RECONCILE_MIN_AGE_SLACK_MS + 1; + let sid = SessionId::new("fresh-1"); + state + .registry + .upsert(reconcile_row( + "fresh-1", + Some("pane-fresh"), + Some(fresh_ms), + )) + .await; + + // Alive set is empty — without the race guard this would drop + // the row. + let resp = invoke_reconcile(&state, vec![], enumerated_at_ms).await; + + assert_eq!(resp.dropped, 0, "race guard kept the fresh row"); + assert!(state.registry.lookup(&sid).await.is_some()); + } + + /// `last_activity_at_ms == None` means the session was created + /// but no events have updated its activity yet (very fresh). We + /// conservatively keep these — without a timestamp we can't tell + /// they're old enough to drop safely. User can re-press F5 once + /// the row has any activity stamped. + #[tokio::test] + async fn handle_reconcile_liveness_keeps_sessions_with_no_activity_ts() { + let state = make_state(); + let sid = SessionId::new("no-ts-1"); + state + .registry + .upsert(reconcile_row("no-ts-1", Some("pane-no-ts"), None)) + .await; + + let resp = invoke_reconcile(&state, vec![], 999_999).await; + + assert_eq!(resp.dropped, 0); + assert!(state.registry.lookup(&sid).await.is_some()); + } + + /// Pane id comparison is case-insensitive — WT can return either + /// casing in `pane_session_id`/`session_id`, and the registry's + /// stored value isn't guaranteed lowercased. Reconcile must not + /// drop a row just because the helper sent `aaa-bbb` and the + /// registry stored `AAA-BBB`. + #[tokio::test] + async fn handle_reconcile_liveness_matches_pane_ids_case_insensitively() { + let state = make_state(); + let now_ms = 10_000_u64; + let old_ms = now_ms - RECONCILE_MIN_AGE_SLACK_MS - 100; + let sid = SessionId::new("alive-mixed-case"); + state + .registry + .upsert(reconcile_row( + "alive-mixed-case", + Some("AAA-BBB-CCC"), + Some(old_ms), + )) + .await; + + let resp = invoke_reconcile(&state, vec!["aaa-bbb-ccc"], now_ms).await; + + assert_eq!(resp.dropped, 0, "case-insensitive match keeps the row"); + assert!(state.registry.lookup(&sid).await.is_some()); + } + /// `route_for` (used by every `MasterClient::` /// forwarder) must return `internal_error` when the agent CLI /// sends a request for a session that no helper has registered diff --git a/tools/wta/src/protocol/acp/client.rs b/tools/wta/src/protocol/acp/client.rs index 69de3e658..0dbbd4038 100644 --- a/tools/wta/src/protocol/acp/client.rs +++ b/tools/wta/src/protocol/acp/client.rs @@ -131,6 +131,14 @@ pub enum MasterExtRequest { request_id: u64, sid: acp::SessionId, }, + /// F5 in the F2 sessions view: enumerate WT's live panes via + /// ShellManager, send the alive set to master so it can drop any + /// registry row whose pane binding no longer exists. Caller + /// observes the UI update via the resulting `sessions/changed` + /// broadcast (which schedules a refetch in the existing handler). + ReconcileLiveness { + request_id: u64, + }, } /// User-initiated request to resume a historical agent session by calling @@ -2424,7 +2432,7 @@ pub async fn run_acp_client_over_pipe( }); } Some(req) = master_ext_rx.recv() => { - dispatch_master_ext_request(req, &conn, &event_tx); + dispatch_master_ext_request(req, &conn, &event_tx, &shell_mgr); } Some(req) = restart_rx.recv() => { // Helper can't restart the agent CLI in-process — master owns @@ -3264,7 +3272,7 @@ async fn run_inner( // /restart: priority over other arms via `biased;` so a // queued prompt can't sneak in front of a kill request. Some(req) = master_ext_rx.recv() => { - dispatch_master_ext_request(req, &conn, &event_tx); + dispatch_master_ext_request(req, &conn, &event_tx, &shell_mgr); } Some(req) = restart_rx.recv() => { tracing::info!(target: "acp_restart", "restart requested, new_agent={:?}", req.agent_cmd); @@ -3631,9 +3639,11 @@ fn dispatch_master_ext_request( req: MasterExtRequest, conn: &Arc, event_tx: &mpsc::UnboundedSender, + shell_mgr: &Arc, ) { let conn = Arc::clone(conn); let event_tx = event_tx.clone(); + let shell_mgr = Arc::clone(shell_mgr); tokio::task::spawn_local(async move { match req { MasterExtRequest::SessionsList { request_id } => { @@ -3678,10 +3688,121 @@ fn dispatch_master_ext_request( } let _ = event_tx.send(AppEvent::MasterMutationCompleted { request_id }); } + MasterExtRequest::ReconcileLiveness { request_id } => { + // Capture the timestamp BEFORE enumeration so master's + // race guard correctly excludes sessions created during + // (or after) our snapshot of WT. + let enumerated_at_ms = std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .map(|d| d.as_millis() as u64) + .unwrap_or(0); + let alive_panes = match enumerate_alive_panes(&shell_mgr).await { + Ok(panes) => panes, + Err(err) => { + // ALL-OR-NOTHING: a partial alive set would + // falsely demote live sessions whose pane was + // in the unreachable subtree. Abort without + // sending the request. + tracing::warn!( + target: "agents_view", + request_id, + error = %err, + "reconcile_liveness aborted: pane enumeration failed" + ); + let _ = event_tx + .send(AppEvent::MasterMutationCompleted { request_id }); + return; + } + }; + let wire = crate::session_registry::build_reconcile_liveness_request( + alive_panes, + enumerated_at_ms, + ); + match conn.ext_method(wire).await { + Ok(resp) => { + match crate::session_registry::parse_reconcile_liveness_response( + &resp.0, + ) { + Ok(parsed) => tracing::info!( + target: "agents_view", + request_id, + dropped = parsed.dropped, + "reconcile_liveness completed" + ), + Err(err) => tracing::warn!( + target: "agents_view", + request_id, + error = %err, + "reconcile_liveness response parse failed" + ), + } + } + Err(err) => { + tracing::warn!( + target: "agents_view", + request_id, + error = ?err, + "reconcile_liveness ext-request failed (likely direct-mode: agent CLI doesn't recognize the method)" + ); + } + } + let _ = event_tx.send(AppEvent::MasterMutationCompleted { request_id }); + } } }); } +/// Walk WT's window → tab → pane tree via `ShellManager` and collect +/// every pane's `session_id` (lowercased) into an alive set. Used by +/// the F5 reconcile-liveness flow. +/// +/// **All-or-nothing.** Any failed COM call (or missing/malformed JSON +/// field) returns `Err` and the caller must abort the reconcile — +/// sending a partial alive set would falsely demote live sessions +/// whose pane was in the unreachable subtree. +/// +/// Pane JSON field name is `session_id` (NOT `pane_session_id`), +/// matching `src/tools/wtcli/Formatting.cpp::PaneInfoToJson` and the +/// existing pane-discovery code in `tools/wta/src/main.rs:1688`. +async fn enumerate_alive_panes(shell_mgr: &ShellManager) -> Result> { + let windows = shell_mgr.wt_list_windows().await?; + let windows_arr = windows + .get("windows") + .and_then(|v| v.as_array()) + .ok_or_else(|| anyhow::anyhow!("list_windows: missing 'windows' array"))?; + let mut alive = Vec::new(); + for w in windows_arr { + let window_id = w + .get("window_id") + .and_then(|v| v.as_u64()) + .ok_or_else(|| anyhow::anyhow!("window missing window_id"))? + .to_string(); + let tabs = shell_mgr.wt_list_tabs(&window_id).await?; + let tabs_arr = tabs + .get("tabs") + .and_then(|v| v.as_array()) + .ok_or_else(|| anyhow::anyhow!("list_tabs: missing 'tabs' array"))?; + for t in tabs_arr { + let tab_id = t + .get("tab_id") + .and_then(|v| v.as_u64()) + .ok_or_else(|| anyhow::anyhow!("tab missing tab_id"))? + .to_string(); + let panes = shell_mgr.wt_list_panes(&tab_id).await?; + let panes_arr = panes + .get("panes") + .and_then(|v| v.as_array()) + .ok_or_else(|| anyhow::anyhow!("list_panes: missing 'panes' array"))?; + for p in panes_arr { + if let Some(sid) = p.get("session_id").and_then(|v| v.as_str()) { + alive.push(sid.to_ascii_lowercase()); + } + } + } + } + Ok(alive) +} + fn dispatch_prompt( prompt: PromptSubmission, conn: &Arc, diff --git a/tools/wta/src/session_registry.rs b/tools/wta/src/session_registry.rs index 641d4e5fe..44ba8fba2 100644 --- a/tools/wta/src/session_registry.rs +++ b/tools/wta/src/session_registry.rs @@ -155,6 +155,21 @@ pub const INTELLTERM_METHOD_SESSIONS_CHANGED: &str = "intellterm.wta/sessions/ch /// ExtRequest method for fetching the master's full session registry snapshot. pub const INTELLTERM_METHOD_SESSIONS_LIST: &str = "intellterm.wta/sessions/list"; +/// ExtRequest method for "F5 in F2 view: reconcile master's registry +/// against WT's actual live pane set". Helper-initiated; master +/// computes the stale set, drops each stale row, and broadcasts +/// `session_removed` for it. Caller observes the resulting UI updates +/// through the existing `sessions/changed` notification. +/// +/// Why it exists: the push-based liveness path (helper-pipe disconnect +/// triggers `drop_sessions_for_helper`) misses cases where the agent +/// CLI subprocess stays alive after its WT pane closes — most visible +/// with Gemini, which doesn't reliably exit on stdin EOF. Without an +/// active liveness check, the F2 row stays stuck at Idle/Live until WT +/// restarts. This ext-method gives the user a manual escape hatch. +pub const INTELLTERM_METHOD_RECONCILE_LIVENESS: &str = + "intellterm.wta/reconcile_liveness"; + /// Wire payload for [`INTELLTERM_METHOD_SESSION_REMOVED`]. /// /// We only need the session id — helpers look the row up locally to @@ -239,6 +254,71 @@ pub fn parse_sessions_list_response( serde_json::from_str::(raw.get()) } +// ─── intellterm.wta/reconcile_liveness ─────────────────────────────────────── + +/// Wire payload for [`INTELLTERM_METHOD_RECONCILE_LIVENESS`]. +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, PartialEq, Eq)] +pub struct ReconcileLivenessParams { + /// Lowercased pane session_ids currently alive in WT, gathered by + /// the helper from `wt_list_panes` (field name `session_id` per + /// `src/tools/wtcli/Formatting.cpp::PaneInfoToJson`). Master + /// compares case-insensitively against each registry row's + /// `pane_session_id`. + pub alive_panes: Vec, + /// Helper-side wall-clock (ms since UNIX epoch) at the moment pane + /// enumeration *started*. Master uses this as a race guard — + /// sessions whose `last_activity_at_ms` is newer than + /// `enumerated_at_ms - RECONCILE_MIN_AGE_SLACK_MS` are NOT dropped + /// even if their pane isn't in `alive_panes`. Prevents reconcile + /// from killing brand-new sessions created concurrently with the + /// F5 enumeration (their pane would have appeared after we + /// snapshotted the WT pane list, so it'd look "missing"). + pub enumerated_at_ms: u64, +} + +/// Wire payload for the response to [`INTELLTERM_METHOD_RECONCILE_LIVENESS`]. +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, PartialEq, Eq)] +pub struct ReconcileLivenessResponse { + /// Count of sessions that were stale-dropped from master's + /// registry. Caller can surface this in a transient hint if desired. + pub dropped: u32, +} + +pub fn build_reconcile_liveness_request( + alive_panes: Vec, + enumerated_at_ms: u64, +) -> acp::ExtRequest { + let params = ReconcileLivenessParams { + alive_panes, + enumerated_at_ms, + }; + let json = + serde_json::to_string(¶ms).expect("ReconcileLivenessParams is trivially serializable"); + let raw = serde_json::value::RawValue::from_string(json) + .expect("serde_json::to_string always produces valid JSON"); + acp::ExtRequest::new(INTELLTERM_METHOD_RECONCILE_LIVENESS, Arc::from(raw)) +} + +pub fn parse_reconcile_liveness_params( + raw: &serde_json::value::RawValue, +) -> Result { + serde_json::from_str::(raw.get()) +} + +pub fn build_reconcile_liveness_response( + dropped: u32, +) -> Box { + let response = ReconcileLivenessResponse { dropped }; + serde_json::value::to_raw_value(&response) + .expect("ReconcileLivenessResponse serialization is infallible for owned data") +} + +pub fn parse_reconcile_liveness_response( + raw: &serde_json::value::RawValue, +) -> Result { + serde_json::from_str::(raw.get()) +} + /// Parsed view of an inbound ACP `ExtNotification` from master, as /// recognized by the helper's live-set mirror. /// @@ -2494,4 +2574,39 @@ mod tests { "registry untouched on malformed input" ); } + + // ─── reconcile_liveness wire-types ────────────────────────────────────── + + #[test] + fn reconcile_liveness_params_roundtrip() { + let original = ReconcileLivenessParams { + alive_panes: vec!["aaa-bbb".into(), "ccc".into()], + enumerated_at_ms: 1_700_000_000_000, + }; + let req = build_reconcile_liveness_request( + original.alive_panes.clone(), + original.enumerated_at_ms, + ); + assert_eq!(&*req.method, INTELLTERM_METHOD_RECONCILE_LIVENESS); + let parsed = parse_reconcile_liveness_params(&req.params).expect("parse"); + assert_eq!(parsed, original); + } + + #[test] + fn reconcile_liveness_response_roundtrip() { + let raw = build_reconcile_liveness_response(7); + let parsed = parse_reconcile_liveness_response(&raw).expect("parse"); + assert_eq!(parsed.dropped, 7); + } + + #[test] + fn reconcile_liveness_params_accepts_empty_alive_set() { + // Empty alive set is a legitimate request (e.g. WT has no agent + // panes left). Master still uses the timestamp guard, so this + // doesn't drop fresh sessions. + let req = build_reconcile_liveness_request(Vec::new(), 0); + let parsed = parse_reconcile_liveness_params(&req.params).expect("parse"); + assert!(parsed.alive_panes.is_empty()); + assert_eq!(parsed.enumerated_at_ms, 0); + } }