diff --git a/tools/wta/Cargo.lock b/tools/wta/Cargo.lock index 36c5b288f..5b958f664 100644 --- a/tools/wta/Cargo.lock +++ b/tools/wta/Cargo.lock @@ -582,6 +582,12 @@ dependencies = [ "regex", ] +[[package]] +name = "fastrand" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" + [[package]] name = "filedescriptor" version = "0.8.3" @@ -1967,6 +1973,19 @@ dependencies = [ "libc", ] +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom 0.4.2", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + [[package]] name = "terminfo" version = "0.9.0" @@ -2832,6 +2851,7 @@ dependencies = [ "serde", "serde_json", "sys-locale", + "tempfile", "textwrap", "tokio", "tokio-util", diff --git a/tools/wta/Cargo.toml b/tools/wta/Cargo.toml index 7461ef42b..e2efdb855 100644 --- a/tools/wta/Cargo.toml +++ b/tools/wta/Cargo.toml @@ -44,3 +44,6 @@ which = "7" uuid = { version = "1", features = ["v4"] } rust-i18n = "3" sys-locale = "0.3" + +[dev-dependencies] +tempfile = "3" diff --git a/tools/wta/locales/af-ZA.yml b/tools/wta/locales/af-ZA.yml index 6c27a60da..fb17f3135 100644 --- a/tools/wta/locales/af-ZA.yml +++ b/tools/wta/locales/af-ZA.yml @@ -204,6 +204,7 @@ system.choice_execution_failed: "Keuse %{choice} het misluk: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Kies die model vir hierdie paneel (/model om direk oor te skakel)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Kies model (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Die gekoppelde agent het geen kiesbare modelle aangekondig nie." system.model_set: "Model vir hierdie paneel gestel op %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/am-ET.yml b/tools/wta/locales/am-ET.yml index 9d6b6e5f8..3370383fe 100644 --- a/tools/wta/locales/am-ET.yml +++ b/tools/wta/locales/am-ET.yml @@ -204,6 +204,7 @@ system.choice_execution_failed: "ምርጫ %{choice} አልተሳካም፦ %{err # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "ለዚህ ፓነል ሞዴሉን ይምረጡ (በቀጥታ ለመቀየር /model )" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "ሞዴል ይምረጡ (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "የተገናኘው ኤጅንት ምንም ሊመረጥ የሚችል ሞዴል አላስታወቀም።" system.model_set: "የዚህ ፓነል ሞዴል ወደ %{model} ተቀናብሯል።" # {Locked="%{model}"} diff --git a/tools/wta/locales/ar-SA.yml b/tools/wta/locales/ar-SA.yml index af7e5af59..7844ccbc6 100644 --- a/tools/wta/locales/ar-SA.yml +++ b/tools/wta/locales/ar-SA.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "فشل الاختيار %{choice}: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "اختر النموذج لهذه اللوحة (/model للتبديل مباشرةً)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "اختر النموذج (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "لم يُعلن عامل الذكاء الاصطناعي المتصل عن أي نماذج قابلة للاختيار." system.model_set: "تم تعيين نموذج هذه اللوحة إلى %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/as-IN.yml b/tools/wta/locales/as-IN.yml index 1a1393d8a..ee5a29304 100644 --- a/tools/wta/locales/as-IN.yml +++ b/tools/wta/locales/as-IN.yml @@ -206,6 +206,7 @@ system.choice_execution_failed: "পছন্দ %{choice} ব্যৰ্থ # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "এই পেনৰ বাবে মডেল বাছনি কৰক (পোনপটীয়াকৈ সলাবলৈ /model )" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "মডেল বাছনি কৰক (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "সংযুক্ত এজেণ্টে কোনো বাছনিযোগ্য মডেল ঘোষণা কৰা নাই।" system.model_set: "এই পেনৰ বাবে মডেল %{model} লৈ ছেট কৰা হ'ল।" # {Locked="%{model}"} diff --git a/tools/wta/locales/az-Latn-AZ.yml b/tools/wta/locales/az-Latn-AZ.yml index 661daf64b..f0299d2fb 100644 --- a/tools/wta/locales/az-Latn-AZ.yml +++ b/tools/wta/locales/az-Latn-AZ.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "Seçim %{choice} uğursuz oldu: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Bu panel üçün modeli seçin (birbaşa keçmək üçün /model )" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Model seçin (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Qoşulmuş agent heç bir seçilə bilən model elan etmədi." system.model_set: "Bu panel üçün model %{model} olaraq təyin edildi." # {Locked="%{model}"} diff --git a/tools/wta/locales/bg-BG.yml b/tools/wta/locales/bg-BG.yml index f6fb7ee08..5aa0d6c82 100644 --- a/tools/wta/locales/bg-BG.yml +++ b/tools/wta/locales/bg-BG.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "Избор %{choice} е неуспешен: %{e # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Изберете модела за този панел (/model за директно превключване)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Изберете модел (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Свързаният агент не обяви никакви избираеми модели." system.model_set: "Моделът за този панел е зададен на %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/bn-IN.yml b/tools/wta/locales/bn-IN.yml index 2ec68dd9c..db0a0eb1c 100644 --- a/tools/wta/locales/bn-IN.yml +++ b/tools/wta/locales/bn-IN.yml @@ -206,6 +206,7 @@ system.choice_execution_failed: "পছন্দ %{choice} ব্যর্থ # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "এই পেনের জন্য মডেল নির্বাচন করুন (সরাসরি পরিবর্তন করতে /model )" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "মডেল নির্বাচন করুন (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "সংযুক্ত এজেন্ট কোনো নির্বাচনযোগ্য মডেল ঘোষণা করেনি।" system.model_set: "এই পেনের জন্য মডেল %{model}-এ সেট করা হয়েছে।" # {Locked="%{model}"} diff --git a/tools/wta/locales/bs-Latn-BA.yml b/tools/wta/locales/bs-Latn-BA.yml index 0ee9592a0..0dda81227 100644 --- a/tools/wta/locales/bs-Latn-BA.yml +++ b/tools/wta/locales/bs-Latn-BA.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "Izbor %{choice} nije uspio: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Izaberite model za ovaj panel (/model za direktnu promjenu)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Izaberite model (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Povezani agent nije oglasio nijedan model koji se može izabrati." system.model_set: "Model za ovaj panel postavljen je na %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/ca-ES.yml b/tools/wta/locales/ca-ES.yml index a3a0df7e3..b6e9be31d 100644 --- a/tools/wta/locales/ca-ES.yml +++ b/tools/wta/locales/ca-ES.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "L’opció %{choice} ha fallat: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Trieu el model per a aquest tauler (/model per canviar directament)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Seleccioneu el model (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "L’agent connectat no ha anunciat cap model seleccionable." system.model_set: "El model d’aquest tauler s’ha establert a %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/ca-Es-VALENCIA.yml b/tools/wta/locales/ca-Es-VALENCIA.yml index ce72d689a..fdada1adb 100644 --- a/tools/wta/locales/ca-Es-VALENCIA.yml +++ b/tools/wta/locales/ca-Es-VALENCIA.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "L’opció %{choice} ha fallat: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Trieu el model per a este panell (/model per a canviar directament)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Seleccioneu el model (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "L’agent connectat no ha anunciat cap model seleccionable." system.model_set: "El model d’este panell s’ha establit a %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/cs-CZ.yml b/tools/wta/locales/cs-CZ.yml index a9df38c7d..88966c21a 100644 --- a/tools/wta/locales/cs-CZ.yml +++ b/tools/wta/locales/cs-CZ.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "Volba %{choice} selhala: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Vyberte model pro tento panel (/model pro přímé přepnutí)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Vyberte model (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Připojený agent neohlásil žádné dostupné modely." system.model_set: "Model pro tento panel nastaven na %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/cy-GB.yml b/tools/wta/locales/cy-GB.yml index aec4c43c7..1dd1900b4 100644 --- a/tools/wta/locales/cy-GB.yml +++ b/tools/wta/locales/cy-GB.yml @@ -204,6 +204,7 @@ system.choice_execution_failed: "Methodd dewis %{choice}: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Dewiswch y model ar gyfer y paen hwn (/model i newid yn uniongyrchol)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Dewiswch model (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Ni hysbysebodd yr asiant cysylltiedig unrhyw fodelau dethol." system.model_set: "Gosodwyd y model ar gyfer y paen hwn i %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/da-DK.yml b/tools/wta/locales/da-DK.yml index 48582eaab..45d1e3ec5 100644 --- a/tools/wta/locales/da-DK.yml +++ b/tools/wta/locales/da-DK.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "Valg %{choice} mislykkedes: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Vælg modellen til denne panel (/model for at skifte direkte)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Vælg model (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Den tilsluttede agent annoncerede ingen modeller, der kan vælges." system.model_set: "Modellen til denne panel er angivet til %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/de-DE.yml b/tools/wta/locales/de-DE.yml index bfa4b3f4e..91802a68b 100644 --- a/tools/wta/locales/de-DE.yml +++ b/tools/wta/locales/de-DE.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "Auswahl %{choice} fehlgeschlagen: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Modell für diesen Bereich auswählen (/model zum direkten Wechseln)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Modell auswählen (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Der verbundene Agent hat keine auswählbaren Modelle angekündigt." system.model_set: "Modell für diesen Bereich auf %{model} festgelegt." # {Locked="%{model}"} diff --git a/tools/wta/locales/el-GR.yml b/tools/wta/locales/el-GR.yml index 18f6d5850..8c8763cbd 100644 --- a/tools/wta/locales/el-GR.yml +++ b/tools/wta/locales/el-GR.yml @@ -204,6 +204,7 @@ system.choice_execution_failed: "Η επιλογή %{choice} απέτυχε: %{e # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Επιλέξτε το μοντέλο για αυτό το πλαίσιο (/model για άμεση εναλλαγή)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Επιλέξτε μοντέλο (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Ο συνδεδεμένος agent δεν δήλωσε κανένα επιλέξιμο μοντέλο." system.model_set: "Το μοντέλο για αυτό το πλαίσιο ορίστηκε σε %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/en-GB.yml b/tools/wta/locales/en-GB.yml index 88b398755..a1f93935d 100644 --- a/tools/wta/locales/en-GB.yml +++ b/tools/wta/locales/en-GB.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "Choice %{choice} failed: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Pick the model for this pane (/model to switch directly)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Select model (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "The connected agent did not advertise any selectable models." system.model_set: "Model for this pane set to %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/en-US.yml b/tools/wta/locales/en-US.yml index c102a64f5..cb3a63de3 100644 --- a/tools/wta/locales/en-US.yml +++ b/tools/wta/locales/en-US.yml @@ -93,6 +93,7 @@ commands.restart.summary: "Restart agent" commands.stop.summary: "Cancel the in-flight prompt" commands.sessions.summary: "Open the historical sessions picker (Ctrl+Shift+/)" # {Locked="Ctrl+Shift+/"} commands.model.summary: "Pick the model for this pane (/model to switch directly)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} # ── Model picker (src/ui/model_popup.rs) ──────────────────────────────────── # {Locked="↑","↓","Enter","Esc"} - key names, do not translate diff --git a/tools/wta/locales/es-ES.yml b/tools/wta/locales/es-ES.yml index 50b632a32..0668e341a 100644 --- a/tools/wta/locales/es-ES.yml +++ b/tools/wta/locales/es-ES.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "Error en la opción %{choice}: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Elija el modelo para este panel (/model para cambiar directamente)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Seleccionar modelo (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "El agente conectado no anunció ningún modelo seleccionable." system.model_set: "El modelo para este panel se ha establecido en %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/es-MX.yml b/tools/wta/locales/es-MX.yml index a174a9ccb..b462fad19 100644 --- a/tools/wta/locales/es-MX.yml +++ b/tools/wta/locales/es-MX.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "Error en la opción %{choice}: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Elige el modelo para este panel (/model para cambiar directamente)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Seleccionar modelo (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "El agente conectado no anunció ningún modelo seleccionable." system.model_set: "El modelo para este panel se estableció en %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/et-EE.yml b/tools/wta/locales/et-EE.yml index 8041a8eac..fe30b5398 100644 --- a/tools/wta/locales/et-EE.yml +++ b/tools/wta/locales/et-EE.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "Valik %{choice} nurjus: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Valige selle paani mudel (/model otse vahetamiseks)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Valige mudel (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Ühendatud agent ei reklaaminud ühtegi valitavat mudelit." system.model_set: "Selle paani mudeliks määrati %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/eu-ES.yml b/tools/wta/locales/eu-ES.yml index 3e7b006d1..2d906b152 100644 --- a/tools/wta/locales/eu-ES.yml +++ b/tools/wta/locales/eu-ES.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "%{choice} aukera huts egin du: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Aukeratu panel honetarako modeloa (/model zuzenean aldatzeko)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Hautatu modeloa (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Konektatutako agenteak ez du modelo hautagarririk iragarri." system.model_set: "Panel honetarako modeloa %{model} gisa ezarri da." # {Locked="%{model}"} diff --git a/tools/wta/locales/fa-IR.yml b/tools/wta/locales/fa-IR.yml index ab37c291f..4145658ca 100644 --- a/tools/wta/locales/fa-IR.yml +++ b/tools/wta/locales/fa-IR.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "انتخاب %{choice} ناموفق بود: %{e # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "مدل این پنل را انتخاب کنید (/model برای تغییر مستقیم)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "انتخاب مدل (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "عامل هوش مصنوعی متصل هیچ مدل قابل انتخابی را اعلام نکرد." system.model_set: "مدل این پنل روی %{model} تنظیم شد." # {Locked="%{model}"} diff --git a/tools/wta/locales/fi-FI.yml b/tools/wta/locales/fi-FI.yml index c770d730f..e8436751b 100644 --- a/tools/wta/locales/fi-FI.yml +++ b/tools/wta/locales/fi-FI.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "Valinta %{choice} epäonnistui: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Valitse tämän paneelin malli (/model vaihtaaksesi suoraan)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Valitse malli (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Yhdistetty agentti ei ilmoittanut yhtään valittavissa olevaa mallia." system.model_set: "Tämän paneelin malliksi asetettiin %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/fil-PH.yml b/tools/wta/locales/fil-PH.yml index 611bce9cc..2543f32d7 100644 --- a/tools/wta/locales/fil-PH.yml +++ b/tools/wta/locales/fil-PH.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "Nabigo ang pagpipiliang %{choice}: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Piliin ang modelo para sa pane na ito (/model para magpalit nang diretso)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Pumili ng modelo (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Hindi nag-advertise ang nakakonektang agent ng anumang napipiling modelo." system.model_set: "Itinakda sa %{model} ang modelo para sa pane na ito." # {Locked="%{model}"} diff --git a/tools/wta/locales/fr-CA.yml b/tools/wta/locales/fr-CA.yml index 8159de1a6..2bd2f9c4a 100644 --- a/tools/wta/locales/fr-CA.yml +++ b/tools/wta/locales/fr-CA.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "Le choix %{choice} a échoué : %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Choisissez le modèle pour ce volet (/model pour changer directement)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Sélectionner le modèle (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "L'agent connecté n'a annoncé aucun modèle sélectionnable." system.model_set: "Le modèle pour ce volet est défini sur %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/fr-FR.yml b/tools/wta/locales/fr-FR.yml index c7cd6b881..8724627e1 100644 --- a/tools/wta/locales/fr-FR.yml +++ b/tools/wta/locales/fr-FR.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "Le choix %{choice} a échoué : %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Choisir le modèle pour ce volet (/model pour changer directement)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Sélectionner le modèle (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "L’agent connecté n’a annoncé aucun modèle sélectionnable." system.model_set: "Modèle de ce volet défini sur %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/ga-IE.yml b/tools/wta/locales/ga-IE.yml index be3653404..a943d1165 100644 --- a/tools/wta/locales/ga-IE.yml +++ b/tools/wta/locales/ga-IE.yml @@ -204,6 +204,7 @@ system.choice_execution_failed: "Theip ar rogha %{choice}: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Roghnaigh an samhail don phána seo (/model chun athrú go díreach)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Roghnaigh samhail (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Níor fhógair an gníomhaire ceangailte aon tsamhail in-roghnaithe." system.model_set: "Samhail an phána seo socraithe go %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/gd-gb.yml b/tools/wta/locales/gd-gb.yml index dfed76532..4c8efc3f1 100644 --- a/tools/wta/locales/gd-gb.yml +++ b/tools/wta/locales/gd-gb.yml @@ -204,6 +204,7 @@ system.choice_execution_failed: "Dh’fhàillig roghainn %{choice}: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Tagh am modail airson a' phana seo (/model gus atharrachadh gu dìreach)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Tagh modail (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Cha do dh'ainmich an t-àidseant ceangailte modail sam bith a ghabhas taghadh." system.model_set: "Chaidh modail a' phana seo a shuidheachadh gu %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/gl-ES.yml b/tools/wta/locales/gl-ES.yml index aeb3fd5cf..c39f62fcc 100644 --- a/tools/wta/locales/gl-ES.yml +++ b/tools/wta/locales/gl-ES.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "Fallou a opción %{choice}: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Escolla o modelo para este panel (/model para cambiar directamente)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Seleccionar modelo (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "O axente conectado non anunciou ningún modelo seleccionable." system.model_set: "O modelo deste panel estableceuse en %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/gu-IN.yml b/tools/wta/locales/gu-IN.yml index c298af8cd..e5c66af2a 100644 --- a/tools/wta/locales/gu-IN.yml +++ b/tools/wta/locales/gu-IN.yml @@ -206,6 +206,7 @@ system.choice_execution_failed: "પસંદગી %{choice} નિષ્ફળ # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "આ પેન માટે મોડેલ પસંદ કરો (સીધું બદલવા /model )" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "મોડેલ પસંદ કરો (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "જોડાયેલ એજન્ટે કોઈ પસંદ કરી શકાય તેવા મોડેલ જાહેર કર્યા નથી." system.model_set: "આ પેન માટેનું મોડેલ %{model} પર સેટ કર્યું." # {Locked="%{model}"} diff --git a/tools/wta/locales/he-IL.yml b/tools/wta/locales/he-IL.yml index 7afb2eaa1..9d559c2b4 100644 --- a/tools/wta/locales/he-IL.yml +++ b/tools/wta/locales/he-IL.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "הבחירה %{choice} נכשלה: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "בחר את המודל עבור חלונית זו (/model למעבר ישיר)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "בחר מודל (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "הסוכן המחובר לא פרסם מודלים הניתנים לבחירה." system.model_set: "המודל עבור חלונית זו הוגדר ל-%{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/hi-IN.yml b/tools/wta/locales/hi-IN.yml index d09897a40..285000c22 100644 --- a/tools/wta/locales/hi-IN.yml +++ b/tools/wta/locales/hi-IN.yml @@ -206,6 +206,7 @@ system.choice_execution_failed: "चुनाव %{choice} विफल रह # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "इस पेन के लिए मॉडल चुनें (सीधे बदलने के लिए /model )" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "मॉडल चुनें (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "कनेक्टेड एजेंट ने कोई चयन योग्य मॉडल घोषित नहीं किया।" system.model_set: "इस पेन के लिए मॉडल %{model} पर सेट किया गया।" # {Locked="%{model}"} diff --git a/tools/wta/locales/hr-HR.yml b/tools/wta/locales/hr-HR.yml index 53a7ab950..2edba14fc 100644 --- a/tools/wta/locales/hr-HR.yml +++ b/tools/wta/locales/hr-HR.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "Odabir %{choice} nije uspio: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Odaberite model za ovo okno (/model za izravno prebacivanje)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Odaberite model (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Povezani agent nije oglasio nijedan model koji se može odabrati." system.model_set: "Model za ovo okno postavljen je na %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/hu-HU.yml b/tools/wta/locales/hu-HU.yml index a6f4c2208..15e4bbc48 100644 --- a/tools/wta/locales/hu-HU.yml +++ b/tools/wta/locales/hu-HU.yml @@ -204,6 +204,7 @@ system.choice_execution_failed: "A(z) %{choice}. választás sikertelen: %{error # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Válassza ki a modellt ehhez a panelhez (/model a közvetlen váltáshoz)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Modell kiválasztása (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "A csatlakoztatott ügynök nem hirdetett meg kiválasztható modelleket." system.model_set: "A panel modellje erre állítva: %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/hy-AM.yml b/tools/wta/locales/hy-AM.yml index d5de99d2f..dba061b97 100644 --- a/tools/wta/locales/hy-AM.yml +++ b/tools/wta/locales/hy-AM.yml @@ -223,6 +223,7 @@ system.choice_execution_failed: "Ընտրությունը %{choice} ձախողվ # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Ընտրեք մոդելն այս վահանակի համար (/model ՝ ուղղակիորեն փոխելու համար)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Ընտրեք մոդելը (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Միացված ագենտը չհայտարարեց ընտրելի մոդելների մասին։" system.model_set: "Այս վահանակի մոդելը սահմանվել է %{model}։" # {Locked="%{model}"} diff --git a/tools/wta/locales/id-ID.yml b/tools/wta/locales/id-ID.yml index a1811b7dd..c3b5a5578 100644 --- a/tools/wta/locales/id-ID.yml +++ b/tools/wta/locales/id-ID.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "Pilihan %{choice} gagal: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Pilih model untuk panel ini (/model untuk beralih langsung)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Pilih model (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Agen yang terhubung tidak mengiklankan model apa pun yang dapat dipilih." system.model_set: "Model untuk panel ini diatur ke %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/is-IS.yml b/tools/wta/locales/is-IS.yml index 58728c68f..287be66e0 100644 --- a/tools/wta/locales/is-IS.yml +++ b/tools/wta/locales/is-IS.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "Val %{choice} mistókst: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Veldu líkanið fyrir þetta spjald (/model til að skipta beint)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Veldu líkan (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Tengdi agentinn auglýsti engin valanleg líkön." system.model_set: "Líkan fyrir þetta spjald stillt á %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/it-IT.yml b/tools/wta/locales/it-IT.yml index fb644fbf6..5080063b4 100644 --- a/tools/wta/locales/it-IT.yml +++ b/tools/wta/locales/it-IT.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "Scelta %{choice} non riuscita: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Scegli il modello per questo riquadro (/model per cambiare direttamente)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Seleziona modello (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "L'agente connesso non ha annunciato alcun modello selezionabile." system.model_set: "Modello per questo riquadro impostato su %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/ja-JP.yml b/tools/wta/locales/ja-JP.yml index ab2034133..9057a76a4 100644 --- a/tools/wta/locales/ja-JP.yml +++ b/tools/wta/locales/ja-JP.yml @@ -200,6 +200,7 @@ system.choice_execution_failed: "選択肢 %{choice} が失敗しました: %{er # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "このペインのモデルを選択(直接切り替えるには /model )" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "モデルを選択 (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "接続中のエージェントは選択可能なモデルを通知しませんでした。" system.model_set: "このペインのモデルを %{model} に設定しました。" # {Locked="%{model}"} diff --git a/tools/wta/locales/ka-GE.yml b/tools/wta/locales/ka-GE.yml index b8db52b90..8092b303a 100644 --- a/tools/wta/locales/ka-GE.yml +++ b/tools/wta/locales/ka-GE.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "არჩევანი %{choice} ვერ # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "აირჩიეთ მოდელი ამ პანელისთვის (/model პირდაპირ გადასართავად)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "აირჩიეთ მოდელი (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "დაკავშირებულმა აგენტმა არცერთი ასარჩევი მოდელი არ გამოაცხადა." system.model_set: "ამ პანელის მოდელად დაყენდა %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/kk-KZ.yml b/tools/wta/locales/kk-KZ.yml index f88efb8e2..e6413c009 100644 --- a/tools/wta/locales/kk-KZ.yml +++ b/tools/wta/locales/kk-KZ.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "%{choice} таңдауы сәтсіз аяқт # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Осы панель үшін модельді таңдаңыз (тікелей ауыстыру үшін /model )" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Модельді таңдаңыз (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Қосылған агент таңдауға болатын ешбір модельді жарияламады." system.model_set: "Осы панельдің моделі %{model} етіп орнатылды." # {Locked="%{model}"} diff --git a/tools/wta/locales/km-KH.yml b/tools/wta/locales/km-KH.yml index 7aadfff23..10e4666ef 100644 --- a/tools/wta/locales/km-KH.yml +++ b/tools/wta/locales/km-KH.yml @@ -223,6 +223,7 @@ system.choice_execution_failed: "ជម្រើស %{choice} បានបរា # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "ជ្រើសរើសម៉ូដែលសម្រាប់ផ្តាំងនេះ (/model ដើម្បីប្តូរដោយផ្ទាល់)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "ជ្រើសរើសម៉ូដែល (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "AI អេជេន្ត់ដែលបានភ្ជាប់មិនបានប្រកាសម៉ូដែលណាមួយដែលអាចជ្រើសរើសបានទេ។" system.model_set: "ម៉ូដែលសម្រាប់ផ្តាំងនេះត្រូវបានកំណត់ទៅ %{model}។" # {Locked="%{model}"} diff --git a/tools/wta/locales/kn-IN.yml b/tools/wta/locales/kn-IN.yml index 8f83dece1..61e191c09 100644 --- a/tools/wta/locales/kn-IN.yml +++ b/tools/wta/locales/kn-IN.yml @@ -206,6 +206,7 @@ system.choice_execution_failed: "ಆಯ್ಕೆ %{choice} ವಿಫಲವಾಗ # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "ಈ ಪೇನ್‌ಗಾಗಿ ಮಾದರಿಯನ್ನು ಆಯ್ಕೆಮಾಡಿ (ನೇರವಾಗಿ ಬದಲಾಯಿಸಲು /model )" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "ಮಾದರಿ ಆಯ್ಕೆಮಾಡಿ (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "ಸಂಪರ್ಕಿತ ಏಜೆಂಟ್ ಯಾವುದೇ ಆಯ್ಕೆ ಮಾಡಬಹುದಾದ ಮಾದರಿಗಳನ್ನು ಪ್ರಕಟಿಸಲಿಲ್ಲ." system.model_set: "ಈ ಪೇನ್‌ಗಾಗಿ ಮಾದರಿಯನ್ನು %{model} ಗೆ ಹೊಂದಿಸಲಾಗಿದೆ." # {Locked="%{model}"} diff --git a/tools/wta/locales/ko-KR.yml b/tools/wta/locales/ko-KR.yml index d25184ec4..e6ab5aeab 100644 --- a/tools/wta/locales/ko-KR.yml +++ b/tools/wta/locales/ko-KR.yml @@ -200,6 +200,7 @@ system.choice_execution_failed: "선택 %{choice} 실패: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "이 창의 모델 선택 (/model 로 바로 전환)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "모델 선택 (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "연결된 에이전트가 선택 가능한 모델을 알리지 않았습니다." system.model_set: "이 창의 모델이 %{model}(으)로 설정되었습니다." # {Locked="%{model}"} diff --git a/tools/wta/locales/kok-IN.yml b/tools/wta/locales/kok-IN.yml index cce477b4c..dcabd177b 100644 --- a/tools/wta/locales/kok-IN.yml +++ b/tools/wta/locales/kok-IN.yml @@ -206,6 +206,7 @@ system.choice_execution_failed: "निवड %{choice} अपेसली: %{er # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "ह्या पेना खातीर मॉडेल निवडात (थेट बदलपाक /model )" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "मॉडेल निवडात (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "जोडिल्ल्या एजंटान कसलेच निवडपायोग्य मॉडेल जाहीर केलें ना." system.model_set: "ह्या पेना खातीर मॉडेल %{model} चेर सेट केलें." # {Locked="%{model}"} diff --git a/tools/wta/locales/lb-LU.yml b/tools/wta/locales/lb-LU.yml index e2bf869d3..86c2ca966 100644 --- a/tools/wta/locales/lb-LU.yml +++ b/tools/wta/locales/lb-LU.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "Wiel %{choice} ass feelgeschloen: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Wielt de Modell fir dës Panell (/model fir direkt ze wiesselen)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Modell auswielen (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Den ugeschlossenen Agent huet keng auswielbar Modeller ugekënnegt." system.model_set: "De Modell fir dës Panell gouf op %{model} gesat." # {Locked="%{model}"} diff --git a/tools/wta/locales/lo-LA.yml b/tools/wta/locales/lo-LA.yml index 353e95f61..624e0b0cd 100644 --- a/tools/wta/locales/lo-LA.yml +++ b/tools/wta/locales/lo-LA.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "ຕົວເລືອກ %{choice} ລົ້ມ # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "ເລືອກແບບຈຳລອງສຳລັບ pane ນີ້ (/model ເພື່ອປ່ຽນໂດຍກົງ)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "ເລືອກແບບຈຳລອງ (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "agent ທີ່ເຊື່ອມຕໍ່ບໍ່ໄດ້ປະກາດແບບຈຳລອງທີ່ສາມາດເລືອກໄດ້ໃດໆ." system.model_set: "ແບບຈຳລອງສຳລັບ pane ນີ້ຖືກຕັ້ງເປັນ %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/lt-LT.yml b/tools/wta/locales/lt-LT.yml index 4b9359f96..4340481ff 100644 --- a/tools/wta/locales/lt-LT.yml +++ b/tools/wta/locales/lt-LT.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "Pasirinkimas %{choice} nepavyko: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Pasirinkite šios srities modelį (/model norėdami perjungti tiesiogiai)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Pasirinkite modelį (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Prijungtas agentas nepaskelbė jokių pasirenkamų modelių." system.model_set: "Šios srities modelis nustatytas į %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/lv-LV.yml b/tools/wta/locales/lv-LV.yml index ba5c7b835..fb520ab22 100644 --- a/tools/wta/locales/lv-LV.yml +++ b/tools/wta/locales/lv-LV.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "Izvēle %{choice} neizdevās: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Izvēlieties šīs rūts modeli (/model , lai pārslēgtu tieši)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Izvēlieties modeli (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Pievienotais aģents nepaziņoja nevienu atlasāmu modeli." system.model_set: "Šīs rūts modelis iestatīts uz %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/mi-NZ.yml b/tools/wta/locales/mi-NZ.yml index bf2ec5aaa..cd7c6da67 100644 --- a/tools/wta/locales/mi-NZ.yml +++ b/tools/wta/locales/mi-NZ.yml @@ -204,6 +204,7 @@ system.choice_execution_failed: "I rahua te kōwhiringa %{choice}: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Kōwhiria te tauira mō tēnei papa (/model ki te huri tika)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Kōwhiria te tauira (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Kāore te agent kua hono i pānui i tētahi tauira ka taea te kōwhiri." system.model_set: "Kua whakaritea te tauira mō tēnei papa ki %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/mk-MK.yml b/tools/wta/locales/mk-MK.yml index 16c39ee71..deb108f68 100644 --- a/tools/wta/locales/mk-MK.yml +++ b/tools/wta/locales/mk-MK.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "Изборот %{choice} не успеа: %{err # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Изберете го моделот за овој панел (/model за директно префрлување)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Изберете модел (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Поврзаниот агент не објави ниту еден модел што може да се избере." system.model_set: "Моделот за овој панел е поставен на %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/ml-IN.yml b/tools/wta/locales/ml-IN.yml index bdc5f381d..80121b318 100644 --- a/tools/wta/locales/ml-IN.yml +++ b/tools/wta/locales/ml-IN.yml @@ -206,6 +206,7 @@ system.choice_execution_failed: "തിരഞ്ഞെടുപ്പ് %{choic # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "ഈ പേനിനായി മോഡൽ തിരഞ്ഞെടുക്കുക (നേരിട്ട് മാറാൻ /model )" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "മോഡൽ തിരഞ്ഞെടുക്കുക (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "കണക്റ്റുചെയ്‌ത agent തിരഞ്ഞെടുക്കാവുന്ന ഒരു മോഡലും പ്രഖ്യാപിച്ചില്ല." system.model_set: "ഈ പേനിനായുള്ള മോഡൽ %{model} ആയി സജ്ജമാക്കി." # {Locked="%{model}"} diff --git a/tools/wta/locales/mr-IN.yml b/tools/wta/locales/mr-IN.yml index e21a9666b..34117fa24 100644 --- a/tools/wta/locales/mr-IN.yml +++ b/tools/wta/locales/mr-IN.yml @@ -206,6 +206,7 @@ system.choice_execution_failed: "निवड %{choice} अयशस्वी # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "या पेनसाठी मॉडेल निवडा (थेट स्विच करण्यासाठी /model )" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "मॉडेल निवडा (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "कनेक्ट केलेल्या agent ने कोणतेही निवडण्यायोग्य मॉडेल जाहीर केले नाही." system.model_set: "या पेनसाठी मॉडेल %{model} वर सेट केले." # {Locked="%{model}"} diff --git a/tools/wta/locales/ms-MY.yml b/tools/wta/locales/ms-MY.yml index 33c1c1157..486be7b6f 100644 --- a/tools/wta/locales/ms-MY.yml +++ b/tools/wta/locales/ms-MY.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "Pilihan %{choice} gagal: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Pilih model untuk anak tetingkap ini (/model untuk menukar terus)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Pilih model (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Ejen yang disambungkan tidak mengiklankan sebarang model yang boleh dipilih." system.model_set: "Model untuk anak tetingkap ini ditetapkan kepada %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/mt-MT.yml b/tools/wta/locales/mt-MT.yml index ec1b46065..0ab2659c4 100644 --- a/tools/wta/locales/mt-MT.yml +++ b/tools/wta/locales/mt-MT.yml @@ -204,6 +204,7 @@ system.choice_execution_failed: "L-għażla %{choice} falliet: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Agħżel il-mudell għal dan il-pannell (/model biex tibdel direttament)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Agħżel mudell (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "L-aġent konness ma rreklama l-ebda mudell li jista' jintgħażel." system.model_set: "Il-mudell għal dan il-pannell ġie ssettjat għal %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/nb-NO.yml b/tools/wta/locales/nb-NO.yml index 713d4b37b..c66277818 100644 --- a/tools/wta/locales/nb-NO.yml +++ b/tools/wta/locales/nb-NO.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "Valg %{choice} mislyktes: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Velg modellen for dette panelet (/model for å bytte direkte)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Velg modell (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Den tilkoblede agenten annonserte ingen valgbare modeller." system.model_set: "Modellen for dette panelet er satt til %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/ne-NP.yml b/tools/wta/locales/ne-NP.yml index 6ce6d00db..a1cd6917f 100644 --- a/tools/wta/locales/ne-NP.yml +++ b/tools/wta/locales/ne-NP.yml @@ -206,6 +206,7 @@ system.choice_execution_failed: "छनोट %{choice} असफल भयो: # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "यो पेनका लागि मोडेल छान्नुहोस् (सिधै बदल्न /model )" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "मोडेल छान्नुहोस् (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "जोडिएको agent ले कुनै पनि छान्न मिल्ने मोडेल घोषणा गरेन।" system.model_set: "यो पेनका लागि मोडेल %{model} मा सेट गरियो।" # {Locked="%{model}"} diff --git a/tools/wta/locales/nl-NL.yml b/tools/wta/locales/nl-NL.yml index 33bc28347..3288a6266 100644 --- a/tools/wta/locales/nl-NL.yml +++ b/tools/wta/locales/nl-NL.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "Keuze %{choice} is mislukt: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Het model voor dit deelvenster kiezen (/model om direct te wisselen)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Model selecteren (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "De verbonden agent heeft geen selecteerbare modellen aangekondigd." system.model_set: "Model voor dit deelvenster ingesteld op %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/nn-NO.yml b/tools/wta/locales/nn-NO.yml index 486292d38..c3ff14c45 100644 --- a/tools/wta/locales/nn-NO.yml +++ b/tools/wta/locales/nn-NO.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "Val %{choice} mislukkast: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Vel modellen for dette panelet (/model for å byte direkte)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Vel modell (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Den tilkopla agenten annonserte ingen modellar som kan veljast." system.model_set: "Modell for dette panelet sett til %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/or-IN.yml b/tools/wta/locales/or-IN.yml index c80f20e96..5255703d4 100644 --- a/tools/wta/locales/or-IN.yml +++ b/tools/wta/locales/or-IN.yml @@ -206,6 +206,7 @@ system.choice_execution_failed: "ପସନ୍ଦ %{choice} ବିଫଳ ହେ # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "ଏହି ପେନ୍ ପାଇଁ ମଡେଲ ବାଛନ୍ତୁ (ସିଧାସଳଖ ବଦଳାଇବାକୁ /model )" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "ମଡେଲ ବାଛନ୍ତୁ (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "ସଂଯୁକ୍ତ ଏଜେଣ୍ଟ କୌଣସି ଚୟନଯୋଗ୍ୟ ମଡେଲ ଘୋଷଣା କଲା ନାହିଁ।" system.model_set: "ଏହି ପେନ୍ ପାଇଁ ମଡେଲ %{model} କୁ ସେଟ୍ କରାଗଲା।" # {Locked="%{model}"} diff --git a/tools/wta/locales/pa-IN.yml b/tools/wta/locales/pa-IN.yml index 91bff3165..ea5c8dad8 100644 --- a/tools/wta/locales/pa-IN.yml +++ b/tools/wta/locales/pa-IN.yml @@ -206,6 +206,7 @@ system.choice_execution_failed: "ਚੋਣ %{choice} ਅਸਫਲ ਰਹੀ: %{e # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "ਇਸ ਪੈਨ ਲਈ ਮਾਡਲ ਚੁਣੋ (ਸਿੱਧਾ ਬਦਲਣ ਲਈ /model )" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "ਮਾਡਲ ਚੁਣੋ (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "ਜੁੜੇ ਏਜੰਟ ਨੇ ਕੋਈ ਚੁਣਨਯੋਗ ਮਾਡਲ ਦਾ ਐਲਾਨ ਨਹੀਂ ਕੀਤਾ।" system.model_set: "ਇਸ ਪੈਨ ਲਈ ਮਾਡਲ %{model} 'ਤੇ ਸੈੱਟ ਕੀਤਾ ਗਿਆ।" # {Locked="%{model}"} diff --git a/tools/wta/locales/pl-PL.yml b/tools/wta/locales/pl-PL.yml index e7c539e15..fd4bdaf4f 100644 --- a/tools/wta/locales/pl-PL.yml +++ b/tools/wta/locales/pl-PL.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "Wybór %{choice} nie powiódł się: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Wybierz model dla tego panelu (/model , aby przełączyć bezpośrednio)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Wybierz model (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Połączony agent nie ogłosił żadnych modeli do wyboru." system.model_set: "Model dla tego panelu ustawiono na %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/pt-BR.yml b/tools/wta/locales/pt-BR.yml index 8b1f8bb43..cfbdca501 100644 --- a/tools/wta/locales/pt-BR.yml +++ b/tools/wta/locales/pt-BR.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "Falha na opção %{choice}: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Escolha o modelo para este painel (/model para trocar diretamente)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Selecionar modelo (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "O agente conectado não anunciou nenhum modelo selecionável." system.model_set: "Modelo para este painel definido como %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/pt-PT.yml b/tools/wta/locales/pt-PT.yml index 069afe918..a13158c8b 100644 --- a/tools/wta/locales/pt-PT.yml +++ b/tools/wta/locales/pt-PT.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "A opção %{choice} falhou: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Escolha o modelo para este painel (/model para mudar diretamente)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Selecionar modelo (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "O agente ligado não anunciou nenhum modelo selecionável." system.model_set: "Modelo para este painel definido como %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/qps-ploc.yml b/tools/wta/locales/qps-ploc.yml index 96bdf68fa..6d459ae12 100644 --- a/tools/wta/locales/qps-ploc.yml +++ b/tools/wta/locales/qps-ploc.yml @@ -206,6 +206,7 @@ system.choice_execution_failed: "[Çĥöïçé %{choice} ƒåïĺéď: %{error}! # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "[Ṗïçķ ţĥé ḿöďéĺ ƒöŕ ţĥïś ṗåñé (/model ţö śŵïţçĥ ďïŕéçţĺÿ)!!!! !!!! !!!! !!!!]" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "[Ŝéĺéçţ ḿöďéĺ (↑ ↓ • Enter • Esc)!!!! !!!!]" # {Locked="↑","↓","Enter","Esc"} system.no_models: "[Ţĥé çöññéçţéď åğéñţ ďïď ñöţ åďṽéŕţïśé åñÿ śéĺéçţåƀĺé ḿöďéĺś.!!!! !!!! !!!! !!!!]" system.model_set: "[Ḿöďéĺ ƒöŕ ţĥïś ṗåñé śéţ ţö %{model}.!!!! !!!! !!!!]" # {Locked="%{model}"} diff --git a/tools/wta/locales/qps-ploca.yml b/tools/wta/locales/qps-ploca.yml index 01e432c4e..d94debc01 100644 --- a/tools/wta/locales/qps-ploca.yml +++ b/tools/wta/locales/qps-ploca.yml @@ -203,6 +203,7 @@ system.choice_execution_failed: "[!!_Choice %{choice} failed: %{error}_!!]" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "[!!_Pick the model for this pane (/model to switch directly)_!!]" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "[!!_Select model (↑ ↓ • Enter • Esc)_!!]" # {Locked="↑","↓","Enter","Esc"} system.no_models: "[!!_The connected agent did not advertise any selectable models._!!]" system.model_set: "[!!_Model for this pane set to %{model}._!!]" # {Locked="%{model}"} diff --git a/tools/wta/locales/qps-plocm.yml b/tools/wta/locales/qps-plocm.yml index 61f3cd6c9..a225e0281 100644 --- a/tools/wta/locales/qps-plocm.yml +++ b/tools/wta/locales/qps-plocm.yml @@ -203,6 +203,7 @@ system.choice_execution_failed: "[!! Cho_ice %{choice} failed: %{error} !!]" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "[!! Pic_k the model for this pane (/model to switch directly) !!]" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "[!! Sel_ect model (↑ ↓ • Enter • Esc) !!]" # {Locked="↑","↓","Enter","Esc"} system.no_models: "[!! The_ connected agent did not advertise any selectable models. !!]" system.model_set: "[!! Mod_el for this pane set to %{model}. !!]" # {Locked="%{model}"} diff --git a/tools/wta/locales/quz-PE.yml b/tools/wta/locales/quz-PE.yml index a441af998..f7e28f0c1 100644 --- a/tools/wta/locales/quz-PE.yml +++ b/tools/wta/locales/quz-PE.yml @@ -204,6 +204,7 @@ system.choice_execution_failed: "Akllay %{choice} pantarun: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Kay k'itipaq modelo akllay (/model qillqay kikinmanta t'ikranapaq)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Modelo akllay (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Tinkisqa agente mana ima akllana modelotapas willarqachu." system.model_set: "Kay k'itipaq modelo %{model} nisqaman churasqa." # {Locked="%{model}"} diff --git a/tools/wta/locales/ro-RO.yml b/tools/wta/locales/ro-RO.yml index 918034c16..3ee69a770 100644 --- a/tools/wta/locales/ro-RO.yml +++ b/tools/wta/locales/ro-RO.yml @@ -204,6 +204,7 @@ system.choice_execution_failed: "Alegerea %{choice} a eșuat: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Alegeți modelul pentru acest panou (/model pentru a comuta direct)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Selectați modelul (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Agentul conectat nu a anunțat niciun model selectabil." system.model_set: "Modelul pentru acest panou a fost setat la %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/ru-RU.yml b/tools/wta/locales/ru-RU.yml index 6ef338048..d8aa7f6a4 100644 --- a/tools/wta/locales/ru-RU.yml +++ b/tools/wta/locales/ru-RU.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "Не удалось выполнить выбо # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Выберите модель для этой панели (/model для прямого переключения)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Выбор модели (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Подключённый агент не объявил ни одной доступной для выбора модели." system.model_set: "Модель для этой панели установлена на %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/sk-SK.yml b/tools/wta/locales/sk-SK.yml index bac23bcac..8d7d90968 100644 --- a/tools/wta/locales/sk-SK.yml +++ b/tools/wta/locales/sk-SK.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "Voľba %{choice} zlyhala: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Vyberte model pre túto tablu (/model na priame prepnutie)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Vybrať model (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Pripojený agent neohlásil žiadne vybrateľné modely." system.model_set: "Model pre túto tablu je nastavený na %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/sl-SI.yml b/tools/wta/locales/sl-SI.yml index fb03ebd39..2aca123b6 100644 --- a/tools/wta/locales/sl-SI.yml +++ b/tools/wta/locales/sl-SI.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "Izbira %{choice} ni uspela: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Izberite model za to podokno (/model za neposreden preklop)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Izberi model (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Povezani agent ni oglaševal nobenega izbirljivega modela." system.model_set: "Model za to podokno je nastavljen na %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/sq-AL.yml b/tools/wta/locales/sq-AL.yml index 0f43efc5a..a16a64a63 100644 --- a/tools/wta/locales/sq-AL.yml +++ b/tools/wta/locales/sq-AL.yml @@ -204,6 +204,7 @@ system.choice_execution_failed: "Zgjedhja %{choice} dështoi: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Zgjidhni modelin për këtë panel (/model për të kaluar drejtpërdrejt)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Zgjidhni modelin (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Agjenti i lidhur nuk shpalli asnjë model të zgjedhshëm." system.model_set: "Modeli për këtë panel u caktua në %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/sr-Cyrl-BA.yml b/tools/wta/locales/sr-Cyrl-BA.yml index c8684b5cf..c30f57010 100644 --- a/tools/wta/locales/sr-Cyrl-BA.yml +++ b/tools/wta/locales/sr-Cyrl-BA.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "Избор %{choice} није успио: %{err # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Изаберите модел за ово окно (/model за директно пребацивање)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Изаберите модел (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Повезани агент није огласио ниједан модел који се може изабрати." system.model_set: "Модел за ово окно је подешен на %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/sr-Cyrl-RS.yml b/tools/wta/locales/sr-Cyrl-RS.yml index 30f453719..57e28e6fd 100644 --- a/tools/wta/locales/sr-Cyrl-RS.yml +++ b/tools/wta/locales/sr-Cyrl-RS.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "Избор %{choice} није успео: %{err # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Изаберите модел за ово окно (/model за директно пребацивање)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Изаберите модел (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Повезани агент није огласио ниједан модел који се може изабрати." system.model_set: "Модел за ово окно је подешен на %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/sr-Latn-RS.yml b/tools/wta/locales/sr-Latn-RS.yml index fc527b90c..7129ee9a3 100644 --- a/tools/wta/locales/sr-Latn-RS.yml +++ b/tools/wta/locales/sr-Latn-RS.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "Izbor %{choice} nije uspeo: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Izaberite model za ovo okno (/model za direktno prebacivanje)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Izaberite model (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Povezani agent nije oglasio nijedan model koji se može izabrati." system.model_set: "Model za ovo okno je podešen na %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/sv-SE.yml b/tools/wta/locales/sv-SE.yml index 39572b0c3..a27d1299a 100644 --- a/tools/wta/locales/sv-SE.yml +++ b/tools/wta/locales/sv-SE.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "Val %{choice} misslyckades: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Välj modellen för den här panelen (/model för att växla direkt)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Välj modell (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Den anslutna agenten annonserade inga valbara modeller." system.model_set: "Modellen för den här panelen är inställd på %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/ta-IN.yml b/tools/wta/locales/ta-IN.yml index ead90dc25..ff729e271 100644 --- a/tools/wta/locales/ta-IN.yml +++ b/tools/wta/locales/ta-IN.yml @@ -206,6 +206,7 @@ system.choice_execution_failed: "தேர்வு %{choice} தோல்வி # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "இந்தப் பலகத்திற்கான மாதிரியைத் தேர்ந்தெடுக்கவும் (நேரடியாக மாற்ற /model )" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "மாதிரியைத் தேர்ந்தெடுக்கவும் (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "இணைக்கப்பட்ட ஏஜெண்ட் தேர்ந்தெடுக்கக்கூடிய எந்த மாதிரியையும் அறிவிக்கவில்லை." system.model_set: "இந்தப் பலகத்திற்கான மாதிரி %{model} ஆக அமைக்கப்பட்டது." # {Locked="%{model}"} diff --git a/tools/wta/locales/te-IN.yml b/tools/wta/locales/te-IN.yml index 255d046d1..e375e39ea 100644 --- a/tools/wta/locales/te-IN.yml +++ b/tools/wta/locales/te-IN.yml @@ -206,6 +206,7 @@ system.choice_execution_failed: "ఎంపిక %{choice} విఫలమైం # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "ఈ పేన్ కోసం మోడల్‌ను ఎంచుకోండి (నేరుగా మార్చడానికి /model )" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "మోడల్‌ను ఎంచుకోండి (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "కనెక్ట్ అయిన ఏజెంట్ ఎంచుకోదగిన ఏ మోడల్‌ను కూడా ప్రకటించలేదు." system.model_set: "ఈ పేన్ కోసం మోడల్ %{model} గా సెట్ చేయబడింది." # {Locked="%{model}"} diff --git a/tools/wta/locales/th-TH.yml b/tools/wta/locales/th-TH.yml index f970ef4bd..dfbfe8488 100644 --- a/tools/wta/locales/th-TH.yml +++ b/tools/wta/locales/th-TH.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "ตัวเลือก %{choice} ล้มเ # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "เลือกโมเดลสำหรับแผงนี้ (/model เพื่อสลับโดยตรง)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "เลือกโมเดล (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "เอเจนต์ที่เชื่อมต่ออยู่ไม่ได้ประกาศโมเดลที่เลือกได้" system.model_set: "ตั้งค่าโมเดลสำหรับแผงนี้เป็น %{model} แล้ว" # {Locked="%{model}"} diff --git a/tools/wta/locales/tr-TR.yml b/tools/wta/locales/tr-TR.yml index e10eb7f5e..867f4b30a 100644 --- a/tools/wta/locales/tr-TR.yml +++ b/tools/wta/locales/tr-TR.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "%{choice} seçimi başarısız oldu: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Bu panel için modeli seçin (doğrudan geçmek için /model )" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Model seçin (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Bağlı aracı seçilebilir hiçbir model duyurmadı." system.model_set: "Bu panel için model %{model} olarak ayarlandı." # {Locked="%{model}"} diff --git a/tools/wta/locales/tt-RU.yml b/tools/wta/locales/tt-RU.yml index 7d2fca792..43518838b 100644 --- a/tools/wta/locales/tt-RU.yml +++ b/tools/wta/locales/tt-RU.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "%{choice} сайлавы уңышсыз бул # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Бу панель өчен модель сайлагыз (туры алыштыру өчен /model )" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Модель сайлагыз (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Тоташкан агент бер дә сайлап була торган модель игълан итмәде." system.model_set: "Бу панель өчен модель %{model} итеп билгеләнде." # {Locked="%{model}"} diff --git a/tools/wta/locales/ug-CN.yml b/tools/wta/locales/ug-CN.yml index fc8e85998..f3ea7693f 100644 --- a/tools/wta/locales/ug-CN.yml +++ b/tools/wta/locales/ug-CN.yml @@ -214,6 +214,7 @@ system.choice_execution_failed: "تاللاش %{choice} مەغلۇپ بولدى: # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "بۇ تاختا ئۈچۈن مودېل تاللاڭ (بىۋاسىتە الماشتۇرۇش ئۈچۈن /model )" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "مودېل تاللاڭ (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "ئۇلانغان AI ئاگېنتى تاللىغىلى بولىدىغان ھېچقانداق مودېل ئېلان قىلمىدى." system.model_set: "بۇ تاختا ئۈچۈن مودېل %{model} قىلىپ بەلگىلەندى." # {Locked="%{model}"} diff --git a/tools/wta/locales/uk-UA.yml b/tools/wta/locales/uk-UA.yml index 4ed0ed30d..2cf27f04d 100644 --- a/tools/wta/locales/uk-UA.yml +++ b/tools/wta/locales/uk-UA.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "Не вдалося виконати вибір # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Виберіть модель для цієї панелі (/model для прямого перемикання)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Виберіть модель (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Підключений агент не оголосив жодної моделі, яку можна вибрати." system.model_set: "Модель для цієї панелі встановлено на %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/ur-PK.yml b/tools/wta/locales/ur-PK.yml index b20ef7d8a..f83547b23 100644 --- a/tools/wta/locales/ur-PK.yml +++ b/tools/wta/locales/ur-PK.yml @@ -206,6 +206,7 @@ system.choice_execution_failed: "انتخاب %{choice} ناکام ہو گیا: # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "اس پین کے لیے ماڈل منتخب کریں (براہ راست تبدیل کرنے کے لیے /model )" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "ماڈل منتخب کریں (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "منسلک ایجنٹ نے کوئی قابلِ انتخاب ماڈل ظاہر نہیں کیا۔" system.model_set: "اس پین کے لیے ماڈل %{model} پر سیٹ کر دیا گیا۔" # {Locked="%{model}"} diff --git a/tools/wta/locales/uz-Latn-UZ.yml b/tools/wta/locales/uz-Latn-UZ.yml index df73c6500..4010d5c78 100644 --- a/tools/wta/locales/uz-Latn-UZ.yml +++ b/tools/wta/locales/uz-Latn-UZ.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "%{choice} tanlovi bajarilmadi: %{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Bu panel uchun modelni tanlang (toʻgʻridan-toʻgʻri almashtirish uchun /model )" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Modelni tanlang (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Ulangan agent hech qanday tanlanadigan modelni eʼlon qilmadi." system.model_set: "Bu panel uchun model %{model} ga oʻrnatildi." # {Locked="%{model}"} diff --git a/tools/wta/locales/vi-VN.yml b/tools/wta/locales/vi-VN.yml index f8e1b9126..866b0c82f 100644 --- a/tools/wta/locales/vi-VN.yml +++ b/tools/wta/locales/vi-VN.yml @@ -205,6 +205,7 @@ system.choice_execution_failed: "Lựa chọn %{choice} không thành công: %{e # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "Chọn mô hình cho bảng này (/model để chuyển trực tiếp)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "Chọn mô hình (↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "Tác nhân AI đã kết nối không quảng bá bất kỳ mô hình nào có thể chọn." system.model_set: "Mô hình cho bảng này được đặt thành %{model}." # {Locked="%{model}"} diff --git a/tools/wta/locales/zh-CN.yml b/tools/wta/locales/zh-CN.yml index b286eba17..782603482 100644 --- a/tools/wta/locales/zh-CN.yml +++ b/tools/wta/locales/zh-CN.yml @@ -200,6 +200,7 @@ system.choice_execution_failed: "选项 %{choice} 执行失败:%{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "为此窗格选择模型(使用 /model 可直接切换)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "选择模型(↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "已连接的智能体未公布任何可选模型。" system.model_set: "此窗格的模型已设置为 %{model}。" # {Locked="%{model}"} diff --git a/tools/wta/locales/zh-TW.yml b/tools/wta/locales/zh-TW.yml index 405d07965..940e62bfc 100644 --- a/tools/wta/locales/zh-TW.yml +++ b/tools/wta/locales/zh-TW.yml @@ -200,6 +200,7 @@ system.choice_execution_failed: "選項 %{choice} 執行失敗:%{error}" # ── Model picker (/model) ─────────────────────────────────────────────────── commands.model.summary: "為此窗格選擇模型(使用 /model 可直接切換)" # {Locked="/model",""} +commands.workspace.summary: "Save or restore agent session workspaces (/workspace save|list)" # {Locked="/workspace","save|list"} model_picker.title: "選擇模型(↑ ↓ • Enter • Esc)" # {Locked="↑","↓","Enter","Esc"} system.no_models: "已連線的智能體未公布任何可選取的模型。" system.model_set: "此窗格的模型已設定為 %{model}。" # {Locked="%{model}"} diff --git a/tools/wta/src/app.rs b/tools/wta/src/app.rs index a30f5977a..db19ad4e4 100644 --- a/tools/wta/src/app.rs +++ b/tools/wta/src/app.rs @@ -1346,6 +1346,22 @@ pub enum AppEvent { MasterMutationCompleted { request_id: u64, }, + /// Terminal command output captured after an agent-approved `Send` + /// action executes. Emitted by the coordinator's recommendation executor + /// once the command has had time to run. Routes to + /// `handle_command_output_ready` which submits a follow-up turn so the + /// agent sees what happened and can continue problem-solving + /// (multi-turn command execution, issue #203). + CommandOutputReady { + /// ACP session id — routes the follow-up to the right tab. + session_id: String, + /// WT pane where the command ran. + pane_id: String, + /// Command text that was sent (for inclusion in the follow-up prompt). + command: String, + /// Captured pane output (possibly truncated). + output: String, + }, } // --- Per-tab session storage --- @@ -2670,6 +2686,86 @@ impl App { } } + /// `/workspace [name]` — save or list named workspace snapshots. + /// + /// Sub-commands: + /// * `save [name]` — captures the current session's key, CLI source, + /// and working directory into a named slot (defaults to `"default"`). + /// * `list` (or bare `/workspace`) — shows all saved workspace names. + fn cmd_workspace(&mut self, args: String) { + let mut parts = args.trim().splitn(2, ' '); + let sub = parts.next().unwrap_or("").trim(); + let name_arg = parts.next().unwrap_or("").trim(); + let name = if name_arg.is_empty() { "default" } else { name_arg }; + + match sub { + "save" => { + // Look up the live agent session for this pane via pane_session_id. + let session_info = self + .pane_id + .as_deref() + .and_then(|pid| self.agent_sessions.key_for_pane(pid)) + .and_then(|key| self.agent_sessions.get(&key)) + .map(|s| (s.key.clone(), s.cli_source.clone(), s.cwd.clone())); + + let Some((session_key, cli_source, cwd)) = session_info else { + let tab = self.current_tab_mut(); + tab.messages.push(ChatMessage::System( + "No active agent session to save.".to_string(), + )); + tab.scroll_to_bottom(); + return; + }; + + match crate::workspace_snapshot::save(name, session_key, cli_source, cwd) { + Ok(snap) => { + let short_key = &snap.session_key[..snap.session_key.len().min(8)]; + let msg = format!( + "Workspace '{}' saved (session: {}).", + snap.name, short_key + ); + let tab = self.current_tab_mut(); + tab.messages.push(ChatMessage::System(msg)); + tab.scroll_to_bottom(); + } + Err(e) => { + let tab = self.current_tab_mut(); + tab.messages.push(ChatMessage::System(e)); + tab.scroll_to_bottom(); + } + } + } + "list" | "" => { + match crate::workspace_snapshot::list() { + Ok(names) if names.is_empty() => { + let tab = self.current_tab_mut(); + tab.messages + .push(ChatMessage::System("No saved workspaces.".to_string())); + tab.scroll_to_bottom(); + } + Ok(names) => { + let msg = format!("Saved workspaces: {}", names.join(", ")); + let tab = self.current_tab_mut(); + tab.messages.push(ChatMessage::System(msg)); + tab.scroll_to_bottom(); + } + Err(e) => { + let tab = self.current_tab_mut(); + tab.messages.push(ChatMessage::System(e)); + tab.scroll_to_bottom(); + } + } + } + _ => { + let tab = self.current_tab_mut(); + tab.messages.push(ChatMessage::System( + "Usage: /workspace save [name] | /workspace list".to_string(), + )); + tab.scroll_to_bottom(); + } + } + } + /// Open the picker on the active tab, pre-selecting the model the pane is /// currently effectively on (so Enter is a confirm and arrows move /// relative to "here"). Mirrors `current_model_display`'s precedence: @@ -4413,6 +4509,7 @@ impl App { AppEvent::AgentsSnapshotLoaded { .. } => "agents_snapshot_loaded", AppEvent::AgentsSnapshotFailed { .. } => "agents_snapshot_failed", AppEvent::MasterMutationCompleted { .. } => "master_mutation_completed", + AppEvent::CommandOutputReady { .. } => "command_output_ready", AppEvent::RevealTick => "reveal_tick", } } @@ -5175,6 +5272,14 @@ impl App { tracing::debug!(target: "agents_view", request_id, "master mutation completed; refetching open views"); self.schedule_agents_refetch_for_open_views(); } + AppEvent::CommandOutputReady { + session_id, + pane_id, + command, + output, + } => { + self.handle_command_output_ready(session_id, pane_id, command, output); + } AppEvent::WtEvent { method, pane_id, @@ -7155,6 +7260,7 @@ impl App { CommandKind::Sessions => self.cmd_sessions(), CommandKind::Restart => self.cmd_restart(), CommandKind::Model => self.cmd_model(cmd.rest), + CommandKind::Workspace => self.cmd_workspace(cmd.rest), } } @@ -8428,6 +8534,7 @@ impl App { .send(crate::coordinator::ChoiceExecution { choice, insert_only, + session_id: Some(session_id.to_string()), }); if armed_pane.is_some() { self.emit_autofix_state_cleared(&target_tab); @@ -8466,6 +8573,53 @@ impl App { self.recompute_chip_override(&target_tab); } + /// Handle resolved command output for multi-turn agent execution + /// (issue #203). Called from the `CommandOutputReady` event when the + /// coordinator's recommendation executor has captured what a terminal + /// command produced after an agent-approved `Send` action. Assembles a + /// concise follow-up prompt with the command and output so the agent can + /// observe what happened and continue problem-solving. + /// + /// The turn is submitted to the same tab/session that originated the + /// `Send` action. If the session has no tab (e.g. it was torn down in + /// the ~3 s delay), the event is dropped silently. + fn handle_command_output_ready( + &mut self, + session_id: String, + _pane_id: String, + command: String, + output: String, + ) { + let target_tab_id = self.tab_for_session(&session_id); + tracing::debug!( + target: "multi_turn", + session_id = %session_id, + command_chars = command.len(), + output_chars = output.len(), + "command_output_ready: submitting follow-up turn" + ); + let text = if command.is_empty() { + format!( + "The terminal command finished. Here is the output:\n```\n{output}\n```\n\ + Please review the result and continue." + ) + } else { + format!( + "The command `{command}` finished. Here is the output:\n```\n{output}\n```\n\ + Please review the result and continue." + ) + }; + let prompt = PromptSubmission::new(text.clone(), None); + let submitted = SubmittedPrompt { + id: prompt.id, + text, + submitted_at_unix_s: prompt.submitted_at_unix_s, + autofix: None, + }; + self.turn_submit_prompt_for_tab(&target_tab_id, submitted); + let _ = self.prompt_tx.send(prompt); + } + /// User pressed Esc — cancel the in-flight turn. Bumps /// `autofix_generation` so any chunks that arrive after this point are /// dropped by the stale-check in `turn_observe_chunk`. diff --git a/tools/wta/src/commands.rs b/tools/wta/src/commands.rs index 3176c8cc2..1baa84c97 100644 --- a/tools/wta/src/commands.rs +++ b/tools/wta/src/commands.rs @@ -45,6 +45,12 @@ pub enum CommandKind { /// the life of the pane but is reset by a global `acpModel` settings /// change — see `App::apply_global_acp_model`. Model, + /// Save or list named workspace snapshots of the current agent session. + /// + /// `/workspace save [name]` — captures session key, CLI source, and + /// working directory into a named slot (defaults to `"default"`). + /// `/workspace list` — shows all saved workspace names. + Workspace, } #[derive(Debug, Clone, Copy)] @@ -124,6 +130,13 @@ pub const REGISTRY: &[CommandSpec] = &[ kind: CommandKind::Model, takes_args: true, }, + CommandSpec { + name: "workspace", + summary_key: "commands.workspace.summary", + // `/workspace save [name]` saves; `/workspace list` lists. + kind: CommandKind::Workspace, + takes_args: true, + }, ]; #[derive(Debug, Clone)] diff --git a/tools/wta/src/main.rs b/tools/wta/src/main.rs index 8b00b8f0e..e688e78a8 100644 --- a/tools/wta/src/main.rs +++ b/tools/wta/src/main.rs @@ -27,6 +27,7 @@ mod runtime_paths; mod session_mgmt; mod session_registry; mod session_watcher; +mod workspace_snapshot; mod shell; mod telemetry; #[cfg(test)] diff --git a/tools/wta/src/slash_command_tests.rs b/tools/wta/src/slash_command_tests.rs index db0f80425..df5f4696c 100644 --- a/tools/wta/src/slash_command_tests.rs +++ b/tools/wta/src/slash_command_tests.rs @@ -273,3 +273,27 @@ fn slash_model_direct_switch_sets_override() { "a direct /model switch must not leave the picker open" ); } + +#[test] +fn slash_workspace_list_when_no_snapshots_shows_system_message() { + let mut app = test_app(); + // No pane_id set, no session registered — list falls through to the + // snapshot store (empty in test env) and emits a system message. + run_slash_args(&mut app, "workspace", "list"); + let last = app.current_tab().messages.last().unwrap(); + assert!( + matches!(last, ChatMessage::System(_)), + "/workspace list must emit a System message, got {last:?}" + ); +} + +#[test] +fn slash_workspace_unknown_subcommand_shows_usage() { + let mut app = test_app(); + run_slash_args(&mut app, "workspace", "foobar"); + let last = app.current_tab().messages.last().unwrap(); + assert!( + matches!(last, ChatMessage::System(_)), + "/workspace must emit a usage System message, got {last:?}" + ); +} diff --git a/tools/wta/src/workspace_snapshot.rs b/tools/wta/src/workspace_snapshot.rs new file mode 100644 index 000000000..0f01d46d3 --- /dev/null +++ b/tools/wta/src/workspace_snapshot.rs @@ -0,0 +1,311 @@ +//! Agent workspace snapshot and restore. +//! +//! A workspace snapshot captures the agent session state for the currently +//! active pane so it can be restored as a new tab later. This covers: +//! +//! * The agent session key (e.g. Claude's UUID, Gemini's sessionId) +//! * The agent CLI source (Claude, Codex, Copilot, Gemini, …) +//! * The working directory at snapshot time +//! * A user-supplied or auto-generated name for the snapshot +//! +//! Snapshots are persisted as a JSON file in the user's config directory +//! (`intelligent_terminal_root() / "workspaces.json"`) so they survive +//! Terminal restarts. +//! +//! The `/workspace save [name]` command writes a snapshot; `/workspace restore +//! [name]` lists or restores one. Absent a name, both commands operate on a +//! single default slot named `"default"`. + +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; +use std::path::PathBuf; + +use crate::agent_sessions::CliSource; + +// ── Data model ──────────────────────────────────────────────────────────────── + +/// A point-in-time capture of an agent pane's session state. +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub struct WorkspaceSnapshot { + /// Snapshot name — the key under which it is stored. + pub name: String, + /// Agent session key (what `--resume` / `session/load` consumes). + pub session_key: String, + /// Which CLI this session belongs to. + pub cli_source: CliSource, + /// Working directory at snapshot time. + pub working_directory: PathBuf, + /// RFC 3339 timestamp (seconds-precision). + pub saved_at: String, +} + +/// The persisted store: a map of snapshot name → snapshot. +#[derive(Debug, Default, Serialize, Deserialize)] +struct SnapshotStore { + snapshots: HashMap, +} + +// ── Persistence path ────────────────────────────────────────────────────────── + +/// Path to the JSON file that holds all workspace snapshots. +/// +/// Returns `None` only when `LOCALAPPDATA` / `APPDATA` is unset — which means +/// we're in an environment where persistence is impossible (e.g. a stripped +/// sandbox). The callers surface an error message in that case. +pub fn snapshot_store_path() -> Option { + crate::runtime_paths::intelligent_terminal_root() + .map(|root| root.join("workspaces.json")) +} + +// ── Load / save helpers ─────────────────────────────────────────────────────── + +fn load_store(path: &PathBuf) -> SnapshotStore { + let Ok(bytes) = std::fs::read(path) else { + return SnapshotStore::default(); + }; + serde_json::from_slice(&bytes).unwrap_or_default() +} + +fn save_store(path: &PathBuf, store: &SnapshotStore) -> std::io::Result<()> { + if let Some(parent) = path.parent() { + std::fs::create_dir_all(parent)?; + } + let json = serde_json::to_vec_pretty(store) + .map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e))?; + std::fs::write(path, json) +} + +fn now_rfc3339() -> String { + // Use std::time for portability; format manually to RFC 3339 seconds precision. + use std::time::{SystemTime, UNIX_EPOCH}; + let secs = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap_or_default() + .as_secs(); + // Format as UTC: YYYY-MM-DDTHH:MM:SSZ + let s = secs; + let sec = s % 60; + let min = (s / 60) % 60; + let hour = (s / 3600) % 24; + let days = s / 86400; // days since epoch + // Compute calendar date from days since 1970-01-01 + let (year, month, day) = days_to_ymd(days); + format!("{year:04}-{month:02}-{day:02}T{hour:02}:{min:02}:{sec:02}Z") +} + +fn days_to_ymd(mut days: u64) -> (u64, u64, u64) { + // Gregorian calendar computation. + let mut year = 1970u64; + loop { + let leap = is_leap(year); + let days_in_year = if leap { 366 } else { 365 }; + if days < days_in_year { + break; + } + days -= days_in_year; + year += 1; + } + let leap = is_leap(year); + let month_days: &[u64] = if leap { + &[31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] + } else { + &[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] + }; + let mut month = 1u64; + for &md in month_days { + if days < md { + break; + } + days -= md; + month += 1; + } + (year, month, days + 1) +} + +fn is_leap(y: u64) -> bool { + (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0) +} + +// ── Public API ──────────────────────────────────────────────────────────────── + +/// Save a workspace snapshot under `name`. +/// +/// Returns the saved [`WorkspaceSnapshot`] on success, or an error string +/// suitable for surfacing as a `ChatMessage::System`. +pub fn save( + name: &str, + session_key: String, + cli_source: CliSource, + working_directory: PathBuf, +) -> Result { + let path = snapshot_store_path() + .ok_or_else(|| "Cannot determine config directory for workspace storage".to_string())?; + + let snap = WorkspaceSnapshot { + name: name.to_string(), + session_key, + cli_source, + working_directory, + saved_at: now_rfc3339(), + }; + + let mut store = load_store(&path); + store.snapshots.insert(name.to_string(), snap.clone()); + save_store(&path, &store) + .map_err(|e| format!("Failed to write workspace snapshot: {e}"))?; + + Ok(snap) +} + +/// Load a named workspace snapshot. Returns `None` when `name` has no saved +/// snapshot yet. +pub fn load(name: &str) -> Result, String> { + let path = snapshot_store_path() + .ok_or_else(|| "Cannot determine config directory for workspace storage".to_string())?; + + let store = load_store(&path); + Ok(store.snapshots.get(name).cloned()) +} + +/// Return all stored snapshot names, sorted alphabetically. +pub fn list() -> Result, String> { + let path = snapshot_store_path() + .ok_or_else(|| "Cannot determine config directory for workspace storage".to_string())?; + + let store = load_store(&path); + let mut names: Vec = store.snapshots.keys().cloned().collect(); + names.sort(); + Ok(names) +} + +/// Delete a named snapshot. No-op (not an error) if the name does not exist. +pub fn delete(name: &str) -> Result<(), String> { + let path = snapshot_store_path() + .ok_or_else(|| "Cannot determine config directory for workspace storage".to_string())?; + + let mut store = load_store(&path); + store.snapshots.remove(name); + save_store(&path, &store) + .map_err(|e| format!("Failed to write workspace snapshot: {e}")) +} + +// ── Unit tests ──────────────────────────────────────────────────────────────── + +#[cfg(test)] +mod tests { + use super::*; + use std::path::Path; + use tempfile::NamedTempFile; + + fn dummy_snap(name: &str) -> WorkspaceSnapshot { + WorkspaceSnapshot { + name: name.to_string(), + session_key: "key-abc".to_string(), + cli_source: CliSource::Claude, + working_directory: PathBuf::from("/home/user/project"), + saved_at: "2024-01-01T00:00:00Z".to_string(), + } + } + + fn round_trip_via_path(path: &std::path::PathBuf, name: &str) -> WorkspaceSnapshot { + let snap = dummy_snap(name); + let mut store = SnapshotStore::default(); + store.snapshots.insert(name.to_string(), snap.clone()); + save_store(path, &store).unwrap(); + + let loaded = load_store(path); + loaded.snapshots.get(name).unwrap().clone() + } + + #[test] + fn round_trip_serialization() { + let file = NamedTempFile::new().unwrap(); + let path = file.path().to_path_buf(); + let snap = round_trip_via_path(&path, "default"); + assert_eq!(snap.session_key, "key-abc"); + assert_eq!(snap.cli_source, CliSource::Claude); + assert_eq!(snap.working_directory, Path::new("/home/user/project")); + } + + #[test] + fn multiple_snapshots_stored_independently() { + let file = NamedTempFile::new().unwrap(); + let path = file.path().to_path_buf(); + + let mut store = SnapshotStore::default(); + for name in ["alpha", "beta", "gamma"] { + store.snapshots.insert(name.to_string(), dummy_snap(name)); + } + save_store(&path, &store).unwrap(); + + let reloaded = load_store(&path); + assert_eq!(reloaded.snapshots.len(), 3); + assert!(reloaded.snapshots.contains_key("alpha")); + assert!(reloaded.snapshots.contains_key("gamma")); + } + + #[test] + fn load_missing_file_returns_empty_store() { + let path = PathBuf::from("/tmp/__wta_no_such_file_xyz__.json"); + let store = load_store(&path); + assert!(store.snapshots.is_empty()); + } + + #[test] + fn overwrite_existing_snapshot() { + let file = NamedTempFile::new().unwrap(); + let path = file.path().to_path_buf(); + + let mut store = SnapshotStore::default(); + store + .snapshots + .insert("default".to_string(), dummy_snap("default")); + save_store(&path, &store).unwrap(); + + // Overwrite with a different session key. + let updated = WorkspaceSnapshot { + name: "default".to_string(), + session_key: "key-xyz".to_string(), + cli_source: CliSource::Gemini, + working_directory: PathBuf::from("/other"), + saved_at: "2025-06-01T12:00:00Z".to_string(), + }; + let mut store2 = load_store(&path); + store2 + .snapshots + .insert("default".to_string(), updated.clone()); + save_store(&path, &store2).unwrap(); + + let final_store = load_store(&path); + assert_eq!( + final_store.snapshots["default"].session_key, + "key-xyz" + ); + assert_eq!( + final_store.snapshots["default"].cli_source, + CliSource::Gemini + ); + } + + #[test] + fn days_to_ymd_epoch() { + assert_eq!(days_to_ymd(0), (1970, 1, 1)); + } + + #[test] + fn days_to_ymd_known_date() { + // 2024-01-01 is 19723 days after 1970-01-01. + assert_eq!(days_to_ymd(19723), (2024, 1, 1)); + } + + #[test] + fn now_rfc3339_format() { + let s = now_rfc3339(); + // Basic shape: YYYY-MM-DDTHH:MM:SSZ + assert_eq!(s.len(), 20, "unexpected length: {s}"); + assert_eq!(&s[4..5], "-"); + assert_eq!(&s[7..8], "-"); + assert_eq!(&s[10..11], "T"); + assert!(s.ends_with('Z')); + } +}