From 3327c30599e61b024dacf125e98f415b60907836 Mon Sep 17 00:00:00 2001 From: DDKinger Date: Tue, 23 Jun 2026 21:29:26 +0800 Subject: [PATCH 1/4] Add "F5 to refresh" to session management view + localize Add an F5 keybinding in the WTA session-management (Agents) view that refetches the session list, and surface it in the footer hint. - app.rs: F5 in the Agents view calls schedule_agents_refetch_for_tab (no-ops when the view isn't primed and coalesces with an in-flight fetch). Adds a unit test asserting F5 dispatches a sessions/list request. - locales: append the "F5 " segment to agents.footer_hint and add "F5" to the {Locked} key-name list across all 89 locales. Translations follow each locale's existing "Esc " style and the Microsoft term for "Refresh". RTL and the three pseudo-locales keep their wrappers (the segment is inserted before the closing paren); am-ET / lo-LA keep the English placeholder their footer_hint currently uses. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- tools/wta/locales/af-ZA.yml | 4 ++-- tools/wta/locales/am-ET.yml | 4 ++-- tools/wta/locales/ar-SA.yml | 4 ++-- tools/wta/locales/as-IN.yml | 4 ++-- tools/wta/locales/az-Latn-AZ.yml | 4 ++-- tools/wta/locales/bg-BG.yml | 4 ++-- tools/wta/locales/bn-IN.yml | 4 ++-- tools/wta/locales/bs-Latn-BA.yml | 4 ++-- tools/wta/locales/ca-ES.yml | 4 ++-- tools/wta/locales/ca-Es-VALENCIA.yml | 4 ++-- tools/wta/locales/cs-CZ.yml | 4 ++-- tools/wta/locales/cy-GB.yml | 4 ++-- tools/wta/locales/da-DK.yml | 4 ++-- tools/wta/locales/de-DE.yml | 4 ++-- tools/wta/locales/el-GR.yml | 4 ++-- tools/wta/locales/en-GB.yml | 4 ++-- tools/wta/locales/en-US.yml | 4 ++-- tools/wta/locales/es-ES.yml | 4 ++-- tools/wta/locales/es-MX.yml | 4 ++-- tools/wta/locales/et-EE.yml | 4 ++-- tools/wta/locales/eu-ES.yml | 4 ++-- tools/wta/locales/fa-IR.yml | 4 ++-- tools/wta/locales/fi-FI.yml | 4 ++-- tools/wta/locales/fil-PH.yml | 4 ++-- tools/wta/locales/fr-CA.yml | 4 ++-- tools/wta/locales/fr-FR.yml | 4 ++-- tools/wta/locales/ga-IE.yml | 4 ++-- tools/wta/locales/gd-gb.yml | 4 ++-- tools/wta/locales/gl-ES.yml | 4 ++-- tools/wta/locales/gu-IN.yml | 4 ++-- tools/wta/locales/he-IL.yml | 4 ++-- tools/wta/locales/hi-IN.yml | 4 ++-- tools/wta/locales/hr-HR.yml | 4 ++-- tools/wta/locales/hu-HU.yml | 4 ++-- tools/wta/locales/hy-AM.yml | 4 ++-- tools/wta/locales/id-ID.yml | 4 ++-- tools/wta/locales/is-IS.yml | 4 ++-- tools/wta/locales/it-IT.yml | 4 ++-- tools/wta/locales/ja-JP.yml | 4 ++-- tools/wta/locales/ka-GE.yml | 4 ++-- tools/wta/locales/kk-KZ.yml | 4 ++-- tools/wta/locales/km-KH.yml | 4 ++-- tools/wta/locales/kn-IN.yml | 4 ++-- tools/wta/locales/ko-KR.yml | 4 ++-- tools/wta/locales/kok-IN.yml | 4 ++-- tools/wta/locales/lb-LU.yml | 4 ++-- tools/wta/locales/lo-LA.yml | 4 ++-- tools/wta/locales/lt-LT.yml | 4 ++-- tools/wta/locales/lv-LV.yml | 4 ++-- tools/wta/locales/mi-NZ.yml | 4 ++-- tools/wta/locales/mk-MK.yml | 4 ++-- tools/wta/locales/ml-IN.yml | 4 ++-- tools/wta/locales/mr-IN.yml | 4 ++-- tools/wta/locales/ms-MY.yml | 4 ++-- tools/wta/locales/mt-MT.yml | 4 ++-- tools/wta/locales/nb-NO.yml | 4 ++-- tools/wta/locales/ne-NP.yml | 4 ++-- tools/wta/locales/nl-NL.yml | 4 ++-- tools/wta/locales/nn-NO.yml | 4 ++-- tools/wta/locales/or-IN.yml | 4 ++-- tools/wta/locales/pa-IN.yml | 4 ++-- tools/wta/locales/pl-PL.yml | 4 ++-- tools/wta/locales/pt-BR.yml | 4 ++-- tools/wta/locales/pt-PT.yml | 4 ++-- tools/wta/locales/qps-ploc.yml | 4 ++-- tools/wta/locales/qps-ploca.yml | 4 ++-- tools/wta/locales/qps-plocm.yml | 4 ++-- tools/wta/locales/quz-PE.yml | 4 ++-- tools/wta/locales/ro-RO.yml | 4 ++-- tools/wta/locales/ru-RU.yml | 4 ++-- tools/wta/locales/sk-SK.yml | 4 ++-- tools/wta/locales/sl-SI.yml | 4 ++-- tools/wta/locales/sq-AL.yml | 4 ++-- tools/wta/locales/sr-Cyrl-BA.yml | 4 ++-- tools/wta/locales/sr-Cyrl-RS.yml | 4 ++-- tools/wta/locales/sr-Latn-RS.yml | 4 ++-- tools/wta/locales/sv-SE.yml | 4 ++-- tools/wta/locales/ta-IN.yml | 4 ++-- tools/wta/locales/te-IN.yml | 4 ++-- tools/wta/locales/th-TH.yml | 4 ++-- tools/wta/locales/tr-TR.yml | 4 ++-- tools/wta/locales/tt-RU.yml | 4 ++-- tools/wta/locales/ug-CN.yml | 4 ++-- tools/wta/locales/uk-UA.yml | 4 ++-- tools/wta/locales/ur-PK.yml | 4 ++-- tools/wta/locales/uz-Latn-UZ.yml | 4 ++-- tools/wta/locales/vi-VN.yml | 4 ++-- tools/wta/locales/zh-CN.yml | 4 ++-- tools/wta/locales/zh-TW.yml | 4 ++-- tools/wta/src/app.rs | 30 ++++++++++++++++++++++++++++ 90 files changed, 208 insertions(+), 178 deletions(-) diff --git a/tools/wta/locales/af-ZA.yml b/tools/wta/locales/af-ZA.yml index 6c27a60da..57869a0cb 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 9d6b6e5f8..0be75bc92 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 af7e5af59..38b676dfa 100644 --- a/tools/wta/locales/ar-SA.yml +++ b/tools/wta/locales/ar-SA.yml @@ -118,8 +118,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 1a1393d8a..ec57ef12d 100644 --- a/tools/wta/locales/as-IN.yml +++ b/tools/wta/locales/as-IN.yml @@ -118,8 +118,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 661daf64b..badf48660 100644 --- a/tools/wta/locales/az-Latn-AZ.yml +++ b/tools/wta/locales/az-Latn-AZ.yml @@ -118,8 +118,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 f6fb7ee08..9e7e50f8d 100644 --- a/tools/wta/locales/bg-BG.yml +++ b/tools/wta/locales/bg-BG.yml @@ -114,8 +114,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 2ec68dd9c..667b82f8b 100644 --- a/tools/wta/locales/bn-IN.yml +++ b/tools/wta/locales/bn-IN.yml @@ -118,8 +118,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 0ee9592a0..c844414f9 100644 --- a/tools/wta/locales/bs-Latn-BA.yml +++ b/tools/wta/locales/bs-Latn-BA.yml @@ -114,8 +114,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 a3a0df7e3..163fa4830 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 ce72d689a..a2b0337a7 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 a9df38c7d..0b6596b80 100644 --- a/tools/wta/locales/cs-CZ.yml +++ b/tools/wta/locales/cs-CZ.yml @@ -114,8 +114,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 obnovení)" 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 aec4c43c7..0a73c36f6 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 48582eaab..d9734b293 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 bfa4b3f4e..a3381a533 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 18f6d5850..afece8b58 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 88b398755..521ab7556 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 c102a64f5..9a4cb6051 100644 --- a/tools/wta/locales/en-US.yml +++ b/tools/wta/locales/en-US.yml @@ -153,8 +153,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 50b632a32..41cfbd2d2 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 a174a9ccb..cbd3733b6 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 8041a8eac..1619d2925 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 3e7b006d1..fb470f8fd 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 ab37c291f..0dccb351d 100644 --- a/tools/wta/locales/fa-IR.yml +++ b/tools/wta/locales/fa-IR.yml @@ -118,8 +118,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 c770d730f..cdec69672 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 611bce9cc..f434cdeb0 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 8159de1a6..11e73b00e 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 c7cd6b881..8ebad09df 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 be3653404..d6cb8c0dc 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 dfed76532..44ef95e0c 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 aeb3fd5cf..d254c5def 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 c298af8cd..da649c2db 100644 --- a/tools/wta/locales/gu-IN.yml +++ b/tools/wta/locales/gu-IN.yml @@ -118,8 +118,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 7afb2eaa1..6581f76d8 100644 --- a/tools/wta/locales/he-IL.yml +++ b/tools/wta/locales/he-IL.yml @@ -118,8 +118,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 d09897a40..09d37f04b 100644 --- a/tools/wta/locales/hi-IN.yml +++ b/tools/wta/locales/hi-IN.yml @@ -118,8 +118,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 53a7ab950..c7ddce0df 100644 --- a/tools/wta/locales/hr-HR.yml +++ b/tools/wta/locales/hr-HR.yml @@ -114,8 +114,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 a6f4c2208..e5d94194c 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 d5de99d2f..c840d3662 100644 --- a/tools/wta/locales/hy-AM.yml +++ b/tools/wta/locales/hy-AM.yml @@ -129,8 +129,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 a1811b7dd..9186dd425 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 58728c68f..3c0f3aa58 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 fb644fbf6..29952702c 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 ab2034133..0813ac4a9 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 b8db52b90..b0ed55f9d 100644 --- a/tools/wta/locales/ka-GE.yml +++ b/tools/wta/locales/ka-GE.yml @@ -118,8 +118,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 f88efb8e2..c07f5b90c 100644 --- a/tools/wta/locales/kk-KZ.yml +++ b/tools/wta/locales/kk-KZ.yml @@ -118,8 +118,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 7aadfff23..b13a361ce 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 8f83dece1..475bc83b2 100644 --- a/tools/wta/locales/kn-IN.yml +++ b/tools/wta/locales/kn-IN.yml @@ -118,8 +118,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 d25184ec4..044bb9074 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 cce477b4c..d9a2afe2c 100644 --- a/tools/wta/locales/kok-IN.yml +++ b/tools/wta/locales/kok-IN.yml @@ -118,8 +118,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 e2bf869d3..877cad4d8 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 z'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 353e95f61..224f48884 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 4b9359f96..b65d1fa9c 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 ba5c7b835..84811012a 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 lai atsvaidzinātu)" 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 bf2ec5aaa..255c38801 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 whakahou)" 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 16c39ee71..c3430dead 100644 --- a/tools/wta/locales/mk-MK.yml +++ b/tools/wta/locales/mk-MK.yml @@ -114,8 +114,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 bdc5f381d..13e1b24c4 100644 --- a/tools/wta/locales/ml-IN.yml +++ b/tools/wta/locales/ml-IN.yml @@ -118,8 +118,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 e21a9666b..9b9ad3b20 100644 --- a/tools/wta/locales/mr-IN.yml +++ b/tools/wta/locales/mr-IN.yml @@ -118,8 +118,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 33c1c1157..2c2e48941 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 menyegar semula)" 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 ec1b46065..a31184010 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 713d4b37b..2c085fdef 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 6ce6d00db..e9d6bad1a 100644 --- a/tools/wta/locales/ne-NP.yml +++ b/tools/wta/locales/ne-NP.yml @@ -118,8 +118,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 33bc28347..2c4c72a60 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 486292d38..406a4245e 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 c80f20e96..8edb1fe8d 100644 --- a/tools/wta/locales/or-IN.yml +++ b/tools/wta/locales/or-IN.yml @@ -118,8 +118,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 91bff3165..e0f21bd13 100644 --- a/tools/wta/locales/pa-IN.yml +++ b/tools/wta/locales/pa-IN.yml @@ -118,8 +118,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 e7c539e15..e141fa855 100644 --- a/tools/wta/locales/pl-PL.yml +++ b/tools/wta/locales/pl-PL.yml @@ -114,8 +114,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 8b1f8bb43..523166471 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 069afe918..f3d1831e7 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 96bdf68fa..91b68d89b 100644 --- a/tools/wta/locales/qps-ploc.yml +++ b/tools/wta/locales/qps-ploc.yml @@ -108,8 +108,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 ţö éxïţ)!!!! !!!! !!!! !!!!]" +# {Locked="Enter","Esc","F5","↑","↓"} - key combinations, do not translate +agents.footer_hint: "[(↑ ↓ ţö ñåṽïğåţé • Enter ţö ĺåûñçĥ śéśśïöñ • Esc ţö éxïţ • F5 ţö ŕéfŕéśĥ)!!!! !!!! !!!! !!!!]" 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 01e432c4e..368ca12f6 100644 --- a/tools/wta/locales/qps-ploca.yml +++ b/tools/wta/locales/qps-ploca.yml @@ -106,8 +106,8 @@ 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)_!!]" +# {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/qps-plocm.yml b/tools/wta/locales/qps-plocm.yml index 61f3cd6c9..f8dd64a51 100644 --- a/tools/wta/locales/qps-plocm.yml +++ b/tools/wta/locales/qps-plocm.yml @@ -106,8 +106,8 @@ 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) !!]" +# {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: "[!! 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 a441af998..3ad93b7f5 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 musuqyachinapaq)" 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 918034c16..4975ce45a 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 6ef338048..d96bd01b8 100644 --- a/tools/wta/locales/ru-RU.yml +++ b/tools/wta/locales/ru-RU.yml @@ -114,8 +114,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 bac23bcac..2e1592224 100644 --- a/tools/wta/locales/sk-SK.yml +++ b/tools/wta/locales/sk-SK.yml @@ -114,8 +114,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 fb03ebd39..59e56f615 100644 --- a/tools/wta/locales/sl-SI.yml +++ b/tools/wta/locales/sl-SI.yml @@ -114,8 +114,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 0f43efc5a..95f510abf 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 c8684b5cf..6067813bb 100644 --- a/tools/wta/locales/sr-Cyrl-BA.yml +++ b/tools/wta/locales/sr-Cyrl-BA.yml @@ -114,8 +114,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 30f453719..f16009597 100644 --- a/tools/wta/locales/sr-Cyrl-RS.yml +++ b/tools/wta/locales/sr-Cyrl-RS.yml @@ -114,8 +114,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 fc527b90c..6a7bdf924 100644 --- a/tools/wta/locales/sr-Latn-RS.yml +++ b/tools/wta/locales/sr-Latn-RS.yml @@ -114,8 +114,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 39572b0c3..5c01ced1e 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 ead90dc25..f8e1aa9f5 100644 --- a/tools/wta/locales/ta-IN.yml +++ b/tools/wta/locales/ta-IN.yml @@ -118,8 +118,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 255d046d1..f9fe408bf 100644 --- a/tools/wta/locales/te-IN.yml +++ b/tools/wta/locales/te-IN.yml @@ -118,8 +118,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 f970ef4bd..f9e9e62bc 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 e10eb7f5e..13fbc4c4d 100644 --- a/tools/wta/locales/tr-TR.yml +++ b/tools/wta/locales/tr-TR.yml @@ -118,8 +118,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 7d2fca792..adaa3ccd5 100644 --- a/tools/wta/locales/tt-RU.yml +++ b/tools/wta/locales/tt-RU.yml @@ -118,8 +118,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 fc8e85998..4e15c8a23 100644 --- a/tools/wta/locales/ug-CN.yml +++ b/tools/wta/locales/ug-CN.yml @@ -123,8 +123,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 4ed0ed30d..309f313d2 100644 --- a/tools/wta/locales/uk-UA.yml +++ b/tools/wta/locales/uk-UA.yml @@ -114,8 +114,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 b20ef7d8a..3a0afd837 100644 --- a/tools/wta/locales/ur-PK.yml +++ b/tools/wta/locales/ur-PK.yml @@ -118,8 +118,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 df73c6500..f2d4801f1 100644 --- a/tools/wta/locales/uz-Latn-UZ.yml +++ b/tools/wta/locales/uz-Latn-UZ.yml @@ -118,8 +118,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 f8e1b9126..1780f20ef 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 b286eba17..b201ebf6e 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 405d07965..90c0a0d00 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 5dfda8b3b..e75246eaf 100644 --- a/tools/wta/src/app.rs +++ b/tools/wta/src/app.rs @@ -6365,6 +6365,13 @@ impl App { self.close_agents_view_for_tab(&tab_id); self.project_active_tab_state(); } + KeyCode::F(5) => { + // Refresh the session list (footer hint: "F5 to refresh"). + // schedule_agents_refetch_for_tab no-ops when the view + // isn't primed and coalesces with an in-flight fetch. + let tab_id = self.active_tab_key().to_string(); + self.schedule_agents_refetch_for_tab(&tab_id); + } _ => {} } return; @@ -11590,6 +11597,29 @@ mod tests { assert_eq!(cmd.session_id.as_deref(), Some("a")); } + // F5 in the session-management view refetches the session list (footer + // hint: "F5 to refresh"). When no fetch is in flight it dispatches a + // fresh sessions/list request to master. + #[test] + fn f5_in_session_view_refetches_sessions() { + use crossterm::event::{KeyCode, KeyEvent, KeyModifiers}; + let (mut app, mut master_rx) = test_app_with_master_rx(); + let tab_id = app.active_tab_key().to_string(); + app.open_agents_view_for_tab(tab_id); + + // Drain the open-time refetch and clear the in-flight flag so the F5 + // refetch is dispatched fresh instead of just coalescing to dirty. + let _ = master_rx.try_recv(); + app.current_tab_mut().agents_view.refetch_in_flight = false; + + app.handle_key(KeyEvent::new(KeyCode::F(5), KeyModifiers::NONE)); + + match master_rx.try_recv().expect("F5 must request sessions/list") { + crate::protocol::acp::client::MasterExtRequest::SessionsList { .. } => {} + other => panic!("expected SessionsList, got {other:?}"), + } + } + #[test] fn enter_on_history_row_dispatches_new_tab_with_resume() { use crate::agent_sessions::{CliSource, SessionEvent}; From f62e51ffda1a8c6e2068928f2d2e75e776f7450d Mon Sep 17 00:00:00 2001 From: DDKinger Date: Wed, 24 Jun 2026 10:30:02 +0800 Subject: [PATCH 2/4] F5 in session view rescans historical logs on master + shows loading MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Make F5 in the session-management (Agents) view reload the on-disk historical session logs via master — the same `load_for_cli` scan the startup history seed runs — instead of just re-listing master's cached registry snapshot. - Thread a `rescan` flag helper->master on `sessions/list`: F5 sets a sticky `pending_rescan` (survives in-flight coalescing); the helper forwards it; master, on rescan, runs `load_for_cli` off the LocalSet (spawn_blocking), upserts the results into the registry, then answers. A normal 5s poll / view-open / `wta sessions list` stay snapshot-only, and legacy empty `{}` params deserialize as rescan=false. - After a successful rescan, master broadcasts `sessions/changed` so every window/tab with the view open refetches immediately (matching the startup scan) rather than waiting up to 5s. The triggered refetches are rescan=false, so they neither re-scan disk nor re-broadcast (no loop). - Show the loading shimmer for the whole F5 refresh via a new `rescan_in_flight` flag, so F5 has visible feedback even when the list already has rows. A normal poll keeps it false and never flashes. Adds unit tests for the rescan threading, the wire round-trip, and the loading-during-rescan signal. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- tools/wta/src/app.rs | 109 ++++++++++++++---- tools/wta/src/main.rs | 2 +- tools/wta/src/master/mod.rs | 50 +++++++- tools/wta/src/protocol/acp/client.rs | 8 +- .../wta/src/protocol/acp/mock_agent_tests.rs | 2 +- tools/wta/src/session_registry.rs | 43 +++++-- tools/wta/src/ui/agents_view.rs | 33 +++--- tools/wta/src/ui/layout.rs | 21 ++-- 8 files changed, 202 insertions(+), 66 deletions(-) diff --git a/tools/wta/src/app.rs b/tools/wta/src/app.rs index e75246eaf..e896f5e5c 100644 --- a/tools/wta/src/app.rs +++ b/tools/wta/src/app.rs @@ -2091,6 +2091,17 @@ pub struct AgentsViewState { pub dirty: bool, pub next_request_id: u64, pub latest_request_id: Option, + /// Set by F5 in the session view to request a master-side disk re-scan + /// (`load_for_cli`) on the next dispatched `sessions/list`. Sticky across + /// in-flight coalescing: only cleared when a request is actually built, so + /// an F5 pressed while a poll is in flight still rescans on the trailing + /// refetch. Reset on view close. + pub pending_rescan: bool, + /// True while an F5 rescan request is in flight (set when dispatched, + /// cleared when the response/failure lands). Drives the loading shimmer for + /// the whole refresh so F5 has visible feedback even when the list already + /// has rows — a normal 5s poll leaves it false and never flashes loading. + pub rescan_in_flight: bool, } // (Historical-session load-state tracking was removed: the helper no longer @@ -3457,6 +3468,8 @@ impl App { tab.agents_view.refetch_in_flight = false; tab.agents_view.dirty = false; tab.agents_view.focused_sid = None; + tab.agents_view.pending_rescan = false; + tab.agents_view.rescan_in_flight = false; } fn schedule_agents_refetch_for_tab(&mut self, tab_id: &str) { @@ -3474,7 +3487,15 @@ impl App { tab.agents_view.next_request_id = tab.agents_view.next_request_id.wrapping_add(1); let request_id = tab.agents_view.next_request_id; tab.agents_view.latest_request_id = Some(request_id); - crate::protocol::acp::client::MasterExtRequest::SessionsList { request_id } + // Consume the sticky F5 rescan intent only when we actually build a + // request; if we coalesced (in-flight) above, it stays set so the + // trailing refetch carries it. + let rescan = std::mem::take(&mut tab.agents_view.pending_rescan); + // Mirror onto rescan_in_flight so the loading shimmer shows for the + // whole F5 refresh (a normal poll keeps this false). Cleared when + // the response / failure lands. + tab.agents_view.rescan_in_flight = rescan; + crate::protocol::acp::client::MasterExtRequest::SessionsList { request_id, rescan } }; let _ = self.master_request_tx.send(request); } @@ -3515,6 +3536,7 @@ impl App { } else { tab.agents_view.snapshot = Some(sessions.clone()); tab.agents_view.refetch_in_flight = false; + tab.agents_view.rescan_in_flight = false; let dirty = tab.agents_view.dirty; tab.agents_view.dirty = false; dirty @@ -3551,6 +3573,7 @@ impl App { false } else { tab.agents_view.refetch_in_flight = false; + tab.agents_view.rescan_in_flight = false; let dirty = tab.agents_view.dirty; tab.agents_view.dirty = false; dirty @@ -6366,10 +6389,13 @@ impl App { self.project_active_tab_state(); } KeyCode::F(5) => { - // Refresh the session list (footer hint: "F5 to refresh"). - // schedule_agents_refetch_for_tab no-ops when the view - // isn't primed and coalesces with an in-flight fetch. + // Refresh: ask master to re-scan the on-disk historical + // session logs (load_for_cli) like the startup seed, then + // re-list. The sticky pending_rescan flag is consumed when + // schedule actually dispatches, so it survives in-flight + // coalescing. let tab_id = self.active_tab_key().to_string(); + self.tab_mut(&tab_id).agents_view.pending_rescan = true; self.schedule_agents_refetch_for_tab(&tab_id); } _ => {} @@ -6855,22 +6881,25 @@ impl App { self.current_tab_mut().scroll_to_bottom(); } - /// True while the open agents view is waiting on its first `session/list` - /// reply from master — the placeholder snapshot is still the empty Vec - /// primed by `open_agents_view_for_tab` and a refetch is in flight. Drives - /// the loading-shimmer animation while the first snapshot is in flight. + /// True while the open agents view should show the loading shimmer: either + /// waiting on its first `session/list` reply from master (empty placeholder + /// snapshot + refetch in flight) or while an F5 rescan is in flight. Drives + /// the shimmer animation tick so a refresh is visible. fn agents_view_awaiting_snapshot(&self) -> bool { let tab = self.current_tab(); if tab.current_view != View::Agents { return false; } + // First-snapshot OR an F5 rescan; a normal 5s poll keeps + // rescan_in_flight false so it doesn't flash the shimmer. tab.agents_view.refetch_in_flight - && tab + && (tab .agents_view .snapshot .as_deref() .map(|s| s.is_empty()) .unwrap_or(false) + || tab.agents_view.rescan_in_flight) } fn has_activity_indicator(&self) -> bool { @@ -11307,7 +11336,7 @@ mod tests { let (mut app, mut master_rx) = test_app_with_master_rx(); app.open_agents_view_for_tab(DEFAULT_TAB_ID.to_string()); let first_req = match master_rx.try_recv().unwrap() { - crate::protocol::acp::client::MasterExtRequest::SessionsList { request_id } => { + crate::protocol::acp::client::MasterExtRequest::SessionsList { request_id, .. } => { request_id } other => panic!("expected SessionsList, got {other:?}"), @@ -11325,7 +11354,7 @@ mod tests { Some(agent_client_protocol::SessionId::new("b")); app.handle_event(AppEvent::SessionsChanged); let second_req = match master_rx.try_recv().unwrap() { - crate::protocol::acp::client::MasterExtRequest::SessionsList { request_id } => { + crate::protocol::acp::client::MasterExtRequest::SessionsList { request_id, .. } => { request_id } other => panic!("expected SessionsList, got {other:?}"), @@ -11358,7 +11387,7 @@ mod tests { app.handle_event(AppEvent::SessionsChanged); } let first_req = match master_rx.try_recv().expect("one in-flight refetch") { - crate::protocol::acp::client::MasterExtRequest::SessionsList { request_id } => { + crate::protocol::acp::client::MasterExtRequest::SessionsList { request_id, .. } => { request_id } other => panic!("expected SessionsList, got {other:?}"), @@ -11393,7 +11422,7 @@ mod tests { let (mut app, mut master_rx) = test_app_with_master_rx(); app.open_agents_view_for_tab(DEFAULT_TAB_ID.to_string()); let first_req = match master_rx.try_recv().unwrap() { - crate::protocol::acp::client::MasterExtRequest::SessionsList { request_id } => { + crate::protocol::acp::client::MasterExtRequest::SessionsList { request_id, .. } => { request_id } other => panic!("expected SessionsList, got {other:?}"), @@ -11417,7 +11446,7 @@ mod tests { // Kick a second refetch and report it as failed. app.handle_event(AppEvent::SessionsChanged); let second_req = match master_rx.try_recv().expect("second refetch sent") { - crate::protocol::acp::client::MasterExtRequest::SessionsList { request_id } => { + crate::protocol::acp::client::MasterExtRequest::SessionsList { request_id, .. } => { request_id } other => panic!("expected SessionsList, got {other:?}"), @@ -11459,7 +11488,7 @@ mod tests { let (mut app, mut master_rx) = test_app_with_master_rx(); app.open_agents_view_for_tab(DEFAULT_TAB_ID.to_string()); let req_id = match master_rx.try_recv().unwrap() { - crate::protocol::acp::client::MasterExtRequest::SessionsList { request_id } => { + crate::protocol::acp::client::MasterExtRequest::SessionsList { request_id, .. } => { request_id } other => panic!("expected SessionsList, got {other:?}"), @@ -11496,7 +11525,7 @@ mod tests { let (mut app, mut master_rx) = test_app_with_master_rx(); app.open_agents_view_for_tab(DEFAULT_TAB_ID.to_string()); let _stale = match master_rx.try_recv().unwrap() { - crate::protocol::acp::client::MasterExtRequest::SessionsList { request_id } => { + crate::protocol::acp::client::MasterExtRequest::SessionsList { request_id, .. } => { request_id } other => panic!("expected SessionsList, got {other:?}"), @@ -11509,7 +11538,7 @@ mod tests { }); app.handle_event(AppEvent::SessionsChanged); let _fresh = match master_rx.try_recv().unwrap() { - crate::protocol::acp::client::MasterExtRequest::SessionsList { request_id } => { + crate::protocol::acp::client::MasterExtRequest::SessionsList { request_id, .. } => { request_id } other => panic!("expected SessionsList, got {other:?}"), @@ -11554,6 +11583,37 @@ mod tests { assert!(!app.agents_view_awaiting_snapshot()); } + #[test] + fn agents_view_loading_shows_during_f5_rescan() { + let (mut app, _master_rx) = test_app_with_master_rx(); + app.open_agents_view_for_tab(DEFAULT_TAB_ID.to_string()); + // First snapshot landed: rows present, fetch settled — not loading. + app.current_tab_mut().agents_view.snapshot = Some(vec![session_info_for_test("a")]); + app.current_tab_mut().agents_view.refetch_in_flight = false; + assert!(!app.agents_view_awaiting_snapshot(), "a settled list is not loading"); + + // F5 dispatches a rescan: the loading shimmer must show even though the + // list already has rows, so the refresh is visible. + app.current_tab_mut().agents_view.pending_rescan = true; + app.schedule_agents_refetch_for_tab(DEFAULT_TAB_ID); + assert!( + app.agents_view_awaiting_snapshot(), + "F5 rescan must show the loading shimmer even with rows present" + ); + + // The rescan response clears it back to the settled list. + let rid = app + .current_tab() + .agents_view + .latest_request_id + .expect("a request was dispatched"); + app.handle_agents_snapshot_loaded(rid, vec![session_info_for_test("a")]); + assert!( + !app.agents_view_awaiting_snapshot(), + "loading clears once the rescan response lands" + ); + } + 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), @@ -11607,15 +11667,22 @@ mod tests { let tab_id = app.active_tab_key().to_string(); app.open_agents_view_for_tab(tab_id); - // Drain the open-time refetch and clear the in-flight flag so the F5 - // refetch is dispatched fresh instead of just coalescing to dirty. - let _ = master_rx.try_recv(); + // The open-time refetch must be snapshot-only (no disk rescan). + match master_rx.try_recv().expect("open requests sessions/list") { + crate::protocol::acp::client::MasterExtRequest::SessionsList { rescan, .. } => { + assert!(!rescan, "view-open refetch must not rescan"); + } + other => panic!("expected SessionsList, got {other:?}"), + } + // Clear the in-flight flag so the F5 refetch dispatches fresh. app.current_tab_mut().agents_view.refetch_in_flight = false; app.handle_key(KeyEvent::new(KeyCode::F(5), KeyModifiers::NONE)); match master_rx.try_recv().expect("F5 must request sessions/list") { - crate::protocol::acp::client::MasterExtRequest::SessionsList { .. } => {} + crate::protocol::acp::client::MasterExtRequest::SessionsList { rescan, .. } => { + assert!(rescan, "F5 must request a master-side disk rescan"); + } other => panic!("expected SessionsList, got {other:?}"), } } diff --git a/tools/wta/src/main.rs b/tools/wta/src/main.rs index f0e8a0913..6989c1e92 100644 --- a/tools/wta/src/main.rs +++ b/tools/wta/src/main.rs @@ -1289,7 +1289,7 @@ async fn fetch_sessions_from_master( ); init_result.map_err(|_| anyhow::anyhow!(MASTER_NOT_RUNNING))?; - let req = session_registry::build_sessions_list_request(); + let req = session_registry::build_sessions_list_request(false); let resp = conn .ext_method(req) .await diff --git a/tools/wta/src/master/mod.rs b/tools/wta/src/master/mod.rs index afa5e08d4..6d9789b48 100644 --- a/tools/wta/src/master/mod.rs +++ b/tools/wta/src/master/mod.rs @@ -2232,7 +2232,7 @@ async fn handle_sessions_list_with( where F: Fn(crate::agent_sessions::CliSource, &str) -> Option + Copy, { - crate::session_registry::parse_sessions_list_params(params).map_err(|err| { + let parsed = crate::session_registry::parse_sessions_list_params(params).map_err(|err| { tracing::warn!( target: "master", op = "sessions_list", @@ -2242,6 +2242,50 @@ where acp::Error::invalid_params().data(serde_json::json!({ "message": err.to_string() })) })?; + // F5 refresh: re-scan the on-disk historical session logs and upsert them, + // exactly like the startup history seed. Run the blocking disk walk off the + // LocalSet so master stays responsive; on failure fall through to the + // cached snapshot rather than erroring the request. + if parsed.rescan { + let cli = state.cli_source.clone(); + match tokio::task::spawn_blocking(move || { + crate::history_loader::load_for_cli(cli.as_ref()) + }) + .await + { + Ok(sessions) => { + let count = sessions.len(); + for s in &sessions { + let info = crate::session_registry::agent_session_to_session_info(s); + state.registry.upsert(info).await; + } + tracing::info!( + target: "master_history", + count, + "sessions/list rescan: reloaded historical sessions from disk" + ); + // Tell every helper with the session view open to refetch, so + // the freshly-loaded historical rows surface immediately in all + // windows/tabs — matching the startup history scan's broadcast + // instead of waiting up to 5s for the next periodic poll. The + // triggered refetches are rescan=false snapshots: they neither + // re-scan disk nor re-broadcast, so there's no feedback loop. + broadcast_ext_to_helpers( + state, + crate::session_registry::build_sessions_changed_notification(), + ) + .await; + } + Err(e) => { + tracing::warn!( + target: "master_history", + error = %e, + "sessions/list rescan task panicked; returning cached registry" + ); + } + } + } + for row in state.registry.snapshot().await { // `try_refresh_title_from_disk_with` no-ops internally unless the title // is still synthetic and a `cli_source` is present, so we can call it @@ -3882,7 +3926,7 @@ mod tests { row.last_activity_at_ms = Some(42); state.registry.upsert(row.clone()).await; - let req = session_registry::build_sessions_list_request(); + let req = session_registry::build_sessions_list_request(false); let resp = handle_sessions_list(&state, &req.params) .await .expect("sessions/list succeeds"); @@ -3912,7 +3956,7 @@ mod tests { // title left None → synthetic, exactly as at born-bound launch time. state.registry.upsert(row).await; - let req = session_registry::build_sessions_list_request(); + let req = session_registry::build_sessions_list_request(false); let resp = handle_sessions_list_with(&state, &req.params, |cli, key| { assert_eq!(cli, crate::agent_sessions::CliSource::Copilot); assert_eq!(key, "born-bound"); diff --git a/tools/wta/src/protocol/acp/client.rs b/tools/wta/src/protocol/acp/client.rs index 7b5a73f2a..f44a5f304 100644 --- a/tools/wta/src/protocol/acp/client.rs +++ b/tools/wta/src/protocol/acp/client.rs @@ -130,6 +130,10 @@ pub struct RestartRequest { pub enum MasterExtRequest { SessionsList { request_id: u64, + /// When true, master re-scans the on-disk historical session logs + /// (`load_for_cli`) before answering — the F5 refresh path — instead of + /// returning the cached registry snapshot. + rescan: bool, }, SessionResumeDispatched { request_id: u64, @@ -2535,8 +2539,8 @@ fn dispatch_master_ext_request( let tab_to_session = Arc::clone(tab_to_session); tokio::task::spawn_local(async move { match req { - MasterExtRequest::SessionsList { request_id } => { - let wire = crate::session_registry::build_sessions_list_request(); + MasterExtRequest::SessionsList { request_id, rescan } => { + let wire = crate::session_registry::build_sessions_list_request(rescan); // Bound the wait so a single dropped RPC response can't // permanently strand the tab's `refetch_in_flight=true`. // diff --git a/tools/wta/src/protocol/acp/mock_agent_tests.rs b/tools/wta/src/protocol/acp/mock_agent_tests.rs index 9a818c802..486bd8e64 100644 --- a/tools/wta/src/protocol/acp/mock_agent_tests.rs +++ b/tools/wta/src/protocol/acp/mock_agent_tests.rs @@ -1385,7 +1385,7 @@ async fn dispatch_master_ext_sessions_list_loads_snapshot() { let mut event_rx = h.event_rx; dispatch_master_ext_request( - MasterExtRequest::SessionsList { request_id: 7 }, + MasterExtRequest::SessionsList { request_id: 7, rescan: false }, &h.conn, &h.event_tx, &tab_to_session, diff --git a/tools/wta/src/session_registry.rs b/tools/wta/src/session_registry.rs index 5c2628b20..0caa72361 100644 --- a/tools/wta/src/session_registry.rs +++ b/tools/wta/src/session_registry.rs @@ -187,7 +187,15 @@ pub struct SessionRemovedParams { pub struct SessionsChangedParams {} #[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize, PartialEq, Eq)] -pub struct SessionsListParams {} +pub struct SessionsListParams { + /// When true, master re-scans the on-disk historical session logs + /// (`load_for_cli`) and upserts them into the registry before answering — + /// the F5 refresh path. `#[serde(default)]` keeps old empty `{}` params + /// deserializing as false, so the periodic 5s poll and view-open stay on + /// the cheap snapshot-only path. + #[serde(default)] + pub rescan: bool, +} #[derive(Debug, Clone, serde::Serialize, serde::Deserialize, PartialEq, Eq)] pub struct SessionsListResponse { @@ -228,9 +236,10 @@ pub fn build_sessions_changed_notification() -> acp::ExtNotification { acp::ExtNotification::new(INTELLTERM_METHOD_SESSIONS_CHANGED, Arc::from(raw)) } -/// Build an `ExtRequest` for `intellterm.wta/sessions/list`. -pub fn build_sessions_list_request() -> acp::ExtRequest { - let json = serde_json::to_string(&SessionsListParams::default()) +/// Build an `ExtRequest` for `intellterm.wta/sessions/list`. `rescan` asks +/// master to re-load the on-disk historical session logs before answering. +pub fn build_sessions_list_request(rescan: bool) -> acp::ExtRequest { + let json = serde_json::to_string(&SessionsListParams { rescan }) .expect("SessionsListParams is trivially serializable"); let raw = serde_json::value::RawValue::from_string(json) .expect("serde_json::to_string always produces valid JSON"); @@ -1863,10 +1872,30 @@ mod tests { } #[test] - fn build_sessions_list_request_round_trips_empty_params() { - let req = build_sessions_list_request(); + fn build_sessions_list_request_round_trips_rescan() { + let req = build_sessions_list_request(false); assert_eq!(&*req.method, INTELLTERM_METHOD_SESSIONS_LIST); - parse_sessions_list_params(&req.params).expect("empty object params are valid"); + assert!( + !parse_sessions_list_params(&req.params) + .expect("params are valid") + .rescan + ); + + let req_rescan = build_sessions_list_request(true); + assert!( + parse_sessions_list_params(&req_rescan.params) + .expect("params are valid") + .rescan + ); + + // Backward compat: a legacy empty `{}` params object (older helper / + // master that predates the flag) deserializes as rescan=false. + let empty = serde_json::value::RawValue::from_string("{}".to_string()).unwrap(); + assert!( + !parse_sessions_list_params(&empty) + .expect("empty is valid") + .rescan + ); } #[test] diff --git a/tools/wta/src/ui/agents_view.rs b/tools/wta/src/ui/agents_view.rs index 79c206dff..d3d293edb 100644 --- a/tools/wta/src/ui/agents_view.rs +++ b/tools/wta/src/ui/agents_view.rs @@ -40,16 +40,12 @@ pub fn render( // up with the cursor / Enter dispatch model. Caller threads the // stored `app.sessions_origin_filter`. origin_filter: OriginFilter, - // True iff the session management view is waiting on its first `session/list` - // snapshot from master (snapshot is currently empty AND a refetch - // request is in flight). Without this signal we have no way to - // distinguish "view just opened, master hasn't responded yet" from - // "view loaded, there really are zero sessions" — `open_agents_view` - // primes `snapshot = Some(Vec::new())` so the historical - // `!snapshot.is_some()` heuristic for the loading shimmer is always - // false after PR #73. Caller (ui::layout) computes this from - // `tab.agents_view.refetch_in_flight && snapshot.is_empty()`. - awaiting_first_snapshot: bool, + // True while the loading shimmer should replace the list: either waiting on + // the first `session/list` snapshot from master (empty placeholder + a + // refetch in flight) OR an F5 rescan is in flight, so a refresh is visible + // even when the list already has rows. Caller (ui::layout) computes it from + // `refetch_in_flight && (snapshot.is_empty() || rescan_in_flight)`. + show_loading: bool, ) { // No in-TUI header: the "Agent sessions" title lives in the C++ agent // bar above this pane (AgentPaneContent::SetSessionsView), so we render @@ -175,16 +171,13 @@ pub fn render( "rendering agents view" ); - // While the view is waiting on its first `session/list` snapshot from - // master, replace the whole list with a single shimmer-styled loading - // row. Showing live rows alongside a dim "loading…" hint led users to - // think the list was complete and dismiss the view before the snapshot - // arrived. The session view was just opened, master hasn't yet replied - // to our `session/list` refetch, and the placeholder snapshot is still - // the empty Vec primed by `open_agents_view_for_tab`; without this the - // user sees a blank list and can't tell loading from "really empty". - let snapshot_loading = awaiting_first_snapshot && sorted.is_empty(); - if snapshot_loading { + // While loading — the first `session/list` snapshot, or an F5 rescan — + // replace the whole list with a single shimmer-styled loading row. Showing + // live rows alongside a dim "loading…" hint led users to think the list was + // complete and dismiss the view before the snapshot arrived; replacing the + // list also gives F5 an unmistakable "refreshing now" signal even when rows + // are already present. + if show_loading { render_left_bar(f, area.x, list_area, None); let mut spans: Vec> = vec![Span::raw(" ")]; let loading_label = t!("agents.loading").into_owned(); diff --git a/tools/wta/src/ui/layout.rs b/tools/wta/src/ui/layout.rs index 12a1eff95..658d83f15 100644 --- a/tools/wta/src/ui/layout.rs +++ b/tools/wta/src/ui/layout.rs @@ -51,20 +51,19 @@ pub fn render(frame: &mut Frame, app: &mut App) { let cli_filter = app.current_cli_filter(); let origin_filter = app.sessions_origin_filter; let tab = app.tab_sessions.entry(tab_id).or_default(); - // Show the loading shimmer while we're waiting on the very first - // `session/list` response from master. `open_agents_view_for_tab` - // primes snapshot to `Some(Vec::new())` *and* sets - // `refetch_in_flight = true`, so this flag is true exactly until - // master returns either a populated list (clears refetch_in_flight, - // shimmer turns into rows) or an empty list (clears - // refetch_in_flight, shimmer turns into the genuine empty state). - let awaiting_first_snapshot = tab.agents_view.refetch_in_flight - && tab + // Show the loading shimmer while waiting on the very first + // `session/list` response from master (empty placeholder snapshot + + // refetch in flight) OR while an F5 rescan is in flight — so F5 gives + // visible feedback even when the list already has rows. A normal 5s + // poll keeps `rescan_in_flight` false and therefore does not flash it. + let show_loading = tab.agents_view.refetch_in_flight + && (tab .agents_view .snapshot .as_deref() .map(|s| s.is_empty()) - .unwrap_or(false); + .unwrap_or(false) + || tab.agents_view.rescan_in_flight); agents_view::render( frame, area, @@ -74,7 +73,7 @@ pub fn render(frame: &mut Frame, app: &mut App) { activity_frame, cli_filter.as_ref(), origin_filter, - awaiting_first_snapshot, + show_loading, ); return; } From c71ca1841d375a34c9410d65d8e3040f2248ac19 Mon Sep 17 00:00:00 2001 From: DDKinger Date: Wed, 24 Jun 2026 12:46:46 +0800 Subject: [PATCH 3/4] Filter WSL history by CLI before parsing, not after The WSL scan extracts all four CLIs' session files from the running distro into a temp $HOME-mirror, then parsed all four and discarded the non-selected ones via retain_wsl_cli. Since a master is single-CLI, that parsed (and threw away) up to three CLIs' transcripts on every scan. Move the filter ahead of the parse: load_all_in now takes a cli_filter and reuses cli_scan_flags (the host path's dispatch) to run only the selected CLI's loader, so the other CLIs' transcripts in the extracted mirror are never parsed. Thread cli_filter through scan_running_distros -> scan_distros -> scan_distro_with -> load_all_in and drop the now-redundant retain_wsl_cli. The tar/extract is unchanged (the fetch script still tars all four), so this saves only the parse cost, not the per-distro wsl.exe + tar/extract overhead. Behavior is preserved: None / custom agents still scan all four. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- tools/wta/src/history_loader.rs | 94 ++++++++++----------------------- tools/wta/src/wsl.rs | 56 ++++++++++++++++---- 2 files changed, 76 insertions(+), 74 deletions(-) diff --git a/tools/wta/src/history_loader.rs b/tools/wta/src/history_loader.rs index 533eb8fb2..05fa58188 100644 --- a/tools/wta/src/history_loader.rs +++ b/tools/wta/src/history_loader.rs @@ -103,34 +103,37 @@ pub(crate) fn wsl_sessions_enabled() -> bool { } } -/// Run the four per-CLI scanners against a specific `home` (the real -/// user profile for host rows, or a temp `$HOME`-mirror extracted from a -/// WSL distro). Caps each CLI at [`MAX_PER_CLI`]. Used by the WSL scan -/// (`crate::wsl`) to reuse the host parsers verbatim over an extracted -/// distro `$HOME`; the host path goes through [`load_for_cli`] instead. -pub(crate) fn load_all_in(home: &Path) -> Vec { +/// Run the per-CLI scanners against a specific `home` (the real user +/// profile for host rows, or a temp `$HOME`-mirror extracted from a WSL +/// distro), restricted to a single CLI when `cli_filter` is `Some(known)` +/// (see [`cli_scan_flags`]). Caps each CLI at [`MAX_PER_CLI`]. Used by the +/// WSL scan (`crate::wsl`) to reuse the host parsers verbatim over an +/// extracted distro `$HOME`; the host path goes through [`load_for_cli`]. +/// +/// Filtering here — *before* the parse — means a CLI the view isn't showing +/// is never parsed, so the WSL scan doesn't pay to read + parse the other +/// three CLIs' transcripts out of the extracted mirror just to discard them. +pub(crate) fn load_all_in(home: &Path, cli_filter: Option<&CliSource>) -> Vec { // The WSL temp `$HOME` has no agent-pane (Class A) sessions, so pass an // empty index to the production `_indexed` loaders (the bare wrappers are // test-only). Reuses the host parsers verbatim over the extracted distro // home. let empty = HashSet::new(); + let (cop, cla, gem, cod) = cli_scan_flags(cli_filter); let mut out = Vec::new(); - out.extend(take_n(load_copilot_indexed(home, &empty), MAX_PER_CLI)); - out.extend(take_n(load_claude_indexed(home, &empty), MAX_PER_CLI)); - out.extend(take_n(load_gemini_indexed(home, &empty), MAX_PER_CLI)); - out.extend(take_n(load_codex_indexed(home, &empty), MAX_PER_CLI)); - out -} - -/// Retain only the requested CLI's WSL rows, mirroring the host-side -/// `cli_scan_flags` behavior: a known CLI filter keeps just that CLI; -/// `None` or a custom/unknown agent keeps all four. -fn retain_wsl_cli(rows: &mut Vec, cli_filter: Option<&CliSource>) { - if let Some(want) = cli_filter { - if !matches!(want, CliSource::Unknown(_)) { - rows.retain(|s| &s.cli_source == want); - } + if cop { + out.extend(take_n(load_copilot_indexed(home, &empty), MAX_PER_CLI)); + } + if cla { + out.extend(take_n(load_claude_indexed(home, &empty), MAX_PER_CLI)); } + if gem { + out.extend(take_n(load_gemini_indexed(home, &empty), MAX_PER_CLI)); + } + if cod { + out.extend(take_n(load_codex_indexed(home, &empty), MAX_PER_CLI)); + } + out } /// Cap the discovery-phase first-line read (`read_first_line`) so a corrupt @@ -171,9 +174,10 @@ pub fn load_for_cli(cli_filter: Option<&CliSource>) -> Vec { // Stopped (non-running) distros are intentionally skipped: reading one // boots its WSL VM, which is too costly to do just to build a list. if wsl_sessions_enabled() { - let mut wsl_rows = crate::wsl::scan_running_distros(); - retain_wsl_cli(&mut wsl_rows, cli_filter); - out.extend(wsl_rows); + // Filtering happens inside the parse (`load_all_in` via + // `cli_scan_flags`), so an unselected CLI's transcripts are never + // parsed out of the extracted mirror — no post-hoc retain needed. + out.extend(crate::wsl::scan_running_distros(cli_filter)); } let Some(home) = home_dir() else { return out }; @@ -3067,44 +3071,4 @@ mod tests { assert!(wsl_sessions_enabled()); std::env::remove_var("WTA_WSL_SESSIONS"); } - - fn wsl_row(cli: CliSource) -> AgentSession { - AgentSession { - key: "k".into(), - cli_source: cli, - pane_session_id: None, - window_id: None, - tab_id: None, - title: "t".into(), - cwd: std::path::PathBuf::from("/home/u"), - started_at: SystemTime::UNIX_EPOCH, - last_activity_at: SystemTime::UNIX_EPOCH, - status: AgentStatus::Historical, - last_error: None, - current_tool: None, - attention_reason: None, - log_path: None, - origin: crate::agent_sessions::SessionOrigin::default(), - location: crate::agent_sessions::SessionLocation::Wsl { - distro: "Ubuntu".into(), - }, - } - } - - #[test] - fn retain_wsl_cli_keeps_known_filters_else_all() { - let base = || vec![wsl_row(CliSource::Copilot), wsl_row(CliSource::Claude)]; - let mut known = base(); - retain_wsl_cli(&mut known, Some(&CliSource::Copilot)); - assert_eq!(known.len(), 1); - assert_eq!(known[0].cli_source, CliSource::Copilot); - - let mut none = base(); - retain_wsl_cli(&mut none, None); - assert_eq!(none.len(), 2, "None keeps all CLIs"); - - let mut unknown = base(); - retain_wsl_cli(&mut unknown, Some(&CliSource::Unknown(String::new()))); - assert_eq!(unknown.len(), 2, "Unknown (custom agent) keeps all CLIs"); - } -} +} \ No newline at end of file diff --git a/tools/wta/src/wsl.rs b/tools/wta/src/wsl.rs index e9797b947..7ca688e10 100644 --- a/tools/wta/src/wsl.rs +++ b/tools/wta/src/wsl.rs @@ -10,7 +10,7 @@ //! Running distros only: touching a *stopped* distro's filesystem //! auto-boots its VM (multi-second stall, GH#9541), so we never do it. -use crate::agent_sessions::{AgentSession, SessionLocation}; +use crate::agent_sessions::{AgentSession, CliSource, SessionLocation}; use std::path::{Path, PathBuf}; use std::time::Duration; @@ -25,7 +25,12 @@ const WSL_LIST_TIMEOUT: Duration = Duration::from_secs(10); /// /// `fetch_tar(distro) -> Option`; `extract(bytes, dest)` /// materializes a `$HOME`-mirror at `dest`. -pub(crate) fn scan_distro_with(distro: &str, fetch_tar: F, extract: E) -> Vec +pub(crate) fn scan_distro_with( + distro: &str, + fetch_tar: F, + extract: E, + cli_filter: Option<&CliSource>, +) -> Vec where F: FnOnce(&str) -> Option>, E: FnOnce(&[u8], &Path) -> std::io::Result<()>, @@ -47,7 +52,7 @@ where tracing::warn!(target: "wsl", distro, %err, "tar extract failed"); return Vec::new(); } - let mut rows = crate::history_loader::load_all_in(tmp.path()); + let mut rows = crate::history_loader::load_all_in(tmp.path(), cli_filter); let loc = SessionLocation::Wsl { distro: distro.to_string(), }; @@ -59,15 +64,15 @@ where /// Enumerate running distros and scan each, using the real spawn/extract. /// Fast (no VM boot) — used for the initial session list. -pub fn scan_running_distros() -> Vec { - scan_distros(running_distros()) +pub fn scan_running_distros(cli_filter: Option<&CliSource>) -> Vec { + scan_distros(running_distros(), cli_filter) } /// Scan a specific set of distros, using the real spawn/extract. -fn scan_distros(distros: Vec) -> Vec { +fn scan_distros(distros: Vec, cli_filter: Option<&CliSource>) -> Vec { let mut out = Vec::new(); for distro in distros { - let rows = scan_distro_with(&distro, fetch_distro_tar, extract_tar_stream); + let rows = scan_distro_with(&distro, fetch_distro_tar, extract_tar_stream, cli_filter); tracing::info!(target: "wsl", distro = %distro, rows = rows.len(), "scanned distro"); out.extend(rows); } @@ -357,7 +362,7 @@ mod tests { Ok(()) }; - let rows = scan_distro_with("Ubuntu", fetch, extract); + let rows = scan_distro_with("Ubuntu", fetch, extract, None); assert_eq!(rows.len(), 1, "expected one Copilot row"); assert_eq!( rows[0].location, @@ -372,6 +377,39 @@ mod tests { fn scan_distro_empty_fetch_yields_no_rows() { let fetch = |_d: &str| None; let extract = |_b: &[u8], _d: &std::path::Path| Ok(()); - assert!(scan_distro_with("Ubuntu", fetch, extract).is_empty()); + assert!(scan_distro_with("Ubuntu", fetch, extract, None).is_empty()); + } + + #[test] + fn scan_distro_with_cli_filter_parses_only_selected_cli() { + // Same Copilot-only fixture as scan_distro_stamps_rows_with_wsl_location, + // but as named fns so the same fixture can drive two scans. + fn fetch(_distro: &str) -> Option> { + Some(vec![1u8, 2, 3]) + } + fn extract(_bytes: &[u8], dest: &std::path::Path) -> std::io::Result<()> { + let dir = dest + .join(".copilot") + .join("session-state") + .join("11111111-2222-3333-4444-555555555555"); + std::fs::create_dir_all(&dir)?; + std::fs::write( + dir.join("workspace.yaml"), + "id: 11111111-2222-3333-4444-555555555555\ncwd: /home/u/proj\nsummary: hello wsl\n", + )?; + std::fs::write(dir.join("events.jsonl"), "{\"type\":\"user\"}\n")?; + Ok(()) + } + + // Filtering to the CLI that's present parses + returns it. + let cop = scan_distro_with("Ubuntu", fetch, extract, Some(&CliSource::Copilot)); + assert_eq!(cop.len(), 1, "selected CLI is parsed"); + assert_eq!(cop[0].cli_source, CliSource::Copilot); + + // Filtering to a different CLI skips Copilot's parse entirely, even + // though its files sit in the extracted mirror — this is the + // parse-time filter that avoids reading other CLIs' transcripts. + let cla = scan_distro_with("Ubuntu", fetch, extract, Some(&CliSource::Claude)); + assert!(cla.is_empty(), "unselected CLI's transcripts are never parsed"); } } From 567fdd6f970dd787bd75a7d8fa75347295560df3 Mon Sep 17 00:00:00 2001 From: DDKinger Date: Wed, 24 Jun 2026 14:06:17 +0800 Subject: [PATCH 4/4] Don't let F5 rescan clobber live sessions (upsert_if_absent) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The F5 history rescan (and the startup history seed) upserted disk-loaded rows — status Historical, no pane binding — straight into master's registry. `upsert` is insert-or-replace, so a reloaded Historical row overwrote a live session's entry, dropping its status and pane binding; the session list then showed the open session as Historical. Add `SessionRegistry::upsert_if_absent` (atomic check-and-insert in InMemoryRegistry, lookup-then-upsert default on the trait) and use it in both the F5 rescan and the startup scan, so a reloaded row never replaces a session already in the registry. Titles still refresh for existing rows via the post-rescan `try_refresh_title_from_disk_with` pass. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- tools/wta/src/master/mod.rs | 4 +-- tools/wta/src/session_registry.rs | 59 +++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 2 deletions(-) diff --git a/tools/wta/src/master/mod.rs b/tools/wta/src/master/mod.rs index 6d9789b48..2e9a8cb8c 100644 --- a/tools/wta/src/master/mod.rs +++ b/tools/wta/src/master/mod.rs @@ -1646,7 +1646,7 @@ async fn run_master_loop(cli: Cli, pipe_name: String) -> Result<()> { let count = sessions.len(); for s in &sessions { let info = crate::session_registry::agent_session_to_session_info(s); - inner_for_history.registry.upsert(info).await; + inner_for_history.registry.upsert_if_absent(info).await; } tracing::info!( target: "master_history", @@ -2257,7 +2257,7 @@ where let count = sessions.len(); for s in &sessions { let info = crate::session_registry::agent_session_to_session_info(s); - state.registry.upsert(info).await; + state.registry.upsert_if_absent(info).await; } tracing::info!( target: "master_history", diff --git a/tools/wta/src/session_registry.rs b/tools/wta/src/session_registry.rs index 0caa72361..c4b1cab4b 100644 --- a/tools/wta/src/session_registry.rs +++ b/tools/wta/src/session_registry.rs @@ -818,6 +818,18 @@ pub trait SessionRegistry: Send + Sync { /// twice with the same `session_id` keeps only the latest copy. async fn upsert(&self, info: SessionInfo); + /// Insert `info` only if no row already exists for `info.session_id`. + /// Unlike [`upsert`](Self::upsert), this never replaces an existing row — + /// used by the history (re)scan so a reloaded **Historical** disk row can't + /// clobber a live session's status / pane binding (the row a live session + /// already occupies). The default impl is a (non-atomic) lookup-then-upsert; + /// `InMemoryRegistry` overrides it with an atomic check under one lock. + async fn upsert_if_absent(&self, info: SessionInfo) { + if self.lookup(&info.session_id).await.is_none() { + self.upsert(info).await; + } + } + /// Remove the row for `sid`. Returns the prior value if any (the master /// uses this both for routing teardown and to know what to broadcast /// in `session_removed` ext-notifications). @@ -896,6 +908,13 @@ impl SessionRegistry for InMemoryRegistry { upsert_locked(&mut guard, info); } + async fn upsert_if_absent(&self, info: SessionInfo) { + let mut guard = self.inner.lock().await; + if !guard.sessions.contains_key(&info.session_id) { + upsert_locked(&mut guard, info); + } + } + async fn remove(&self, sid: &acp::SessionId) -> Option { let mut guard = self.inner.lock().await; remove_locked(&mut guard, sid) @@ -1419,6 +1438,46 @@ mod tests { assert_eq!(reg.snapshot().await.len(), 1, "no duplicate rows"); } + #[tokio::test] + async fn upsert_if_absent_preserves_existing_row_and_adds_new() { + let reg = InMemoryRegistry::new(); + + // A live row: bound pane + a non-historical status. + let mut live = info("sess-1", Some("pane-A")); + live.status = Some(AgentStatus::Idle); + reg.upsert(live).await; + + // A history-scan row for the SAME id (Historical, no pane) — exactly + // what an F5 rescan reloads from disk. It must NOT replace the live row. + let mut historical = info("sess-1", None); + historical.status = Some(AgentStatus::Historical); + reg.upsert_if_absent(historical).await; + + let got = reg + .lookup(&acp::SessionId::new("sess-1".to_string())) + .await + .expect("row present"); + assert_eq!( + got.status, + Some(AgentStatus::Idle), + "rescan must not downgrade a live session to Historical" + ); + assert_eq!( + got.pane_session_id.as_deref(), + Some("pane-A"), + "rescan must not drop the live pane binding" + ); + + // A genuinely new session (absent from the registry) IS added. + reg.upsert_if_absent(info("sess-2", None)).await; + assert!( + reg.lookup(&acp::SessionId::new("sess-2".to_string())) + .await + .is_some(), + "a new disk session is surfaced" + ); + } + #[tokio::test] async fn remove_returns_prior_and_subsequent_lookup_is_none() { let reg = InMemoryRegistry::new();