feat(ios): replace the tab bar with a black overlay sidebar (web parity + dashboard) (#111339)

* feat(ios): unify navigation on a black overlay sidebar and drop the phone tab bar

* test(ios): rework navigation tests and snapshot UITests for the sidebar shell

* chore(i18n): sync derived native catalogs for sidebar strings

* feat(ios): reveal the sidebar beneath a push-away rounded content card

* feat(ios): web-parity sidebar — agent switcher, pinned pages, sessions vocabulary, uniform content card

* chore(i18n): translate sidebar and session strings across native catalogs

* fix(ios): sidebar footer shows connection dot only when degraded, like the web

* feat(ios): sidebar toggle top-left with edge-swipe open; card surface owns the drawer chrome

* fix(ios): single sidebar refresh owner, alias-aware Home badges, RM tap-close, user pin order, drop vestigial idiom shims

* feat(ios): align sidebar with the mobile prototype — agent roster, theme-following palette, web session subtitles, row badges

* chore(i18n): translate agent roster and Recent strings across native catalogs

* feat(ios): frosted-glass agent picker with uniform drawer insets

* fix(ios): address sidebar review findings — settings toggle edge, per-agent scoping, alias-aware selection, cron paging, refresh cadence

* fix(ios): clear landing CI blockers
This commit is contained in:
Peter Steinberger
2026-07-19 14:50:39 -07:00
committed by GitHub
parent 5420c5c409
commit 0fff74c800
80 changed files with 13209 additions and 9000 deletions
+347 -281
View File
@@ -320,7 +320,6 @@
"source": "Agent",
"translations": [
"Agent",
"代理",
"代理程式"
]
},
@@ -861,14 +860,6 @@
"Aufmerksamkeit erforderlich"
]
},
{
"locale": "fa",
"source": "Attention",
"translations": [
"توجه",
"نیازمند توجه"
]
},
{
"locale": "id",
"source": "Attention",
@@ -885,14 +876,6 @@
"주의 필요"
]
},
{
"locale": "nl",
"source": "Attention",
"translations": [
"Aandacht",
"Let op"
]
},
{
"locale": "pl",
"source": "Attention",
@@ -914,7 +897,6 @@
"source": "Attention",
"translations": [
"Kräver uppmärksamhet",
"Observera",
"Åtgärd krävs"
]
},
@@ -923,8 +905,7 @@
"source": "Attention",
"translations": [
"ต้องดำเนินการ",
"ต้องตรวจสอบ",
"โปรดทราบ"
"ต้องตรวจสอบ"
]
},
{
@@ -935,14 +916,6 @@
"Увага"
]
},
{
"locale": "vi",
"source": "Attention",
"translations": [
"Chú ý",
"Cần chú ý"
]
},
{
"locale": "zh-CN",
"source": "Attention",
@@ -951,14 +924,6 @@
"需要注意"
]
},
{
"locale": "zh-TW",
"source": "Attention",
"translations": [
"注意",
"需要注意"
]
},
{
"locale": "hi",
"source": "Automations",
@@ -1093,7 +1058,6 @@
"source": "Chat",
"translations": [
"Chat",
"چت",
"گفت‌وگو"
]
},
@@ -1587,14 +1551,6 @@
"已連線"
]
},
{
"locale": "de",
"source": "Connecting",
"translations": [
"Verbinden",
"Verbindung wird hergestellt"
]
},
{
"locale": "fr",
"source": "Connecting",
@@ -1756,22 +1712,6 @@
"Devam et"
]
},
{
"locale": "hi",
"source": "Control",
"translations": [
"कंट्रोल",
"नियंत्रण"
]
},
{
"locale": "th",
"source": "Control",
"translations": [
"การควบคุม",
"ควบคุม"
]
},
{
"locale": "fa",
"source": "Copy Session Key",
@@ -2051,8 +1991,7 @@
"source": "Default Agent",
"translations": [
"Varsayılan Agent",
"Varsayılan Ajan",
"Varsayılan Temsilci"
"Varsayılan Ajan"
]
},
{
@@ -2076,8 +2015,7 @@
"source": "Default Agent",
"translations": [
"預設 Agent",
"預設代理",
"預設代理程式"
"預設代理"
]
},
{
@@ -2160,46 +2098,6 @@
"删除群组"
]
},
{
"locale": "ar",
"source": "Delete Thread",
"translations": [
"حذف المحادثة",
"حذف سلسلة المحادثة"
]
},
{
"locale": "sv",
"source": "Delete Thread",
"translations": [
"Radera tråd",
"Ta bort tråd"
]
},
{
"locale": "tr",
"source": "Delete Thread",
"translations": [
"İleti Dizisini Sil",
"İş Parçacığını Sil"
]
},
{
"locale": "zh-CN",
"source": "Delete Thread",
"translations": [
"删除对话",
"删除话题"
]
},
{
"locale": "zh-TW",
"source": "Delete Thread",
"translations": [
"刪除對話串",
"刪除討論串"
]
},
{
"locale": "fr",
"source": "Delete “%@”?",
@@ -2771,8 +2669,7 @@
"translations": [
"Dreaming",
"구상 중",
"꿈꾸는 중",
"드리밍"
"꿈꾸는 중"
]
},
{
@@ -2830,8 +2727,7 @@
"Dreaming",
"Düş kuruyor",
"Düşünüyor",
"Hayal Kuruyor",
"Rüya Görüyor"
"Hayal Kuruyor"
]
},
{
@@ -4420,6 +4316,150 @@
"載入中"
]
},
{
"locale": "de",
"source": "Loading sessions",
"translations": [
"Loading sessions",
"Sitzungen werden geladen"
]
},
{
"locale": "es",
"source": "Loading sessions",
"translations": [
"Cargando sesiones",
"Loading sessions"
]
},
{
"locale": "fa",
"source": "Loading sessions",
"translations": [
"Loading sessions",
"در حال بارگذاری جلسه‌ها"
]
},
{
"locale": "fr",
"source": "Loading sessions",
"translations": [
"Chargement des sessions",
"Loading sessions"
]
},
{
"locale": "hi",
"source": "Loading sessions",
"translations": [
"Loading sessions",
"सत्र लोड हो रहे हैं"
]
},
{
"locale": "id",
"source": "Loading sessions",
"translations": [
"Loading sessions",
"Memuat sesi"
]
},
{
"locale": "it",
"source": "Loading sessions",
"translations": [
"Caricamento delle sessioni",
"Caricamento sessioni"
]
},
{
"locale": "ja-JP",
"source": "Loading sessions",
"translations": [
"Loading sessions",
"セッションを読み込み中"
]
},
{
"locale": "ko",
"source": "Loading sessions",
"translations": [
"Loading sessions",
"세션 불러오는 중"
]
},
{
"locale": "nl",
"source": "Loading sessions",
"translations": [
"Loading sessions",
"Sessies laden"
]
},
{
"locale": "pl",
"source": "Loading sessions",
"translations": [
"Loading sessions",
"Wczytywanie sesji"
]
},
{
"locale": "pt-BR",
"source": "Loading sessions",
"translations": [
"Carregando sessões",
"Loading sessions"
]
},
{
"locale": "ru",
"source": "Loading sessions",
"translations": [
"Loading sessions",
"Загрузка сеансов"
]
},
{
"locale": "sv",
"source": "Loading sessions",
"translations": [
"Loading sessions",
"Läser in sessioner"
]
},
{
"locale": "th",
"source": "Loading sessions",
"translations": [
"Loading sessions",
"กำลังโหลดเซสชัน"
]
},
{
"locale": "uk",
"source": "Loading sessions",
"translations": [
"Loading sessions",
"Завантаження сеансів"
]
},
{
"locale": "vi",
"source": "Loading sessions",
"translations": [
"Đang tải các phiên",
"Đang tải phiên"
]
},
{
"locale": "zh-TW",
"source": "Loading sessions",
"translations": [
"Loading sessions",
"正在載入工作階段"
]
},
{
"locale": "fr",
"source": "Location",
@@ -5064,7 +5104,6 @@
"locale": "fr",
"source": "Needs attention",
"translations": [
"Attention requise",
"Nécessite une attention",
"Nécessite votre attention"
]
@@ -5085,6 +5124,14 @@
"Vereist aandacht"
]
},
{
"locale": "pt-BR",
"source": "Needs attention",
"translations": [
"Precisa de atenção",
"Requer atenção"
]
},
{
"locale": "sv",
"source": "Needs attention",
@@ -5099,7 +5146,7 @@
"translations": [
"ต้องการการดูแล",
"ต้องการความสนใจ",
"ต้องดำเนินการ"
"ต้องตรวจสอบ"
]
},
{
@@ -5107,8 +5154,7 @@
"source": "Needs attention",
"translations": [
"Dikkat gerekiyor",
"Dikkat gerektiriyor",
"İlgilenilmesi gerekiyor"
"Dikkat gerektiriyor"
]
},
{
@@ -5271,46 +5317,6 @@
"沒有待處理的核准"
]
},
{
"locale": "fr",
"source": "No archived threads",
"translations": [
"Aucun fil archivé",
"Aucun fil de discussion archivé"
]
},
{
"locale": "nl",
"source": "No archived threads",
"translations": [
"Geen gearchiveerde gesprekken",
"Geen gearchiveerde threads"
]
},
{
"locale": "uk",
"source": "No archived threads",
"translations": [
"Немає архівних гілок",
"Немає архівованих гілок"
]
},
{
"locale": "vi",
"source": "No archived threads",
"translations": [
"Không có luồng nào đã lưu trữ",
"Không có luồng nào được lưu trữ"
]
},
{
"locale": "zh-TW",
"source": "No archived threads",
"translations": [
"沒有已封存的對話串",
"沒有已封存的討論串"
]
},
{
"locale": "hi",
"source": "No automations yet",
@@ -5527,6 +5533,145 @@
"尚無聊天訊息"
]
},
{
"locale": "de",
"source": "No recent sessions",
"translations": [
"Keine kürzlich verwendeten Sitzungen",
"Keine letzten Sitzungen",
"No recent sessions"
]
},
{
"locale": "es",
"source": "No recent sessions",
"translations": [
"No hay sesiones recientes",
"No recent sessions"
]
},
{
"locale": "fa",
"source": "No recent sessions",
"translations": [
"No recent sessions",
"جلسه اخیری وجود ندارد",
"نشست اخیری وجود ندارد"
]
},
{
"locale": "fr",
"source": "No recent sessions",
"translations": [
"Aucune session récente",
"No recent sessions"
]
},
{
"locale": "hi",
"source": "No recent sessions",
"translations": [
"No recent sessions",
"कोई हालिया सत्र नहीं"
]
},
{
"locale": "id",
"source": "No recent sessions",
"translations": [
"No recent sessions",
"Tidak ada sesi terbaru"
]
},
{
"locale": "ja-JP",
"source": "No recent sessions",
"translations": [
"No recent sessions",
"最近のセッションはありません"
]
},
{
"locale": "ko",
"source": "No recent sessions",
"translations": [
"No recent sessions",
"최근 세션 없음"
]
},
{
"locale": "nl",
"source": "No recent sessions",
"translations": [
"Geen recente sessies",
"No recent sessions"
]
},
{
"locale": "pl",
"source": "No recent sessions",
"translations": [
"Brak ostatnich sesji",
"No recent sessions"
]
},
{
"locale": "pt-BR",
"source": "No recent sessions",
"translations": [
"Nenhuma sessão recente",
"No recent sessions"
]
},
{
"locale": "ru",
"source": "No recent sessions",
"translations": [
"No recent sessions",
"Нет недавних сеансов"
]
},
{
"locale": "sv",
"source": "No recent sessions",
"translations": [
"Inga senaste sessioner",
"No recent sessions"
]
},
{
"locale": "th",
"source": "No recent sessions",
"translations": [
"No recent sessions",
"ไม่มีเซสชันล่าสุด"
]
},
{
"locale": "tr",
"source": "No recent sessions",
"translations": [
"Son oturum yok",
"Yakın zamanda oturum yok"
]
},
{
"locale": "uk",
"source": "No recent sessions",
"translations": [
"No recent sessions",
"Немає недавніх сеансів",
"Немає нещодавніх сеансів"
]
},
{
"locale": "zh-TW",
"source": "No recent sessions",
"translations": [
"No recent sessions",
"沒有最近的工作階段"
]
},
{
"locale": "ar",
"source": "No skills found",
@@ -6346,14 +6491,6 @@
"開啟設定 / Gateway"
]
},
{
"locale": "hi",
"source": "Overview",
"translations": [
"अवलोकन",
"ओवरव्यू"
]
},
{
"locale": "tr",
"source": "Overview",
@@ -6599,6 +6736,7 @@
"locale": "it",
"source": "Pinned",
"translations": [
"Fissata",
"Fissati",
"Fissato",
"In evidenza"
@@ -6965,6 +7103,22 @@
"即時語音"
]
},
{
"locale": "es",
"source": "Recent",
"translations": [
"Reciente",
"Recientes"
]
},
{
"locale": "fr",
"source": "Recent",
"translations": [
"Récent",
"Récents"
]
},
{
"locale": "hi",
"source": "Recent",
@@ -7368,14 +7522,6 @@
"重命名话题"
]
},
{
"locale": "zh-TW",
"source": "Rename Thread",
"translations": [
"重新命名對話串",
"重新命名討論串"
]
},
{
"locale": "ar",
"source": "Rename…",
@@ -8243,6 +8389,14 @@
"Захищено (TLS)"
]
},
{
"locale": "ar",
"source": "Selected",
"translations": [
"محدد",
"محدّد"
]
},
{
"locale": "es",
"source": "Selected",
@@ -8275,6 +8429,30 @@
"Seçili"
]
},
{
"locale": "fa",
"source": "Sessions unavailable",
"translations": [
"جلسه‌ها در دسترس نیستند",
"نشست‌ها در دسترس نیستند"
]
},
{
"locale": "vi",
"source": "Sessions unavailable",
"translations": [
"Không có phiên khả dụng",
"Không thể truy cập các phiên"
]
},
{
"locale": "zh-TW",
"source": "Sessions unavailable",
"translations": [
"工作階段無法使用",
"無法使用工作階段"
]
},
{
"locale": "ar",
"source": "Setup",
@@ -9244,118 +9422,6 @@
"话题名称"
]
},
{
"locale": "zh-TW",
"source": "Thread name",
"translations": [
"對話串名稱",
"討論串名稱"
]
},
{
"locale": "fr",
"source": "Threads",
"translations": [
"Fils",
"Fils de discussion"
]
},
{
"locale": "it",
"source": "Threads",
"translations": [
"Conversazioni",
"Thread"
]
},
{
"locale": "nl",
"source": "Threads",
"translations": [
"Gesprekken",
"Threads"
]
},
{
"locale": "tr",
"source": "Threads",
"translations": [
"Diziler",
"İş Parçacıkları"
]
},
{
"locale": "vi",
"source": "Threads",
"translations": [
"Chuỗi",
"Luồng"
]
},
{
"locale": "zh-CN",
"source": "Threads",
"translations": [
"对话",
"话题串"
]
},
{
"locale": "zh-TW",
"source": "Threads",
"translations": [
"對話串",
"討論串"
]
},
{
"locale": "ar",
"source": "Threads…",
"translations": [
"المحادثات…",
"سلاسل المحادثات…"
]
},
{
"locale": "it",
"source": "Threads…",
"translations": [
"Conversazioni…",
"Thread…"
]
},
{
"locale": "nl",
"source": "Threads…",
"translations": [
"Gesprekken…",
"Threads…"
]
},
{
"locale": "tr",
"source": "Threads…",
"translations": [
"İletişim Dizileri…",
"İş Parçacıkları…"
]
},
{
"locale": "zh-CN",
"source": "Threads…",
"translations": [
"会话…",
"对话…"
]
},
{
"locale": "zh-TW",
"source": "Threads…",
"translations": [
"對話串…",
"討論串…"
]
},
{
"locale": "uk",
"source": "Title",
File diff suppressed because it is too large Load Diff
+242 -202
View File
@@ -10581,7 +10581,7 @@
{
"id": "native.apple.463a0c3fc0724429",
"source": "Tokens",
"translated": "Tokens"
"translated": "الرموز"
},
{
"id": "native.apple.509cb464bd3190dd",
@@ -10869,9 +10869,9 @@
"translated": "ما الذي ترغب في العمل عليه؟"
},
{
"id": "native.apple.4da775013ac9b123",
"source": "The thread attaches once the gateway is ready.",
"translated": "سيتم إرفاق سلسلة المحادثات بمجرد أن تصبح البوابة جاهزة."
"id": "native.apple.ed7f703a8809b564",
"source": "The session attaches once the gateway is ready.",
"translated": "يتم إرفاق الجلسة بمجرد أن يصبح Gateway جاهزًا."
},
{
"id": "native.apple.02611ddddef7295a",
@@ -10919,9 +10919,9 @@
"translated": "خيارات جلسة جديدة…"
},
{
"id": "native.apple.003b25ddafeb18e9",
"source": "Threads…",
"translated": "سلاسل المحادثات…"
"id": "native.apple.a1b0d289758e2213",
"source": "Sessions…",
"translated": "الجلسات…"
},
{
"id": "native.apple.17c13312e7532c89",
@@ -11084,14 +11084,14 @@
"translated": "إنشاء"
},
{
"id": "native.apple.31d5c7287cfb3abe",
"source": "Delete Thread?",
"translated": "حذف سلسلة المحادثات؟"
"id": "native.apple.e7382c53c7dd48f7",
"source": "Delete Session?",
"translated": "حذف الجلسة؟"
},
{
"id": "native.apple.d3395564809f1120",
"source": "Delete Thread",
"translated": "حذف المحادثة"
"id": "native.apple.702fd8b48da56065",
"source": "Delete Session",
"translated": "حذف الجلسة"
},
{
"id": "native.apple.9b1aed19568a048e",
@@ -11099,9 +11099,9 @@
"translated": "إلغاء"
},
{
"id": "native.apple.092659256d26cb03",
"source": "This permanently deletes the thread and its transcript.",
"translated": "يؤدي هذا إلى حذف المحادثة ونصها نهائيًا."
"id": "native.apple.61f3f19ea24c6012",
"source": "This permanently deletes the session and its transcript.",
"translated": "يؤدي هذا إلى حذف الجلسة ونصها نهائيًا."
},
{
"id": "native.apple.0965d8d2429c3b9f",
@@ -11129,9 +11129,9 @@
"translated": "مجموعة جديدة"
},
{
"id": "native.apple.683032464c497bbd",
"source": "Rename Thread",
"translated": "إعادة تسمية المحادثة"
"id": "native.apple.cd368674179237a0",
"source": "Rename Session",
"translated": "إعادة تسمية الجلسة"
},
{
"id": "native.apple.31424500c53d6c32",
@@ -11139,15 +11139,55 @@
"translated": "اسم المجموعة"
},
{
"id": "native.apple.f887aa956588f237",
"source": "Thread name",
"translated": "اسم المحادثة"
"id": "native.apple.8b54306971cfa8c9",
"source": "Session name",
"translated": "اسم الجلسة"
},
{
"id": "native.apple.e8018adcccaa2a4d",
"source": "View More",
"translated": "عرض المزيد"
},
{
"id": "native.apple.e3ef1aa93156bd67",
"source": "Live",
"translated": "مباشر"
},
{
"id": "native.apple.bdfc040fb974b4aa",
"source": "Unread",
"translated": "غير مقروء"
},
{
"id": "native.apple.6f94924c0a736fcf",
"source": "Tokens",
"translated": "الرموز"
},
{
"id": "native.apple.bec8b61a3a29b59a",
"source": "Opens Sessions",
"translated": "يفتح الجلسات"
},
{
"id": "native.apple.69279daa342241c1",
"source": "Pending approvals",
"translated": "الموافقات المعلّقة"
},
{
"id": "native.apple.48af1bbb4fd06321",
"source": "Automation issues",
"translated": "مشكلات الأتمتة"
},
{
"id": "native.apple.3e4f2dd3a0d41b97",
"source": "31-day usage",
"translated": "استخدام 31 يومًا"
},
{
"id": "native.apple.c334a60ae7b4d508",
"source": "Opens Usage",
"translated": "يفتح الاستخدام"
},
{
"id": "native.apple.65fb4d9ce6e5bbda",
"source": "Gateway settings",
@@ -11179,14 +11219,14 @@
"translated": "الوكلاء"
},
{
"id": "native.apple.7c8231b7b1ca480f",
"source": "Agent thread",
"translated": "محادثة الوكيل"
"id": "native.apple.789d5d0790fd18ca",
"source": "Agent session",
"translated": "جلسة الوكيل"
},
{
"id": "native.apple.b3c553614f762a58",
"source": "Recent threads",
"translated": "المحادثات الأخيرة"
"id": "native.apple.ee45dce4a2e44737",
"source": "Recent sessions",
"translated": "الجلسات الأخيرة"
},
{
"id": "native.apple.9161ca3c61de6cc7",
@@ -11194,9 +11234,9 @@
"translated": "Gateway غير متصل"
},
{
"id": "native.apple.5aa32afda85064ea",
"source": "No recent threads",
"translated": "لا توجد محادثات أخيرة"
"id": "native.apple.c97e0382e578a2f7",
"source": "No recent sessions",
"translated": "لا توجد جلسات حديثة"
},
{
"id": "native.apple.79937d7781fb65ae",
@@ -11253,6 +11293,11 @@
"source": "Direct chat",
"translated": "دردشة مباشرة"
},
{
"id": "native.apple.7a39e0991fa3cd53",
"source": "just now",
"translated": "الآن"
},
{
"id": "native.apple.dbd48d25920f342b",
"source": "%@ on %@",
@@ -11294,14 +11339,14 @@
"translated": "إلغاء"
},
{
"id": "native.apple.b6855cf19a50f477",
"source": "Threads",
"translated": "المحادثات"
"id": "native.apple.7a6511a467e34f69",
"source": "Sessions",
"translated": "الجلسات"
},
{
"id": "native.apple.9b1d0ef27a1333b0",
"source": "Archived threads",
"translated": "المحادثات المؤرشفة"
"id": "native.apple.e6b8913014b64f0a",
"source": "Archived sessions",
"translated": "الجلسات المؤرشفة"
},
{
"id": "native.apple.bc8e64efb095a625",
@@ -11309,34 +11354,34 @@
"translated": "إظهار المؤرشفة"
},
{
"id": "native.apple.98167401c7267735",
"source": "Threads unavailable",
"translated": "المحادثات غير متاحة"
"id": "native.apple.119433782518f199",
"source": "Sessions unavailable",
"translated": "الجلسات غير متاحة"
},
{
"id": "native.apple.4d28a7def2337b9f",
"source": "Loading archived threads",
"translated": "جارٍ تحميل المحادثات المؤرشفة"
"id": "native.apple.9882fbadac3bea03",
"source": "Loading archived sessions",
"translated": "جارٍ تحميل الجلسات المؤرشفة"
},
{
"id": "native.apple.777d7b706933bd7b",
"source": "Loading recent threads",
"translated": "جارٍ تحميل المحادثات الأخيرة"
"id": "native.apple.16dca1cfac8a571b",
"source": "Loading recent sessions",
"translated": "جارٍ تحميل الجلسات الأخيرة"
},
{
"id": "native.apple.22f81ea94bef8410",
"source": "^[\\(count) thread](inflect: true)",
"translated": "^[\\(count) محادثة](inflect: true)"
"id": "native.apple.207dad20d09f3160",
"source": "^[\\(count) session](inflect: true)",
"translated": "^[\\(count) جلسة](inflect: true)"
},
{
"id": "native.apple.1cad51e14db59bf9",
"source": "No archived threads",
"translated": "لا توجد محادثات مؤرشفة"
"id": "native.apple.a0b4091bf77d4060",
"source": "No archived sessions",
"translated": "لا توجد جلسات مؤرشفة"
},
{
"id": "native.apple.18ef832d3a7ddcf8",
"source": "Archived threads will appear here.",
"translated": "ستظهر المحادثات المؤرشفة هنا."
"id": "native.apple.acfdf5c72e289736",
"source": "Archived sessions will appear here.",
"translated": "ستظهر الجلسات المؤرشفة هنا."
},
{
"id": "native.apple.e8e8cea7ec44fe08",
@@ -11419,9 +11464,9 @@
"translated": "مشاركة الإدخال"
},
{
"id": "native.apple.21d9208d86a4d1fe",
"source": "Loading threads",
"translated": "جارٍ تحميل المحادثات"
"id": "native.apple.4c5b2ecf243cfbbc",
"source": "Loading sessions",
"translated": "جارٍ تحميل الجلسات"
},
{
"id": "native.apple.48655128d0a34e44",
@@ -11429,19 +11474,19 @@
"translated": "جارٍ جلب النشاط الأخير من Gateway."
},
{
"id": "native.apple.4be1f79aa2b230ff",
"source": "Threads unavailable",
"translated": "المحادثات غير متاحة"
"id": "native.apple.c4479934c65c973c",
"source": "Sessions unavailable",
"translated": "الجلسات غير متاحة"
},
{
"id": "native.apple.98b348873556bc46",
"source": "No recent threads",
"translated": "لا توجد محادثات أخيرة"
"id": "native.apple.6e67b64954ba3002",
"source": "No recent sessions",
"translated": "لا توجد جلسات حديثة"
},
{
"id": "native.apple.7396d205574d279f",
"source": "Thread activity offline",
"translated": "نشاط المحادثة غير متصل"
"id": "native.apple.5dce07848bec08b5",
"source": "Session activity offline",
"translated": "نشاط الجلسة غير متصل"
},
{
"id": "native.apple.e3586d8a603f67e0",
@@ -11899,9 +11944,9 @@
"translated": "بطاقة"
},
{
"id": "native.apple.c9ec1b0e18074d8a",
"source": "Open Thread",
"translated": "فتح المحادثة"
"id": "native.apple.3edbccb7c14b693c",
"source": "Open Session",
"translated": "فتح الجلسة"
},
{
"id": "native.apple.a2732e4ff77a201b",
@@ -12103,91 +12148,6 @@
"source": "Offline",
"translated": "غير متصل"
},
{
"id": "native.apple.a2d8e7b4dba29764",
"source": "Control",
"translated": "التحكم"
},
{
"id": "native.apple.597471e86dda3d38",
"source": "Opens Settings / Gateway",
"translated": "يفتح الإعدادات / Gateway"
},
{
"id": "native.apple.ed16c9793f468dcd",
"source": "Agent chat and recent work.",
"translated": "محادثة الوكيل والعمل الأخير."
},
{
"id": "native.apple.a03e961ab14ba060",
"source": "Overview",
"translated": "نظرة عامة"
},
{
"id": "native.apple.feb28c9cba676ba2",
"source": "Instances",
"translated": "المثيلات"
},
{
"id": "native.apple.3f2726ccd1acd987",
"source": "Files",
"translated": "الملفات"
},
{
"id": "native.apple.614c9b40919fb103",
"source": "Dreaming",
"translated": "يحلم"
},
{
"id": "native.apple.e2b5c2d7c5d461a3",
"source": "Usage",
"translated": "الاستخدام"
},
{
"id": "native.apple.f21bf1e3b5ec896c",
"source": "Automations",
"translated": "عمليات الأتمتة"
},
{
"id": "native.apple.57587fec1ca582ec",
"source": "Default Agent",
"translated": "الوكيل الافتراضي"
},
{
"id": "native.apple.e0e99a802f07cc68",
"source": "Gateway",
"translated": "Gateway"
},
{
"id": "native.apple.731e5fccde7cbc86",
"source": "Gateway %1$@, %2$@, %3$@",
"translated": "Gateway %1$@، %2$@، %3$@"
},
{
"id": "native.apple.ab0a315f69e3d5df",
"source": "Gateway %1$@, %2$@",
"translated": "Gateway %1$@، %2$@"
},
{
"id": "native.apple.01ad746119fbc27d",
"source": "Online",
"translated": "متصل بالإنترنت"
},
{
"id": "native.apple.e253ef19f6e53371",
"source": "Connecting",
"translated": "جارٍ الاتصال"
},
{
"id": "native.apple.6f28b07ebdc2b25d",
"source": "Attention",
"translated": "تنبيه"
},
{
"id": "native.apple.1c931bcd1cd20334",
"source": "Offline",
"translated": "غير متصل"
},
{
"id": "native.apple.65602c216b89032d",
"source": "Channels / Integrations",
@@ -12988,6 +12948,16 @@
"source": "System follows this devices appearance setting.",
"translated": "يتبع النظام إعداد مظهر هذا الجهاز."
},
{
"id": "native.apple.6d48137a8f6a5e96",
"source": "Sidebar Agents",
"translated": "وكلاء الشريط الجانبي"
},
{
"id": "native.apple.69cccbdee0bb0b56",
"source": "How many agents the sidebar lists before the switcher menu.",
"translated": "عدد الوكلاء الذين يعرضهم الشريط الجانبي قبل قائمة التبديل."
},
{
"id": "native.apple.70eca66c79335a6e",
"source": "Connection",
@@ -13389,9 +13359,9 @@
"translated": "افتراضي"
},
{
"id": "native.apple.f4ae5664c3eda95d",
"source": "Used for new Chat threads and Talk sessions.",
"translated": "تُستخدم لمحادثات الدردشة الجديدة وجلسات التحدث."
"id": "native.apple.6805480889265026",
"source": "Used for new Chat and Talk sessions.",
"translated": "يُستخدم لجلسات الدردشة والتحدث الجديدة."
},
{
"id": "native.apple.19552e71de246322",
@@ -15624,39 +15594,134 @@
"translated": "unknown relay error"
},
{
"id": "native.apple.c23d35de8d70863f",
"id": "native.apple.8855710a55de2ed5",
"source": "OpenClaw",
"translated": "OpenClaw"
},
{
"id": "native.apple.9e781c0183b79a76",
"source": "OpenClaw %@",
"translated": "OpenClaw %@"
"id": "native.apple.7029e1235380a92c",
"source": "Settings",
"translated": "الإعدادات"
},
{
"id": "native.apple.f4eea6473f43388d",
"id": "native.apple.7042a7d70a7e5a20",
"source": "Hide Sidebar",
"translated": "إخفاء الشريط الجانبي"
},
{
"id": "native.apple.e779847164babc29",
"source": "Selected",
"translated": "محدّد"
},
{
"id": "native.apple.698c71602b569378",
"source": "More Agents",
"translated": "المزيد من الوكلاء"
},
{
"id": "native.apple.94772cbd85c42e6e",
"source": "Search sessions",
"translated": "البحث في الجلسات"
},
{
"id": "native.apple.38e1e910f0958067",
"source": "Clear session search",
"translated": "مسح بحث الجلسات"
},
{
"id": "native.apple.58248484e54174e3",
"source": "Loading sessions",
"translated": "جارٍ تحميل الجلسات"
},
{
"id": "native.apple.dfb5cbd55893c4e5",
"source": "No recent sessions",
"translated": "لا توجد جلسات حديثة"
},
{
"id": "native.apple.01a4c3f6192bb1a3",
"source": "Recent",
"translated": "الأخيرة"
},
{
"id": "native.apple.c0a4d120556df169",
"source": "All Sessions…",
"translated": "كل الجلسات…"
},
{
"id": "native.apple.aa7c4ecffd2ba36a",
"source": "Edit Pages",
"translated": "تعديل الصفحات"
},
{
"id": "native.apple.4d724d2e5731583d",
"source": "Home",
"translated": "الرئيسية"
},
{
"id": "native.apple.3995f7f73d1ded5f",
"source": "Unread",
"translated": "غير مقروء"
},
{
"id": "native.apple.b4567540cbcaf944",
"source": "Attention",
"translated": "تنبيه"
},
{
"id": "native.apple.14858678ae3f059f",
"source": "New Chat",
"translated": "دردشة جديدة"
},
{
"id": "native.apple.9d87aa7e7862a607",
"source": "Connection",
"translated": "الاتصال"
},
{
"id": "native.apple.7e7c47f471dd2c69",
"source": "Online",
"translated": "متصل"
},
{
"id": "native.apple.9e2aea6088887f1f",
"id": "native.apple.02ff27780aad60aa",
"source": "Connecting",
"translated": "جارٍ الاتصال"
},
{
"id": "native.apple.3624978c7d43335a",
"id": "native.apple.b2d0754aab434ea3",
"source": "Needs attention",
"translated": "يتطلب الانتباه"
},
{
"id": "native.apple.7da053dd774cb201",
"id": "native.apple.342c72a01b0f4bb1",
"source": "Offline",
"translated": "غير متصل"
},
{
"id": "native.apple.a4256b2ab523ee60",
"source": "Chat",
"translated": "الدردشة"
"id": "native.apple.9fc7dfa0dccea003",
"source": "Pinned pages stay in the sidebar. Home is always shown.",
"translated": "تظل الصفحات المثبتة في الشريط الجانبي. تظهر الصفحة الرئيسية دائمًا."
},
{
"id": "native.apple.4bfe6dc45811d50f",
"source": "Pages",
"translated": "الصفحات"
},
{
"id": "native.apple.422767686f219093",
"source": "Done",
"translated": "تم"
},
{
"id": "native.apple.e197e8708ad3b2c8",
"source": "Pinned",
"translated": "مثبّت"
},
{
"id": "native.apple.098013d7dd8cdfc7",
"source": "Not pinned",
"translated": "غير مثبّت"
},
{
"id": "native.apple.64d7dc062ef4cc81",
@@ -15693,46 +15758,21 @@
"source": "Automations",
"translated": "عمليات الأتمتة"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "إظهار الشريط الجانبي"
},
{
"id": "native.apple.bb0ea6d61a32c7c2",
"source": "Back to %@",
"translated": "العودة إلى %@"
},
{
"id": "native.apple.72fab75688479b3e",
"source": "Hide Sidebar",
"translated": "إخفاء الشريط الجانبي"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "إظهار الشريط الجانبي"
},
{
"id": "native.apple.8af43f59602ec0d8",
"source": "Close canvas",
"translated": "إغلاق اللوحة"
},
{
"id": "native.apple.a1db6ce0aed1d18e",
"source": "Chat, voice active",
"translated": "دردشة، الصوت مفعّل"
},
{
"id": "native.apple.bda6cfa988e49a75",
"source": "Control",
"translated": "التحكم"
},
{
"id": "native.apple.3c80f5351055a5f3",
"source": "Agent",
"translated": "الوكيل"
},
{
"id": "native.apple.22d107db5b905ef4",
"source": "Settings",
"translated": "الإعدادات"
},
{
"id": "native.apple.8a4751c86aa6fe77",
"source": "Gateway needs attention",
@@ -15794,9 +15834,9 @@
"translated": "المثيلات"
},
{
"id": "native.apple.11fe8b9941954dfb",
"source": "Threads",
"translated": "المحادثات"
"id": "native.apple.e3e3ce1a79ebbd70",
"source": "Sessions",
"translated": "الجلسات"
},
{
"id": "native.apple.253cb2debeb51859",
+242 -202
View File
@@ -10869,9 +10869,9 @@
"translated": "Woran möchten Sie arbeiten?"
},
{
"id": "native.apple.4da775013ac9b123",
"source": "The thread attaches once the gateway is ready.",
"translated": "Der Thread wird angehängt, sobald das Gateway bereit ist."
"id": "native.apple.ed7f703a8809b564",
"source": "The session attaches once the gateway is ready.",
"translated": "Die Sitzung wird verbunden, sobald das Gateway bereit ist."
},
{
"id": "native.apple.02611ddddef7295a",
@@ -10919,9 +10919,9 @@
"translated": "Optionen für neue Sitzung…"
},
{
"id": "native.apple.003b25ddafeb18e9",
"source": "Threads…",
"translated": "Threads…"
"id": "native.apple.a1b0d289758e2213",
"source": "Sessions…",
"translated": "Sitzungen…"
},
{
"id": "native.apple.17c13312e7532c89",
@@ -11084,14 +11084,14 @@
"translated": "Erstellen"
},
{
"id": "native.apple.31d5c7287cfb3abe",
"source": "Delete Thread?",
"translated": "Thread löschen?"
"id": "native.apple.e7382c53c7dd48f7",
"source": "Delete Session?",
"translated": "Sitzung löschen?"
},
{
"id": "native.apple.d3395564809f1120",
"source": "Delete Thread",
"translated": "Thread löschen"
"id": "native.apple.702fd8b48da56065",
"source": "Delete Session",
"translated": "Sitzung löschen"
},
{
"id": "native.apple.9b1aed19568a048e",
@@ -11099,9 +11099,9 @@
"translated": "Abbrechen"
},
{
"id": "native.apple.092659256d26cb03",
"source": "This permanently deletes the thread and its transcript.",
"translated": "Dadurch werden der Thread und sein Transkript dauerhaft gelöscht."
"id": "native.apple.61f3f19ea24c6012",
"source": "This permanently deletes the session and its transcript.",
"translated": "Dadurch werden die Sitzung und ihr Transkript dauerhaft gelöscht."
},
{
"id": "native.apple.0965d8d2429c3b9f",
@@ -11129,9 +11129,9 @@
"translated": "Neue Gruppe"
},
{
"id": "native.apple.683032464c497bbd",
"source": "Rename Thread",
"translated": "Thread umbenennen"
"id": "native.apple.cd368674179237a0",
"source": "Rename Session",
"translated": "Sitzung umbenennen"
},
{
"id": "native.apple.31424500c53d6c32",
@@ -11139,15 +11139,55 @@
"translated": "Gruppenname"
},
{
"id": "native.apple.f887aa956588f237",
"source": "Thread name",
"translated": "Thread-Name"
"id": "native.apple.8b54306971cfa8c9",
"source": "Session name",
"translated": "Sitzungsname"
},
{
"id": "native.apple.e8018adcccaa2a4d",
"source": "View More",
"translated": "Mehr anzeigen"
},
{
"id": "native.apple.e3ef1aa93156bd67",
"source": "Live",
"translated": "Live"
},
{
"id": "native.apple.bdfc040fb974b4aa",
"source": "Unread",
"translated": "Ungelesen"
},
{
"id": "native.apple.6f94924c0a736fcf",
"source": "Tokens",
"translated": "Tokens"
},
{
"id": "native.apple.bec8b61a3a29b59a",
"source": "Opens Sessions",
"translated": "Öffnet Sitzungen"
},
{
"id": "native.apple.69279daa342241c1",
"source": "Pending approvals",
"translated": "Ausstehende Genehmigungen"
},
{
"id": "native.apple.48af1bbb4fd06321",
"source": "Automation issues",
"translated": "Automation issues"
},
{
"id": "native.apple.3e4f2dd3a0d41b97",
"source": "31-day usage",
"translated": "31-day usage"
},
{
"id": "native.apple.c334a60ae7b4d508",
"source": "Opens Usage",
"translated": "Opens Usage"
},
{
"id": "native.apple.65fb4d9ce6e5bbda",
"source": "Gateway settings",
@@ -11179,14 +11219,14 @@
"translated": "Agents"
},
{
"id": "native.apple.7c8231b7b1ca480f",
"source": "Agent thread",
"translated": "Agenten-Thread"
"id": "native.apple.789d5d0790fd18ca",
"source": "Agent session",
"translated": "Agentensitzung"
},
{
"id": "native.apple.b3c553614f762a58",
"source": "Recent threads",
"translated": "Kürzlich verwendete Threads"
"id": "native.apple.ee45dce4a2e44737",
"source": "Recent sessions",
"translated": "Letzte Sitzungen"
},
{
"id": "native.apple.9161ca3c61de6cc7",
@@ -11194,9 +11234,9 @@
"translated": "Gateway offline"
},
{
"id": "native.apple.5aa32afda85064ea",
"source": "No recent threads",
"translated": "Keine kürzlich verwendeten Threads"
"id": "native.apple.c97e0382e578a2f7",
"source": "No recent sessions",
"translated": "Keine letzten Sitzungen"
},
{
"id": "native.apple.79937d7781fb65ae",
@@ -11253,6 +11293,11 @@
"source": "Direct chat",
"translated": "Direktchat"
},
{
"id": "native.apple.7a39e0991fa3cd53",
"source": "just now",
"translated": "just now"
},
{
"id": "native.apple.dbd48d25920f342b",
"source": "%@ on %@",
@@ -11294,14 +11339,14 @@
"translated": "Abbrechen"
},
{
"id": "native.apple.b6855cf19a50f477",
"source": "Threads",
"translated": "Threads"
"id": "native.apple.7a6511a467e34f69",
"source": "Sessions",
"translated": "Sitzungen"
},
{
"id": "native.apple.9b1d0ef27a1333b0",
"source": "Archived threads",
"translated": "Archivierte Threads"
"id": "native.apple.e6b8913014b64f0a",
"source": "Archived sessions",
"translated": "Archivierte Sitzungen"
},
{
"id": "native.apple.bc8e64efb095a625",
@@ -11309,34 +11354,34 @@
"translated": "Archivierte anzeigen"
},
{
"id": "native.apple.98167401c7267735",
"source": "Threads unavailable",
"translated": "Threads nicht verfügbar"
"id": "native.apple.119433782518f199",
"source": "Sessions unavailable",
"translated": "Sitzungen nicht verfügbar"
},
{
"id": "native.apple.4d28a7def2337b9f",
"source": "Loading archived threads",
"translated": "Archivierte Threads werden geladen"
"id": "native.apple.9882fbadac3bea03",
"source": "Loading archived sessions",
"translated": "Archivierte Sitzungen werden geladen"
},
{
"id": "native.apple.777d7b706933bd7b",
"source": "Loading recent threads",
"translated": "Kürzlich verwendete Threads werden geladen"
"id": "native.apple.16dca1cfac8a571b",
"source": "Loading recent sessions",
"translated": "Letzte Sitzungen werden geladen"
},
{
"id": "native.apple.22f81ea94bef8410",
"source": "^[\\(count) thread](inflect: true)",
"translated": "^[\\(count) Thread](inflect: true)"
"id": "native.apple.207dad20d09f3160",
"source": "^[\\(count) session](inflect: true)",
"translated": "^[\\(count) Sitzung](inflect: true)"
},
{
"id": "native.apple.1cad51e14db59bf9",
"source": "No archived threads",
"translated": "Keine archivierten Threads"
"id": "native.apple.a0b4091bf77d4060",
"source": "No archived sessions",
"translated": "Keine archivierten Sitzungen"
},
{
"id": "native.apple.18ef832d3a7ddcf8",
"source": "Archived threads will appear here.",
"translated": "Archivierte Threads werden hier angezeigt."
"id": "native.apple.acfdf5c72e289736",
"source": "Archived sessions will appear here.",
"translated": "Archivierte Sitzungen werden hier angezeigt."
},
{
"id": "native.apple.e8e8cea7ec44fe08",
@@ -11419,9 +11464,9 @@
"translated": "Eingang teilen"
},
{
"id": "native.apple.21d9208d86a4d1fe",
"source": "Loading threads",
"translated": "Threads werden geladen"
"id": "native.apple.4c5b2ecf243cfbbc",
"source": "Loading sessions",
"translated": "Sitzungen werden geladen"
},
{
"id": "native.apple.48655128d0a34e44",
@@ -11429,19 +11474,19 @@
"translated": "Letzte Aktivität wird vom Gateway abgerufen."
},
{
"id": "native.apple.4be1f79aa2b230ff",
"source": "Threads unavailable",
"translated": "Threads nicht verfügbar"
"id": "native.apple.c4479934c65c973c",
"source": "Sessions unavailable",
"translated": "Sitzungen nicht verfügbar"
},
{
"id": "native.apple.98b348873556bc46",
"source": "No recent threads",
"translated": "Keine kürzlich verwendeten Threads"
"id": "native.apple.6e67b64954ba3002",
"source": "No recent sessions",
"translated": "Keine kürzlich verwendeten Sitzungen"
},
{
"id": "native.apple.7396d205574d279f",
"source": "Thread activity offline",
"translated": "Thread-Aktivität offline"
"id": "native.apple.5dce07848bec08b5",
"source": "Session activity offline",
"translated": "Sitzungsaktivität offline"
},
{
"id": "native.apple.e3586d8a603f67e0",
@@ -11899,9 +11944,9 @@
"translated": "Karte"
},
{
"id": "native.apple.c9ec1b0e18074d8a",
"source": "Open Thread",
"translated": "Thread öffnen"
"id": "native.apple.3edbccb7c14b693c",
"source": "Open Session",
"translated": "Sitzung öffnen"
},
{
"id": "native.apple.a2732e4ff77a201b",
@@ -12103,91 +12148,6 @@
"source": "Offline",
"translated": "Offline"
},
{
"id": "native.apple.a2d8e7b4dba29764",
"source": "Control",
"translated": "Steuerung"
},
{
"id": "native.apple.597471e86dda3d38",
"source": "Opens Settings / Gateway",
"translated": "Öffnet Einstellungen / Gateway"
},
{
"id": "native.apple.ed16c9793f468dcd",
"source": "Agent chat and recent work.",
"translated": "Agent-Chat und aktuelle Arbeit."
},
{
"id": "native.apple.a03e961ab14ba060",
"source": "Overview",
"translated": "Übersicht"
},
{
"id": "native.apple.feb28c9cba676ba2",
"source": "Instances",
"translated": "Instanzen"
},
{
"id": "native.apple.3f2726ccd1acd987",
"source": "Files",
"translated": "Dateien"
},
{
"id": "native.apple.614c9b40919fb103",
"source": "Dreaming",
"translated": "Träumen"
},
{
"id": "native.apple.e2b5c2d7c5d461a3",
"source": "Usage",
"translated": "Nutzung"
},
{
"id": "native.apple.f21bf1e3b5ec896c",
"source": "Automations",
"translated": "Automatisierungen"
},
{
"id": "native.apple.57587fec1ca582ec",
"source": "Default Agent",
"translated": "Standard-Agent"
},
{
"id": "native.apple.e0e99a802f07cc68",
"source": "Gateway",
"translated": "Gateway"
},
{
"id": "native.apple.731e5fccde7cbc86",
"source": "Gateway %1$@, %2$@, %3$@",
"translated": "Gateway %1$@, %2$@, %3$@"
},
{
"id": "native.apple.ab0a315f69e3d5df",
"source": "Gateway %1$@, %2$@",
"translated": "Gateway %1$@, %2$@"
},
{
"id": "native.apple.01ad746119fbc27d",
"source": "Online",
"translated": "Online"
},
{
"id": "native.apple.e253ef19f6e53371",
"source": "Connecting",
"translated": "Verbindung wird hergestellt"
},
{
"id": "native.apple.6f28b07ebdc2b25d",
"source": "Attention",
"translated": "Achtung"
},
{
"id": "native.apple.1c931bcd1cd20334",
"source": "Offline",
"translated": "Offline"
},
{
"id": "native.apple.65602c216b89032d",
"source": "Channels / Integrations",
@@ -12988,6 +12948,16 @@
"source": "System follows this devices appearance setting.",
"translated": "Das System folgt der Erscheinungsbild-Einstellung dieses Geräts."
},
{
"id": "native.apple.6d48137a8f6a5e96",
"source": "Sidebar Agents",
"translated": "Agenten in der Seitenleiste"
},
{
"id": "native.apple.69cccbdee0bb0b56",
"source": "How many agents the sidebar lists before the switcher menu.",
"translated": "Wie viele Agenten die Seitenleiste vor dem Wechselmenü auflistet."
},
{
"id": "native.apple.70eca66c79335a6e",
"source": "Connection",
@@ -13389,9 +13359,9 @@
"translated": "Standard"
},
{
"id": "native.apple.f4ae5664c3eda95d",
"source": "Used for new Chat threads and Talk sessions.",
"translated": "Wird für neue Chat-Threads und Sprachsitzungen verwendet."
"id": "native.apple.6805480889265026",
"source": "Used for new Chat and Talk sessions.",
"translated": "Wird für neue Chat- und Talk-Sitzungen verwendet."
},
{
"id": "native.apple.19552e71de246322",
@@ -15624,39 +15594,134 @@
"translated": "unknown relay error"
},
{
"id": "native.apple.c23d35de8d70863f",
"id": "native.apple.8855710a55de2ed5",
"source": "OpenClaw",
"translated": "OpenClaw"
},
{
"id": "native.apple.9e781c0183b79a76",
"source": "OpenClaw %@",
"translated": "OpenClaw %@"
"id": "native.apple.7029e1235380a92c",
"source": "Settings",
"translated": "Einstellungen"
},
{
"id": "native.apple.f4eea6473f43388d",
"id": "native.apple.7042a7d70a7e5a20",
"source": "Hide Sidebar",
"translated": "Seitenleiste ausblenden"
},
{
"id": "native.apple.e779847164babc29",
"source": "Selected",
"translated": "Ausgewählt"
},
{
"id": "native.apple.698c71602b569378",
"source": "More Agents",
"translated": "Weitere Agenten"
},
{
"id": "native.apple.94772cbd85c42e6e",
"source": "Search sessions",
"translated": "Search sessions"
},
{
"id": "native.apple.38e1e910f0958067",
"source": "Clear session search",
"translated": "Clear session search"
},
{
"id": "native.apple.58248484e54174e3",
"source": "Loading sessions",
"translated": "Loading sessions"
},
{
"id": "native.apple.dfb5cbd55893c4e5",
"source": "No recent sessions",
"translated": "No recent sessions"
},
{
"id": "native.apple.01a4c3f6192bb1a3",
"source": "Recent",
"translated": "Zuletzt verwendet"
},
{
"id": "native.apple.c0a4d120556df169",
"source": "All Sessions…",
"translated": "All Sessions…"
},
{
"id": "native.apple.aa7c4ecffd2ba36a",
"source": "Edit Pages",
"translated": "Seiten bearbeiten"
},
{
"id": "native.apple.4d724d2e5731583d",
"source": "Home",
"translated": "Startseite"
},
{
"id": "native.apple.3995f7f73d1ded5f",
"source": "Unread",
"translated": "Ungelesen"
},
{
"id": "native.apple.b4567540cbcaf944",
"source": "Attention",
"translated": "Achtung"
},
{
"id": "native.apple.14858678ae3f059f",
"source": "New Chat",
"translated": "Neuer Chat"
},
{
"id": "native.apple.9d87aa7e7862a607",
"source": "Connection",
"translated": "Verbindung"
},
{
"id": "native.apple.7e7c47f471dd2c69",
"source": "Online",
"translated": "Online"
},
{
"id": "native.apple.9e2aea6088887f1f",
"id": "native.apple.02ff27780aad60aa",
"source": "Connecting",
"translated": "Verbinden"
"translated": "Verbindung wird hergestellt"
},
{
"id": "native.apple.3624978c7d43335a",
"id": "native.apple.b2d0754aab434ea3",
"source": "Needs attention",
"translated": "Aufmerksamkeit erforderlich"
},
{
"id": "native.apple.7da053dd774cb201",
"id": "native.apple.342c72a01b0f4bb1",
"source": "Offline",
"translated": "Offline"
},
{
"id": "native.apple.a4256b2ab523ee60",
"source": "Chat",
"translated": "Chat"
"id": "native.apple.9fc7dfa0dccea003",
"source": "Pinned pages stay in the sidebar. Home is always shown.",
"translated": "Angeheftete Seiten bleiben in der Seitenleiste. Die Startseite wird immer angezeigt."
},
{
"id": "native.apple.4bfe6dc45811d50f",
"source": "Pages",
"translated": "Pages"
},
{
"id": "native.apple.422767686f219093",
"source": "Done",
"translated": "Fertig"
},
{
"id": "native.apple.e197e8708ad3b2c8",
"source": "Pinned",
"translated": "Angeheftet"
},
{
"id": "native.apple.098013d7dd8cdfc7",
"source": "Not pinned",
"translated": "Nicht angeheftet"
},
{
"id": "native.apple.64d7dc062ef4cc81",
@@ -15693,46 +15758,21 @@
"source": "Automations",
"translated": "Automatisierungen"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "Seitenleiste einblenden"
},
{
"id": "native.apple.bb0ea6d61a32c7c2",
"source": "Back to %@",
"translated": "Zurück zu %@"
},
{
"id": "native.apple.72fab75688479b3e",
"source": "Hide Sidebar",
"translated": "Seitenleiste ausblenden"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "Seitenleiste einblenden"
},
{
"id": "native.apple.8af43f59602ec0d8",
"source": "Close canvas",
"translated": "Canvas schließen"
},
{
"id": "native.apple.a1db6ce0aed1d18e",
"source": "Chat, voice active",
"translated": "Chat, Sprache aktiv"
},
{
"id": "native.apple.bda6cfa988e49a75",
"source": "Control",
"translated": "Steuerung"
},
{
"id": "native.apple.3c80f5351055a5f3",
"source": "Agent",
"translated": "Agent"
},
{
"id": "native.apple.22d107db5b905ef4",
"source": "Settings",
"translated": "Einstellungen"
},
{
"id": "native.apple.8a4751c86aa6fe77",
"source": "Gateway needs attention",
@@ -15794,9 +15834,9 @@
"translated": "Instanzen"
},
{
"id": "native.apple.11fe8b9941954dfb",
"source": "Threads",
"translated": "Threads"
"id": "native.apple.e3e3ce1a79ebbd70",
"source": "Sessions",
"translated": "Sitzungen"
},
{
"id": "native.apple.253cb2debeb51859",
+241 -201
View File
@@ -10869,9 +10869,9 @@
"translated": "¿En qué te gustaría trabajar?"
},
{
"id": "native.apple.4da775013ac9b123",
"source": "The thread attaches once the gateway is ready.",
"translated": "El hilo se conecta cuando el Gateway está listo."
"id": "native.apple.ed7f703a8809b564",
"source": "The session attaches once the gateway is ready.",
"translated": "La sesión se conecta cuando el Gateway está listo."
},
{
"id": "native.apple.02611ddddef7295a",
@@ -10919,9 +10919,9 @@
"translated": "Opciones de nueva sesión…"
},
{
"id": "native.apple.003b25ddafeb18e9",
"source": "Threads…",
"translated": "Hilos…"
"id": "native.apple.a1b0d289758e2213",
"source": "Sessions…",
"translated": "Sesiones…"
},
{
"id": "native.apple.17c13312e7532c89",
@@ -11084,14 +11084,14 @@
"translated": "Crear"
},
{
"id": "native.apple.31d5c7287cfb3abe",
"source": "Delete Thread?",
"translated": "¿Eliminar el hilo?"
"id": "native.apple.e7382c53c7dd48f7",
"source": "Delete Session?",
"translated": "¿Eliminar la sesión?"
},
{
"id": "native.apple.d3395564809f1120",
"source": "Delete Thread",
"translated": "Eliminar hilo"
"id": "native.apple.702fd8b48da56065",
"source": "Delete Session",
"translated": "Eliminar sesión"
},
{
"id": "native.apple.9b1aed19568a048e",
@@ -11099,9 +11099,9 @@
"translated": "Cancelar"
},
{
"id": "native.apple.092659256d26cb03",
"source": "This permanently deletes the thread and its transcript.",
"translated": "Esto elimina permanentemente el hilo y su transcripción."
"id": "native.apple.61f3f19ea24c6012",
"source": "This permanently deletes the session and its transcript.",
"translated": "Esto elimina permanentemente la sesión y su transcripción."
},
{
"id": "native.apple.0965d8d2429c3b9f",
@@ -11129,9 +11129,9 @@
"translated": "Nuevo grupo"
},
{
"id": "native.apple.683032464c497bbd",
"source": "Rename Thread",
"translated": "Renombrar hilo"
"id": "native.apple.cd368674179237a0",
"source": "Rename Session",
"translated": "Renombrar sesión"
},
{
"id": "native.apple.31424500c53d6c32",
@@ -11139,15 +11139,55 @@
"translated": "Nombre del grupo"
},
{
"id": "native.apple.f887aa956588f237",
"source": "Thread name",
"translated": "Nombre del hilo"
"id": "native.apple.8b54306971cfa8c9",
"source": "Session name",
"translated": "Nombre de la sesión"
},
{
"id": "native.apple.e8018adcccaa2a4d",
"source": "View More",
"translated": "Ver más"
},
{
"id": "native.apple.e3ef1aa93156bd67",
"source": "Live",
"translated": "Live"
},
{
"id": "native.apple.bdfc040fb974b4aa",
"source": "Unread",
"translated": "No leído"
},
{
"id": "native.apple.6f94924c0a736fcf",
"source": "Tokens",
"translated": "Tokens"
},
{
"id": "native.apple.bec8b61a3a29b59a",
"source": "Opens Sessions",
"translated": "Abre Sesiones"
},
{
"id": "native.apple.69279daa342241c1",
"source": "Pending approvals",
"translated": "Aprobaciones pendientes"
},
{
"id": "native.apple.48af1bbb4fd06321",
"source": "Automation issues",
"translated": "Automation issues"
},
{
"id": "native.apple.3e4f2dd3a0d41b97",
"source": "31-day usage",
"translated": "31-day usage"
},
{
"id": "native.apple.c334a60ae7b4d508",
"source": "Opens Usage",
"translated": "Opens Usage"
},
{
"id": "native.apple.65fb4d9ce6e5bbda",
"source": "Gateway settings",
@@ -11179,14 +11219,14 @@
"translated": "Agentes"
},
{
"id": "native.apple.7c8231b7b1ca480f",
"source": "Agent thread",
"translated": "Hilo del agente"
"id": "native.apple.789d5d0790fd18ca",
"source": "Agent session",
"translated": "Sesión del agente"
},
{
"id": "native.apple.b3c553614f762a58",
"source": "Recent threads",
"translated": "Hilos recientes"
"id": "native.apple.ee45dce4a2e44737",
"source": "Recent sessions",
"translated": "Sesiones recientes"
},
{
"id": "native.apple.9161ca3c61de6cc7",
@@ -11194,9 +11234,9 @@
"translated": "Gateway sin conexión"
},
{
"id": "native.apple.5aa32afda85064ea",
"source": "No recent threads",
"translated": "No hay hilos recientes"
"id": "native.apple.c97e0382e578a2f7",
"source": "No recent sessions",
"translated": "No hay sesiones recientes"
},
{
"id": "native.apple.79937d7781fb65ae",
@@ -11253,6 +11293,11 @@
"source": "Direct chat",
"translated": "Chat directo"
},
{
"id": "native.apple.7a39e0991fa3cd53",
"source": "just now",
"translated": "just now"
},
{
"id": "native.apple.dbd48d25920f342b",
"source": "%@ on %@",
@@ -11294,14 +11339,14 @@
"translated": "Cancelar"
},
{
"id": "native.apple.b6855cf19a50f477",
"source": "Threads",
"translated": "Hilos"
"id": "native.apple.7a6511a467e34f69",
"source": "Sessions",
"translated": "Sesiones"
},
{
"id": "native.apple.9b1d0ef27a1333b0",
"source": "Archived threads",
"translated": "Hilos archivados"
"id": "native.apple.e6b8913014b64f0a",
"source": "Archived sessions",
"translated": "Sesiones archivadas"
},
{
"id": "native.apple.bc8e64efb095a625",
@@ -11309,34 +11354,34 @@
"translated": "Mostrar archivadas"
},
{
"id": "native.apple.98167401c7267735",
"source": "Threads unavailable",
"translated": "Hilos no disponibles"
"id": "native.apple.119433782518f199",
"source": "Sessions unavailable",
"translated": "Sesiones no disponibles"
},
{
"id": "native.apple.4d28a7def2337b9f",
"source": "Loading archived threads",
"translated": "Cargando hilos archivados"
"id": "native.apple.9882fbadac3bea03",
"source": "Loading archived sessions",
"translated": "Cargando sesiones archivadas"
},
{
"id": "native.apple.777d7b706933bd7b",
"source": "Loading recent threads",
"translated": "Cargando hilos recientes"
"id": "native.apple.16dca1cfac8a571b",
"source": "Loading recent sessions",
"translated": "Cargando sesiones recientes"
},
{
"id": "native.apple.22f81ea94bef8410",
"source": "^[\\(count) thread](inflect: true)",
"translated": "^[\\(count) hilo](inflect: true)"
"id": "native.apple.207dad20d09f3160",
"source": "^[\\(count) session](inflect: true)",
"translated": "^[\\(count) sesión](inflect: true)"
},
{
"id": "native.apple.1cad51e14db59bf9",
"source": "No archived threads",
"translated": "No hay hilos archivados"
"id": "native.apple.a0b4091bf77d4060",
"source": "No archived sessions",
"translated": "No hay sesiones archivadas"
},
{
"id": "native.apple.18ef832d3a7ddcf8",
"source": "Archived threads will appear here.",
"translated": "Los hilos archivados aparecerán aquí."
"id": "native.apple.acfdf5c72e289736",
"source": "Archived sessions will appear here.",
"translated": "Las sesiones archivadas aparecerán aquí."
},
{
"id": "native.apple.e8e8cea7ec44fe08",
@@ -11419,9 +11464,9 @@
"translated": "Compartir entrada"
},
{
"id": "native.apple.21d9208d86a4d1fe",
"source": "Loading threads",
"translated": "Cargando hilos"
"id": "native.apple.4c5b2ecf243cfbbc",
"source": "Loading sessions",
"translated": "Cargando sesiones"
},
{
"id": "native.apple.48655128d0a34e44",
@@ -11429,19 +11474,19 @@
"translated": "Obteniendo actividad reciente del gateway."
},
{
"id": "native.apple.4be1f79aa2b230ff",
"source": "Threads unavailable",
"translated": "Hilos no disponibles"
"id": "native.apple.c4479934c65c973c",
"source": "Sessions unavailable",
"translated": "Sesiones no disponibles"
},
{
"id": "native.apple.98b348873556bc46",
"source": "No recent threads",
"translated": "No hay hilos recientes"
"id": "native.apple.6e67b64954ba3002",
"source": "No recent sessions",
"translated": "No hay sesiones recientes"
},
{
"id": "native.apple.7396d205574d279f",
"source": "Thread activity offline",
"translated": "La actividad de los hilos está sin conexión"
"id": "native.apple.5dce07848bec08b5",
"source": "Session activity offline",
"translated": "La actividad de la sesión está sin conexión"
},
{
"id": "native.apple.e3586d8a603f67e0",
@@ -11899,9 +11944,9 @@
"translated": "Tarjeta"
},
{
"id": "native.apple.c9ec1b0e18074d8a",
"source": "Open Thread",
"translated": "Abrir hilo"
"id": "native.apple.3edbccb7c14b693c",
"source": "Open Session",
"translated": "Abrir sesión"
},
{
"id": "native.apple.a2732e4ff77a201b",
@@ -12103,91 +12148,6 @@
"source": "Offline",
"translated": "Sin conexión"
},
{
"id": "native.apple.a2d8e7b4dba29764",
"source": "Control",
"translated": "Control"
},
{
"id": "native.apple.597471e86dda3d38",
"source": "Opens Settings / Gateway",
"translated": "Abre Configuración / Gateway"
},
{
"id": "native.apple.ed16c9793f468dcd",
"source": "Agent chat and recent work.",
"translated": "Chat del agente y trabajo reciente."
},
{
"id": "native.apple.a03e961ab14ba060",
"source": "Overview",
"translated": "Resumen"
},
{
"id": "native.apple.feb28c9cba676ba2",
"source": "Instances",
"translated": "Instancias"
},
{
"id": "native.apple.3f2726ccd1acd987",
"source": "Files",
"translated": "Archivos"
},
{
"id": "native.apple.614c9b40919fb103",
"source": "Dreaming",
"translated": "Soñando"
},
{
"id": "native.apple.e2b5c2d7c5d461a3",
"source": "Usage",
"translated": "Uso"
},
{
"id": "native.apple.f21bf1e3b5ec896c",
"source": "Automations",
"translated": "Automatizaciones"
},
{
"id": "native.apple.57587fec1ca582ec",
"source": "Default Agent",
"translated": "Agente predeterminado"
},
{
"id": "native.apple.e0e99a802f07cc68",
"source": "Gateway",
"translated": "Gateway"
},
{
"id": "native.apple.731e5fccde7cbc86",
"source": "Gateway %1$@, %2$@, %3$@",
"translated": "Gateway %1$@, %2$@, %3$@"
},
{
"id": "native.apple.ab0a315f69e3d5df",
"source": "Gateway %1$@, %2$@",
"translated": "Gateway %1$@, %2$@"
},
{
"id": "native.apple.01ad746119fbc27d",
"source": "Online",
"translated": "En línea"
},
{
"id": "native.apple.e253ef19f6e53371",
"source": "Connecting",
"translated": "Conectando"
},
{
"id": "native.apple.6f28b07ebdc2b25d",
"source": "Attention",
"translated": "Atención"
},
{
"id": "native.apple.1c931bcd1cd20334",
"source": "Offline",
"translated": "Sin conexión"
},
{
"id": "native.apple.65602c216b89032d",
"source": "Channels / Integrations",
@@ -12988,6 +12948,16 @@
"source": "System follows this devices appearance setting.",
"translated": "El sistema sigue el ajuste de apariencia de este dispositivo."
},
{
"id": "native.apple.6d48137a8f6a5e96",
"source": "Sidebar Agents",
"translated": "Agentes de la barra lateral"
},
{
"id": "native.apple.69cccbdee0bb0b56",
"source": "How many agents the sidebar lists before the switcher menu.",
"translated": "Cuántos agentes muestra la barra lateral antes del menú de selección."
},
{
"id": "native.apple.70eca66c79335a6e",
"source": "Connection",
@@ -13389,9 +13359,9 @@
"translated": "Predeterminado"
},
{
"id": "native.apple.f4ae5664c3eda95d",
"source": "Used for new Chat threads and Talk sessions.",
"translated": "Se usa para nuevos hilos de Chat y sesiones de Talk."
"id": "native.apple.6805480889265026",
"source": "Used for new Chat and Talk sessions.",
"translated": "Se usa para nuevas sesiones de chat y conversación."
},
{
"id": "native.apple.19552e71de246322",
@@ -15624,39 +15594,134 @@
"translated": "unknown relay error"
},
{
"id": "native.apple.c23d35de8d70863f",
"id": "native.apple.8855710a55de2ed5",
"source": "OpenClaw",
"translated": "OpenClaw"
},
{
"id": "native.apple.9e781c0183b79a76",
"source": "OpenClaw %@",
"translated": "OpenClaw %@"
"id": "native.apple.7029e1235380a92c",
"source": "Settings",
"translated": "Configuración"
},
{
"id": "native.apple.f4eea6473f43388d",
"id": "native.apple.7042a7d70a7e5a20",
"source": "Hide Sidebar",
"translated": "Ocultar barra lateral"
},
{
"id": "native.apple.e779847164babc29",
"source": "Selected",
"translated": "Seleccionado"
},
{
"id": "native.apple.698c71602b569378",
"source": "More Agents",
"translated": "Más agentes"
},
{
"id": "native.apple.94772cbd85c42e6e",
"source": "Search sessions",
"translated": "Search sessions"
},
{
"id": "native.apple.38e1e910f0958067",
"source": "Clear session search",
"translated": "Clear session search"
},
{
"id": "native.apple.58248484e54174e3",
"source": "Loading sessions",
"translated": "Loading sessions"
},
{
"id": "native.apple.dfb5cbd55893c4e5",
"source": "No recent sessions",
"translated": "No recent sessions"
},
{
"id": "native.apple.01a4c3f6192bb1a3",
"source": "Recent",
"translated": "Recientes"
},
{
"id": "native.apple.c0a4d120556df169",
"source": "All Sessions…",
"translated": "All Sessions…"
},
{
"id": "native.apple.aa7c4ecffd2ba36a",
"source": "Edit Pages",
"translated": "Editar páginas"
},
{
"id": "native.apple.4d724d2e5731583d",
"source": "Home",
"translated": "Inicio"
},
{
"id": "native.apple.3995f7f73d1ded5f",
"source": "Unread",
"translated": "No leído"
},
{
"id": "native.apple.b4567540cbcaf944",
"source": "Attention",
"translated": "Atención"
},
{
"id": "native.apple.14858678ae3f059f",
"source": "New Chat",
"translated": "Nuevo chat"
},
{
"id": "native.apple.9d87aa7e7862a607",
"source": "Connection",
"translated": "Conexión"
},
{
"id": "native.apple.7e7c47f471dd2c69",
"source": "Online",
"translated": "En línea"
},
{
"id": "native.apple.9e2aea6088887f1f",
"id": "native.apple.02ff27780aad60aa",
"source": "Connecting",
"translated": "Conectando"
},
{
"id": "native.apple.3624978c7d43335a",
"id": "native.apple.b2d0754aab434ea3",
"source": "Needs attention",
"translated": "Requiere atención"
},
{
"id": "native.apple.7da053dd774cb201",
"id": "native.apple.342c72a01b0f4bb1",
"source": "Offline",
"translated": "Sin conexión"
},
{
"id": "native.apple.a4256b2ab523ee60",
"source": "Chat",
"translated": "Chat"
"id": "native.apple.9fc7dfa0dccea003",
"source": "Pinned pages stay in the sidebar. Home is always shown.",
"translated": "Las páginas fijadas permanecen en la barra lateral. Inicio siempre se muestra."
},
{
"id": "native.apple.4bfe6dc45811d50f",
"source": "Pages",
"translated": "Pages"
},
{
"id": "native.apple.422767686f219093",
"source": "Done",
"translated": "Listo"
},
{
"id": "native.apple.e197e8708ad3b2c8",
"source": "Pinned",
"translated": "Fijada"
},
{
"id": "native.apple.098013d7dd8cdfc7",
"source": "Not pinned",
"translated": "No fijada"
},
{
"id": "native.apple.64d7dc062ef4cc81",
@@ -15693,46 +15758,21 @@
"source": "Automations",
"translated": "Automatizaciones"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "Mostrar barra lateral"
},
{
"id": "native.apple.bb0ea6d61a32c7c2",
"source": "Back to %@",
"translated": "Volver a %@"
},
{
"id": "native.apple.72fab75688479b3e",
"source": "Hide Sidebar",
"translated": "Ocultar barra lateral"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "Mostrar barra lateral"
},
{
"id": "native.apple.8af43f59602ec0d8",
"source": "Close canvas",
"translated": "Cerrar lienzo"
},
{
"id": "native.apple.a1db6ce0aed1d18e",
"source": "Chat, voice active",
"translated": "Chat, voz activada"
},
{
"id": "native.apple.bda6cfa988e49a75",
"source": "Control",
"translated": "Control"
},
{
"id": "native.apple.3c80f5351055a5f3",
"source": "Agent",
"translated": "Agente"
},
{
"id": "native.apple.22d107db5b905ef4",
"source": "Settings",
"translated": "Configuración"
},
{
"id": "native.apple.8a4751c86aa6fe77",
"source": "Gateway needs attention",
@@ -15794,9 +15834,9 @@
"translated": "Instancias"
},
{
"id": "native.apple.11fe8b9941954dfb",
"source": "Threads",
"translated": "Hilos"
"id": "native.apple.e3e3ce1a79ebbd70",
"source": "Sessions",
"translated": "Sesiones"
},
{
"id": "native.apple.253cb2debeb51859",
+241 -201
View File
@@ -10869,9 +10869,9 @@
"translated": "دوست دارید روی چه چیزی کار کنید؟"
},
{
"id": "native.apple.4da775013ac9b123",
"source": "The thread attaches once the gateway is ready.",
"translated": "پس از آماده شدن Gateway، رشته متصل می‌شود."
"id": "native.apple.ed7f703a8809b564",
"source": "The session attaches once the gateway is ready.",
"translated": "جلسه پس از آماده شدن Gateway متصل می‌شود."
},
{
"id": "native.apple.02611ddddef7295a",
@@ -10919,9 +10919,9 @@
"translated": "گزینه‌های نشست جدید…"
},
{
"id": "native.apple.003b25ddafeb18e9",
"source": "Threads…",
"translated": "رشته‌ها…"
"id": "native.apple.a1b0d289758e2213",
"source": "Sessions…",
"translated": "جلسه‌ها…"
},
{
"id": "native.apple.17c13312e7532c89",
@@ -11084,14 +11084,14 @@
"translated": "ایجاد"
},
{
"id": "native.apple.31d5c7287cfb3abe",
"source": "Delete Thread?",
"translated": "رشته حذف شود؟"
"id": "native.apple.e7382c53c7dd48f7",
"source": "Delete Session?",
"translated": "جلسه حذف شود؟"
},
{
"id": "native.apple.d3395564809f1120",
"source": "Delete Thread",
"translated": "حذف رشته"
"id": "native.apple.702fd8b48da56065",
"source": "Delete Session",
"translated": "حذف جلسه"
},
{
"id": "native.apple.9b1aed19568a048e",
@@ -11099,9 +11099,9 @@
"translated": "لغو"
},
{
"id": "native.apple.092659256d26cb03",
"source": "This permanently deletes the thread and its transcript.",
"translated": "این کار رشته و رونوشت آن را برای همیشه حذف می‌کند."
"id": "native.apple.61f3f19ea24c6012",
"source": "This permanently deletes the session and its transcript.",
"translated": "این کار جلسه و رونوشت آن را برای همیشه حذف می‌کند."
},
{
"id": "native.apple.0965d8d2429c3b9f",
@@ -11129,9 +11129,9 @@
"translated": "گروه جدید"
},
{
"id": "native.apple.683032464c497bbd",
"source": "Rename Thread",
"translated": "تغییر نام رشته"
"id": "native.apple.cd368674179237a0",
"source": "Rename Session",
"translated": "تغییر نام جلسه"
},
{
"id": "native.apple.31424500c53d6c32",
@@ -11139,15 +11139,55 @@
"translated": "نام گروه"
},
{
"id": "native.apple.f887aa956588f237",
"source": "Thread name",
"translated": "نام رشته"
"id": "native.apple.8b54306971cfa8c9",
"source": "Session name",
"translated": "نام جلسه"
},
{
"id": "native.apple.e8018adcccaa2a4d",
"source": "View More",
"translated": "نمایش بیشتر"
},
{
"id": "native.apple.e3ef1aa93156bd67",
"source": "Live",
"translated": "Live"
},
{
"id": "native.apple.bdfc040fb974b4aa",
"source": "Unread",
"translated": "خوانده‌نشده"
},
{
"id": "native.apple.6f94924c0a736fcf",
"source": "Tokens",
"translated": "توکن‌ها"
},
{
"id": "native.apple.bec8b61a3a29b59a",
"source": "Opens Sessions",
"translated": "جلسه‌ها را باز می‌کند"
},
{
"id": "native.apple.69279daa342241c1",
"source": "Pending approvals",
"translated": "تأییدیه‌های در انتظار"
},
{
"id": "native.apple.48af1bbb4fd06321",
"source": "Automation issues",
"translated": "Automation issues"
},
{
"id": "native.apple.3e4f2dd3a0d41b97",
"source": "31-day usage",
"translated": "31-day usage"
},
{
"id": "native.apple.c334a60ae7b4d508",
"source": "Opens Usage",
"translated": "Opens Usage"
},
{
"id": "native.apple.65fb4d9ce6e5bbda",
"source": "Gateway settings",
@@ -11179,14 +11219,14 @@
"translated": "عامل‌ها"
},
{
"id": "native.apple.7c8231b7b1ca480f",
"source": "Agent thread",
"translated": "رشته عامل"
"id": "native.apple.789d5d0790fd18ca",
"source": "Agent session",
"translated": "جلسه عامل"
},
{
"id": "native.apple.b3c553614f762a58",
"source": "Recent threads",
"translated": "رشته‌های اخیر"
"id": "native.apple.ee45dce4a2e44737",
"source": "Recent sessions",
"translated": "جلسه‌های اخیر"
},
{
"id": "native.apple.9161ca3c61de6cc7",
@@ -11194,9 +11234,9 @@
"translated": "Gateway آفلاین است"
},
{
"id": "native.apple.5aa32afda85064ea",
"source": "No recent threads",
"translated": "هیچ رشته اخیری وجود ندارد"
"id": "native.apple.c97e0382e578a2f7",
"source": "No recent sessions",
"translated": "جلسه اخیری وجود ندارد"
},
{
"id": "native.apple.79937d7781fb65ae",
@@ -11253,6 +11293,11 @@
"source": "Direct chat",
"translated": "گفت‌وگوی مستقیم"
},
{
"id": "native.apple.7a39e0991fa3cd53",
"source": "just now",
"translated": "just now"
},
{
"id": "native.apple.dbd48d25920f342b",
"source": "%@ on %@",
@@ -11294,14 +11339,14 @@
"translated": "لغو"
},
{
"id": "native.apple.b6855cf19a50f477",
"source": "Threads",
"translated": "رشته‌ها"
"id": "native.apple.7a6511a467e34f69",
"source": "Sessions",
"translated": "جلسه‌ها"
},
{
"id": "native.apple.9b1d0ef27a1333b0",
"source": "Archived threads",
"translated": "رشته‌های بایگانی‌شده"
"id": "native.apple.e6b8913014b64f0a",
"source": "Archived sessions",
"translated": "جلسه‌های بایگانی‌شده"
},
{
"id": "native.apple.bc8e64efb095a625",
@@ -11309,34 +11354,34 @@
"translated": "نمایش بایگانی‌شده‌ها"
},
{
"id": "native.apple.98167401c7267735",
"source": "Threads unavailable",
"translated": "رشته‌ها در دسترس نیستند"
"id": "native.apple.119433782518f199",
"source": "Sessions unavailable",
"translated": "جلسه‌ها در دسترس نیستند"
},
{
"id": "native.apple.4d28a7def2337b9f",
"source": "Loading archived threads",
"translated": "در حال بارگذاری رشته‌های بایگانی‌شده"
"id": "native.apple.9882fbadac3bea03",
"source": "Loading archived sessions",
"translated": "در حال بارگذاری جلسه‌های بایگانی‌شده"
},
{
"id": "native.apple.777d7b706933bd7b",
"source": "Loading recent threads",
"translated": "در حال بارگذاری رشته‌های اخیر"
"id": "native.apple.16dca1cfac8a571b",
"source": "Loading recent sessions",
"translated": "در حال بارگذاری جلسه‌های اخیر"
},
{
"id": "native.apple.22f81ea94bef8410",
"source": "^[\\(count) thread](inflect: true)",
"translated": "^[\\(count) رشته](inflect: true)"
"id": "native.apple.207dad20d09f3160",
"source": "^[\\(count) session](inflect: true)",
"translated": "^[\\(count) جلسه](inflect: true)"
},
{
"id": "native.apple.1cad51e14db59bf9",
"source": "No archived threads",
"translated": "هیچ رشته بایگانی‌شده‌ای وجود ندارد"
"id": "native.apple.a0b4091bf77d4060",
"source": "No archived sessions",
"translated": "جلسه بایگانی‌شده‌ای وجود ندارد"
},
{
"id": "native.apple.18ef832d3a7ddcf8",
"source": "Archived threads will appear here.",
"translated": "رشته‌های بایگانی‌شده اینجا نمایش داده می‌شوند."
"id": "native.apple.acfdf5c72e289736",
"source": "Archived sessions will appear here.",
"translated": "جلسه‌های بایگانی‌شده اینجا نمایش داده می‌شوند."
},
{
"id": "native.apple.e8e8cea7ec44fe08",
@@ -11419,9 +11464,9 @@
"translated": "اشتراک‌گذاری ورودی"
},
{
"id": "native.apple.21d9208d86a4d1fe",
"source": "Loading threads",
"translated": "در حال بارگذاری رشته‌ها"
"id": "native.apple.4c5b2ecf243cfbbc",
"source": "Loading sessions",
"translated": "در حال بارگذاری جلسه‌ها"
},
{
"id": "native.apple.48655128d0a34e44",
@@ -11429,19 +11474,19 @@
"translated": "در حال دریافت فعالیت اخیر از Gateway."
},
{
"id": "native.apple.4be1f79aa2b230ff",
"source": "Threads unavailable",
"translated": "رشته‌ها در دسترس نیستند"
"id": "native.apple.c4479934c65c973c",
"source": "Sessions unavailable",
"translated": "نشست‌ها در دسترس نیستند"
},
{
"id": "native.apple.98b348873556bc46",
"source": "No recent threads",
"translated": "هیچ رشته اخیری وجود ندارد"
"id": "native.apple.6e67b64954ba3002",
"source": "No recent sessions",
"translated": "نشست اخیری وجود ندارد"
},
{
"id": "native.apple.7396d205574d279f",
"source": "Thread activity offline",
"translated": "فعالیت رشته آفلاین است"
"id": "native.apple.5dce07848bec08b5",
"source": "Session activity offline",
"translated": "فعالیت نشست آفلاین است"
},
{
"id": "native.apple.e3586d8a603f67e0",
@@ -11899,9 +11944,9 @@
"translated": "کارت"
},
{
"id": "native.apple.c9ec1b0e18074d8a",
"source": "Open Thread",
"translated": "باز کردن رشته"
"id": "native.apple.3edbccb7c14b693c",
"source": "Open Session",
"translated": "باز کردن نشست"
},
{
"id": "native.apple.a2732e4ff77a201b",
@@ -12103,91 +12148,6 @@
"source": "Offline",
"translated": "آفلاین"
},
{
"id": "native.apple.a2d8e7b4dba29764",
"source": "Control",
"translated": "کنترل"
},
{
"id": "native.apple.597471e86dda3d38",
"source": "Opens Settings / Gateway",
"translated": "تنظیمات / Gateway را باز می‌کند"
},
{
"id": "native.apple.ed16c9793f468dcd",
"source": "Agent chat and recent work.",
"translated": "گفتگوی عامل و کارهای اخیر."
},
{
"id": "native.apple.a03e961ab14ba060",
"source": "Overview",
"translated": "نمای کلی"
},
{
"id": "native.apple.feb28c9cba676ba2",
"source": "Instances",
"translated": "نمونه‌ها"
},
{
"id": "native.apple.3f2726ccd1acd987",
"source": "Files",
"translated": "فایل‌ها"
},
{
"id": "native.apple.614c9b40919fb103",
"source": "Dreaming",
"translated": "در حال رؤیاپردازی"
},
{
"id": "native.apple.e2b5c2d7c5d461a3",
"source": "Usage",
"translated": "مصرف"
},
{
"id": "native.apple.f21bf1e3b5ec896c",
"source": "Automations",
"translated": "خودکارسازی‌ها"
},
{
"id": "native.apple.57587fec1ca582ec",
"source": "Default Agent",
"translated": "عامل پیش‌فرض"
},
{
"id": "native.apple.e0e99a802f07cc68",
"source": "Gateway",
"translated": "Gateway"
},
{
"id": "native.apple.731e5fccde7cbc86",
"source": "Gateway %1$@, %2$@, %3$@",
"translated": "Gateway %1$@، %2$@، %3$@"
},
{
"id": "native.apple.ab0a315f69e3d5df",
"source": "Gateway %1$@, %2$@",
"translated": "Gateway %1$@، %2$@"
},
{
"id": "native.apple.01ad746119fbc27d",
"source": "Online",
"translated": "آنلاین"
},
{
"id": "native.apple.e253ef19f6e53371",
"source": "Connecting",
"translated": "در حال اتصال"
},
{
"id": "native.apple.6f28b07ebdc2b25d",
"source": "Attention",
"translated": "توجه"
},
{
"id": "native.apple.1c931bcd1cd20334",
"source": "Offline",
"translated": "آفلاین"
},
{
"id": "native.apple.65602c216b89032d",
"source": "Channels / Integrations",
@@ -12988,6 +12948,16 @@
"source": "System follows this devices appearance setting.",
"translated": "سیستم از تنظیمات ظاهر این دستگاه پیروی می‌کند."
},
{
"id": "native.apple.6d48137a8f6a5e96",
"source": "Sidebar Agents",
"translated": "عامل‌های نوار کناری"
},
{
"id": "native.apple.69cccbdee0bb0b56",
"source": "How many agents the sidebar lists before the switcher menu.",
"translated": "تعداد عامل‌هایی که نوار کناری پیش از منوی جابه‌جایی فهرست می‌کند."
},
{
"id": "native.apple.70eca66c79335a6e",
"source": "Connection",
@@ -13389,9 +13359,9 @@
"translated": "پیش‌فرض"
},
{
"id": "native.apple.f4ae5664c3eda95d",
"source": "Used for new Chat threads and Talk sessions.",
"translated": "برای رشته‌های گفت‌وگوی جدید و نشست‌های مکالمه استفاده می‌شود."
"id": "native.apple.6805480889265026",
"source": "Used for new Chat and Talk sessions.",
"translated": "برای نشست‌های جدید گفت‌وگو و مکالمه استفاده می‌شود."
},
{
"id": "native.apple.19552e71de246322",
@@ -15624,39 +15594,134 @@
"translated": "unknown relay error"
},
{
"id": "native.apple.c23d35de8d70863f",
"id": "native.apple.8855710a55de2ed5",
"source": "OpenClaw",
"translated": "OpenClaw"
},
{
"id": "native.apple.9e781c0183b79a76",
"source": "OpenClaw %@",
"translated": "OpenClaw %@"
"id": "native.apple.7029e1235380a92c",
"source": "Settings",
"translated": "تنظیمات"
},
{
"id": "native.apple.f4eea6473f43388d",
"id": "native.apple.7042a7d70a7e5a20",
"source": "Hide Sidebar",
"translated": "پنهان کردن نوار کناری"
},
{
"id": "native.apple.e779847164babc29",
"source": "Selected",
"translated": "انتخاب‌شده"
},
{
"id": "native.apple.698c71602b569378",
"source": "More Agents",
"translated": "عامل‌های بیشتر"
},
{
"id": "native.apple.94772cbd85c42e6e",
"source": "Search sessions",
"translated": "Search sessions"
},
{
"id": "native.apple.38e1e910f0958067",
"source": "Clear session search",
"translated": "Clear session search"
},
{
"id": "native.apple.58248484e54174e3",
"source": "Loading sessions",
"translated": "Loading sessions"
},
{
"id": "native.apple.dfb5cbd55893c4e5",
"source": "No recent sessions",
"translated": "No recent sessions"
},
{
"id": "native.apple.01a4c3f6192bb1a3",
"source": "Recent",
"translated": "اخیر"
},
{
"id": "native.apple.c0a4d120556df169",
"source": "All Sessions…",
"translated": "All Sessions…"
},
{
"id": "native.apple.aa7c4ecffd2ba36a",
"source": "Edit Pages",
"translated": "ویرایش صفحه‌ها"
},
{
"id": "native.apple.4d724d2e5731583d",
"source": "Home",
"translated": "خانه"
},
{
"id": "native.apple.3995f7f73d1ded5f",
"source": "Unread",
"translated": "خوانده‌نشده"
},
{
"id": "native.apple.b4567540cbcaf944",
"source": "Attention",
"translated": "نیازمند توجه"
},
{
"id": "native.apple.14858678ae3f059f",
"source": "New Chat",
"translated": "چت جدید"
},
{
"id": "native.apple.9d87aa7e7862a607",
"source": "Connection",
"translated": "اتصال"
},
{
"id": "native.apple.7e7c47f471dd2c69",
"source": "Online",
"translated": "آنلاین"
},
{
"id": "native.apple.9e2aea6088887f1f",
"id": "native.apple.02ff27780aad60aa",
"source": "Connecting",
"translated": "در حال اتصال"
},
{
"id": "native.apple.3624978c7d43335a",
"id": "native.apple.b2d0754aab434ea3",
"source": "Needs attention",
"translated": "نیازمند توجه"
},
{
"id": "native.apple.7da053dd774cb201",
"id": "native.apple.342c72a01b0f4bb1",
"source": "Offline",
"translated": "آفلاین"
},
{
"id": "native.apple.a4256b2ab523ee60",
"source": "Chat",
"translated": "چت"
"id": "native.apple.9fc7dfa0dccea003",
"source": "Pinned pages stay in the sidebar. Home is always shown.",
"translated": "صفحه‌های سنجاق‌شده در نوار کناری باقی می‌مانند. خانه همیشه نمایش داده می‌شود."
},
{
"id": "native.apple.4bfe6dc45811d50f",
"source": "Pages",
"translated": "Pages"
},
{
"id": "native.apple.422767686f219093",
"source": "Done",
"translated": "انجام شد"
},
{
"id": "native.apple.e197e8708ad3b2c8",
"source": "Pinned",
"translated": "سنجاق‌شده"
},
{
"id": "native.apple.098013d7dd8cdfc7",
"source": "Not pinned",
"translated": "سنجاق‌نشده"
},
{
"id": "native.apple.64d7dc062ef4cc81",
@@ -15693,46 +15758,21 @@
"source": "Automations",
"translated": "خودکارسازی‌ها"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "نمایش نوار کناری"
},
{
"id": "native.apple.bb0ea6d61a32c7c2",
"source": "Back to %@",
"translated": "بازگشت به %@"
},
{
"id": "native.apple.72fab75688479b3e",
"source": "Hide Sidebar",
"translated": "پنهان کردن نوار کناری"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "نمایش نوار کناری"
},
{
"id": "native.apple.8af43f59602ec0d8",
"source": "Close canvas",
"translated": "بستن بوم"
},
{
"id": "native.apple.a1db6ce0aed1d18e",
"source": "Chat, voice active",
"translated": "چت، صدا فعال است"
},
{
"id": "native.apple.bda6cfa988e49a75",
"source": "Control",
"translated": "کنترل"
},
{
"id": "native.apple.3c80f5351055a5f3",
"source": "Agent",
"translated": "عامل"
},
{
"id": "native.apple.22d107db5b905ef4",
"source": "Settings",
"translated": "تنظیمات"
},
{
"id": "native.apple.8a4751c86aa6fe77",
"source": "Gateway needs attention",
@@ -15794,9 +15834,9 @@
"translated": "نمونه‌ها"
},
{
"id": "native.apple.11fe8b9941954dfb",
"source": "Threads",
"translated": "رشته‌ها"
"id": "native.apple.e3e3ce1a79ebbd70",
"source": "Sessions",
"translated": "جلسه‌ها"
},
{
"id": "native.apple.253cb2debeb51859",
+242 -202
View File
@@ -10869,9 +10869,9 @@
"translated": "Sur quoi souhaitez-vous travailler ?"
},
{
"id": "native.apple.4da775013ac9b123",
"source": "The thread attaches once the gateway is ready.",
"translated": "Le fil de discussion est joint une fois que le Gateway est prêt."
"id": "native.apple.ed7f703a8809b564",
"source": "The session attaches once the gateway is ready.",
"translated": "La session se connecte une fois que le Gateway est prêt."
},
{
"id": "native.apple.02611ddddef7295a",
@@ -10919,9 +10919,9 @@
"translated": "Options de la nouvelle session…"
},
{
"id": "native.apple.003b25ddafeb18e9",
"source": "Threads…",
"translated": "Fils de discussion…"
"id": "native.apple.a1b0d289758e2213",
"source": "Sessions…",
"translated": "Sessions…"
},
{
"id": "native.apple.17c13312e7532c89",
@@ -11084,14 +11084,14 @@
"translated": "Créer"
},
{
"id": "native.apple.31d5c7287cfb3abe",
"source": "Delete Thread?",
"translated": "Supprimer le fil de discussion ?"
"id": "native.apple.e7382c53c7dd48f7",
"source": "Delete Session?",
"translated": "Supprimer la session ?"
},
{
"id": "native.apple.d3395564809f1120",
"source": "Delete Thread",
"translated": "Supprimer le fil"
"id": "native.apple.702fd8b48da56065",
"source": "Delete Session",
"translated": "Supprimer la session"
},
{
"id": "native.apple.9b1aed19568a048e",
@@ -11099,9 +11099,9 @@
"translated": "Annuler"
},
{
"id": "native.apple.092659256d26cb03",
"source": "This permanently deletes the thread and its transcript.",
"translated": "Cette action supprime définitivement le fil et sa transcription."
"id": "native.apple.61f3f19ea24c6012",
"source": "This permanently deletes the session and its transcript.",
"translated": "Cette opération supprime définitivement la session et sa transcription."
},
{
"id": "native.apple.0965d8d2429c3b9f",
@@ -11129,9 +11129,9 @@
"translated": "Nouveau groupe"
},
{
"id": "native.apple.683032464c497bbd",
"source": "Rename Thread",
"translated": "Renommer le fil"
"id": "native.apple.cd368674179237a0",
"source": "Rename Session",
"translated": "Renommer la session"
},
{
"id": "native.apple.31424500c53d6c32",
@@ -11139,15 +11139,55 @@
"translated": "Nom du groupe"
},
{
"id": "native.apple.f887aa956588f237",
"source": "Thread name",
"translated": "Nom du fil"
"id": "native.apple.8b54306971cfa8c9",
"source": "Session name",
"translated": "Nom de la session"
},
{
"id": "native.apple.e8018adcccaa2a4d",
"source": "View More",
"translated": "Voir plus"
},
{
"id": "native.apple.e3ef1aa93156bd67",
"source": "Live",
"translated": "Live"
},
{
"id": "native.apple.bdfc040fb974b4aa",
"source": "Unread",
"translated": "Non lu"
},
{
"id": "native.apple.6f94924c0a736fcf",
"source": "Tokens",
"translated": "Jetons"
},
{
"id": "native.apple.bec8b61a3a29b59a",
"source": "Opens Sessions",
"translated": "Ouvre les sessions"
},
{
"id": "native.apple.69279daa342241c1",
"source": "Pending approvals",
"translated": "Approbations en attente"
},
{
"id": "native.apple.48af1bbb4fd06321",
"source": "Automation issues",
"translated": "Automation issues"
},
{
"id": "native.apple.3e4f2dd3a0d41b97",
"source": "31-day usage",
"translated": "31-day usage"
},
{
"id": "native.apple.c334a60ae7b4d508",
"source": "Opens Usage",
"translated": "Opens Usage"
},
{
"id": "native.apple.65fb4d9ce6e5bbda",
"source": "Gateway settings",
@@ -11179,14 +11219,14 @@
"translated": "Agents"
},
{
"id": "native.apple.7c8231b7b1ca480f",
"source": "Agent thread",
"translated": "Fil de lagent"
"id": "native.apple.789d5d0790fd18ca",
"source": "Agent session",
"translated": "Session de lagent"
},
{
"id": "native.apple.b3c553614f762a58",
"source": "Recent threads",
"translated": "Fils récents"
"id": "native.apple.ee45dce4a2e44737",
"source": "Recent sessions",
"translated": "Sessions récentes"
},
{
"id": "native.apple.9161ca3c61de6cc7",
@@ -11194,9 +11234,9 @@
"translated": "Gateway hors ligne"
},
{
"id": "native.apple.5aa32afda85064ea",
"source": "No recent threads",
"translated": "Aucun fil récent"
"id": "native.apple.c97e0382e578a2f7",
"source": "No recent sessions",
"translated": "Aucune session récente"
},
{
"id": "native.apple.79937d7781fb65ae",
@@ -11253,6 +11293,11 @@
"source": "Direct chat",
"translated": "Chat direct"
},
{
"id": "native.apple.7a39e0991fa3cd53",
"source": "just now",
"translated": "just now"
},
{
"id": "native.apple.dbd48d25920f342b",
"source": "%@ on %@",
@@ -11294,14 +11339,14 @@
"translated": "Annuler"
},
{
"id": "native.apple.b6855cf19a50f477",
"source": "Threads",
"translated": "Fils"
"id": "native.apple.7a6511a467e34f69",
"source": "Sessions",
"translated": "Sessions"
},
{
"id": "native.apple.9b1d0ef27a1333b0",
"source": "Archived threads",
"translated": "Fils archivés"
"id": "native.apple.e6b8913014b64f0a",
"source": "Archived sessions",
"translated": "Sessions archivées"
},
{
"id": "native.apple.bc8e64efb095a625",
@@ -11309,34 +11354,34 @@
"translated": "Afficher les éléments archivés"
},
{
"id": "native.apple.98167401c7267735",
"source": "Threads unavailable",
"translated": "Fils indisponibles"
"id": "native.apple.119433782518f199",
"source": "Sessions unavailable",
"translated": "Sessions indisponibles"
},
{
"id": "native.apple.4d28a7def2337b9f",
"source": "Loading archived threads",
"translated": "Chargement des fils archivés"
"id": "native.apple.9882fbadac3bea03",
"source": "Loading archived sessions",
"translated": "Chargement des sessions archivées"
},
{
"id": "native.apple.777d7b706933bd7b",
"source": "Loading recent threads",
"translated": "Chargement des fils récents"
"id": "native.apple.16dca1cfac8a571b",
"source": "Loading recent sessions",
"translated": "Chargement des sessions récentes"
},
{
"id": "native.apple.22f81ea94bef8410",
"source": "^[\\(count) thread](inflect: true)",
"translated": "^[\\(count) fil](inflect: true)"
"id": "native.apple.207dad20d09f3160",
"source": "^[\\(count) session](inflect: true)",
"translated": "^[\\(count) session](inflect: true)"
},
{
"id": "native.apple.1cad51e14db59bf9",
"source": "No archived threads",
"translated": "Aucun fil archivé"
"id": "native.apple.a0b4091bf77d4060",
"source": "No archived sessions",
"translated": "Aucune session archivée"
},
{
"id": "native.apple.18ef832d3a7ddcf8",
"source": "Archived threads will appear here.",
"translated": "Les fils archivés apparaîtront ici."
"id": "native.apple.acfdf5c72e289736",
"source": "Archived sessions will appear here.",
"translated": "Les sessions archivées apparaîtront ici."
},
{
"id": "native.apple.e8e8cea7ec44fe08",
@@ -11419,9 +11464,9 @@
"translated": "Partager la réception"
},
{
"id": "native.apple.21d9208d86a4d1fe",
"source": "Loading threads",
"translated": "Chargement des fils"
"id": "native.apple.4c5b2ecf243cfbbc",
"source": "Loading sessions",
"translated": "Chargement des sessions"
},
{
"id": "native.apple.48655128d0a34e44",
@@ -11429,19 +11474,19 @@
"translated": "Récupération de lactivité récente depuis le Gateway."
},
{
"id": "native.apple.4be1f79aa2b230ff",
"source": "Threads unavailable",
"translated": "Fils indisponibles"
"id": "native.apple.c4479934c65c973c",
"source": "Sessions unavailable",
"translated": "Sessions indisponibles"
},
{
"id": "native.apple.98b348873556bc46",
"source": "No recent threads",
"translated": "Aucun fil récent"
"id": "native.apple.6e67b64954ba3002",
"source": "No recent sessions",
"translated": "Aucune session récente"
},
{
"id": "native.apple.7396d205574d279f",
"source": "Thread activity offline",
"translated": "Activité du fil hors ligne"
"id": "native.apple.5dce07848bec08b5",
"source": "Session activity offline",
"translated": "Activité des sessions hors ligne"
},
{
"id": "native.apple.e3586d8a603f67e0",
@@ -11899,9 +11944,9 @@
"translated": "Carte"
},
{
"id": "native.apple.c9ec1b0e18074d8a",
"source": "Open Thread",
"translated": "Ouvrir le fil"
"id": "native.apple.3edbccb7c14b693c",
"source": "Open Session",
"translated": "Ouvrir la session"
},
{
"id": "native.apple.a2732e4ff77a201b",
@@ -12103,91 +12148,6 @@
"source": "Offline",
"translated": "Hors ligne"
},
{
"id": "native.apple.a2d8e7b4dba29764",
"source": "Control",
"translated": "Contrôle"
},
{
"id": "native.apple.597471e86dda3d38",
"source": "Opens Settings / Gateway",
"translated": "Ouvre Réglages / Gateway"
},
{
"id": "native.apple.ed16c9793f468dcd",
"source": "Agent chat and recent work.",
"translated": "Discussion de l'agent et travaux récents."
},
{
"id": "native.apple.a03e961ab14ba060",
"source": "Overview",
"translated": "Vue densemble"
},
{
"id": "native.apple.feb28c9cba676ba2",
"source": "Instances",
"translated": "Instances"
},
{
"id": "native.apple.3f2726ccd1acd987",
"source": "Files",
"translated": "Fichiers"
},
{
"id": "native.apple.614c9b40919fb103",
"source": "Dreaming",
"translated": "Rêve"
},
{
"id": "native.apple.e2b5c2d7c5d461a3",
"source": "Usage",
"translated": "Utilisation"
},
{
"id": "native.apple.f21bf1e3b5ec896c",
"source": "Automations",
"translated": "Automatisations"
},
{
"id": "native.apple.57587fec1ca582ec",
"source": "Default Agent",
"translated": "Agent par défaut"
},
{
"id": "native.apple.e0e99a802f07cc68",
"source": "Gateway",
"translated": "Gateway"
},
{
"id": "native.apple.731e5fccde7cbc86",
"source": "Gateway %1$@, %2$@, %3$@",
"translated": "Gateway %1$@, %2$@, %3$@"
},
{
"id": "native.apple.ab0a315f69e3d5df",
"source": "Gateway %1$@, %2$@",
"translated": "Gateway %1$@, %2$@"
},
{
"id": "native.apple.01ad746119fbc27d",
"source": "Online",
"translated": "En ligne"
},
{
"id": "native.apple.e253ef19f6e53371",
"source": "Connecting",
"translated": "Connexion"
},
{
"id": "native.apple.6f28b07ebdc2b25d",
"source": "Attention",
"translated": "Attention"
},
{
"id": "native.apple.1c931bcd1cd20334",
"source": "Offline",
"translated": "Hors ligne"
},
{
"id": "native.apple.65602c216b89032d",
"source": "Channels / Integrations",
@@ -12988,6 +12948,16 @@
"source": "System follows this devices appearance setting.",
"translated": "Le système suit le réglage dapparence de cet appareil."
},
{
"id": "native.apple.6d48137a8f6a5e96",
"source": "Sidebar Agents",
"translated": "Agents de la barre latérale"
},
{
"id": "native.apple.69cccbdee0bb0b56",
"source": "How many agents the sidebar lists before the switcher menu.",
"translated": "Nombre dagents affichés dans la barre latérale avant le menu de sélection."
},
{
"id": "native.apple.70eca66c79335a6e",
"source": "Connection",
@@ -13389,9 +13359,9 @@
"translated": "Par défaut"
},
{
"id": "native.apple.f4ae5664c3eda95d",
"source": "Used for new Chat threads and Talk sessions.",
"translated": "Utilisé pour les nouveaux fils de discussion Chat et les sessions Talk."
"id": "native.apple.6805480889265026",
"source": "Used for new Chat and Talk sessions.",
"translated": "Utilisé pour les nouvelles sessions de discussion et de conversation."
},
{
"id": "native.apple.19552e71de246322",
@@ -15624,39 +15594,134 @@
"translated": "unknown relay error"
},
{
"id": "native.apple.c23d35de8d70863f",
"id": "native.apple.8855710a55de2ed5",
"source": "OpenClaw",
"translated": "OpenClaw"
},
{
"id": "native.apple.9e781c0183b79a76",
"source": "OpenClaw %@",
"translated": "OpenClaw %@"
"id": "native.apple.7029e1235380a92c",
"source": "Settings",
"translated": "Réglages"
},
{
"id": "native.apple.f4eea6473f43388d",
"id": "native.apple.7042a7d70a7e5a20",
"source": "Hide Sidebar",
"translated": "Masquer la barre latérale"
},
{
"id": "native.apple.e779847164babc29",
"source": "Selected",
"translated": "Sélectionné"
},
{
"id": "native.apple.698c71602b569378",
"source": "More Agents",
"translated": "Plus dagents"
},
{
"id": "native.apple.94772cbd85c42e6e",
"source": "Search sessions",
"translated": "Search sessions"
},
{
"id": "native.apple.38e1e910f0958067",
"source": "Clear session search",
"translated": "Clear session search"
},
{
"id": "native.apple.58248484e54174e3",
"source": "Loading sessions",
"translated": "Loading sessions"
},
{
"id": "native.apple.dfb5cbd55893c4e5",
"source": "No recent sessions",
"translated": "No recent sessions"
},
{
"id": "native.apple.01a4c3f6192bb1a3",
"source": "Recent",
"translated": "Récents"
},
{
"id": "native.apple.c0a4d120556df169",
"source": "All Sessions…",
"translated": "All Sessions…"
},
{
"id": "native.apple.aa7c4ecffd2ba36a",
"source": "Edit Pages",
"translated": "Modifier les pages"
},
{
"id": "native.apple.4d724d2e5731583d",
"source": "Home",
"translated": "Accueil"
},
{
"id": "native.apple.3995f7f73d1ded5f",
"source": "Unread",
"translated": "Non lu"
},
{
"id": "native.apple.b4567540cbcaf944",
"source": "Attention",
"translated": "Attention"
},
{
"id": "native.apple.14858678ae3f059f",
"source": "New Chat",
"translated": "Nouveau chat"
},
{
"id": "native.apple.9d87aa7e7862a607",
"source": "Connection",
"translated": "Connexion"
},
{
"id": "native.apple.7e7c47f471dd2c69",
"source": "Online",
"translated": "En ligne"
},
{
"id": "native.apple.9e2aea6088887f1f",
"id": "native.apple.02ff27780aad60aa",
"source": "Connecting",
"translated": "Connexion"
},
{
"id": "native.apple.3624978c7d43335a",
"id": "native.apple.b2d0754aab434ea3",
"source": "Needs attention",
"translated": "Attention requise"
"translated": "Nécessite une attention"
},
{
"id": "native.apple.7da053dd774cb201",
"id": "native.apple.342c72a01b0f4bb1",
"source": "Offline",
"translated": "Hors ligne"
},
{
"id": "native.apple.a4256b2ab523ee60",
"source": "Chat",
"translated": "Discussion"
"id": "native.apple.9fc7dfa0dccea003",
"source": "Pinned pages stay in the sidebar. Home is always shown.",
"translated": "Les pages épinglées restent dans la barre latérale. Laccueil est toujours affiché."
},
{
"id": "native.apple.4bfe6dc45811d50f",
"source": "Pages",
"translated": "Pages"
},
{
"id": "native.apple.422767686f219093",
"source": "Done",
"translated": "Terminé"
},
{
"id": "native.apple.e197e8708ad3b2c8",
"source": "Pinned",
"translated": "Épinglé"
},
{
"id": "native.apple.098013d7dd8cdfc7",
"source": "Not pinned",
"translated": "Non épinglé"
},
{
"id": "native.apple.64d7dc062ef4cc81",
@@ -15693,46 +15758,21 @@
"source": "Automations",
"translated": "Automatisations"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "Afficher la barre latérale"
},
{
"id": "native.apple.bb0ea6d61a32c7c2",
"source": "Back to %@",
"translated": "Retour à %@"
},
{
"id": "native.apple.72fab75688479b3e",
"source": "Hide Sidebar",
"translated": "Masquer la barre latérale"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "Afficher la barre latérale"
},
{
"id": "native.apple.8af43f59602ec0d8",
"source": "Close canvas",
"translated": "Fermer le canevas"
},
{
"id": "native.apple.a1db6ce0aed1d18e",
"source": "Chat, voice active",
"translated": "Chat, voix activée"
},
{
"id": "native.apple.bda6cfa988e49a75",
"source": "Control",
"translated": "Contrôle"
},
{
"id": "native.apple.3c80f5351055a5f3",
"source": "Agent",
"translated": "Agent"
},
{
"id": "native.apple.22d107db5b905ef4",
"source": "Settings",
"translated": "Réglages"
},
{
"id": "native.apple.8a4751c86aa6fe77",
"source": "Gateway needs attention",
@@ -15794,9 +15834,9 @@
"translated": "Instances"
},
{
"id": "native.apple.11fe8b9941954dfb",
"source": "Threads",
"translated": "Fils de discussion"
"id": "native.apple.e3e3ce1a79ebbd70",
"source": "Sessions",
"translated": "Sessions"
},
{
"id": "native.apple.253cb2debeb51859",
+242 -202
View File
@@ -10869,9 +10869,9 @@
"translated": "आप किस पर काम करना चाहेंगे?"
},
{
"id": "native.apple.4da775013ac9b123",
"source": "The thread attaches once the gateway is ready.",
"translated": "Gateway तैयार होते ही थ्रेड संलग्न हो जाएगा।"
"id": "native.apple.ed7f703a8809b564",
"source": "The session attaches once the gateway is ready.",
"translated": "Gateway के तैयार होते ही सत्र जुड़ जाता है।"
},
{
"id": "native.apple.02611ddddef7295a",
@@ -10906,7 +10906,7 @@
{
"id": "native.apple.7c87384c7d1370e1",
"source": "New Chat",
"translated": "नया चैट"
"translated": "न चैट"
},
{
"id": "native.apple.1876037e64a74110",
@@ -10919,9 +10919,9 @@
"translated": "नए सत्र के विकल्प…"
},
{
"id": "native.apple.003b25ddafeb18e9",
"source": "Threads…",
"translated": "थ्रेड…"
"id": "native.apple.a1b0d289758e2213",
"source": "Sessions…",
"translated": "सत्र…"
},
{
"id": "native.apple.17c13312e7532c89",
@@ -11084,14 +11084,14 @@
"translated": "बनाएँ"
},
{
"id": "native.apple.31d5c7287cfb3abe",
"source": "Delete Thread?",
"translated": "थ्रेड हटाएँ?"
"id": "native.apple.e7382c53c7dd48f7",
"source": "Delete Session?",
"translated": "सत्र हटाएँ?"
},
{
"id": "native.apple.d3395564809f1120",
"source": "Delete Thread",
"translated": "थ्रेड हटाएँ"
"id": "native.apple.702fd8b48da56065",
"source": "Delete Session",
"translated": "सत्र हटाएँ"
},
{
"id": "native.apple.9b1aed19568a048e",
@@ -11099,9 +11099,9 @@
"translated": "रद्द करें"
},
{
"id": "native.apple.092659256d26cb03",
"source": "This permanently deletes the thread and its transcript.",
"translated": "यह थ्रेड और सक ट्रांसक्रिप्ट को स्थायी रूप से हटा देता है।"
"id": "native.apple.61f3f19ea24c6012",
"source": "This permanently deletes the session and its transcript.",
"translated": "इससे सत्र और सक ट्रांसक्रिप्ट स्थायी रूप से हट जाएगा।"
},
{
"id": "native.apple.0965d8d2429c3b9f",
@@ -11129,9 +11129,9 @@
"translated": "नया समूह"
},
{
"id": "native.apple.683032464c497bbd",
"source": "Rename Thread",
"translated": "थ्रेड का नाम बदलें"
"id": "native.apple.cd368674179237a0",
"source": "Rename Session",
"translated": "सत्र का नाम बदलें"
},
{
"id": "native.apple.31424500c53d6c32",
@@ -11139,15 +11139,55 @@
"translated": "समूह का नाम"
},
{
"id": "native.apple.f887aa956588f237",
"source": "Thread name",
"translated": "थ्रेड का नाम"
"id": "native.apple.8b54306971cfa8c9",
"source": "Session name",
"translated": "सत्र का नाम"
},
{
"id": "native.apple.e8018adcccaa2a4d",
"source": "View More",
"translated": "और देखें"
},
{
"id": "native.apple.e3ef1aa93156bd67",
"source": "Live",
"translated": "Live"
},
{
"id": "native.apple.bdfc040fb974b4aa",
"source": "Unread",
"translated": "अपठित"
},
{
"id": "native.apple.6f94924c0a736fcf",
"source": "Tokens",
"translated": "टोकन"
},
{
"id": "native.apple.bec8b61a3a29b59a",
"source": "Opens Sessions",
"translated": "सत्र खोलता है"
},
{
"id": "native.apple.69279daa342241c1",
"source": "Pending approvals",
"translated": "लंबित अनुमोदन"
},
{
"id": "native.apple.48af1bbb4fd06321",
"source": "Automation issues",
"translated": "Automation issues"
},
{
"id": "native.apple.3e4f2dd3a0d41b97",
"source": "31-day usage",
"translated": "31-day usage"
},
{
"id": "native.apple.c334a60ae7b4d508",
"source": "Opens Usage",
"translated": "Opens Usage"
},
{
"id": "native.apple.65fb4d9ce6e5bbda",
"source": "Gateway settings",
@@ -11179,14 +11219,14 @@
"translated": "एजेंट"
},
{
"id": "native.apple.7c8231b7b1ca480f",
"source": "Agent thread",
"translated": "एजेंट थ्रेड"
"id": "native.apple.789d5d0790fd18ca",
"source": "Agent session",
"translated": "एजेंट सत्र"
},
{
"id": "native.apple.b3c553614f762a58",
"source": "Recent threads",
"translated": "हाल के थ्रेड"
"id": "native.apple.ee45dce4a2e44737",
"source": "Recent sessions",
"translated": "हाल के सत्र"
},
{
"id": "native.apple.9161ca3c61de6cc7",
@@ -11194,9 +11234,9 @@
"translated": "Gateway ऑफ़लाइन है"
},
{
"id": "native.apple.5aa32afda85064ea",
"source": "No recent threads",
"translated": "कोई हालिया थ्रेड नहीं"
"id": "native.apple.c97e0382e578a2f7",
"source": "No recent sessions",
"translated": "कोई हालिया सत्र नहीं"
},
{
"id": "native.apple.79937d7781fb65ae",
@@ -11253,6 +11293,11 @@
"source": "Direct chat",
"translated": "सीधी चैट"
},
{
"id": "native.apple.7a39e0991fa3cd53",
"source": "just now",
"translated": "just now"
},
{
"id": "native.apple.dbd48d25920f342b",
"source": "%@ on %@",
@@ -11294,14 +11339,14 @@
"translated": "रद्द करें"
},
{
"id": "native.apple.b6855cf19a50f477",
"source": "Threads",
"translated": "थ्रेड"
"id": "native.apple.7a6511a467e34f69",
"source": "Sessions",
"translated": "सत्र"
},
{
"id": "native.apple.9b1d0ef27a1333b0",
"source": "Archived threads",
"translated": "संग्रहथ्रेड"
"id": "native.apple.e6b8913014b64f0a",
"source": "Archived sessions",
"translated": "संग्रहिसत्र"
},
{
"id": "native.apple.bc8e64efb095a625",
@@ -11309,34 +11354,34 @@
"translated": "आर्काइव किए गए दिखाएँ"
},
{
"id": "native.apple.98167401c7267735",
"source": "Threads unavailable",
"translated": "थ्रेड उपलब्ध नहीं हैं"
"id": "native.apple.119433782518f199",
"source": "Sessions unavailable",
"translated": "सत्र उपलब्ध नहीं हैं"
},
{
"id": "native.apple.4d28a7def2337b9f",
"source": "Loading archived threads",
"translated": "संग्रहथ्रेड लोड हो रहे हैं"
"id": "native.apple.9882fbadac3bea03",
"source": "Loading archived sessions",
"translated": "संग्रहिसत्र लोड हो रहे हैं"
},
{
"id": "native.apple.777d7b706933bd7b",
"source": "Loading recent threads",
"translated": "हाल के थ्रेड लोड हो रहे हैं"
"id": "native.apple.16dca1cfac8a571b",
"source": "Loading recent sessions",
"translated": "हाल के सत्र लोड हो रहे हैं"
},
{
"id": "native.apple.22f81ea94bef8410",
"source": "^[\\(count) thread](inflect: true)",
"translated": "^[\\(count) थ्रेड](inflect: true)"
"id": "native.apple.207dad20d09f3160",
"source": "^[\\(count) session](inflect: true)",
"translated": "^[\\(count) सत्र](inflect: true)"
},
{
"id": "native.apple.1cad51e14db59bf9",
"source": "No archived threads",
"translated": "कोई संग्रहथ्रेड नहीं"
"id": "native.apple.a0b4091bf77d4060",
"source": "No archived sessions",
"translated": "कोई संग्रहिसत्र नहीं"
},
{
"id": "native.apple.18ef832d3a7ddcf8",
"source": "Archived threads will appear here.",
"translated": "संग्रहथ्रेड यहाँ दिखाई देंगे।"
"id": "native.apple.acfdf5c72e289736",
"source": "Archived sessions will appear here.",
"translated": "संग्रहिसत्र यहाँ दिखाई देंगे।"
},
{
"id": "native.apple.e8e8cea7ec44fe08",
@@ -11419,9 +11464,9 @@
"translated": "इनटेक साझा करें"
},
{
"id": "native.apple.21d9208d86a4d1fe",
"source": "Loading threads",
"translated": "थ्रेड लोड हो रहे हैं"
"id": "native.apple.4c5b2ecf243cfbbc",
"source": "Loading sessions",
"translated": "सत्र लोड हो रहे हैं"
},
{
"id": "native.apple.48655128d0a34e44",
@@ -11429,19 +11474,19 @@
"translated": "Gateway से हाल की गतिविधि प्राप्त की जा रही है।"
},
{
"id": "native.apple.4be1f79aa2b230ff",
"source": "Threads unavailable",
"translated": "थ्रेड उपलब्ध नहीं हैं"
"id": "native.apple.c4479934c65c973c",
"source": "Sessions unavailable",
"translated": "सत्र उपलब्ध नहीं हैं"
},
{
"id": "native.apple.98b348873556bc46",
"source": "No recent threads",
"translated": "कोई हालिया थ्रेड नहीं"
"id": "native.apple.6e67b64954ba3002",
"source": "No recent sessions",
"translated": "कोई हालिया सत्र नहीं"
},
{
"id": "native.apple.7396d205574d279f",
"source": "Thread activity offline",
"translated": "थ्रेड गतिविधि ऑफ़लाइन है"
"id": "native.apple.5dce07848bec08b5",
"source": "Session activity offline",
"translated": "सत्र गतिविधि ऑफ़लाइन है"
},
{
"id": "native.apple.e3586d8a603f67e0",
@@ -11899,9 +11944,9 @@
"translated": "कार्ड"
},
{
"id": "native.apple.c9ec1b0e18074d8a",
"source": "Open Thread",
"translated": "थ्रेड खोलें"
"id": "native.apple.3edbccb7c14b693c",
"source": "Open Session",
"translated": "सत्र खोलें"
},
{
"id": "native.apple.a2732e4ff77a201b",
@@ -12103,91 +12148,6 @@
"source": "Offline",
"translated": "ऑफ़लाइन"
},
{
"id": "native.apple.a2d8e7b4dba29764",
"source": "Control",
"translated": "कंट्रोल"
},
{
"id": "native.apple.597471e86dda3d38",
"source": "Opens Settings / Gateway",
"translated": "Settings / Gateway खोलता है"
},
{
"id": "native.apple.ed16c9793f468dcd",
"source": "Agent chat and recent work.",
"translated": "एजेंट चैट और हाल का कार्य।"
},
{
"id": "native.apple.a03e961ab14ba060",
"source": "Overview",
"translated": "ओवरव्यू"
},
{
"id": "native.apple.feb28c9cba676ba2",
"source": "Instances",
"translated": "इंस्टेंस"
},
{
"id": "native.apple.3f2726ccd1acd987",
"source": "Files",
"translated": "फ़ाइलें"
},
{
"id": "native.apple.614c9b40919fb103",
"source": "Dreaming",
"translated": "ड्रीमिंग"
},
{
"id": "native.apple.e2b5c2d7c5d461a3",
"source": "Usage",
"translated": "उपयोग"
},
{
"id": "native.apple.f21bf1e3b5ec896c",
"source": "Automations",
"translated": "स्वचालन"
},
{
"id": "native.apple.57587fec1ca582ec",
"source": "Default Agent",
"translated": "डिफ़ॉल्ट एजेंट"
},
{
"id": "native.apple.e0e99a802f07cc68",
"source": "Gateway",
"translated": "Gateway"
},
{
"id": "native.apple.731e5fccde7cbc86",
"source": "Gateway %1$@, %2$@, %3$@",
"translated": "Gateway %1$@, %2$@, %3$@"
},
{
"id": "native.apple.ab0a315f69e3d5df",
"source": "Gateway %1$@, %2$@",
"translated": "Gateway %1$@, %2$@"
},
{
"id": "native.apple.01ad746119fbc27d",
"source": "Online",
"translated": "ऑनलाइन"
},
{
"id": "native.apple.e253ef19f6e53371",
"source": "Connecting",
"translated": "कनेक्ट हो रहा है"
},
{
"id": "native.apple.6f28b07ebdc2b25d",
"source": "Attention",
"translated": "ध्यान दें"
},
{
"id": "native.apple.1c931bcd1cd20334",
"source": "Offline",
"translated": "ऑफ़लाइन"
},
{
"id": "native.apple.65602c216b89032d",
"source": "Channels / Integrations",
@@ -12988,6 +12948,16 @@
"source": "System follows this devices appearance setting.",
"translated": "सिस्टम इस डिवाइस की अपीयरेंस सेटिंग का पालन करता है।"
},
{
"id": "native.apple.6d48137a8f6a5e96",
"source": "Sidebar Agents",
"translated": "साइडबार एजेंट"
},
{
"id": "native.apple.69cccbdee0bb0b56",
"source": "How many agents the sidebar lists before the switcher menu.",
"translated": "स्विचर मेनू से पहले साइडबार में सूचीबद्ध एजेंटों की संख्या।"
},
{
"id": "native.apple.70eca66c79335a6e",
"source": "Connection",
@@ -13389,9 +13359,9 @@
"translated": "डिफ़ॉल्ट"
},
{
"id": "native.apple.f4ae5664c3eda95d",
"source": "Used for new Chat threads and Talk sessions.",
"translated": "नई चैट थ्रेड और बातचीत सत्रों के लिए उपयोग किया जाता है।"
"id": "native.apple.6805480889265026",
"source": "Used for new Chat and Talk sessions.",
"translated": "नए Chat और Talk सत्रों के लिए उपयोग किया जाता है।"
},
{
"id": "native.apple.19552e71de246322",
@@ -15624,39 +15594,134 @@
"translated": "unknown relay error"
},
{
"id": "native.apple.c23d35de8d70863f",
"id": "native.apple.8855710a55de2ed5",
"source": "OpenClaw",
"translated": "OpenClaw"
},
{
"id": "native.apple.9e781c0183b79a76",
"source": "OpenClaw %@",
"translated": "OpenClaw %@"
"id": "native.apple.7029e1235380a92c",
"source": "Settings",
"translated": "सेटिंग्स"
},
{
"id": "native.apple.f4eea6473f43388d",
"id": "native.apple.7042a7d70a7e5a20",
"source": "Hide Sidebar",
"translated": "साइडबार छिपाएँ"
},
{
"id": "native.apple.e779847164babc29",
"source": "Selected",
"translated": "चयनित"
},
{
"id": "native.apple.698c71602b569378",
"source": "More Agents",
"translated": "और एजेंट"
},
{
"id": "native.apple.94772cbd85c42e6e",
"source": "Search sessions",
"translated": "Search sessions"
},
{
"id": "native.apple.38e1e910f0958067",
"source": "Clear session search",
"translated": "Clear session search"
},
{
"id": "native.apple.58248484e54174e3",
"source": "Loading sessions",
"translated": "Loading sessions"
},
{
"id": "native.apple.dfb5cbd55893c4e5",
"source": "No recent sessions",
"translated": "No recent sessions"
},
{
"id": "native.apple.01a4c3f6192bb1a3",
"source": "Recent",
"translated": "हाल के"
},
{
"id": "native.apple.c0a4d120556df169",
"source": "All Sessions…",
"translated": "All Sessions…"
},
{
"id": "native.apple.aa7c4ecffd2ba36a",
"source": "Edit Pages",
"translated": "पेज संपादित करें"
},
{
"id": "native.apple.4d724d2e5731583d",
"source": "Home",
"translated": "होम"
},
{
"id": "native.apple.3995f7f73d1ded5f",
"source": "Unread",
"translated": "अपठित"
},
{
"id": "native.apple.b4567540cbcaf944",
"source": "Attention",
"translated": "ध्यान दें"
},
{
"id": "native.apple.14858678ae3f059f",
"source": "New Chat",
"translated": "नई चैट"
},
{
"id": "native.apple.9d87aa7e7862a607",
"source": "Connection",
"translated": "कनेक्शन"
},
{
"id": "native.apple.7e7c47f471dd2c69",
"source": "Online",
"translated": "ऑनलाइन"
},
{
"id": "native.apple.9e2aea6088887f1f",
"id": "native.apple.02ff27780aad60aa",
"source": "Connecting",
"translated": "कनेक्ट हो रहा है"
},
{
"id": "native.apple.3624978c7d43335a",
"id": "native.apple.b2d0754aab434ea3",
"source": "Needs attention",
"translated": "ध्यान देने की आवश्यकता है"
},
{
"id": "native.apple.7da053dd774cb201",
"id": "native.apple.342c72a01b0f4bb1",
"source": "Offline",
"translated": "ऑफ़लाइन"
},
{
"id": "native.apple.a4256b2ab523ee60",
"source": "Chat",
"translated": "चैट"
"id": "native.apple.9fc7dfa0dccea003",
"source": "Pinned pages stay in the sidebar. Home is always shown.",
"translated": "पिन किए गए पेज साइडबार में बने रहते हैं। होम हमेशा दिखाया जाता है।"
},
{
"id": "native.apple.4bfe6dc45811d50f",
"source": "Pages",
"translated": "Pages"
},
{
"id": "native.apple.422767686f219093",
"source": "Done",
"translated": "पूर्ण"
},
{
"id": "native.apple.e197e8708ad3b2c8",
"source": "Pinned",
"translated": "पिन किया गया"
},
{
"id": "native.apple.098013d7dd8cdfc7",
"source": "Not pinned",
"translated": "पिन नहीं किया गया"
},
{
"id": "native.apple.64d7dc062ef4cc81",
@@ -15693,46 +15758,21 @@
"source": "Automations",
"translated": "स्वचालन"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "साइडबार दिखाएँ"
},
{
"id": "native.apple.bb0ea6d61a32c7c2",
"source": "Back to %@",
"translated": "%@ पर वापस जाएँ"
},
{
"id": "native.apple.72fab75688479b3e",
"source": "Hide Sidebar",
"translated": "साइडबार छिपाएँ"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "साइडबार दिखाएँ"
},
{
"id": "native.apple.8af43f59602ec0d8",
"source": "Close canvas",
"translated": "कैनवास बंद करें"
},
{
"id": "native.apple.a1db6ce0aed1d18e",
"source": "Chat, voice active",
"translated": "चैट, आवाज़ चालू"
},
{
"id": "native.apple.bda6cfa988e49a75",
"source": "Control",
"translated": "नियंत्रण"
},
{
"id": "native.apple.3c80f5351055a5f3",
"source": "Agent",
"translated": "एजेंट"
},
{
"id": "native.apple.22d107db5b905ef4",
"source": "Settings",
"translated": "सेटिंग्स"
},
{
"id": "native.apple.8a4751c86aa6fe77",
"source": "Gateway needs attention",
@@ -15794,9 +15834,9 @@
"translated": "इंस्टेंस"
},
{
"id": "native.apple.11fe8b9941954dfb",
"source": "Threads",
"translated": "थ्रेड"
"id": "native.apple.e3e3ce1a79ebbd70",
"source": "Sessions",
"translated": "सत्र"
},
{
"id": "native.apple.253cb2debeb51859",
+242 -202
View File
@@ -10869,9 +10869,9 @@
"translated": "Apa yang ingin Anda kerjakan?"
},
{
"id": "native.apple.4da775013ac9b123",
"source": "The thread attaches once the gateway is ready.",
"translated": "Utas akan terhubung setelah Gateway siap."
"id": "native.apple.ed7f703a8809b564",
"source": "The session attaches once the gateway is ready.",
"translated": "Sesi akan terhubung setelah gateway siap."
},
{
"id": "native.apple.02611ddddef7295a",
@@ -10919,9 +10919,9 @@
"translated": "Opsi Sesi Baru…"
},
{
"id": "native.apple.003b25ddafeb18e9",
"source": "Threads…",
"translated": "Utas…"
"id": "native.apple.a1b0d289758e2213",
"source": "Sessions…",
"translated": "Sesi…"
},
{
"id": "native.apple.17c13312e7532c89",
@@ -11084,14 +11084,14 @@
"translated": "Buat"
},
{
"id": "native.apple.31d5c7287cfb3abe",
"source": "Delete Thread?",
"translated": "Hapus Utas?"
"id": "native.apple.e7382c53c7dd48f7",
"source": "Delete Session?",
"translated": "Hapus Sesi?"
},
{
"id": "native.apple.d3395564809f1120",
"source": "Delete Thread",
"translated": "Hapus Utas"
"id": "native.apple.702fd8b48da56065",
"source": "Delete Session",
"translated": "Hapus Sesi"
},
{
"id": "native.apple.9b1aed19568a048e",
@@ -11099,9 +11099,9 @@
"translated": "Batal"
},
{
"id": "native.apple.092659256d26cb03",
"source": "This permanently deletes the thread and its transcript.",
"translated": "Tindakan ini akan menghapus utas dan transkripnya secara permanen."
"id": "native.apple.61f3f19ea24c6012",
"source": "This permanently deletes the session and its transcript.",
"translated": "Tindakan ini akan menghapus sesi dan transkripnya secara permanen."
},
{
"id": "native.apple.0965d8d2429c3b9f",
@@ -11129,9 +11129,9 @@
"translated": "Grup Baru"
},
{
"id": "native.apple.683032464c497bbd",
"source": "Rename Thread",
"translated": "Ganti Nama Utas"
"id": "native.apple.cd368674179237a0",
"source": "Rename Session",
"translated": "Ubah Nama Sesi"
},
{
"id": "native.apple.31424500c53d6c32",
@@ -11139,15 +11139,55 @@
"translated": "Nama grup"
},
{
"id": "native.apple.f887aa956588f237",
"source": "Thread name",
"translated": "Nama utas"
"id": "native.apple.8b54306971cfa8c9",
"source": "Session name",
"translated": "Nama sesi"
},
{
"id": "native.apple.e8018adcccaa2a4d",
"source": "View More",
"translated": "Lihat Selengkapnya"
},
{
"id": "native.apple.e3ef1aa93156bd67",
"source": "Live",
"translated": "Live"
},
{
"id": "native.apple.bdfc040fb974b4aa",
"source": "Unread",
"translated": "Belum dibaca"
},
{
"id": "native.apple.6f94924c0a736fcf",
"source": "Tokens",
"translated": "Token"
},
{
"id": "native.apple.bec8b61a3a29b59a",
"source": "Opens Sessions",
"translated": "Membuka Sesi"
},
{
"id": "native.apple.69279daa342241c1",
"source": "Pending approvals",
"translated": "Persetujuan tertunda"
},
{
"id": "native.apple.48af1bbb4fd06321",
"source": "Automation issues",
"translated": "Automation issues"
},
{
"id": "native.apple.3e4f2dd3a0d41b97",
"source": "31-day usage",
"translated": "31-day usage"
},
{
"id": "native.apple.c334a60ae7b4d508",
"source": "Opens Usage",
"translated": "Opens Usage"
},
{
"id": "native.apple.65fb4d9ce6e5bbda",
"source": "Gateway settings",
@@ -11179,14 +11219,14 @@
"translated": "Agen"
},
{
"id": "native.apple.7c8231b7b1ca480f",
"source": "Agent thread",
"translated": "Utas agen"
"id": "native.apple.789d5d0790fd18ca",
"source": "Agent session",
"translated": "Sesi agen"
},
{
"id": "native.apple.b3c553614f762a58",
"source": "Recent threads",
"translated": "Utas terbaru"
"id": "native.apple.ee45dce4a2e44737",
"source": "Recent sessions",
"translated": "Sesi terbaru"
},
{
"id": "native.apple.9161ca3c61de6cc7",
@@ -11194,9 +11234,9 @@
"translated": "Gateway offline"
},
{
"id": "native.apple.5aa32afda85064ea",
"source": "No recent threads",
"translated": "Tidak ada utas terbaru"
"id": "native.apple.c97e0382e578a2f7",
"source": "No recent sessions",
"translated": "Tidak ada sesi terbaru"
},
{
"id": "native.apple.79937d7781fb65ae",
@@ -11253,6 +11293,11 @@
"source": "Direct chat",
"translated": "Obrolan langsung"
},
{
"id": "native.apple.7a39e0991fa3cd53",
"source": "just now",
"translated": "just now"
},
{
"id": "native.apple.dbd48d25920f342b",
"source": "%@ on %@",
@@ -11294,14 +11339,14 @@
"translated": "Batal"
},
{
"id": "native.apple.b6855cf19a50f477",
"source": "Threads",
"translated": "Utas"
"id": "native.apple.7a6511a467e34f69",
"source": "Sessions",
"translated": "Sesi"
},
{
"id": "native.apple.9b1d0ef27a1333b0",
"source": "Archived threads",
"translated": "Utas yang diarsipkan"
"id": "native.apple.e6b8913014b64f0a",
"source": "Archived sessions",
"translated": "Sesi yang diarsipkan"
},
{
"id": "native.apple.bc8e64efb095a625",
@@ -11309,34 +11354,34 @@
"translated": "Tampilkan yang Diarsipkan"
},
{
"id": "native.apple.98167401c7267735",
"source": "Threads unavailable",
"translated": "Utas tidak tersedia"
"id": "native.apple.119433782518f199",
"source": "Sessions unavailable",
"translated": "Sesi tidak tersedia"
},
{
"id": "native.apple.4d28a7def2337b9f",
"source": "Loading archived threads",
"translated": "Memuat utas yang diarsipkan"
"id": "native.apple.9882fbadac3bea03",
"source": "Loading archived sessions",
"translated": "Memuat sesi yang diarsipkan"
},
{
"id": "native.apple.777d7b706933bd7b",
"source": "Loading recent threads",
"translated": "Memuat utas terbaru"
"id": "native.apple.16dca1cfac8a571b",
"source": "Loading recent sessions",
"translated": "Memuat sesi terbaru"
},
{
"id": "native.apple.22f81ea94bef8410",
"source": "^[\\(count) thread](inflect: true)",
"translated": "^[\\(count) utas](inflect: true)"
"id": "native.apple.207dad20d09f3160",
"source": "^[\\(count) session](inflect: true)",
"translated": "^[\\(count) sesi](inflect: true)"
},
{
"id": "native.apple.1cad51e14db59bf9",
"source": "No archived threads",
"translated": "Tidak ada utas yang diarsipkan"
"id": "native.apple.a0b4091bf77d4060",
"source": "No archived sessions",
"translated": "Tidak ada sesi yang diarsipkan"
},
{
"id": "native.apple.18ef832d3a7ddcf8",
"source": "Archived threads will appear here.",
"translated": "Utas yang diarsipkan akan muncul di sini."
"id": "native.apple.acfdf5c72e289736",
"source": "Archived sessions will appear here.",
"translated": "Sesi yang diarsipkan akan muncul di sini."
},
{
"id": "native.apple.e8e8cea7ec44fe08",
@@ -11419,9 +11464,9 @@
"translated": "Bagikan masukan"
},
{
"id": "native.apple.21d9208d86a4d1fe",
"source": "Loading threads",
"translated": "Memuat utas"
"id": "native.apple.4c5b2ecf243cfbbc",
"source": "Loading sessions",
"translated": "Memuat sesi"
},
{
"id": "native.apple.48655128d0a34e44",
@@ -11429,19 +11474,19 @@
"translated": "Mengambil aktivitas terbaru dari gateway."
},
{
"id": "native.apple.4be1f79aa2b230ff",
"source": "Threads unavailable",
"translated": "Utas tidak tersedia"
"id": "native.apple.c4479934c65c973c",
"source": "Sessions unavailable",
"translated": "Sesi tidak tersedia"
},
{
"id": "native.apple.98b348873556bc46",
"source": "No recent threads",
"translated": "Tidak ada utas terbaru"
"id": "native.apple.6e67b64954ba3002",
"source": "No recent sessions",
"translated": "Tidak ada sesi terbaru"
},
{
"id": "native.apple.7396d205574d279f",
"source": "Thread activity offline",
"translated": "Aktivitas utas offline"
"id": "native.apple.5dce07848bec08b5",
"source": "Session activity offline",
"translated": "Aktivitas sesi offline"
},
{
"id": "native.apple.e3586d8a603f67e0",
@@ -11899,9 +11944,9 @@
"translated": "Kartu"
},
{
"id": "native.apple.c9ec1b0e18074d8a",
"source": "Open Thread",
"translated": "Buka Utas"
"id": "native.apple.3edbccb7c14b693c",
"source": "Open Session",
"translated": "Buka Sesi"
},
{
"id": "native.apple.a2732e4ff77a201b",
@@ -12103,91 +12148,6 @@
"source": "Offline",
"translated": "Offline"
},
{
"id": "native.apple.a2d8e7b4dba29764",
"source": "Control",
"translated": "Kontrol"
},
{
"id": "native.apple.597471e86dda3d38",
"source": "Opens Settings / Gateway",
"translated": "Membuka Pengaturan / Gateway"
},
{
"id": "native.apple.ed16c9793f468dcd",
"source": "Agent chat and recent work.",
"translated": "Obrolan agen dan pekerjaan terkini."
},
{
"id": "native.apple.a03e961ab14ba060",
"source": "Overview",
"translated": "Ikhtisar"
},
{
"id": "native.apple.feb28c9cba676ba2",
"source": "Instances",
"translated": "Instans"
},
{
"id": "native.apple.3f2726ccd1acd987",
"source": "Files",
"translated": "File"
},
{
"id": "native.apple.614c9b40919fb103",
"source": "Dreaming",
"translated": "Bermimpi"
},
{
"id": "native.apple.e2b5c2d7c5d461a3",
"source": "Usage",
"translated": "Penggunaan"
},
{
"id": "native.apple.f21bf1e3b5ec896c",
"source": "Automations",
"translated": "Otomatisasi"
},
{
"id": "native.apple.57587fec1ca582ec",
"source": "Default Agent",
"translated": "Agen Default"
},
{
"id": "native.apple.e0e99a802f07cc68",
"source": "Gateway",
"translated": "Gateway"
},
{
"id": "native.apple.731e5fccde7cbc86",
"source": "Gateway %1$@, %2$@, %3$@",
"translated": "Gateway %1$@, %2$@, %3$@"
},
{
"id": "native.apple.ab0a315f69e3d5df",
"source": "Gateway %1$@, %2$@",
"translated": "Gateway %1$@, %2$@"
},
{
"id": "native.apple.01ad746119fbc27d",
"source": "Online",
"translated": "Online"
},
{
"id": "native.apple.e253ef19f6e53371",
"source": "Connecting",
"translated": "Menghubungkan"
},
{
"id": "native.apple.6f28b07ebdc2b25d",
"source": "Attention",
"translated": "Perhatian"
},
{
"id": "native.apple.1c931bcd1cd20334",
"source": "Offline",
"translated": "Offline"
},
{
"id": "native.apple.65602c216b89032d",
"source": "Channels / Integrations",
@@ -12988,6 +12948,16 @@
"source": "System follows this devices appearance setting.",
"translated": "Sistem mengikuti pengaturan tampilan perangkat ini."
},
{
"id": "native.apple.6d48137a8f6a5e96",
"source": "Sidebar Agents",
"translated": "Agen di Bilah Samping"
},
{
"id": "native.apple.69cccbdee0bb0b56",
"source": "How many agents the sidebar lists before the switcher menu.",
"translated": "Jumlah agen yang ditampilkan di bilah samping sebelum menu pengalih."
},
{
"id": "native.apple.70eca66c79335a6e",
"source": "Connection",
@@ -13389,9 +13359,9 @@
"translated": "Default"
},
{
"id": "native.apple.f4ae5664c3eda95d",
"source": "Used for new Chat threads and Talk sessions.",
"translated": "Digunakan untuk utas Chat baru dan sesi Talk."
"id": "native.apple.6805480889265026",
"source": "Used for new Chat and Talk sessions.",
"translated": "Digunakan untuk sesi Chat dan Talk baru."
},
{
"id": "native.apple.19552e71de246322",
@@ -15624,39 +15594,134 @@
"translated": "unknown relay error"
},
{
"id": "native.apple.c23d35de8d70863f",
"id": "native.apple.8855710a55de2ed5",
"source": "OpenClaw",
"translated": "OpenClaw"
},
{
"id": "native.apple.9e781c0183b79a76",
"source": "OpenClaw %@",
"translated": "OpenClaw %@"
"id": "native.apple.7029e1235380a92c",
"source": "Settings",
"translated": "Pengaturan"
},
{
"id": "native.apple.f4eea6473f43388d",
"id": "native.apple.7042a7d70a7e5a20",
"source": "Hide Sidebar",
"translated": "Sembunyikan Bilah Samping"
},
{
"id": "native.apple.e779847164babc29",
"source": "Selected",
"translated": "Dipilih"
},
{
"id": "native.apple.698c71602b569378",
"source": "More Agents",
"translated": "Agen Lainnya"
},
{
"id": "native.apple.94772cbd85c42e6e",
"source": "Search sessions",
"translated": "Search sessions"
},
{
"id": "native.apple.38e1e910f0958067",
"source": "Clear session search",
"translated": "Clear session search"
},
{
"id": "native.apple.58248484e54174e3",
"source": "Loading sessions",
"translated": "Loading sessions"
},
{
"id": "native.apple.dfb5cbd55893c4e5",
"source": "No recent sessions",
"translated": "No recent sessions"
},
{
"id": "native.apple.01a4c3f6192bb1a3",
"source": "Recent",
"translated": "Terbaru"
},
{
"id": "native.apple.c0a4d120556df169",
"source": "All Sessions…",
"translated": "All Sessions…"
},
{
"id": "native.apple.aa7c4ecffd2ba36a",
"source": "Edit Pages",
"translated": "Edit Halaman"
},
{
"id": "native.apple.4d724d2e5731583d",
"source": "Home",
"translated": "Beranda"
},
{
"id": "native.apple.3995f7f73d1ded5f",
"source": "Unread",
"translated": "Belum dibaca"
},
{
"id": "native.apple.b4567540cbcaf944",
"source": "Attention",
"translated": "Perhatian"
},
{
"id": "native.apple.14858678ae3f059f",
"source": "New Chat",
"translated": "Chat Baru"
},
{
"id": "native.apple.9d87aa7e7862a607",
"source": "Connection",
"translated": "Koneksi"
},
{
"id": "native.apple.7e7c47f471dd2c69",
"source": "Online",
"translated": "Online"
},
{
"id": "native.apple.9e2aea6088887f1f",
"id": "native.apple.02ff27780aad60aa",
"source": "Connecting",
"translated": "Menghubungkan"
},
{
"id": "native.apple.3624978c7d43335a",
"id": "native.apple.b2d0754aab434ea3",
"source": "Needs attention",
"translated": "Perlu perhatian"
},
{
"id": "native.apple.7da053dd774cb201",
"id": "native.apple.342c72a01b0f4bb1",
"source": "Offline",
"translated": "Offline"
"translated": "Luring"
},
{
"id": "native.apple.a4256b2ab523ee60",
"source": "Chat",
"translated": "Obrolan"
"id": "native.apple.9fc7dfa0dccea003",
"source": "Pinned pages stay in the sidebar. Home is always shown.",
"translated": "Halaman yang disematkan tetap berada di bilah sisi. Beranda selalu ditampilkan."
},
{
"id": "native.apple.4bfe6dc45811d50f",
"source": "Pages",
"translated": "Pages"
},
{
"id": "native.apple.422767686f219093",
"source": "Done",
"translated": "Selesai"
},
{
"id": "native.apple.e197e8708ad3b2c8",
"source": "Pinned",
"translated": "Disematkan"
},
{
"id": "native.apple.098013d7dd8cdfc7",
"source": "Not pinned",
"translated": "Tidak disematkan"
},
{
"id": "native.apple.64d7dc062ef4cc81",
@@ -15693,46 +15758,21 @@
"source": "Automations",
"translated": "Otomatisasi"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "Tampilkan Bilah Samping"
},
{
"id": "native.apple.bb0ea6d61a32c7c2",
"source": "Back to %@",
"translated": "Kembali ke %@"
},
{
"id": "native.apple.72fab75688479b3e",
"source": "Hide Sidebar",
"translated": "Sembunyikan Bilah Samping"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "Tampilkan Bilah Samping"
},
{
"id": "native.apple.8af43f59602ec0d8",
"source": "Close canvas",
"translated": "Tutup kanvas"
},
{
"id": "native.apple.a1db6ce0aed1d18e",
"source": "Chat, voice active",
"translated": "Chat, suara aktif"
},
{
"id": "native.apple.bda6cfa988e49a75",
"source": "Control",
"translated": "Kontrol"
},
{
"id": "native.apple.3c80f5351055a5f3",
"source": "Agent",
"translated": "Agen"
},
{
"id": "native.apple.22d107db5b905ef4",
"source": "Settings",
"translated": "Pengaturan"
},
{
"id": "native.apple.8a4751c86aa6fe77",
"source": "Gateway needs attention",
@@ -15794,9 +15834,9 @@
"translated": "Instans"
},
{
"id": "native.apple.11fe8b9941954dfb",
"source": "Threads",
"translated": "Utas"
"id": "native.apple.e3e3ce1a79ebbd70",
"source": "Sessions",
"translated": "Sesi"
},
{
"id": "native.apple.253cb2debeb51859",
+269 -229
View File
@@ -641,7 +641,7 @@
{
"id": "native.android.c65b61de70a063e7",
"source": "Offline",
"translated": "Offline"
"translated": "Non in linea"
},
{
"id": "native.android.7cd603c40e57e819",
@@ -1241,12 +1241,12 @@
{
"id": "native.android.c4abd4ecd607865f",
"source": "Offline",
"translated": "Offline"
"translated": "Non in linea"
},
{
"id": "native.android.27c3e59e49776d1a",
"source": "Online",
"translated": "Online"
"translated": "Connesso"
},
{
"id": "native.android.ff3944e9dcb605e1",
@@ -2221,7 +2221,7 @@
{
"id": "native.android.cac027a1232254cd",
"source": "Offline",
"translated": "Offline"
"translated": "Non in linea"
},
{
"id": "native.android.81dd1b93e212709e",
@@ -2236,7 +2236,7 @@
{
"id": "native.android.59602ad037679006",
"source": "Online",
"translated": "Online"
"translated": "Connesso"
},
{
"id": "native.android.a328ef4e475c8fbe",
@@ -2596,12 +2596,12 @@
{
"id": "native.android.a6785924afa501a6",
"source": "Offline",
"translated": "Offline"
"translated": "Non in linea"
},
{
"id": "native.android.0bbe0d733b1328fd",
"source": "Online",
"translated": "Online"
"translated": "Connesso"
},
{
"id": "native.android.68032afddfa2d73c",
@@ -4716,7 +4716,7 @@
{
"id": "native.android.326c79e18db465ce",
"source": "Offline",
"translated": "Offline"
"translated": "Non in linea"
},
{
"id": "native.android.c0cbf2ed1fc50e4c",
@@ -4726,7 +4726,7 @@
{
"id": "native.android.dd5b083db9470281",
"source": "Online",
"translated": "Online"
"translated": "Connesso"
},
{
"id": "native.android.62fe76eb7c0dbddc",
@@ -5701,7 +5701,7 @@
{
"id": "native.android.29a2565d51411afe",
"source": "Online",
"translated": "Online"
"translated": "Connesso"
},
{
"id": "native.android.2cfb87c0137347c5",
@@ -5776,7 +5776,7 @@
{
"id": "native.android.c093a2297a02405a",
"source": "Offline",
"translated": "Offline"
"translated": "Non in linea"
},
{
"id": "native.android.6b13be9783f8dfd3",
@@ -7076,7 +7076,7 @@
{
"id": "native.android.3ff5c1971783c590",
"source": "Offline",
"translated": "Offline"
"translated": "Non in linea"
},
{
"id": "native.android.d95742f0d232e1bf",
@@ -7726,7 +7726,7 @@
{
"id": "native.android.278e466dce078f58",
"source": "Offline",
"translated": "Offline"
"translated": "Non in linea"
},
{
"id": "native.android.6c2e520fd54edeb4",
@@ -10006,7 +10006,7 @@
{
"id": "native.apple.5fbed24f057edea8",
"source": "Online",
"translated": "Online"
"translated": "Connesso"
},
{
"id": "native.apple.f1958c5f0d880a4a",
@@ -10631,7 +10631,7 @@
{
"id": "native.apple.2be2d2e1fb0c140a",
"source": "Online",
"translated": "Online"
"translated": "Connesso"
},
{
"id": "native.apple.a97cdae7c8e13f0e",
@@ -10869,9 +10869,9 @@
"translated": "Su cosa vorresti lavorare?"
},
{
"id": "native.apple.4da775013ac9b123",
"source": "The thread attaches once the gateway is ready.",
"translated": "Il thread verrà collegato quando il Gateway sarà pronto."
"id": "native.apple.ed7f703a8809b564",
"source": "The session attaches once the gateway is ready.",
"translated": "La sessione si collega quando il gateway è pronto."
},
{
"id": "native.apple.02611ddddef7295a",
@@ -10919,9 +10919,9 @@
"translated": "Opzioni nuova sessione…"
},
{
"id": "native.apple.003b25ddafeb18e9",
"source": "Threads…",
"translated": "Thread…"
"id": "native.apple.a1b0d289758e2213",
"source": "Sessions…",
"translated": "Sessioni…"
},
{
"id": "native.apple.17c13312e7532c89",
@@ -11084,14 +11084,14 @@
"translated": "Crea"
},
{
"id": "native.apple.31d5c7287cfb3abe",
"source": "Delete Thread?",
"translated": "Eliminare il thread?"
"id": "native.apple.e7382c53c7dd48f7",
"source": "Delete Session?",
"translated": "Eliminare la sessione?"
},
{
"id": "native.apple.d3395564809f1120",
"source": "Delete Thread",
"translated": "Elimina conversazione"
"id": "native.apple.702fd8b48da56065",
"source": "Delete Session",
"translated": "Elimina sessione"
},
{
"id": "native.apple.9b1aed19568a048e",
@@ -11099,9 +11099,9 @@
"translated": "Annulla"
},
{
"id": "native.apple.092659256d26cb03",
"source": "This permanently deletes the thread and its transcript.",
"translated": "Questa operazione elimina definitivamente la conversazione e la relativa trascrizione."
"id": "native.apple.61f3f19ea24c6012",
"source": "This permanently deletes the session and its transcript.",
"translated": "Questa operazione elimina definitivamente la sessione e la relativa trascrizione."
},
{
"id": "native.apple.0965d8d2429c3b9f",
@@ -11129,9 +11129,9 @@
"translated": "Nuovo gruppo"
},
{
"id": "native.apple.683032464c497bbd",
"source": "Rename Thread",
"translated": "Rinomina conversazione"
"id": "native.apple.cd368674179237a0",
"source": "Rename Session",
"translated": "Rinomina sessione"
},
{
"id": "native.apple.31424500c53d6c32",
@@ -11139,15 +11139,55 @@
"translated": "Nome del gruppo"
},
{
"id": "native.apple.f887aa956588f237",
"source": "Thread name",
"translated": "Nome della conversazione"
"id": "native.apple.8b54306971cfa8c9",
"source": "Session name",
"translated": "Nome della sessione"
},
{
"id": "native.apple.e8018adcccaa2a4d",
"source": "View More",
"translated": "Mostra altro"
},
{
"id": "native.apple.e3ef1aa93156bd67",
"source": "Live",
"translated": "In diretta"
},
{
"id": "native.apple.bdfc040fb974b4aa",
"source": "Unread",
"translated": "Da leggere"
},
{
"id": "native.apple.6f94924c0a736fcf",
"source": "Tokens",
"translated": "Token"
},
{
"id": "native.apple.bec8b61a3a29b59a",
"source": "Opens Sessions",
"translated": "Apre Sessioni"
},
{
"id": "native.apple.69279daa342241c1",
"source": "Pending approvals",
"translated": "Approvazioni in sospeso"
},
{
"id": "native.apple.48af1bbb4fd06321",
"source": "Automation issues",
"translated": "Problemi di automazione"
},
{
"id": "native.apple.3e4f2dd3a0d41b97",
"source": "31-day usage",
"translated": "Utilizzo di 31 giorni"
},
{
"id": "native.apple.c334a60ae7b4d508",
"source": "Opens Usage",
"translated": "Apre Utilizzo"
},
{
"id": "native.apple.65fb4d9ce6e5bbda",
"source": "Gateway settings",
@@ -11179,14 +11219,14 @@
"translated": "Agenti"
},
{
"id": "native.apple.7c8231b7b1ca480f",
"source": "Agent thread",
"translated": "Conversazione dell'agente"
"id": "native.apple.789d5d0790fd18ca",
"source": "Agent session",
"translated": "Sessione dell'agente"
},
{
"id": "native.apple.b3c553614f762a58",
"source": "Recent threads",
"translated": "Conversazioni recenti"
"id": "native.apple.ee45dce4a2e44737",
"source": "Recent sessions",
"translated": "Sessioni recenti"
},
{
"id": "native.apple.9161ca3c61de6cc7",
@@ -11194,9 +11234,9 @@
"translated": "Gateway offline"
},
{
"id": "native.apple.5aa32afda85064ea",
"source": "No recent threads",
"translated": "Nessuna conversazione recente"
"id": "native.apple.c97e0382e578a2f7",
"source": "No recent sessions",
"translated": "Nessuna sessione recente"
},
{
"id": "native.apple.79937d7781fb65ae",
@@ -11211,7 +11251,7 @@
{
"id": "native.apple.e01aac63fda4c147",
"source": "Online",
"translated": "Online"
"translated": "Connesso"
},
{
"id": "native.apple.a857bc74fd053781",
@@ -11226,7 +11266,7 @@
{
"id": "native.apple.89989b6d557090e8",
"source": "Offline",
"translated": "Offline"
"translated": "Non in linea"
},
{
"id": "native.apple.a90a3aac6e2a6da8",
@@ -11253,6 +11293,11 @@
"source": "Direct chat",
"translated": "Chat diretta"
},
{
"id": "native.apple.7a39e0991fa3cd53",
"source": "just now",
"translated": "proprio ora"
},
{
"id": "native.apple.dbd48d25920f342b",
"source": "%@ on %@",
@@ -11294,14 +11339,14 @@
"translated": "Annulla"
},
{
"id": "native.apple.b6855cf19a50f477",
"source": "Threads",
"translated": "Conversazioni"
"id": "native.apple.7a6511a467e34f69",
"source": "Sessions",
"translated": "Sessioni"
},
{
"id": "native.apple.9b1d0ef27a1333b0",
"source": "Archived threads",
"translated": "Conversazioni archiviate"
"id": "native.apple.e6b8913014b64f0a",
"source": "Archived sessions",
"translated": "Sessioni archiviate"
},
{
"id": "native.apple.bc8e64efb095a625",
@@ -11309,34 +11354,34 @@
"translated": "Mostra archiviate"
},
{
"id": "native.apple.98167401c7267735",
"source": "Threads unavailable",
"translated": "Conversazioni non disponibili"
"id": "native.apple.119433782518f199",
"source": "Sessions unavailable",
"translated": "Sessioni non disponibili"
},
{
"id": "native.apple.4d28a7def2337b9f",
"source": "Loading archived threads",
"translated": "Caricamento delle conversazioni archiviate"
"id": "native.apple.9882fbadac3bea03",
"source": "Loading archived sessions",
"translated": "Caricamento delle sessioni archiviate"
},
{
"id": "native.apple.777d7b706933bd7b",
"source": "Loading recent threads",
"translated": "Caricamento delle conversazioni recenti"
"id": "native.apple.16dca1cfac8a571b",
"source": "Loading recent sessions",
"translated": "Caricamento delle sessioni recenti"
},
{
"id": "native.apple.22f81ea94bef8410",
"source": "^[\\(count) thread](inflect: true)",
"translated": "^[\\(count) conversazione](inflect: true)"
"id": "native.apple.207dad20d09f3160",
"source": "^[\\(count) session](inflect: true)",
"translated": "^[\\(count) sessione](inflect: true)"
},
{
"id": "native.apple.1cad51e14db59bf9",
"source": "No archived threads",
"translated": "Nessuna conversazione archiviata"
"id": "native.apple.a0b4091bf77d4060",
"source": "No archived sessions",
"translated": "Nessuna sessione archiviata"
},
{
"id": "native.apple.18ef832d3a7ddcf8",
"source": "Archived threads will appear here.",
"translated": "Le conversazioni archiviate appariranno qui."
"id": "native.apple.acfdf5c72e289736",
"source": "Archived sessions will appear here.",
"translated": "Le sessioni archiviate verranno visualizzate qui."
},
{
"id": "native.apple.e8e8cea7ec44fe08",
@@ -11419,9 +11464,9 @@
"translated": "Condividi acquisizione"
},
{
"id": "native.apple.21d9208d86a4d1fe",
"source": "Loading threads",
"translated": "Caricamento delle conversazioni"
"id": "native.apple.4c5b2ecf243cfbbc",
"source": "Loading sessions",
"translated": "Caricamento delle sessioni"
},
{
"id": "native.apple.48655128d0a34e44",
@@ -11429,19 +11474,19 @@
"translated": "Recupero dell'attività recente dal gateway."
},
{
"id": "native.apple.4be1f79aa2b230ff",
"source": "Threads unavailable",
"translated": "Conversazioni non disponibili"
"id": "native.apple.c4479934c65c973c",
"source": "Sessions unavailable",
"translated": "Sessioni non disponibili"
},
{
"id": "native.apple.98b348873556bc46",
"source": "No recent threads",
"translated": "Nessuna conversazione recente"
"id": "native.apple.6e67b64954ba3002",
"source": "No recent sessions",
"translated": "Nessuna sessione recente"
},
{
"id": "native.apple.7396d205574d279f",
"source": "Thread activity offline",
"translated": "Attività delle conversazioni offline"
"id": "native.apple.5dce07848bec08b5",
"source": "Session activity offline",
"translated": "Attività della sessione offline"
},
{
"id": "native.apple.e3586d8a603f67e0",
@@ -11466,7 +11511,7 @@
{
"id": "native.apple.c61170392d1aa557",
"source": "Offline",
"translated": "Offline"
"translated": "Non in linea"
},
{
"id": "native.apple.225dcb2dfdcaa76f",
@@ -11899,9 +11944,9 @@
"translated": "Scheda"
},
{
"id": "native.apple.c9ec1b0e18074d8a",
"source": "Open Thread",
"translated": "Apri conversazione"
"id": "native.apple.3edbccb7c14b693c",
"source": "Open Session",
"translated": "Apri sessione"
},
{
"id": "native.apple.a2732e4ff77a201b",
@@ -12086,7 +12131,7 @@
{
"id": "native.apple.72baecec6cf1b462",
"source": "Online",
"translated": "Online"
"translated": "Connesso"
},
{
"id": "native.apple.ca9dfb05d9034ff7",
@@ -12101,92 +12146,7 @@
{
"id": "native.apple.1fc3cbd16076f75f",
"source": "Offline",
"translated": "Offline"
},
{
"id": "native.apple.a2d8e7b4dba29764",
"source": "Control",
"translated": "Controllo"
},
{
"id": "native.apple.597471e86dda3d38",
"source": "Opens Settings / Gateway",
"translated": "Apre Impostazioni / Gateway"
},
{
"id": "native.apple.ed16c9793f468dcd",
"source": "Agent chat and recent work.",
"translated": "Chat dell'agente e lavori recenti."
},
{
"id": "native.apple.a03e961ab14ba060",
"source": "Overview",
"translated": "Panoramica"
},
{
"id": "native.apple.feb28c9cba676ba2",
"source": "Instances",
"translated": "Istanze"
},
{
"id": "native.apple.3f2726ccd1acd987",
"source": "Files",
"translated": "File"
},
{
"id": "native.apple.614c9b40919fb103",
"source": "Dreaming",
"translated": "Sogno"
},
{
"id": "native.apple.e2b5c2d7c5d461a3",
"source": "Usage",
"translated": "Utilizzo"
},
{
"id": "native.apple.f21bf1e3b5ec896c",
"source": "Automations",
"translated": "Automazioni"
},
{
"id": "native.apple.57587fec1ca582ec",
"source": "Default Agent",
"translated": "Agente predefinito"
},
{
"id": "native.apple.e0e99a802f07cc68",
"source": "Gateway",
"translated": "Gateway"
},
{
"id": "native.apple.731e5fccde7cbc86",
"source": "Gateway %1$@, %2$@, %3$@",
"translated": "Gateway %1$@, %2$@, %3$@"
},
{
"id": "native.apple.ab0a315f69e3d5df",
"source": "Gateway %1$@, %2$@",
"translated": "Gateway %1$@, %2$@"
},
{
"id": "native.apple.01ad746119fbc27d",
"source": "Online",
"translated": "Online"
},
{
"id": "native.apple.e253ef19f6e53371",
"source": "Connecting",
"translated": "Connessione"
},
{
"id": "native.apple.6f28b07ebdc2b25d",
"source": "Attention",
"translated": "Attenzione"
},
{
"id": "native.apple.1c931bcd1cd20334",
"source": "Offline",
"translated": "Offline"
"translated": "Non in linea"
},
{
"id": "native.apple.65602c216b89032d",
@@ -12391,7 +12351,7 @@
{
"id": "native.apple.042fad5f44e4a00c",
"source": "Offline",
"translated": "Offline"
"translated": "Non in linea"
},
{
"id": "native.apple.59c349b1b581354f",
@@ -12988,6 +12948,16 @@
"source": "System follows this devices appearance setting.",
"translated": "Il sistema segue l'impostazione dell'aspetto di questo dispositivo."
},
{
"id": "native.apple.6d48137a8f6a5e96",
"source": "Sidebar Agents",
"translated": "Agenti nella barra laterale"
},
{
"id": "native.apple.69cccbdee0bb0b56",
"source": "How many agents the sidebar lists before the switcher menu.",
"translated": "Numero di agenti elencati nella barra laterale prima del menu di selezione."
},
{
"id": "native.apple.70eca66c79335a6e",
"source": "Connection",
@@ -13389,9 +13359,9 @@
"translated": "Predefinito"
},
{
"id": "native.apple.f4ae5664c3eda95d",
"source": "Used for new Chat threads and Talk sessions.",
"translated": "Utilizzato per i nuovi thread di chat e le sessioni Talk."
"id": "native.apple.6805480889265026",
"source": "Used for new Chat and Talk sessions.",
"translated": "Utilizzato per le nuove sessioni di Chat e Talk."
},
{
"id": "native.apple.19552e71de246322",
@@ -14976,7 +14946,7 @@
{
"id": "native.apple.ae33908b61c6d70b",
"source": "Offline",
"translated": "Offline"
"translated": "Non in linea"
},
{
"id": "native.apple.4a98b3a346be2662",
@@ -15624,39 +15594,134 @@
"translated": "unknown relay error"
},
{
"id": "native.apple.c23d35de8d70863f",
"id": "native.apple.8855710a55de2ed5",
"source": "OpenClaw",
"translated": "OpenClaw"
},
{
"id": "native.apple.9e781c0183b79a76",
"source": "OpenClaw %@",
"translated": "OpenClaw %@"
"id": "native.apple.7029e1235380a92c",
"source": "Settings",
"translated": "Impostazioni"
},
{
"id": "native.apple.f4eea6473f43388d",
"id": "native.apple.7042a7d70a7e5a20",
"source": "Hide Sidebar",
"translated": "Nascondi barra laterale"
},
{
"id": "native.apple.e779847164babc29",
"source": "Selected",
"translated": "Selezionato"
},
{
"id": "native.apple.698c71602b569378",
"source": "More Agents",
"translated": "Altri agenti"
},
{
"id": "native.apple.94772cbd85c42e6e",
"source": "Search sessions",
"translated": "Cerca sessioni"
},
{
"id": "native.apple.38e1e910f0958067",
"source": "Clear session search",
"translated": "Cancella ricerca sessioni"
},
{
"id": "native.apple.58248484e54174e3",
"source": "Loading sessions",
"translated": "Caricamento sessioni"
},
{
"id": "native.apple.dfb5cbd55893c4e5",
"source": "No recent sessions",
"translated": "Nessuna sessione recente"
},
{
"id": "native.apple.01a4c3f6192bb1a3",
"source": "Recent",
"translated": "Recenti"
},
{
"id": "native.apple.c0a4d120556df169",
"source": "All Sessions…",
"translated": "Tutte le sessioni…"
},
{
"id": "native.apple.aa7c4ecffd2ba36a",
"source": "Edit Pages",
"translated": "Modifica pagine"
},
{
"id": "native.apple.4d724d2e5731583d",
"source": "Home",
"translated": "Home"
},
{
"id": "native.apple.3995f7f73d1ded5f",
"source": "Unread",
"translated": "Da leggere"
},
{
"id": "native.apple.b4567540cbcaf944",
"source": "Attention",
"translated": "Attenzione"
},
{
"id": "native.apple.14858678ae3f059f",
"source": "New Chat",
"translated": "Nuova chat"
},
{
"id": "native.apple.9d87aa7e7862a607",
"source": "Connection",
"translated": "Connessione"
},
{
"id": "native.apple.7e7c47f471dd2c69",
"source": "Online",
"translated": "Online"
"translated": "Connesso"
},
{
"id": "native.apple.9e2aea6088887f1f",
"id": "native.apple.02ff27780aad60aa",
"source": "Connecting",
"translated": "Connessione"
},
{
"id": "native.apple.3624978c7d43335a",
"id": "native.apple.b2d0754aab434ea3",
"source": "Needs attention",
"translated": "Richiede attenzione"
},
{
"id": "native.apple.7da053dd774cb201",
"id": "native.apple.342c72a01b0f4bb1",
"source": "Offline",
"translated": "Offline"
"translated": "Non in linea"
},
{
"id": "native.apple.a4256b2ab523ee60",
"source": "Chat",
"translated": "Chat"
"id": "native.apple.9fc7dfa0dccea003",
"source": "Pinned pages stay in the sidebar. Home is always shown.",
"translated": "Le pagine fissate rimangono nella barra laterale. Home è sempre visibile."
},
{
"id": "native.apple.4bfe6dc45811d50f",
"source": "Pages",
"translated": "Pagine"
},
{
"id": "native.apple.422767686f219093",
"source": "Done",
"translated": "Fine"
},
{
"id": "native.apple.e197e8708ad3b2c8",
"source": "Pinned",
"translated": "Fissata"
},
{
"id": "native.apple.098013d7dd8cdfc7",
"source": "Not pinned",
"translated": "Non fissata"
},
{
"id": "native.apple.64d7dc062ef4cc81",
@@ -15693,46 +15758,21 @@
"source": "Automations",
"translated": "Automazioni"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "Mostra barra laterale"
},
{
"id": "native.apple.bb0ea6d61a32c7c2",
"source": "Back to %@",
"translated": "Torna a %@"
},
{
"id": "native.apple.72fab75688479b3e",
"source": "Hide Sidebar",
"translated": "Nascondi barra laterale"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "Mostra barra laterale"
},
{
"id": "native.apple.8af43f59602ec0d8",
"source": "Close canvas",
"translated": "Chiudi canvas"
},
{
"id": "native.apple.a1db6ce0aed1d18e",
"source": "Chat, voice active",
"translated": "Chat, voce attiva"
},
{
"id": "native.apple.bda6cfa988e49a75",
"source": "Control",
"translated": "Controllo"
},
{
"id": "native.apple.3c80f5351055a5f3",
"source": "Agent",
"translated": "Agente"
},
{
"id": "native.apple.22d107db5b905ef4",
"source": "Settings",
"translated": "Impostazioni"
},
{
"id": "native.apple.8a4751c86aa6fe77",
"source": "Gateway needs attention",
@@ -15794,9 +15834,9 @@
"translated": "Istanze"
},
{
"id": "native.apple.11fe8b9941954dfb",
"source": "Threads",
"translated": "Thread"
"id": "native.apple.e3e3ce1a79ebbd70",
"source": "Sessions",
"translated": "Sessioni"
},
{
"id": "native.apple.253cb2debeb51859",
@@ -16151,7 +16191,7 @@
{
"id": "native.apple.c09f4e3bbef8177a",
"source": "Offline",
"translated": "Offline"
"translated": "Non in linea"
},
{
"id": "native.apple.d91efa5ed033446a",
@@ -16576,7 +16616,7 @@
{
"id": "native.apple.1bbd3d2941ae7481",
"source": "Offline",
"translated": "Offline"
"translated": "Non in linea"
},
{
"id": "native.apple.06fdaba1468c68e7",
@@ -16961,12 +17001,12 @@
{
"id": "native.apple.60cdcd03d8b51965",
"source": "Online",
"translated": "Online"
"translated": "Connesso"
},
{
"id": "native.apple.f748dad8f2ce22ae",
"source": "Offline",
"translated": "Offline"
"translated": "Non in linea"
},
{
"id": "native.apple.088f07637cc141c9",
+241 -201
View File
@@ -10869,9 +10869,9 @@
"translated": "何に取り組みますか?"
},
{
"id": "native.apple.4da775013ac9b123",
"source": "The thread attaches once the gateway is ready.",
"translated": "Gatewayの準備が整うと、スレッドが接続されます。"
"id": "native.apple.ed7f703a8809b564",
"source": "The session attaches once the gateway is ready.",
"translated": "Gatewayの準備ができると、セッションが接続されます。"
},
{
"id": "native.apple.02611ddddef7295a",
@@ -10919,9 +10919,9 @@
"translated": "新規セッションのオプション…"
},
{
"id": "native.apple.003b25ddafeb18e9",
"source": "Threads…",
"translated": "スレッド…"
"id": "native.apple.a1b0d289758e2213",
"source": "Sessions…",
"translated": "セッション…"
},
{
"id": "native.apple.17c13312e7532c89",
@@ -11084,14 +11084,14 @@
"translated": "作成"
},
{
"id": "native.apple.31d5c7287cfb3abe",
"source": "Delete Thread?",
"translated": "スレッドを削除しますか?"
"id": "native.apple.e7382c53c7dd48f7",
"source": "Delete Session?",
"translated": "セッションを削除しますか?"
},
{
"id": "native.apple.d3395564809f1120",
"source": "Delete Thread",
"translated": "スレッドを削除"
"id": "native.apple.702fd8b48da56065",
"source": "Delete Session",
"translated": "セッションを削除"
},
{
"id": "native.apple.9b1aed19568a048e",
@@ -11099,9 +11099,9 @@
"translated": "キャンセル"
},
{
"id": "native.apple.092659256d26cb03",
"source": "This permanently deletes the thread and its transcript.",
"translated": "この操作を行うと、スレッドとその記録が完全に削除されます。"
"id": "native.apple.61f3f19ea24c6012",
"source": "This permanently deletes the session and its transcript.",
"translated": "セッションとそのトランスクリプトが完全に削除されます。"
},
{
"id": "native.apple.0965d8d2429c3b9f",
@@ -11129,9 +11129,9 @@
"translated": "新規グループ"
},
{
"id": "native.apple.683032464c497bbd",
"source": "Rename Thread",
"translated": "スレッド名を変更"
"id": "native.apple.cd368674179237a0",
"source": "Rename Session",
"translated": "セッション名を変更"
},
{
"id": "native.apple.31424500c53d6c32",
@@ -11139,15 +11139,55 @@
"translated": "グループ名"
},
{
"id": "native.apple.f887aa956588f237",
"source": "Thread name",
"translated": "スレッド名"
"id": "native.apple.8b54306971cfa8c9",
"source": "Session name",
"translated": "セッション名"
},
{
"id": "native.apple.e8018adcccaa2a4d",
"source": "View More",
"translated": "さらに表示"
},
{
"id": "native.apple.e3ef1aa93156bd67",
"source": "Live",
"translated": "Live"
},
{
"id": "native.apple.bdfc040fb974b4aa",
"source": "Unread",
"translated": "未読"
},
{
"id": "native.apple.6f94924c0a736fcf",
"source": "Tokens",
"translated": "トークン"
},
{
"id": "native.apple.bec8b61a3a29b59a",
"source": "Opens Sessions",
"translated": "セッションを開く"
},
{
"id": "native.apple.69279daa342241c1",
"source": "Pending approvals",
"translated": "保留中の承認"
},
{
"id": "native.apple.48af1bbb4fd06321",
"source": "Automation issues",
"translated": "Automation issues"
},
{
"id": "native.apple.3e4f2dd3a0d41b97",
"source": "31-day usage",
"translated": "31-day usage"
},
{
"id": "native.apple.c334a60ae7b4d508",
"source": "Opens Usage",
"translated": "Opens Usage"
},
{
"id": "native.apple.65fb4d9ce6e5bbda",
"source": "Gateway settings",
@@ -11179,14 +11219,14 @@
"translated": "エージェント"
},
{
"id": "native.apple.7c8231b7b1ca480f",
"source": "Agent thread",
"translated": "エージェントスレッド"
"id": "native.apple.789d5d0790fd18ca",
"source": "Agent session",
"translated": "エージェントセッション"
},
{
"id": "native.apple.b3c553614f762a58",
"source": "Recent threads",
"translated": "最近のスレッド"
"id": "native.apple.ee45dce4a2e44737",
"source": "Recent sessions",
"translated": "最近のセッション"
},
{
"id": "native.apple.9161ca3c61de6cc7",
@@ -11194,9 +11234,9 @@
"translated": "Gateway がオフラインです"
},
{
"id": "native.apple.5aa32afda85064ea",
"source": "No recent threads",
"translated": "最近のスレッドはありません"
"id": "native.apple.c97e0382e578a2f7",
"source": "No recent sessions",
"translated": "最近のセッションはありません"
},
{
"id": "native.apple.79937d7781fb65ae",
@@ -11253,6 +11293,11 @@
"source": "Direct chat",
"translated": "ダイレクトチャット"
},
{
"id": "native.apple.7a39e0991fa3cd53",
"source": "just now",
"translated": "just now"
},
{
"id": "native.apple.dbd48d25920f342b",
"source": "%@ on %@",
@@ -11294,14 +11339,14 @@
"translated": "キャンセル"
},
{
"id": "native.apple.b6855cf19a50f477",
"source": "Threads",
"translated": "スレッド"
"id": "native.apple.7a6511a467e34f69",
"source": "Sessions",
"translated": "セッション"
},
{
"id": "native.apple.9b1d0ef27a1333b0",
"source": "Archived threads",
"translated": "アーカイブ済みのスレッド"
"id": "native.apple.e6b8913014b64f0a",
"source": "Archived sessions",
"translated": "アーカイブ済みセッション"
},
{
"id": "native.apple.bc8e64efb095a625",
@@ -11309,34 +11354,34 @@
"translated": "アーカイブを表示"
},
{
"id": "native.apple.98167401c7267735",
"source": "Threads unavailable",
"translated": "スレッドを利用できません"
"id": "native.apple.119433782518f199",
"source": "Sessions unavailable",
"translated": "セッションを利用できません"
},
{
"id": "native.apple.4d28a7def2337b9f",
"source": "Loading archived threads",
"translated": "アーカイブ済みのスレッドを読み込み中"
"id": "native.apple.9882fbadac3bea03",
"source": "Loading archived sessions",
"translated": "アーカイブ済みセッションを読み込み中"
},
{
"id": "native.apple.777d7b706933bd7b",
"source": "Loading recent threads",
"translated": "最近のスレッドを読み込み中"
"id": "native.apple.16dca1cfac8a571b",
"source": "Loading recent sessions",
"translated": "最近のセッションを読み込み中"
},
{
"id": "native.apple.22f81ea94bef8410",
"source": "^[\\(count) thread](inflect: true)",
"translated": "^[\\(count)件のスレッド](inflect: true)"
"id": "native.apple.207dad20d09f3160",
"source": "^[\\(count) session](inflect: true)",
"translated": "^[\\(count)件のセッション](inflect: true)"
},
{
"id": "native.apple.1cad51e14db59bf9",
"source": "No archived threads",
"translated": "アーカイブ済みのスレッドはありません"
"id": "native.apple.a0b4091bf77d4060",
"source": "No archived sessions",
"translated": "アーカイブ済みセッションはありません"
},
{
"id": "native.apple.18ef832d3a7ddcf8",
"source": "Archived threads will appear here.",
"translated": "アーカイブ済みのスレッドがここに表示されます。"
"id": "native.apple.acfdf5c72e289736",
"source": "Archived sessions will appear here.",
"translated": "アーカイブ済みセッションがここに表示されます。"
},
{
"id": "native.apple.e8e8cea7ec44fe08",
@@ -11419,9 +11464,9 @@
"translated": "共有取り込み"
},
{
"id": "native.apple.21d9208d86a4d1fe",
"source": "Loading threads",
"translated": "スレッドを読み込み中"
"id": "native.apple.4c5b2ecf243cfbbc",
"source": "Loading sessions",
"translated": "セッションを読み込み中"
},
{
"id": "native.apple.48655128d0a34e44",
@@ -11429,19 +11474,19 @@
"translated": "Gatewayから最近のアクティビティを取得しています。"
},
{
"id": "native.apple.4be1f79aa2b230ff",
"source": "Threads unavailable",
"translated": "スレッドを利用できません"
"id": "native.apple.c4479934c65c973c",
"source": "Sessions unavailable",
"translated": "セッションを利用できません"
},
{
"id": "native.apple.98b348873556bc46",
"source": "No recent threads",
"translated": "最近のスレッドはありません"
"id": "native.apple.6e67b64954ba3002",
"source": "No recent sessions",
"translated": "最近のセッションはありません"
},
{
"id": "native.apple.7396d205574d279f",
"source": "Thread activity offline",
"translated": "スレッドのアクティビティはオフラインです"
"id": "native.apple.5dce07848bec08b5",
"source": "Session activity offline",
"translated": "セッションアクティビティはオフラインです"
},
{
"id": "native.apple.e3586d8a603f67e0",
@@ -11899,9 +11944,9 @@
"translated": "カード"
},
{
"id": "native.apple.c9ec1b0e18074d8a",
"source": "Open Thread",
"translated": "スレッドを開く"
"id": "native.apple.3edbccb7c14b693c",
"source": "Open Session",
"translated": "セッションを開く"
},
{
"id": "native.apple.a2732e4ff77a201b",
@@ -12103,91 +12148,6 @@
"source": "Offline",
"translated": "オフライン"
},
{
"id": "native.apple.a2d8e7b4dba29764",
"source": "Control",
"translated": "コントロール"
},
{
"id": "native.apple.597471e86dda3d38",
"source": "Opens Settings / Gateway",
"translated": "設定 / Gateway を開く"
},
{
"id": "native.apple.ed16c9793f468dcd",
"source": "Agent chat and recent work.",
"translated": "エージェントチャットと最近の作業。"
},
{
"id": "native.apple.a03e961ab14ba060",
"source": "Overview",
"translated": "概要"
},
{
"id": "native.apple.feb28c9cba676ba2",
"source": "Instances",
"translated": "インスタンス"
},
{
"id": "native.apple.3f2726ccd1acd987",
"source": "Files",
"translated": "ファイル"
},
{
"id": "native.apple.614c9b40919fb103",
"source": "Dreaming",
"translated": "ドリーミング"
},
{
"id": "native.apple.e2b5c2d7c5d461a3",
"source": "Usage",
"translated": "使用状況"
},
{
"id": "native.apple.f21bf1e3b5ec896c",
"source": "Automations",
"translated": "自動化"
},
{
"id": "native.apple.57587fec1ca582ec",
"source": "Default Agent",
"translated": "デフォルトエージェント"
},
{
"id": "native.apple.e0e99a802f07cc68",
"source": "Gateway",
"translated": "Gateway"
},
{
"id": "native.apple.731e5fccde7cbc86",
"source": "Gateway %1$@, %2$@, %3$@",
"translated": "Gateway %1$@、%2$@、%3$@"
},
{
"id": "native.apple.ab0a315f69e3d5df",
"source": "Gateway %1$@, %2$@",
"translated": "Gateway %1$@、%2$@"
},
{
"id": "native.apple.01ad746119fbc27d",
"source": "Online",
"translated": "オンライン"
},
{
"id": "native.apple.e253ef19f6e53371",
"source": "Connecting",
"translated": "接続中"
},
{
"id": "native.apple.6f28b07ebdc2b25d",
"source": "Attention",
"translated": "注意"
},
{
"id": "native.apple.1c931bcd1cd20334",
"source": "Offline",
"translated": "オフライン"
},
{
"id": "native.apple.65602c216b89032d",
"source": "Channels / Integrations",
@@ -12988,6 +12948,16 @@
"source": "System follows this devices appearance setting.",
"translated": "システムはこのデバイスの外観設定に従います。"
},
{
"id": "native.apple.6d48137a8f6a5e96",
"source": "Sidebar Agents",
"translated": "サイドバーのエージェント"
},
{
"id": "native.apple.69cccbdee0bb0b56",
"source": "How many agents the sidebar lists before the switcher menu.",
"translated": "切り替えメニューの前にサイドバーに表示するエージェントの数。"
},
{
"id": "native.apple.70eca66c79335a6e",
"source": "Connection",
@@ -13389,9 +13359,9 @@
"translated": "デフォルト"
},
{
"id": "native.apple.f4ae5664c3eda95d",
"source": "Used for new Chat threads and Talk sessions.",
"translated": "新しいチャットスレッドとトークセッションに使用されます。"
"id": "native.apple.6805480889265026",
"source": "Used for new Chat and Talk sessions.",
"translated": "新しいチャットおよび通話セッションに使用されます。"
},
{
"id": "native.apple.19552e71de246322",
@@ -15624,39 +15594,134 @@
"translated": "unknown relay error"
},
{
"id": "native.apple.c23d35de8d70863f",
"id": "native.apple.8855710a55de2ed5",
"source": "OpenClaw",
"translated": "OpenClaw"
},
{
"id": "native.apple.9e781c0183b79a76",
"source": "OpenClaw %@",
"translated": "OpenClaw %@"
"id": "native.apple.7029e1235380a92c",
"source": "Settings",
"translated": "設定"
},
{
"id": "native.apple.f4eea6473f43388d",
"id": "native.apple.7042a7d70a7e5a20",
"source": "Hide Sidebar",
"translated": "サイドバーを非表示"
},
{
"id": "native.apple.e779847164babc29",
"source": "Selected",
"translated": "選択済み"
},
{
"id": "native.apple.698c71602b569378",
"source": "More Agents",
"translated": "その他のエージェント"
},
{
"id": "native.apple.94772cbd85c42e6e",
"source": "Search sessions",
"translated": "Search sessions"
},
{
"id": "native.apple.38e1e910f0958067",
"source": "Clear session search",
"translated": "Clear session search"
},
{
"id": "native.apple.58248484e54174e3",
"source": "Loading sessions",
"translated": "Loading sessions"
},
{
"id": "native.apple.dfb5cbd55893c4e5",
"source": "No recent sessions",
"translated": "No recent sessions"
},
{
"id": "native.apple.01a4c3f6192bb1a3",
"source": "Recent",
"translated": "最近"
},
{
"id": "native.apple.c0a4d120556df169",
"source": "All Sessions…",
"translated": "All Sessions…"
},
{
"id": "native.apple.aa7c4ecffd2ba36a",
"source": "Edit Pages",
"translated": "ページを編集"
},
{
"id": "native.apple.4d724d2e5731583d",
"source": "Home",
"translated": "ホーム"
},
{
"id": "native.apple.3995f7f73d1ded5f",
"source": "Unread",
"translated": "未読"
},
{
"id": "native.apple.b4567540cbcaf944",
"source": "Attention",
"translated": "注意"
},
{
"id": "native.apple.14858678ae3f059f",
"source": "New Chat",
"translated": "新規チャット"
},
{
"id": "native.apple.9d87aa7e7862a607",
"source": "Connection",
"translated": "接続"
},
{
"id": "native.apple.7e7c47f471dd2c69",
"source": "Online",
"translated": "オンライン"
},
{
"id": "native.apple.9e2aea6088887f1f",
"id": "native.apple.02ff27780aad60aa",
"source": "Connecting",
"translated": "接続中"
},
{
"id": "native.apple.3624978c7d43335a",
"id": "native.apple.b2d0754aab434ea3",
"source": "Needs attention",
"translated": "対応が必要"
},
{
"id": "native.apple.7da053dd774cb201",
"id": "native.apple.342c72a01b0f4bb1",
"source": "Offline",
"translated": "オフライン"
},
{
"id": "native.apple.a4256b2ab523ee60",
"source": "Chat",
"translated": "チャット"
"id": "native.apple.9fc7dfa0dccea003",
"source": "Pinned pages stay in the sidebar. Home is always shown.",
"translated": "ピン留めしたページはサイドバーに表示されます。ホームは常に表示されます。"
},
{
"id": "native.apple.4bfe6dc45811d50f",
"source": "Pages",
"translated": "Pages"
},
{
"id": "native.apple.422767686f219093",
"source": "Done",
"translated": "完了"
},
{
"id": "native.apple.e197e8708ad3b2c8",
"source": "Pinned",
"translated": "ピン留め済み"
},
{
"id": "native.apple.098013d7dd8cdfc7",
"source": "Not pinned",
"translated": "ピン留めなし"
},
{
"id": "native.apple.64d7dc062ef4cc81",
@@ -15693,46 +15758,21 @@
"source": "Automations",
"translated": "自動化"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "サイドバーを表示"
},
{
"id": "native.apple.bb0ea6d61a32c7c2",
"source": "Back to %@",
"translated": "%@ に戻る"
},
{
"id": "native.apple.72fab75688479b3e",
"source": "Hide Sidebar",
"translated": "サイドバーを非表示"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "サイドバーを表示"
},
{
"id": "native.apple.8af43f59602ec0d8",
"source": "Close canvas",
"translated": "キャンバスを閉じる"
},
{
"id": "native.apple.a1db6ce0aed1d18e",
"source": "Chat, voice active",
"translated": "チャット、音声オン"
},
{
"id": "native.apple.bda6cfa988e49a75",
"source": "Control",
"translated": "コントロール"
},
{
"id": "native.apple.3c80f5351055a5f3",
"source": "Agent",
"translated": "エージェント"
},
{
"id": "native.apple.22d107db5b905ef4",
"source": "Settings",
"translated": "設定"
},
{
"id": "native.apple.8a4751c86aa6fe77",
"source": "Gateway needs attention",
@@ -15794,9 +15834,9 @@
"translated": "インスタンス"
},
{
"id": "native.apple.11fe8b9941954dfb",
"source": "Threads",
"translated": "スレッド"
"id": "native.apple.e3e3ce1a79ebbd70",
"source": "Sessions",
"translated": "セッション"
},
{
"id": "native.apple.253cb2debeb51859",
+241 -201
View File
@@ -10869,9 +10869,9 @@
"translated": "무엇을 작업하시겠어요?"
},
{
"id": "native.apple.4da775013ac9b123",
"source": "The thread attaches once the gateway is ready.",
"translated": "Gateway가 준비되면 스레드가 연결됩니다."
"id": "native.apple.ed7f703a8809b564",
"source": "The session attaches once the gateway is ready.",
"translated": "Gateway가 준비되면 세션이 연결됩니다."
},
{
"id": "native.apple.02611ddddef7295a",
@@ -10919,9 +10919,9 @@
"translated": "새 세션 옵션…"
},
{
"id": "native.apple.003b25ddafeb18e9",
"source": "Threads…",
"translated": "스레드…"
"id": "native.apple.a1b0d289758e2213",
"source": "Sessions…",
"translated": "세션…"
},
{
"id": "native.apple.17c13312e7532c89",
@@ -11084,14 +11084,14 @@
"translated": "생성"
},
{
"id": "native.apple.31d5c7287cfb3abe",
"source": "Delete Thread?",
"translated": "스레드를 삭제하시겠습니까?"
"id": "native.apple.e7382c53c7dd48f7",
"source": "Delete Session?",
"translated": "세션을 삭제하시겠습니까?"
},
{
"id": "native.apple.d3395564809f1120",
"source": "Delete Thread",
"translated": "스레드 삭제"
"id": "native.apple.702fd8b48da56065",
"source": "Delete Session",
"translated": "세션 삭제"
},
{
"id": "native.apple.9b1aed19568a048e",
@@ -11099,9 +11099,9 @@
"translated": "취소"
},
{
"id": "native.apple.092659256d26cb03",
"source": "This permanently deletes the thread and its transcript.",
"translated": "스레드와 대화 기록이 영구적으로 삭제됩니다."
"id": "native.apple.61f3f19ea24c6012",
"source": "This permanently deletes the session and its transcript.",
"translated": "세션과 해당 대화 기록이 영구적으로 삭제됩니다."
},
{
"id": "native.apple.0965d8d2429c3b9f",
@@ -11129,9 +11129,9 @@
"translated": "새 그룹"
},
{
"id": "native.apple.683032464c497bbd",
"source": "Rename Thread",
"translated": "스레드 이름 변경"
"id": "native.apple.cd368674179237a0",
"source": "Rename Session",
"translated": "세션 이름 변경"
},
{
"id": "native.apple.31424500c53d6c32",
@@ -11139,15 +11139,55 @@
"translated": "그룹 이름"
},
{
"id": "native.apple.f887aa956588f237",
"source": "Thread name",
"translated": "스레드 이름"
"id": "native.apple.8b54306971cfa8c9",
"source": "Session name",
"translated": "세션 이름"
},
{
"id": "native.apple.e8018adcccaa2a4d",
"source": "View More",
"translated": "더 보기"
},
{
"id": "native.apple.e3ef1aa93156bd67",
"source": "Live",
"translated": "Live"
},
{
"id": "native.apple.bdfc040fb974b4aa",
"source": "Unread",
"translated": "읽지 않음"
},
{
"id": "native.apple.6f94924c0a736fcf",
"source": "Tokens",
"translated": "토큰"
},
{
"id": "native.apple.bec8b61a3a29b59a",
"source": "Opens Sessions",
"translated": "세션 열기"
},
{
"id": "native.apple.69279daa342241c1",
"source": "Pending approvals",
"translated": "대기 중인 승인"
},
{
"id": "native.apple.48af1bbb4fd06321",
"source": "Automation issues",
"translated": "Automation issues"
},
{
"id": "native.apple.3e4f2dd3a0d41b97",
"source": "31-day usage",
"translated": "31-day usage"
},
{
"id": "native.apple.c334a60ae7b4d508",
"source": "Opens Usage",
"translated": "Opens Usage"
},
{
"id": "native.apple.65fb4d9ce6e5bbda",
"source": "Gateway settings",
@@ -11179,14 +11219,14 @@
"translated": "에이전트"
},
{
"id": "native.apple.7c8231b7b1ca480f",
"source": "Agent thread",
"translated": "에이전트 스레드"
"id": "native.apple.789d5d0790fd18ca",
"source": "Agent session",
"translated": "에이전트 세션"
},
{
"id": "native.apple.b3c553614f762a58",
"source": "Recent threads",
"translated": "최근 스레드"
"id": "native.apple.ee45dce4a2e44737",
"source": "Recent sessions",
"translated": "최근 세션"
},
{
"id": "native.apple.9161ca3c61de6cc7",
@@ -11194,9 +11234,9 @@
"translated": "Gateway 오프라인"
},
{
"id": "native.apple.5aa32afda85064ea",
"source": "No recent threads",
"translated": "최근 스레드 없음"
"id": "native.apple.c97e0382e578a2f7",
"source": "No recent sessions",
"translated": "최근 세션 없음"
},
{
"id": "native.apple.79937d7781fb65ae",
@@ -11253,6 +11293,11 @@
"source": "Direct chat",
"translated": "다이렉트 채팅"
},
{
"id": "native.apple.7a39e0991fa3cd53",
"source": "just now",
"translated": "just now"
},
{
"id": "native.apple.dbd48d25920f342b",
"source": "%@ on %@",
@@ -11294,14 +11339,14 @@
"translated": "취소"
},
{
"id": "native.apple.b6855cf19a50f477",
"source": "Threads",
"translated": "스레드"
"id": "native.apple.7a6511a467e34f69",
"source": "Sessions",
"translated": "세션"
},
{
"id": "native.apple.9b1d0ef27a1333b0",
"source": "Archived threads",
"translated": "보관된 스레드"
"id": "native.apple.e6b8913014b64f0a",
"source": "Archived sessions",
"translated": "보관된 세션"
},
{
"id": "native.apple.bc8e64efb095a625",
@@ -11309,34 +11354,34 @@
"translated": "보관 항목 표시"
},
{
"id": "native.apple.98167401c7267735",
"source": "Threads unavailable",
"translated": "스레드를 사용할 수 없음"
"id": "native.apple.119433782518f199",
"source": "Sessions unavailable",
"translated": "세션을 사용할 수 없음"
},
{
"id": "native.apple.4d28a7def2337b9f",
"source": "Loading archived threads",
"translated": "보관된 스레드 불러오는 중"
"id": "native.apple.9882fbadac3bea03",
"source": "Loading archived sessions",
"translated": "보관된 세션 불러오는 중"
},
{
"id": "native.apple.777d7b706933bd7b",
"source": "Loading recent threads",
"translated": "최근 스레드 불러오는 중"
"id": "native.apple.16dca1cfac8a571b",
"source": "Loading recent sessions",
"translated": "최근 세션 불러오는 중"
},
{
"id": "native.apple.22f81ea94bef8410",
"source": "^[\\(count) thread](inflect: true)",
"translated": "^[\\(count)개 스레드](inflect: true)"
"id": "native.apple.207dad20d09f3160",
"source": "^[\\(count) session](inflect: true)",
"translated": "^[세션 \\(count)개](inflect: true)"
},
{
"id": "native.apple.1cad51e14db59bf9",
"source": "No archived threads",
"translated": "보관된 스레드 없음"
"id": "native.apple.a0b4091bf77d4060",
"source": "No archived sessions",
"translated": "보관된 세션 없음"
},
{
"id": "native.apple.18ef832d3a7ddcf8",
"source": "Archived threads will appear here.",
"translated": "보관된 스레드가 여기에 표시됩니다."
"id": "native.apple.acfdf5c72e289736",
"source": "Archived sessions will appear here.",
"translated": "보관된 세션이 여기에 표시됩니다."
},
{
"id": "native.apple.e8e8cea7ec44fe08",
@@ -11419,9 +11464,9 @@
"translated": "공유 인테이크"
},
{
"id": "native.apple.21d9208d86a4d1fe",
"source": "Loading threads",
"translated": "스레드 불러오는 중"
"id": "native.apple.4c5b2ecf243cfbbc",
"source": "Loading sessions",
"translated": "세션 불러오는 중"
},
{
"id": "native.apple.48655128d0a34e44",
@@ -11429,19 +11474,19 @@
"translated": "Gateway에서 최근 활동을 가져오는 중입니다."
},
{
"id": "native.apple.4be1f79aa2b230ff",
"source": "Threads unavailable",
"translated": "스레드를 사용할 수 없음"
"id": "native.apple.c4479934c65c973c",
"source": "Sessions unavailable",
"translated": "세션을 사용할 수 없음"
},
{
"id": "native.apple.98b348873556bc46",
"source": "No recent threads",
"translated": "최근 스레드 없음"
"id": "native.apple.6e67b64954ba3002",
"source": "No recent sessions",
"translated": "최근 세션 없음"
},
{
"id": "native.apple.7396d205574d279f",
"source": "Thread activity offline",
"translated": "스레드 활동 오프라인"
"id": "native.apple.5dce07848bec08b5",
"source": "Session activity offline",
"translated": "세션 활동 오프라인"
},
{
"id": "native.apple.e3586d8a603f67e0",
@@ -11899,9 +11944,9 @@
"translated": "카드"
},
{
"id": "native.apple.c9ec1b0e18074d8a",
"source": "Open Thread",
"translated": "스레드 열기"
"id": "native.apple.3edbccb7c14b693c",
"source": "Open Session",
"translated": "세션 열기"
},
{
"id": "native.apple.a2732e4ff77a201b",
@@ -12103,91 +12148,6 @@
"source": "Offline",
"translated": "오프라인"
},
{
"id": "native.apple.a2d8e7b4dba29764",
"source": "Control",
"translated": "제어"
},
{
"id": "native.apple.597471e86dda3d38",
"source": "Opens Settings / Gateway",
"translated": "설정 / Gateway 열기"
},
{
"id": "native.apple.ed16c9793f468dcd",
"source": "Agent chat and recent work.",
"translated": "에이전트 채팅 및 최근 작업."
},
{
"id": "native.apple.a03e961ab14ba060",
"source": "Overview",
"translated": "개요"
},
{
"id": "native.apple.feb28c9cba676ba2",
"source": "Instances",
"translated": "인스턴스"
},
{
"id": "native.apple.3f2726ccd1acd987",
"source": "Files",
"translated": "파일"
},
{
"id": "native.apple.614c9b40919fb103",
"source": "Dreaming",
"translated": "드리밍"
},
{
"id": "native.apple.e2b5c2d7c5d461a3",
"source": "Usage",
"translated": "사용량"
},
{
"id": "native.apple.f21bf1e3b5ec896c",
"source": "Automations",
"translated": "자동화"
},
{
"id": "native.apple.57587fec1ca582ec",
"source": "Default Agent",
"translated": "기본 에이전트"
},
{
"id": "native.apple.e0e99a802f07cc68",
"source": "Gateway",
"translated": "Gateway"
},
{
"id": "native.apple.731e5fccde7cbc86",
"source": "Gateway %1$@, %2$@, %3$@",
"translated": "Gateway %1$@, %2$@, %3$@"
},
{
"id": "native.apple.ab0a315f69e3d5df",
"source": "Gateway %1$@, %2$@",
"translated": "Gateway %1$@, %2$@"
},
{
"id": "native.apple.01ad746119fbc27d",
"source": "Online",
"translated": "온라인"
},
{
"id": "native.apple.e253ef19f6e53371",
"source": "Connecting",
"translated": "연결 중"
},
{
"id": "native.apple.6f28b07ebdc2b25d",
"source": "Attention",
"translated": "주의"
},
{
"id": "native.apple.1c931bcd1cd20334",
"source": "Offline",
"translated": "오프라인"
},
{
"id": "native.apple.65602c216b89032d",
"source": "Channels / Integrations",
@@ -12988,6 +12948,16 @@
"source": "System follows this devices appearance setting.",
"translated": "시스템은 이 기기의 화면 모드 설정을 따릅니다."
},
{
"id": "native.apple.6d48137a8f6a5e96",
"source": "Sidebar Agents",
"translated": "사이드바 에이전트"
},
{
"id": "native.apple.69cccbdee0bb0b56",
"source": "How many agents the sidebar lists before the switcher menu.",
"translated": "전환 메뉴 앞에 사이드바에 표시할 에이전트 수입니다."
},
{
"id": "native.apple.70eca66c79335a6e",
"source": "Connection",
@@ -13389,9 +13359,9 @@
"translated": "기본값"
},
{
"id": "native.apple.f4ae5664c3eda95d",
"source": "Used for new Chat threads and Talk sessions.",
"translated": "새 채팅 스레드와 Talk 세션에 사용됩니다."
"id": "native.apple.6805480889265026",
"source": "Used for new Chat and Talk sessions.",
"translated": "새로운 채팅 및 대화 세션에 사용됩니다."
},
{
"id": "native.apple.19552e71de246322",
@@ -15624,39 +15594,134 @@
"translated": "unknown relay error"
},
{
"id": "native.apple.c23d35de8d70863f",
"id": "native.apple.8855710a55de2ed5",
"source": "OpenClaw",
"translated": "OpenClaw"
},
{
"id": "native.apple.9e781c0183b79a76",
"source": "OpenClaw %@",
"translated": "OpenClaw %@"
"id": "native.apple.7029e1235380a92c",
"source": "Settings",
"translated": "설정"
},
{
"id": "native.apple.f4eea6473f43388d",
"id": "native.apple.7042a7d70a7e5a20",
"source": "Hide Sidebar",
"translated": "사이드바 숨기기"
},
{
"id": "native.apple.e779847164babc29",
"source": "Selected",
"translated": "선택됨"
},
{
"id": "native.apple.698c71602b569378",
"source": "More Agents",
"translated": "더 많은 에이전트"
},
{
"id": "native.apple.94772cbd85c42e6e",
"source": "Search sessions",
"translated": "Search sessions"
},
{
"id": "native.apple.38e1e910f0958067",
"source": "Clear session search",
"translated": "Clear session search"
},
{
"id": "native.apple.58248484e54174e3",
"source": "Loading sessions",
"translated": "Loading sessions"
},
{
"id": "native.apple.dfb5cbd55893c4e5",
"source": "No recent sessions",
"translated": "No recent sessions"
},
{
"id": "native.apple.01a4c3f6192bb1a3",
"source": "Recent",
"translated": "최근"
},
{
"id": "native.apple.c0a4d120556df169",
"source": "All Sessions…",
"translated": "All Sessions…"
},
{
"id": "native.apple.aa7c4ecffd2ba36a",
"source": "Edit Pages",
"translated": "페이지 편집"
},
{
"id": "native.apple.4d724d2e5731583d",
"source": "Home",
"translated": "홈"
},
{
"id": "native.apple.3995f7f73d1ded5f",
"source": "Unread",
"translated": "읽지 않음"
},
{
"id": "native.apple.b4567540cbcaf944",
"source": "Attention",
"translated": "주의"
},
{
"id": "native.apple.14858678ae3f059f",
"source": "New Chat",
"translated": "새 채팅"
},
{
"id": "native.apple.9d87aa7e7862a607",
"source": "Connection",
"translated": "연결"
},
{
"id": "native.apple.7e7c47f471dd2c69",
"source": "Online",
"translated": "온라인"
},
{
"id": "native.apple.9e2aea6088887f1f",
"id": "native.apple.02ff27780aad60aa",
"source": "Connecting",
"translated": "연결 중"
},
{
"id": "native.apple.3624978c7d43335a",
"id": "native.apple.b2d0754aab434ea3",
"source": "Needs attention",
"translated": "주의 필요"
},
{
"id": "native.apple.7da053dd774cb201",
"id": "native.apple.342c72a01b0f4bb1",
"source": "Offline",
"translated": "오프라인"
},
{
"id": "native.apple.a4256b2ab523ee60",
"source": "Chat",
"translated": "채팅"
"id": "native.apple.9fc7dfa0dccea003",
"source": "Pinned pages stay in the sidebar. Home is always shown.",
"translated": "고정된 페이지는 사이드바에 유지됩니다. 홈은 항상 표시됩니다."
},
{
"id": "native.apple.4bfe6dc45811d50f",
"source": "Pages",
"translated": "Pages"
},
{
"id": "native.apple.422767686f219093",
"source": "Done",
"translated": "완료"
},
{
"id": "native.apple.e197e8708ad3b2c8",
"source": "Pinned",
"translated": "고정됨"
},
{
"id": "native.apple.098013d7dd8cdfc7",
"source": "Not pinned",
"translated": "고정되지 않음"
},
{
"id": "native.apple.64d7dc062ef4cc81",
@@ -15693,46 +15758,21 @@
"source": "Automations",
"translated": "자동화"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "사이드바 보기"
},
{
"id": "native.apple.bb0ea6d61a32c7c2",
"source": "Back to %@",
"translated": "%@(으)로 돌아가기"
},
{
"id": "native.apple.72fab75688479b3e",
"source": "Hide Sidebar",
"translated": "사이드바 숨기기"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "사이드바 보기"
},
{
"id": "native.apple.8af43f59602ec0d8",
"source": "Close canvas",
"translated": "캔버스 닫기"
},
{
"id": "native.apple.a1db6ce0aed1d18e",
"source": "Chat, voice active",
"translated": "채팅, 음성 켜짐"
},
{
"id": "native.apple.bda6cfa988e49a75",
"source": "Control",
"translated": "제어"
},
{
"id": "native.apple.3c80f5351055a5f3",
"source": "Agent",
"translated": "에이전트"
},
{
"id": "native.apple.22d107db5b905ef4",
"source": "Settings",
"translated": "설정"
},
{
"id": "native.apple.8a4751c86aa6fe77",
"source": "Gateway needs attention",
@@ -15794,9 +15834,9 @@
"translated": "인스턴스"
},
{
"id": "native.apple.11fe8b9941954dfb",
"source": "Threads",
"translated": "스레드"
"id": "native.apple.e3e3ce1a79ebbd70",
"source": "Sessions",
"translated": "세션"
},
{
"id": "native.apple.253cb2debeb51859",
+241 -201
View File
@@ -10869,9 +10869,9 @@
"translated": "Waar wilt u aan werken?"
},
{
"id": "native.apple.4da775013ac9b123",
"source": "The thread attaches once the gateway is ready.",
"translated": "De thread wordt gekoppeld zodra de Gateway gereed is."
"id": "native.apple.ed7f703a8809b564",
"source": "The session attaches once the gateway is ready.",
"translated": "De sessie wordt gekoppeld zodra de Gateway gereed is."
},
{
"id": "native.apple.02611ddddef7295a",
@@ -10919,9 +10919,9 @@
"translated": "Opties voor nieuwe sessie…"
},
{
"id": "native.apple.003b25ddafeb18e9",
"source": "Threads…",
"translated": "Threads…"
"id": "native.apple.a1b0d289758e2213",
"source": "Sessions…",
"translated": "Sessies…"
},
{
"id": "native.apple.17c13312e7532c89",
@@ -11084,14 +11084,14 @@
"translated": "Aanmaken"
},
{
"id": "native.apple.31d5c7287cfb3abe",
"source": "Delete Thread?",
"translated": "Thread verwijderen?"
"id": "native.apple.e7382c53c7dd48f7",
"source": "Delete Session?",
"translated": "Sessie verwijderen?"
},
{
"id": "native.apple.d3395564809f1120",
"source": "Delete Thread",
"translated": "Thread verwijderen"
"id": "native.apple.702fd8b48da56065",
"source": "Delete Session",
"translated": "Sessie verwijderen"
},
{
"id": "native.apple.9b1aed19568a048e",
@@ -11099,9 +11099,9 @@
"translated": "Annuleren"
},
{
"id": "native.apple.092659256d26cb03",
"source": "This permanently deletes the thread and its transcript.",
"translated": "Hiermee worden de thread en het transcript permanent verwijderd."
"id": "native.apple.61f3f19ea24c6012",
"source": "This permanently deletes the session and its transcript.",
"translated": "Hiermee worden de sessie en het transcript permanent verwijderd."
},
{
"id": "native.apple.0965d8d2429c3b9f",
@@ -11129,9 +11129,9 @@
"translated": "Nieuwe groep"
},
{
"id": "native.apple.683032464c497bbd",
"source": "Rename Thread",
"translated": "Thread hernoemen"
"id": "native.apple.cd368674179237a0",
"source": "Rename Session",
"translated": "Sessie hernoemen"
},
{
"id": "native.apple.31424500c53d6c32",
@@ -11139,15 +11139,55 @@
"translated": "Groepsnaam"
},
{
"id": "native.apple.f887aa956588f237",
"source": "Thread name",
"translated": "Threadnaam"
"id": "native.apple.8b54306971cfa8c9",
"source": "Session name",
"translated": "Sessienaam"
},
{
"id": "native.apple.e8018adcccaa2a4d",
"source": "View More",
"translated": "Meer weergeven"
},
{
"id": "native.apple.e3ef1aa93156bd67",
"source": "Live",
"translated": "Live"
},
{
"id": "native.apple.bdfc040fb974b4aa",
"source": "Unread",
"translated": "Ongelezen"
},
{
"id": "native.apple.6f94924c0a736fcf",
"source": "Tokens",
"translated": "Tokens"
},
{
"id": "native.apple.bec8b61a3a29b59a",
"source": "Opens Sessions",
"translated": "Opent Sessies"
},
{
"id": "native.apple.69279daa342241c1",
"source": "Pending approvals",
"translated": "Openstaande goedkeuringen"
},
{
"id": "native.apple.48af1bbb4fd06321",
"source": "Automation issues",
"translated": "Automation issues"
},
{
"id": "native.apple.3e4f2dd3a0d41b97",
"source": "31-day usage",
"translated": "31-day usage"
},
{
"id": "native.apple.c334a60ae7b4d508",
"source": "Opens Usage",
"translated": "Opens Usage"
},
{
"id": "native.apple.65fb4d9ce6e5bbda",
"source": "Gateway settings",
@@ -11179,14 +11219,14 @@
"translated": "Agents"
},
{
"id": "native.apple.7c8231b7b1ca480f",
"source": "Agent thread",
"translated": "Agentthread"
"id": "native.apple.789d5d0790fd18ca",
"source": "Agent session",
"translated": "Agentsessie"
},
{
"id": "native.apple.b3c553614f762a58",
"source": "Recent threads",
"translated": "Recente threads"
"id": "native.apple.ee45dce4a2e44737",
"source": "Recent sessions",
"translated": "Recente sessies"
},
{
"id": "native.apple.9161ca3c61de6cc7",
@@ -11194,9 +11234,9 @@
"translated": "Gateway offline"
},
{
"id": "native.apple.5aa32afda85064ea",
"source": "No recent threads",
"translated": "Geen recente threads"
"id": "native.apple.c97e0382e578a2f7",
"source": "No recent sessions",
"translated": "Geen recente sessies"
},
{
"id": "native.apple.79937d7781fb65ae",
@@ -11253,6 +11293,11 @@
"source": "Direct chat",
"translated": "Directe chat"
},
{
"id": "native.apple.7a39e0991fa3cd53",
"source": "just now",
"translated": "just now"
},
{
"id": "native.apple.dbd48d25920f342b",
"source": "%@ on %@",
@@ -11294,14 +11339,14 @@
"translated": "Annuleren"
},
{
"id": "native.apple.b6855cf19a50f477",
"source": "Threads",
"translated": "Threads"
"id": "native.apple.7a6511a467e34f69",
"source": "Sessions",
"translated": "Sessies"
},
{
"id": "native.apple.9b1d0ef27a1333b0",
"source": "Archived threads",
"translated": "Gearchiveerde threads"
"id": "native.apple.e6b8913014b64f0a",
"source": "Archived sessions",
"translated": "Gearchiveerde sessies"
},
{
"id": "native.apple.bc8e64efb095a625",
@@ -11309,34 +11354,34 @@
"translated": "Gearchiveerde tonen"
},
{
"id": "native.apple.98167401c7267735",
"source": "Threads unavailable",
"translated": "Threads niet beschikbaar"
"id": "native.apple.119433782518f199",
"source": "Sessions unavailable",
"translated": "Sessies niet beschikbaar"
},
{
"id": "native.apple.4d28a7def2337b9f",
"source": "Loading archived threads",
"translated": "Gearchiveerde threads laden"
"id": "native.apple.9882fbadac3bea03",
"source": "Loading archived sessions",
"translated": "Gearchiveerde sessies laden"
},
{
"id": "native.apple.777d7b706933bd7b",
"source": "Loading recent threads",
"translated": "Recente threads laden"
"id": "native.apple.16dca1cfac8a571b",
"source": "Loading recent sessions",
"translated": "Recente sessies laden"
},
{
"id": "native.apple.22f81ea94bef8410",
"source": "^[\\(count) thread](inflect: true)",
"translated": "^[\\(count) thread](inflect: true)"
"id": "native.apple.207dad20d09f3160",
"source": "^[\\(count) session](inflect: true)",
"translated": "^[\\(count) sessie](inflect: true)"
},
{
"id": "native.apple.1cad51e14db59bf9",
"source": "No archived threads",
"translated": "Geen gearchiveerde threads"
"id": "native.apple.a0b4091bf77d4060",
"source": "No archived sessions",
"translated": "Geen gearchiveerde sessies"
},
{
"id": "native.apple.18ef832d3a7ddcf8",
"source": "Archived threads will appear here.",
"translated": "Gearchiveerde threads worden hier weergegeven."
"id": "native.apple.acfdf5c72e289736",
"source": "Archived sessions will appear here.",
"translated": "Gearchiveerde sessies worden hier weergegeven."
},
{
"id": "native.apple.e8e8cea7ec44fe08",
@@ -11419,9 +11464,9 @@
"translated": "Intake delen"
},
{
"id": "native.apple.21d9208d86a4d1fe",
"source": "Loading threads",
"translated": "Threads laden"
"id": "native.apple.4c5b2ecf243cfbbc",
"source": "Loading sessions",
"translated": "Sessies laden"
},
{
"id": "native.apple.48655128d0a34e44",
@@ -11429,19 +11474,19 @@
"translated": "Recente activiteit ophalen van de gateway."
},
{
"id": "native.apple.4be1f79aa2b230ff",
"source": "Threads unavailable",
"translated": "Threads niet beschikbaar"
"id": "native.apple.c4479934c65c973c",
"source": "Sessions unavailable",
"translated": "Sessies niet beschikbaar"
},
{
"id": "native.apple.98b348873556bc46",
"source": "No recent threads",
"translated": "Geen recente threads"
"id": "native.apple.6e67b64954ba3002",
"source": "No recent sessions",
"translated": "Geen recente sessies"
},
{
"id": "native.apple.7396d205574d279f",
"source": "Thread activity offline",
"translated": "Threadactiviteit offline"
"id": "native.apple.5dce07848bec08b5",
"source": "Session activity offline",
"translated": "Sessieactiviteit offline"
},
{
"id": "native.apple.e3586d8a603f67e0",
@@ -11899,9 +11944,9 @@
"translated": "Kaart"
},
{
"id": "native.apple.c9ec1b0e18074d8a",
"source": "Open Thread",
"translated": "Thread openen"
"id": "native.apple.3edbccb7c14b693c",
"source": "Open Session",
"translated": "Sessie openen"
},
{
"id": "native.apple.a2732e4ff77a201b",
@@ -12103,91 +12148,6 @@
"source": "Offline",
"translated": "Offline"
},
{
"id": "native.apple.a2d8e7b4dba29764",
"source": "Control",
"translated": "Bediening"
},
{
"id": "native.apple.597471e86dda3d38",
"source": "Opens Settings / Gateway",
"translated": "Opent Instellingen / Gateway"
},
{
"id": "native.apple.ed16c9793f468dcd",
"source": "Agent chat and recent work.",
"translated": "Agentchat en recent werk."
},
{
"id": "native.apple.a03e961ab14ba060",
"source": "Overview",
"translated": "Overzicht"
},
{
"id": "native.apple.feb28c9cba676ba2",
"source": "Instances",
"translated": "Instanties"
},
{
"id": "native.apple.3f2726ccd1acd987",
"source": "Files",
"translated": "Bestanden"
},
{
"id": "native.apple.614c9b40919fb103",
"source": "Dreaming",
"translated": "Dromen"
},
{
"id": "native.apple.e2b5c2d7c5d461a3",
"source": "Usage",
"translated": "Gebruik"
},
{
"id": "native.apple.f21bf1e3b5ec896c",
"source": "Automations",
"translated": "Automatiseringen"
},
{
"id": "native.apple.57587fec1ca582ec",
"source": "Default Agent",
"translated": "Standaardagent"
},
{
"id": "native.apple.e0e99a802f07cc68",
"source": "Gateway",
"translated": "Gateway"
},
{
"id": "native.apple.731e5fccde7cbc86",
"source": "Gateway %1$@, %2$@, %3$@",
"translated": "Gateway %1$@, %2$@, %3$@"
},
{
"id": "native.apple.ab0a315f69e3d5df",
"source": "Gateway %1$@, %2$@",
"translated": "Gateway %1$@, %2$@"
},
{
"id": "native.apple.01ad746119fbc27d",
"source": "Online",
"translated": "Online"
},
{
"id": "native.apple.e253ef19f6e53371",
"source": "Connecting",
"translated": "Verbinden"
},
{
"id": "native.apple.6f28b07ebdc2b25d",
"source": "Attention",
"translated": "Let op"
},
{
"id": "native.apple.1c931bcd1cd20334",
"source": "Offline",
"translated": "Offline"
},
{
"id": "native.apple.65602c216b89032d",
"source": "Channels / Integrations",
@@ -12988,6 +12948,16 @@
"source": "System follows this devices appearance setting.",
"translated": "Systeem volgt de weergave-instelling van dit apparaat."
},
{
"id": "native.apple.6d48137a8f6a5e96",
"source": "Sidebar Agents",
"translated": "Agenten in de zijbalk"
},
{
"id": "native.apple.69cccbdee0bb0b56",
"source": "How many agents the sidebar lists before the switcher menu.",
"translated": "Hoeveel agenten in de zijbalk worden weergegeven vóór het keuzemenu."
},
{
"id": "native.apple.70eca66c79335a6e",
"source": "Connection",
@@ -13389,9 +13359,9 @@
"translated": "Standaard"
},
{
"id": "native.apple.f4ae5664c3eda95d",
"source": "Used for new Chat threads and Talk sessions.",
"translated": "Wordt gebruikt voor nieuwe chatgesprekken en praatsessies."
"id": "native.apple.6805480889265026",
"source": "Used for new Chat and Talk sessions.",
"translated": "Wordt gebruikt voor nieuwe Chat- en Talk-sessies."
},
{
"id": "native.apple.19552e71de246322",
@@ -15624,39 +15594,134 @@
"translated": "unknown relay error"
},
{
"id": "native.apple.c23d35de8d70863f",
"id": "native.apple.8855710a55de2ed5",
"source": "OpenClaw",
"translated": "OpenClaw"
},
{
"id": "native.apple.9e781c0183b79a76",
"source": "OpenClaw %@",
"translated": "OpenClaw %@"
"id": "native.apple.7029e1235380a92c",
"source": "Settings",
"translated": "Instellingen"
},
{
"id": "native.apple.f4eea6473f43388d",
"id": "native.apple.7042a7d70a7e5a20",
"source": "Hide Sidebar",
"translated": "Zijbalk verbergen"
},
{
"id": "native.apple.e779847164babc29",
"source": "Selected",
"translated": "Geselecteerd"
},
{
"id": "native.apple.698c71602b569378",
"source": "More Agents",
"translated": "Meer agenten"
},
{
"id": "native.apple.94772cbd85c42e6e",
"source": "Search sessions",
"translated": "Search sessions"
},
{
"id": "native.apple.38e1e910f0958067",
"source": "Clear session search",
"translated": "Clear session search"
},
{
"id": "native.apple.58248484e54174e3",
"source": "Loading sessions",
"translated": "Loading sessions"
},
{
"id": "native.apple.dfb5cbd55893c4e5",
"source": "No recent sessions",
"translated": "No recent sessions"
},
{
"id": "native.apple.01a4c3f6192bb1a3",
"source": "Recent",
"translated": "Recent"
},
{
"id": "native.apple.c0a4d120556df169",
"source": "All Sessions…",
"translated": "All Sessions…"
},
{
"id": "native.apple.aa7c4ecffd2ba36a",
"source": "Edit Pages",
"translated": "Pagina's bewerken"
},
{
"id": "native.apple.4d724d2e5731583d",
"source": "Home",
"translated": "Start"
},
{
"id": "native.apple.3995f7f73d1ded5f",
"source": "Unread",
"translated": "Ongelezen"
},
{
"id": "native.apple.b4567540cbcaf944",
"source": "Attention",
"translated": "Aandacht"
},
{
"id": "native.apple.14858678ae3f059f",
"source": "New Chat",
"translated": "Nieuwe chat"
},
{
"id": "native.apple.9d87aa7e7862a607",
"source": "Connection",
"translated": "Verbinding"
},
{
"id": "native.apple.7e7c47f471dd2c69",
"source": "Online",
"translated": "Online"
},
{
"id": "native.apple.9e2aea6088887f1f",
"id": "native.apple.02ff27780aad60aa",
"source": "Connecting",
"translated": "Verbinden"
},
{
"id": "native.apple.3624978c7d43335a",
"id": "native.apple.b2d0754aab434ea3",
"source": "Needs attention",
"translated": "Aandacht vereist"
},
{
"id": "native.apple.7da053dd774cb201",
"id": "native.apple.342c72a01b0f4bb1",
"source": "Offline",
"translated": "Offline"
},
{
"id": "native.apple.a4256b2ab523ee60",
"source": "Chat",
"translated": "Chat"
"id": "native.apple.9fc7dfa0dccea003",
"source": "Pinned pages stay in the sidebar. Home is always shown.",
"translated": "Vastgezette pagina's blijven in de zijbalk staan. Start wordt altijd weergegeven."
},
{
"id": "native.apple.4bfe6dc45811d50f",
"source": "Pages",
"translated": "Pages"
},
{
"id": "native.apple.422767686f219093",
"source": "Done",
"translated": "Gereed"
},
{
"id": "native.apple.e197e8708ad3b2c8",
"source": "Pinned",
"translated": "Vastgezet"
},
{
"id": "native.apple.098013d7dd8cdfc7",
"source": "Not pinned",
"translated": "Niet vastgezet"
},
{
"id": "native.apple.64d7dc062ef4cc81",
@@ -15693,46 +15758,21 @@
"source": "Automations",
"translated": "Automatiseringen"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "Toon navigatiekolom"
},
{
"id": "native.apple.bb0ea6d61a32c7c2",
"source": "Back to %@",
"translated": "Terug naar %@"
},
{
"id": "native.apple.72fab75688479b3e",
"source": "Hide Sidebar",
"translated": "Zijbalk verbergen"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "Toon navigatiekolom"
},
{
"id": "native.apple.8af43f59602ec0d8",
"source": "Close canvas",
"translated": "Canvas sluiten"
},
{
"id": "native.apple.a1db6ce0aed1d18e",
"source": "Chat, voice active",
"translated": "Chat, stem actief"
},
{
"id": "native.apple.bda6cfa988e49a75",
"source": "Control",
"translated": "Bediening"
},
{
"id": "native.apple.3c80f5351055a5f3",
"source": "Agent",
"translated": "Agent"
},
{
"id": "native.apple.22d107db5b905ef4",
"source": "Settings",
"translated": "Instellingen"
},
{
"id": "native.apple.8a4751c86aa6fe77",
"source": "Gateway needs attention",
@@ -15794,9 +15834,9 @@
"translated": "Instances"
},
{
"id": "native.apple.11fe8b9941954dfb",
"source": "Threads",
"translated": "Gesprekken"
"id": "native.apple.e3e3ce1a79ebbd70",
"source": "Sessions",
"translated": "Sessies"
},
{
"id": "native.apple.253cb2debeb51859",
+241 -201
View File
@@ -10869,9 +10869,9 @@
"translated": "Nad czym chcesz popracować?"
},
{
"id": "native.apple.4da775013ac9b123",
"source": "The thread attaches once the gateway is ready.",
"translated": "Wątek zostanie dołączony, gdy Gateway będzie gotowy."
"id": "native.apple.ed7f703a8809b564",
"source": "The session attaches once the gateway is ready.",
"translated": "Sesja zostanie połączona, gdy Gateway będzie gotowy."
},
{
"id": "native.apple.02611ddddef7295a",
@@ -10919,9 +10919,9 @@
"translated": "Opcje nowej sesji…"
},
{
"id": "native.apple.003b25ddafeb18e9",
"source": "Threads…",
"translated": "Wątki…"
"id": "native.apple.a1b0d289758e2213",
"source": "Sessions…",
"translated": "Sesje…"
},
{
"id": "native.apple.17c13312e7532c89",
@@ -11084,14 +11084,14 @@
"translated": "Utwórz"
},
{
"id": "native.apple.31d5c7287cfb3abe",
"source": "Delete Thread?",
"translated": "Usunąć wątek?"
"id": "native.apple.e7382c53c7dd48f7",
"source": "Delete Session?",
"translated": "Usunąć sesję?"
},
{
"id": "native.apple.d3395564809f1120",
"source": "Delete Thread",
"translated": "Usuń wątek"
"id": "native.apple.702fd8b48da56065",
"source": "Delete Session",
"translated": "Usuń sesję"
},
{
"id": "native.apple.9b1aed19568a048e",
@@ -11099,9 +11099,9 @@
"translated": "Anuluj"
},
{
"id": "native.apple.092659256d26cb03",
"source": "This permanently deletes the thread and its transcript.",
"translated": "Spowoduje to trwałe usunięcie wątku i jego transkrypcji."
"id": "native.apple.61f3f19ea24c6012",
"source": "This permanently deletes the session and its transcript.",
"translated": "Spowoduje to trwałe usunięcie sesji i jej transkrypcji."
},
{
"id": "native.apple.0965d8d2429c3b9f",
@@ -11129,9 +11129,9 @@
"translated": "Nowa grupa"
},
{
"id": "native.apple.683032464c497bbd",
"source": "Rename Thread",
"translated": "Zmień nazwę wątku"
"id": "native.apple.cd368674179237a0",
"source": "Rename Session",
"translated": "Zmień nazwę sesji"
},
{
"id": "native.apple.31424500c53d6c32",
@@ -11139,15 +11139,55 @@
"translated": "Nazwa grupy"
},
{
"id": "native.apple.f887aa956588f237",
"source": "Thread name",
"translated": "Nazwa wątku"
"id": "native.apple.8b54306971cfa8c9",
"source": "Session name",
"translated": "Nazwa sesji"
},
{
"id": "native.apple.e8018adcccaa2a4d",
"source": "View More",
"translated": "Pokaż więcej"
},
{
"id": "native.apple.e3ef1aa93156bd67",
"source": "Live",
"translated": "Live"
},
{
"id": "native.apple.bdfc040fb974b4aa",
"source": "Unread",
"translated": "Nieprzeczytane"
},
{
"id": "native.apple.6f94924c0a736fcf",
"source": "Tokens",
"translated": "Tokeny"
},
{
"id": "native.apple.bec8b61a3a29b59a",
"source": "Opens Sessions",
"translated": "Otwiera sesje"
},
{
"id": "native.apple.69279daa342241c1",
"source": "Pending approvals",
"translated": "Oczekujące zatwierdzenia"
},
{
"id": "native.apple.48af1bbb4fd06321",
"source": "Automation issues",
"translated": "Automation issues"
},
{
"id": "native.apple.3e4f2dd3a0d41b97",
"source": "31-day usage",
"translated": "31-day usage"
},
{
"id": "native.apple.c334a60ae7b4d508",
"source": "Opens Usage",
"translated": "Opens Usage"
},
{
"id": "native.apple.65fb4d9ce6e5bbda",
"source": "Gateway settings",
@@ -11179,14 +11219,14 @@
"translated": "Agenci"
},
{
"id": "native.apple.7c8231b7b1ca480f",
"source": "Agent thread",
"translated": "Wątek agenta"
"id": "native.apple.789d5d0790fd18ca",
"source": "Agent session",
"translated": "Sesja agenta"
},
{
"id": "native.apple.b3c553614f762a58",
"source": "Recent threads",
"translated": "Ostatnie wątki"
"id": "native.apple.ee45dce4a2e44737",
"source": "Recent sessions",
"translated": "Ostatnie sesje"
},
{
"id": "native.apple.9161ca3c61de6cc7",
@@ -11194,9 +11234,9 @@
"translated": "Gateway offline"
},
{
"id": "native.apple.5aa32afda85064ea",
"source": "No recent threads",
"translated": "Brak ostatnich wątków"
"id": "native.apple.c97e0382e578a2f7",
"source": "No recent sessions",
"translated": "Brak ostatnich sesji"
},
{
"id": "native.apple.79937d7781fb65ae",
@@ -11253,6 +11293,11 @@
"source": "Direct chat",
"translated": "Czat bezpośredni"
},
{
"id": "native.apple.7a39e0991fa3cd53",
"source": "just now",
"translated": "just now"
},
{
"id": "native.apple.dbd48d25920f342b",
"source": "%@ on %@",
@@ -11294,14 +11339,14 @@
"translated": "Anuluj"
},
{
"id": "native.apple.b6855cf19a50f477",
"source": "Threads",
"translated": "Wątki"
"id": "native.apple.7a6511a467e34f69",
"source": "Sessions",
"translated": "Sesje"
},
{
"id": "native.apple.9b1d0ef27a1333b0",
"source": "Archived threads",
"translated": "Zarchiwizowane wątki"
"id": "native.apple.e6b8913014b64f0a",
"source": "Archived sessions",
"translated": "Zarchiwizowane sesje"
},
{
"id": "native.apple.bc8e64efb095a625",
@@ -11309,34 +11354,34 @@
"translated": "Pokaż zarchiwizowane"
},
{
"id": "native.apple.98167401c7267735",
"source": "Threads unavailable",
"translated": "Wątki są niedostępne"
"id": "native.apple.119433782518f199",
"source": "Sessions unavailable",
"translated": "Sesje są niedostępne"
},
{
"id": "native.apple.4d28a7def2337b9f",
"source": "Loading archived threads",
"translated": "Wczytywanie zarchiwizowanych wątków"
"id": "native.apple.9882fbadac3bea03",
"source": "Loading archived sessions",
"translated": "Wczytywanie zarchiwizowanych sesji"
},
{
"id": "native.apple.777d7b706933bd7b",
"source": "Loading recent threads",
"translated": "Wczytywanie ostatnich wątków"
"id": "native.apple.16dca1cfac8a571b",
"source": "Loading recent sessions",
"translated": "Wczytywanie ostatnich sesji"
},
{
"id": "native.apple.22f81ea94bef8410",
"source": "^[\\(count) thread](inflect: true)",
"translated": "^[\\(count) wątek](inflect: true)"
"id": "native.apple.207dad20d09f3160",
"source": "^[\\(count) session](inflect: true)",
"translated": "^[\\(count) sesja](inflect: true)"
},
{
"id": "native.apple.1cad51e14db59bf9",
"source": "No archived threads",
"translated": "Brak zarchiwizowanych wątków"
"id": "native.apple.a0b4091bf77d4060",
"source": "No archived sessions",
"translated": "Brak zarchiwizowanych sesji"
},
{
"id": "native.apple.18ef832d3a7ddcf8",
"source": "Archived threads will appear here.",
"translated": "Zarchiwizowane wątki pojawią się tutaj."
"id": "native.apple.acfdf5c72e289736",
"source": "Archived sessions will appear here.",
"translated": "Zarchiwizowane sesje pojawią się tutaj."
},
{
"id": "native.apple.e8e8cea7ec44fe08",
@@ -11419,9 +11464,9 @@
"translated": "Udostępnij dane wejściowe"
},
{
"id": "native.apple.21d9208d86a4d1fe",
"source": "Loading threads",
"translated": "Wczytywanie wątków"
"id": "native.apple.4c5b2ecf243cfbbc",
"source": "Loading sessions",
"translated": "Wczytywanie sesji"
},
{
"id": "native.apple.48655128d0a34e44",
@@ -11429,19 +11474,19 @@
"translated": "Pobieranie ostatniej aktywności z gateway."
},
{
"id": "native.apple.4be1f79aa2b230ff",
"source": "Threads unavailable",
"translated": "Wątki są niedostępne"
"id": "native.apple.c4479934c65c973c",
"source": "Sessions unavailable",
"translated": "Sesje są niedostępne"
},
{
"id": "native.apple.98b348873556bc46",
"source": "No recent threads",
"translated": "Brak ostatnich wątków"
"id": "native.apple.6e67b64954ba3002",
"source": "No recent sessions",
"translated": "Brak ostatnich sesji"
},
{
"id": "native.apple.7396d205574d279f",
"source": "Thread activity offline",
"translated": "Aktywność wątku jest niedostępna offline"
"id": "native.apple.5dce07848bec08b5",
"source": "Session activity offline",
"translated": "Aktywność sesji jest niedostępna"
},
{
"id": "native.apple.e3586d8a603f67e0",
@@ -11899,9 +11944,9 @@
"translated": "Karta"
},
{
"id": "native.apple.c9ec1b0e18074d8a",
"source": "Open Thread",
"translated": "Otwórz wątek"
"id": "native.apple.3edbccb7c14b693c",
"source": "Open Session",
"translated": "Otwórz sesję"
},
{
"id": "native.apple.a2732e4ff77a201b",
@@ -12103,91 +12148,6 @@
"source": "Offline",
"translated": "Offline"
},
{
"id": "native.apple.a2d8e7b4dba29764",
"source": "Control",
"translated": "Sterowanie"
},
{
"id": "native.apple.597471e86dda3d38",
"source": "Opens Settings / Gateway",
"translated": "Otwiera Ustawienia / Gateway"
},
{
"id": "native.apple.ed16c9793f468dcd",
"source": "Agent chat and recent work.",
"translated": "Czat agenta i ostatnia praca."
},
{
"id": "native.apple.a03e961ab14ba060",
"source": "Overview",
"translated": "Przegląd"
},
{
"id": "native.apple.feb28c9cba676ba2",
"source": "Instances",
"translated": "Instancje"
},
{
"id": "native.apple.3f2726ccd1acd987",
"source": "Files",
"translated": "Pliki"
},
{
"id": "native.apple.614c9b40919fb103",
"source": "Dreaming",
"translated": "Śnienie"
},
{
"id": "native.apple.e2b5c2d7c5d461a3",
"source": "Usage",
"translated": "Użycie"
},
{
"id": "native.apple.f21bf1e3b5ec896c",
"source": "Automations",
"translated": "Automatyzacje"
},
{
"id": "native.apple.57587fec1ca582ec",
"source": "Default Agent",
"translated": "Domyślny agent"
},
{
"id": "native.apple.e0e99a802f07cc68",
"source": "Gateway",
"translated": "Gateway"
},
{
"id": "native.apple.731e5fccde7cbc86",
"source": "Gateway %1$@, %2$@, %3$@",
"translated": "Gateway %1$@, %2$@, %3$@"
},
{
"id": "native.apple.ab0a315f69e3d5df",
"source": "Gateway %1$@, %2$@",
"translated": "Gateway %1$@, %2$@"
},
{
"id": "native.apple.01ad746119fbc27d",
"source": "Online",
"translated": "Online"
},
{
"id": "native.apple.e253ef19f6e53371",
"source": "Connecting",
"translated": "Łączenie"
},
{
"id": "native.apple.6f28b07ebdc2b25d",
"source": "Attention",
"translated": "Uwaga"
},
{
"id": "native.apple.1c931bcd1cd20334",
"source": "Offline",
"translated": "Offline"
},
{
"id": "native.apple.65602c216b89032d",
"source": "Channels / Integrations",
@@ -12988,6 +12948,16 @@
"source": "System follows this devices appearance setting.",
"translated": "System stosuje ustawienie wyglądu tego urządzenia."
},
{
"id": "native.apple.6d48137a8f6a5e96",
"source": "Sidebar Agents",
"translated": "Agenci na pasku bocznym"
},
{
"id": "native.apple.69cccbdee0bb0b56",
"source": "How many agents the sidebar lists before the switcher menu.",
"translated": "Liczba agentów wyświetlanych na pasku bocznym przed menu przełączania."
},
{
"id": "native.apple.70eca66c79335a6e",
"source": "Connection",
@@ -13389,9 +13359,9 @@
"translated": "Domyślnie"
},
{
"id": "native.apple.f4ae5664c3eda95d",
"source": "Used for new Chat threads and Talk sessions.",
"translated": "Używane w nowych wątkach czatu i sesjach rozmów."
"id": "native.apple.6805480889265026",
"source": "Used for new Chat and Talk sessions.",
"translated": "Używany w nowych sesjach czatu i rozmów."
},
{
"id": "native.apple.19552e71de246322",
@@ -15624,39 +15594,134 @@
"translated": "unknown relay error"
},
{
"id": "native.apple.c23d35de8d70863f",
"id": "native.apple.8855710a55de2ed5",
"source": "OpenClaw",
"translated": "OpenClaw"
},
{
"id": "native.apple.9e781c0183b79a76",
"source": "OpenClaw %@",
"translated": "OpenClaw %@"
"id": "native.apple.7029e1235380a92c",
"source": "Settings",
"translated": "Ustawienia"
},
{
"id": "native.apple.f4eea6473f43388d",
"id": "native.apple.7042a7d70a7e5a20",
"source": "Hide Sidebar",
"translated": "Ukryj pasek boczny"
},
{
"id": "native.apple.e779847164babc29",
"source": "Selected",
"translated": "Wybrano"
},
{
"id": "native.apple.698c71602b569378",
"source": "More Agents",
"translated": "Więcej agentów"
},
{
"id": "native.apple.94772cbd85c42e6e",
"source": "Search sessions",
"translated": "Search sessions"
},
{
"id": "native.apple.38e1e910f0958067",
"source": "Clear session search",
"translated": "Clear session search"
},
{
"id": "native.apple.58248484e54174e3",
"source": "Loading sessions",
"translated": "Loading sessions"
},
{
"id": "native.apple.dfb5cbd55893c4e5",
"source": "No recent sessions",
"translated": "No recent sessions"
},
{
"id": "native.apple.01a4c3f6192bb1a3",
"source": "Recent",
"translated": "Ostatnie"
},
{
"id": "native.apple.c0a4d120556df169",
"source": "All Sessions…",
"translated": "All Sessions…"
},
{
"id": "native.apple.aa7c4ecffd2ba36a",
"source": "Edit Pages",
"translated": "Edytuj strony"
},
{
"id": "native.apple.4d724d2e5731583d",
"source": "Home",
"translated": "Strona główna"
},
{
"id": "native.apple.3995f7f73d1ded5f",
"source": "Unread",
"translated": "Nieprzeczytane"
},
{
"id": "native.apple.b4567540cbcaf944",
"source": "Attention",
"translated": "Uwaga"
},
{
"id": "native.apple.14858678ae3f059f",
"source": "New Chat",
"translated": "Nowy czat"
},
{
"id": "native.apple.9d87aa7e7862a607",
"source": "Connection",
"translated": "Połączenie"
},
{
"id": "native.apple.7e7c47f471dd2c69",
"source": "Online",
"translated": "Online"
},
{
"id": "native.apple.9e2aea6088887f1f",
"id": "native.apple.02ff27780aad60aa",
"source": "Connecting",
"translated": "Łączenie"
},
{
"id": "native.apple.3624978c7d43335a",
"id": "native.apple.b2d0754aab434ea3",
"source": "Needs attention",
"translated": "Wymaga uwagi"
},
{
"id": "native.apple.7da053dd774cb201",
"id": "native.apple.342c72a01b0f4bb1",
"source": "Offline",
"translated": "Offline"
},
{
"id": "native.apple.a4256b2ab523ee60",
"source": "Chat",
"translated": "Czat"
"id": "native.apple.9fc7dfa0dccea003",
"source": "Pinned pages stay in the sidebar. Home is always shown.",
"translated": "Przypięte strony pozostają na pasku bocznym. Strona główna jest zawsze wyświetlana."
},
{
"id": "native.apple.4bfe6dc45811d50f",
"source": "Pages",
"translated": "Pages"
},
{
"id": "native.apple.422767686f219093",
"source": "Done",
"translated": "Gotowe"
},
{
"id": "native.apple.e197e8708ad3b2c8",
"source": "Pinned",
"translated": "Przypięte"
},
{
"id": "native.apple.098013d7dd8cdfc7",
"source": "Not pinned",
"translated": "Nieprzypięte"
},
{
"id": "native.apple.64d7dc062ef4cc81",
@@ -15693,46 +15758,21 @@
"source": "Automations",
"translated": "Automatyzacje"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "Pokaż pasek boczny"
},
{
"id": "native.apple.bb0ea6d61a32c7c2",
"source": "Back to %@",
"translated": "Wróć do %@"
},
{
"id": "native.apple.72fab75688479b3e",
"source": "Hide Sidebar",
"translated": "Ukryj pasek boczny"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "Pokaż pasek boczny"
},
{
"id": "native.apple.8af43f59602ec0d8",
"source": "Close canvas",
"translated": "Zamknij obszar roboczy"
},
{
"id": "native.apple.a1db6ce0aed1d18e",
"source": "Chat, voice active",
"translated": "Czat, głos włączony"
},
{
"id": "native.apple.bda6cfa988e49a75",
"source": "Control",
"translated": "Sterowanie"
},
{
"id": "native.apple.3c80f5351055a5f3",
"source": "Agent",
"translated": "Agent"
},
{
"id": "native.apple.22d107db5b905ef4",
"source": "Settings",
"translated": "Ustawienia"
},
{
"id": "native.apple.8a4751c86aa6fe77",
"source": "Gateway needs attention",
@@ -15794,9 +15834,9 @@
"translated": "Instancje"
},
{
"id": "native.apple.11fe8b9941954dfb",
"source": "Threads",
"translated": "Wątki"
"id": "native.apple.e3e3ce1a79ebbd70",
"source": "Sessions",
"translated": "Sesje"
},
{
"id": "native.apple.253cb2debeb51859",
+244 -204
View File
@@ -10869,9 +10869,9 @@
"translated": "Em que você gostaria de trabalhar?"
},
{
"id": "native.apple.4da775013ac9b123",
"source": "The thread attaches once the gateway is ready.",
"translated": "A conversa será anexada assim que o Gateway estiver pronto."
"id": "native.apple.ed7f703a8809b564",
"source": "The session attaches once the gateway is ready.",
"translated": "A sessão será conectada quando o gateway estiver pronto."
},
{
"id": "native.apple.02611ddddef7295a",
@@ -10919,9 +10919,9 @@
"translated": "Opções da nova sessão…"
},
{
"id": "native.apple.003b25ddafeb18e9",
"source": "Threads…",
"translated": "Conversas…"
"id": "native.apple.a1b0d289758e2213",
"source": "Sessions…",
"translated": "Sessões…"
},
{
"id": "native.apple.17c13312e7532c89",
@@ -11084,14 +11084,14 @@
"translated": "Criar"
},
{
"id": "native.apple.31d5c7287cfb3abe",
"source": "Delete Thread?",
"translated": "Excluir conversa?"
"id": "native.apple.e7382c53c7dd48f7",
"source": "Delete Session?",
"translated": "Excluir sessão?"
},
{
"id": "native.apple.d3395564809f1120",
"source": "Delete Thread",
"translated": "Excluir conversa"
"id": "native.apple.702fd8b48da56065",
"source": "Delete Session",
"translated": "Excluir sessão"
},
{
"id": "native.apple.9b1aed19568a048e",
@@ -11099,9 +11099,9 @@
"translated": "Cancelar"
},
{
"id": "native.apple.092659256d26cb03",
"source": "This permanently deletes the thread and its transcript.",
"translated": "Isso exclui permanentemente a conversa e sua transcrição."
"id": "native.apple.61f3f19ea24c6012",
"source": "This permanently deletes the session and its transcript.",
"translated": "Isso exclui permanentemente a sessão e sua transcrição."
},
{
"id": "native.apple.0965d8d2429c3b9f",
@@ -11129,9 +11129,9 @@
"translated": "Novo grupo"
},
{
"id": "native.apple.683032464c497bbd",
"source": "Rename Thread",
"translated": "Renomear conversa"
"id": "native.apple.cd368674179237a0",
"source": "Rename Session",
"translated": "Renomear sessão"
},
{
"id": "native.apple.31424500c53d6c32",
@@ -11139,15 +11139,55 @@
"translated": "Nome do grupo"
},
{
"id": "native.apple.f887aa956588f237",
"source": "Thread name",
"translated": "Nome da conversa"
"id": "native.apple.8b54306971cfa8c9",
"source": "Session name",
"translated": "Nome da sessão"
},
{
"id": "native.apple.e8018adcccaa2a4d",
"source": "View More",
"translated": "Ver mais"
},
{
"id": "native.apple.e3ef1aa93156bd67",
"source": "Live",
"translated": "Live"
},
{
"id": "native.apple.bdfc040fb974b4aa",
"source": "Unread",
"translated": "Não lida"
},
{
"id": "native.apple.6f94924c0a736fcf",
"source": "Tokens",
"translated": "Tokens"
},
{
"id": "native.apple.bec8b61a3a29b59a",
"source": "Opens Sessions",
"translated": "Abre Sessões"
},
{
"id": "native.apple.69279daa342241c1",
"source": "Pending approvals",
"translated": "Aprovações pendentes"
},
{
"id": "native.apple.48af1bbb4fd06321",
"source": "Automation issues",
"translated": "Automation issues"
},
{
"id": "native.apple.3e4f2dd3a0d41b97",
"source": "31-day usage",
"translated": "31-day usage"
},
{
"id": "native.apple.c334a60ae7b4d508",
"source": "Opens Usage",
"translated": "Opens Usage"
},
{
"id": "native.apple.65fb4d9ce6e5bbda",
"source": "Gateway settings",
@@ -11179,14 +11219,14 @@
"translated": "Agentes"
},
{
"id": "native.apple.7c8231b7b1ca480f",
"source": "Agent thread",
"translated": "Conversa do agente"
"id": "native.apple.789d5d0790fd18ca",
"source": "Agent session",
"translated": "Sessão do agente"
},
{
"id": "native.apple.b3c553614f762a58",
"source": "Recent threads",
"translated": "Conversas recentes"
"id": "native.apple.ee45dce4a2e44737",
"source": "Recent sessions",
"translated": "Sessões recentes"
},
{
"id": "native.apple.9161ca3c61de6cc7",
@@ -11194,9 +11234,9 @@
"translated": "Gateway offline"
},
{
"id": "native.apple.5aa32afda85064ea",
"source": "No recent threads",
"translated": "Nenhuma conversa recente"
"id": "native.apple.c97e0382e578a2f7",
"source": "No recent sessions",
"translated": "Nenhuma sessão recente"
},
{
"id": "native.apple.79937d7781fb65ae",
@@ -11253,6 +11293,11 @@
"source": "Direct chat",
"translated": "Chat direto"
},
{
"id": "native.apple.7a39e0991fa3cd53",
"source": "just now",
"translated": "just now"
},
{
"id": "native.apple.dbd48d25920f342b",
"source": "%@ on %@",
@@ -11294,14 +11339,14 @@
"translated": "Cancelar"
},
{
"id": "native.apple.b6855cf19a50f477",
"source": "Threads",
"translated": "Conversas"
"id": "native.apple.7a6511a467e34f69",
"source": "Sessions",
"translated": "Sessões"
},
{
"id": "native.apple.9b1d0ef27a1333b0",
"source": "Archived threads",
"translated": "Conversas arquivadas"
"id": "native.apple.e6b8913014b64f0a",
"source": "Archived sessions",
"translated": "Sessões arquivadas"
},
{
"id": "native.apple.bc8e64efb095a625",
@@ -11309,34 +11354,34 @@
"translated": "Mostrar arquivadas"
},
{
"id": "native.apple.98167401c7267735",
"source": "Threads unavailable",
"translated": "Conversas indisponíveis"
"id": "native.apple.119433782518f199",
"source": "Sessions unavailable",
"translated": "Sessões indisponíveis"
},
{
"id": "native.apple.4d28a7def2337b9f",
"source": "Loading archived threads",
"translated": "Carregando conversas arquivadas"
"id": "native.apple.9882fbadac3bea03",
"source": "Loading archived sessions",
"translated": "Carregando sessões arquivadas"
},
{
"id": "native.apple.777d7b706933bd7b",
"source": "Loading recent threads",
"translated": "Carregando conversas recentes"
"id": "native.apple.16dca1cfac8a571b",
"source": "Loading recent sessions",
"translated": "Carregando sessões recentes"
},
{
"id": "native.apple.22f81ea94bef8410",
"source": "^[\\(count) thread](inflect: true)",
"translated": "^[\\(count) conversa](inflect: true)"
"id": "native.apple.207dad20d09f3160",
"source": "^[\\(count) session](inflect: true)",
"translated": "^[\\(count) sessão](inflect: true)"
},
{
"id": "native.apple.1cad51e14db59bf9",
"source": "No archived threads",
"translated": "Nenhuma conversa arquivada"
"id": "native.apple.a0b4091bf77d4060",
"source": "No archived sessions",
"translated": "Nenhuma sessão arquivada"
},
{
"id": "native.apple.18ef832d3a7ddcf8",
"source": "Archived threads will appear here.",
"translated": "As conversas arquivadas aparecerão aqui."
"id": "native.apple.acfdf5c72e289736",
"source": "Archived sessions will appear here.",
"translated": "As sessões arquivadas aparecerão aqui."
},
{
"id": "native.apple.e8e8cea7ec44fe08",
@@ -11419,9 +11464,9 @@
"translated": "Compartilhar entrada"
},
{
"id": "native.apple.21d9208d86a4d1fe",
"source": "Loading threads",
"translated": "Carregando conversas"
"id": "native.apple.4c5b2ecf243cfbbc",
"source": "Loading sessions",
"translated": "Carregando sessões"
},
{
"id": "native.apple.48655128d0a34e44",
@@ -11429,19 +11474,19 @@
"translated": "Buscando atividade recente no gateway."
},
{
"id": "native.apple.4be1f79aa2b230ff",
"source": "Threads unavailable",
"translated": "Conversas indisponíveis"
"id": "native.apple.c4479934c65c973c",
"source": "Sessions unavailable",
"translated": "Sessões indisponíveis"
},
{
"id": "native.apple.98b348873556bc46",
"source": "No recent threads",
"translated": "Nenhuma conversa recente"
"id": "native.apple.6e67b64954ba3002",
"source": "No recent sessions",
"translated": "Nenhuma sessão recente"
},
{
"id": "native.apple.7396d205574d279f",
"source": "Thread activity offline",
"translated": "Atividade das conversas offline"
"id": "native.apple.5dce07848bec08b5",
"source": "Session activity offline",
"translated": "Atividade da sessão offline"
},
{
"id": "native.apple.e3586d8a603f67e0",
@@ -11899,9 +11944,9 @@
"translated": "Cartão"
},
{
"id": "native.apple.c9ec1b0e18074d8a",
"source": "Open Thread",
"translated": "Abrir conversa"
"id": "native.apple.3edbccb7c14b693c",
"source": "Open Session",
"translated": "Abrir sessão"
},
{
"id": "native.apple.a2732e4ff77a201b",
@@ -12103,91 +12148,6 @@
"source": "Offline",
"translated": "Offline"
},
{
"id": "native.apple.a2d8e7b4dba29764",
"source": "Control",
"translated": "Controle"
},
{
"id": "native.apple.597471e86dda3d38",
"source": "Opens Settings / Gateway",
"translated": "Abre Ajustes / Gateway"
},
{
"id": "native.apple.ed16c9793f468dcd",
"source": "Agent chat and recent work.",
"translated": "Chat do agente e trabalho recente."
},
{
"id": "native.apple.a03e961ab14ba060",
"source": "Overview",
"translated": "Visão geral"
},
{
"id": "native.apple.feb28c9cba676ba2",
"source": "Instances",
"translated": "Instâncias"
},
{
"id": "native.apple.3f2726ccd1acd987",
"source": "Files",
"translated": "Arquivos"
},
{
"id": "native.apple.614c9b40919fb103",
"source": "Dreaming",
"translated": "Sonhando"
},
{
"id": "native.apple.e2b5c2d7c5d461a3",
"source": "Usage",
"translated": "Uso"
},
{
"id": "native.apple.f21bf1e3b5ec896c",
"source": "Automations",
"translated": "Automações"
},
{
"id": "native.apple.57587fec1ca582ec",
"source": "Default Agent",
"translated": "Agente padrão"
},
{
"id": "native.apple.e0e99a802f07cc68",
"source": "Gateway",
"translated": "Gateway"
},
{
"id": "native.apple.731e5fccde7cbc86",
"source": "Gateway %1$@, %2$@, %3$@",
"translated": "Gateway %1$@, %2$@, %3$@"
},
{
"id": "native.apple.ab0a315f69e3d5df",
"source": "Gateway %1$@, %2$@",
"translated": "Gateway %1$@, %2$@"
},
{
"id": "native.apple.01ad746119fbc27d",
"source": "Online",
"translated": "Online"
},
{
"id": "native.apple.e253ef19f6e53371",
"source": "Connecting",
"translated": "Conectando"
},
{
"id": "native.apple.6f28b07ebdc2b25d",
"source": "Attention",
"translated": "Atenção"
},
{
"id": "native.apple.1c931bcd1cd20334",
"source": "Offline",
"translated": "Offline"
},
{
"id": "native.apple.65602c216b89032d",
"source": "Channels / Integrations",
@@ -12988,6 +12948,16 @@
"source": "System follows this devices appearance setting.",
"translated": "O sistema segue a configuração de aparência deste dispositivo."
},
{
"id": "native.apple.6d48137a8f6a5e96",
"source": "Sidebar Agents",
"translated": "Agentes da barra lateral"
},
{
"id": "native.apple.69cccbdee0bb0b56",
"source": "How many agents the sidebar lists before the switcher menu.",
"translated": "Quantos agentes a barra lateral lista antes do menu de seleção."
},
{
"id": "native.apple.70eca66c79335a6e",
"source": "Connection",
@@ -13389,9 +13359,9 @@
"translated": "Padrão"
},
{
"id": "native.apple.f4ae5664c3eda95d",
"source": "Used for new Chat threads and Talk sessions.",
"translated": "Usado para novas conversas de Chat e sessões de Talk."
"id": "native.apple.6805480889265026",
"source": "Used for new Chat and Talk sessions.",
"translated": "Usado para novas sessões de Chat e Talk."
},
{
"id": "native.apple.19552e71de246322",
@@ -15624,39 +15594,134 @@
"translated": "unknown relay error"
},
{
"id": "native.apple.c23d35de8d70863f",
"id": "native.apple.8855710a55de2ed5",
"source": "OpenClaw",
"translated": "OpenClaw"
},
{
"id": "native.apple.9e781c0183b79a76",
"source": "OpenClaw %@",
"translated": "OpenClaw %@"
"id": "native.apple.7029e1235380a92c",
"source": "Settings",
"translated": "Configurações"
},
{
"id": "native.apple.f4eea6473f43388d",
"id": "native.apple.7042a7d70a7e5a20",
"source": "Hide Sidebar",
"translated": "Ocultar barra lateral"
},
{
"id": "native.apple.e779847164babc29",
"source": "Selected",
"translated": "Selecionado"
},
{
"id": "native.apple.698c71602b569378",
"source": "More Agents",
"translated": "Mais agentes"
},
{
"id": "native.apple.94772cbd85c42e6e",
"source": "Search sessions",
"translated": "Search sessions"
},
{
"id": "native.apple.38e1e910f0958067",
"source": "Clear session search",
"translated": "Clear session search"
},
{
"id": "native.apple.58248484e54174e3",
"source": "Loading sessions",
"translated": "Loading sessions"
},
{
"id": "native.apple.dfb5cbd55893c4e5",
"source": "No recent sessions",
"translated": "No recent sessions"
},
{
"id": "native.apple.01a4c3f6192bb1a3",
"source": "Recent",
"translated": "Recentes"
},
{
"id": "native.apple.c0a4d120556df169",
"source": "All Sessions…",
"translated": "All Sessions…"
},
{
"id": "native.apple.aa7c4ecffd2ba36a",
"source": "Edit Pages",
"translated": "Editar páginas"
},
{
"id": "native.apple.4d724d2e5731583d",
"source": "Home",
"translated": "Início"
},
{
"id": "native.apple.3995f7f73d1ded5f",
"source": "Unread",
"translated": "Não lida"
},
{
"id": "native.apple.b4567540cbcaf944",
"source": "Attention",
"translated": "Atenção"
},
{
"id": "native.apple.14858678ae3f059f",
"source": "New Chat",
"translated": "Novo Chat"
},
{
"id": "native.apple.9d87aa7e7862a607",
"source": "Connection",
"translated": "Conexão"
},
{
"id": "native.apple.7e7c47f471dd2c69",
"source": "Online",
"translated": "Online"
"translated": "On-line"
},
{
"id": "native.apple.9e2aea6088887f1f",
"id": "native.apple.02ff27780aad60aa",
"source": "Connecting",
"translated": "Conectando"
},
{
"id": "native.apple.3624978c7d43335a",
"id": "native.apple.b2d0754aab434ea3",
"source": "Needs attention",
"translated": "Requer atenção"
"translated": "Precisa de atenção"
},
{
"id": "native.apple.7da053dd774cb201",
"id": "native.apple.342c72a01b0f4bb1",
"source": "Offline",
"translated": "Offline"
"translated": "Off-line"
},
{
"id": "native.apple.a4256b2ab523ee60",
"source": "Chat",
"translated": "Chat"
"id": "native.apple.9fc7dfa0dccea003",
"source": "Pinned pages stay in the sidebar. Home is always shown.",
"translated": "As páginas fixadas permanecem na barra lateral. A página inicial é sempre exibida."
},
{
"id": "native.apple.4bfe6dc45811d50f",
"source": "Pages",
"translated": "Pages"
},
{
"id": "native.apple.422767686f219093",
"source": "Done",
"translated": "Concluído"
},
{
"id": "native.apple.e197e8708ad3b2c8",
"source": "Pinned",
"translated": "Fixada"
},
{
"id": "native.apple.098013d7dd8cdfc7",
"source": "Not pinned",
"translated": "Não fixada"
},
{
"id": "native.apple.64d7dc062ef4cc81",
@@ -15693,46 +15758,21 @@
"source": "Automations",
"translated": "Automações"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "Mostrar barra lateral"
},
{
"id": "native.apple.bb0ea6d61a32c7c2",
"source": "Back to %@",
"translated": "Voltar para %@"
},
{
"id": "native.apple.72fab75688479b3e",
"source": "Hide Sidebar",
"translated": "Ocultar barra lateral"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "Mostrar barra lateral"
},
{
"id": "native.apple.8af43f59602ec0d8",
"source": "Close canvas",
"translated": "Fechar tela"
},
{
"id": "native.apple.a1db6ce0aed1d18e",
"source": "Chat, voice active",
"translated": "Chat, voz ativa"
},
{
"id": "native.apple.bda6cfa988e49a75",
"source": "Control",
"translated": "Controle"
},
{
"id": "native.apple.3c80f5351055a5f3",
"source": "Agent",
"translated": "Agente"
},
{
"id": "native.apple.22d107db5b905ef4",
"source": "Settings",
"translated": "Configurações"
},
{
"id": "native.apple.8a4751c86aa6fe77",
"source": "Gateway needs attention",
@@ -15794,9 +15834,9 @@
"translated": "Instâncias"
},
{
"id": "native.apple.11fe8b9941954dfb",
"source": "Threads",
"translated": "Conversas"
"id": "native.apple.e3e3ce1a79ebbd70",
"source": "Sessions",
"translated": "Sessões"
},
{
"id": "native.apple.253cb2debeb51859",
+241 -201
View File
@@ -10869,9 +10869,9 @@
"translated": "Над чем вы хотите поработать?"
},
{
"id": "native.apple.4da775013ac9b123",
"source": "The thread attaches once the gateway is ready.",
"translated": "Ветка подключится, когда Gateway будет готов."
"id": "native.apple.ed7f703a8809b564",
"source": "The session attaches once the gateway is ready.",
"translated": "Сеанс подключится, когда Gateway будет готов."
},
{
"id": "native.apple.02611ddddef7295a",
@@ -10919,9 +10919,9 @@
"translated": "Параметры нового сеанса…"
},
{
"id": "native.apple.003b25ddafeb18e9",
"source": "Threads…",
"translated": "Ветки…"
"id": "native.apple.a1b0d289758e2213",
"source": "Sessions…",
"translated": "Сеансы…"
},
{
"id": "native.apple.17c13312e7532c89",
@@ -11084,14 +11084,14 @@
"translated": "Создать"
},
{
"id": "native.apple.31d5c7287cfb3abe",
"source": "Delete Thread?",
"translated": "Удалить ветку?"
"id": "native.apple.e7382c53c7dd48f7",
"source": "Delete Session?",
"translated": "Удалить сеанс?"
},
{
"id": "native.apple.d3395564809f1120",
"source": "Delete Thread",
"translated": "Удалить ветку"
"id": "native.apple.702fd8b48da56065",
"source": "Delete Session",
"translated": "Удалить сеанс"
},
{
"id": "native.apple.9b1aed19568a048e",
@@ -11099,9 +11099,9 @@
"translated": "Отмена"
},
{
"id": "native.apple.092659256d26cb03",
"source": "This permanently deletes the thread and its transcript.",
"translated": "Это действие безвозвратно удалит ветку и её расшифровку."
"id": "native.apple.61f3f19ea24c6012",
"source": "This permanently deletes the session and its transcript.",
"translated": "Сеанс и его расшифровка будут удалены без возможности восстановления."
},
{
"id": "native.apple.0965d8d2429c3b9f",
@@ -11129,9 +11129,9 @@
"translated": "Новая группа"
},
{
"id": "native.apple.683032464c497bbd",
"source": "Rename Thread",
"translated": "Переименовать ветку"
"id": "native.apple.cd368674179237a0",
"source": "Rename Session",
"translated": "Переименовать сеанс"
},
{
"id": "native.apple.31424500c53d6c32",
@@ -11139,15 +11139,55 @@
"translated": "Название группы"
},
{
"id": "native.apple.f887aa956588f237",
"source": "Thread name",
"translated": "Название ветки"
"id": "native.apple.8b54306971cfa8c9",
"source": "Session name",
"translated": "Название сеанса"
},
{
"id": "native.apple.e8018adcccaa2a4d",
"source": "View More",
"translated": "Показать еще"
},
{
"id": "native.apple.e3ef1aa93156bd67",
"source": "Live",
"translated": "Live"
},
{
"id": "native.apple.bdfc040fb974b4aa",
"source": "Unread",
"translated": "Непрочитанное"
},
{
"id": "native.apple.6f94924c0a736fcf",
"source": "Tokens",
"translated": "Токены"
},
{
"id": "native.apple.bec8b61a3a29b59a",
"source": "Opens Sessions",
"translated": "Открывает раздел «Сеансы»"
},
{
"id": "native.apple.69279daa342241c1",
"source": "Pending approvals",
"translated": "Ожидающие подтверждения"
},
{
"id": "native.apple.48af1bbb4fd06321",
"source": "Automation issues",
"translated": "Automation issues"
},
{
"id": "native.apple.3e4f2dd3a0d41b97",
"source": "31-day usage",
"translated": "31-day usage"
},
{
"id": "native.apple.c334a60ae7b4d508",
"source": "Opens Usage",
"translated": "Opens Usage"
},
{
"id": "native.apple.65fb4d9ce6e5bbda",
"source": "Gateway settings",
@@ -11179,14 +11219,14 @@
"translated": "Агенты"
},
{
"id": "native.apple.7c8231b7b1ca480f",
"source": "Agent thread",
"translated": "Ветка агента"
"id": "native.apple.789d5d0790fd18ca",
"source": "Agent session",
"translated": "Сеанс агента"
},
{
"id": "native.apple.b3c553614f762a58",
"source": "Recent threads",
"translated": "Недавние ветки"
"id": "native.apple.ee45dce4a2e44737",
"source": "Recent sessions",
"translated": "Недавние сеансы"
},
{
"id": "native.apple.9161ca3c61de6cc7",
@@ -11194,9 +11234,9 @@
"translated": "Gateway офлайн"
},
{
"id": "native.apple.5aa32afda85064ea",
"source": "No recent threads",
"translated": "Нет недавних веток"
"id": "native.apple.c97e0382e578a2f7",
"source": "No recent sessions",
"translated": "Нет недавних сеансов"
},
{
"id": "native.apple.79937d7781fb65ae",
@@ -11253,6 +11293,11 @@
"source": "Direct chat",
"translated": "Личный чат"
},
{
"id": "native.apple.7a39e0991fa3cd53",
"source": "just now",
"translated": "just now"
},
{
"id": "native.apple.dbd48d25920f342b",
"source": "%@ on %@",
@@ -11294,14 +11339,14 @@
"translated": "Отмена"
},
{
"id": "native.apple.b6855cf19a50f477",
"source": "Threads",
"translated": "Ветки"
"id": "native.apple.7a6511a467e34f69",
"source": "Sessions",
"translated": "Сеансы"
},
{
"id": "native.apple.9b1d0ef27a1333b0",
"source": "Archived threads",
"translated": "Архивные ветки"
"id": "native.apple.e6b8913014b64f0a",
"source": "Archived sessions",
"translated": "Архивные сеансы"
},
{
"id": "native.apple.bc8e64efb095a625",
@@ -11309,34 +11354,34 @@
"translated": "Показать архив"
},
{
"id": "native.apple.98167401c7267735",
"source": "Threads unavailable",
"translated": "Ветки недоступны"
"id": "native.apple.119433782518f199",
"source": "Sessions unavailable",
"translated": "Сеансы недоступны"
},
{
"id": "native.apple.4d28a7def2337b9f",
"source": "Loading archived threads",
"translated": "Загрузка архивных веток"
"id": "native.apple.9882fbadac3bea03",
"source": "Loading archived sessions",
"translated": "Загрузка архивных сеансов"
},
{
"id": "native.apple.777d7b706933bd7b",
"source": "Loading recent threads",
"translated": "Загрузка недавних веток"
"id": "native.apple.16dca1cfac8a571b",
"source": "Loading recent sessions",
"translated": "Загрузка недавних сеансов"
},
{
"id": "native.apple.22f81ea94bef8410",
"source": "^[\\(count) thread](inflect: true)",
"translated": "^[\\(count) ветка](inflect: true)"
"id": "native.apple.207dad20d09f3160",
"source": "^[\\(count) session](inflect: true)",
"translated": "^[\\(count) сеанс](inflect: true)"
},
{
"id": "native.apple.1cad51e14db59bf9",
"source": "No archived threads",
"translated": "Нет архивных веток"
"id": "native.apple.a0b4091bf77d4060",
"source": "No archived sessions",
"translated": "Нет архивных сеансов"
},
{
"id": "native.apple.18ef832d3a7ddcf8",
"source": "Archived threads will appear here.",
"translated": "Архивные ветки появятся здесь."
"id": "native.apple.acfdf5c72e289736",
"source": "Archived sessions will appear here.",
"translated": "Архивные сеансы появятся здесь."
},
{
"id": "native.apple.e8e8cea7ec44fe08",
@@ -11419,9 +11464,9 @@
"translated": "Поделиться приемом"
},
{
"id": "native.apple.21d9208d86a4d1fe",
"source": "Loading threads",
"translated": "Загрузка веток"
"id": "native.apple.4c5b2ecf243cfbbc",
"source": "Loading sessions",
"translated": "Загрузка сеансов"
},
{
"id": "native.apple.48655128d0a34e44",
@@ -11429,19 +11474,19 @@
"translated": "Получение недавней активности из Gateway."
},
{
"id": "native.apple.4be1f79aa2b230ff",
"source": "Threads unavailable",
"translated": "Ветки недоступны"
"id": "native.apple.c4479934c65c973c",
"source": "Sessions unavailable",
"translated": "Сеансы недоступны"
},
{
"id": "native.apple.98b348873556bc46",
"source": "No recent threads",
"translated": "Нет недавних веток"
"id": "native.apple.6e67b64954ba3002",
"source": "No recent sessions",
"translated": "Нет недавних сеансов"
},
{
"id": "native.apple.7396d205574d279f",
"source": "Thread activity offline",
"translated": "Активность ветки недоступна офлайн"
"id": "native.apple.5dce07848bec08b5",
"source": "Session activity offline",
"translated": "Активность сеансов недоступна"
},
{
"id": "native.apple.e3586d8a603f67e0",
@@ -11899,9 +11944,9 @@
"translated": "Карточка"
},
{
"id": "native.apple.c9ec1b0e18074d8a",
"source": "Open Thread",
"translated": "Открыть ветку"
"id": "native.apple.3edbccb7c14b693c",
"source": "Open Session",
"translated": "Открыть сеанс"
},
{
"id": "native.apple.a2732e4ff77a201b",
@@ -12103,91 +12148,6 @@
"source": "Offline",
"translated": "Не в сети"
},
{
"id": "native.apple.a2d8e7b4dba29764",
"source": "Control",
"translated": "Управление"
},
{
"id": "native.apple.597471e86dda3d38",
"source": "Opens Settings / Gateway",
"translated": "Открывает Настройки / Gateway"
},
{
"id": "native.apple.ed16c9793f468dcd",
"source": "Agent chat and recent work.",
"translated": "Чат с агентом и недавняя работа."
},
{
"id": "native.apple.a03e961ab14ba060",
"source": "Overview",
"translated": "Обзор"
},
{
"id": "native.apple.feb28c9cba676ba2",
"source": "Instances",
"translated": "Экземпляры"
},
{
"id": "native.apple.3f2726ccd1acd987",
"source": "Files",
"translated": "Файлы"
},
{
"id": "native.apple.614c9b40919fb103",
"source": "Dreaming",
"translated": "Сновидение"
},
{
"id": "native.apple.e2b5c2d7c5d461a3",
"source": "Usage",
"translated": "Использование"
},
{
"id": "native.apple.f21bf1e3b5ec896c",
"source": "Automations",
"translated": "Автоматизации"
},
{
"id": "native.apple.57587fec1ca582ec",
"source": "Default Agent",
"translated": "Агент по умолчанию"
},
{
"id": "native.apple.e0e99a802f07cc68",
"source": "Gateway",
"translated": "Gateway"
},
{
"id": "native.apple.731e5fccde7cbc86",
"source": "Gateway %1$@, %2$@, %3$@",
"translated": "Gateway %1$@, %2$@, %3$@"
},
{
"id": "native.apple.ab0a315f69e3d5df",
"source": "Gateway %1$@, %2$@",
"translated": "Gateway %1$@, %2$@"
},
{
"id": "native.apple.01ad746119fbc27d",
"source": "Online",
"translated": "В сети"
},
{
"id": "native.apple.e253ef19f6e53371",
"source": "Connecting",
"translated": "Подключение"
},
{
"id": "native.apple.6f28b07ebdc2b25d",
"source": "Attention",
"translated": "Внимание"
},
{
"id": "native.apple.1c931bcd1cd20334",
"source": "Offline",
"translated": "Не в сети"
},
{
"id": "native.apple.65602c216b89032d",
"source": "Channels / Integrations",
@@ -12988,6 +12948,16 @@
"source": "System follows this devices appearance setting.",
"translated": "Система следует настройке оформления этого устройства."
},
{
"id": "native.apple.6d48137a8f6a5e96",
"source": "Sidebar Agents",
"translated": "Агенты на боковой панели"
},
{
"id": "native.apple.69cccbdee0bb0b56",
"source": "How many agents the sidebar lists before the switcher menu.",
"translated": "Количество агентов, отображаемых на боковой панели перед меню переключения."
},
{
"id": "native.apple.70eca66c79335a6e",
"source": "Connection",
@@ -13389,9 +13359,9 @@
"translated": "По умолчанию"
},
{
"id": "native.apple.f4ae5664c3eda95d",
"source": "Used for new Chat threads and Talk sessions.",
"translated": "Используется для новых веток чата и сеансов разговора."
"id": "native.apple.6805480889265026",
"source": "Used for new Chat and Talk sessions.",
"translated": "Используется для новых сеансов чата и разговора."
},
{
"id": "native.apple.19552e71de246322",
@@ -15624,39 +15594,134 @@
"translated": "unknown relay error"
},
{
"id": "native.apple.c23d35de8d70863f",
"id": "native.apple.8855710a55de2ed5",
"source": "OpenClaw",
"translated": "OpenClaw"
},
{
"id": "native.apple.9e781c0183b79a76",
"source": "OpenClaw %@",
"translated": "OpenClaw %@"
"id": "native.apple.7029e1235380a92c",
"source": "Settings",
"translated": "Настройки"
},
{
"id": "native.apple.f4eea6473f43388d",
"id": "native.apple.7042a7d70a7e5a20",
"source": "Hide Sidebar",
"translated": "Скрыть боковую панель"
},
{
"id": "native.apple.e779847164babc29",
"source": "Selected",
"translated": "Выбрано"
},
{
"id": "native.apple.698c71602b569378",
"source": "More Agents",
"translated": "Другие агенты"
},
{
"id": "native.apple.94772cbd85c42e6e",
"source": "Search sessions",
"translated": "Search sessions"
},
{
"id": "native.apple.38e1e910f0958067",
"source": "Clear session search",
"translated": "Clear session search"
},
{
"id": "native.apple.58248484e54174e3",
"source": "Loading sessions",
"translated": "Loading sessions"
},
{
"id": "native.apple.dfb5cbd55893c4e5",
"source": "No recent sessions",
"translated": "No recent sessions"
},
{
"id": "native.apple.01a4c3f6192bb1a3",
"source": "Recent",
"translated": "Недавние"
},
{
"id": "native.apple.c0a4d120556df169",
"source": "All Sessions…",
"translated": "All Sessions…"
},
{
"id": "native.apple.aa7c4ecffd2ba36a",
"source": "Edit Pages",
"translated": "Изменить страницы"
},
{
"id": "native.apple.4d724d2e5731583d",
"source": "Home",
"translated": "Главная"
},
{
"id": "native.apple.3995f7f73d1ded5f",
"source": "Unread",
"translated": "Непрочитанное"
},
{
"id": "native.apple.b4567540cbcaf944",
"source": "Attention",
"translated": "Требует внимания"
},
{
"id": "native.apple.14858678ae3f059f",
"source": "New Chat",
"translated": "Новый чат"
},
{
"id": "native.apple.9d87aa7e7862a607",
"source": "Connection",
"translated": "Подключение"
},
{
"id": "native.apple.7e7c47f471dd2c69",
"source": "Online",
"translated": "В сети"
},
{
"id": "native.apple.9e2aea6088887f1f",
"id": "native.apple.02ff27780aad60aa",
"source": "Connecting",
"translated": "Подключение"
},
{
"id": "native.apple.3624978c7d43335a",
"id": "native.apple.b2d0754aab434ea3",
"source": "Needs attention",
"translated": "Требует внимания"
},
{
"id": "native.apple.7da053dd774cb201",
"id": "native.apple.342c72a01b0f4bb1",
"source": "Offline",
"translated": "Не в сети"
},
{
"id": "native.apple.a4256b2ab523ee60",
"source": "Chat",
"translated": "Чат"
"id": "native.apple.9fc7dfa0dccea003",
"source": "Pinned pages stay in the sidebar. Home is always shown.",
"translated": "Закреплённые страницы остаются на боковой панели. Главная отображается всегда."
},
{
"id": "native.apple.4bfe6dc45811d50f",
"source": "Pages",
"translated": "Pages"
},
{
"id": "native.apple.422767686f219093",
"source": "Done",
"translated": "Готово"
},
{
"id": "native.apple.e197e8708ad3b2c8",
"source": "Pinned",
"translated": "Закреплено"
},
{
"id": "native.apple.098013d7dd8cdfc7",
"source": "Not pinned",
"translated": "Не закреплено"
},
{
"id": "native.apple.64d7dc062ef4cc81",
@@ -15693,46 +15758,21 @@
"source": "Automations",
"translated": "Автоматизации"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "Показать боковую панель"
},
{
"id": "native.apple.bb0ea6d61a32c7c2",
"source": "Back to %@",
"translated": "Назад к %@"
},
{
"id": "native.apple.72fab75688479b3e",
"source": "Hide Sidebar",
"translated": "Скрыть боковую панель"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "Показать боковую панель"
},
{
"id": "native.apple.8af43f59602ec0d8",
"source": "Close canvas",
"translated": "Закрыть холст"
},
{
"id": "native.apple.a1db6ce0aed1d18e",
"source": "Chat, voice active",
"translated": "Чат, голос включён"
},
{
"id": "native.apple.bda6cfa988e49a75",
"source": "Control",
"translated": "Управление"
},
{
"id": "native.apple.3c80f5351055a5f3",
"source": "Agent",
"translated": "Агент"
},
{
"id": "native.apple.22d107db5b905ef4",
"source": "Settings",
"translated": "Настройки"
},
{
"id": "native.apple.8a4751c86aa6fe77",
"source": "Gateway needs attention",
@@ -15794,9 +15834,9 @@
"translated": "Экземпляры"
},
{
"id": "native.apple.11fe8b9941954dfb",
"source": "Threads",
"translated": "Ветки"
"id": "native.apple.e3e3ce1a79ebbd70",
"source": "Sessions",
"translated": "Сеансы"
},
{
"id": "native.apple.253cb2debeb51859",
+242 -202
View File
@@ -10869,9 +10869,9 @@
"translated": "Vad vill du arbeta med?"
},
{
"id": "native.apple.4da775013ac9b123",
"source": "The thread attaches once the gateway is ready.",
"translated": "Tråden ansluts när Gateway är redo."
"id": "native.apple.ed7f703a8809b564",
"source": "The session attaches once the gateway is ready.",
"translated": "Sessionen ansluts när Gateway är redo."
},
{
"id": "native.apple.02611ddddef7295a",
@@ -10919,9 +10919,9 @@
"translated": "Alternativ för ny session…"
},
{
"id": "native.apple.003b25ddafeb18e9",
"source": "Threads…",
"translated": "Trådar…"
"id": "native.apple.a1b0d289758e2213",
"source": "Sessions…",
"translated": "Sessioner…"
},
{
"id": "native.apple.17c13312e7532c89",
@@ -11084,14 +11084,14 @@
"translated": "Skapa"
},
{
"id": "native.apple.31d5c7287cfb3abe",
"source": "Delete Thread?",
"translated": "Ta bort tråden?"
"id": "native.apple.e7382c53c7dd48f7",
"source": "Delete Session?",
"translated": "Radera sessionen?"
},
{
"id": "native.apple.d3395564809f1120",
"source": "Delete Thread",
"translated": "Radera tråd"
"id": "native.apple.702fd8b48da56065",
"source": "Delete Session",
"translated": "Radera session"
},
{
"id": "native.apple.9b1aed19568a048e",
@@ -11099,9 +11099,9 @@
"translated": "Avbryt"
},
{
"id": "native.apple.092659256d26cb03",
"source": "This permanently deletes the thread and its transcript.",
"translated": "Detta raderar tråden och dess transkription permanent."
"id": "native.apple.61f3f19ea24c6012",
"source": "This permanently deletes the session and its transcript.",
"translated": "Detta raderar sessionen och dess transkription permanent."
},
{
"id": "native.apple.0965d8d2429c3b9f",
@@ -11129,9 +11129,9 @@
"translated": "Ny grupp"
},
{
"id": "native.apple.683032464c497bbd",
"source": "Rename Thread",
"translated": "Byt namn på tråd"
"id": "native.apple.cd368674179237a0",
"source": "Rename Session",
"translated": "Byt namn på session"
},
{
"id": "native.apple.31424500c53d6c32",
@@ -11139,15 +11139,55 @@
"translated": "Gruppnamn"
},
{
"id": "native.apple.f887aa956588f237",
"source": "Thread name",
"translated": "Trådnamn"
"id": "native.apple.8b54306971cfa8c9",
"source": "Session name",
"translated": "Sessionsnamn"
},
{
"id": "native.apple.e8018adcccaa2a4d",
"source": "View More",
"translated": "Visa mer"
},
{
"id": "native.apple.e3ef1aa93156bd67",
"source": "Live",
"translated": "Live"
},
{
"id": "native.apple.bdfc040fb974b4aa",
"source": "Unread",
"translated": "Oläst"
},
{
"id": "native.apple.6f94924c0a736fcf",
"source": "Tokens",
"translated": "Tokens"
},
{
"id": "native.apple.bec8b61a3a29b59a",
"source": "Opens Sessions",
"translated": "Öppnar Sessioner"
},
{
"id": "native.apple.69279daa342241c1",
"source": "Pending approvals",
"translated": "Väntande godkännanden"
},
{
"id": "native.apple.48af1bbb4fd06321",
"source": "Automation issues",
"translated": "Automation issues"
},
{
"id": "native.apple.3e4f2dd3a0d41b97",
"source": "31-day usage",
"translated": "31-day usage"
},
{
"id": "native.apple.c334a60ae7b4d508",
"source": "Opens Usage",
"translated": "Opens Usage"
},
{
"id": "native.apple.65fb4d9ce6e5bbda",
"source": "Gateway settings",
@@ -11179,14 +11219,14 @@
"translated": "Agenter"
},
{
"id": "native.apple.7c8231b7b1ca480f",
"source": "Agent thread",
"translated": "Agenttråd"
"id": "native.apple.789d5d0790fd18ca",
"source": "Agent session",
"translated": "Agentsession"
},
{
"id": "native.apple.b3c553614f762a58",
"source": "Recent threads",
"translated": "Senaste trådarna"
"id": "native.apple.ee45dce4a2e44737",
"source": "Recent sessions",
"translated": "Senaste sessioner"
},
{
"id": "native.apple.9161ca3c61de6cc7",
@@ -11194,9 +11234,9 @@
"translated": "Gateway offline"
},
{
"id": "native.apple.5aa32afda85064ea",
"source": "No recent threads",
"translated": "Inga senaste trådar"
"id": "native.apple.c97e0382e578a2f7",
"source": "No recent sessions",
"translated": "Inga senaste sessioner"
},
{
"id": "native.apple.79937d7781fb65ae",
@@ -11253,6 +11293,11 @@
"source": "Direct chat",
"translated": "Direktchatt"
},
{
"id": "native.apple.7a39e0991fa3cd53",
"source": "just now",
"translated": "just now"
},
{
"id": "native.apple.dbd48d25920f342b",
"source": "%@ on %@",
@@ -11294,14 +11339,14 @@
"translated": "Avbryt"
},
{
"id": "native.apple.b6855cf19a50f477",
"source": "Threads",
"translated": "Trådar"
"id": "native.apple.7a6511a467e34f69",
"source": "Sessions",
"translated": "Sessioner"
},
{
"id": "native.apple.9b1d0ef27a1333b0",
"source": "Archived threads",
"translated": "Arkiverade trådar"
"id": "native.apple.e6b8913014b64f0a",
"source": "Archived sessions",
"translated": "Arkiverade sessioner"
},
{
"id": "native.apple.bc8e64efb095a625",
@@ -11309,34 +11354,34 @@
"translated": "Visa arkiverade"
},
{
"id": "native.apple.98167401c7267735",
"source": "Threads unavailable",
"translated": "Trådarna är inte tillgängliga"
"id": "native.apple.119433782518f199",
"source": "Sessions unavailable",
"translated": "Sessioner är inte tillgängliga"
},
{
"id": "native.apple.4d28a7def2337b9f",
"source": "Loading archived threads",
"translated": "Läser in arkiverade trådar"
"id": "native.apple.9882fbadac3bea03",
"source": "Loading archived sessions",
"translated": "Läser in arkiverade sessioner"
},
{
"id": "native.apple.777d7b706933bd7b",
"source": "Loading recent threads",
"translated": "Läser in senaste trådarna"
"id": "native.apple.16dca1cfac8a571b",
"source": "Loading recent sessions",
"translated": "Läser in senaste sessioner"
},
{
"id": "native.apple.22f81ea94bef8410",
"source": "^[\\(count) thread](inflect: true)",
"translated": "^[\\(count) tråd](inflect: true)"
"id": "native.apple.207dad20d09f3160",
"source": "^[\\(count) session](inflect: true)",
"translated": "^[\\(count) session](inflect: true)"
},
{
"id": "native.apple.1cad51e14db59bf9",
"source": "No archived threads",
"translated": "Inga arkiverade trådar"
"id": "native.apple.a0b4091bf77d4060",
"source": "No archived sessions",
"translated": "Inga arkiverade sessioner"
},
{
"id": "native.apple.18ef832d3a7ddcf8",
"source": "Archived threads will appear here.",
"translated": "Arkiverade trådar visas här."
"id": "native.apple.acfdf5c72e289736",
"source": "Archived sessions will appear here.",
"translated": "Arkiverade sessioner visas här."
},
{
"id": "native.apple.e8e8cea7ec44fe08",
@@ -11419,9 +11464,9 @@
"translated": "Dela intag"
},
{
"id": "native.apple.21d9208d86a4d1fe",
"source": "Loading threads",
"translated": "Läser in trådar"
"id": "native.apple.4c5b2ecf243cfbbc",
"source": "Loading sessions",
"translated": "Läser in sessioner"
},
{
"id": "native.apple.48655128d0a34e44",
@@ -11429,19 +11474,19 @@
"translated": "Hämtar senaste aktivitet från gatewayen."
},
{
"id": "native.apple.4be1f79aa2b230ff",
"source": "Threads unavailable",
"translated": "Trådarna är inte tillgängliga"
"id": "native.apple.c4479934c65c973c",
"source": "Sessions unavailable",
"translated": "Sessioner är inte tillgängliga"
},
{
"id": "native.apple.98b348873556bc46",
"source": "No recent threads",
"translated": "Inga senaste trådar"
"id": "native.apple.6e67b64954ba3002",
"source": "No recent sessions",
"translated": "Inga senaste sessioner"
},
{
"id": "native.apple.7396d205574d279f",
"source": "Thread activity offline",
"translated": "Trådaktiviteten är offline"
"id": "native.apple.5dce07848bec08b5",
"source": "Session activity offline",
"translated": "Sessionsaktiviteten är offline"
},
{
"id": "native.apple.e3586d8a603f67e0",
@@ -11899,9 +11944,9 @@
"translated": "Kort"
},
{
"id": "native.apple.c9ec1b0e18074d8a",
"source": "Open Thread",
"translated": "Öppna tråd"
"id": "native.apple.3edbccb7c14b693c",
"source": "Open Session",
"translated": "Öppna session"
},
{
"id": "native.apple.a2732e4ff77a201b",
@@ -12103,91 +12148,6 @@
"source": "Offline",
"translated": "Offline"
},
{
"id": "native.apple.a2d8e7b4dba29764",
"source": "Control",
"translated": "Kontroll"
},
{
"id": "native.apple.597471e86dda3d38",
"source": "Opens Settings / Gateway",
"translated": "Öppnar Inställningar / Gateway"
},
{
"id": "native.apple.ed16c9793f468dcd",
"source": "Agent chat and recent work.",
"translated": "Agentchatt och senaste arbete."
},
{
"id": "native.apple.a03e961ab14ba060",
"source": "Overview",
"translated": "Översikt"
},
{
"id": "native.apple.feb28c9cba676ba2",
"source": "Instances",
"translated": "Instanser"
},
{
"id": "native.apple.3f2726ccd1acd987",
"source": "Files",
"translated": "Filer"
},
{
"id": "native.apple.614c9b40919fb103",
"source": "Dreaming",
"translated": "Drömmer"
},
{
"id": "native.apple.e2b5c2d7c5d461a3",
"source": "Usage",
"translated": "Användning"
},
{
"id": "native.apple.f21bf1e3b5ec896c",
"source": "Automations",
"translated": "Automatiseringar"
},
{
"id": "native.apple.57587fec1ca582ec",
"source": "Default Agent",
"translated": "Standardagent"
},
{
"id": "native.apple.e0e99a802f07cc68",
"source": "Gateway",
"translated": "Gateway"
},
{
"id": "native.apple.731e5fccde7cbc86",
"source": "Gateway %1$@, %2$@, %3$@",
"translated": "Gateway %1$@, %2$@, %3$@"
},
{
"id": "native.apple.ab0a315f69e3d5df",
"source": "Gateway %1$@, %2$@",
"translated": "Gateway %1$@, %2$@"
},
{
"id": "native.apple.01ad746119fbc27d",
"source": "Online",
"translated": "Online"
},
{
"id": "native.apple.e253ef19f6e53371",
"source": "Connecting",
"translated": "Ansluter"
},
{
"id": "native.apple.6f28b07ebdc2b25d",
"source": "Attention",
"translated": "Observera"
},
{
"id": "native.apple.1c931bcd1cd20334",
"source": "Offline",
"translated": "Offline"
},
{
"id": "native.apple.65602c216b89032d",
"source": "Channels / Integrations",
@@ -12988,6 +12948,16 @@
"source": "System follows this devices appearance setting.",
"translated": "Systemet följer den här enhetens utseendeinställning."
},
{
"id": "native.apple.6d48137a8f6a5e96",
"source": "Sidebar Agents",
"translated": "Agenter i sidofältet"
},
{
"id": "native.apple.69cccbdee0bb0b56",
"source": "How many agents the sidebar lists before the switcher menu.",
"translated": "Hur många agenter som visas i sidofältet före växlingsmenyn."
},
{
"id": "native.apple.70eca66c79335a6e",
"source": "Connection",
@@ -13389,9 +13359,9 @@
"translated": "Standard"
},
{
"id": "native.apple.f4ae5664c3eda95d",
"source": "Used for new Chat threads and Talk sessions.",
"translated": "Används för nya chatttrådar och samtalssessioner."
"id": "native.apple.6805480889265026",
"source": "Used for new Chat and Talk sessions.",
"translated": "Används för nya chatt- och samtalssessioner."
},
{
"id": "native.apple.19552e71de246322",
@@ -15624,39 +15594,134 @@
"translated": "unknown relay error"
},
{
"id": "native.apple.c23d35de8d70863f",
"id": "native.apple.8855710a55de2ed5",
"source": "OpenClaw",
"translated": "OpenClaw"
},
{
"id": "native.apple.9e781c0183b79a76",
"source": "OpenClaw %@",
"translated": "OpenClaw %@"
"id": "native.apple.7029e1235380a92c",
"source": "Settings",
"translated": "Inställningar"
},
{
"id": "native.apple.f4eea6473f43388d",
"id": "native.apple.7042a7d70a7e5a20",
"source": "Hide Sidebar",
"translated": "Dölj sidofält"
},
{
"id": "native.apple.e779847164babc29",
"source": "Selected",
"translated": "Vald"
},
{
"id": "native.apple.698c71602b569378",
"source": "More Agents",
"translated": "Fler agenter"
},
{
"id": "native.apple.94772cbd85c42e6e",
"source": "Search sessions",
"translated": "Search sessions"
},
{
"id": "native.apple.38e1e910f0958067",
"source": "Clear session search",
"translated": "Clear session search"
},
{
"id": "native.apple.58248484e54174e3",
"source": "Loading sessions",
"translated": "Loading sessions"
},
{
"id": "native.apple.dfb5cbd55893c4e5",
"source": "No recent sessions",
"translated": "No recent sessions"
},
{
"id": "native.apple.01a4c3f6192bb1a3",
"source": "Recent",
"translated": "Senaste"
},
{
"id": "native.apple.c0a4d120556df169",
"source": "All Sessions…",
"translated": "All Sessions…"
},
{
"id": "native.apple.aa7c4ecffd2ba36a",
"source": "Edit Pages",
"translated": "Redigera sidor"
},
{
"id": "native.apple.4d724d2e5731583d",
"source": "Home",
"translated": "Hem"
},
{
"id": "native.apple.3995f7f73d1ded5f",
"source": "Unread",
"translated": "Oläst"
},
{
"id": "native.apple.b4567540cbcaf944",
"source": "Attention",
"translated": "Åtgärd krävs"
},
{
"id": "native.apple.14858678ae3f059f",
"source": "New Chat",
"translated": "Ny chatt"
},
{
"id": "native.apple.9d87aa7e7862a607",
"source": "Connection",
"translated": "Anslutning"
},
{
"id": "native.apple.7e7c47f471dd2c69",
"source": "Online",
"translated": "Online"
},
{
"id": "native.apple.9e2aea6088887f1f",
"id": "native.apple.02ff27780aad60aa",
"source": "Connecting",
"translated": "Ansluter"
},
{
"id": "native.apple.3624978c7d43335a",
"id": "native.apple.b2d0754aab434ea3",
"source": "Needs attention",
"translated": "Kräver uppmärksamhet"
"translated": "Kräver åtgärd"
},
{
"id": "native.apple.7da053dd774cb201",
"id": "native.apple.342c72a01b0f4bb1",
"source": "Offline",
"translated": "Offline"
},
{
"id": "native.apple.a4256b2ab523ee60",
"source": "Chat",
"translated": "Chatt"
"id": "native.apple.9fc7dfa0dccea003",
"source": "Pinned pages stay in the sidebar. Home is always shown.",
"translated": "Fästa sidor finns kvar i sidofältet. Hem visas alltid."
},
{
"id": "native.apple.4bfe6dc45811d50f",
"source": "Pages",
"translated": "Pages"
},
{
"id": "native.apple.422767686f219093",
"source": "Done",
"translated": "Klar"
},
{
"id": "native.apple.e197e8708ad3b2c8",
"source": "Pinned",
"translated": "Fäst"
},
{
"id": "native.apple.098013d7dd8cdfc7",
"source": "Not pinned",
"translated": "Inte fäst"
},
{
"id": "native.apple.64d7dc062ef4cc81",
@@ -15693,46 +15758,21 @@
"source": "Automations",
"translated": "Automatiseringar"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "Visa sidofält"
},
{
"id": "native.apple.bb0ea6d61a32c7c2",
"source": "Back to %@",
"translated": "Tillbaka till %@"
},
{
"id": "native.apple.72fab75688479b3e",
"source": "Hide Sidebar",
"translated": "Dölj sidofält"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "Visa sidofält"
},
{
"id": "native.apple.8af43f59602ec0d8",
"source": "Close canvas",
"translated": "Stäng canvas"
},
{
"id": "native.apple.a1db6ce0aed1d18e",
"source": "Chat, voice active",
"translated": "Chatt, röst aktiv"
},
{
"id": "native.apple.bda6cfa988e49a75",
"source": "Control",
"translated": "Kontroll"
},
{
"id": "native.apple.3c80f5351055a5f3",
"source": "Agent",
"translated": "Agent"
},
{
"id": "native.apple.22d107db5b905ef4",
"source": "Settings",
"translated": "Inställningar"
},
{
"id": "native.apple.8a4751c86aa6fe77",
"source": "Gateway needs attention",
@@ -15794,9 +15834,9 @@
"translated": "Instanser"
},
{
"id": "native.apple.11fe8b9941954dfb",
"source": "Threads",
"translated": "Trådar"
"id": "native.apple.e3e3ce1a79ebbd70",
"source": "Sessions",
"translated": "Sessioner"
},
{
"id": "native.apple.253cb2debeb51859",
+242 -202
View File
@@ -10869,9 +10869,9 @@
"translated": "คุณต้องการทำงานอะไร?"
},
{
"id": "native.apple.4da775013ac9b123",
"source": "The thread attaches once the gateway is ready.",
"translated": "ระบบจะแนบเธรดเมื่อ Gateway พร้อมใช้งาน"
"id": "native.apple.ed7f703a8809b564",
"source": "The session attaches once the gateway is ready.",
"translated": "เซสชันจะเชื่อมต่อเมื่อ Gateway พร้อมใช้งาน"
},
{
"id": "native.apple.02611ddddef7295a",
@@ -10919,9 +10919,9 @@
"translated": "ตัวเลือกเซสชันใหม่…"
},
{
"id": "native.apple.003b25ddafeb18e9",
"source": "Threads…",
"translated": "เธรด…"
"id": "native.apple.a1b0d289758e2213",
"source": "Sessions…",
"translated": "เซสชัน…"
},
{
"id": "native.apple.17c13312e7532c89",
@@ -11084,14 +11084,14 @@
"translated": "สร้าง"
},
{
"id": "native.apple.31d5c7287cfb3abe",
"source": "Delete Thread?",
"translated": "ลบเธรดหรือไม่?"
"id": "native.apple.e7382c53c7dd48f7",
"source": "Delete Session?",
"translated": "ลบเซสชันหรือไม่?"
},
{
"id": "native.apple.d3395564809f1120",
"source": "Delete Thread",
"translated": "ลบเธรด"
"id": "native.apple.702fd8b48da56065",
"source": "Delete Session",
"translated": "ลบเซสชัน"
},
{
"id": "native.apple.9b1aed19568a048e",
@@ -11099,9 +11099,9 @@
"translated": "ยกเลิก"
},
{
"id": "native.apple.092659256d26cb03",
"source": "This permanently deletes the thread and its transcript.",
"translated": "การดำเนินการนี้จะลบเธรดและบันทึกการสนทนาอย่างถาวร"
"id": "native.apple.61f3f19ea24c6012",
"source": "This permanently deletes the session and its transcript.",
"translated": "การดำเนินการนี้จะลบเซสชันและบันทึกการสนทนาอย่างถาวร"
},
{
"id": "native.apple.0965d8d2429c3b9f",
@@ -11129,9 +11129,9 @@
"translated": "กลุ่มใหม่"
},
{
"id": "native.apple.683032464c497bbd",
"source": "Rename Thread",
"translated": "เปลี่ยนชื่อเธรด"
"id": "native.apple.cd368674179237a0",
"source": "Rename Session",
"translated": "เปลี่ยนชื่อเซสชัน"
},
{
"id": "native.apple.31424500c53d6c32",
@@ -11139,15 +11139,55 @@
"translated": "ชื่อกลุ่ม"
},
{
"id": "native.apple.f887aa956588f237",
"source": "Thread name",
"translated": "ชื่อเธรด"
"id": "native.apple.8b54306971cfa8c9",
"source": "Session name",
"translated": "ชื่อเซสชัน"
},
{
"id": "native.apple.e8018adcccaa2a4d",
"source": "View More",
"translated": "ดูเพิ่มเติม"
},
{
"id": "native.apple.e3ef1aa93156bd67",
"source": "Live",
"translated": "Live"
},
{
"id": "native.apple.bdfc040fb974b4aa",
"source": "Unread",
"translated": "ยังไม่ได้อ่าน"
},
{
"id": "native.apple.6f94924c0a736fcf",
"source": "Tokens",
"translated": "โทเค็น"
},
{
"id": "native.apple.bec8b61a3a29b59a",
"source": "Opens Sessions",
"translated": "เปิดเซสชัน"
},
{
"id": "native.apple.69279daa342241c1",
"source": "Pending approvals",
"translated": "การอนุมัติที่รอดำเนินการ"
},
{
"id": "native.apple.48af1bbb4fd06321",
"source": "Automation issues",
"translated": "Automation issues"
},
{
"id": "native.apple.3e4f2dd3a0d41b97",
"source": "31-day usage",
"translated": "31-day usage"
},
{
"id": "native.apple.c334a60ae7b4d508",
"source": "Opens Usage",
"translated": "Opens Usage"
},
{
"id": "native.apple.65fb4d9ce6e5bbda",
"source": "Gateway settings",
@@ -11179,14 +11219,14 @@
"translated": "เอเจนต์"
},
{
"id": "native.apple.7c8231b7b1ca480f",
"source": "Agent thread",
"translated": "เธรดของเอเจนต์"
"id": "native.apple.789d5d0790fd18ca",
"source": "Agent session",
"translated": "เซสชันของเอเจนต์"
},
{
"id": "native.apple.b3c553614f762a58",
"source": "Recent threads",
"translated": "เธรดล่าสุด"
"id": "native.apple.ee45dce4a2e44737",
"source": "Recent sessions",
"translated": "เซสชันล่าสุด"
},
{
"id": "native.apple.9161ca3c61de6cc7",
@@ -11194,9 +11234,9 @@
"translated": "Gateway ออฟไลน์"
},
{
"id": "native.apple.5aa32afda85064ea",
"source": "No recent threads",
"translated": "ไม่มีเธรดล่าสุด"
"id": "native.apple.c97e0382e578a2f7",
"source": "No recent sessions",
"translated": "ไม่มีเซสชันล่าสุด"
},
{
"id": "native.apple.79937d7781fb65ae",
@@ -11253,6 +11293,11 @@
"source": "Direct chat",
"translated": "แชทโดยตรง"
},
{
"id": "native.apple.7a39e0991fa3cd53",
"source": "just now",
"translated": "just now"
},
{
"id": "native.apple.dbd48d25920f342b",
"source": "%@ on %@",
@@ -11294,14 +11339,14 @@
"translated": "ยกเลิก"
},
{
"id": "native.apple.b6855cf19a50f477",
"source": "Threads",
"translated": "เธรด"
"id": "native.apple.7a6511a467e34f69",
"source": "Sessions",
"translated": "เซสชัน"
},
{
"id": "native.apple.9b1d0ef27a1333b0",
"source": "Archived threads",
"translated": "เธรดที่เก็บถาวร"
"id": "native.apple.e6b8913014b64f0a",
"source": "Archived sessions",
"translated": "เซสชันที่เก็บถาวร"
},
{
"id": "native.apple.bc8e64efb095a625",
@@ -11309,34 +11354,34 @@
"translated": "แสดงที่เก็บถาวร"
},
{
"id": "native.apple.98167401c7267735",
"source": "Threads unavailable",
"translated": "เธรดไม่พร้อมใช้งาน"
"id": "native.apple.119433782518f199",
"source": "Sessions unavailable",
"translated": "เซสชันไม่พร้อมใช้งาน"
},
{
"id": "native.apple.4d28a7def2337b9f",
"source": "Loading archived threads",
"translated": "กำลังโหลดเธรดที่เก็บถาวร"
"id": "native.apple.9882fbadac3bea03",
"source": "Loading archived sessions",
"translated": "กำลังโหลดเซสชันที่เก็บถาวร"
},
{
"id": "native.apple.777d7b706933bd7b",
"source": "Loading recent threads",
"translated": "กำลังโหลดเธรดล่าสุด"
"id": "native.apple.16dca1cfac8a571b",
"source": "Loading recent sessions",
"translated": "กำลังโหลดเซสชันล่าสุด"
},
{
"id": "native.apple.22f81ea94bef8410",
"source": "^[\\(count) thread](inflect: true)",
"translated": "^[\\(count) เธรด](inflect: true)"
"id": "native.apple.207dad20d09f3160",
"source": "^[\\(count) session](inflect: true)",
"translated": "^[\\(count) เซสชัน](inflect: true)"
},
{
"id": "native.apple.1cad51e14db59bf9",
"source": "No archived threads",
"translated": "ไม่มีเธรดที่เก็บถาวร"
"id": "native.apple.a0b4091bf77d4060",
"source": "No archived sessions",
"translated": "ไม่มีเซสชันที่เก็บถาวร"
},
{
"id": "native.apple.18ef832d3a7ddcf8",
"source": "Archived threads will appear here.",
"translated": "เธรดที่เก็บถาวรจะแสดงที่นี่"
"id": "native.apple.acfdf5c72e289736",
"source": "Archived sessions will appear here.",
"translated": "เซสชันที่เก็บถาวรจะแสดงที่นี่"
},
{
"id": "native.apple.e8e8cea7ec44fe08",
@@ -11419,9 +11464,9 @@
"translated": "แชร์ข้อมูลนำเข้า"
},
{
"id": "native.apple.21d9208d86a4d1fe",
"source": "Loading threads",
"translated": "กำลังโหลดเธรด"
"id": "native.apple.4c5b2ecf243cfbbc",
"source": "Loading sessions",
"translated": "กำลังโหลดเซสชัน"
},
{
"id": "native.apple.48655128d0a34e44",
@@ -11429,19 +11474,19 @@
"translated": "กำลังดึงกิจกรรมล่าสุดจาก Gateway"
},
{
"id": "native.apple.4be1f79aa2b230ff",
"source": "Threads unavailable",
"translated": "เธรดไม่พร้อมใช้งาน"
"id": "native.apple.c4479934c65c973c",
"source": "Sessions unavailable",
"translated": "เซสชันไม่พร้อมใช้งาน"
},
{
"id": "native.apple.98b348873556bc46",
"source": "No recent threads",
"translated": "ไม่มีเธรดล่าสุด"
"id": "native.apple.6e67b64954ba3002",
"source": "No recent sessions",
"translated": "ไม่มีเซสชันล่าสุด"
},
{
"id": "native.apple.7396d205574d279f",
"source": "Thread activity offline",
"translated": "กิจกรรมของเธรดออฟไลน์"
"id": "native.apple.5dce07848bec08b5",
"source": "Session activity offline",
"translated": "กิจกรรมของเซสชันออฟไลน์"
},
{
"id": "native.apple.e3586d8a603f67e0",
@@ -11899,9 +11944,9 @@
"translated": "การ์ด"
},
{
"id": "native.apple.c9ec1b0e18074d8a",
"source": "Open Thread",
"translated": "เปิดเธรด"
"id": "native.apple.3edbccb7c14b693c",
"source": "Open Session",
"translated": "เปิดเซสชัน"
},
{
"id": "native.apple.a2732e4ff77a201b",
@@ -12103,91 +12148,6 @@
"source": "Offline",
"translated": "ออฟไลน์"
},
{
"id": "native.apple.a2d8e7b4dba29764",
"source": "Control",
"translated": "การควบคุม"
},
{
"id": "native.apple.597471e86dda3d38",
"source": "Opens Settings / Gateway",
"translated": "เปิด Settings / Gateway"
},
{
"id": "native.apple.ed16c9793f468dcd",
"source": "Agent chat and recent work.",
"translated": "แชทกับเอเจนต์และงานล่าสุด"
},
{
"id": "native.apple.a03e961ab14ba060",
"source": "Overview",
"translated": "ภาพรวม"
},
{
"id": "native.apple.feb28c9cba676ba2",
"source": "Instances",
"translated": "อินสแตนซ์"
},
{
"id": "native.apple.3f2726ccd1acd987",
"source": "Files",
"translated": "ไฟล์"
},
{
"id": "native.apple.614c9b40919fb103",
"source": "Dreaming",
"translated": "กำลังฝัน"
},
{
"id": "native.apple.e2b5c2d7c5d461a3",
"source": "Usage",
"translated": "การใช้งาน"
},
{
"id": "native.apple.f21bf1e3b5ec896c",
"source": "Automations",
"translated": "การทำงานอัตโนมัติ"
},
{
"id": "native.apple.57587fec1ca582ec",
"source": "Default Agent",
"translated": "เอเจนต์เริ่มต้น"
},
{
"id": "native.apple.e0e99a802f07cc68",
"source": "Gateway",
"translated": "Gateway"
},
{
"id": "native.apple.731e5fccde7cbc86",
"source": "Gateway %1$@, %2$@, %3$@",
"translated": "Gateway %1$@, %2$@, %3$@"
},
{
"id": "native.apple.ab0a315f69e3d5df",
"source": "Gateway %1$@, %2$@",
"translated": "Gateway %1$@, %2$@"
},
{
"id": "native.apple.01ad746119fbc27d",
"source": "Online",
"translated": "ออนไลน์"
},
{
"id": "native.apple.e253ef19f6e53371",
"source": "Connecting",
"translated": "กำลังเชื่อมต่อ"
},
{
"id": "native.apple.6f28b07ebdc2b25d",
"source": "Attention",
"translated": "โปรดทราบ"
},
{
"id": "native.apple.1c931bcd1cd20334",
"source": "Offline",
"translated": "ออฟไลน์"
},
{
"id": "native.apple.65602c216b89032d",
"source": "Channels / Integrations",
@@ -12988,6 +12948,16 @@
"source": "System follows this devices appearance setting.",
"translated": "ระบบจะทำตามการตั้งค่าลักษณะของอุปกรณ์นี้"
},
{
"id": "native.apple.6d48137a8f6a5e96",
"source": "Sidebar Agents",
"translated": "เอเจนต์ในแถบด้านข้าง"
},
{
"id": "native.apple.69cccbdee0bb0b56",
"source": "How many agents the sidebar lists before the switcher menu.",
"translated": "จำนวนเอเจนต์ที่แถบด้านข้างแสดงก่อนเมนูสลับ"
},
{
"id": "native.apple.70eca66c79335a6e",
"source": "Connection",
@@ -13389,9 +13359,9 @@
"translated": "ค่าเริ่มต้น"
},
{
"id": "native.apple.f4ae5664c3eda95d",
"source": "Used for new Chat threads and Talk sessions.",
"translated": "ใช้สำหรับเธรดแชทและเซสชันการสนทนาใหม่"
"id": "native.apple.6805480889265026",
"source": "Used for new Chat and Talk sessions.",
"translated": "ใช้สำหรับเซสชันแชทและการสนทนาใหม่"
},
{
"id": "native.apple.19552e71de246322",
@@ -15624,39 +15594,134 @@
"translated": "unknown relay error"
},
{
"id": "native.apple.c23d35de8d70863f",
"id": "native.apple.8855710a55de2ed5",
"source": "OpenClaw",
"translated": "OpenClaw"
},
{
"id": "native.apple.9e781c0183b79a76",
"source": "OpenClaw %@",
"translated": "OpenClaw %@"
"id": "native.apple.7029e1235380a92c",
"source": "Settings",
"translated": "การตั้งค่า"
},
{
"id": "native.apple.f4eea6473f43388d",
"id": "native.apple.7042a7d70a7e5a20",
"source": "Hide Sidebar",
"translated": "ซ่อนแถบด้านข้าง"
},
{
"id": "native.apple.e779847164babc29",
"source": "Selected",
"translated": "เลือกแล้ว"
},
{
"id": "native.apple.698c71602b569378",
"source": "More Agents",
"translated": "เอเจนต์เพิ่มเติม"
},
{
"id": "native.apple.94772cbd85c42e6e",
"source": "Search sessions",
"translated": "Search sessions"
},
{
"id": "native.apple.38e1e910f0958067",
"source": "Clear session search",
"translated": "Clear session search"
},
{
"id": "native.apple.58248484e54174e3",
"source": "Loading sessions",
"translated": "Loading sessions"
},
{
"id": "native.apple.dfb5cbd55893c4e5",
"source": "No recent sessions",
"translated": "No recent sessions"
},
{
"id": "native.apple.01a4c3f6192bb1a3",
"source": "Recent",
"translated": "ล่าสุด"
},
{
"id": "native.apple.c0a4d120556df169",
"source": "All Sessions…",
"translated": "All Sessions…"
},
{
"id": "native.apple.aa7c4ecffd2ba36a",
"source": "Edit Pages",
"translated": "แก้ไขหน้า"
},
{
"id": "native.apple.4d724d2e5731583d",
"source": "Home",
"translated": "หน้าหลัก"
},
{
"id": "native.apple.3995f7f73d1ded5f",
"source": "Unread",
"translated": "ยังไม่ได้อ่าน"
},
{
"id": "native.apple.b4567540cbcaf944",
"source": "Attention",
"translated": "ต้องดำเนินการ"
},
{
"id": "native.apple.14858678ae3f059f",
"source": "New Chat",
"translated": "แชทใหม่"
},
{
"id": "native.apple.9d87aa7e7862a607",
"source": "Connection",
"translated": "การเชื่อมต่อ"
},
{
"id": "native.apple.7e7c47f471dd2c69",
"source": "Online",
"translated": "ออนไลน์"
},
{
"id": "native.apple.9e2aea6088887f1f",
"id": "native.apple.02ff27780aad60aa",
"source": "Connecting",
"translated": "กำลังเชื่อมต่อ"
},
{
"id": "native.apple.3624978c7d43335a",
"id": "native.apple.b2d0754aab434ea3",
"source": "Needs attention",
"translated": "ต้องดำเนินการ"
"translated": "ต้องตรวจสอบ"
},
{
"id": "native.apple.7da053dd774cb201",
"id": "native.apple.342c72a01b0f4bb1",
"source": "Offline",
"translated": "ออฟไลน์"
},
{
"id": "native.apple.a4256b2ab523ee60",
"source": "Chat",
"translated": "แชท"
"id": "native.apple.9fc7dfa0dccea003",
"source": "Pinned pages stay in the sidebar. Home is always shown.",
"translated": "หน้าที่ปักหมุดจะอยู่ในแถบด้านข้าง โดยหน้าหลักจะแสดงอยู่เสมอ"
},
{
"id": "native.apple.4bfe6dc45811d50f",
"source": "Pages",
"translated": "Pages"
},
{
"id": "native.apple.422767686f219093",
"source": "Done",
"translated": "เสร็จสิ้น"
},
{
"id": "native.apple.e197e8708ad3b2c8",
"source": "Pinned",
"translated": "ปักหมุดแล้ว"
},
{
"id": "native.apple.098013d7dd8cdfc7",
"source": "Not pinned",
"translated": "ไม่ได้ปักหมุด"
},
{
"id": "native.apple.64d7dc062ef4cc81",
@@ -15693,46 +15758,21 @@
"source": "Automations",
"translated": "การทำงานอัตโนมัติ"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "แสดงแถบด้านข้าง"
},
{
"id": "native.apple.bb0ea6d61a32c7c2",
"source": "Back to %@",
"translated": "กลับไปที่ %@"
},
{
"id": "native.apple.72fab75688479b3e",
"source": "Hide Sidebar",
"translated": "ซ่อนแถบด้านข้าง"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "แสดงแถบด้านข้าง"
},
{
"id": "native.apple.8af43f59602ec0d8",
"source": "Close canvas",
"translated": "ปิดแคนวาส"
},
{
"id": "native.apple.a1db6ce0aed1d18e",
"source": "Chat, voice active",
"translated": "แชท เปิดเสียงอยู่"
},
{
"id": "native.apple.bda6cfa988e49a75",
"source": "Control",
"translated": "ควบคุม"
},
{
"id": "native.apple.3c80f5351055a5f3",
"source": "Agent",
"translated": "Agent"
},
{
"id": "native.apple.22d107db5b905ef4",
"source": "Settings",
"translated": "การตั้งค่า"
},
{
"id": "native.apple.8a4751c86aa6fe77",
"source": "Gateway needs attention",
@@ -15794,9 +15834,9 @@
"translated": "อินสแตนซ์"
},
{
"id": "native.apple.11fe8b9941954dfb",
"source": "Threads",
"translated": "เธรด"
"id": "native.apple.e3e3ce1a79ebbd70",
"source": "Sessions",
"translated": "เซสชัน"
},
{
"id": "native.apple.253cb2debeb51859",
+250 -210
View File
@@ -1491,7 +1491,7 @@
{
"id": "native.android.670121e54dbe286f",
"source": "Threads",
"translated": "Konular"
"translated": "Mesaj dizileri"
},
{
"id": "native.android.d38be650b1bce4a0",
@@ -3681,7 +3681,7 @@
{
"id": "native.android.a5845742daecb4ba",
"source": "Threads",
"translated": "Konular"
"translated": "Mesaj dizileri"
},
{
"id": "native.android.439b324280869527",
@@ -5751,7 +5751,7 @@
{
"id": "native.android.57177017a6a93826",
"source": "Threads",
"translated": "İletişim Dizileri"
"translated": "Mesaj dizileri"
},
{
"id": "native.android.43320b54a68b00a1",
@@ -8151,7 +8151,7 @@
{
"id": "native.android.6cf5d6fa8a4186d5",
"source": "Threads",
"translated": "İletişim Dizileri"
"translated": "Mesaj dizileri"
},
{
"id": "native.android.e4dc7610b0898e37",
@@ -10869,9 +10869,9 @@
"translated": "Ne üzerinde çalışmak istersiniz?"
},
{
"id": "native.apple.4da775013ac9b123",
"source": "The thread attaches once the gateway is ready.",
"translated": "Gateway hazır olduğunda iletişim dizisi bağlanır."
"id": "native.apple.ed7f703a8809b564",
"source": "The session attaches once the gateway is ready.",
"translated": "Gateway hazır olduğunda oturum bağlanır."
},
{
"id": "native.apple.02611ddddef7295a",
@@ -10919,9 +10919,9 @@
"translated": "Yeni Oturum Seçenekleri…"
},
{
"id": "native.apple.003b25ddafeb18e9",
"source": "Threads…",
"translated": "İletişim Dizileri…"
"id": "native.apple.a1b0d289758e2213",
"source": "Sessions…",
"translated": "Oturumlar…"
},
{
"id": "native.apple.17c13312e7532c89",
@@ -11084,14 +11084,14 @@
"translated": "Oluştur"
},
{
"id": "native.apple.31d5c7287cfb3abe",
"source": "Delete Thread?",
"translated": "İletişim Dizisi Silinsin mi?"
"id": "native.apple.e7382c53c7dd48f7",
"source": "Delete Session?",
"translated": "Oturum Silinsin mi?"
},
{
"id": "native.apple.d3395564809f1120",
"source": "Delete Thread",
"translated": "İş Parçacığını Sil"
"id": "native.apple.702fd8b48da56065",
"source": "Delete Session",
"translated": "Oturumu Sil"
},
{
"id": "native.apple.9b1aed19568a048e",
@@ -11099,9 +11099,9 @@
"translated": "İptal"
},
{
"id": "native.apple.092659256d26cb03",
"source": "This permanently deletes the thread and its transcript.",
"translated": "Bu işlem, iş parçacığını ve dökümünü kalıcı olarak siler."
"id": "native.apple.61f3f19ea24c6012",
"source": "This permanently deletes the session and its transcript.",
"translated": "Bu işlem oturumu ve dökümünü kalıcı olarak siler."
},
{
"id": "native.apple.0965d8d2429c3b9f",
@@ -11129,9 +11129,9 @@
"translated": "Yeni Grup"
},
{
"id": "native.apple.683032464c497bbd",
"source": "Rename Thread",
"translated": "İş Parçacığını Yeniden Adlandır"
"id": "native.apple.cd368674179237a0",
"source": "Rename Session",
"translated": "Oturumu Yeniden Adlandır"
},
{
"id": "native.apple.31424500c53d6c32",
@@ -11139,15 +11139,55 @@
"translated": "Grup adı"
},
{
"id": "native.apple.f887aa956588f237",
"source": "Thread name",
"translated": "İş parçacığı adı"
"id": "native.apple.8b54306971cfa8c9",
"source": "Session name",
"translated": "Oturum adı"
},
{
"id": "native.apple.e8018adcccaa2a4d",
"source": "View More",
"translated": "Daha Fazla Göster"
},
{
"id": "native.apple.e3ef1aa93156bd67",
"source": "Live",
"translated": "Canlı"
},
{
"id": "native.apple.bdfc040fb974b4aa",
"source": "Unread",
"translated": "Okunmamış"
},
{
"id": "native.apple.6f94924c0a736fcf",
"source": "Tokens",
"translated": "Tokenlar"
},
{
"id": "native.apple.bec8b61a3a29b59a",
"source": "Opens Sessions",
"translated": "Oturumlar'ı açar"
},
{
"id": "native.apple.69279daa342241c1",
"source": "Pending approvals",
"translated": "Bekleyen onaylar"
},
{
"id": "native.apple.48af1bbb4fd06321",
"source": "Automation issues",
"translated": "Otomasyon sorunları"
},
{
"id": "native.apple.3e4f2dd3a0d41b97",
"source": "31-day usage",
"translated": "31 günlük kullanım"
},
{
"id": "native.apple.c334a60ae7b4d508",
"source": "Opens Usage",
"translated": "Kullanımı açar"
},
{
"id": "native.apple.65fb4d9ce6e5bbda",
"source": "Gateway settings",
@@ -11179,14 +11219,14 @@
"translated": "Aracılar"
},
{
"id": "native.apple.7c8231b7b1ca480f",
"source": "Agent thread",
"translated": "Aracı iş parçacığı"
"id": "native.apple.789d5d0790fd18ca",
"source": "Agent session",
"translated": "Aracı oturumu"
},
{
"id": "native.apple.b3c553614f762a58",
"source": "Recent threads",
"translated": "Son iş parçacıkları"
"id": "native.apple.ee45dce4a2e44737",
"source": "Recent sessions",
"translated": "Son oturumlar"
},
{
"id": "native.apple.9161ca3c61de6cc7",
@@ -11194,9 +11234,9 @@
"translated": "Gateway çevrimdışı"
},
{
"id": "native.apple.5aa32afda85064ea",
"source": "No recent threads",
"translated": "Son iş parçacığı yok"
"id": "native.apple.c97e0382e578a2f7",
"source": "No recent sessions",
"translated": "Son oturum yok"
},
{
"id": "native.apple.79937d7781fb65ae",
@@ -11253,6 +11293,11 @@
"source": "Direct chat",
"translated": "Doğrudan sohbet"
},
{
"id": "native.apple.7a39e0991fa3cd53",
"source": "just now",
"translated": "az önce"
},
{
"id": "native.apple.dbd48d25920f342b",
"source": "%@ on %@",
@@ -11294,14 +11339,14 @@
"translated": "İptal"
},
{
"id": "native.apple.b6855cf19a50f477",
"source": "Threads",
"translated": "İş Parçacıkları"
"id": "native.apple.7a6511a467e34f69",
"source": "Sessions",
"translated": "Oturumlar"
},
{
"id": "native.apple.9b1d0ef27a1333b0",
"source": "Archived threads",
"translated": "Arşivlenmiş iş parçacıkları"
"id": "native.apple.e6b8913014b64f0a",
"source": "Archived sessions",
"translated": "Arşivlenmiş oturumlar"
},
{
"id": "native.apple.bc8e64efb095a625",
@@ -11309,34 +11354,34 @@
"translated": "Arşivlenenleri Göster"
},
{
"id": "native.apple.98167401c7267735",
"source": "Threads unavailable",
"translated": "İş parçacıkları kullanılamıyor"
"id": "native.apple.119433782518f199",
"source": "Sessions unavailable",
"translated": "Oturumlar kullanılamıyor"
},
{
"id": "native.apple.4d28a7def2337b9f",
"source": "Loading archived threads",
"translated": "Arşivlenmiş iş parçacıkları yükleniyor"
"id": "native.apple.9882fbadac3bea03",
"source": "Loading archived sessions",
"translated": "Arşivlenmiş oturumlar yükleniyor"
},
{
"id": "native.apple.777d7b706933bd7b",
"source": "Loading recent threads",
"translated": "Son iş parçacıkları yükleniyor"
"id": "native.apple.16dca1cfac8a571b",
"source": "Loading recent sessions",
"translated": "Son oturumlar yükleniyor"
},
{
"id": "native.apple.22f81ea94bef8410",
"source": "^[\\(count) thread](inflect: true)",
"translated": "^[\\(count) iş parçacığı](inflect: true)"
"id": "native.apple.207dad20d09f3160",
"source": "^[\\(count) session](inflect: true)",
"translated": "^[\\(count) oturum](inflect: true)"
},
{
"id": "native.apple.1cad51e14db59bf9",
"source": "No archived threads",
"translated": "Arşivlenmiş iş parçacığı yok"
"id": "native.apple.a0b4091bf77d4060",
"source": "No archived sessions",
"translated": "Arşivlenmiş oturum yok"
},
{
"id": "native.apple.18ef832d3a7ddcf8",
"source": "Archived threads will appear here.",
"translated": "Arşivlenmiş iş parçacıkları burada görünür."
"id": "native.apple.acfdf5c72e289736",
"source": "Archived sessions will appear here.",
"translated": "Arşivlenmiş oturumlar burada görünür."
},
{
"id": "native.apple.e8e8cea7ec44fe08",
@@ -11419,9 +11464,9 @@
"translated": "Paylaşım alımı"
},
{
"id": "native.apple.21d9208d86a4d1fe",
"source": "Loading threads",
"translated": "İş parçacıkları yükleniyor"
"id": "native.apple.4c5b2ecf243cfbbc",
"source": "Loading sessions",
"translated": "Oturumlar yükleniyor"
},
{
"id": "native.apple.48655128d0a34e44",
@@ -11429,19 +11474,19 @@
"translated": "Gateway üzerinden son etkinlik alınıyor."
},
{
"id": "native.apple.4be1f79aa2b230ff",
"source": "Threads unavailable",
"translated": "İş parçacıkları kullanılamıyor"
"id": "native.apple.c4479934c65c973c",
"source": "Sessions unavailable",
"translated": "Oturumlar kullanılamıyor"
},
{
"id": "native.apple.98b348873556bc46",
"source": "No recent threads",
"translated": "Son iş parçacığı yok"
"id": "native.apple.6e67b64954ba3002",
"source": "No recent sessions",
"translated": "Yakın zamanda oturum yok"
},
{
"id": "native.apple.7396d205574d279f",
"source": "Thread activity offline",
"translated": "İş parçacığı etkinliği çevrimdışı"
"id": "native.apple.5dce07848bec08b5",
"source": "Session activity offline",
"translated": "Oturum etkinliği çevrimdışı"
},
{
"id": "native.apple.e3586d8a603f67e0",
@@ -11899,9 +11944,9 @@
"translated": "Kart"
},
{
"id": "native.apple.c9ec1b0e18074d8a",
"source": "Open Thread",
"translated": "İş Parçacığını Aç"
"id": "native.apple.3edbccb7c14b693c",
"source": "Open Session",
"translated": "Oturumu Aç"
},
{
"id": "native.apple.a2732e4ff77a201b",
@@ -12103,91 +12148,6 @@
"source": "Offline",
"translated": "Çevrimdışı"
},
{
"id": "native.apple.a2d8e7b4dba29764",
"source": "Control",
"translated": "Kontrol"
},
{
"id": "native.apple.597471e86dda3d38",
"source": "Opens Settings / Gateway",
"translated": "Ayarlar / Gateway'i açar"
},
{
"id": "native.apple.ed16c9793f468dcd",
"source": "Agent chat and recent work.",
"translated": "Aracı sohbeti ve son çalışmalar."
},
{
"id": "native.apple.a03e961ab14ba060",
"source": "Overview",
"translated": "Genel Bakış"
},
{
"id": "native.apple.feb28c9cba676ba2",
"source": "Instances",
"translated": "Örnekler"
},
{
"id": "native.apple.3f2726ccd1acd987",
"source": "Files",
"translated": "Dosyalar"
},
{
"id": "native.apple.614c9b40919fb103",
"source": "Dreaming",
"translated": "Rüya Görüyor"
},
{
"id": "native.apple.e2b5c2d7c5d461a3",
"source": "Usage",
"translated": "Kullanım"
},
{
"id": "native.apple.f21bf1e3b5ec896c",
"source": "Automations",
"translated": "Otomasyonlar"
},
{
"id": "native.apple.57587fec1ca582ec",
"source": "Default Agent",
"translated": "Varsayılan Temsilci"
},
{
"id": "native.apple.e0e99a802f07cc68",
"source": "Gateway",
"translated": "Gateway"
},
{
"id": "native.apple.731e5fccde7cbc86",
"source": "Gateway %1$@, %2$@, %3$@",
"translated": "Gateway %1$@, %2$@, %3$@"
},
{
"id": "native.apple.ab0a315f69e3d5df",
"source": "Gateway %1$@, %2$@",
"translated": "Gateway %1$@, %2$@"
},
{
"id": "native.apple.01ad746119fbc27d",
"source": "Online",
"translated": "Çevrimiçi"
},
{
"id": "native.apple.e253ef19f6e53371",
"source": "Connecting",
"translated": "Bağlanıyor"
},
{
"id": "native.apple.6f28b07ebdc2b25d",
"source": "Attention",
"translated": "Dikkat"
},
{
"id": "native.apple.1c931bcd1cd20334",
"source": "Offline",
"translated": "Çevrimdışı"
},
{
"id": "native.apple.65602c216b89032d",
"source": "Channels / Integrations",
@@ -12988,6 +12948,16 @@
"source": "System follows this devices appearance setting.",
"translated": "Sistem, bu aygıtın görünüm ayarını izler."
},
{
"id": "native.apple.6d48137a8f6a5e96",
"source": "Sidebar Agents",
"translated": "Kenar Çubuğu Aracıları"
},
{
"id": "native.apple.69cccbdee0bb0b56",
"source": "How many agents the sidebar lists before the switcher menu.",
"translated": "Kenar çubuğunun, değiştirici menüsünden önce kaç aracı listeleyeceği."
},
{
"id": "native.apple.70eca66c79335a6e",
"source": "Connection",
@@ -13389,9 +13359,9 @@
"translated": "Varsayılan"
},
{
"id": "native.apple.f4ae5664c3eda95d",
"source": "Used for new Chat threads and Talk sessions.",
"translated": "Yeni Sohbet dizileri ve Konuşma oturumları için kullanılır."
"id": "native.apple.6805480889265026",
"source": "Used for new Chat and Talk sessions.",
"translated": "Yeni Sohbet ve Konuşma oturumları için kullanılır."
},
{
"id": "native.apple.19552e71de246322",
@@ -15624,39 +15594,134 @@
"translated": "unknown relay error"
},
{
"id": "native.apple.c23d35de8d70863f",
"id": "native.apple.8855710a55de2ed5",
"source": "OpenClaw",
"translated": "OpenClaw"
},
{
"id": "native.apple.9e781c0183b79a76",
"source": "OpenClaw %@",
"translated": "OpenClaw %@"
"id": "native.apple.7029e1235380a92c",
"source": "Settings",
"translated": "Ayarlar"
},
{
"id": "native.apple.f4eea6473f43388d",
"id": "native.apple.7042a7d70a7e5a20",
"source": "Hide Sidebar",
"translated": "Kenar Çubuğunu Gizle"
},
{
"id": "native.apple.e779847164babc29",
"source": "Selected",
"translated": "Seçili"
},
{
"id": "native.apple.698c71602b569378",
"source": "More Agents",
"translated": "Daha Fazla Aracı"
},
{
"id": "native.apple.94772cbd85c42e6e",
"source": "Search sessions",
"translated": "Oturumlarda ara"
},
{
"id": "native.apple.38e1e910f0958067",
"source": "Clear session search",
"translated": "Oturum aramasını temizle"
},
{
"id": "native.apple.58248484e54174e3",
"source": "Loading sessions",
"translated": "Oturumlar yükleniyor"
},
{
"id": "native.apple.dfb5cbd55893c4e5",
"source": "No recent sessions",
"translated": "Son oturum yok"
},
{
"id": "native.apple.01a4c3f6192bb1a3",
"source": "Recent",
"translated": "Son Kullanılanlar"
},
{
"id": "native.apple.c0a4d120556df169",
"source": "All Sessions…",
"translated": "Tüm Oturumlar…"
},
{
"id": "native.apple.aa7c4ecffd2ba36a",
"source": "Edit Pages",
"translated": "Sayfaları Düzenle"
},
{
"id": "native.apple.4d724d2e5731583d",
"source": "Home",
"translated": "Ana Sayfa"
},
{
"id": "native.apple.3995f7f73d1ded5f",
"source": "Unread",
"translated": "Okunmamış"
},
{
"id": "native.apple.b4567540cbcaf944",
"source": "Attention",
"translated": "Dikkat"
},
{
"id": "native.apple.14858678ae3f059f",
"source": "New Chat",
"translated": "Yeni Sohbet"
},
{
"id": "native.apple.9d87aa7e7862a607",
"source": "Connection",
"translated": "Bağlantı"
},
{
"id": "native.apple.7e7c47f471dd2c69",
"source": "Online",
"translated": "Çevrimiçi"
},
{
"id": "native.apple.9e2aea6088887f1f",
"id": "native.apple.02ff27780aad60aa",
"source": "Connecting",
"translated": "Bağlanıyor"
},
{
"id": "native.apple.3624978c7d43335a",
"id": "native.apple.b2d0754aab434ea3",
"source": "Needs attention",
"translated": "İlgilenilmesi gerekiyor"
"translated": "Dikkat gerekiyor"
},
{
"id": "native.apple.7da053dd774cb201",
"id": "native.apple.342c72a01b0f4bb1",
"source": "Offline",
"translated": "Çevrimdışı"
},
{
"id": "native.apple.a4256b2ab523ee60",
"source": "Chat",
"translated": "Sohbet"
"id": "native.apple.9fc7dfa0dccea003",
"source": "Pinned pages stay in the sidebar. Home is always shown.",
"translated": "Sabitlenen sayfalar kenar çubuğunda kalır. Ana Sayfa her zaman gösterilir."
},
{
"id": "native.apple.4bfe6dc45811d50f",
"source": "Pages",
"translated": "Sayfalar"
},
{
"id": "native.apple.422767686f219093",
"source": "Done",
"translated": "Bitti"
},
{
"id": "native.apple.e197e8708ad3b2c8",
"source": "Pinned",
"translated": "Sabitlendi"
},
{
"id": "native.apple.098013d7dd8cdfc7",
"source": "Not pinned",
"translated": "Sabitlenmedi"
},
{
"id": "native.apple.64d7dc062ef4cc81",
@@ -15693,46 +15758,21 @@
"source": "Automations",
"translated": "Otomasyonlar"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "Kenar Çubuğunu Göster"
},
{
"id": "native.apple.bb0ea6d61a32c7c2",
"source": "Back to %@",
"translated": "%@ uygulamasına geri dön"
},
{
"id": "native.apple.72fab75688479b3e",
"source": "Hide Sidebar",
"translated": "Kenar Çubuğunu Gizle"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "Kenar Çubuğunu Göster"
},
{
"id": "native.apple.8af43f59602ec0d8",
"source": "Close canvas",
"translated": "Tuvali kapat"
},
{
"id": "native.apple.a1db6ce0aed1d18e",
"source": "Chat, voice active",
"translated": "Sohbet, ses açık"
},
{
"id": "native.apple.bda6cfa988e49a75",
"source": "Control",
"translated": "Kontrol"
},
{
"id": "native.apple.3c80f5351055a5f3",
"source": "Agent",
"translated": "Aracı"
},
{
"id": "native.apple.22d107db5b905ef4",
"source": "Settings",
"translated": "Ayarlar"
},
{
"id": "native.apple.8a4751c86aa6fe77",
"source": "Gateway needs attention",
@@ -15794,9 +15834,9 @@
"translated": "Örnekler"
},
{
"id": "native.apple.11fe8b9941954dfb",
"source": "Threads",
"translated": "Diziler"
"id": "native.apple.e3e3ce1a79ebbd70",
"source": "Sessions",
"translated": "Oturumlar"
},
{
"id": "native.apple.253cb2debeb51859",
@@ -21991,7 +22031,7 @@
{
"id": "native.apple.3ec2afcbc298c673",
"source": "Threads",
"translated": "Diziler"
"translated": "Mesaj dizileri"
},
{
"id": "native.apple.74f66e96c112c3fa",
@@ -22086,7 +22126,7 @@
{
"id": "native.apple.52e37e3a44ae516c",
"source": "Threads",
"translated": "Diziler"
"translated": "Mesaj dizileri"
},
{
"id": "native.apple.704924cd0704b5b5",
@@ -24086,7 +24126,7 @@
{
"id": "native.apple.c0cc6acc36f413ce",
"source": "Threads",
"translated": "İş Parçacıkları"
"translated": "Mesaj dizileri"
},
{
"id": "native.apple.854d3928fe5a557c",
@@ -24461,7 +24501,7 @@
{
"id": "native.apple.c0ada47504425f23",
"source": "Threads",
"translated": "İş Parçacıkları"
"translated": "Mesaj dizileri"
},
{
"id": "native.apple.c13dbe6b5c01e9bd",
+242 -202
View File
@@ -10869,9 +10869,9 @@
"translated": "Над чим ви хотіли б попрацювати?"
},
{
"id": "native.apple.4da775013ac9b123",
"source": "The thread attaches once the gateway is ready.",
"translated": "Гілку буде підключено, щойно Gateway буде готовий."
"id": "native.apple.ed7f703a8809b564",
"source": "The session attaches once the gateway is ready.",
"translated": "Сеанс підключиться, щойно Gateway буде готовий."
},
{
"id": "native.apple.02611ddddef7295a",
@@ -10919,9 +10919,9 @@
"translated": "Параметри нового сеансу…"
},
{
"id": "native.apple.003b25ddafeb18e9",
"source": "Threads…",
"translated": "Гілки…"
"id": "native.apple.a1b0d289758e2213",
"source": "Sessions…",
"translated": "Сеанси…"
},
{
"id": "native.apple.17c13312e7532c89",
@@ -11084,14 +11084,14 @@
"translated": "Створити"
},
{
"id": "native.apple.31d5c7287cfb3abe",
"source": "Delete Thread?",
"translated": "Видалити гілку?"
"id": "native.apple.e7382c53c7dd48f7",
"source": "Delete Session?",
"translated": "Видалити сеанс?"
},
{
"id": "native.apple.d3395564809f1120",
"source": "Delete Thread",
"translated": "Видалити гілку"
"id": "native.apple.702fd8b48da56065",
"source": "Delete Session",
"translated": "Видалити сеанс"
},
{
"id": "native.apple.9b1aed19568a048e",
@@ -11099,9 +11099,9 @@
"translated": "Скасувати"
},
{
"id": "native.apple.092659256d26cb03",
"source": "This permanently deletes the thread and its transcript.",
"translated": "Це назавжди видалить гілку та її розшифрування."
"id": "native.apple.61f3f19ea24c6012",
"source": "This permanently deletes the session and its transcript.",
"translated": "Це назавжди видалить сеанс і його стенограму."
},
{
"id": "native.apple.0965d8d2429c3b9f",
@@ -11129,9 +11129,9 @@
"translated": "Нова група"
},
{
"id": "native.apple.683032464c497bbd",
"source": "Rename Thread",
"translated": "Перейменувати гілку"
"id": "native.apple.cd368674179237a0",
"source": "Rename Session",
"translated": "Перейменувати сеанс"
},
{
"id": "native.apple.31424500c53d6c32",
@@ -11139,15 +11139,55 @@
"translated": "Назва групи"
},
{
"id": "native.apple.f887aa956588f237",
"source": "Thread name",
"translated": "Назва гілки"
"id": "native.apple.8b54306971cfa8c9",
"source": "Session name",
"translated": "Назва сеансу"
},
{
"id": "native.apple.e8018adcccaa2a4d",
"source": "View More",
"translated": "Показати більше"
},
{
"id": "native.apple.e3ef1aa93156bd67",
"source": "Live",
"translated": "Live"
},
{
"id": "native.apple.bdfc040fb974b4aa",
"source": "Unread",
"translated": "Непрочитане"
},
{
"id": "native.apple.6f94924c0a736fcf",
"source": "Tokens",
"translated": "Токени"
},
{
"id": "native.apple.bec8b61a3a29b59a",
"source": "Opens Sessions",
"translated": "Відкриває сеанси"
},
{
"id": "native.apple.69279daa342241c1",
"source": "Pending approvals",
"translated": "Очікують схвалення"
},
{
"id": "native.apple.48af1bbb4fd06321",
"source": "Automation issues",
"translated": "Automation issues"
},
{
"id": "native.apple.3e4f2dd3a0d41b97",
"source": "31-day usage",
"translated": "31-day usage"
},
{
"id": "native.apple.c334a60ae7b4d508",
"source": "Opens Usage",
"translated": "Opens Usage"
},
{
"id": "native.apple.65fb4d9ce6e5bbda",
"source": "Gateway settings",
@@ -11179,14 +11219,14 @@
"translated": "Агенти"
},
{
"id": "native.apple.7c8231b7b1ca480f",
"source": "Agent thread",
"translated": "Гілка агента"
"id": "native.apple.789d5d0790fd18ca",
"source": "Agent session",
"translated": "Сеанс агента"
},
{
"id": "native.apple.b3c553614f762a58",
"source": "Recent threads",
"translated": "Недавні гілки"
"id": "native.apple.ee45dce4a2e44737",
"source": "Recent sessions",
"translated": "Недавні сеанси"
},
{
"id": "native.apple.9161ca3c61de6cc7",
@@ -11194,9 +11234,9 @@
"translated": "Gateway офлайн"
},
{
"id": "native.apple.5aa32afda85064ea",
"source": "No recent threads",
"translated": "Немає недавніх гілок"
"id": "native.apple.c97e0382e578a2f7",
"source": "No recent sessions",
"translated": "Немає недавніх сеансів"
},
{
"id": "native.apple.79937d7781fb65ae",
@@ -11253,6 +11293,11 @@
"source": "Direct chat",
"translated": "Прямий чат"
},
{
"id": "native.apple.7a39e0991fa3cd53",
"source": "just now",
"translated": "just now"
},
{
"id": "native.apple.dbd48d25920f342b",
"source": "%@ on %@",
@@ -11294,14 +11339,14 @@
"translated": "Скасувати"
},
{
"id": "native.apple.b6855cf19a50f477",
"source": "Threads",
"translated": "Гілки"
"id": "native.apple.7a6511a467e34f69",
"source": "Sessions",
"translated": "Сеанси"
},
{
"id": "native.apple.9b1d0ef27a1333b0",
"source": "Archived threads",
"translated": "Архівні гілки"
"id": "native.apple.e6b8913014b64f0a",
"source": "Archived sessions",
"translated": "Архівовані сеанси"
},
{
"id": "native.apple.bc8e64efb095a625",
@@ -11309,34 +11354,34 @@
"translated": "Показати архівовані"
},
{
"id": "native.apple.98167401c7267735",
"source": "Threads unavailable",
"translated": "Гілки недоступні"
"id": "native.apple.119433782518f199",
"source": "Sessions unavailable",
"translated": "Сеанси недоступні"
},
{
"id": "native.apple.4d28a7def2337b9f",
"source": "Loading archived threads",
"translated": "Завантаження архівних гілок"
"id": "native.apple.9882fbadac3bea03",
"source": "Loading archived sessions",
"translated": "Завантаження архівованих сеансів"
},
{
"id": "native.apple.777d7b706933bd7b",
"source": "Loading recent threads",
"translated": "Завантаження недавніх гілок"
"id": "native.apple.16dca1cfac8a571b",
"source": "Loading recent sessions",
"translated": "Завантаження недавніх сеансів"
},
{
"id": "native.apple.22f81ea94bef8410",
"source": "^[\\(count) thread](inflect: true)",
"translated": "^[\\(count) гілка](inflect: true)"
"id": "native.apple.207dad20d09f3160",
"source": "^[\\(count) session](inflect: true)",
"translated": "^[\\(count) сеанс](inflect: true)"
},
{
"id": "native.apple.1cad51e14db59bf9",
"source": "No archived threads",
"translated": "Немає архівних гілок"
"id": "native.apple.a0b4091bf77d4060",
"source": "No archived sessions",
"translated": "Немає архівованих сеансів"
},
{
"id": "native.apple.18ef832d3a7ddcf8",
"source": "Archived threads will appear here.",
"translated": "Архівні гілки з’являться тут."
"id": "native.apple.acfdf5c72e289736",
"source": "Archived sessions will appear here.",
"translated": "Архівовані сеанси з’являться тут."
},
{
"id": "native.apple.e8e8cea7ec44fe08",
@@ -11419,9 +11464,9 @@
"translated": "Поділитися надходженням"
},
{
"id": "native.apple.21d9208d86a4d1fe",
"source": "Loading threads",
"translated": "Завантаження гілок"
"id": "native.apple.4c5b2ecf243cfbbc",
"source": "Loading sessions",
"translated": "Завантаження сеансів"
},
{
"id": "native.apple.48655128d0a34e44",
@@ -11429,19 +11474,19 @@
"translated": "Отримання нещодавньої активності з Gateway."
},
{
"id": "native.apple.4be1f79aa2b230ff",
"source": "Threads unavailable",
"translated": "Гілки недоступні"
"id": "native.apple.c4479934c65c973c",
"source": "Sessions unavailable",
"translated": "Сеанси недоступні"
},
{
"id": "native.apple.98b348873556bc46",
"source": "No recent threads",
"translated": "Немає недавніх гілок"
"id": "native.apple.6e67b64954ba3002",
"source": "No recent sessions",
"translated": "Немає нещодавніх сеансів"
},
{
"id": "native.apple.7396d205574d279f",
"source": "Thread activity offline",
"translated": "Активність гілок офлайн"
"id": "native.apple.5dce07848bec08b5",
"source": "Session activity offline",
"translated": "Активність сеансів офлайн"
},
{
"id": "native.apple.e3586d8a603f67e0",
@@ -11899,9 +11944,9 @@
"translated": "Картка"
},
{
"id": "native.apple.c9ec1b0e18074d8a",
"source": "Open Thread",
"translated": "Відкрити гілку"
"id": "native.apple.3edbccb7c14b693c",
"source": "Open Session",
"translated": "Відкрити сеанс"
},
{
"id": "native.apple.a2732e4ff77a201b",
@@ -12103,91 +12148,6 @@
"source": "Offline",
"translated": "Офлайн"
},
{
"id": "native.apple.a2d8e7b4dba29764",
"source": "Control",
"translated": "Керування"
},
{
"id": "native.apple.597471e86dda3d38",
"source": "Opens Settings / Gateway",
"translated": "Відкриває Settings / Gateway"
},
{
"id": "native.apple.ed16c9793f468dcd",
"source": "Agent chat and recent work.",
"translated": "Чат агента та останні роботи."
},
{
"id": "native.apple.a03e961ab14ba060",
"source": "Overview",
"translated": "Огляд"
},
{
"id": "native.apple.feb28c9cba676ba2",
"source": "Instances",
"translated": "Екземпляри"
},
{
"id": "native.apple.3f2726ccd1acd987",
"source": "Files",
"translated": "Файли"
},
{
"id": "native.apple.614c9b40919fb103",
"source": "Dreaming",
"translated": "Сновидіння"
},
{
"id": "native.apple.e2b5c2d7c5d461a3",
"source": "Usage",
"translated": "Використання"
},
{
"id": "native.apple.f21bf1e3b5ec896c",
"source": "Automations",
"translated": "Автоматизації"
},
{
"id": "native.apple.57587fec1ca582ec",
"source": "Default Agent",
"translated": "Агент за замовчуванням"
},
{
"id": "native.apple.e0e99a802f07cc68",
"source": "Gateway",
"translated": "Gateway"
},
{
"id": "native.apple.731e5fccde7cbc86",
"source": "Gateway %1$@, %2$@, %3$@",
"translated": "Gateway %1$@, %2$@, %3$@"
},
{
"id": "native.apple.ab0a315f69e3d5df",
"source": "Gateway %1$@, %2$@",
"translated": "Gateway %1$@, %2$@"
},
{
"id": "native.apple.01ad746119fbc27d",
"source": "Online",
"translated": "Онлайн"
},
{
"id": "native.apple.e253ef19f6e53371",
"source": "Connecting",
"translated": "Підключення"
},
{
"id": "native.apple.6f28b07ebdc2b25d",
"source": "Attention",
"translated": "Увага"
},
{
"id": "native.apple.1c931bcd1cd20334",
"source": "Offline",
"translated": "Офлайн"
},
{
"id": "native.apple.65602c216b89032d",
"source": "Channels / Integrations",
@@ -12988,6 +12948,16 @@
"source": "System follows this devices appearance setting.",
"translated": "Система дотримується налаштувань вигляду цього пристрою."
},
{
"id": "native.apple.6d48137a8f6a5e96",
"source": "Sidebar Agents",
"translated": "Агенти на бічній панелі"
},
{
"id": "native.apple.69cccbdee0bb0b56",
"source": "How many agents the sidebar lists before the switcher menu.",
"translated": "Кількість агентів, які відображаються на бічній панелі перед меню перемикання."
},
{
"id": "native.apple.70eca66c79335a6e",
"source": "Connection",
@@ -13191,7 +13161,7 @@
{
"id": "native.apple.8a6df64f48087b74",
"source": "Pending approvals",
"translated": "Незавершені підтвердження"
"translated": "Очікують схвалення"
},
{
"id": "native.apple.e70b7e1453061f75",
@@ -13389,9 +13359,9 @@
"translated": "За замовчуванням"
},
{
"id": "native.apple.f4ae5664c3eda95d",
"source": "Used for new Chat threads and Talk sessions.",
"translated": "Використовується для нових гілок чату та сеансів розмови."
"id": "native.apple.6805480889265026",
"source": "Used for new Chat and Talk sessions.",
"translated": "Використовується для нових сеансів чату й розмов."
},
{
"id": "native.apple.19552e71de246322",
@@ -15624,39 +15594,134 @@
"translated": "unknown relay error"
},
{
"id": "native.apple.c23d35de8d70863f",
"id": "native.apple.8855710a55de2ed5",
"source": "OpenClaw",
"translated": "OpenClaw"
},
{
"id": "native.apple.9e781c0183b79a76",
"source": "OpenClaw %@",
"translated": "OpenClaw %@"
"id": "native.apple.7029e1235380a92c",
"source": "Settings",
"translated": "Налаштування"
},
{
"id": "native.apple.f4eea6473f43388d",
"id": "native.apple.7042a7d70a7e5a20",
"source": "Hide Sidebar",
"translated": "Приховати бічну панель"
},
{
"id": "native.apple.e779847164babc29",
"source": "Selected",
"translated": "Вибрано"
},
{
"id": "native.apple.698c71602b569378",
"source": "More Agents",
"translated": "Інші агенти"
},
{
"id": "native.apple.94772cbd85c42e6e",
"source": "Search sessions",
"translated": "Search sessions"
},
{
"id": "native.apple.38e1e910f0958067",
"source": "Clear session search",
"translated": "Clear session search"
},
{
"id": "native.apple.58248484e54174e3",
"source": "Loading sessions",
"translated": "Loading sessions"
},
{
"id": "native.apple.dfb5cbd55893c4e5",
"source": "No recent sessions",
"translated": "No recent sessions"
},
{
"id": "native.apple.01a4c3f6192bb1a3",
"source": "Recent",
"translated": "Нещодавні"
},
{
"id": "native.apple.c0a4d120556df169",
"source": "All Sessions…",
"translated": "All Sessions…"
},
{
"id": "native.apple.aa7c4ecffd2ba36a",
"source": "Edit Pages",
"translated": "Редагувати сторінки"
},
{
"id": "native.apple.4d724d2e5731583d",
"source": "Home",
"translated": "Головна"
},
{
"id": "native.apple.3995f7f73d1ded5f",
"source": "Unread",
"translated": "Непрочитане"
},
{
"id": "native.apple.b4567540cbcaf944",
"source": "Attention",
"translated": "Увага"
},
{
"id": "native.apple.14858678ae3f059f",
"source": "New Chat",
"translated": "Новий чат"
},
{
"id": "native.apple.9d87aa7e7862a607",
"source": "Connection",
"translated": "Підключення"
},
{
"id": "native.apple.7e7c47f471dd2c69",
"source": "Online",
"translated": "Онлайн"
},
{
"id": "native.apple.9e2aea6088887f1f",
"id": "native.apple.02ff27780aad60aa",
"source": "Connecting",
"translated": "Підключення"
},
{
"id": "native.apple.3624978c7d43335a",
"id": "native.apple.b2d0754aab434ea3",
"source": "Needs attention",
"translated": "Потребує уваги"
},
{
"id": "native.apple.7da053dd774cb201",
"id": "native.apple.342c72a01b0f4bb1",
"source": "Offline",
"translated": "Офлайн"
},
{
"id": "native.apple.a4256b2ab523ee60",
"source": "Chat",
"translated": "Чат"
"id": "native.apple.9fc7dfa0dccea003",
"source": "Pinned pages stay in the sidebar. Home is always shown.",
"translated": "Закріплені сторінки залишаються на бічній панелі. Головна відображається завжди."
},
{
"id": "native.apple.4bfe6dc45811d50f",
"source": "Pages",
"translated": "Pages"
},
{
"id": "native.apple.422767686f219093",
"source": "Done",
"translated": "Готово"
},
{
"id": "native.apple.e197e8708ad3b2c8",
"source": "Pinned",
"translated": "Закріплено"
},
{
"id": "native.apple.098013d7dd8cdfc7",
"source": "Not pinned",
"translated": "Не закріплено"
},
{
"id": "native.apple.64d7dc062ef4cc81",
@@ -15693,46 +15758,21 @@
"source": "Automations",
"translated": "Автоматизації"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "Показати бічну панель"
},
{
"id": "native.apple.bb0ea6d61a32c7c2",
"source": "Back to %@",
"translated": "Назад до %@"
},
{
"id": "native.apple.72fab75688479b3e",
"source": "Hide Sidebar",
"translated": "Приховати бічну панель"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "Показати бічну панель"
},
{
"id": "native.apple.8af43f59602ec0d8",
"source": "Close canvas",
"translated": "Закрити полотно"
},
{
"id": "native.apple.a1db6ce0aed1d18e",
"source": "Chat, voice active",
"translated": "Чат, голос увімкнено"
},
{
"id": "native.apple.bda6cfa988e49a75",
"source": "Control",
"translated": "Керування"
},
{
"id": "native.apple.3c80f5351055a5f3",
"source": "Agent",
"translated": "Агент"
},
{
"id": "native.apple.22d107db5b905ef4",
"source": "Settings",
"translated": "Налаштування"
},
{
"id": "native.apple.8a4751c86aa6fe77",
"source": "Gateway needs attention",
@@ -15794,9 +15834,9 @@
"translated": "Екземпляри"
},
{
"id": "native.apple.11fe8b9941954dfb",
"source": "Threads",
"translated": "Гілки"
"id": "native.apple.e3e3ce1a79ebbd70",
"source": "Sessions",
"translated": "Сеанси"
},
{
"id": "native.apple.253cb2debeb51859",
+241 -201
View File
@@ -10869,9 +10869,9 @@
"translated": "Bạn muốn làm việc gì?"
},
{
"id": "native.apple.4da775013ac9b123",
"source": "The thread attaches once the gateway is ready.",
"translated": "Luồng sẽ được đính kèm khi Gateway sẵn sàng."
"id": "native.apple.ed7f703a8809b564",
"source": "The session attaches once the gateway is ready.",
"translated": "Phiên sẽ kết nối sau khi Gateway sẵn sàng."
},
{
"id": "native.apple.02611ddddef7295a",
@@ -10919,9 +10919,9 @@
"translated": "Tùy chọn phiên mới…"
},
{
"id": "native.apple.003b25ddafeb18e9",
"source": "Threads…",
"translated": "Luồng…"
"id": "native.apple.a1b0d289758e2213",
"source": "Sessions…",
"translated": "Phiên…"
},
{
"id": "native.apple.17c13312e7532c89",
@@ -11084,14 +11084,14 @@
"translated": "Tạo"
},
{
"id": "native.apple.31d5c7287cfb3abe",
"source": "Delete Thread?",
"translated": "Xóa luồng?"
"id": "native.apple.e7382c53c7dd48f7",
"source": "Delete Session?",
"translated": "Xóa phiên?"
},
{
"id": "native.apple.d3395564809f1120",
"source": "Delete Thread",
"translated": "Xóa luồng"
"id": "native.apple.702fd8b48da56065",
"source": "Delete Session",
"translated": "Xóa phiên"
},
{
"id": "native.apple.9b1aed19568a048e",
@@ -11099,9 +11099,9 @@
"translated": "Hủy"
},
{
"id": "native.apple.092659256d26cb03",
"source": "This permanently deletes the thread and its transcript.",
"translated": "Thao tác này sẽ xóa vĩnh viễn luồng và bản ghi của luồng."
"id": "native.apple.61f3f19ea24c6012",
"source": "This permanently deletes the session and its transcript.",
"translated": "Thao tác này sẽ xóa vĩnh viễn phiên và bản ghi của phiên."
},
{
"id": "native.apple.0965d8d2429c3b9f",
@@ -11129,9 +11129,9 @@
"translated": "Nhóm mới"
},
{
"id": "native.apple.683032464c497bbd",
"source": "Rename Thread",
"translated": "Đổi tên luồng"
"id": "native.apple.cd368674179237a0",
"source": "Rename Session",
"translated": "Đổi tên phiên"
},
{
"id": "native.apple.31424500c53d6c32",
@@ -11139,15 +11139,55 @@
"translated": "Tên nhóm"
},
{
"id": "native.apple.f887aa956588f237",
"source": "Thread name",
"translated": "Tên luồng"
"id": "native.apple.8b54306971cfa8c9",
"source": "Session name",
"translated": "Tên phiên"
},
{
"id": "native.apple.e8018adcccaa2a4d",
"source": "View More",
"translated": "Xem thêm"
},
{
"id": "native.apple.e3ef1aa93156bd67",
"source": "Live",
"translated": "Trực tiếp"
},
{
"id": "native.apple.bdfc040fb974b4aa",
"source": "Unread",
"translated": "Chưa đọc"
},
{
"id": "native.apple.6f94924c0a736fcf",
"source": "Tokens",
"translated": "Token"
},
{
"id": "native.apple.bec8b61a3a29b59a",
"source": "Opens Sessions",
"translated": "Mở Phiên"
},
{
"id": "native.apple.69279daa342241c1",
"source": "Pending approvals",
"translated": "Phê duyệt đang chờ"
},
{
"id": "native.apple.48af1bbb4fd06321",
"source": "Automation issues",
"translated": "Sự cố tự động hóa"
},
{
"id": "native.apple.3e4f2dd3a0d41b97",
"source": "31-day usage",
"translated": "Mức sử dụng trong 31 ngày"
},
{
"id": "native.apple.c334a60ae7b4d508",
"source": "Opens Usage",
"translated": "Mở mức sử dụng"
},
{
"id": "native.apple.65fb4d9ce6e5bbda",
"source": "Gateway settings",
@@ -11179,14 +11219,14 @@
"translated": "Tác tử"
},
{
"id": "native.apple.7c8231b7b1ca480f",
"source": "Agent thread",
"translated": "Luồng tác nhân"
"id": "native.apple.789d5d0790fd18ca",
"source": "Agent session",
"translated": "Phiên tác nhân"
},
{
"id": "native.apple.b3c553614f762a58",
"source": "Recent threads",
"translated": "Luồng gần đây"
"id": "native.apple.ee45dce4a2e44737",
"source": "Recent sessions",
"translated": "Phiên gần đây"
},
{
"id": "native.apple.9161ca3c61de6cc7",
@@ -11194,9 +11234,9 @@
"translated": "Gateway ngoại tuyến"
},
{
"id": "native.apple.5aa32afda85064ea",
"source": "No recent threads",
"translated": "Không có luồng nào gần đây"
"id": "native.apple.c97e0382e578a2f7",
"source": "No recent sessions",
"translated": "Không có phiên gần đây"
},
{
"id": "native.apple.79937d7781fb65ae",
@@ -11253,6 +11293,11 @@
"source": "Direct chat",
"translated": "Cuộc trò chuyện trực tiếp"
},
{
"id": "native.apple.7a39e0991fa3cd53",
"source": "just now",
"translated": "vừa xong"
},
{
"id": "native.apple.dbd48d25920f342b",
"source": "%@ on %@",
@@ -11294,14 +11339,14 @@
"translated": "Hủy"
},
{
"id": "native.apple.b6855cf19a50f477",
"source": "Threads",
"translated": "Luồng"
"id": "native.apple.7a6511a467e34f69",
"source": "Sessions",
"translated": "Phiên"
},
{
"id": "native.apple.9b1d0ef27a1333b0",
"source": "Archived threads",
"translated": "Luồng đã lưu trữ"
"id": "native.apple.e6b8913014b64f0a",
"source": "Archived sessions",
"translated": "Phiên đã lưu trữ"
},
{
"id": "native.apple.bc8e64efb095a625",
@@ -11309,34 +11354,34 @@
"translated": "Hiển thị mục đã lưu trữ"
},
{
"id": "native.apple.98167401c7267735",
"source": "Threads unavailable",
"translated": "Không thể truy cập các luồng"
"id": "native.apple.119433782518f199",
"source": "Sessions unavailable",
"translated": "Không thể truy cập các phiên"
},
{
"id": "native.apple.4d28a7def2337b9f",
"source": "Loading archived threads",
"translated": "Đang tải các luồng đã lưu trữ"
"id": "native.apple.9882fbadac3bea03",
"source": "Loading archived sessions",
"translated": "Đang tải các phiên đã lưu trữ"
},
{
"id": "native.apple.777d7b706933bd7b",
"source": "Loading recent threads",
"translated": "Đang tải các luồng gần đây"
"id": "native.apple.16dca1cfac8a571b",
"source": "Loading recent sessions",
"translated": "Đang tải các phiên gần đây"
},
{
"id": "native.apple.22f81ea94bef8410",
"source": "^[\\(count) thread](inflect: true)",
"translated": "^[\\(count) luồng](inflect: true)"
"id": "native.apple.207dad20d09f3160",
"source": "^[\\(count) session](inflect: true)",
"translated": "^[\\(count) phiên](inflect: true)"
},
{
"id": "native.apple.1cad51e14db59bf9",
"source": "No archived threads",
"translated": "Không có luồng nào đã lưu trữ"
"id": "native.apple.a0b4091bf77d4060",
"source": "No archived sessions",
"translated": "Không có phiên đã lưu trữ"
},
{
"id": "native.apple.18ef832d3a7ddcf8",
"source": "Archived threads will appear here.",
"translated": "Các luồng đã lưu trữ sẽ xuất hiện tại đây."
"id": "native.apple.acfdf5c72e289736",
"source": "Archived sessions will appear here.",
"translated": "Các phiên đã lưu trữ sẽ xuất hiện đây."
},
{
"id": "native.apple.e8e8cea7ec44fe08",
@@ -11419,9 +11464,9 @@
"translated": "Chia sẻ đầu vào"
},
{
"id": "native.apple.21d9208d86a4d1fe",
"source": "Loading threads",
"translated": "Đang tải các luồng"
"id": "native.apple.4c5b2ecf243cfbbc",
"source": "Loading sessions",
"translated": "Đang tải các phiên"
},
{
"id": "native.apple.48655128d0a34e44",
@@ -11429,19 +11474,19 @@
"translated": "Đang lấy hoạt động gần đây từ gateway."
},
{
"id": "native.apple.4be1f79aa2b230ff",
"source": "Threads unavailable",
"translated": "Không thể truy cập các luồng"
"id": "native.apple.c4479934c65c973c",
"source": "Sessions unavailable",
"translated": "Không có phiên khả dụng"
},
{
"id": "native.apple.98b348873556bc46",
"source": "No recent threads",
"translated": "Không có luồng nào gần đây"
"id": "native.apple.6e67b64954ba3002",
"source": "No recent sessions",
"translated": "Không có phiên gần đây"
},
{
"id": "native.apple.7396d205574d279f",
"source": "Thread activity offline",
"translated": "Hoạt động của luồng đang ngoại tuyến"
"id": "native.apple.5dce07848bec08b5",
"source": "Session activity offline",
"translated": "Hoạt động phiên đang ngoại tuyến"
},
{
"id": "native.apple.e3586d8a603f67e0",
@@ -11899,9 +11944,9 @@
"translated": "Thẻ"
},
{
"id": "native.apple.c9ec1b0e18074d8a",
"source": "Open Thread",
"translated": "Mở luồng"
"id": "native.apple.3edbccb7c14b693c",
"source": "Open Session",
"translated": "Mở phiên"
},
{
"id": "native.apple.a2732e4ff77a201b",
@@ -12103,91 +12148,6 @@
"source": "Offline",
"translated": "Ngoại tuyến"
},
{
"id": "native.apple.a2d8e7b4dba29764",
"source": "Control",
"translated": "Điều khiển"
},
{
"id": "native.apple.597471e86dda3d38",
"source": "Opens Settings / Gateway",
"translated": "Mở Cài đặt / Gateway"
},
{
"id": "native.apple.ed16c9793f468dcd",
"source": "Agent chat and recent work.",
"translated": "Trò chuyện với agent và công việc gần đây."
},
{
"id": "native.apple.a03e961ab14ba060",
"source": "Overview",
"translated": "Tổng quan"
},
{
"id": "native.apple.feb28c9cba676ba2",
"source": "Instances",
"translated": "Phiên bản"
},
{
"id": "native.apple.3f2726ccd1acd987",
"source": "Files",
"translated": "Tệp"
},
{
"id": "native.apple.614c9b40919fb103",
"source": "Dreaming",
"translated": "Đang mơ"
},
{
"id": "native.apple.e2b5c2d7c5d461a3",
"source": "Usage",
"translated": "Mức sử dụng"
},
{
"id": "native.apple.f21bf1e3b5ec896c",
"source": "Automations",
"translated": "Tự động hóa"
},
{
"id": "native.apple.57587fec1ca582ec",
"source": "Default Agent",
"translated": "Tác nhân mặc định"
},
{
"id": "native.apple.e0e99a802f07cc68",
"source": "Gateway",
"translated": "Gateway"
},
{
"id": "native.apple.731e5fccde7cbc86",
"source": "Gateway %1$@, %2$@, %3$@",
"translated": "Gateway %1$@, %2$@, %3$@"
},
{
"id": "native.apple.ab0a315f69e3d5df",
"source": "Gateway %1$@, %2$@",
"translated": "Gateway %1$@, %2$@"
},
{
"id": "native.apple.01ad746119fbc27d",
"source": "Online",
"translated": "Trực tuyến"
},
{
"id": "native.apple.e253ef19f6e53371",
"source": "Connecting",
"translated": "Đang kết nối"
},
{
"id": "native.apple.6f28b07ebdc2b25d",
"source": "Attention",
"translated": "Chú ý"
},
{
"id": "native.apple.1c931bcd1cd20334",
"source": "Offline",
"translated": "Ngoại tuyến"
},
{
"id": "native.apple.65602c216b89032d",
"source": "Channels / Integrations",
@@ -12988,6 +12948,16 @@
"source": "System follows this devices appearance setting.",
"translated": "Hệ thống tuân theo cài đặt giao diện của thiết bị này."
},
{
"id": "native.apple.6d48137a8f6a5e96",
"source": "Sidebar Agents",
"translated": "Tác nhân trong thanh bên"
},
{
"id": "native.apple.69cccbdee0bb0b56",
"source": "How many agents the sidebar lists before the switcher menu.",
"translated": "Số lượng tác nhân được liệt kê trong thanh bên trước menu chuyển đổi."
},
{
"id": "native.apple.70eca66c79335a6e",
"source": "Connection",
@@ -13389,9 +13359,9 @@
"translated": "Mặc định"
},
{
"id": "native.apple.f4ae5664c3eda95d",
"source": "Used for new Chat threads and Talk sessions.",
"translated": "Được dùng cho các chuỗi Chat và phiên Talk mới."
"id": "native.apple.6805480889265026",
"source": "Used for new Chat and Talk sessions.",
"translated": "Được dùng cho các phiên Trò chuyện và Trò chuyện thoại mới."
},
{
"id": "native.apple.19552e71de246322",
@@ -15624,39 +15594,134 @@
"translated": "unknown relay error"
},
{
"id": "native.apple.c23d35de8d70863f",
"id": "native.apple.8855710a55de2ed5",
"source": "OpenClaw",
"translated": "OpenClaw"
},
{
"id": "native.apple.9e781c0183b79a76",
"source": "OpenClaw %@",
"translated": "OpenClaw %@"
"id": "native.apple.7029e1235380a92c",
"source": "Settings",
"translated": "Cài đặt"
},
{
"id": "native.apple.f4eea6473f43388d",
"id": "native.apple.7042a7d70a7e5a20",
"source": "Hide Sidebar",
"translated": "Ẩn thanh bên"
},
{
"id": "native.apple.e779847164babc29",
"source": "Selected",
"translated": "Đã chọn"
},
{
"id": "native.apple.698c71602b569378",
"source": "More Agents",
"translated": "Thêm tác nhân"
},
{
"id": "native.apple.94772cbd85c42e6e",
"source": "Search sessions",
"translated": "Tìm kiếm phiên"
},
{
"id": "native.apple.38e1e910f0958067",
"source": "Clear session search",
"translated": "Xóa tìm kiếm phiên"
},
{
"id": "native.apple.58248484e54174e3",
"source": "Loading sessions",
"translated": "Đang tải phiên"
},
{
"id": "native.apple.dfb5cbd55893c4e5",
"source": "No recent sessions",
"translated": "Không có phiên gần đây"
},
{
"id": "native.apple.01a4c3f6192bb1a3",
"source": "Recent",
"translated": "Gần đây"
},
{
"id": "native.apple.c0a4d120556df169",
"source": "All Sessions…",
"translated": "Tất cả phiên…"
},
{
"id": "native.apple.aa7c4ecffd2ba36a",
"source": "Edit Pages",
"translated": "Chỉnh sửa trang"
},
{
"id": "native.apple.4d724d2e5731583d",
"source": "Home",
"translated": "Trang chủ"
},
{
"id": "native.apple.3995f7f73d1ded5f",
"source": "Unread",
"translated": "Chưa đọc"
},
{
"id": "native.apple.b4567540cbcaf944",
"source": "Attention",
"translated": "Cần chú ý"
},
{
"id": "native.apple.14858678ae3f059f",
"source": "New Chat",
"translated": "Trò chuyện mới"
},
{
"id": "native.apple.9d87aa7e7862a607",
"source": "Connection",
"translated": "Kết nối"
},
{
"id": "native.apple.7e7c47f471dd2c69",
"source": "Online",
"translated": "Trực tuyến"
},
{
"id": "native.apple.9e2aea6088887f1f",
"id": "native.apple.02ff27780aad60aa",
"source": "Connecting",
"translated": "Đang kết nối"
},
{
"id": "native.apple.3624978c7d43335a",
"id": "native.apple.b2d0754aab434ea3",
"source": "Needs attention",
"translated": "Cần chú ý"
},
{
"id": "native.apple.7da053dd774cb201",
"id": "native.apple.342c72a01b0f4bb1",
"source": "Offline",
"translated": "Ngoại tuyến"
},
{
"id": "native.apple.a4256b2ab523ee60",
"source": "Chat",
"translated": "Trò chuyện"
"id": "native.apple.9fc7dfa0dccea003",
"source": "Pinned pages stay in the sidebar. Home is always shown.",
"translated": "Các trang đã ghim sẽ nằm trong thanh bên. Trang chủ luôn được hiển thị."
},
{
"id": "native.apple.4bfe6dc45811d50f",
"source": "Pages",
"translated": "Trang"
},
{
"id": "native.apple.422767686f219093",
"source": "Done",
"translated": "Xong"
},
{
"id": "native.apple.e197e8708ad3b2c8",
"source": "Pinned",
"translated": "Đã ghim"
},
{
"id": "native.apple.098013d7dd8cdfc7",
"source": "Not pinned",
"translated": "Chưa ghim"
},
{
"id": "native.apple.64d7dc062ef4cc81",
@@ -15693,46 +15758,21 @@
"source": "Automations",
"translated": "Tự động hóa"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "Hiển thị thanh bên"
},
{
"id": "native.apple.bb0ea6d61a32c7c2",
"source": "Back to %@",
"translated": "Quay lại %@"
},
{
"id": "native.apple.72fab75688479b3e",
"source": "Hide Sidebar",
"translated": "Ẩn thanh bên"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "Hiển thị thanh bên"
},
{
"id": "native.apple.8af43f59602ec0d8",
"source": "Close canvas",
"translated": "Đóng canvas"
},
{
"id": "native.apple.a1db6ce0aed1d18e",
"source": "Chat, voice active",
"translated": "Chat, giọng nói đang bật"
},
{
"id": "native.apple.bda6cfa988e49a75",
"source": "Control",
"translated": "Điều khiển"
},
{
"id": "native.apple.3c80f5351055a5f3",
"source": "Agent",
"translated": "Tác nhân"
},
{
"id": "native.apple.22d107db5b905ef4",
"source": "Settings",
"translated": "Cài đặt"
},
{
"id": "native.apple.8a4751c86aa6fe77",
"source": "Gateway needs attention",
@@ -15794,9 +15834,9 @@
"translated": "Phiên bản"
},
{
"id": "native.apple.11fe8b9941954dfb",
"source": "Threads",
"translated": "Chuỗi"
"id": "native.apple.e3e3ce1a79ebbd70",
"source": "Sessions",
"translated": "Phiên"
},
{
"id": "native.apple.253cb2debeb51859",
+239 -199
View File
@@ -10869,9 +10869,9 @@
"translated": "你想处理什么?"
},
{
"id": "native.apple.4da775013ac9b123",
"source": "The thread attaches once the gateway is ready.",
"translated": "Gateway 准备就绪后连接会话。"
"id": "native.apple.ed7f703a8809b564",
"source": "The session attaches once the gateway is ready.",
"translated": "Gateway 准备就绪后,便会连接会话。"
},
{
"id": "native.apple.02611ddddef7295a",
@@ -10919,8 +10919,8 @@
"translated": "新会话选项…"
},
{
"id": "native.apple.003b25ddafeb18e9",
"source": "Threads…",
"id": "native.apple.a1b0d289758e2213",
"source": "Sessions…",
"translated": "会话…"
},
{
@@ -11084,14 +11084,14 @@
"translated": "创建"
},
{
"id": "native.apple.31d5c7287cfb3abe",
"source": "Delete Thread?",
"id": "native.apple.e7382c53c7dd48f7",
"source": "Delete Session?",
"translated": "删除会话?"
},
{
"id": "native.apple.d3395564809f1120",
"source": "Delete Thread",
"translated": "删除话"
"id": "native.apple.702fd8b48da56065",
"source": "Delete Session",
"translated": "删除话"
},
{
"id": "native.apple.9b1aed19568a048e",
@@ -11099,9 +11099,9 @@
"translated": "取消"
},
{
"id": "native.apple.092659256d26cb03",
"source": "This permanently deletes the thread and its transcript.",
"translated": "这将永久删除该话及其对话记录。"
"id": "native.apple.61f3f19ea24c6012",
"source": "This permanently deletes the session and its transcript.",
"translated": "这将永久删除该话及其记录。"
},
{
"id": "native.apple.0965d8d2429c3b9f",
@@ -11129,9 +11129,9 @@
"translated": "新建组"
},
{
"id": "native.apple.683032464c497bbd",
"source": "Rename Thread",
"translated": "重命名话"
"id": "native.apple.cd368674179237a0",
"source": "Rename Session",
"translated": "重命名话"
},
{
"id": "native.apple.31424500c53d6c32",
@@ -11139,15 +11139,55 @@
"translated": "组名称"
},
{
"id": "native.apple.f887aa956588f237",
"source": "Thread name",
"translated": "话名称"
"id": "native.apple.8b54306971cfa8c9",
"source": "Session name",
"translated": "话名称"
},
{
"id": "native.apple.e8018adcccaa2a4d",
"source": "View More",
"translated": "查看更多"
},
{
"id": "native.apple.e3ef1aa93156bd67",
"source": "Live",
"translated": "实时"
},
{
"id": "native.apple.bdfc040fb974b4aa",
"source": "Unread",
"translated": "未读"
},
{
"id": "native.apple.6f94924c0a736fcf",
"source": "Tokens",
"translated": "Token"
},
{
"id": "native.apple.bec8b61a3a29b59a",
"source": "Opens Sessions",
"translated": "打开会话"
},
{
"id": "native.apple.69279daa342241c1",
"source": "Pending approvals",
"translated": "待处理审批"
},
{
"id": "native.apple.48af1bbb4fd06321",
"source": "Automation issues",
"translated": "自动化问题"
},
{
"id": "native.apple.3e4f2dd3a0d41b97",
"source": "31-day usage",
"translated": "31 天用量"
},
{
"id": "native.apple.c334a60ae7b4d508",
"source": "Opens Usage",
"translated": "打开用量"
},
{
"id": "native.apple.65fb4d9ce6e5bbda",
"source": "Gateway settings",
@@ -11179,14 +11219,14 @@
"translated": "智能体"
},
{
"id": "native.apple.7c8231b7b1ca480f",
"source": "Agent thread",
"translated": "智能体对话"
"id": "native.apple.789d5d0790fd18ca",
"source": "Agent session",
"translated": "代理会话"
},
{
"id": "native.apple.b3c553614f762a58",
"source": "Recent threads",
"translated": "最近的话"
"id": "native.apple.ee45dce4a2e44737",
"source": "Recent sessions",
"translated": "最近的话"
},
{
"id": "native.apple.9161ca3c61de6cc7",
@@ -11194,9 +11234,9 @@
"translated": "Gateway 离线"
},
{
"id": "native.apple.5aa32afda85064ea",
"source": "No recent threads",
"translated": "没有最近的话"
"id": "native.apple.c97e0382e578a2f7",
"source": "No recent sessions",
"translated": "没有最近的话"
},
{
"id": "native.apple.79937d7781fb65ae",
@@ -11253,6 +11293,11 @@
"source": "Direct chat",
"translated": "直接聊天"
},
{
"id": "native.apple.7a39e0991fa3cd53",
"source": "just now",
"translated": "刚刚"
},
{
"id": "native.apple.dbd48d25920f342b",
"source": "%@ on %@",
@@ -11294,14 +11339,14 @@
"translated": "取消"
},
{
"id": "native.apple.b6855cf19a50f477",
"source": "Threads",
"translated": "话"
"id": "native.apple.7a6511a467e34f69",
"source": "Sessions",
"translated": "话"
},
{
"id": "native.apple.9b1d0ef27a1333b0",
"source": "Archived threads",
"translated": "已归档的话"
"id": "native.apple.e6b8913014b64f0a",
"source": "Archived sessions",
"translated": "已归档的话"
},
{
"id": "native.apple.bc8e64efb095a625",
@@ -11309,34 +11354,34 @@
"translated": "显示已归档"
},
{
"id": "native.apple.98167401c7267735",
"source": "Threads unavailable",
"translated": "话不可用"
"id": "native.apple.119433782518f199",
"source": "Sessions unavailable",
"translated": "话不可用"
},
{
"id": "native.apple.4d28a7def2337b9f",
"source": "Loading archived threads",
"translated": "正在加载已归档的话"
"id": "native.apple.9882fbadac3bea03",
"source": "Loading archived sessions",
"translated": "正在加载已归档的话"
},
{
"id": "native.apple.777d7b706933bd7b",
"source": "Loading recent threads",
"translated": "正在加载最近的话"
"id": "native.apple.16dca1cfac8a571b",
"source": "Loading recent sessions",
"translated": "正在加载最近的话"
},
{
"id": "native.apple.22f81ea94bef8410",
"source": "^[\\(count) thread](inflect: true)",
"translated": "^[\\(count) 个话](inflect: true)"
"id": "native.apple.207dad20d09f3160",
"source": "^[\\(count) session](inflect: true)",
"translated": "^[\\(count) 个话](inflect: true)"
},
{
"id": "native.apple.1cad51e14db59bf9",
"source": "No archived threads",
"translated": "没有已归档的话"
"id": "native.apple.a0b4091bf77d4060",
"source": "No archived sessions",
"translated": "没有已归档的话"
},
{
"id": "native.apple.18ef832d3a7ddcf8",
"source": "Archived threads will appear here.",
"translated": "已归档的话将显示在此处。"
"id": "native.apple.acfdf5c72e289736",
"source": "Archived sessions will appear here.",
"translated": "已归档的话将显示在此处。"
},
{
"id": "native.apple.e8e8cea7ec44fe08",
@@ -11419,9 +11464,9 @@
"translated": "共享入口"
},
{
"id": "native.apple.21d9208d86a4d1fe",
"source": "Loading threads",
"translated": "正在加载话"
"id": "native.apple.4c5b2ecf243cfbbc",
"source": "Loading sessions",
"translated": "正在加载话"
},
{
"id": "native.apple.48655128d0a34e44",
@@ -11429,19 +11474,19 @@
"translated": "正在从 Gateway 获取最近活动。"
},
{
"id": "native.apple.4be1f79aa2b230ff",
"source": "Threads unavailable",
"translated": "话不可用"
"id": "native.apple.c4479934c65c973c",
"source": "Sessions unavailable",
"translated": "话不可用"
},
{
"id": "native.apple.98b348873556bc46",
"source": "No recent threads",
"translated": "没有最近的话"
"id": "native.apple.6e67b64954ba3002",
"source": "No recent sessions",
"translated": "没有最近的话"
},
{
"id": "native.apple.7396d205574d279f",
"source": "Thread activity offline",
"translated": "话活动已离线"
"id": "native.apple.5dce07848bec08b5",
"source": "Session activity offline",
"translated": "话活动已离线"
},
{
"id": "native.apple.e3586d8a603f67e0",
@@ -11899,9 +11944,9 @@
"translated": "卡片"
},
{
"id": "native.apple.c9ec1b0e18074d8a",
"source": "Open Thread",
"translated": "打开话"
"id": "native.apple.3edbccb7c14b693c",
"source": "Open Session",
"translated": "打开话"
},
{
"id": "native.apple.a2732e4ff77a201b",
@@ -12103,91 +12148,6 @@
"source": "Offline",
"translated": "离线"
},
{
"id": "native.apple.a2d8e7b4dba29764",
"source": "Control",
"translated": "控制"
},
{
"id": "native.apple.597471e86dda3d38",
"source": "Opens Settings / Gateway",
"translated": "打开设置 / Gateway"
},
{
"id": "native.apple.ed16c9793f468dcd",
"source": "Agent chat and recent work.",
"translated": "智能体聊天和近期工作。"
},
{
"id": "native.apple.a03e961ab14ba060",
"source": "Overview",
"translated": "概览"
},
{
"id": "native.apple.feb28c9cba676ba2",
"source": "Instances",
"translated": "实例"
},
{
"id": "native.apple.3f2726ccd1acd987",
"source": "Files",
"translated": "文件"
},
{
"id": "native.apple.614c9b40919fb103",
"source": "Dreaming",
"translated": "Dreaming"
},
{
"id": "native.apple.e2b5c2d7c5d461a3",
"source": "Usage",
"translated": "用量"
},
{
"id": "native.apple.f21bf1e3b5ec896c",
"source": "Automations",
"translated": "自动化"
},
{
"id": "native.apple.57587fec1ca582ec",
"source": "Default Agent",
"translated": "默认代理"
},
{
"id": "native.apple.e0e99a802f07cc68",
"source": "Gateway",
"translated": "Gateway"
},
{
"id": "native.apple.731e5fccde7cbc86",
"source": "Gateway %1$@, %2$@, %3$@",
"translated": "Gateway %1$@%2$@%3$@"
},
{
"id": "native.apple.ab0a315f69e3d5df",
"source": "Gateway %1$@, %2$@",
"translated": "Gateway %1$@%2$@"
},
{
"id": "native.apple.01ad746119fbc27d",
"source": "Online",
"translated": "在线"
},
{
"id": "native.apple.e253ef19f6e53371",
"source": "Connecting",
"translated": "正在连接"
},
{
"id": "native.apple.6f28b07ebdc2b25d",
"source": "Attention",
"translated": "注意"
},
{
"id": "native.apple.1c931bcd1cd20334",
"source": "Offline",
"translated": "离线"
},
{
"id": "native.apple.65602c216b89032d",
"source": "Channels / Integrations",
@@ -12988,6 +12948,16 @@
"source": "System follows this devices appearance setting.",
"translated": "系统遵循此设备的外观设置。"
},
{
"id": "native.apple.6d48137a8f6a5e96",
"source": "Sidebar Agents",
"translated": "侧边栏智能体"
},
{
"id": "native.apple.69cccbdee0bb0b56",
"source": "How many agents the sidebar lists before the switcher menu.",
"translated": "侧边栏在切换菜单前列出的智能体数量。"
},
{
"id": "native.apple.70eca66c79335a6e",
"source": "Connection",
@@ -13389,9 +13359,9 @@
"translated": "默认"
},
{
"id": "native.apple.f4ae5664c3eda95d",
"source": "Used for new Chat threads and Talk sessions.",
"translated": "用于新的聊天话题串和通话会话。"
"id": "native.apple.6805480889265026",
"source": "Used for new Chat and Talk sessions.",
"translated": "用于新的聊天和通话会话。"
},
{
"id": "native.apple.19552e71de246322",
@@ -15624,39 +15594,134 @@
"translated": "unknown relay error"
},
{
"id": "native.apple.c23d35de8d70863f",
"id": "native.apple.8855710a55de2ed5",
"source": "OpenClaw",
"translated": "OpenClaw"
},
{
"id": "native.apple.9e781c0183b79a76",
"source": "OpenClaw %@",
"translated": "OpenClaw %@"
"id": "native.apple.7029e1235380a92c",
"source": "Settings",
"translated": "设置"
},
{
"id": "native.apple.f4eea6473f43388d",
"id": "native.apple.7042a7d70a7e5a20",
"source": "Hide Sidebar",
"translated": "隐藏侧边栏"
},
{
"id": "native.apple.e779847164babc29",
"source": "Selected",
"translated": "已选择"
},
{
"id": "native.apple.698c71602b569378",
"source": "More Agents",
"translated": "更多智能体"
},
{
"id": "native.apple.94772cbd85c42e6e",
"source": "Search sessions",
"translated": "搜索会话"
},
{
"id": "native.apple.38e1e910f0958067",
"source": "Clear session search",
"translated": "清除会话搜索"
},
{
"id": "native.apple.58248484e54174e3",
"source": "Loading sessions",
"translated": "正在加载会话"
},
{
"id": "native.apple.dfb5cbd55893c4e5",
"source": "No recent sessions",
"translated": "没有最近的会话"
},
{
"id": "native.apple.01a4c3f6192bb1a3",
"source": "Recent",
"translated": "最近"
},
{
"id": "native.apple.c0a4d120556df169",
"source": "All Sessions…",
"translated": "所有会话…"
},
{
"id": "native.apple.aa7c4ecffd2ba36a",
"source": "Edit Pages",
"translated": "编辑页面"
},
{
"id": "native.apple.4d724d2e5731583d",
"source": "Home",
"translated": "主页"
},
{
"id": "native.apple.3995f7f73d1ded5f",
"source": "Unread",
"translated": "未读"
},
{
"id": "native.apple.b4567540cbcaf944",
"source": "Attention",
"translated": "注意"
},
{
"id": "native.apple.14858678ae3f059f",
"source": "New Chat",
"translated": "新建聊天"
},
{
"id": "native.apple.9d87aa7e7862a607",
"source": "Connection",
"translated": "连接"
},
{
"id": "native.apple.7e7c47f471dd2c69",
"source": "Online",
"translated": "在线"
},
{
"id": "native.apple.9e2aea6088887f1f",
"id": "native.apple.02ff27780aad60aa",
"source": "Connecting",
"translated": "正在连接"
},
{
"id": "native.apple.3624978c7d43335a",
"id": "native.apple.b2d0754aab434ea3",
"source": "Needs attention",
"translated": "需要注意"
},
{
"id": "native.apple.7da053dd774cb201",
"id": "native.apple.342c72a01b0f4bb1",
"source": "Offline",
"translated": "离线"
},
{
"id": "native.apple.a4256b2ab523ee60",
"source": "Chat",
"translated": "聊天"
"id": "native.apple.9fc7dfa0dccea003",
"source": "Pinned pages stay in the sidebar. Home is always shown.",
"translated": "固定的页面会保留在边栏中。主页始终显示。"
},
{
"id": "native.apple.4bfe6dc45811d50f",
"source": "Pages",
"translated": "页面"
},
{
"id": "native.apple.422767686f219093",
"source": "Done",
"translated": "完成"
},
{
"id": "native.apple.e197e8708ad3b2c8",
"source": "Pinned",
"translated": "已固定"
},
{
"id": "native.apple.098013d7dd8cdfc7",
"source": "Not pinned",
"translated": "未固定"
},
{
"id": "native.apple.64d7dc062ef4cc81",
@@ -15693,46 +15758,21 @@
"source": "Automations",
"translated": "自动化"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "显示侧边栏"
},
{
"id": "native.apple.bb0ea6d61a32c7c2",
"source": "Back to %@",
"translated": "返回 %@"
},
{
"id": "native.apple.72fab75688479b3e",
"source": "Hide Sidebar",
"translated": "隐藏侧边栏"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "显示侧边栏"
},
{
"id": "native.apple.8af43f59602ec0d8",
"source": "Close canvas",
"translated": "关闭画布"
},
{
"id": "native.apple.a1db6ce0aed1d18e",
"source": "Chat, voice active",
"translated": "聊天,语音已开启"
},
{
"id": "native.apple.bda6cfa988e49a75",
"source": "Control",
"translated": "控制"
},
{
"id": "native.apple.3c80f5351055a5f3",
"source": "Agent",
"translated": "代理"
},
{
"id": "native.apple.22d107db5b905ef4",
"source": "Settings",
"translated": "设置"
},
{
"id": "native.apple.8a4751c86aa6fe77",
"source": "Gateway needs attention",
@@ -15794,9 +15834,9 @@
"translated": "实例"
},
{
"id": "native.apple.11fe8b9941954dfb",
"source": "Threads",
"translated": "话题串"
"id": "native.apple.e3e3ce1a79ebbd70",
"source": "Sessions",
"translated": "话"
},
{
"id": "native.apple.253cb2debeb51859",
+243 -203
View File
@@ -10581,7 +10581,7 @@
{
"id": "native.apple.463a0c3fc0724429",
"source": "Tokens",
"translated": "權杖"
"translated": "詞元"
},
{
"id": "native.apple.509cb464bd3190dd",
@@ -10869,9 +10869,9 @@
"translated": "你想要處理什麼?"
},
{
"id": "native.apple.4da775013ac9b123",
"source": "The thread attaches once the gateway is ready.",
"translated": "Gateway 準備就緒後,將連結此討論串。"
"id": "native.apple.ed7f703a8809b564",
"source": "The session attaches once the gateway is ready.",
"translated": "Gateway 準備就緒後,工作階段便會連線。"
},
{
"id": "native.apple.02611ddddef7295a",
@@ -10919,9 +10919,9 @@
"translated": "新增工作階段選項…"
},
{
"id": "native.apple.003b25ddafeb18e9",
"source": "Threads…",
"translated": "討論串…"
"id": "native.apple.a1b0d289758e2213",
"source": "Sessions…",
"translated": "工作階段…"
},
{
"id": "native.apple.17c13312e7532c89",
@@ -11084,14 +11084,14 @@
"translated": "建立"
},
{
"id": "native.apple.31d5c7287cfb3abe",
"source": "Delete Thread?",
"translated": "刪除討論串嗎"
"id": "native.apple.e7382c53c7dd48f7",
"source": "Delete Session?",
"translated": "刪除工作階段"
},
{
"id": "native.apple.d3395564809f1120",
"source": "Delete Thread",
"translated": "刪除討論串"
"id": "native.apple.702fd8b48da56065",
"source": "Delete Session",
"translated": "刪除工作階段"
},
{
"id": "native.apple.9b1aed19568a048e",
@@ -11099,9 +11099,9 @@
"translated": "取消"
},
{
"id": "native.apple.092659256d26cb03",
"source": "This permanently deletes the thread and its transcript.",
"translated": "這會永久刪除討論串及其對話記錄。"
"id": "native.apple.61f3f19ea24c6012",
"source": "This permanently deletes the session and its transcript.",
"translated": "這會永久刪除工作階段及其對話記錄。"
},
{
"id": "native.apple.0965d8d2429c3b9f",
@@ -11129,9 +11129,9 @@
"translated": "新增群組"
},
{
"id": "native.apple.683032464c497bbd",
"source": "Rename Thread",
"translated": "重新命名討論串"
"id": "native.apple.cd368674179237a0",
"source": "Rename Session",
"translated": "重新命名工作階段"
},
{
"id": "native.apple.31424500c53d6c32",
@@ -11139,15 +11139,55 @@
"translated": "群組名稱"
},
{
"id": "native.apple.f887aa956588f237",
"source": "Thread name",
"translated": "討論串名稱"
"id": "native.apple.8b54306971cfa8c9",
"source": "Session name",
"translated": "工作階段名稱"
},
{
"id": "native.apple.e8018adcccaa2a4d",
"source": "View More",
"translated": "查看更多"
},
{
"id": "native.apple.e3ef1aa93156bd67",
"source": "Live",
"translated": "Live"
},
{
"id": "native.apple.bdfc040fb974b4aa",
"source": "Unread",
"translated": "未讀"
},
{
"id": "native.apple.6f94924c0a736fcf",
"source": "Tokens",
"translated": "詞元"
},
{
"id": "native.apple.bec8b61a3a29b59a",
"source": "Opens Sessions",
"translated": "開啟工作階段"
},
{
"id": "native.apple.69279daa342241c1",
"source": "Pending approvals",
"translated": "待處理的核准"
},
{
"id": "native.apple.48af1bbb4fd06321",
"source": "Automation issues",
"translated": "Automation issues"
},
{
"id": "native.apple.3e4f2dd3a0d41b97",
"source": "31-day usage",
"translated": "31-day usage"
},
{
"id": "native.apple.c334a60ae7b4d508",
"source": "Opens Usage",
"translated": "Opens Usage"
},
{
"id": "native.apple.65fb4d9ce6e5bbda",
"source": "Gateway settings",
@@ -11179,14 +11219,14 @@
"translated": "代理程式"
},
{
"id": "native.apple.7c8231b7b1ca480f",
"source": "Agent thread",
"translated": "代理程式討論串"
"id": "native.apple.789d5d0790fd18ca",
"source": "Agent session",
"translated": "代理程式工作階段"
},
{
"id": "native.apple.b3c553614f762a58",
"source": "Recent threads",
"translated": "最近的討論串"
"id": "native.apple.ee45dce4a2e44737",
"source": "Recent sessions",
"translated": "最近的工作階段"
},
{
"id": "native.apple.9161ca3c61de6cc7",
@@ -11194,9 +11234,9 @@
"translated": "Gateway 離線"
},
{
"id": "native.apple.5aa32afda85064ea",
"source": "No recent threads",
"translated": "沒有最近的討論串"
"id": "native.apple.c97e0382e578a2f7",
"source": "No recent sessions",
"translated": "沒有最近的工作階段"
},
{
"id": "native.apple.79937d7781fb65ae",
@@ -11253,6 +11293,11 @@
"source": "Direct chat",
"translated": "直接聊天"
},
{
"id": "native.apple.7a39e0991fa3cd53",
"source": "just now",
"translated": "just now"
},
{
"id": "native.apple.dbd48d25920f342b",
"source": "%@ on %@",
@@ -11294,14 +11339,14 @@
"translated": "取消"
},
{
"id": "native.apple.b6855cf19a50f477",
"source": "Threads",
"translated": "討論串"
"id": "native.apple.7a6511a467e34f69",
"source": "Sessions",
"translated": "工作階段"
},
{
"id": "native.apple.9b1d0ef27a1333b0",
"source": "Archived threads",
"translated": "已封存的討論串"
"id": "native.apple.e6b8913014b64f0a",
"source": "Archived sessions",
"translated": "已封存的工作階段"
},
{
"id": "native.apple.bc8e64efb095a625",
@@ -11309,34 +11354,34 @@
"translated": "顯示已封存"
},
{
"id": "native.apple.98167401c7267735",
"source": "Threads unavailable",
"translated": "無法使用討論串"
"id": "native.apple.119433782518f199",
"source": "Sessions unavailable",
"translated": "無法使用工作階段"
},
{
"id": "native.apple.4d28a7def2337b9f",
"source": "Loading archived threads",
"translated": "正在載入已封存的討論串"
"id": "native.apple.9882fbadac3bea03",
"source": "Loading archived sessions",
"translated": "正在載入已封存的工作階段"
},
{
"id": "native.apple.777d7b706933bd7b",
"source": "Loading recent threads",
"translated": "正在載入最近的討論串"
"id": "native.apple.16dca1cfac8a571b",
"source": "Loading recent sessions",
"translated": "正在載入最近的工作階段"
},
{
"id": "native.apple.22f81ea94bef8410",
"source": "^[\\(count) thread](inflect: true)",
"translated": "^[\\(count) 個討論串](inflect: true)"
"id": "native.apple.207dad20d09f3160",
"source": "^[\\(count) session](inflect: true)",
"translated": "^[\\(count) 個工作階段](inflect: true)"
},
{
"id": "native.apple.1cad51e14db59bf9",
"source": "No archived threads",
"translated": "沒有已封存的討論串"
"id": "native.apple.a0b4091bf77d4060",
"source": "No archived sessions",
"translated": "沒有已封存的工作階段"
},
{
"id": "native.apple.18ef832d3a7ddcf8",
"source": "Archived threads will appear here.",
"translated": "已封存的討論串會顯示在這裡。"
"id": "native.apple.acfdf5c72e289736",
"source": "Archived sessions will appear here.",
"translated": "已封存的工作階段會顯示在這裡。"
},
{
"id": "native.apple.e8e8cea7ec44fe08",
@@ -11419,9 +11464,9 @@
"translated": "分享接收"
},
{
"id": "native.apple.21d9208d86a4d1fe",
"source": "Loading threads",
"translated": "正在載入討論串"
"id": "native.apple.4c5b2ecf243cfbbc",
"source": "Loading sessions",
"translated": "正在載入工作階段"
},
{
"id": "native.apple.48655128d0a34e44",
@@ -11429,19 +11474,19 @@
"translated": "正在從 Gateway 擷取最近活動。"
},
{
"id": "native.apple.4be1f79aa2b230ff",
"source": "Threads unavailable",
"translated": "無法使用討論串"
"id": "native.apple.c4479934c65c973c",
"source": "Sessions unavailable",
"translated": "工作階段無法使用"
},
{
"id": "native.apple.98b348873556bc46",
"source": "No recent threads",
"translated": "沒有最近的討論串"
"id": "native.apple.6e67b64954ba3002",
"source": "No recent sessions",
"translated": "沒有最近的工作階段"
},
{
"id": "native.apple.7396d205574d279f",
"source": "Thread activity offline",
"translated": "討論串活動已離線"
"id": "native.apple.5dce07848bec08b5",
"source": "Session activity offline",
"translated": "工作階段活動已離線"
},
{
"id": "native.apple.e3586d8a603f67e0",
@@ -11899,9 +11944,9 @@
"translated": "卡片"
},
{
"id": "native.apple.c9ec1b0e18074d8a",
"source": "Open Thread",
"translated": "開啟討論串"
"id": "native.apple.3edbccb7c14b693c",
"source": "Open Session",
"translated": "開啟工作階段"
},
{
"id": "native.apple.a2732e4ff77a201b",
@@ -12103,91 +12148,6 @@
"source": "Offline",
"translated": "離線"
},
{
"id": "native.apple.a2d8e7b4dba29764",
"source": "Control",
"translated": "控制"
},
{
"id": "native.apple.597471e86dda3d38",
"source": "Opens Settings / Gateway",
"translated": "開啟 Settings / Gateway"
},
{
"id": "native.apple.ed16c9793f468dcd",
"source": "Agent chat and recent work.",
"translated": "代理聊天與近期工作。"
},
{
"id": "native.apple.a03e961ab14ba060",
"source": "Overview",
"translated": "總覽"
},
{
"id": "native.apple.feb28c9cba676ba2",
"source": "Instances",
"translated": "執行個體"
},
{
"id": "native.apple.3f2726ccd1acd987",
"source": "Files",
"translated": "檔案"
},
{
"id": "native.apple.614c9b40919fb103",
"source": "Dreaming",
"translated": "Dreaming"
},
{
"id": "native.apple.e2b5c2d7c5d461a3",
"source": "Usage",
"translated": "使用量"
},
{
"id": "native.apple.f21bf1e3b5ec896c",
"source": "Automations",
"translated": "自動化"
},
{
"id": "native.apple.57587fec1ca582ec",
"source": "Default Agent",
"translated": "預設代理程式"
},
{
"id": "native.apple.e0e99a802f07cc68",
"source": "Gateway",
"translated": "Gateway"
},
{
"id": "native.apple.731e5fccde7cbc86",
"source": "Gateway %1$@, %2$@, %3$@",
"translated": "Gateway %1$@、%2$@、%3$@"
},
{
"id": "native.apple.ab0a315f69e3d5df",
"source": "Gateway %1$@, %2$@",
"translated": "Gateway %1$@%2$@"
},
{
"id": "native.apple.01ad746119fbc27d",
"source": "Online",
"translated": "線上"
},
{
"id": "native.apple.e253ef19f6e53371",
"source": "Connecting",
"translated": "連線中"
},
{
"id": "native.apple.6f28b07ebdc2b25d",
"source": "Attention",
"translated": "注意"
},
{
"id": "native.apple.1c931bcd1cd20334",
"source": "Offline",
"translated": "離線"
},
{
"id": "native.apple.65602c216b89032d",
"source": "Channels / Integrations",
@@ -12988,6 +12948,16 @@
"source": "System follows this devices appearance setting.",
"translated": "系統會遵循此裝置的外觀設定。"
},
{
"id": "native.apple.6d48137a8f6a5e96",
"source": "Sidebar Agents",
"translated": "側邊欄代理程式"
},
{
"id": "native.apple.69cccbdee0bb0b56",
"source": "How many agents the sidebar lists before the switcher menu.",
"translated": "側邊欄在切換選單前列出的代理程式數量。"
},
{
"id": "native.apple.70eca66c79335a6e",
"source": "Connection",
@@ -13389,9 +13359,9 @@
"translated": "預設"
},
{
"id": "native.apple.f4ae5664c3eda95d",
"source": "Used for new Chat threads and Talk sessions.",
"translated": "用於新的聊天討論串和對話工作階段。"
"id": "native.apple.6805480889265026",
"source": "Used for new Chat and Talk sessions.",
"translated": "用於新的聊天和通話工作階段。"
},
{
"id": "native.apple.19552e71de246322",
@@ -15624,39 +15594,134 @@
"translated": "unknown relay error"
},
{
"id": "native.apple.c23d35de8d70863f",
"id": "native.apple.8855710a55de2ed5",
"source": "OpenClaw",
"translated": "OpenClaw"
},
{
"id": "native.apple.9e781c0183b79a76",
"source": "OpenClaw %@",
"translated": "OpenClaw %@"
"id": "native.apple.7029e1235380a92c",
"source": "Settings",
"translated": "設定"
},
{
"id": "native.apple.f4eea6473f43388d",
"id": "native.apple.7042a7d70a7e5a20",
"source": "Hide Sidebar",
"translated": "隱藏側邊欄"
},
{
"id": "native.apple.e779847164babc29",
"source": "Selected",
"translated": "已選取"
},
{
"id": "native.apple.698c71602b569378",
"source": "More Agents",
"translated": "更多代理程式"
},
{
"id": "native.apple.94772cbd85c42e6e",
"source": "Search sessions",
"translated": "Search sessions"
},
{
"id": "native.apple.38e1e910f0958067",
"source": "Clear session search",
"translated": "Clear session search"
},
{
"id": "native.apple.58248484e54174e3",
"source": "Loading sessions",
"translated": "Loading sessions"
},
{
"id": "native.apple.dfb5cbd55893c4e5",
"source": "No recent sessions",
"translated": "No recent sessions"
},
{
"id": "native.apple.01a4c3f6192bb1a3",
"source": "Recent",
"translated": "最近使用"
},
{
"id": "native.apple.c0a4d120556df169",
"source": "All Sessions…",
"translated": "All Sessions…"
},
{
"id": "native.apple.aa7c4ecffd2ba36a",
"source": "Edit Pages",
"translated": "編輯頁面"
},
{
"id": "native.apple.4d724d2e5731583d",
"source": "Home",
"translated": "首頁"
},
{
"id": "native.apple.3995f7f73d1ded5f",
"source": "Unread",
"translated": "未讀"
},
{
"id": "native.apple.b4567540cbcaf944",
"source": "Attention",
"translated": "需要注意"
},
{
"id": "native.apple.14858678ae3f059f",
"source": "New Chat",
"translated": "新聊天"
},
{
"id": "native.apple.9d87aa7e7862a607",
"source": "Connection",
"translated": "連線"
},
{
"id": "native.apple.7e7c47f471dd2c69",
"source": "Online",
"translated": "線上"
},
{
"id": "native.apple.9e2aea6088887f1f",
"id": "native.apple.02ff27780aad60aa",
"source": "Connecting",
"translated": "正在連線"
"translated": "連線"
},
{
"id": "native.apple.3624978c7d43335a",
"id": "native.apple.b2d0754aab434ea3",
"source": "Needs attention",
"translated": "需要注意"
},
{
"id": "native.apple.7da053dd774cb201",
"id": "native.apple.342c72a01b0f4bb1",
"source": "Offline",
"translated": "離線"
},
{
"id": "native.apple.a4256b2ab523ee60",
"source": "Chat",
"translated": "聊天"
"id": "native.apple.9fc7dfa0dccea003",
"source": "Pinned pages stay in the sidebar. Home is always shown.",
"translated": "已釘選的頁面會保留在側邊欄中。首頁會一律顯示。"
},
{
"id": "native.apple.4bfe6dc45811d50f",
"source": "Pages",
"translated": "Pages"
},
{
"id": "native.apple.422767686f219093",
"source": "Done",
"translated": "完成"
},
{
"id": "native.apple.e197e8708ad3b2c8",
"source": "Pinned",
"translated": "已釘選"
},
{
"id": "native.apple.098013d7dd8cdfc7",
"source": "Not pinned",
"translated": "未釘選"
},
{
"id": "native.apple.64d7dc062ef4cc81",
@@ -15693,46 +15758,21 @@
"source": "Automations",
"translated": "自動化"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "顯示側邊欄"
},
{
"id": "native.apple.bb0ea6d61a32c7c2",
"source": "Back to %@",
"translated": "返回 %@"
},
{
"id": "native.apple.72fab75688479b3e",
"source": "Hide Sidebar",
"translated": "隱藏側邊欄"
},
{
"id": "native.apple.20f4753fc51c5341",
"source": "Show Sidebar",
"translated": "顯示側邊欄"
},
{
"id": "native.apple.8af43f59602ec0d8",
"source": "Close canvas",
"translated": "關閉畫布"
},
{
"id": "native.apple.a1db6ce0aed1d18e",
"source": "Chat, voice active",
"translated": "聊天,語音已開啟"
},
{
"id": "native.apple.bda6cfa988e49a75",
"source": "Control",
"translated": "控制"
},
{
"id": "native.apple.3c80f5351055a5f3",
"source": "Agent",
"translated": "代理"
},
{
"id": "native.apple.22d107db5b905ef4",
"source": "Settings",
"translated": "設定"
},
{
"id": "native.apple.8a4751c86aa6fe77",
"source": "Gateway needs attention",
@@ -15794,9 +15834,9 @@
"translated": "執行個體"
},
{
"id": "native.apple.11fe8b9941954dfb",
"source": "Threads",
"translated": "討論串"
"id": "native.apple.e3e3ce1a79ebbd70",
"source": "Sessions",
"translated": "工作階段"
},
{
"id": "native.apple.253cb2debeb51859",
@@ -283,7 +283,7 @@
<string name="native_2cd62f7a670b2819" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"محادثة OpenClaw"</string>
<string name="native_2d4dfe885f84629e" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"السماح بالوصول إلى مكتبة الصور."</string>
<string name="native_2d6416405eb44982" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"حلّ رد سابق هذه الموافقة بالفعل."</string>
<string name="native_2d85de9d56c226e4" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"لا توجد محادثات أخيرة"</string>
<string name="native_2d85de9d56c226e4" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"لا توجد سلاسل محادثات حديثة"</string>
<string name="native_2df01a03ff43400b" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"لا توجد نتائج مطابقة"</string>
<string name="native_2df30b117ad829ab" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"قراءة إشعارات التطبيقات المحددة"</string>
<string name="native_2e0078a8322d6f1f" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"التوفر غير معروف"</string>
@@ -283,7 +283,7 @@
<string name="native_2cd62f7a670b2819" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"OpenClaw-Thread"</string>
<string name="native_2d4dfe885f84629e" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Zugriff auf die Fotomediathek erlauben."</string>
<string name="native_2d6416405eb44982" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Eine frühere Antwort hat diese Genehmigung bereits bearbeitet."</string>
<string name="native_2d85de9d56c226e4" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Keine kürzlich verwendeten Threads"</string>
<string name="native_2d85de9d56c226e4" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Keine aktuellen Threads"</string>
<string name="native_2df01a03ff43400b" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Keine Übereinstimmungen"</string>
<string name="native_2df30b117ad829ab" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Benachrichtigungen ausgewählter Apps lesen"</string>
<string name="native_2e0078a8322d6f1f" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Verfügbarkeit unbekannt"</string>
@@ -283,7 +283,7 @@
<string name="native_2cd62f7a670b2819" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"گفتگوی OpenClaw"</string>
<string name="native_2d4dfe885f84629e" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"اجازه دسترسی به کتابخانه عکس را بدهید."</string>
<string name="native_2d6416405eb44982" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"پاسخ قبلی این تأیید را حل کرده است."</string>
<string name="native_2d85de9d56c226e4" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"هیچ رشته اخیری وجود ندارد"</string>
<string name="native_2d85de9d56c226e4" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"رشته اخیری وجود ندارد"</string>
<string name="native_2df01a03ff43400b" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"موردی یافت نشد"</string>
<string name="native_2df30b117ad829ab" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"خواندن اعلان‌های برنامه‌های انتخاب‌شده"</string>
<string name="native_2e0078a8322d6f1f" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"وضعیت دسترسی نامشخص است"</string>
@@ -371,7 +371,7 @@
<string name="native_3a65cf1204f18864" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"متصل (گره آفلاین است)"</string>
<string name="native_3a78695388b38b5c" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"خانه"</string>
<string name="native_3b28b535950f8175" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"دیکته در حال شنیدن است"</string>
<string name="native_3b46b7912670bfb0" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"هیچ رشته بایگانی‌شده‌ای وجود ندارد"</string>
<string name="native_3b46b7912670bfb0" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"رشته بایگانی‌شده‌ای وجود ندارد"</string>
<string name="native_3b851469ea31d489" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"دستیارهای موجود در این Gateway را انتخاب و بررسی کنید."</string>
<string name="native_3be0085a6bd88cdd" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"حالت گفت‌وگو فعال است"</string>
<string name="native_3bee4ede6bf4436c" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"در حال کار · ۱ اجرای فعال"</string>
@@ -1149,7 +1149,7 @@
<string name="native_c2c631adbec7a8e3" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"اگر Gateway در دسترس باشد، اتصال مجدد باید بدون مداخله تکمیل شود."</string>
<string name="native_c2d60919f955cd83" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"نوبت عامل"</string>
<string name="native_c2d66755e6d0b42f" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"قرنطینه"</string>
<string name="native_c2eb8cd9d9564314" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"توجه"</string>
<string name="native_c2eb8cd9d9564314" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"نیازمند توجه"</string>
<string name="native_c31723ab330289fe" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"در حال جستجو…"</string>
<string name="native_c34dd5eb8b0af56e" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"کد راه‌اندازی را از کجا دریافت کنم؟"</string>
<string name="native_c3546b39ecbbed8a" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"فعال‌کردن مهارت ممکن نبود."</string>
@@ -283,7 +283,7 @@
<string name="native_2cd62f7a670b2819" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Fil OpenClaw"</string>
<string name="native_2d4dfe885f84629e" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Autoriser laccès à la photothèque."</string>
<string name="native_2d6416405eb44982" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Une réponse précédente a déjà résolu cette approbation."</string>
<string name="native_2d85de9d56c226e4" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Aucun fil récent"</string>
<string name="native_2d85de9d56c226e4" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Aucun fil de discussion récent"</string>
<string name="native_2df01a03ff43400b" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Aucun résultat"</string>
<string name="native_2df30b117ad829ab" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Lire les notifications des applications sélectionnées"</string>
<string name="native_2e0078a8322d6f1f" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Disponibilité inconnue"</string>
@@ -243,7 +243,7 @@
<string name="native_262c897a1f408b0b" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"अपने Gateway से कनेक्ट करें"</string>
<string name="native_2682bd813a3bccbc" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"openclaw qr से सेटअप कोड दर्ज करें।"</string>
<string name="native_268f14bbfe119c1e" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"डायग्नोस्टिक्स"</string>
<string name="native_26d00d15c465cd73" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"यह थ्रेड और इसकी ट्रांसक्रिप्ट को स्थायी रूप से हटा देता है।"</string>
<string name="native_26d00d15c465cd73" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"यह थ्रेड और इसकी प्रतिलिपि को स्थायी रूप से हटा देता है।"</string>
<string name="native_26e47d73a55d7fa7" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"डिवाइस स्वीकृत किया गया।"</string>
<string name="native_26f0dd993530eb2d" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"अपने-आप फिर से प्रयास किया जा रहा है"</string>
<string name="native_270ff82f36da987f" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"विजेट इमेज कॉपी की गई"</string>
@@ -92,7 +92,7 @@
<string name="native_0c79a9c222840ed0" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Applicato"</string>
<string name="native_0cab1c9617404faf" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"video"</string>
<string name="native_0cf04463c4276a62" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Promosso"</string>
<string name="native_0d21bd52022ca7f7" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Online"</string>
<string name="native_0d21bd52022ca7f7" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Connesso"</string>
<string name="native_0d5644ff52ce2ba3" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Ambiti"</string>
<string name="native_0d5efd432e4fedf5" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Il provider vocale in tempo reale non è configurato."</string>
<string name="native_0d8ca811c3744a6d" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"%1$s · %2$s"</string>
@@ -283,7 +283,7 @@
<string name="native_2cd62f7a670b2819" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Conversazione OpenClaw"</string>
<string name="native_2d4dfe885f84629e" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Consenti l\'accesso alla libreria foto."</string>
<string name="native_2d6416405eb44982" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Una risposta precedente ha già risolto questa approvazione."</string>
<string name="native_2d85de9d56c226e4" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Nessuna conversazione recente"</string>
<string name="native_2d85de9d56c226e4" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Nessun thread recente"</string>
<string name="native_2df01a03ff43400b" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Nessuna corrispondenza"</string>
<string name="native_2df30b117ad829ab" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Leggi le notifiche delle app selezionate"</string>
<string name="native_2e0078a8322d6f1f" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Disponibilità sconosciuta"</string>
@@ -371,7 +371,7 @@
<string name="native_3a65cf1204f18864" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Connesso (nodo offline)"</string>
<string name="native_3a78695388b38b5c" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Home"</string>
<string name="native_3b28b535950f8175" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"La dettatura è in ascolto"</string>
<string name="native_3b46b7912670bfb0" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Nessuna conversazione archiviata"</string>
<string name="native_3b46b7912670bfb0" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Nessun thread archiviato"</string>
<string name="native_3b851469ea31d489" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Scegli e ispeziona gli assistenti disponibili su questo Gateway."</string>
<string name="native_3be0085a6bd88cdd" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Modalità conversazione attiva"</string>
<string name="native_3bee4ede6bf4436c" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"In esecuzione · 1 esecuzione attiva"</string>
@@ -971,7 +971,7 @@
<string name="native_a10a36fa109818be" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Cerca app"</string>
<string name="native_a12db0cfcad2e5f0" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"1 modello configurato"</string>
<string name="native_a135dd52de0ce45a" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Ignora avviso di approvazione"</string>
<string name="native_a1794783aab72d20" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Offline"</string>
<string name="native_a1794783aab72d20" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Non in linea"</string>
<string name="native_a181b2c15994a7fc" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Provider vocale"</string>
<string name="native_a190013f72efad35" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"L\'approvazione del Gateway è in corso. OpenClaw riproverà automaticamente."</string>
<string name="native_a1a5936d3b0f8a69" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Massimo"</string>
@@ -243,7 +243,7 @@
<string name="native_262c897a1f408b0b" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Gateway에 연결"</string>
<string name="native_2682bd813a3bccbc" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"openclaw qr의 설정 코드를 입력하세요."</string>
<string name="native_268f14bbfe119c1e" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"진단"</string>
<string name="native_26d00d15c465cd73" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"스레드와 대화 기록이 영구적으로 삭제니다."</string>
<string name="native_26d00d15c465cd73" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"이 작업은 스레드와 해당 대화 내용을 영구적으로 삭제니다."</string>
<string name="native_26e47d73a55d7fa7" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"기기가 승인되었습니다."</string>
<string name="native_26f0dd993530eb2d" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"자동으로 다시 시도 중"</string>
<string name="native_270ff82f36da987f" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"위젯 이미지가 복사되었습니다"</string>
@@ -371,7 +371,7 @@
<string name="native_3a65cf1204f18864" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Verbonden (node offline)"</string>
<string name="native_3a78695388b38b5c" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Start"</string>
<string name="native_3b28b535950f8175" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Dicteren luistert"</string>
<string name="native_3b46b7912670bfb0" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Geen gearchiveerde threads"</string>
<string name="native_3b46b7912670bfb0" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Geen gearchiveerde gesprekken"</string>
<string name="native_3b851469ea31d489" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Kies en inspecteer de assistenten die beschikbaar zijn op deze Gateway."</string>
<string name="native_3be0085a6bd88cdd" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Praatmodus actief"</string>
<string name="native_3bee4ede6bf4436c" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Bezig · 1 actieve uitvoering"</string>
@@ -243,7 +243,7 @@
<string name="native_262c897a1f408b0b" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Подключитесь к вашему Gateway"</string>
<string name="native_2682bd813a3bccbc" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Введите код настройки из openclaw qr."</string>
<string name="native_268f14bbfe119c1e" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Диагностика"</string>
<string name="native_26d00d15c465cd73" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Это действие безвозвратно удалит ветку и её расшифровку."</string>
<string name="native_26d00d15c465cd73" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Это навсегда удалит ветку и её историю."</string>
<string name="native_26e47d73a55d7fa7" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Устройство одобрено."</string>
<string name="native_26f0dd993530eb2d" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Автоматическая повторная попытка"</string>
<string name="native_270ff82f36da987f" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Изображение виджета скопировано"</string>
@@ -1149,7 +1149,7 @@
<string name="native_c2c631adbec7a8e3" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Если Gateway доступен, повторное подключение завершится без вмешательства."</string>
<string name="native_c2d60919f955cd83" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Ход агента"</string>
<string name="native_c2d66755e6d0b42f" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"поместить в карантин"</string>
<string name="native_c2eb8cd9d9564314" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Внимание"</string>
<string name="native_c2eb8cd9d9564314" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Требует внимания"</string>
<string name="native_c31723ab330289fe" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Поиск…"</string>
<string name="native_c34dd5eb8b0af56e" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Где получить код настройки?"</string>
<string name="native_c3546b39ecbbed8a" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Не удалось включить навык."</string>
@@ -243,7 +243,7 @@
<string name="native_262c897a1f408b0b" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Anslut till din Gateway"</string>
<string name="native_2682bd813a3bccbc" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Ange konfigurationskoden från openclaw qr."</string>
<string name="native_268f14bbfe119c1e" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Diagnostik"</string>
<string name="native_26d00d15c465cd73" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Detta raderar tråden och dess transkription permanent."</string>
<string name="native_26d00d15c465cd73" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Detta tar permanent bort tråden och dess transkription."</string>
<string name="native_26e47d73a55d7fa7" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Enheten har godkänts."</string>
<string name="native_26f0dd993530eb2d" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Försöker igen automatiskt"</string>
<string name="native_270ff82f36da987f" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Widgetbilden har kopierats"</string>
@@ -369,7 +369,7 @@
<string name="native_3a386d2bb69adffc" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"OC"</string>
<string name="native_3a5ecca188c0579c" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"อัปเดตแล้ว"</string>
<string name="native_3a65cf1204f18864" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"เชื่อมต่อแล้ว (โหนดออฟไลน์)"</string>
<string name="native_3a78695388b38b5c" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"หน้าแรก"</string>
<string name="native_3a78695388b38b5c" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"หน้าหลัก"</string>
<string name="native_3b28b535950f8175" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"การป้อนตามคำบอกกำลังฟังอยู่"</string>
<string name="native_3b46b7912670bfb0" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"ไม่มีเธรดที่เก็บถาวร"</string>
<string name="native_3b851469ea31d489" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"เลือกและตรวจสอบผู้ช่วยที่พร้อมใช้งานบน gateway นี้"</string>
@@ -243,7 +243,7 @@
<string name="native_262c897a1f408b0b" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Gateway\'nize bağlanın"</string>
<string name="native_2682bd813a3bccbc" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"openclaw qr tarafından oluşturulan kurulum kodunu girin."</string>
<string name="native_268f14bbfe119c1e" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Tanılama"</string>
<string name="native_26d00d15c465cd73" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Bu işlem, iş parçacığını ve dökümünü kalıcı olarak siler."</string>
<string name="native_26d00d15c465cd73" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Bu işlem, konu dizisini ve dökümünü kalıcı olarak siler."</string>
<string name="native_26e47d73a55d7fa7" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Cihaz onaylandı."</string>
<string name="native_26f0dd993530eb2d" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Otomatik olarak yeniden deneniyor"</string>
<string name="native_270ff82f36da987f" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Widget görseli kopyalandı"</string>
@@ -283,7 +283,7 @@
<string name="native_2cd62f7a670b2819" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"OpenClaw konusu"</string>
<string name="native_2d4dfe885f84629e" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Fotoğraf arşivine erişime izin verin."</string>
<string name="native_2d6416405eb44982" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Önceki bir yanıt bu onayı zaten çözdü."</string>
<string name="native_2d85de9d56c226e4" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Son iş parçacığı yok"</string>
<string name="native_2d85de9d56c226e4" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Son iletişim dizisi yok"</string>
<string name="native_2df01a03ff43400b" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Eşleşme yok"</string>
<string name="native_2df30b117ad829ab" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Seçilen uygulamaların bildirimlerini oku"</string>
<string name="native_2e0078a8322d6f1f" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Kullanılabilirlik bilinmiyor"</string>
@@ -383,7 +383,7 @@
<string name="native_3da4811eafea080a" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"%1$s://%2$s:%3$s"</string>
<string name="native_3de3d401128d4395" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Onay ayrıntıları yüklenemedi. Yenileyip tekrar deneyin."</string>
<string name="native_3e398e6fb979557a" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Tool Call"</string>
<string name="native_3e42e385075b9b56" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Diziler"</string>
<string name="native_3e42e385075b9b56" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Mesaj dizileri"</string>
<string name="native_3f00927a719345ed" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Write"</string>
<string name="native_3f25ccebfa99dcf3" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Bir istemle başlayın veya sesinizi kullanın."</string>
<string name="native_3f39d5c348e5b79d" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"D"</string>
@@ -636,7 +636,7 @@
<string name="native_684889f0079cc145" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"SHA-256 parmak izi"</string>
<string name="native_68944e10a8b4b9be" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Henüz konu dizisi yok"</string>
<string name="native_68a0cdfcc76d6ebd" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Bluetooth mikrofonu"</string>
<string name="native_690dbe9dc0993c42" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Son"</string>
<string name="native_690dbe9dc0993c42" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Son Kullanılanlar"</string>
<string name="native_6930c8d1fc4f01d9" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Konuyu yeniden adlandır"</string>
<string name="native_69384c1c4d99f6eb" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Çözüm sonucu bilinmiyor. Gateway kaydı doğrulanana kadar eylemler devre dışı kalır."</string>
<string name="native_6940189433657105" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"dialog"</string>
@@ -283,7 +283,7 @@
<string name="native_2cd62f7a670b2819" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Гілка OpenClaw"</string>
<string name="native_2d4dfe885f84629e" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Дозвольте доступ до фототеки."</string>
<string name="native_2d6416405eb44982" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Попередня відповідь уже вирішила це схвалення."</string>
<string name="native_2d85de9d56c226e4" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Немає недавніх гілок"</string>
<string name="native_2d85de9d56c226e4" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Немає нещодавніх гілок"</string>
<string name="native_2df01a03ff43400b" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Збігів немає"</string>
<string name="native_2df30b117ad829ab" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Читати сповіщення вибраних застосунків"</string>
<string name="native_2e0078a8322d6f1f" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Доступність невідома"</string>
@@ -283,7 +283,7 @@
<string name="native_2cd62f7a670b2819" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Luồng OpenClaw"</string>
<string name="native_2d4dfe885f84629e" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Cho phép truy cập thư viện ảnh."</string>
<string name="native_2d6416405eb44982" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Một phản hồi trước đó đã xử lý phê duyệt này."</string>
<string name="native_2d85de9d56c226e4" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Không có luồng nào gần đây"</string>
<string name="native_2d85de9d56c226e4" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Không có luồng gần đây"</string>
<string name="native_2df01a03ff43400b" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Không có kết quả phù hợp"</string>
<string name="native_2df30b117ad829ab" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Đọc thông báo từ các ứng dụng đã chọn"</string>
<string name="native_2e0078a8322d6f1f" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Không rõ trạng thái khả dụng"</string>
@@ -371,7 +371,7 @@
<string name="native_3a65cf1204f18864" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Đã kết nối (nút đang ngoại tuyến)"</string>
<string name="native_3a78695388b38b5c" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Trang chủ"</string>
<string name="native_3b28b535950f8175" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Tính năng đọc chính tả đang lắng nghe"</string>
<string name="native_3b46b7912670bfb0" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Không có luồng nào đã lưu trữ"</string>
<string name="native_3b46b7912670bfb0" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Không có luồng nào được lưu trữ"</string>
<string name="native_3b851469ea31d489" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Chọn và kiểm tra các trợ lý có sẵn trên gateway này."</string>
<string name="native_3be0085a6bd88cdd" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Chế độ nói đang hoạt động"</string>
<string name="native_3bee4ede6bf4436c" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"Đang hoạt động · 1 lượt chạy đang hoạt động"</string>
@@ -243,7 +243,7 @@
<string name="native_262c897a1f408b0b" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"连接到你的 Gateway"</string>
<string name="native_2682bd813a3bccbc" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"输入 openclaw qr 中的设置代码。"</string>
<string name="native_268f14bbfe119c1e" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"诊断"</string>
<string name="native_26d00d15c465cd73" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"这将永久删除该对话及其对话记录。"</string>
<string name="native_26d00d15c465cd73" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"这将永久删除该对话线程及其记录。"</string>
<string name="native_26e47d73a55d7fa7" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"设备已批准。"</string>
<string name="native_26f0dd993530eb2d" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"正在自动重试"</string>
<string name="native_270ff82f36da987f" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"已复制小组件图片"</string>
@@ -283,7 +283,7 @@
<string name="native_2cd62f7a670b2819" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"OpenClaw 会话"</string>
<string name="native_2d4dfe885f84629e" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"允许访问照片图库。"</string>
<string name="native_2d6416405eb44982" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"先前的响应已处理此批准。"</string>
<string name="native_2d85de9d56c226e4" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"没有最近的话"</string>
<string name="native_2d85de9d56c226e4" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"没有最近的话"</string>
<string name="native_2df01a03ff43400b" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"无匹配项"</string>
<string name="native_2df30b117ad829ab" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"读取所选应用的通知"</string>
<string name="native_2e0078a8322d6f1f" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"可用性未知"</string>
@@ -369,9 +369,9 @@
<string name="native_3a386d2bb69adffc" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"OC"</string>
<string name="native_3a5ecca188c0579c" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"更新时间"</string>
<string name="native_3a65cf1204f18864" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"已连接(节点离线)"</string>
<string name="native_3a78695388b38b5c" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"页"</string>
<string name="native_3a78695388b38b5c" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"页"</string>
<string name="native_3b28b535950f8175" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"正在听写"</string>
<string name="native_3b46b7912670bfb0" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"没有已归档的对话"</string>
<string name="native_3b46b7912670bfb0" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"暂无已归档的对话线程"</string>
<string name="native_3b851469ea31d489" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"选择并检查此 gateway 上可用的助手。"</string>
<string name="native_3be0085a6bd88cdd" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"通话模式已启用"</string>
<string name="native_3bee4ede6bf4436c" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"工作中 · 1 个活跃运行"</string>
@@ -1437,7 +1437,7 @@
<string name="native_f1c3989a92ef10d1" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"扫描二维码以配对"</string>
<string name="native_f2000dce9b5d40c8" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"已拒绝批准。"</string>
<string name="native_f200366d0c4352cb" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"无法检查 Skill Workshop 提案。"</string>
<string name="native_f20c879465551f0d" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"已置顶"</string>
<string name="native_f20c879465551f0d" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"已固定"</string>
<string name="native_f211f2bf832dda14" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"个人资料与设备"</string>
<string name="native_f22e1435c8dfffc1" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"关闭思考级别选择器"</string>
<string name="native_f2316e644b1d2621" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"无法将消息加入队列以供稍后发送。"</string>
@@ -41,7 +41,7 @@
<string name="native_0303e18246708180" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"未連線"</string>
<string name="native_030cab223a806ad6" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"檢查及管理已安裝技能的狀態。"</string>
<string name="native_031a8f0f659df890" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"失敗"</string>
<string name="native_0349070711a2323d" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"預設代理程式"</string>
<string name="native_0349070711a2323d" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"預設 Agent"</string>
<string name="native_03494b0d1f803522" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"相機"</string>
<string name="native_035edd9bd720fa18" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"從群組中移除"</string>
<string name="native_03bd6fca9cf5c1fb" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"正在搜尋"</string>
@@ -853,7 +853,7 @@
<string name="native_8d0839802b4d6aca" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"重新整理記錄"</string>
<string name="native_8d20273207a2fe99" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"openclaw nodes approve %1$s"</string>
<string name="native_8d57374bc09c8756" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"語音訊息 · %1$s"</string>
<string name="native_8d59829c1e15afe1" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"使用量"</string>
<string name="native_8d59829c1e15afe1" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"用量"</string>
<string name="native_8d99e5d18d734856" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"上下文 %1$s%%"</string>
<string name="native_8da844efc33c91b3" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"轉錄語音提示"</string>
<string name="native_8dd6857baf026850" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"靜音"</string>
@@ -1149,7 +1149,7 @@
<string name="native_c2c631adbec7a8e3" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"如果可以連線至 Gateway,應會自動完成重新連線,無需介入。"</string>
<string name="native_c2d60919f955cd83" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"代理執行回合"</string>
<string name="native_c2d66755e6d0b42f" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"隔離"</string>
<string name="native_c2eb8cd9d9564314" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"注意"</string>
<string name="native_c2eb8cd9d9564314" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"需要注意"</string>
<string name="native_c31723ab330289fe" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"搜尋中…"</string>
<string name="native_c34dd5eb8b0af56e" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"如何取得設定代碼?"</string>
<string name="native_c3546b39ecbbed8a" formatted="false" tools:ignore="Typos,TypographyDashes,TypographyEllipsis">"無法啟用技能。"</string>
+6 -3
View File
@@ -4,7 +4,8 @@ OpenClaw follows the native iOS 26 design language while keeping an iOS 18 deplo
## Principles
- Prefer `NavigationStack`, `TabView`, `List`, `Form`, toolbars, sheets, and system controls. They adopt the current platform appearance automatically.
- Prefer `NavigationStack`, `List`, `Form`, toolbars, sheets, and system controls. They adopt the current platform appearance automatically.
- Root navigation uses one black sidebar on every idiom: persistent in wide landscape and a push-reveal layer behind the content on phones, portrait, and narrow layouts.
- Reserve Liquid Glass for navigation and interactive controls. Do not apply glass to every card, row, or status surface.
- Keep content hierarchy clear with typography, spacing, and grouping before adding backgrounds.
- Use semantic colors. Red means destructive or stopped; orange means attention; green means healthy. Neutral actions use the app accent.
@@ -20,6 +21,7 @@ Apple references: [Adopting Liquid Glass](https://developer.apple.com/documentat
- `pagePadding`: standard page gutter
- `cardRadius`: content group radius
- `controlRadius`: inset control radius
- `drawerRadius`: all-corner radius for compact content while the sidebar is revealed
- `compactControlSize`: compact circular control size
- `bottomScrollInset`: clearance above persistent navigation
@@ -33,14 +35,15 @@ Feature-local layout enums may define row heights and grid dimensions, but shoul
- `OpenClawNoticeBanner`: shared connection and runtime notices
- `OpenClawAdaptiveHeaderRow`: responsive destination heading
- `OpenClawGlassControlGroup`: performance and morphing boundary for nearby glass controls
- `OpenClawSidebarPalette`: fixed black-sidebar colors that remain dark in every app appearance
- `OpenClawSidebarRevealButton`, `OpenClawSidebarHeaderLeadingSlot`: shared leading toolbar affordance
- `openClawGlassButton(prominent:tint:)`: iOS 26 glass button with an iOS 18 bordered fallback
- `openClawTabBarBehavior()`: iOS 26 tab-bar minimization with an earlier-system no-op
## Liquid Glass rules
Use `openClawGlassButton` for primary actions, compact header controls, and navigation-adjacent controls. Use the prominent style for one primary action per region. Wrap nearby controls in `OpenClawGlassControlGroup`.
Do not place Liquid Glass behind reading content, forms, metrics, or every card in a scroll view. Excess glass weakens hierarchy, increases rendering cost, and competes with the system tab bar and navigation chrome.
Do not place Liquid Glass behind reading content, forms, metrics, or every card in a scroll view. Excess glass weakens hierarchy, increases rendering cost, and competes with the sidebar and navigation chrome.
Keep new iOS APIs behind `#available(iOS 26.0, *)`. The fallback must preserve the same label, action, tint meaning, accessibility, and approximate hit target.
File diff suppressed because it is too large Load Diff
@@ -4,7 +4,7 @@ import SwiftUI
struct AgentProDreamingDestination: View {
@Environment(NodeAppModel.self) private var appModel
let headerLeadingAction: OpenClawSidebarHeaderAction?
let headerSidebarAction: OpenClawSidebarHeaderAction?
let overview: AgentOverviewSnapshot?
let gatewayConnected: Bool
let overviewLoading: Bool
@@ -62,14 +62,14 @@ struct AgentProDreamingDestination: View {
@ViewBuilder
private var header: some View {
if let headerLeadingAction {
if let headerSidebarAction {
OpenClawAdaptiveHeaderRow(
title: "Dreaming",
subtitle: .localized(self.dreamingDetail),
titleFont: OpenClawType.title3SemiBold,
subtitleFont: OpenClawType.subheadMedium)
{
OpenClawSidebarHeaderLeadingSlot(action: headerLeadingAction)
OpenClawSidebarHeaderLeadingSlot(action: headerSidebarAction)
} accessory: {
EmptyView()
}
@@ -3,7 +3,7 @@ import SwiftUI
import UIKit
struct AgentProNodesDestination: View {
let headerLeadingAction: OpenClawSidebarHeaderAction?
let headerSidebarAction: OpenClawSidebarHeaderAction?
let overview: AgentOverviewSnapshot?
let gatewayConnected: Bool
let agentCount: Int
@@ -36,14 +36,14 @@ struct AgentProNodesDestination: View {
@ViewBuilder
private var header: some View {
if let headerLeadingAction {
if let headerSidebarAction {
OpenClawAdaptiveHeaderRow(
title: "Instances",
subtitle: .verbatim(self.instancesDetail),
titleFont: OpenClawType.title3SemiBold,
subtitleFont: OpenClawType.subheadMedium)
{
OpenClawSidebarHeaderLeadingSlot(action: headerLeadingAction)
OpenClawSidebarHeaderLeadingSlot(action: headerSidebarAction)
} accessory: {
EmptyView()
}
@@ -26,7 +26,7 @@ extension AgentProTab {
var filesDestination: some View {
AgentWorkspaceFilesScreen(
agentId: self.activeAgentID,
headerLeadingAction: self.directHeaderLeadingAction(for: .files))
headerSidebarAction: self.directHeaderSidebarAction(for: .files))
}
var agentsDestination: some View {
@@ -50,15 +50,15 @@ extension AgentProTab {
}
.font(OpenClawType.body)
.toolbar {
if let headerLeadingAction {
ToolbarItem(placement: .topBarLeading) {
OpenClawSidebarHeaderLeadingSlot(action: headerLeadingAction)
}
}
ToolbarItemGroup(placement: .topBarTrailing) {
self.agentFilterMenu
self.gatewayToolbarButton
}
if let headerSidebarAction {
ToolbarItem(placement: .topBarLeading) {
OpenClawSidebarHeaderLeadingSlot(action: headerSidebarAction)
}
}
}
}
@@ -92,7 +92,7 @@ extension AgentProTab {
var instancesDestination: some View {
AgentProNodesDestination(
headerLeadingAction: self.directHeaderLeadingAction(for: .instances),
headerSidebarAction: self.directHeaderSidebarAction(for: .instances),
overview: self.overview,
gatewayConnected: self.gatewayConnected,
agentCount: self.appModel.gatewayAgents.count,
@@ -166,7 +166,7 @@ extension AgentProTab {
var dreamingDestination: some View {
AgentProDreamingDestination(
headerLeadingAction: self.directHeaderLeadingAction(for: .dreaming),
headerSidebarAction: self.directHeaderSidebarAction(for: .dreaming),
overview: self.overview,
gatewayConnected: self.gatewayConnected,
overviewLoading: self.overviewLoading,
@@ -180,14 +180,14 @@ extension AgentProTab {
@ViewBuilder
func directHeader(for route: AgentRoute, title: String, subtitle: String) -> some View {
if let headerLeadingAction = self.directHeaderLeadingAction(for: route) {
if let headerSidebarAction = self.directHeaderSidebarAction(for: route) {
OpenClawAdaptiveHeaderRow(
title: .localized(title),
subtitle: .localized(subtitle),
titleFont: OpenClawType.title3SemiBold,
subtitleFont: OpenClawType.subheadMedium)
{
OpenClawSidebarHeaderLeadingSlot(action: headerLeadingAction)
OpenClawSidebarHeaderLeadingSlot(action: headerSidebarAction)
} accessory: {
EmptyView()
}
@@ -195,8 +195,8 @@ extension AgentProTab {
}
}
func directHeaderLeadingAction(for route: AgentRoute) -> OpenClawSidebarHeaderAction? {
self.directRoute == route ? self.headerLeadingAction : nil
func directHeaderSidebarAction(for route: AgentRoute) -> OpenClawSidebarHeaderAction? {
self.directRoute == route ? self.headerSidebarAction : nil
}
func detailSummaryCard(
@@ -12,8 +12,8 @@ extension AgentProTab {
subtitleFont: OpenClawType.subheadMedium,
subtitleLineLimit: 1)
{
if let headerLeadingAction {
OpenClawSidebarHeaderLeadingSlot(action: headerLeadingAction)
if let headerSidebarAction {
OpenClawSidebarHeaderLeadingSlot(action: headerSidebarAction)
}
} accessory: {
OpenClawGlassControlGroup {
+4 -4
View File
@@ -6,7 +6,7 @@ struct AgentProTab: View {
@Environment(NodeAppModel.self) var appModel
@Environment(\.scenePhase) var scenePhase
let directRoute: AgentRoute?
let headerLeadingAction: OpenClawSidebarHeaderAction?
let headerSidebarAction: OpenClawSidebarHeaderAction?
let headerTitle: String
let openSettings: (() -> Void)?
@State var overview: AgentOverviewSnapshot?
@@ -156,12 +156,12 @@ struct AgentProTab: View {
init(
directRoute: AgentRoute? = nil,
headerLeadingAction: OpenClawSidebarHeaderAction? = nil,
headerSidebarAction: OpenClawSidebarHeaderAction? = nil,
headerTitle: String = "Agents",
openSettings: (() -> Void)? = nil)
{
self.directRoute = directRoute
self.headerLeadingAction = headerLeadingAction
self.headerSidebarAction = headerSidebarAction
self.headerTitle = headerTitle
self.openSettings = openSettings
}
@@ -231,7 +231,7 @@ struct AgentProTab: View {
private func directDestination(for route: AgentRoute) -> some View {
self.destination(for: route)
.toolbar(
route != .agents && self.directHeaderLeadingAction(for: route) != nil ? .hidden : .visible,
route != .agents && self.directHeaderSidebarAction(for: route) != nil ? .hidden : .visible,
for: .navigationBar)
}
}
@@ -7,20 +7,20 @@ import SwiftUI
/// `agents.workspace.list` / `agents.workspace.get` gateway RPCs.
struct AgentWorkspaceFilesScreen: View {
let agentId: String
let headerLeadingAction: OpenClawSidebarHeaderAction?
let headerSidebarAction: OpenClawSidebarHeaderAction?
var body: some View {
ZStack {
OpenClawProBackground()
VStack(alignment: .leading, spacing: 0) {
if let headerLeadingAction {
if let headerSidebarAction {
OpenClawAdaptiveHeaderRow(
title: "Files",
subtitle: .verbatim(self.agentId),
titleFont: OpenClawType.title3SemiBold,
subtitleFont: OpenClawType.subheadMedium)
{
OpenClawSidebarHeaderLeadingSlot(action: headerLeadingAction)
OpenClawSidebarHeaderLeadingSlot(action: headerSidebarAction)
} accessory: {
EmptyView()
}
+18 -7
View File
@@ -47,20 +47,20 @@ struct ChatProTab: View {
@State private var viewModelHasVerifiedOfflineRoutingIdentity = false
@State private var speech: OpenClawChatSpeechController?
@State private var isGatewayStatusManuallyExpanded = false
let headerLeadingAction: OpenClawSidebarHeaderAction?
let headerSidebarAction: OpenClawSidebarHeaderAction?
let headerTitle: String?
let showsAgentBadge: Bool
let ownsNavigationStack: Bool
let openSettings: (() -> Void)?
init(
headerLeadingAction: OpenClawSidebarHeaderAction? = nil,
headerSidebarAction: OpenClawSidebarHeaderAction? = nil,
headerTitle: String? = nil,
showsAgentBadge: Bool = true,
ownsNavigationStack: Bool = true,
openSettings: (() -> Void)? = nil)
{
self.headerLeadingAction = headerLeadingAction
self.headerSidebarAction = headerSidebarAction
self.headerTitle = headerTitle
self.showsAgentBadge = showsAgentBadge
self.ownsNavigationStack = ownsNavigationStack
@@ -82,6 +82,7 @@ struct ChatProTab: View {
.task {
await self.appModel.restoreChatSessionRoutingIdentityIfNeeded()
self.syncChatViewModel()
await self.handleNewChatRequest(self.appModel.newChatRequestID)
if self.speech == nil {
let gateway = self.appModel.operatorSession
self.speech = OpenClawChatSpeechController { text in
@@ -125,6 +126,9 @@ struct ChatProTab: View {
self.syncChatViewModel()
self.viewModel?.refresh()
}
.onChange(of: self.appModel.newChatRequestID) { _, requestID in
Task { await self.handleNewChatRequest(requestID) }
}
}
private var content: some View {
@@ -133,9 +137,9 @@ struct ChatProTab: View {
.navigationTitle(self.showsAgentBadge ? "" : self.headerDisplayTitle)
.navigationBarTitleDisplayMode(.inline)
.toolbar {
if let headerLeadingAction {
if let headerSidebarAction {
ToolbarItem(placement: .topBarLeading) {
OpenClawSidebarRevealButton(action: headerLeadingAction)
OpenClawSidebarRevealButton(action: headerSidebarAction)
}
}
if self.showsAgentBadge {
@@ -229,7 +233,7 @@ struct ChatProTab: View {
ContentUnavailableView(
"Preparing Chat",
systemImage: "bubble.left.and.bubble.right",
description: Text("The thread attaches once the gateway is ready.")
description: Text("The session attaches once the gateway is ready.")
.font(OpenClawType.body))
}
}
@@ -457,6 +461,13 @@ struct ChatProTab: View {
}
}
private func handleNewChatRequest(_ requestID: Int) async {
guard let viewModel,
self.appModel.consumeNewChatRequest(requestID)
else { return }
_ = await viewModel.startNewSession()
}
private func captureCurrentPresentationIdentity() {
self.viewModelPresentationAgentID = self.currentAgentID
self.viewModelPresentationAgentName = self.currentAgentDisplayName
@@ -611,7 +622,7 @@ struct ChatProTab: View {
self.showsSessions = true
} label: {
Label {
Text(String(localized: "Threads…"))
Text(String(localized: "Sessions…"))
.font(OpenClawType.body)
} icon: {
Image(systemName: "rectangle.stack")
@@ -135,6 +135,8 @@ struct CommandSessionActionsModifier: ViewModifier {
let categories: [String]
let isArchived: Bool
let isEnabled: Bool
let canArchive: Bool
let canDelete: Bool
let actions: CommandSessionActions
@State private var editor: Editor?
@@ -156,7 +158,9 @@ struct CommandSessionActionsModifier: ViewModifier {
self.actionButton("Unarchive", systemImage: "archivebox") {
self.actions.toggleArchived()
}
self.deleteButton
if self.canDelete {
self.deleteButton
}
} else {
self.actionButton(
self.session.pinned == true
@@ -181,10 +185,14 @@ struct CommandSessionActionsModifier: ViewModifier {
self.actions.fork()
}
self.groupMenu
self.actionButton("Archive", systemImage: "archivebox") {
self.actions.toggleArchived()
if self.canArchive {
self.actionButton("Archive", systemImage: "archivebox") {
self.actions.toggleArchived()
}
}
if self.canDelete {
self.deleteButton
}
self.deleteButton
}
}
.alert(self.editorTitle, isPresented: self.editorBinding) {
@@ -206,14 +214,14 @@ struct CommandSessionActionsModifier: ViewModifier {
}
}
.confirmationDialog(
"Delete Thread?",
"Delete Session?",
isPresented: self.$confirmsDelete,
titleVisibility: .visible)
{
Button(role: .destructive) {
self.actions.delete()
} label: {
Text("Delete Thread")
Text("Delete Session")
.font(OpenClawType.subheadSemiBold)
}
Button(role: .cancel) {} label: {
@@ -221,7 +229,7 @@ struct CommandSessionActionsModifier: ViewModifier {
.font(OpenClawType.subheadSemiBold)
}
} message: {
Text("This permanently deletes the thread and its transcript.")
Text("This permanently deletes the session and its transcript.")
.font(OpenClawType.caption)
}
}
@@ -266,13 +274,13 @@ struct CommandSessionActionsModifier: ViewModifier {
private var editorTitle: String {
self.editor == .newGroup
? String(localized: "New Group")
: String(localized: "Rename Thread")
: String(localized: "Rename Session")
}
private var editorPlaceholder: String {
self.editor == .newGroup
? String(localized: "Group name")
: String(localized: "Thread name")
: String(localized: "Session name")
}
private func actionButton(
@@ -328,6 +336,8 @@ extension View {
categories: [String],
isArchived: Bool = false,
isEnabled: Bool = true,
canArchive: Bool = true,
canDelete: Bool = true,
actions: CommandSessionActions) -> some View
{
self.modifier(CommandSessionActionsModifier(
@@ -335,6 +345,8 @@ extension View {
categories: categories,
isArchived: isArchived,
isEnabled: isEnabled,
canArchive: canArchive,
canDelete: canDelete,
actions: actions))
}
}
+276 -79
View File
@@ -13,11 +13,15 @@ struct CommandCenterTab: View {
var ownsNavigationStack: Bool = true
var usesNativeNavigationChrome: Bool = false
var headerTitle: String = "OpenClaw"
var headerLeadingAction: OpenClawSidebarHeaderAction?
var headerSidebarAction: OpenClawSidebarHeaderAction?
var dashboardModel: RootSidebarModel?
var showsHeaderMark: Bool = true
var openChat: () -> Void
var openSettings: () -> Void
var openSessions: (() -> Void)?
var openApprovals: (() -> Void)?
var openAutomations: (() -> Void)?
var openUsage: (() -> Void)?
enum WorkRoute {
case chat(String?)
@@ -49,6 +53,7 @@ struct CommandCenterTab: View {
}
}
.task(id: self.recentSessionsRefreshID) {
guard self.dashboardModel == nil else { return }
await self.refreshRecentSessionsIfNeeded()
}
}
@@ -64,6 +69,12 @@ struct CommandCenterTab: View {
self.header
}
self.gatewayCard
self.threadTiles
.padding(.horizontal, OpenClawProMetric.pagePadding)
self.attentionCard
.padding(.horizontal, OpenClawProMetric.pagePadding)
self.usageSummaryCard
.padding(.horizontal, OpenClawProMetric.pagePadding)
if Self.usesSplitSectionsLayout(
horizontalSizeClass: self.horizontalSizeClass,
containerWidth: geometry.size.width)
@@ -100,9 +111,183 @@ struct CommandCenterTab: View {
.accessibilityLabel("Gateway settings")
}
}
if self.usesNativeNavigationChrome, let headerSidebarAction {
ToolbarItem(placement: .topBarTrailing) {
OpenClawSidebarRevealButton(action: headerSidebarAction)
}
}
}
}
private var threadTiles: some View {
LazyVGrid(columns: Array(repeating: GridItem(.flexible(), spacing: 8), count: 4), spacing: 8) {
self.threadTile(
title: String(localized: "Sessions"),
value: self.overviewSessions.count.formatted())
self.threadTile(
title: String(localized: "Live"),
value: self.overviewLiveCount.formatted())
self.threadTile(
title: String(localized: "Unread"),
value: self.overviewUnreadCount.formatted())
self.threadTile(
title: String(localized: "Tokens"),
value: self.overviewTokenText)
}
}
private func threadTile(title: String, value: String) -> some View {
Button {
self.openSessions?()
} label: {
ProCard(padding: 10) {
VStack(alignment: .leading, spacing: 4) {
Text(verbatim: value)
.font(OpenClawType.headline)
.foregroundStyle(OpenClawBrand.accent)
.lineLimit(1)
.minimumScaleFactor(0.7)
Text(verbatim: title)
.font(OpenClawType.caption2Medium)
.foregroundStyle(.secondary)
.lineLimit(1)
}
}
}
.buttonStyle(.plain)
.accessibilityHint(String(localized: "Opens Sessions"))
}
@ViewBuilder
private var attentionCard: some View {
let approvalCount = self.appModel.pendingExecApprovalCount
let cronCount = (self.dashboardModel?.failedCronJobCount ?? 0) +
(self.dashboardModel?.overdueCronJobCount ?? 0)
if approvalCount > 0 || cronCount > 0 {
CommandPanel(tint: OpenClawBrand.warn, padding: 12) {
VStack(alignment: .leading, spacing: 8) {
self.cardHeader(title: String(localized: "Attention"))
if approvalCount > 0 {
self.dashboardActionRow(
title: String(localized: "Pending approvals"),
value: approvalCount.formatted(),
systemImage: "checkmark.shield",
action: self.openApprovals ?? self.openSettings)
}
if cronCount > 0 {
self.dashboardActionRow(
title: String(localized: "Automation issues"),
value: cronCount.formatted(),
systemImage: "clock.badge.exclamationmark",
action: self.openAutomations ?? {})
}
}
}
}
}
@ViewBuilder
private var usageSummaryCard: some View {
if let usage = self.dashboardModel?.usage {
Button(action: self.openUsage ?? {}) {
CommandPanel(padding: 12) {
HStack(spacing: 12) {
VStack(alignment: .leading, spacing: 4) {
Text(String(localized: "31-day usage"))
.font(OpenClawType.subheadSemiBold)
.foregroundStyle(.primary)
Text(self.usageCostText(usage.totalCost))
.font(OpenClawType.title3SemiBold)
.foregroundStyle(OpenClawBrand.accent)
}
Spacer(minLength: 8)
self.usageTrend(usage.daily ?? [])
}
}
}
.buttonStyle(.plain)
.accessibilityHint(String(localized: "Opens Usage"))
}
}
private func dashboardActionRow(
title: String,
value: String,
systemImage: String,
action: @escaping () -> Void) -> some View
{
Button(action: action) {
HStack(spacing: 10) {
Image(systemName: systemImage)
.font(OpenClawType.subheadSemiBold)
.foregroundStyle(OpenClawBrand.warn)
Text(verbatim: title)
.font(OpenClawType.subheadSemiBold)
Spacer(minLength: 8)
Text(verbatim: value)
.font(OpenClawType.subheadSemiBold)
.foregroundStyle(OpenClawBrand.warn)
Image(systemName: "chevron.right")
.font(OpenClawType.captionSemiBold)
.foregroundStyle(.secondary)
}
.frame(minHeight: 44)
.contentShape(Rectangle())
}
.buttonStyle(.plain)
}
private func usageTrend(_ daily: [CostUsageDailyEntryLite]) -> some View {
let values = daily.suffix(14).map { max(0, $0.totalCost ?? 0) }
let maximum = values.max() ?? 0
return HStack(alignment: .bottom, spacing: 2) {
ForEach(Array(values.enumerated()), id: \.offset) { _, value in
Capsule()
.fill(OpenClawBrand.accent.opacity(0.75))
.frame(width: 3, height: maximum > 0 ? max(3, 28 * value / maximum) : 3)
}
}
.frame(height: 30, alignment: .bottom)
.accessibilityHidden(true)
}
private func usageCostText(_ value: Double?) -> String {
guard let value else { return "" }
return value.formatted(.currency(code: "USD"))
}
private var overviewSessions: [OpenClawChatSessionEntry] {
if let dashboardModel {
return Self.visibleOverviewSessions(dashboardModel.sessions)
}
return [self.defaultChatSessionEntry].compactMap(\.self) + self.recentChatSessions
}
static func visibleOverviewSessions(
_ sessions: [OpenClawChatSessionEntry]) -> [OpenClawChatSessionEntry]
{
sessions.filter {
$0.archived != true && !ChatSessionSidebarModel.isHiddenInternalSession($0.key)
}
}
private var overviewLiveCount: Int {
self.overviewSessions.count { session in
session.hasActiveRun == true || session.hasActiveSubagentRun == true ||
session.status?.lowercased() == "running"
}
}
private var overviewUnreadCount: Int {
self.overviewSessions.count { $0.unread == true }
}
private var overviewTokenText: String {
let summary = RootSidebarModel.tokenUsageSummary(for: self.overviewSessions)
guard let total = summary.total else { return "n/a" }
return "\(summary.isPartial ? "~" : "")\(total.formatted(.number.notation(.compactName)))"
}
static func usesSplitSectionsLayout(
horizontalSizeClass: UserInterfaceSizeClass?,
containerWidth: CGFloat) -> Bool
@@ -126,23 +311,27 @@ struct CommandCenterTab: View {
subtitleFont: OpenClawType.caption,
subtitleLineLimit: 1)
{
if let headerLeadingAction {
OpenClawSidebarHeaderLeadingSlot(action: headerLeadingAction)
if let headerSidebarAction {
OpenClawSidebarHeaderLeadingSlot(action: headerSidebarAction)
} else if Self.shouldShowHeaderMark(
hasLeadingAction: headerLeadingAction != nil,
hasLeadingAction: self.headerSidebarAction != nil,
showsHeaderMark: self.showsHeaderMark)
{
OpenClawProMark(size: 28, shadowRadius: 5)
}
} accessory: {
Button(action: self.openSettings) {
Image(systemName: "gearshape.fill")
.font(OpenClawType.subheadSemiBold)
.frame(width: OpenClawProMetric.compactControlSize, height: OpenClawProMetric.compactControlSize)
HStack(spacing: 10) {
Button(action: self.openSettings) {
Image(systemName: "gearshape.fill")
.font(OpenClawType.subheadSemiBold)
.frame(
width: OpenClawProMetric.compactControlSize,
height: OpenClawProMetric.compactControlSize)
}
.openClawGlassButton()
.accessibilityLabel("Gateway settings")
.accessibilityHint("Opens gateway settings")
}
.openClawGlassButton()
.accessibilityLabel("Gateway settings")
.accessibilityHint("Opens gateway settings")
}
.padding(.horizontal, OpenClawProMetric.pagePadding)
}
@@ -216,7 +405,7 @@ struct CommandCenterTab: View {
private var defaultChatSessionSection: some View {
CommandPanel(padding: 12) {
VStack(spacing: 10) {
self.cardHeader(title: "Agent thread")
self.cardHeader(title: "Agent session")
Button {
self.openDefaultChatSession()
@@ -231,12 +420,12 @@ struct CommandCenterTab: View {
private var recentSessions: some View {
CommandPanel(padding: 12) {
VStack(spacing: 10) {
self.cardHeader(title: "Recent threads")
self.cardHeader(title: "Recent sessions")
if self.recentSessionPreviewSessions.isEmpty {
CommandEmptyStateRow(
icon: self.gatewayConnected ? "bubble.left.and.text.bubble.right.fill" : "wifi.slash",
title: self.gatewayConnected ? "No recent threads" : "Gateway offline",
title: self.gatewayConnected ? "No recent sessions" : "Gateway offline",
detail: self
.gatewayConnected ? "Start a chat and it will appear here." : "Connect to the gateway.")
} else {
@@ -354,12 +543,13 @@ struct CommandCenterTab: View {
color: isOpen ? OpenClawBrand.accent : OpenClawBrand.ok,
progress: nil,
route: .chat(nil),
isUnread: self.defaultChatSessionEntry?.unread == true,
isPinned: self.defaultChatSessionEntry?.pinned == true)
isUnread: self.effectiveDefaultChatSessionEntry?.unread == true,
isPinned: self.effectiveDefaultChatSessionEntry?.pinned == true)
}
private var defaultChatActivityText: String {
let activityAt = self.defaultChatSessionEntry?.lastActivityAt ?? self.defaultChatSessionEntry?.updatedAt
let activityAt = self.effectiveDefaultChatSessionEntry?.lastActivityAt ??
self.effectiveDefaultChatSessionEntry?.updatedAt
guard let activityAt, activityAt > 0 else {
return String(localized: "No recent activity")
}
@@ -368,20 +558,37 @@ struct CommandCenterTab: View {
private var recentSessionPreviewSessions: [OpenClawChatSessionEntry] {
CommandSessionGrouping.previewSelection(
self.recentChatSessions,
self.effectiveRecentChatSessions,
currentKey: self.appModel.chatSessionKey)
}
private var hasMoreRecentSessions: Bool {
self.recentChatSessions.count > self.recentSessionPreviewSessions.count
self.effectiveRecentChatSessions.count > self.recentSessionPreviewSessions.count
}
private var sessionCategories: [String] {
CommandSessionGrouping.categories(
from: self.recentChatSessions,
from: self.effectiveRecentChatSessions,
knownGroups: SessionGroupStore.load())
}
private var effectiveDefaultChatSessionEntry: OpenClawChatSessionEntry? {
guard let sessions = self.dashboardModel?.sessions else { return self.defaultChatSessionEntry }
let mainKey = ChatSessionSidebarModel.selectedSessionKey(
sessions: sessions,
currentSessionKey: "main",
mainSessionKey: self.appModel.defaultChatSessionKey,
activeAgentID: self.appModel.chatAgentId)
return sessions.first { $0.key == mainKey } ?? self.defaultChatSessionEntry
}
private var effectiveRecentChatSessions: [OpenClawChatSessionEntry] {
guard let dashboardModel else { return self.recentChatSessions }
return Self.sessionChoices(
dashboardModel.sessions,
defaultSessionKey: self.appModel.defaultChatSessionKey)
}
private var sessionControlsAvailable: Bool {
!self.appModel.isLocalChatFixtureEnabled && self.appModel.isOperatorGatewayConnected
}
@@ -394,10 +601,6 @@ struct CommandCenterTab: View {
].joined(separator: ":")
}
private var sessionListAvailable: Bool {
self.appModel.isLocalChatFixtureEnabled || self.appModel.isOperatorGatewayConnected
}
private var sessionListMode: String {
self.appModel.chatViewModelIdentityID
}
@@ -417,7 +620,7 @@ struct CommandCenterTab: View {
}
private func openDefaultChatSession() {
self.open(.chat(nil), unread: self.defaultChatSessionEntry?.unread == true)
self.open(.chat(nil), unread: self.effectiveDefaultChatSessionEntry?.unread == true)
}
private func patchSession(
@@ -461,7 +664,11 @@ struct CommandCenterTab: View {
Task {
do {
let key = try await self.appModel.makeChatTransport().forkSession(parentKey: session.key)
await self.refreshRecentSessionsIfNeeded()
if let dashboardModel {
await dashboardModel.refreshSessions(appModel: self.appModel)
} else {
await self.refreshRecentSessionsIfNeeded()
}
self.open(.chat(key))
} catch {}
}
@@ -477,24 +684,20 @@ struct CommandCenterTab: View {
if resetActiveSessionKey == self.appModel.chatSessionKey {
self.appModel.focusChatSession(nil)
}
await self.refreshRecentSessionsIfNeeded()
if let dashboardModel {
await dashboardModel.refreshSessions(appModel: self.appModel)
} else {
await self.refreshRecentSessionsIfNeeded()
}
} catch {}
}
}
private func refreshRecentSessionsIfNeeded() async {
guard self.scenePhase == .active else { return }
guard self.sessionListAvailable else {
await self.applyCachedSessions()
return
}
do {
let transport = self.appModel.makeChatTransport()
let response = try await transport.listSessions(limit: Self.recentSessionsFetchLimit)
self.applySessions(response.sessions)
self.appModel.reconcileChatSessionReadState(response.sessions)
await self.appModel.storeCachedChatSessions(response.sessions)
let roster = try await self.appModel.loadChatSessionRoster(limit: Self.recentSessionsFetchLimit)
self.applySessions(roster.sessions)
} catch {
await self.applyCachedSessions()
}
@@ -542,7 +745,7 @@ struct CommandCenterTab: View {
isPinned: session.pinned == true)
}
fileprivate static func sessionTitle(_ session: OpenClawChatSessionEntry) -> String {
static func sessionTitle(_ session: OpenClawChatSessionEntry) -> String {
let label = session.label?.trimmingCharacters(in: .whitespacesAndNewlines)
if let label, !label.isEmpty {
return label
@@ -601,7 +804,7 @@ struct CommandCenterTab: View {
.joined(separator: " ")
}
fileprivate static func sessionDetail(_ session: OpenClawChatSessionEntry) -> String {
static func sessionDetail(_ session: OpenClawChatSessionEntry) -> String {
let activityAt = session.lastActivityAt ?? session.updatedAt
if let activityAt, activityAt > 0 {
return self.relativeTimeText(forMilliseconds: activityAt)
@@ -609,12 +812,18 @@ struct CommandCenterTab: View {
return session.key
}
fileprivate static func relativeTimeText(forMilliseconds milliseconds: Double) -> String {
static func relativeTimeText(
forMilliseconds milliseconds: Double,
relativeTo now: Date = .now) -> String
{
let date = Date(timeIntervalSince1970: milliseconds / 1000)
guard now.timeIntervalSince(date) >= 60 else {
return String(localized: "just now")
}
let formatter = RelativeDateTimeFormatter()
formatter.dateTimeStyle = .numeric
formatter.unitsStyle = .short
return formatter.localizedString(for: date, relativeTo: .now)
return formatter.localizedString(for: date, relativeTo: now)
}
fileprivate nonisolated static func isHiddenInternalSession(_ key: String) -> Bool {
@@ -710,16 +919,16 @@ struct CommandSessionsScreen: View {
@State private var groupEditor: GroupEditor?
@State private var groupDraftText = ""
@State private var groupPendingDelete: String?
let headerLeadingAction: OpenClawSidebarHeaderAction?
let headerSidebarAction: OpenClawSidebarHeaderAction?
let usesNativeNavigationChrome: Bool
let openChat: () -> Void
init(
headerLeadingAction: OpenClawSidebarHeaderAction? = nil,
headerSidebarAction: OpenClawSidebarHeaderAction? = nil,
usesNativeNavigationChrome: Bool = false,
openChat: @escaping () -> Void)
{
self.headerLeadingAction = headerLeadingAction
self.headerSidebarAction = headerSidebarAction
self.usesNativeNavigationChrome = usesNativeNavigationChrome
self.openChat = openChat
}
@@ -739,7 +948,7 @@ struct CommandSessionsScreen: View {
}
.safeAreaPadding(.bottom, OpenClawProMetric.bottomScrollInset)
}
.navigationTitle("Threads")
.navigationTitle("Sessions")
.navigationBarTitleDisplayMode(.inline)
.toolbar(self.usesNativeNavigationChrome ? .visible : .hidden, for: .navigationBar)
.task(id: self.refreshID) {
@@ -781,25 +990,24 @@ struct CommandSessionsScreen: View {
} message: { group in
Text(verbatim: String(
format: String(
localized: "Threads in \u{201C}%@\u{201D} move back to Ungrouped."),
localized: "Sessions in \u{201C}%@\u{201D} move back to Ungrouped."),
group))
.font(OpenClawType.caption)
}
}
private var header: some View {
HStack(alignment: .top, spacing: 12) {
if let headerLeadingAction {
OpenClawSidebarHeaderLeadingSlot(action: headerLeadingAction)
}
VStack(alignment: .leading, spacing: 4) {
Text("Threads")
.font(OpenClawType.title2)
Text(self.headerDetail)
.font(OpenClawType.captionMedium)
.foregroundStyle(.secondary)
OpenClawAdaptiveHeaderRow(
title: "Sessions",
subtitle: .verbatim(self.headerDetail),
titleFont: OpenClawType.title2,
subtitleFont: OpenClawType.captionMedium)
{
if let headerSidebarAction {
OpenClawSidebarHeaderLeadingSlot(action: headerSidebarAction)
}
} accessory: {
EmptyView()
}
.padding(.horizontal, OpenClawProMetric.pagePadding)
}
@@ -809,8 +1017,8 @@ struct CommandSessionsScreen: View {
VStack(spacing: 0) {
HStack(spacing: 8) {
Text(self.showArchived
? LocalizedStringKey("Archived threads")
: LocalizedStringKey("Recent threads"))
? LocalizedStringKey("Archived sessions")
: LocalizedStringKey("Recent sessions"))
.font(OpenClawType.subheadBold)
Spacer(minLength: 8)
if self.isLoading {
@@ -833,7 +1041,7 @@ struct CommandSessionsScreen: View {
if let loadErrorText {
CommandEmptyStateRow(
icon: "exclamationmark.triangle.fill",
title: "Threads unavailable",
title: "Sessions unavailable",
detail: .verbatim(loadErrorText))
.padding(.horizontal, 10)
.padding(.bottom, 10)
@@ -872,15 +1080,15 @@ struct CommandSessionsScreen: View {
private var headerDetail: String {
if self.isLoading, self.sessions.isEmpty {
return self.showArchived
? String(localized: "Loading archived threads")
: String(localized: "Loading recent threads")
? String(localized: "Loading archived sessions")
: String(localized: "Loading recent sessions")
}
let count = self.visibleSessions.count
if count == 0 {
return self.emptyTitle
}
return String(
AttributedString(localized: "^[\(count) thread](inflect: true)").characters)
AttributedString(localized: "^[\(count) session](inflect: true)").characters)
}
private var visibleSessions: [OpenClawChatSessionEntry] {
@@ -910,13 +1118,13 @@ struct CommandSessionsScreen: View {
return String(localized: "Gateway offline")
}
return self.showArchived
? String(localized: "No archived threads")
: String(localized: "No recent threads")
? String(localized: "No archived sessions")
: String(localized: "No recent sessions")
}
private var emptyDetail: String {
self.showArchived
? String(localized: "Archived threads will appear here.")
? String(localized: "Archived sessions will appear here.")
: String(localized: "Start a chat and it will appear here.")
}
@@ -1158,27 +1366,16 @@ struct CommandSessionsScreen: View {
// New Group editor) alongside the fresh session list.
self.knownGroups = SessionGroupStore.load()
let requestsArchived = self.showArchived
guard self.appModel.isCommandSessionListAvailable else {
self.sessions = requestsArchived ? [] : await self.appModel.loadCachedChatSessions()
self.loadErrorText = nil
return
}
self.isLoading = true
self.loadErrorText = nil
defer { self.isLoading = false }
do {
let transport = self.appModel.makeChatTransport()
let response = try await transport.listSessions(
let roster = try await self.appModel.loadChatSessionRoster(
limit: CommandCenterTab.recentSessionsFetchLimit,
archived: requestsArchived)
guard requestsArchived == self.showArchived else { return }
self.sessions = response.sessions
if !requestsArchived {
self.appModel.reconcileChatSessionReadState(response.sessions)
await self.appModel.storeCachedChatSessions(response.sessions)
}
self.sessions = roster.sessions
} catch {
guard requestsArchived == self.showArchived else { return }
self.sessions = requestsArchived ? [] : await self.appModel.loadCachedChatSessions()
@@ -8,18 +8,18 @@ struct IPadActivityScreen: View {
@State private var sessions: [OpenClawChatSessionEntry] = []
@State private var isLoading = false
@State private var loadErrorText: String?
let headerLeadingAction: OpenClawSidebarHeaderAction?
let headerSidebarAction: OpenClawSidebarHeaderAction?
let usesNativeNavigationChrome: Bool
let openChat: () -> Void
let openSettings: () -> Void
init(
headerLeadingAction: OpenClawSidebarHeaderAction? = nil,
headerSidebarAction: OpenClawSidebarHeaderAction? = nil,
usesNativeNavigationChrome: Bool = false,
openChat: @escaping () -> Void,
openSettings: @escaping () -> Void)
{
self.headerLeadingAction = headerLeadingAction
self.headerSidebarAction = headerSidebarAction
self.usesNativeNavigationChrome = usesNativeNavigationChrome
self.openChat = openChat
self.openSettings = openSettings
@@ -29,7 +29,7 @@ struct IPadActivityScreen: View {
IPadSidebarScreenChrome(
title: "Activity",
subtitle: "Live device and gateway activity.",
headerLeadingAction: self.headerLeadingAction,
headerSidebarAction: self.headerSidebarAction,
usesNativeNavigationChrome: self.usesNativeNavigationChrome,
gatewayAction: self.openSettings)
{
@@ -58,7 +58,7 @@ struct IPadActivityScreen: View {
color: OpenClawBrand.accentForeground),
ProMetric(
icon: "bubble.left.and.text.bubble.right",
title: "Threads",
title: "Sessions",
value: self.isLoading ? "..." : "\(self.sessionRows.count)",
color: OpenClawBrand.accentHotForeground),
]
@@ -112,7 +112,7 @@ struct IPadActivityScreen: View {
Divider().padding(.leading, 58)
ProStatusRow(
icon: "hourglass",
title: "Loading threads",
title: "Loading sessions",
detail: "Fetching recent activity from the gateway.",
value: "loading",
color: OpenClawBrand.accentForeground,
@@ -122,7 +122,7 @@ struct IPadActivityScreen: View {
Divider().padding(.leading, 58)
ProStatusRow(
icon: "exclamationmark.triangle.fill",
title: "Threads unavailable",
title: "Sessions unavailable",
detail: .verbatim(loadErrorText),
value: "error",
color: OpenClawBrand.warn,
@@ -132,7 +132,7 @@ struct IPadActivityScreen: View {
Divider().padding(.leading, 58)
ProStatusRow(
icon: "bubble.left.and.text.bubble.right",
title: self.sessionsAvailable ? "No recent threads" : "Thread activity offline",
title: self.sessionsAvailable ? "No recent sessions" : "Session activity offline",
detail: self.sessionsAvailable
? "Start a chat and it will appear here."
: "Connect to the gateway to load recent chat activity.",
@@ -235,7 +235,7 @@ private struct IPadActivityStatesPreview: View {
tailRows: [
ActivityPreviewRow(
icon: "hourglass",
title: "Loading threads",
title: "Loading sessions",
detail: "Fetching recent activity from the gateway.",
value: "loading",
color: OpenClawBrand.accent),
@@ -251,7 +251,7 @@ private struct IPadActivityStatesPreview: View {
tailRows: [
ActivityPreviewRow(
icon: "bubble.left.and.text.bubble.right",
title: "No recent threads",
title: "No recent sessions",
detail: "Start a chat and it will appear here.",
value: "empty",
color: .secondary),
@@ -267,7 +267,7 @@ private struct IPadActivityStatesPreview: View {
tailRows: [
ActivityPreviewRow(
icon: "exclamationmark.triangle.fill",
title: "Threads unavailable",
title: "Sessions unavailable",
detail: "Try again after the gateway reconnects.",
value: "error",
color: OpenClawBrand.warn),
@@ -4,7 +4,7 @@ struct IPadSidebarScreenChrome<Content: View>: View {
@Environment(\.verticalSizeClass) private var verticalSizeClass
let title: String
let subtitle: String
let headerLeadingAction: OpenClawSidebarHeaderAction?
let headerSidebarAction: OpenClawSidebarHeaderAction?
let usesNativeNavigationChrome: Bool
let gatewayAction: (() -> Void)?
@ViewBuilder var content: Content
@@ -12,14 +12,14 @@ struct IPadSidebarScreenChrome<Content: View>: View {
init(
title: String,
subtitle: String,
headerLeadingAction: OpenClawSidebarHeaderAction? = nil,
headerSidebarAction: OpenClawSidebarHeaderAction? = nil,
usesNativeNavigationChrome: Bool = false,
gatewayAction: (() -> Void)? = nil,
@ViewBuilder content: () -> Content)
{
self.title = title
self.subtitle = subtitle
self.headerLeadingAction = headerLeadingAction
self.headerSidebarAction = headerSidebarAction
self.usesNativeNavigationChrome = usesNativeNavigationChrome
self.gatewayAction = gatewayAction
self.content = content()
@@ -37,8 +37,8 @@ struct IPadSidebarScreenChrome<Content: View>: View {
titleFont: self.isCompactHeight ? OpenClawType.headline : OpenClawType.title2SemiBold,
subtitleLineLimit: self.isCompactHeight ? 1 : 2)
{
if let headerLeadingAction {
OpenClawSidebarHeaderLeadingSlot(action: headerLeadingAction)
if let headerSidebarAction {
OpenClawSidebarHeaderLeadingSlot(action: headerSidebarAction)
}
} accessory: {
self.gatewayPill
@@ -64,6 +64,11 @@ struct IPadSidebarScreenChrome<Content: View>: View {
.accessibilityLabel("Gateway settings")
}
}
if self.usesNativeNavigationChrome, let headerSidebarAction {
ToolbarItem(placement: .topBarLeading) {
OpenClawSidebarRevealButton(action: headerSidebarAction)
}
}
}
}
@@ -17,16 +17,16 @@ struct IPadSkillWorkshopScreen: View {
@State private var errorText: String?
@State private var noticeText: String?
@State private var presentedProposalRoute: IPadSkillProposalSheetRoute?
let headerLeadingAction: OpenClawSidebarHeaderAction?
let headerSidebarAction: OpenClawSidebarHeaderAction?
let usesNativeNavigationChrome: Bool
let openSettings: () -> Void
init(
headerLeadingAction: OpenClawSidebarHeaderAction? = nil,
headerSidebarAction: OpenClawSidebarHeaderAction? = nil,
usesNativeNavigationChrome: Bool = false,
openSettings: @escaping () -> Void = {})
{
self.headerLeadingAction = headerLeadingAction
self.headerSidebarAction = headerSidebarAction
self.usesNativeNavigationChrome = usesNativeNavigationChrome
self.openSettings = openSettings
}
@@ -35,7 +35,7 @@ struct IPadSkillWorkshopScreen: View {
IPadSidebarScreenChrome(
title: "Skill Workshop",
subtitle: "Review and apply proposed skills.",
headerLeadingAction: self.headerLeadingAction,
headerSidebarAction: self.headerSidebarAction,
usesNativeNavigationChrome: self.usesNativeNavigationChrome,
gatewayAction: self.openSettings)
{
@@ -20,18 +20,18 @@ struct IPadWorkboardScreen: View {
@State private var busyCardID: String?
@State private var dispatchSummaryText: String?
@State private var presentedSheet: IPadWorkboardSheet?
let headerLeadingAction: OpenClawSidebarHeaderAction?
let headerSidebarAction: OpenClawSidebarHeaderAction?
let usesNativeNavigationChrome: Bool
let openChat: () -> Void
let openSettings: () -> Void
init(
headerLeadingAction: OpenClawSidebarHeaderAction? = nil,
headerSidebarAction: OpenClawSidebarHeaderAction? = nil,
usesNativeNavigationChrome: Bool = false,
openChat: @escaping () -> Void,
openSettings: @escaping () -> Void = {})
{
self.headerLeadingAction = headerLeadingAction
self.headerSidebarAction = headerSidebarAction
self.usesNativeNavigationChrome = usesNativeNavigationChrome
self.openChat = openChat
self.openSettings = openSettings
@@ -41,7 +41,7 @@ struct IPadWorkboardScreen: View {
IPadSidebarScreenChrome(
title: "Workboard",
subtitle: self.currentWorkboardSubtitle,
headerLeadingAction: self.headerLeadingAction,
headerSidebarAction: self.headerSidebarAction,
usesNativeNavigationChrome: self.usesNativeNavigationChrome,
gatewayAction: self.openSettings)
{
@@ -1059,7 +1059,7 @@ private struct IPadWorkboardKanbanCard: View {
Button(action: self.openSession) {
Image(systemName: "bubble.left.and.text.bubble.right")
}
.accessibilityLabel("Open Thread")
.accessibilityLabel("Open Session")
.buttonStyle(.bordered)
.controlSize(.mini)
}
@@ -1218,7 +1218,7 @@ struct IPadWorkboardQueueRow: View {
private var actionMenuItems: some View {
if self.card.sessionKey?.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty == false {
Button(action: self.openSession) {
Text("Open Thread")
Text("Open Session")
.font(OpenClawType.subheadSemiBold)
}
}
@@ -1316,7 +1316,7 @@ private struct IPadWorkboardCardDetailSheet: View {
Button {
self.openSession()
} label: {
Text("Open Thread")
Text("Open Session")
.font(OpenClawType.subheadSemiBold)
}
}
@@ -4,16 +4,16 @@ struct OpenClawDocsScreen: View {
private let docsURL = URL(string: "https://docs.openclaw.ai")!
private let gatewayURL = URL(string: "https://docs.openclaw.ai/gateway")!
private let pairingURL = URL(string: "https://docs.openclaw.ai/channels/pairing")!
let headerLeadingAction: OpenClawSidebarHeaderAction?
let headerSidebarAction: OpenClawSidebarHeaderAction?
let usesNativeNavigationChrome: Bool
let gatewayAction: (() -> Void)?
init(
headerLeadingAction: OpenClawSidebarHeaderAction? = nil,
headerSidebarAction: OpenClawSidebarHeaderAction? = nil,
usesNativeNavigationChrome: Bool = false,
gatewayAction: (() -> Void)? = nil)
{
self.headerLeadingAction = headerLeadingAction
self.headerSidebarAction = headerSidebarAction
self.usesNativeNavigationChrome = usesNativeNavigationChrome
self.gatewayAction = gatewayAction
}
@@ -45,6 +45,11 @@ struct OpenClawDocsScreen: View {
.accessibilityLabel("Gateway settings")
}
}
if self.usesNativeNavigationChrome, let headerSidebarAction {
ToolbarItem(placement: .topBarLeading) {
OpenClawSidebarRevealButton(action: headerSidebarAction)
}
}
}
}
@@ -56,9 +61,9 @@ struct OpenClawDocsScreen: View {
titleFont: OpenClawType.headline,
subtitleFont: OpenClawType.caption)
{
HStack(alignment: .top, spacing: 12) {
if let headerLeadingAction {
OpenClawSidebarHeaderLeadingSlot(action: headerLeadingAction)
HStack(spacing: 10) {
if let headerSidebarAction {
OpenClawSidebarHeaderLeadingSlot(action: headerSidebarAction)
}
ProIconBadge(systemName: "book", color: OpenClawBrand.accent)
}
@@ -5,6 +5,7 @@ enum OpenClawProMetric {
static let pagePadding: CGFloat = 16
static let cardRadius: CGFloat = 16
static let controlRadius: CGFloat = 12
static let drawerRadius: CGFloat = 28
static let compactControlSize: CGFloat = 36
static let bottomScrollInset: CGFloat = 96
}
@@ -179,16 +180,6 @@ private struct OpenClawGlassButtonModifier: ViewModifier {
}
}
private struct OpenClawTabBarBehaviorModifier: ViewModifier {
func body(content: Content) -> some View {
if #available(iOS 26.0, *) {
content.tabBarMinimizeBehavior(.onScrollDown)
} else {
content
}
}
}
private struct OpenClawGlassSurfaceModifier: ViewModifier {
let radius: CGFloat
@@ -223,10 +214,6 @@ extension View {
modifier(OpenClawGlassButtonModifier(prominent: prominent, tint: tint))
}
func openClawTabBarBehavior() -> some View {
modifier(OpenClawTabBarBehaviorModifier())
}
func openClawGlassSurface(radius: CGFloat = OpenClawProMetric.controlRadius) -> some View {
modifier(OpenClawGlassSurfaceModifier(radius: radius))
}
@@ -306,6 +293,7 @@ struct OpenClawSidebarRevealButton: View {
height: OpenClawProMetric.compactControlSize)
.contentShape(Rectangle())
}
.frame(width: 44, height: 44)
.buttonBorderShape(.circle)
.openClawGlassButton(tint: OpenClawBrand.accent)
.accessibilityLabel(self.headerAction.accessibilityLabel.text)
@@ -0,0 +1,31 @@
import SwiftUI
import UIKit
/// Sidebar surface tokens mirroring the mobile-exp prototype palette; the
/// drawer follows the app appearance (owner decision superseding always-dark).
enum OpenClawSidebarPalette {
static let background = adaptive(light: 0xFAFAFA, dark: 0x000000)
static let elevated = adaptive(light: 0xF2F2F2, dark: 0x1A1A1A)
static let selection = adaptive(light: 0xEDEDED, dark: 0x232327)
static let text = adaptive(light: 0x171717, dark: 0xEDEDED)
static let textStrong = adaptive(light: 0x171717, dark: 0xEDEDED)
static let muted = adaptive(light: 0x8F8F8F, dark: 0x8F8F8F)
static let accent = OpenClawBrand.accent
static let hairline = Color(uiColor: UIColor { traits in
traits.userInterfaceStyle == .dark
? UIColor(white: 1, alpha: 0.14)
: UIColor(white: 0, alpha: 0.08)
})
private static func adaptive(light: UInt32, dark: UInt32) -> Color {
Color(uiColor: UIColor { traits in
let value = traits.userInterfaceStyle == .dark ? dark : light
return UIColor(
red: CGFloat((value >> 16) & 0xFF) / 255,
green: CGFloat((value >> 8) & 0xFF) / 255,
blue: CGFloat(value & 0xFF) / 255,
alpha: 1)
})
}
}
@@ -1,114 +0,0 @@
import SwiftUI
import UIKit
enum UnifiedChatVoiceTabIcon {
enum State: Hashable {
case inactive
case active
case listening
case speaking
var isVoiceActive: Bool {
self != .inactive
}
}
struct CacheKey: Hashable {
let state: State
let colorScheme: ColorScheme
}
private static let canvasSize = CGSize(width: 30, height: 30)
@MainActor private static var imageCache: [CacheKey: UIImage] = [:]
@MainActor
static func image(state: State, colorScheme: ColorScheme) -> Image {
// Voice-active icons render the adaptive brand color into bitmap pixels;
// appearance must therefore participate in cache identity.
let cacheKey = CacheKey(state: state, colorScheme: colorScheme)
let rendered = self.imageCache[cacheKey] ?? {
let image = self.renderedImage(state: state, colorScheme: colorScheme)
self.imageCache[cacheKey] = image
return image
}()
return Image(uiImage: rendered)
.renderingMode(state.isVoiceActive ? .original : .template)
}
@MainActor
private static func renderedImage(state: State, colorScheme: ColorScheme) -> UIImage {
let userInterfaceStyle: UIUserInterfaceStyle = colorScheme == .dark ? .dark : .light
let traits = UITraitCollection(userInterfaceStyle: userInterfaceStyle)
let format = UIGraphicsImageRendererFormat(for: traits)
format.opaque = false
format.scale = UIScreen.main.scale
let renderer = UIGraphicsImageRenderer(size: self.canvasSize, format: format)
let rendered = renderer.image { context in
let symbolConfig = UIImage.SymbolConfiguration(pointSize: 25, weight: .regular)
guard let bubble = UIImage(systemName: "bubble.left.fill", withConfiguration: symbolConfig) else {
return
}
let fill = state.isVoiceActive
? UIColor(OpenClawBrand.accent).resolvedColor(with: traits)
: UIColor.black
let tintedBubble = bubble.withTintColor(fill, renderingMode: .alwaysOriginal)
let bubbleRect = CGRect(
x: (self.canvasSize.width - tintedBubble.size.width) / 2,
y: (self.canvasSize.height - tintedBubble.size.height) / 2,
width: tintedBubble.size.width,
height: tintedBubble.size.height)
tintedBubble.draw(in: bubbleRect)
// Cut one waveform out of the bubble so the tab keeps a single,
// legible template silhouette at native tab-bar sizes.
context.cgContext.setBlendMode(.clear)
let heights: [CGFloat] = switch state {
case .inactive: [6, 11, 7]
case .active: [7, 12, 8]
case .listening: [9, 15, 10]
case .speaking: [13, 8, 14]
}
for index in heights.indices {
let height = heights[index]
let rect = CGRect(
x: 10.1 + CGFloat(index) * 4.1,
y: 13.4 - height / 2,
width: 2.35,
height: height)
UIBezierPath(roundedRect: rect, cornerRadius: 1.2).fill()
}
}
return rendered.withRenderingMode(state.isVoiceActive ? .alwaysOriginal : .alwaysTemplate)
}
}
/// Phone tabs push Settings routes (gateway, voice) onto their own stack so
/// Back returns to the tab content the user navigated from; only global flows
/// (deep links, onboarding, problem banner) jump to the canonical Settings tab.
struct PhoneTabSettingsHost<Content: View>: View {
@State private var settingsPath: [SettingsRoute] = []
private let resetRequestID: Int
private let content: (_ openSettingsRoute: @escaping (SettingsRoute) -> Void) -> Content
init(
resetRequestID: Int = 0,
@ViewBuilder content: @escaping (_ openSettingsRoute: @escaping (SettingsRoute) -> Void) -> Content)
{
self.resetRequestID = resetRequestID
self.content = content
}
var body: some View {
NavigationStack(path: self.$settingsPath) {
self.content { route in
self.settingsPath.append(route)
}
.navigationDestination(for: SettingsRoute.self) { route in
SettingsProTab(directRoute: route)
}
}
.onChange(of: self.resetRequestID) { _, _ in
self.settingsPath.removeAll()
}
}
}
@@ -1,442 +0,0 @@
import OpenClawProtocol
import SwiftUI
struct RootTabsPhoneControlHub: View {
@Environment(NodeAppModel.self) private var appModel
let groups: [RootTabs.SidebarGroup]
let initialDestination: RootTabs.SidebarDestination?
let navigationRequest: RootTabs.PhoneControlNavigationRequest?
let openRootDestination: (RootTabs.SidebarDestination) -> Void
let openChatFromControlDetail: (RootTabs.SidebarDestination) -> Void
@State private var navigationPath: [RootTabs.SidebarDestination] = []
@State private var didApplyInitialDestination = false
@State private var handledNavigationRequestID = 0
var body: some View {
NavigationStack(path: self.$navigationPath) {
List {
Section {
self.gatewayHeader
.listRowInsets(EdgeInsets(top: 4, leading: 16, bottom: 4, trailing: 16))
.listRowBackground(Color.clear)
.listRowSeparator(.hidden)
}
Section {
self.chatShortcut
.listRowInsets(EdgeInsets(top: 4, leading: 0, bottom: 4, trailing: 0))
.listRowBackground(Color.clear)
.listRowSeparator(.hidden)
}
Section {
ForEach(self.phoneDestinations) { destination in
self.destinationRow(destination)
}
}
}
.listStyle(.insetGrouped)
.navigationTitle("Control")
.navigationBarTitleDisplayMode(.large)
.navigationDestination(for: RootTabs.SidebarDestination.self) { destination in
self.detail(for: destination)
}
.onAppear {
self.applyInitialDestinationIfNeeded()
self.applyNavigationRequestIfNeeded()
}
.onChange(of: self.navigationRequest) { _, _ in
self.applyNavigationRequestIfNeeded()
}
}
}
private var gatewayHeader: some View {
Button {
self.openGatewayDetail()
} label: {
HStack(spacing: 12) {
OpenClawProMark(size: 44, shadowRadius: 5)
VStack(alignment: .leading, spacing: 3) {
self.gatewayIdentityTitle
.foregroundStyle(.primary)
.lineLimit(1)
.truncationMode(.middle)
HStack(spacing: 4) {
Text(self.sidebarActiveAgentTitle)
Text("")
.accessibilityHidden(true)
Text(self.gatewayStateText)
.foregroundStyle(self.gatewayStateColor)
}
.font(OpenClawType.captionMedium)
.foregroundStyle(.secondary)
.lineLimit(1)
}
Spacer(minLength: 8)
Image(systemName: "slider.horizontal.3")
.font(.system(size: 16, weight: .semibold))
.foregroundStyle(.primary)
.frame(width: 44, height: 44)
.background(Color.primary.opacity(0.06), in: Circle())
}
.padding(.vertical, 6)
.contentShape(Rectangle())
}
.buttonStyle(.plain)
.accessibilityElement(children: .combine)
.accessibilityLabel(self.gatewayAccessibilityLabel)
.accessibilityHint("Opens Settings / Gateway")
}
private var chatShortcut: some View {
self.prominentDestinationCard(
.chat,
subtitle: "Agent chat and recent work.")
}
private func prominentDestinationCard(
_ destination: RootTabs.SidebarDestination,
subtitle: LocalizedStringKey) -> some View
{
Button {
self.applyDestination(destination)
} label: {
ProCard(padding: 16, radius: OpenClawProMetric.cardRadius) {
VStack(alignment: .leading, spacing: 12) {
ControlCircleIcon(
systemName: destination.systemImage,
color: self.color(for: destination),
size: 46)
HStack(alignment: .top, spacing: 6) {
VStack(alignment: .leading, spacing: 2) {
Text(destination.title)
.font(OpenClawType.headline)
.foregroundStyle(.primary)
Text(subtitle)
.font(OpenClawType.caption2)
.foregroundStyle(.secondary)
.lineLimit(2)
}
Spacer(minLength: 4)
Image(systemName: "chevron.right")
.font(OpenClawType.caption2Bold)
.foregroundStyle(.secondary)
}
}
.frame(maxWidth: .infinity, minHeight: 128, alignment: .leading)
}
}
.buttonStyle(.plain)
.frame(maxWidth: .infinity, alignment: .leading)
}
private func destinationRow(_ destination: RootTabs.SidebarDestination) -> some View {
NavigationLink(value: destination) {
self.rowLabel(destination)
}
}
private func rowLabel(_ destination: RootTabs.SidebarDestination) -> some View {
Label {
Text(destination.title)
.font(OpenClawType.subheadSemiBold)
.foregroundStyle(.primary)
} icon: {
ControlCircleIcon(
systemName: destination.systemImage,
color: self.color(for: destination),
size: 34)
}
}
@ViewBuilder
private func detail(for destination: RootTabs.SidebarDestination) -> some View {
switch destination {
case .chat, .agents:
EmptyView()
case .gateway:
SettingsProTab(directRoute: .gateway)
case .overview:
CommandCenterTab(
ownsNavigationStack: false,
usesNativeNavigationChrome: true,
headerTitle: "Overview",
showsHeaderMark: false,
openChat: { self.openChatFromControlDetail(.overview) },
openSettings: { self.openGatewayDetail() },
openSessions: { self.navigationPath.append(.sessions) })
case .activity:
IPadActivityScreen(
usesNativeNavigationChrome: true,
openChat: { self.openChatFromControlDetail(.activity) },
openSettings: { self.openGatewayDetail() })
case .workboard:
IPadWorkboardScreen(
usesNativeNavigationChrome: true,
openChat: { self.openChatFromControlDetail(.workboard) },
openSettings: { self.openGatewayDetail() })
case .skillWorkshop:
IPadSkillWorkshopScreen(
usesNativeNavigationChrome: true,
openSettings: { self.openGatewayDetail() })
case .instances:
AgentProTab(
directRoute: .instances,
headerTitle: "Instances",
openSettings: { self.openGatewayDetail() })
case .sessions:
CommandSessionsScreen(
usesNativeNavigationChrome: true,
openChat: { self.openChatFromControlDetail(.sessions) })
case .files:
AgentProTab(
directRoute: .files,
headerTitle: "Files",
openSettings: { self.openGatewayDetail() })
case .dreaming:
AgentProTab(
directRoute: .dreaming,
headerTitle: "Dreaming",
openSettings: { self.openGatewayDetail() })
case .usage:
AgentProTab(
directRoute: .usage,
headerTitle: "Usage",
openSettings: { self.openGatewayDetail() })
case .cron:
AgentProTab(
directRoute: .cron,
headerTitle: "Automations",
openSettings: { self.openGatewayDetail() })
case .terminal:
TerminalHubScreen(
usesNativeNavigationChrome: true,
gatewayAction: { self.openGatewayDetail() })
case .docs:
OpenClawDocsScreen(
usesNativeNavigationChrome: true,
gatewayAction: { self.openGatewayDetail() })
case .settings:
SettingsProTab(directRoute: .voice)
}
}
/// Gateway settings open as a pushed detail on this stack so Back returns
/// to the hub screen the user came from, not the canonical Settings tab.
private func openGatewayDetail() {
self.navigationPath.append(.gateway)
}
private func openPhoneRootDestination(_ destination: RootTabs.SidebarDestination) {
self.navigationPath.removeAll()
self.openRootDestination(destination)
}
private func opensRootTab(_ destination: RootTabs.SidebarDestination) -> Bool {
RootTabs.shouldOpenRootTabFromPhoneHub(destination)
}
private var phoneDestinations: [RootTabs.SidebarDestination] {
self.groups.flatMap(\.destinations).filter { !self.opensRootTab($0) }
}
private func applyInitialDestinationIfNeeded() {
guard !self.didApplyInitialDestination else { return }
self.didApplyInitialDestination = true
guard let initialDestination, initialDestination != .overview else { return }
self.applyDestination(initialDestination)
}
private func applyNavigationRequestIfNeeded() {
guard let navigationRequest, navigationRequest.id != self.handledNavigationRequestID else { return }
self.handledNavigationRequestID = navigationRequest.id
switch navigationRequest.target {
case .root:
self.navigationPath.removeAll()
case let .detail(destination):
self.applyDestination(destination)
}
}
private func applyDestination(_ destination: RootTabs.SidebarDestination) {
if self.opensRootTab(destination) {
self.openPhoneRootDestination(destination)
} else {
self.navigationPath = [destination]
}
}
private var sidebarActiveAgentTitle: String {
let selectedID = self.normalized(self.appModel.selectedAgentId) ?? self.resolveDefaultAgentID()
if let agent = self.appModel.gatewayAgents.first(where: { $0.id == selectedID }) {
return self.agentTitle(for: agent)
}
return self.normalized(self.appModel.activeAgentName) ?? String(localized: "Default Agent")
}
private var gatewayDisplayLabel: String? {
self.normalized(self.appModel.gatewayServerName)
?? self.normalized(self.appModel.gatewayRemoteAddress)
}
@ViewBuilder
private var gatewayIdentityTitle: some View {
// Gateway names are server data; only the product fallback is localizable.
if let gatewayDisplayLabel {
Text(verbatim: gatewayDisplayLabel)
.font(OpenClawType.headlineBold)
} else {
Text("Gateway")
.font(OpenClawType.headlineBold)
}
}
private var gatewayAccessibilityLabel: Text {
if let gatewayDisplayLabel {
Text(verbatim: String(
format: String(localized: "Gateway %1$@, %2$@, %3$@"),
self.gatewayStateText,
gatewayDisplayLabel,
self.sidebarActiveAgentTitle))
.font(OpenClawType.captionMedium)
} else {
Text(verbatim: String(
format: String(localized: "Gateway %1$@, %2$@"),
self.gatewayStateText,
self.sidebarActiveAgentTitle))
.font(OpenClawType.captionMedium)
}
}
private var gatewayStateText: String {
switch GatewayStatusBuilder.build(appModel: self.appModel) {
case .connected: String(localized: "Online")
case .connecting: String(localized: "Connecting")
case .error: String(localized: "Attention")
case .disconnected: String(localized: "Offline")
}
}
private var gatewayStateColor: Color {
switch GatewayStatusBuilder.build(appModel: self.appModel) {
case .connected:
OpenClawBrand.ok
case .connecting:
OpenClawBrand.accent
case .error:
OpenClawBrand.warn
case .disconnected:
.secondary
}
}
private func color(for destination: RootTabs.SidebarDestination) -> Color {
switch destination {
case .chat:
OpenClawBrand.ok
case .skillWorkshop, .files:
OpenClawBrand.info
case .overview:
OpenClawBrand.warn
case .activity:
OpenClawBrand.accent
case .workboard:
.purple
case .instances, .sessions, .dreaming, .terminal:
.secondary
case .usage, .docs:
OpenClawBrand.accentHot
case .agents, .cron, .settings, .gateway:
OpenClawBrand.ok
}
}
private func resolveDefaultAgentID() -> String {
self.normalized(self.appModel.gatewayDefaultAgentId) ?? ""
}
private func agentTitle(for agent: AgentSummary) -> String {
let name = self.normalized(agent.name) ?? agent.id
return name == agent.id ? name : "\(name) (\(agent.id))"
}
private func normalized(_ value: String?) -> String? {
guard let value else { return nil }
let trimmed = value.trimmingCharacters(in: .whitespacesAndNewlines)
return trimmed.isEmpty ? nil : trimmed
}
}
private struct ControlCircleIcon: View {
@Environment(\.colorScheme) private var colorScheme
let systemName: String
let color: Color
let size: CGFloat
var body: some View {
Image(systemName: self.systemName)
.font(.system(size: self.size * 0.42, weight: .semibold))
.foregroundStyle(self.iconForegroundStyle)
.frame(width: self.size, height: self.size)
.background(
LinearGradient(
colors: [self.color.opacity(0.72), self.color],
startPoint: .topLeading,
endPoint: .bottomTrailing),
in: Circle())
}
private var iconForegroundStyle: Color {
self.colorScheme == .dark ? .black.opacity(0.82) : .white
}
}
#if DEBUG
#Preview("Phone control hub offline") {
RootTabsPhoneControlHub.preview(appModel: NodeAppModel())
}
#Preview("Phone control hub connected") {
let appModel = NodeAppModel()
appModel.enterAppleReviewDemoMode()
return RootTabsPhoneControlHub.preview(appModel: appModel)
}
#Preview("Phone control hub connecting") {
let appModel = NodeAppModel()
appModel.gatewayStatusText = "Connecting..."
return RootTabsPhoneControlHub.preview(appModel: appModel)
}
#Preview("Phone control hub gateway error") {
let appModel = NodeAppModel()
appModel.gatewayStatusText = "Gateway error: connection refused"
return RootTabsPhoneControlHub.preview(appModel: appModel)
}
#Preview(
"Phone control hub landscape",
traits: .fixedLayout(width: 852, height: 393),
.landscapeLeft)
{
RootTabsPhoneControlHub.preview(appModel: NodeAppModel())
.environment(\.horizontalSizeClass, .regular)
.environment(\.verticalSizeClass, .compact)
}
extension RootTabsPhoneControlHub {
fileprivate static func preview(appModel: NodeAppModel) -> some View {
RootTabsPhoneControlHub(
groups: RootTabs.phoneControlGroups,
initialDestination: nil,
navigationRequest: nil,
openRootDestination: { _ in },
openChatFromControlDetail: { _ in })
.environment(appModel)
}
}
#endif
+5 -5
View File
@@ -90,7 +90,7 @@ struct SettingsProTab: View {
let initialRoute: SettingsRoute?
let directRoute: SettingsRoute?
let acceptsGatewaySetupRequests: Bool
let headerLeadingAction: OpenClawSidebarHeaderAction?
let headerSidebarAction: OpenClawSidebarHeaderAction?
let ownsNavigationStack: Bool
let navigateToRoute: ((SettingsRoute) -> Void)?
let onRouteChange: ((SettingsRoute?) -> Void)?
@@ -102,7 +102,7 @@ struct SettingsProTab: View {
initialRoute: SettingsRoute? = nil,
directRoute: SettingsRoute? = nil,
acceptsGatewaySetupRequests: Bool = false,
headerLeadingAction: OpenClawSidebarHeaderAction? = nil,
headerSidebarAction: OpenClawSidebarHeaderAction? = nil,
ownsNavigationStack: Bool = true,
navigateToRoute: ((SettingsRoute) -> Void)? = nil,
onRouteChange: ((SettingsRoute?) -> Void)? = nil,
@@ -113,7 +113,7 @@ struct SettingsProTab: View {
self.initialRoute = initialRoute
self.directRoute = directRoute
self.acceptsGatewaySetupRequests = acceptsGatewaySetupRequests
self.headerLeadingAction = headerLeadingAction
self.headerSidebarAction = headerSidebarAction
self.ownsNavigationStack = ownsNavigationStack
self.navigateToRoute = navigateToRoute
self.onRouteChange = onRouteChange
@@ -158,9 +158,9 @@ struct SettingsProTab: View {
self.destination(for: route)
}
.toolbar {
if let headerLeadingAction {
if let headerSidebarAction {
ToolbarItem(placement: .topBarLeading) {
OpenClawSidebarRevealButton(action: headerLeadingAction)
OpenClawSidebarRevealButton(action: headerSidebarAction)
}
}
}
@@ -55,6 +55,7 @@ private struct AppearanceSettingsRow: View {
private struct AppearanceSettingsScreen: View {
@Environment(AppAppearanceModel.self) private var appearanceModel
@Environment(\.dismiss) private var dismiss
@AppStorage(RootSidebar.visibleAgentCountKey) private var sidebarVisibleAgentCount: Int = 1
var body: some View {
List {
@@ -86,6 +87,23 @@ private struct AppearanceSettingsScreen: View {
Text("System follows this devices appearance setting.")
.font(OpenClawType.footnote)
}
Section {
Stepper(value: self.$sidebarVisibleAgentCount, in: 1...3) {
HStack {
Text("Sidebar Agents")
.font(OpenClawType.body)
Spacer()
Text(verbatim: self.sidebarVisibleAgentCount.formatted())
.font(OpenClawType.body)
.foregroundStyle(.secondary)
}
}
.accessibilityIdentifier("settings-appearance-sidebar-agents")
} footer: {
Text("How many agents the sidebar lists before the switcher menu.")
.font(OpenClawType.footnote)
}
}
.navigationTitle("Appearance")
.navigationBarTitleDisplayMode(.inline)
@@ -272,11 +290,6 @@ extension SettingsProTab {
await self.appModel.refreshWatchMessagingStatus()
}
.toolbar {
if let headerLeadingAction {
ToolbarItem(placement: .topBarLeading) {
OpenClawSidebarHeaderLeadingSlot(action: headerLeadingAction)
}
}
ToolbarItem(placement: .principal) {
Text(title(for: route))
.font(OpenClawType.headline)
@@ -294,6 +307,11 @@ extension SettingsProTab {
.accessibilityLabel("Scan QR")
}
}
if let headerSidebarAction {
ToolbarItem(placement: .topBarLeading) {
OpenClawSidebarHeaderLeadingSlot(action: headerSidebarAction)
}
}
}
}
}
@@ -1045,7 +1063,7 @@ extension SettingsProTab {
}
.font(OpenClawType.body)
} footer: {
Text("Used for new Chat threads and Talk sessions.")
Text("Used for new Chat and Talk sessions.")
.font(OpenClawType.footnote)
}
}
+29 -1
View File
@@ -462,6 +462,12 @@ final class NodeAppModel {
var homeCanvasRevision: Int = 0
var lastShareEventText: String = "No share events yet."
var openChatRequestID: Int = 0
var newChatRequestID: Int = 0
// RootTabs has one chat destination; keep its acknowledgement here so recreating
// that destination cannot replay a request that the prior view already handled.
@ObservationIgnored private var consumedNewChatRequestID: Int = 0
var dashboardNavigationRequestID: Int = 0
@ObservationIgnored private var consumedDashboardNavigationRequestID: Int = 0
var gatewaySetupRequestID: Int = 0
private(set) var pendingAgentDeepLinkPrompt: AgentDeepLinkPrompt?
private var pendingGatewaySetupLink: GatewayConnectDeepLink?
@@ -3553,6 +3559,28 @@ extension NodeAppModel {
self.openChatRequestID &+= 1
}
func requestNewChat() {
self.newChatRequestID &+= 1
}
func consumeNewChatRequest(_ requestID: Int) -> Bool {
guard requestID != 0,
requestID == self.newChatRequestID,
requestID != self.consumedNewChatRequestID
else { return false }
self.consumedNewChatRequestID = requestID
return true
}
func consumeDashboardNavigationRequest(_ requestID: Int) -> Bool {
guard requestID != 0,
requestID == self.dashboardNavigationRequestID,
requestID != self.consumedDashboardNavigationRequestID
else { return false }
self.consumedDashboardNavigationRequestID = requestID
return true
}
/// One acknowledgement per unread episode: the pending flag clears when a fresh
/// snapshot confirms the read (unread != true), so a run finishing while the
/// session stays open re-acknowledges without patch loops (the gateway stamps
@@ -10252,7 +10280,7 @@ extension NodeAppModel {
case let .gateway(link):
self.stageGatewaySetupLink(link)
case .dashboard:
break
self.dashboardNavigationRequestID &+= 1
}
}
+908
View File
@@ -0,0 +1,908 @@
import OpenClawChatUI
import OpenClawProtocol
import SwiftUI
struct RootSidebar: View {
@Environment(NodeAppModel.self) private var appModel
@Environment(\.displayScale) private var displayScale
@Bindable var model: RootSidebarModel
@State private var searchText = ""
@State private var isSearchActive = false
@State private var showsPagesEditor = false
@FocusState private var isSearchFocused: Bool
@AppStorage("sidebar.pinnedPages") private var pinnedPagesStorage: String = ""
@AppStorage(RootSidebar.visibleAgentCountKey) private var visibleAgentCount: Int = 1
let selectedDestination: RootTabs.SidebarDestination
let isDrawerLayout: Bool
let selectDestination: (RootTabs.SidebarDestination) -> Void
let selectSettingsRoute: (SettingsRoute) -> Void
let hideSidebar: () -> Void
var body: some View {
VStack(spacing: 0) {
self.brandHeader
if self.isSearchActive {
self.searchField
}
ScrollView {
// One 10pt unit everywhere: side insets, section gaps, and
// the picker card's clearance all match.
LazyVStack(alignment: .leading, spacing: 10) {
self.agentsSection
self.pagesSection
self.sessionsSection
}
.padding(.horizontal, 10)
.padding(.vertical, 10)
}
self.footer
}
.foregroundStyle(OpenClawSidebarPalette.text)
.background(OpenClawSidebarPalette.background)
.sheet(isPresented: self.$showsPagesEditor) {
RootSidebarPagesEditor(
pinnedPages: self.pinnedPages,
onSelect: { destination in
self.showsPagesEditor = false
self.selectSidebarDestination(destination)
},
onTogglePin: self.togglePinnedPage)
}
}
private var pinnedPages: [RootTabs.SidebarDestination] {
RootTabs.pinnedSidebarPages(from: self.pinnedPagesStorage)
}
private func togglePinnedPage(_ destination: RootTabs.SidebarDestination) {
var pages = self.pinnedPages
if let index = pages.firstIndex(of: destination) {
pages.remove(at: index)
} else {
pages.append(destination)
}
self.pinnedPagesStorage = RootTabs.pinnedSidebarPagesStorage(pages)
}
/// Brand header with compact actions; the gear owns Settings entry
/// (prototype parity) so the footer stays connection-only.
private var brandHeader: some View {
HStack(spacing: 4) {
HStack(spacing: 8) {
OpenClawProMark(size: 26, shadowRadius: 2)
.accessibilityHidden(true)
Text(String(localized: "OpenClaw"))
.font(OpenClawType.headline)
.foregroundStyle(OpenClawSidebarPalette.textStrong)
.lineLimit(1)
}
.padding(.leading, 6)
Spacer(minLength: 4)
self.headerIconButton(
systemName: "magnifyingglass",
label: String(localized: "Search sessions"))
{
withAnimation(.easeInOut(duration: 0.15)) {
self.isSearchActive.toggle()
}
if self.isSearchActive {
self.isSearchFocused = true
} else {
self.searchText = ""
}
}
self.headerIconButton(
systemName: "gearshape",
label: String(localized: "Settings"))
{
self.selectSidebarDestination(.settings)
}
if self.isDrawerLayout {
Button(action: self.dismissSidebar) {
Image(systemName: "xmark")
.font(OpenClawType.subheadSemiBold)
.frame(width: 40, height: 44)
.contentShape(Rectangle())
}
.buttonStyle(.plain)
.foregroundStyle(OpenClawSidebarPalette.accent)
.accessibilityLabel(String(localized: "Hide Sidebar"))
.accessibilityIdentifier(RootTabs.sidebarHideButtonAccessibilityIdentifier)
}
}
.padding(.leading, 8)
.padding(.trailing, 8)
.padding(.vertical, 8)
.background(OpenClawSidebarPalette.background)
.overlay(alignment: .bottom) { self.separator }
}
/// Prototype-style agent roster: up to `visibleAgentCount` rows inline
/// (owner setting, default 1) and a switcher menu for the rest.
@ViewBuilder
private var agentsSection: some View {
let agents = self.orderedAgents
let shownCount = Self.shownAgentCount(configured: self.visibleAgentCount, total: agents.count)
if !agents.isEmpty {
VStack(alignment: .leading, spacing: 2) {
ForEach(agents.prefix(shownCount), id: \.id) { agent in
self.agentRow(agent)
}
if agents.count > shownCount {
self.moreAgentsRow(Array(agents.dropFirst(shownCount)))
}
}
.padding(4)
.background(.ultraThinMaterial, in: RoundedRectangle(
cornerRadius: OpenClawProMetric.cardRadius,
style: .continuous))
}
}
static let visibleAgentCountKey = "sidebar.visibleAgentCount"
static func shownAgentCount(configured: Int, total: Int) -> Int {
min(max(configured, 1), max(total, 1))
}
/// Selected agent leads; the rest keep the gateway roster order.
private var orderedAgents: [AgentSummary] {
let agents = self.appModel.gatewayAgents
guard let index = agents.firstIndex(where: { $0.id == self.currentAgentID }), index != 0 else {
return agents
}
var ordered = agents
let selected = ordered.remove(at: index)
ordered.insert(selected, at: 0)
return ordered
}
private func agentRow(_ agent: AgentSummary) -> some View {
let isSelected = agent.id == self.currentAgentID
return Button {
self.appModel.setSelectedAgentId(agent.id)
} label: {
HStack(spacing: 9) {
ZStack(alignment: .bottomTrailing) {
ZStack {
Circle()
.fill(OpenClawSidebarPalette.elevated)
Text(verbatim: Self.agentBadge(name: Self.agentDisplayName(agent), identity: agent.identity))
.font(OpenClawType.caption2Bold)
.foregroundStyle(OpenClawSidebarPalette.textStrong)
}
.frame(width: 28, height: 28)
if isSelected {
Circle()
.fill(OpenClawBrand.ok)
.frame(width: 8, height: 8)
.overlay(Circle().stroke(OpenClawSidebarPalette.background, lineWidth: 1.5))
}
}
.accessibilityHidden(true)
VStack(alignment: .leading, spacing: 1) {
Text(verbatim: Self.agentDisplayName(agent))
.font(OpenClawType.subheadSemiBold)
.foregroundStyle(OpenClawSidebarPalette.textStrong)
.lineLimit(1)
if let model = Self.agentModelLabel(agent) {
Text(verbatim: model)
.font(OpenClawType.caption2Medium)
.foregroundStyle(OpenClawSidebarPalette.muted)
.lineLimit(1)
}
}
Spacer(minLength: 4)
}
.frame(maxWidth: .infinity, minHeight: 44, alignment: .leading)
.padding(.horizontal, 10)
.contentShape(Rectangle())
}
.buttonStyle(.plain)
.background(isSelected ? OpenClawSidebarPalette.selection : Color.clear, in: RoundedRectangle(
cornerRadius: OpenClawProMetric.controlRadius,
style: .continuous))
.accessibilityValue(isSelected ? String(localized: "Selected") : "")
}
private func moreAgentsRow(_ agents: [AgentSummary]) -> some View {
Menu {
ForEach(agents, id: \.id) { agent in
Button {
self.appModel.setSelectedAgentId(agent.id)
} label: {
Text(verbatim: Self.agentDisplayName(agent))
.font(OpenClawType.subheadSemiBold)
}
}
} label: {
HStack(spacing: 9) {
Image(systemName: "chevron.up.chevron.down")
.font(OpenClawType.captionSemiBold)
.frame(width: 28)
Text(String(localized: "More Agents"))
.font(OpenClawType.subheadSemiBold)
.lineLimit(1)
Spacer(minLength: 4)
}
.frame(maxWidth: .infinity, minHeight: 40, alignment: .leading)
.padding(.horizontal, 10)
.contentShape(Rectangle())
}
.buttonStyle(.plain)
.foregroundStyle(OpenClawSidebarPalette.muted)
}
/// Same key order the Agents roster uses for its model subtitles.
static func agentModelLabel(_ agent: AgentSummary) -> String? {
guard let model = agent.model else { return nil }
for key in ["primary", "name", "id", "model"] {
if let value = (model[key]?.value as? String)?.trimmingCharacters(in: .whitespacesAndNewlines),
!value.isEmpty
{
return value
}
}
return nil
}
private func headerIconButton(
systemName: String,
label: String,
action: @escaping () -> Void) -> some View
{
Button(action: action) {
Image(systemName: systemName)
.font(OpenClawType.subheadSemiBold)
.frame(width: 40, height: 44)
.contentShape(Rectangle())
}
.buttonStyle(.plain)
.foregroundStyle(OpenClawSidebarPalette.text)
.accessibilityLabel(label)
}
private var currentAgentID: String {
let selected = self.appModel.selectedAgentId?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
if !selected.isEmpty { return selected }
return self.appModel.gatewayDefaultAgentId?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
}
static func agentDisplayName(_ agent: AgentSummary) -> String {
let name = agent.name?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
return name.isEmpty ? agent.id : name
}
static func agentBadge(name: String, identity: [String: AnyCodable]?) -> String {
if let emoji = (identity?["emoji"]?.value as? String)?.trimmingCharacters(in: .whitespacesAndNewlines),
!emoji.isEmpty
{
return emoji
}
let initials = name
.split(whereSeparator: { $0.isWhitespace || $0 == "-" || $0 == "_" })
.prefix(2)
.compactMap(\.first)
.map(String.init)
.joined()
return initials.isEmpty ? "OC" : initials.uppercased()
}
private var searchField: some View {
HStack(spacing: 8) {
Image(systemName: "magnifyingglass")
.font(OpenClawType.captionSemiBold)
.foregroundStyle(OpenClawSidebarPalette.muted)
.accessibilityHidden(true)
ZStack(alignment: .leading) {
if self.searchText.isEmpty {
Text(String(localized: "Search sessions"))
.font(OpenClawType.subhead)
.foregroundStyle(OpenClawSidebarPalette.muted)
.accessibilityHidden(true)
}
TextField("", text: self.$searchText)
.font(OpenClawType.subhead)
.foregroundStyle(OpenClawSidebarPalette.textStrong)
.textInputAutocapitalization(.never)
.autocorrectionDisabled()
.focused(self.$isSearchFocused)
.accessibilityLabel(String(localized: "Search sessions"))
}
if !self.searchText.isEmpty {
Button {
self.searchText = ""
} label: {
Image(systemName: "xmark.circle.fill")
.font(OpenClawType.subhead)
.foregroundStyle(OpenClawSidebarPalette.muted)
}
.buttonStyle(.plain)
.accessibilityLabel(String(localized: "Clear session search"))
}
}
.frame(minHeight: 44)
.padding(.horizontal, 12)
.background(OpenClawSidebarPalette.elevated, in: RoundedRectangle(
cornerRadius: OpenClawProMetric.controlRadius,
style: .continuous))
.padding(.horizontal, 10)
.padding(.bottom, 4)
}
@ViewBuilder
private var sessionsSection: some View {
let sections = self.visibleSessionSections
let selectedSessionKey = self.resolvedSelectedSessionKey
VStack(alignment: .leading, spacing: 6) {
if let sessionErrorText = self.model.sessionErrorText {
Text(verbatim: sessionErrorText)
.font(OpenClawType.captionMedium)
.foregroundStyle(OpenClawBrand.warn)
.frame(maxWidth: .infinity, alignment: .leading)
.padding(.horizontal, 10)
}
if self.model.isRefreshing, self.model.sessions.isEmpty {
self.sessionsHeader(String(localized: "Recent"))
HStack(spacing: 9) {
ProgressView().controlSize(.small)
Text(String(localized: "Loading sessions"))
.font(OpenClawType.captionMedium)
.foregroundStyle(OpenClawSidebarPalette.muted)
}
.frame(minHeight: 44)
.padding(.horizontal, 10)
} else if sections.isEmpty {
self.sessionsHeader(String(localized: "Recent"))
Text(String(localized: "No recent sessions"))
.font(OpenClawType.captionMedium)
.foregroundStyle(OpenClawSidebarPalette.muted)
.frame(maxWidth: .infinity, minHeight: 44, alignment: .leading)
.padding(.horizontal, 10)
} else {
ForEach(Array(sections.enumerated()), id: \.element.id) { index, section in
// Sole ungrouped section carries no model title; the web
// and apps agree on calling it Recent. New Chat rides the
// first header so it lives where sessions live.
let title = section.title ?? String(localized: "Recent")
if index == 0 {
self.sessionsHeader(title)
} else {
self.sectionTitle(title)
}
ForEach(self.sessionNodes(for: section)) { node in
self.sessionButton(node, selectedSessionKey: selectedSessionKey)
}
}
}
Button {
self.selectSidebarDestination(.sessions)
} label: {
Label {
Text(String(localized: "All Sessions…"))
.font(OpenClawType.subheadSemiBold)
} icon: {
Image(systemName: "rectangle.stack")
.font(OpenClawType.subheadSemiBold)
}
.frame(maxWidth: .infinity, minHeight: 44, alignment: .leading)
.padding(.horizontal, 10)
.contentShape(Rectangle())
}
.buttonStyle(.plain)
.foregroundStyle(OpenClawSidebarPalette.accent)
}
}
private var pagesSection: some View {
VStack(alignment: .leading, spacing: 2) {
HStack(spacing: 4) {
self.sectionTitle(String(localized: "Pages"))
Spacer(minLength: 4)
Button {
self.showsPagesEditor = true
} label: {
Image(systemName: "square.and.pencil")
.font(OpenClawType.captionSemiBold)
.frame(width: 40, height: 32)
.contentShape(Rectangle())
}
.buttonStyle(.plain)
.foregroundStyle(OpenClawSidebarPalette.muted)
.accessibilityLabel(String(localized: "Edit Pages"))
}
self.homeRow
ForEach(self.pinnedPages) { destination in
self.destinationButton(destination)
}
}
}
/// Fixed first Pages row like the web "Home": opens the agent's chat and
/// carries the main session's run/unread state.
private var homeRow: some View {
let mainKey = self.resolvedMainSessionKey
let isSelected = self.selectedDestination == .chat &&
self.resolvedSelectedSessionKey.caseInsensitiveCompare(mainKey) == .orderedSame
let mainSession = self.mainSessionEntry
return Button {
self.appModel.openChat(sessionKey: mainKey, unread: mainSession?.unread == true)
self.selectSidebarDestination(.chat)
} label: {
HStack(spacing: 9) {
Image(systemName: "house")
.font(OpenClawType.subheadSemiBold)
.frame(width: 18)
Text(String(localized: "Home"))
.font(OpenClawType.subheadSemiBold)
.lineLimit(1)
Spacer(minLength: 4)
if mainSession?.hasActiveRun == true {
ProgressView()
.controlSize(.mini)
.tint(OpenClawSidebarPalette.accent)
} else if mainSession?.unread == true {
Circle()
.fill(OpenClawSidebarPalette.accent)
.frame(width: 7, height: 7)
.accessibilityHidden(true)
}
}
.frame(maxWidth: .infinity, minHeight: 44, alignment: .leading)
.padding(.horizontal, 10)
.contentShape(Rectangle())
}
.buttonStyle(.plain)
.foregroundStyle(isSelected ? OpenClawSidebarPalette.accent : OpenClawSidebarPalette.text)
.background(isSelected ? OpenClawSidebarPalette.selection : Color.clear, in: RoundedRectangle(
cornerRadius: OpenClawProMetric.controlRadius,
style: .continuous))
.accessibilityValue(mainSession?.unread == true ? String(localized: "Unread") : "")
}
/// Web-parity compact footer: connection state left, Settings gear right.
private var footer: some View {
VStack(spacing: 0) {
self.separator
HStack(spacing: 4) {
Button {
self.selectSidebarDestination(.gateway)
} label: {
HStack(spacing: 9) {
// The agent card owns the healthy status; like the web
// footer, a dot appears here only when degraded.
if !self.isGatewayConnected {
Circle()
.fill(self.gatewayStatusColor)
.frame(width: 8, height: 8)
.accessibilityHidden(true)
}
Text(verbatim: self.gatewayName)
.font(OpenClawType.subheadSemiBold)
.lineLimit(1)
}
.frame(minHeight: 44, alignment: .leading)
.padding(.horizontal, 10)
.contentShape(Rectangle())
}
.buttonStyle(.plain)
.foregroundStyle(OpenClawSidebarPalette.text)
.accessibilityValue(self.gatewayStatusTitle)
Spacer(minLength: 4)
}
}
.padding(.horizontal, 10)
.padding(.bottom, 8)
.background(OpenClawSidebarPalette.background)
}
/// Alias-aware main lookup: rosters may return namespaced keys
/// ("agent:<id>:main"), so raw comparison would drop Home's badges.
private var mainSessionEntry: OpenClawChatSessionEntry? {
self.model.sessions.first { $0.key == self.resolvedMainSessionKey }
}
private var resolvedMainSessionKey: String {
ChatSessionSidebarModel.selectedSessionKey(
sessions: self.model.sessions,
currentSessionKey: "main",
mainSessionKey: self.appModel.defaultChatSessionKey,
activeAgentID: self.appModel.chatAgentId)
}
private var resolvedSelectedSessionKey: String {
ChatSessionSidebarModel.selectedSessionKey(
sessions: self.model.sessions,
currentSessionKey: self.appModel.chatSessionKey,
mainSessionKey: self.appModel.defaultChatSessionKey,
activeAgentID: self.appModel.chatAgentId)
}
private var visibleSessionSections: [ChatSessionSidebarModel.Section] {
self.model.sections(
query: self.searchText,
currentSessionKey: self.appModel.chatSessionKey,
mainSessionKey: self.appModel.defaultChatSessionKey,
activeAgentID: self.appModel.chatAgentId,
groups: self.sessionGroups)
}
private var sessionCategories: [String] {
CommandSessionGrouping.categories(from: self.model.sessions, knownGroups: SessionGroupStore.load())
}
private var sessionGroups: [OpenClawChatSessionGroup] {
self.sessionCategories.enumerated().map { offset, name in
OpenClawChatSessionGroup(name: name, position: offset)
}
}
private func flattened(_ nodes: [ChatSessionSidebarModel.Node]) -> [ChatSessionSidebarModel.Node] {
nodes.flatMap { [$0] + self.flattened($0.children) }
}
private func sessionNodes(for section: ChatSessionSidebarModel.Section) -> [ChatSessionSidebarModel.Node] {
let nodes = self.flattened(section.nodes)
guard section.id == "recent", let limit = Self.recentSessionCap(searchText: self.searchText) else {
return nodes
}
return Array(nodes.prefix(limit))
}
static func recentSessionCap(searchText: String) -> Int? {
searchText.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty ? 20 : nil
}
private func sessionButton(
_ node: ChatSessionSidebarModel.Node,
selectedSessionKey: String) -> some View
{
let session = node.session
let isSelected = session.key == selectedSessionKey
return Button {
self.appModel.openChat(sessionKey: session.key, unread: session.unread == true)
self.selectSidebarDestination(.chat)
} label: {
HStack(spacing: 9) {
ZStack {
if node.badges.runningCount > 0 {
ProgressView()
.controlSize(.mini)
.tint(OpenClawSidebarPalette.accent)
} else {
Image(systemName: "bubble.left")
.font(OpenClawType.captionSemiBold)
.foregroundStyle(isSelected
? OpenClawSidebarPalette.accent
: OpenClawSidebarPalette.muted)
}
}
.frame(width: 18)
VStack(alignment: .leading, spacing: 2) {
Text(verbatim: CommandCenterTab.sessionTitle(session))
.font(OpenClawType.subheadSemiBold)
.foregroundStyle(isSelected
? OpenClawSidebarPalette.accent
: OpenClawSidebarPalette.textStrong)
.lineLimit(1)
// Web-parity subtitle: the work line (repo/branch) names the
// session; recency moves to the trailing metadata slot.
if let workSubtitle = ChatSessionSidebarModel.workSubtitle(for: session) {
Text(verbatim: workSubtitle)
.font(OpenClawType.caption2Medium)
.foregroundStyle(OpenClawSidebarPalette.muted)
.lineLimit(1)
}
}
Spacer(minLength: 4)
Text(verbatim: CommandCenterTab.sessionDetail(session))
.font(OpenClawType.caption2Medium)
.foregroundStyle(OpenClawSidebarPalette.muted)
.lineLimit(1)
if session.unread == true {
Circle()
.fill(OpenClawSidebarPalette.accent)
.frame(width: 7, height: 7)
.accessibilityHidden(true)
}
if session.pinned == true {
Image(systemName: "pin.fill")
.font(OpenClawType.caption2Medium)
.foregroundStyle(OpenClawSidebarPalette.accent)
.accessibilityHidden(true)
}
}
.frame(maxWidth: .infinity, minHeight: 44, alignment: .leading)
.padding(.horizontal, 10)
.contentShape(Rectangle())
}
.buttonStyle(.plain)
.background(isSelected ? OpenClawSidebarPalette.selection : Color.clear, in: RoundedRectangle(
cornerRadius: OpenClawProMetric.controlRadius,
style: .continuous))
.commandSessionActions(
session: session,
categories: self.sessionCategories,
isEnabled: self.appModel.isOperatorGatewayConnected,
canArchive: ChatSessionSidebarModel.canArchiveSession(
session,
mainSessionKey: self.resolvedMainSessionKey),
canDelete: ChatSessionSidebarModel.canDeleteSession(
key: session.key,
mainSessionKey: self.resolvedMainSessionKey),
actions: CommandSessionActions(
rename: { self.patchSession(session, label: .some($0)) },
moveToGroup: { self.patchSession(session, category: .some($0)) },
togglePinned: { self.patchSession(session, pinned: session.pinned != true) },
toggleUnread: { self.patchSession(session, unread: session.unread != true) },
fork: { self.forkSession(session) },
toggleArchived: { self.patchSession(session, archived: true) },
delete: { self.deleteSession(session) }))
.accessibilityValue(session.unread == true ? String(localized: "Unread") : "")
}
private func destinationButton(_ destination: RootTabs.SidebarDestination) -> some View {
let isSelected = destination == self.selectedDestination
let badgeCount = self.badgeCount(for: destination)
return Button {
self.selectSidebarDestination(destination)
} label: {
HStack(spacing: 0) {
Label {
Text(destination.sidebarTitle)
.font(OpenClawType.subheadSemiBold)
.lineLimit(1)
} icon: {
Image(systemName: destination.systemImage)
.font(OpenClawType.subheadSemiBold)
}
Spacer(minLength: 6)
if badgeCount > 0 {
Text(verbatim: badgeCount.formatted())
.font(OpenClawType.caption2Bold)
.foregroundStyle(Color.white)
.padding(.horizontal, 6)
.frame(minWidth: 18, minHeight: 18)
.background(OpenClawSidebarPalette.accent, in: Capsule())
.accessibilityLabel(String(localized: "Attention"))
}
}
.frame(maxWidth: .infinity, minHeight: 44, alignment: .leading)
.padding(.horizontal, 10)
.contentShape(Rectangle())
}
.buttonStyle(.plain)
.foregroundStyle(isSelected ? OpenClawSidebarPalette.accent : OpenClawSidebarPalette.text)
.background(isSelected ? OpenClawSidebarPalette.selection : Color.clear, in: RoundedRectangle(
cornerRadius: OpenClawProMetric.controlRadius,
style: .continuous))
}
/// Attention lives on the rows that act on it (prototype parity): pending
/// approvals surface on Overview, cron issues on Automations.
private func badgeCount(for destination: RootTabs.SidebarDestination) -> Int {
switch destination {
case .overview: self.appModel.pendingExecApprovalCount
case .cron: self.model.failedCronJobCount + self.model.overdueCronJobCount
default: 0
}
}
private func sessionsHeader(_ title: String) -> some View {
HStack(spacing: 4) {
self.sectionTitle(title)
Spacer(minLength: 4)
Button {
self.appModel.requestNewChat()
self.selectSidebarDestination(.chat)
} label: {
Image(systemName: "plus.bubble")
.font(OpenClawType.captionSemiBold)
.frame(width: 40, height: 32)
.contentShape(Rectangle())
}
.buttonStyle(.plain)
.foregroundStyle(OpenClawSidebarPalette.muted)
.disabled(!self.appModel.isOperatorGatewayConnected)
.accessibilityLabel(String(localized: "New Chat"))
}
}
private func sectionTitle(_ title: String) -> some View {
Text(verbatim: title.uppercased())
.font(OpenClawType.caption2Bold)
.foregroundStyle(OpenClawSidebarPalette.muted)
.tracking(0.5)
.padding(.horizontal, 10)
}
private var separator: some View {
Rectangle()
.fill(OpenClawSidebarPalette.hairline)
.frame(height: 1 / self.displayScale)
}
private var gatewayName: String {
Self.gatewayName(
serverName: self.appModel.gatewayServerName,
remoteAddress: self.appModel.gatewayRemoteAddress)
}
static func gatewayName(serverName: String?, remoteAddress: String?) -> String {
for candidate in [serverName, remoteAddress] {
let trimmed = candidate?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
if !trimmed.isEmpty { return trimmed }
}
return String(localized: "Connection")
}
private var gatewayStatusTitle: String {
switch GatewayStatusBuilder.build(appModel: self.appModel) {
case .connected: String(localized: "Online")
case .connecting: String(localized: "Connecting")
case .error: String(localized: "Needs attention")
case .disconnected: String(localized: "Offline")
}
}
private var isGatewayConnected: Bool {
GatewayStatusBuilder.build(appModel: self.appModel) == .connected
}
private var gatewayStatusColor: Color {
switch GatewayStatusBuilder.build(appModel: self.appModel) {
case .connected: OpenClawBrand.ok
case .connecting: OpenClawBrand.accent
case .error: OpenClawBrand.warn
case .disconnected: OpenClawSidebarPalette.muted
}
}
private func patchSession(
_ session: OpenClawChatSessionEntry,
label: String?? = nil,
category: String?? = nil,
pinned: Bool? = nil,
archived: Bool? = nil,
unread: Bool? = nil)
{
Task {
do {
try await self.appModel.makeChatTransport().patchSession(
key: session.key,
label: label,
category: category,
pinned: pinned,
archived: archived,
unread: unread)
if archived == true, session.key == self.appModel.chatSessionKey {
self.appModel.focusChatSession(nil)
}
await self.model.refreshSessions(appModel: self.appModel)
} catch {
self.model.reportSessionError(error)
}
}
}
private func deleteSession(_ session: OpenClawChatSessionEntry) {
Task {
do {
try await self.appModel.makeChatTransport().deleteSession(key: session.key)
if session.key == self.appModel.chatSessionKey {
self.appModel.focusChatSession(nil)
}
await self.model.refreshSessions(appModel: self.appModel)
} catch {
self.model.reportSessionError(error)
}
}
}
private func forkSession(_ session: OpenClawChatSessionEntry) {
Task {
do {
let key = try await self.appModel.makeChatTransport().forkSession(parentKey: session.key)
self.appModel.openChat(sessionKey: key)
self.selectSidebarDestination(.chat)
await self.model.refreshSessions(appModel: self.appModel)
} catch {
self.model.reportSessionError(error)
}
}
}
private func selectSidebarDestination(_ destination: RootTabs.SidebarDestination) {
self.isSearchFocused = false
self.selectDestination(destination)
}
private func dismissSidebar() {
self.isSearchFocused = false
self.hideSidebar()
}
}
/// Web-parity Pages editor (the pen menu): navigate to any page, pin/unpin
/// which ones stay in the sidebar. Home is fixed and not listed.
struct RootSidebarPagesEditor: View {
let pinnedPages: [RootTabs.SidebarDestination]
let onSelect: (RootTabs.SidebarDestination) -> Void
let onTogglePin: (RootTabs.SidebarDestination) -> Void
@Environment(\.dismiss) private var dismiss
var body: some View {
NavigationStack {
List {
Section {
ForEach(RootTabs.pinnableSidebarPages) { destination in
self.pageRow(destination)
}
} footer: {
Text("Pinned pages stay in the sidebar. Home is always shown.")
.font(OpenClawType.caption)
}
}
.navigationTitle(String(localized: "Pages"))
.navigationBarTitleDisplayMode(.inline)
.toolbar {
ToolbarItem(placement: .confirmationAction) {
Button {
self.dismiss()
} label: {
Text(String(localized: "Done"))
.font(OpenClawType.subheadSemiBold)
}
}
}
}
.openClawSheetChrome()
}
private func pageRow(_ destination: RootTabs.SidebarDestination) -> some View {
let isPinned = self.pinnedPages.contains(destination)
return HStack(spacing: 10) {
Button {
self.onSelect(destination)
} label: {
Label {
Text(destination.sidebarTitle)
.font(OpenClawType.subheadSemiBold)
} icon: {
Image(systemName: destination.systemImage)
}
.frame(maxWidth: .infinity, alignment: .leading)
.contentShape(Rectangle())
}
.buttonStyle(.plain)
Button {
self.onTogglePin(destination)
} label: {
Image(systemName: isPinned ? "pin.fill" : "pin")
.font(OpenClawType.subheadSemiBold)
.foregroundStyle(isPinned ? OpenClawBrand.accent : Color.secondary)
.frame(width: 44, height: 44)
.contentShape(Rectangle())
}
.buttonStyle(.plain)
.accessibilityLabel(destination.sidebarTitle)
.accessibilityValue(
isPinned
? String(localized: "Pinned")
: String(localized: "Not pinned"))
}
}
}
+267
View File
@@ -0,0 +1,267 @@
import Foundation
import Observation
import OpenClawChatUI
import OpenClawProtocol
struct ChatSessionRosterSnapshot: Sendable {
let sessions: [OpenClawChatSessionEntry]
let isCached: Bool
}
extension NodeAppModel {
func loadChatSessionRoster(
limit: Int,
archived: Bool = false,
allowCachedFallback: Bool = true) async throws -> ChatSessionRosterSnapshot
{
guard self.isLocalChatFixtureEnabled || self.isOperatorGatewayConnected else {
guard allowCachedFallback else { throw URLError(.notConnectedToInternet) }
return await ChatSessionRosterSnapshot(
sessions: archived ? [] : self.loadCachedChatSessions(),
isCached: true)
}
do {
let response = try await self.makeChatTransport().listSessions(limit: limit, archived: archived)
if !archived {
self.reconcileChatSessionReadState(response.sessions)
await self.storeCachedChatSessions(response.sessions)
}
return ChatSessionRosterSnapshot(sessions: response.sessions, isCached: false)
} catch {
guard allowCachedFallback, !archived else { throw error }
let cached = await self.loadCachedChatSessions()
guard !cached.isEmpty else { throw error }
return ChatSessionRosterSnapshot(sessions: cached, isCached: true)
}
}
}
@MainActor
@Observable
final class RootSidebarModel {
static let sessionLimit = 200
struct TokenUsageSummary: Equatable {
let total: Int?
let isPartial: Bool
}
private(set) var sessions: [OpenClawChatSessionEntry] = []
private(set) var usage: CostUsageSummaryLite?
private(set) var cronJobs: [CronJob] = []
private(set) var isRefreshing = false
private(set) var sessionErrorText: String?
private var rosterGeneration = 0
private var dashboardGeneration = 0
var failedCronJobCount: Int {
self.cronJobs.count { Self.isFailedCronJob($0) }
}
var overdueCronJobCount: Int {
let threshold = Int(Date().timeIntervalSince1970 * 1000) - 300_000
return self.cronJobs.count { job in
job.enabled && (job.nextrunatms.map { $0 < threshold } ?? false)
}
}
func sections(
query: String,
currentSessionKey: String,
mainSessionKey: String,
activeAgentID: String?,
groups: [OpenClawChatSessionGroup]) -> [ChatSessionSidebarModel.Section]
{
ChatSessionSidebarModel.sections(
sessions: self.sessions,
currentSessionKey: currentSessionKey,
mainSessionKey: mainSessionKey,
activeAgentID: activeAgentID,
groups: groups,
excludesMainSession: true,
query: query)
}
func refresh(appModel: NodeAppModel) async {
self.rosterGeneration &+= 1
let rosterGeneration = self.rosterGeneration
self.dashboardGeneration &+= 1
let dashboardGeneration = self.dashboardGeneration
self.isRefreshing = true
defer {
if rosterGeneration == self.rosterGeneration {
self.isRefreshing = false
}
}
async let roster = self.loadRoster(appModel: appModel)
async let dashboard = self.loadDashboard(appModel: appModel)
let loadedRoster = await roster
guard !Task.isCancelled else { return }
if rosterGeneration == self.rosterGeneration {
switch loadedRoster {
case let .success(loadedRoster):
self.sessions = loadedRoster.sessions
self.sessionErrorText = nil
case let .failure(message):
self.sessionErrorText = message
case .cancelled:
return
}
self.isRefreshing = false
}
let loadedDashboard = await dashboard
guard !Task.isCancelled, dashboardGeneration == self.dashboardGeneration else { return }
if let usage = loadedDashboard.usage {
self.usage = usage
}
if let cronJobs = loadedDashboard.cronJobs {
self.cronJobs = cronJobs
}
}
func refreshSessions(appModel: NodeAppModel) async {
self.rosterGeneration &+= 1
let rosterGeneration = self.rosterGeneration
self.isRefreshing = true
defer {
if rosterGeneration == self.rosterGeneration {
self.isRefreshing = false
}
}
let loadedRoster = await self.loadRoster(appModel: appModel, allowCachedFallback: false)
guard !Task.isCancelled, rosterGeneration == self.rosterGeneration else { return }
switch loadedRoster {
case let .success(roster):
self.sessions = roster.sessions
self.sessionErrorText = nil
case let .failure(message):
self.sessionErrorText = message
case .cancelled:
return
}
}
func reportSessionError(_ error: any Error) {
self.sessionErrorText = error.localizedDescription
}
static func tokenUsageSummary(for sessions: [OpenClawChatSessionEntry]) -> TokenUsageSummary {
let knownTotals = sessions.compactMap(\.totalTokens)
return TokenUsageSummary(
total: knownTotals.isEmpty ? nil : knownTotals.reduce(0, +),
isPartial: knownTotals.count < sessions.count || sessions.contains { $0.totalTokensFresh == false })
}
private func loadRoster(
appModel: NodeAppModel,
allowCachedFallback: Bool = true) async -> RosterLoadResult
{
do {
return try await .success(appModel.loadChatSessionRoster(
limit: Self.sessionLimit,
allowCachedFallback: allowCachedFallback))
} catch is CancellationError {
return .cancelled
} catch {
return .failure(error.localizedDescription)
}
}
private func loadDashboard(appModel: NodeAppModel) async -> DashboardSnapshot {
guard appModel.isOperatorGatewayConnected else {
return DashboardSnapshot(usage: nil, cronJobs: nil)
}
async let usage = self.request(
CostUsageSummaryLite.self,
appModel: appModel,
method: "usage.cost",
paramsJSON: "{\"days\":31}")
async let cronJobs = self.loadCronJobs(appModel: appModel)
let loadedUsage = await usage
let loadedCronJobs = await cronJobs
return DashboardSnapshot(usage: loadedUsage, cronJobs: loadedCronJobs)
}
private func loadCronJobs(appModel: NodeAppModel) async -> [CronJob]? {
let pageLimit = 5
let jobLimit = 1000
var jobs: [CronJob] = []
var seenJobIDs: Set<String> = []
var expectedIdentity: CronJobsSnapshotIdentity?
var offset = 0
for _ in 0..<pageLimit {
let paramsJSON = "{\"includeDisabled\":true,\"limit\":200,\"offset\":\(offset)," +
"\"sortBy\":\"name\",\"sortDir\":\"asc\"}"
let page = await self.request(
CronJobsListLite.self,
appModel: appModel,
method: "cron.list",
paramsJSON: paramsJSON)
guard let page,
let identity = cronJobsSnapshotIdentity(page: page, maximumCount: jobLimit)
else { return nil }
if let expectedIdentity, identity != expectedIdentity {
return nil
}
expectedIdentity = identity
let pageJobIDs = Set(page.jobs.map(\.id))
guard pageJobIDs.count == page.jobs.count,
seenJobIDs.isDisjoint(with: pageJobIDs)
else { return nil }
seenJobIDs.formUnion(pageJobIDs)
jobs.append(contentsOf: page.jobs)
guard jobs.count <= jobLimit else { return nil }
if let total = identity.total {
guard total >= jobs.count else { return nil }
if jobs.count == total {
guard !page.hasMore else { return nil }
return jobs
}
}
guard page.hasMore else { return jobs }
guard let nextOffset = nextCronJobsListOffset(page: page, currentOffset: offset),
nextOffset <= jobLimit
else { return nil }
offset = nextOffset
}
return nil
}
private func request<T: Decodable>(
_ type: T.Type,
appModel: NodeAppModel,
method: String,
paramsJSON: String) async -> T?
{
do {
let data = try await appModel.operatorSession.request(
method: method,
paramsJSON: paramsJSON,
timeoutSeconds: 12)
return try JSONDecoder().decode(type, from: data)
} catch {
return nil
}
}
static func isFailedCronJob(_ job: CronJob) -> Bool {
let status = (job.lastrunstatus?.value as? String)?.lowercased()
// This failure vocabulary mirrors the web sidebar-attention contract in ui/src/components/sidebar-attention.ts.
return job.enabled && ["error", "failed", "timeout", "timed_out"].contains(status)
}
private struct DashboardSnapshot {
let usage: CostUsageSummaryLite?
let cronJobs: [CronJob]?
}
private enum RosterLoadResult {
case success(ChatSessionRosterSnapshot)
case failure(String)
case cancelled
}
}
File diff suppressed because it is too large Load Diff
+60 -105
View File
@@ -3,38 +3,17 @@ import Foundation
import SwiftUI
extension RootTabs {
struct PhoneChatReturn: Equatable {
let destination: SidebarDestination
let openChatRequestID: Int
}
struct PhoneControlNavigationRequest: Equatable {
enum Target: Equatable {
case root
case detail(SidebarDestination)
}
let id: Int
let target: Target
}
private static var sidebarPersistentWidthThreshold: CGFloat {
980
}
static let sidebarSplitIdealWidth: CGFloat = 316
static let sidebarSplitMaximumWidth: CGFloat = 340
static let sidebarDrawerMaximumWidth: CGFloat = 340
// Mirrors the web mobile drawer cap (min(86vw, 320px)).
static let sidebarDrawerMaximumWidth: CGFloat = 320
static let sidebarShowButtonAccessibilityIdentifier = "RootTabs.Sidebar.Show"
static let sidebarHideButtonAccessibilityIdentifier = "RootTabs.Sidebar.Hide"
enum AppTab: Hashable {
case control
case chat
case agent
case settings
}
enum SidebarDestination: String, CaseIterable, Hashable, Identifiable {
case chat
case overview
@@ -66,7 +45,7 @@ extension RootTabs {
case .workboard: String(localized: "Workboard")
case .skillWorkshop: String(localized: "Skill Workshop")
case .instances: String(localized: "Instances")
case .sessions: String(localized: "Threads")
case .sessions: String(localized: "Sessions")
case .files: String(localized: "Files")
case .dreaming: String(localized: "Dreaming")
case .usage: String(localized: "Usage")
@@ -106,22 +85,6 @@ extension RootTabs {
}
}
var appTab: AppTab {
switch self {
case .chat:
.chat
case .agents:
.agent
case .settings, .gateway:
.settings
case .overview, .activity, .workboard, .skillWorkshop, .instances, .sessions, .files,
.dreaming,
.usage,
.cron, .terminal, .docs:
.control
}
}
var settingsRoute: SettingsRoute? {
switch self {
case .gateway:
@@ -156,11 +119,25 @@ extension RootTabs {
static func sidebarWidth(containerWidth: CGFloat, isDrawerLayout: Bool) -> CGFloat {
if isDrawerLayout {
return min(self.sidebarDrawerMaximumWidth, max(280, containerWidth * 0.86))
return min(self.sidebarDrawerMaximumWidth, containerWidth * 0.86)
}
return min(self.sidebarSplitMaximumWidth, max(self.sidebarSplitIdealWidth, containerWidth * 0.25))
}
static func sidebarContentOffset(
sidebarWidth: CGFloat,
isVisible: Bool,
dragOffset: CGFloat,
reduceMotion: Bool) -> CGFloat
{
guard !reduceMotion else { return 0 }
if isVisible {
return max(0, sidebarWidth + min(0, dragOffset))
}
// Closed: a positive drag is the interactive edge-open follow.
return max(0, min(sidebarWidth, dragOffset))
}
static func shouldShowSidebarRevealControl(isSidebarVisible: Bool) -> Bool {
!isSidebarVisible
}
@@ -201,31 +178,6 @@ extension RootTabs {
}
}
static func shouldOpenRootTabFromPhoneHub(_ destination: SidebarDestination) -> Bool {
switch destination {
case .chat, .agents, .gateway, .settings:
true
case .overview, .activity, .workboard, .skillWorkshop, .instances, .sessions, .files,
.dreaming,
.usage,
.cron, .terminal, .docs:
false
}
}
static func defaultSidebarDestination(for tab: AppTab) -> SidebarDestination {
switch tab {
case .control:
.overview
case .chat:
.chat
case .agent:
.agents
case .settings:
.settings
}
}
enum StartupPresentationRoute: Equatable {
case none
case onboarding
@@ -269,48 +221,51 @@ extension RootTabs {
return discoveredGatewayCount > 0
}
struct SidebarGroup: Identifiable {
let title: String
let destinations: [SidebarDestination]
static let sidebarDestinations: [SidebarDestination] = [
.chat,
.overview,
.workboard,
.usage,
.cron,
.sessions,
.activity,
.skillWorkshop,
.agents,
.instances,
.files,
.dreaming,
.terminal,
.docs,
]
var id: String {
self.title
/// Home (chat) is a fixed first row like the web sidebar; only these can be
/// pinned/unpinned by the user.
static let pinnableSidebarPages: [SidebarDestination] = sidebarDestinations.filter { $0 != .chat }
/// Echoes the web first-run Pages zone (Home, Usage, Automations, ):
/// compact by default so sessions stay above the fold. The Sessions page is
/// intentionally unpinned the sessions section + "All Sessions" own it.
static let defaultPinnedSidebarPages: [SidebarDestination] = [.overview, .usage, .cron]
/// "" = never customized (defaults); "none" = user unpinned everything.
/// Storage order is the user's pin order (web parity); unknown or
/// unpinnable raw values are dropped.
static func pinnedSidebarPages(from storage: String) -> [SidebarDestination] {
let trimmed = storage.trimmingCharacters(in: .whitespacesAndNewlines)
if trimmed.isEmpty { return self.defaultPinnedSidebarPages }
if trimmed == "none" { return [] }
var seen = Set<String>()
return trimmed.split(separator: ",").compactMap { raw in
let value = String(raw)
guard seen.insert(value).inserted,
let destination = SidebarDestination(rawValue: value),
self.pinnableSidebarPages.contains(destination)
else { return nil }
return destination
}
}
static let sidebarGroups: [SidebarGroup] = [
SidebarGroup(title: "CHAT", destinations: [.chat]),
SidebarGroup(
title: "CONTROL",
destinations: [
.overview,
.activity,
.agents,
.workboard,
.skillWorkshop,
.instances,
.sessions,
.files,
.dreaming,
.usage,
.cron,
.terminal,
]),
SidebarGroup(
title: "SETTINGS",
destinations: [.settings]),
SidebarGroup(title: "REFERENCE", destinations: [.docs]),
]
static var phoneControlGroups: [SidebarGroup] {
// Agents owns a bottom tab and its hub entry duplicated the same destination.
let tabOwned: Set<SidebarDestination> = [.agents]
return self.sidebarGroups
.map { group in
SidebarGroup(
title: group.title,
destinations: group.destinations.filter { !tabOwned.contains($0) })
}
.filter { !$0.destinations.isEmpty }
static func pinnedSidebarPagesStorage(_ pages: [SidebarDestination]) -> String {
pages.isEmpty ? "none" : pages.map(\.rawValue).joined(separator: ",")
}
}
@@ -7,13 +7,16 @@ import WebKit
/// WKWebView, authenticated with the stored gateway credentials.
struct TerminalHubScreen: View {
@Environment(NodeAppModel.self) private var appModel
let headerSidebarAction: OpenClawSidebarHeaderAction?
let usesNativeNavigationChrome: Bool
let gatewayAction: (() -> Void)?
init(
headerSidebarAction: OpenClawSidebarHeaderAction? = nil,
usesNativeNavigationChrome: Bool = false,
gatewayAction: (() -> Void)? = nil)
{
self.headerSidebarAction = headerSidebarAction
self.usesNativeNavigationChrome = usesNativeNavigationChrome
self.gatewayAction = gatewayAction
}
@@ -41,7 +44,9 @@ struct TerminalHubScreen: View {
}
.navigationTitle("Terminal")
.navigationBarTitleDisplayMode(.inline)
.toolbar(self.usesNativeNavigationChrome ? .visible : .hidden, for: .navigationBar)
.toolbar(
self.usesNativeNavigationChrome || self.headerSidebarAction != nil ? .visible : .hidden,
for: .navigationBar)
.toolbar {
if self.usesNativeNavigationChrome, let gatewayAction {
ToolbarItem(placement: .topBarTrailing) {
@@ -52,6 +57,11 @@ struct TerminalHubScreen: View {
.accessibilityLabel("Gateway settings")
}
}
if let headerSidebarAction {
ToolbarItem(placement: .topBarLeading) {
OpenClawSidebarRevealButton(action: headerSidebarAction)
}
}
}
}
+18 -1
View File
@@ -4,6 +4,23 @@ import Testing
import UIKit
@testable import OpenClaw
struct RootSidebarTypographyTests {
@Test func `root sidebar uses branded typography`() throws {
let sidebar = try String(
contentsOf: URL(fileURLWithPath: #filePath)
.deletingLastPathComponent()
.deletingLastPathComponent()
.appendingPathComponent("Sources/RootSidebar.swift"),
encoding: .utf8)
#expect(sidebar.contains("OpenClawType.headline"))
#expect(sidebar.contains("OpenClawType.subheadSemiBold"))
#expect(sidebar.contains("OpenClawType.captionMedium"))
#expect(sidebar.contains("OpenClawType.caption2Bold"))
#expect(!sidebar.contains(".font(."))
}
}
struct OpenClawTypographyTests {
@Test func `thread controls use branded typography`() throws {
let support = try String(
@@ -222,7 +239,7 @@ struct OpenClawTypographyTests {
#expect(proComponents.contains("secondaryActionTitle.text"))
#expect(chatTab.contains("Text(\"Export Transcript\")"))
#expect(chatTab.contains("Text(String(localized: \"Threads…\"))"))
#expect(chatTab.contains("Text(String(localized: \"Sessions…\"))"))
#expect(chatTab.contains("Text(String(localized: \"Show reasoning & tool activity\"))"))
#expect(chatTab.contains(".font(OpenClawType.body)"))
#expect(!chatTab.contains("Button(\"Export Transcript\")"))
+258 -86
View File
@@ -1,3 +1,5 @@
import OpenClawChatUI
import OpenClawProtocol
import SwiftUI
import Testing
import UIKit
@@ -5,6 +7,91 @@ import UIKit
@MainActor
struct RootTabsPresentationTests {
@Test func `session activity clamps current and future timestamps to just now`() {
let now = Date(timeIntervalSince1970: 1_750_000_000)
#expect(CommandCenterTab.relativeTimeText(
forMilliseconds: now.timeIntervalSince1970 * 1000,
relativeTo: now) == "just now")
#expect(CommandCenterTab.relativeTimeText(
forMilliseconds: now.addingTimeInterval(30).timeIntervalSince1970 * 1000,
relativeTo: now) == "just now")
}
@Test func `dashboard deep link requests overview navigation`() async throws {
let appModel = NodeAppModel()
let initialRequestID = appModel.dashboardNavigationRequestID
let url = try #require(URL(string: "openclaw://dashboard"))
await appModel.handleDeepLink(url: url)
#expect(appModel.dashboardNavigationRequestID == initialRequestID + 1)
#expect(appModel.consumeDashboardNavigationRequest(appModel.dashboardNavigationRequestID))
#expect(!appModel.consumeDashboardNavigationRequest(appModel.dashboardNavigationRequestID))
}
@Test func `sidebar gateway label ignores empty identity values`() {
#expect(RootSidebar.gatewayName(serverName: " ", remoteAddress: " gateway.example ") == "gateway.example")
#expect(RootSidebar.gatewayName(serverName: "Gateway", remoteAddress: "fallback") == "Gateway")
#expect(RootSidebar.gatewayName(serverName: nil, remoteAddress: "\n") == "Connection")
}
@Test func `new chat request is consumed once by the active chat owner`() {
let appModel = NodeAppModel()
appModel.requestNewChat()
let firstRequestID = appModel.newChatRequestID
#expect(appModel.consumeNewChatRequest(firstRequestID))
#expect(!appModel.consumeNewChatRequest(firstRequestID))
appModel.requestNewChat()
#expect(!appModel.consumeNewChatRequest(firstRequestID))
#expect(appModel.consumeNewChatRequest(appModel.newChatRequestID))
}
@Test func `overview session metrics exclude archived and internal sessions`() {
let visible = CommandCenterTab.visibleOverviewSessions([
Self.sessionEntry(key: "main"),
Self.sessionEntry(key: "onboarding"),
Self.sessionEntry(key: "agent:main:onboarding"),
Self.sessionEntry(key: "archived", archived: true),
])
#expect(visible.map(\.key) == ["main"])
}
@Test func `overview token usage sums known totals and marks stale or missing rows partial`() {
let summary = RootSidebarModel.tokenUsageSummary(for: [
Self.sessionEntry(key: "fresh", totalTokens: 1200, totalTokensFresh: true, contextTokens: 200_000),
Self.sessionEntry(key: "stale", totalTokens: 300, totalTokensFresh: false, contextTokens: 200_000),
Self.sessionEntry(key: "missing", contextTokens: 200_000),
])
let complete = RootSidebarModel.tokenUsageSummary(for: [
Self.sessionEntry(key: "one", totalTokens: 20, totalTokensFresh: true),
Self.sessionEntry(key: "two", totalTokens: 80),
])
let unknown = RootSidebarModel.tokenUsageSummary(for: [Self.sessionEntry(key: "unknown")])
#expect(summary.total == 1500)
#expect(summary.isPartial)
#expect(complete.total == 100)
#expect(!complete.isPartial)
#expect(unknown.total == nil)
#expect(unknown.isPartial)
}
@Test func `failed cron attention ignores disabled jobs`() {
#expect(RootSidebarModel.isFailedCronJob(Self.cronJob(enabled: true, status: "error")))
#expect(!RootSidebarModel.isFailedCronJob(Self.cronJob(enabled: false, status: "error")))
#expect(!RootSidebarModel.isFailedCronJob(Self.cronJob(enabled: true, status: "ok")))
}
@Test func `recent session cap is disabled while search is active`() {
#expect(RootSidebar.recentSessionCap(searchText: "") == 20)
#expect(RootSidebar.recentSessionCap(searchText: " \n") == 20)
#expect(RootSidebar.recentSessionCap(searchText: "deploy") == nil)
}
@Test func `configured gateway bypasses launch request and stale onboarding markers`() {
let route = RootTabs.startupPresentationRoute(
gatewayConnected: false,
@@ -74,49 +161,25 @@ struct RootTabsPresentationTests {
#expect(!shouldPresent)
}
@Test func `sidebar tabs enabled for I pad regular width`() {
#expect(
RootTabs.shouldUseSidebarTabs(
idiom: .pad,
horizontalSizeClass: .regular))
}
@Test func `sidebar tabs enabled for I pad compact width`() {
#expect(
RootTabs.shouldUseSidebarTabs(
idiom: .pad,
horizontalSizeClass: .compact))
}
@Test func `sidebar tabs disabled for I phone`() {
#expect(
!RootTabs.shouldUseSidebarTabs(
idiom: .phone,
horizontalSizeClass: .regular))
}
@Test func `sidebar groups match adaptive navigation model`() {
let groups = RootTabs.sidebarGroups
@Test func `sidebar destinations match frozen page order`() {
let destinationIDs = RootTabs.SidebarDestination.allCases.map(\.rawValue)
#expect(groups.map(\.title) == ["CHAT", "CONTROL", "SETTINGS", "REFERENCE"])
#expect(groups[0].destinations.map(\.rawValue) == ["chat"])
#expect(groups[1].destinations == [
#expect(RootTabs.sidebarDestinations == [
.chat,
.overview,
.activity,
.agents,
.workboard,
.skillWorkshop,
.instances,
.sessions,
.files,
.dreaming,
.usage,
.cron,
.sessions,
.activity,
.skillWorkshop,
.agents,
.instances,
.files,
.dreaming,
.terminal,
.docs,
])
#expect(groups[2].destinations == [.settings])
#expect(groups[3].destinations == [.docs])
#expect(destinationIDs == [
"chat",
"overview",
@@ -136,18 +199,9 @@ struct RootTabsPresentationTests {
"gateway",
])
#expect(!destinationIDs.contains("agent"))
#expect(!RootTabs.sidebarGroups.flatMap(\.destinations).contains(.gateway))
}
@Test func `phone control groups avoid duplicating the agent tab`() {
let groups = RootTabs.phoneControlGroups
let destinations = groups.flatMap(\.destinations)
#expect(groups.map(\.title) == ["CHAT", "CONTROL", "SETTINGS", "REFERENCE"])
#expect(!destinations.contains(.agents))
#expect(RootTabs.sidebarGroups.flatMap(\.destinations).contains(.agents))
#expect(destinations.contains(.dreaming))
#expect(destinations.contains(.instances))
#expect(RootTabs.sidebarDestinations.contains(.chat))
#expect(!RootTabs.sidebarDestinations.contains(.settings))
#expect(!RootTabs.sidebarDestinations.contains(.gateway))
}
@Test func `sidebar uses compact labels for long routes`() {
@@ -156,56 +210,38 @@ struct RootTabsPresentationTests {
#expect(RootTabs.SidebarDestination.gateway.sidebarTitle == "Connection")
}
@Test func `phone hub routes only root destinations out of Control`() {
#expect(RootTabs.shouldOpenRootTabFromPhoneHub(.chat))
#expect(RootTabs.shouldOpenRootTabFromPhoneHub(.agents))
#expect(RootTabs.shouldOpenRootTabFromPhoneHub(.gateway))
#expect(RootTabs.shouldOpenRootTabFromPhoneHub(.settings))
for destination in RootTabs.SidebarDestination.allCases
where destination != .chat && destination != .agents && destination != .gateway &&
destination != .settings
{
#expect(!RootTabs.shouldOpenRootTabFromPhoneHub(destination))
}
}
@Test func `app launch defaults to chat tab`() {
#expect(RootTabs.initialTab(arguments: ["OpenClaw"]) == .chat)
#expect(RootTabs.initialTab(arguments: ["OpenClaw", "--openclaw-initial-tab"]) == .chat)
#expect(RootTabs.initialTab(arguments: ["OpenClaw", "--openclaw-initial-tab", "unknown"]) == .chat)
@Test func `app launch defaults to chat destination`() {
#expect(RootTabs.initialDestination(arguments: ["OpenClaw"]) == .chat)
#expect(RootTabs.initialDestination(arguments: ["OpenClaw", "--openclaw-initial-tab"]) == .chat)
#expect(RootTabs.initialDestination(arguments: ["OpenClaw", "--openclaw-initial-tab", "unknown"]) == .chat)
}
@Test func `app launch uses requested destination before chat fallback`() {
#expect(RootTabs.initialTab(arguments: ["OpenClaw", "--openclaw-initial-destination", "overview"]) == .control)
#expect(RootTabs.initialTab(arguments: ["OpenClaw", "--openclaw-initial-destination", "chat"]) == .chat)
#expect(RootTabs.initialTab(arguments: ["OpenClaw", "--openclaw-initial-destination", "agents"]) == .agent)
#expect(RootTabs.initialTab(arguments: ["OpenClaw", "--openclaw-initial-destination", "gateway"]) == .settings)
#expect(RootTabs
.initialDestination(arguments: ["OpenClaw", "--openclaw-initial-destination", "overview"]) == .overview)
#expect(RootTabs.initialDestination(arguments: ["OpenClaw", "--openclaw-initial-destination", "chat"]) == .chat)
#expect(RootTabs
.initialDestination(arguments: ["OpenClaw", "--openclaw-initial-destination", "agents"]) == .agents)
#expect(RootTabs
.initialDestination(arguments: ["OpenClaw", "--openclaw-initial-destination", "gateway"]) == .gateway)
#expect(
RootTabs.initialTab(arguments: [
RootTabs.initialDestination(arguments: [
"OpenClaw",
"--openclaw-initial-tab",
"unknown",
"--openclaw-initial-destination",
"activity",
]) == .control)
]) == .activity)
}
@Test func `app launch respects explicit initial tab override`() {
#expect(RootTabs.initialTab(arguments: ["OpenClaw", "--openclaw-initial-tab", "control"]) == .control)
#expect(RootTabs.initialTab(arguments: ["OpenClaw", "--openclaw-initial-tab", "overview"]) == .control)
#expect(RootTabs.initialTab(arguments: ["OpenClaw", "--openclaw-initial-tab", "chat"]) == .chat)
#expect(RootTabs.initialTab(arguments: ["OpenClaw", "--openclaw-initial-tab", "talk"]) == .chat)
#expect(RootTabs.initialTab(arguments: ["OpenClaw", "--openclaw-initial-tab", "voice"]) == .chat)
#expect(RootTabs.initialTab(arguments: ["OpenClaw", "--openclaw-initial-tab", "agents"]) == .agent)
#expect(RootTabs.initialTab(arguments: ["OpenClaw", "--openclaw-initial-tab", "settings"]) == .settings)
}
@Test func `initial tabs map to matching sidebar destinations`() {
#expect(RootTabs.defaultSidebarDestination(for: .control) == .overview)
#expect(RootTabs.defaultSidebarDestination(for: .chat) == .chat)
#expect(RootTabs.defaultSidebarDestination(for: .agent) == .agents)
#expect(RootTabs.defaultSidebarDestination(for: .settings) == .settings)
@Test func `legacy initial tab aliases map directly to sidebar destinations`() {
#expect(RootTabs.initialDestination(arguments: ["OpenClaw", "--openclaw-initial-tab", "control"]) == .overview)
#expect(RootTabs.initialDestination(arguments: ["OpenClaw", "--openclaw-initial-tab", "overview"]) == .overview)
#expect(RootTabs.initialDestination(arguments: ["OpenClaw", "--openclaw-initial-tab", "chat"]) == .chat)
#expect(RootTabs.initialDestination(arguments: ["OpenClaw", "--openclaw-initial-tab", "talk"]) == .chat)
#expect(RootTabs.initialDestination(arguments: ["OpenClaw", "--openclaw-initial-tab", "voice"]) == .chat)
#expect(RootTabs.initialDestination(arguments: ["OpenClaw", "--openclaw-initial-tab", "agents"]) == .agents)
#expect(RootTabs.initialDestination(arguments: ["OpenClaw", "--openclaw-initial-tab", "settings"]) == .settings)
}
@Test func `skill workshop mutations require admin scope`() {
@@ -538,6 +574,94 @@ struct RootTabsPresentationTests {
#expect(width <= RootTabs.sidebarDrawerMaximumWidth)
}
@Test func `sidebar shows configured agent rows with sane clamping`() {
#expect(RootSidebar.shownAgentCount(configured: 1, total: 5) == 1)
#expect(RootSidebar.shownAgentCount(configured: 3, total: 5) == 3)
#expect(RootSidebar.shownAgentCount(configured: 0, total: 5) == 1)
#expect(RootSidebar.shownAgentCount(configured: 3, total: 2) == 2)
#expect(RootSidebar.shownAgentCount(configured: 1, total: 0) == 1)
}
@Test func `session work subtitle mirrors the web repo and branch line`() {
func entry(repoRoot: String?, branch: String?) -> OpenClawChatSessionEntry {
Self.sessionEntry(
key: "agent:main:w1",
worktree: OpenClawChatSessionWorktree(id: "w1", branch: branch, repoRoot: repoRoot))
}
#expect(ChatSessionSidebarModel.workSubtitle(
for: entry(repoRoot: "/Users/dev/openclaw", branch: "openclaw/fix-thing")) == "openclaw \u{2387} fix-thing")
#expect(ChatSessionSidebarModel.workSubtitle(
for: entry(repoRoot: "/Users/dev/openclaw", branch: nil)) == "openclaw")
#expect(ChatSessionSidebarModel.workSubtitle(for: entry(repoRoot: nil, branch: "main")) == nil)
#expect(ChatSessionSidebarModel.workSubtitle(for: Self.sessionEntry(key: "plain")) == nil)
}
@Test func `pinned pages storage round trips and preserves pin order`() {
#expect(RootTabs.pinnedSidebarPages(from: "") == RootTabs.defaultPinnedSidebarPages)
#expect(RootTabs.pinnedSidebarPages(from: "none").isEmpty)
#expect(RootTabs.pinnedSidebarPagesStorage([]) == "none")
// Storage order is the user's pin order (web parity).
let parsed = RootTabs.pinnedSidebarPages(from: "usage,overview,docs")
#expect(parsed == [.usage, .overview, .docs])
let storage = RootTabs.pinnedSidebarPagesStorage([.docs, .overview, .usage])
#expect(RootTabs.pinnedSidebarPages(from: storage) == [.docs, .overview, .usage])
// Duplicates collapse to first occurrence.
#expect(RootTabs.pinnedSidebarPages(from: "usage,usage,docs") == [.usage, .docs])
// Unknown raw values are dropped; chat is never pinnable.
#expect(RootTabs.pinnedSidebarPages(from: "chat,bogus").isEmpty)
#expect(!RootTabs.pinnedSidebarPages(from: "chat,overview").contains(.chat))
#expect(!RootTabs.pinnableSidebarPages.contains(.chat))
}
@Test func `drawer content follows reveal and dismiss drag`() {
#expect(RootTabs.sidebarContentOffset(
sidebarWidth: 340,
isVisible: false,
dragOffset: 0,
reduceMotion: false) == 0)
#expect(RootTabs.sidebarContentOffset(
sidebarWidth: 340,
isVisible: true,
dragOffset: 0,
reduceMotion: false) == 340)
#expect(RootTabs.sidebarContentOffset(
sidebarWidth: 340,
isVisible: true,
dragOffset: -120,
reduceMotion: false) == 220)
#expect(RootTabs.sidebarContentOffset(
sidebarWidth: 340,
isVisible: true,
dragOffset: -400,
reduceMotion: false) == 0)
#expect(RootTabs.sidebarContentOffset(
sidebarWidth: 340,
isVisible: true,
dragOffset: 40,
reduceMotion: true) == 0)
// Closed + positive drag = interactive edge-open follow, clamped to width.
#expect(RootTabs.sidebarContentOffset(
sidebarWidth: 340,
isVisible: false,
dragOffset: 120,
reduceMotion: false) == 120)
#expect(RootTabs.sidebarContentOffset(
sidebarWidth: 340,
isVisible: false,
dragOffset: 500,
reduceMotion: false) == 340)
#expect(RootTabs.sidebarContentOffset(
sidebarWidth: 340,
isVisible: false,
dragOffset: 120,
reduceMotion: true) == 0)
}
@Test func `narrow landscape keeps drawer sidebar`() {
let mode = RootTabs.sidebarLayoutMode(containerSize: CGSize(width: 900, height: 600))
@@ -613,4 +737,52 @@ struct RootTabsPresentationTests {
horizontalSizeClass: .regular,
verticalSizeClass: .regular))
}
private static func sessionEntry(
key: String,
archived: Bool? = nil,
totalTokens: Int? = nil,
totalTokensFresh: Bool? = nil,
contextTokens: Int? = nil,
worktree: OpenClawChatSessionWorktree? = nil) -> OpenClawChatSessionEntry
{
OpenClawChatSessionEntry(
key: key,
kind: nil,
displayName: nil,
surface: nil,
subject: nil,
room: nil,
space: nil,
updatedAt: nil,
sessionId: nil,
systemSent: nil,
abortedLastRun: nil,
thinkingLevel: nil,
verboseLevel: nil,
inputTokens: nil,
outputTokens: nil,
totalTokens: totalTokens,
totalTokensFresh: totalTokensFresh,
modelProvider: nil,
model: nil,
contextTokens: contextTokens,
archived: archived,
worktree: worktree)
}
private static func cronJob(enabled: Bool, status: String) -> CronJob {
CronJob(
id: "sidebar-test",
name: "Sidebar test",
enabled: enabled,
createdatms: 1,
updatedatms: 1,
schedule: AnyCodable(["kind": AnyCodable("every")]),
sessiontarget: AnyCodable("isolated"),
wakemode: AnyCodable("now"),
payload: AnyCodable(["kind": AnyCodable("agentTurn")]),
state: [:],
lastrunstatus: AnyCodable(status))
}
}
@@ -1,14 +1,14 @@
import Foundation
import Testing
@Suite struct RootTabsSidebarRegressionTests {
@Test func iPadSplitHiddenSidebarUsesHeaderRevealInsteadOfReservedRail() throws {
struct RootTabsSidebarRegressionTests {
@Test func `i pad split hidden sidebar uses header reveal instead of reserved rail`() throws {
let source = try String(contentsOf: Self.rootTabsSourceURL(), encoding: .utf8)
let navigationSource = try String(contentsOf: Self.rootTabsNavigationSourceURL(), encoding: .utf8)
let splitContent = try Self.extract(
source,
from: "private func sidebarNavigationSplitContent(sidebarWidth: CGFloat) -> some View",
to: "private func sidebarDrawerContent(sidebarWidth: CGFloat) -> some View")
to: "private func sidebarDrawerContent(")
#expect(splitContent.contains("HStack(spacing: 0)"))
#expect(splitContent.contains("self.sidebarColumn"))
@@ -28,7 +28,7 @@ import Testing
.contains("static func sidebarIsVisible(splitColumnVisibility: NavigationSplitViewVisibility)"))
}
@Test func initialSidebarVisibilitySurvivesFirstLayoutMeasurement() throws {
@Test func `initial sidebar visibility survives first layout measurement`() throws {
let source = try String(contentsOf: Self.rootTabsSourceURL(), encoding: .utf8)
let layoutUpdate = try Self.extract(
source,
@@ -42,23 +42,50 @@ import Testing
#expect(layoutUpdate.contains("guard force || !self.sidebarVisibilityUserOverridden else { return }"))
}
@Test func drawerDimmingLayerDoesNotStealSidebarTouches() throws {
@Test func `push reveal keeps sidebar behind an interactive dismissal card`() throws {
let source = try String(contentsOf: Self.rootTabsSourceURL(), encoding: .utf8)
let drawerContent = try Self.extract(
source,
from: "private func sidebarDrawerContent(sidebarWidth: CGFloat) -> some View",
from: "private func sidebarDrawerContent(",
to: "private var sidebarDetailShell: some View")
#expect(drawerContent.contains("HStack(spacing: 0)"))
#expect(drawerContent.contains("Color.clear"))
#expect(drawerContent.contains(".frame(width: sidebarWidth)"))
#expect(drawerContent.contains(".allowsHitTesting(false)"))
#expect(drawerContent.contains("Color.black.opacity(0.28)"))
#expect(drawerContent.contains(".zIndex(0)"))
#expect(drawerContent.contains(".zIndex(1)"))
let sidebarLayer = try Self.extract(
drawerContent,
from: "private func sidebarDrawerLayer(",
to: "private func sidebarDrawerContentSurface(")
let contentSurface = try Self.extract(
drawerContent,
from: "private func sidebarDrawerContentSurface(",
to: "private func sidebarDrawerContentCard(")
let contentCardStart = try #require(
drawerContent.range(of: "private func sidebarDrawerContentCard("))
let contentCard = String(drawerContent[contentCardStart.lowerBound...])
#expect(drawerContent.contains("ZStack(alignment: .leading)"))
#expect(drawerContent.contains("self.sidebarDrawerLayer"))
#expect(drawerContent.contains("self.sidebarDrawerContentSurface"))
#expect(drawerContent.contains("self.sidebarDrawerContentCard"))
#expect(drawerContent.contains(".background(OpenClawSidebarPalette.background)"))
#expect(!drawerContent.contains("Color.black.opacity(0.35)"))
#expect(!sidebarLayer.contains(".clipShape"))
#expect(!sidebarLayer.contains(".shadow"))
#expect(drawerContent.contains("self.sidebarColumn(drawerSafeAreaInsets: safeAreaInsets)"))
#expect(sidebarLayer.contains(".ignoresSafeArea(.container, edges: .vertical)"))
#expect(contentSurface.contains(".fill(Color(uiColor: .systemGroupedBackground))"))
#expect(contentSurface.contains(".ignoresSafeArea(.container, edges: .vertical)"))
#expect(contentSurface.contains(".shadow("))
#expect(contentSurface.contains(".offset(x: Self.sidebarContentOffset("))
#expect(contentCard.contains(".allowsHitTesting(!self.isSidebarVisible)"))
#expect(contentCard.contains("if self.isSidebarVisible {"))
#expect(contentCard.contains("self.hideSidebar()"))
#expect(contentCard.contains("isEnabled: self.isSidebarVisible && !self.reduceMotion"))
#expect(contentCard.contains("cornerRadius: OpenClawProMetric.drawerRadius * progress"))
#expect(contentCard.contains(".offset(x: Self.sidebarContentOffset("))
#expect(!contentCard.contains("OpenClawProBackground()"))
#expect(!contentCard.contains(".shadow("))
}
@Test func sidebarSelectionResetsEmbeddedSettingsNavigationPath() throws {
@Test func `sidebar selection resets embedded settings navigation path`() throws {
let source = try String(contentsOf: Self.rootTabsSourceURL(), encoding: .utf8)
let sidebarDetail = try Self.extract(
source,
@@ -67,11 +94,11 @@ import Testing
let navigationShell = try Self.extract(
source,
from: "private var sidebarDetailNavigationShell: some View",
to: "private var usesSidebarTabs: Bool")
to: "private var sidebarDetailShellID: String")
let selection = try Self.extract(
source,
from: "private func selectSidebarDestination(",
to: "private func showSidebar()")
to: "private func handleOpenChatRequest(")
let resetRange = try #require(selection.range(of: "self.sidebarNavigationPath.removeAll()"))
let destinationRange = try #require(selection.range(of: "self.selectedSidebarDestination = destination"))
@@ -82,10 +109,9 @@ import Testing
#expect(resetRange.lowerBound < destinationRange.lowerBound)
}
@Test func embeddedOverviewRoutesViewMoreThroughOwningNavigationStack() throws {
@Test func `embedded overview routes view more through owning navigation stack`() throws {
let rootTabsSource = try String(contentsOf: Self.rootTabsSourceURL(), encoding: .utf8)
let commandCenterSource = try String(contentsOf: Self.commandCenterSourceURL(), encoding: .utf8)
let phoneHubSource = try String(contentsOf: Self.phoneHubSourceURL(), encoding: .utf8)
let sidebarDetail = try Self.extract(
rootTabsSource,
from: "private var sidebarDetail: some View",
@@ -95,14 +121,11 @@ import Testing
commandCenterSource,
from: "private var recentSessions: some View",
to: "private func cardHeader(")
let phoneOverview = try Self.extract(phoneHubSource, from: "case .overview:", to: "case .activity:")
#expect(commandCenterSource.contains("var openSessions: (() -> Void)?"))
#expect(recentSessions.contains("if let openSessions"))
#expect(recentSessions.contains("Button(action: openSessions)"))
#expect(recentSessions.contains("NavigationLink"))
#expect(iPadOverview.contains("openSessions: { self.selectSidebarDestination(.sessions) }"))
#expect(phoneOverview.contains("openSessions: { self.navigationPath.append(.sessions) }"))
}
private static func rootTabsSourceURL() -> URL {
@@ -126,13 +149,6 @@ import Testing
.appendingPathComponent("Sources/Design/CommandCenterTab.swift")
}
private static func phoneHubSourceURL() -> URL {
URL(fileURLWithPath: #filePath)
.deletingLastPathComponent()
.deletingLastPathComponent()
.appendingPathComponent("Sources/Design/RootTabsPhoneControlHub.swift")
}
private static func extract(_ source: String, from start: String, to end: String) throws -> String {
let startRange = try #require(source.range(of: start))
let tail = source[startRange.lowerBound...]
@@ -121,7 +121,7 @@ extension RootTabsSourceGuardTests {
#expect(settingsSource.contains("let acceptsGatewaySetupRequests: Bool"))
#expect(settingsSource.contains("guard self.acceptsGatewaySetupRequests else { return }"))
#expect(settingsSource.contains(".onChange(of: self.acceptsGatewaySetupRequests)"))
#expect(rootSource.matches(of: /acceptsGatewaySetupRequests: !self\.showOnboarding/).count == 2)
#expect(rootSource.matches(of: /acceptsGatewaySetupRequests: !self\.showOnboarding/).count == 1)
#expect(actionsSource.contains("func syncAfterOnboardingReset()"))
#expect(actionsSource.contains("self.pendingManualAuthOverride = nil"))
// The root toast is the only gateway problem surface outside covers, so it
+188 -189
View File
@@ -4,15 +4,6 @@ import Testing
@testable import OpenClaw
struct RootTabsSourceGuardTests {
@Test func `unified chat voice tab icon cache follows appearance`() {
let light = UnifiedChatVoiceTabIcon.CacheKey(state: .active, colorScheme: .light)
let sameLight = UnifiedChatVoiceTabIcon.CacheKey(state: .active, colorScheme: .light)
let dark = UnifiedChatVoiceTabIcon.CacheKey(state: .active, colorScheme: .dark)
#expect(light == sameLight)
#expect(light != dark)
}
@Test func `app applies initial scene phase before gateway admission`() throws {
let source = try String(contentsOf: Self.openClawAppSourceURL(), encoding: .utf8)
let startupTask = try Self.extract(
@@ -32,13 +23,14 @@ struct RootTabsSourceGuardTests {
let source = try String(contentsOf: Self.rootTabsSourceURL(), encoding: .utf8)
let componentSource = try String(contentsOf: Self.proComponentsSourceURL(), encoding: .utf8)
#expect(source.contains("sidebarHeaderLeadingAction"))
#expect(source.contains("sidebarHeaderAction"))
#expect(source.contains("Hide Sidebar"))
#expect(source.contains("Show Sidebar"))
#expect(source.contains("shouldShowSidebarRevealInDestinationHeader"))
#expect(source.contains("layoutMode: self.isSidebarDrawerLayout ? .drawer : .split"))
#expect(componentSource.contains("OpenClawSidebarHeaderLeadingSlot"))
#expect(componentSource.contains(".frame(width: 44, height: 44, alignment: .center)"))
#expect(componentSource.contains(".frame(width: 44, height: 44)"))
#expect(source.contains(".safeAreaPadding(.top, 8)"))
#expect(source.contains("Self.sidebarShowButtonAccessibilityIdentifier"))
#expect(source.contains("Self.sidebarHideButtonAccessibilityIdentifier"))
@@ -57,22 +49,22 @@ struct RootTabsSourceGuardTests {
#expect(!source.contains("safeAreaInset(edge: .top"))
#expect(!source.contains("thinMaterial, in: Circle"))
#expect(!source.contains("sidebarRevealInset"))
#expect(source.contains("Color.black.opacity(0.28)"))
#expect(source.contains(".background(Color(uiColor: .systemBackground))"))
#expect(source.contains(".background(OpenClawSidebarPalette.background)"))
#expect(!source.contains("Color.black.opacity(0.35)"))
#expect(!source.contains("sidebarRevealCornerButton"))
#expect(!source.contains("shouldShowSidebarRevealOverlay"))
#expect(!source.contains("shouldShowOverviewHeaderSidebarReveal"))
}
@Test func `i pad split uses sliding sidebar while portrait keeps drawer overlay`() throws {
@Test func `i pad split stays integrated while compact drawer uses push reveal`() throws {
let source = try String(contentsOf: Self.rootTabsSourceURL(), encoding: .utf8)
let splitContent = try Self.extract(
source,
from: "private func sidebarNavigationSplitContent(sidebarWidth: CGFloat) -> some View",
to: "private func sidebarDrawerContent(sidebarWidth: CGFloat) -> some View")
to: "private func sidebarDrawerContent(")
let drawerContent = try Self.extract(
source,
from: "private func sidebarDrawerContent(sidebarWidth: CGFloat) -> some View",
from: "private func sidebarDrawerContent(",
to: "private var sidebarDetailShell: some View")
#expect(!source.contains("@State private var splitColumnVisibility: NavigationSplitViewVisibility"))
@@ -87,46 +79,34 @@ struct RootTabsSourceGuardTests {
#expect(!splitContent.contains("NavigationSplitView"))
#expect(!splitContent.contains("self.collapsedSidebarRail"))
#expect(!source.contains("Self.sidebarCollapsedRailWidth"))
#expect(drawerContent.contains("ZStack(alignment: .topLeading)"))
#expect(drawerContent.contains("Color.black.opacity(0.28)"))
#expect(drawerContent.contains(".transition(.move(edge: .leading).combined(with: .opacity))"))
#expect(drawerContent.contains("ZStack(alignment: .leading)"))
#expect(drawerContent.contains("self.sidebarDrawerLayer"))
#expect(drawerContent.contains("self.sidebarDrawerContentSurface"))
#expect(drawerContent.contains("self.sidebarDrawerContentCard"))
#expect(drawerContent.contains("self.sidebarContentDismissGesture(sidebarWidth: sidebarWidth)"))
#expect(drawerContent.contains(".allowsHitTesting(!self.isSidebarVisible)"))
#expect(drawerContent.contains(".clipShape(RoundedRectangle("))
#expect(drawerContent.contains("cornerRadius: OpenClawProMetric.drawerRadius * progress"))
#expect(drawerContent.contains(".offset(x: Self.sidebarContentOffset("))
#expect(drawerContent.contains(".shadow("))
#expect(drawerContent.contains(".fill(Color(uiColor: .systemGroupedBackground))"))
#expect(drawerContent.contains(".ignoresSafeArea(.container, edges: .vertical)"))
#expect(!drawerContent.contains("Color.black.opacity(0.35)"))
#expect(!drawerContent.contains("UnevenRoundedRectangle"))
#expect(!drawerContent.contains("sidebarDrawerShape"))
#expect(!drawerContent.contains("NavigationSplitView"))
}
@Test func `phone tab bar keeps chat control agent and settings in product order`() throws {
let source = try String(contentsOf: Self.rootTabsSourceURL(), encoding: .utf8)
let phoneTabContent = try Self.extract(
source,
from: "private var phoneTabContent: some View",
to: "extension RootTabs {\n private func updateCanvasState")
let chatRange = try #require(phoneTabContent.range(of: "ChatProTab("))
let controlRange = try #require(phoneTabContent.range(of: "RootTabsPhoneControlHub("))
let agentRange = try #require(phoneTabContent.range(of: "AgentProTab("))
let settingsRange = try #require(phoneTabContent.range(of: "SettingsProTab("))
#expect(chatRange.lowerBound < controlRange.lowerBound)
#expect(controlRange.lowerBound < agentRange.lowerBound)
#expect(agentRange.lowerBound < settingsRange.lowerBound)
#expect(!phoneTabContent.contains("TalkProTab("))
#expect(!phoneTabContent.contains(".tag(AppTab.talk)"))
#expect(phoneTabContent.contains("UnifiedChatVoiceTabIcon.image("))
#expect(phoneTabContent.contains("state: self.phoneChatVoiceIconState"))
#expect(!phoneTabContent.contains("micLevel"))
#expect(!phoneTabContent.contains("playbackLevel"))
#expect(phoneTabContent.contains("self.appModel.talkMode.isEnabled ? \"Chat, voice active\" : \"Chat\""))
#expect(!phoneTabContent.contains("Label(\"Chat\", systemImage: \"bubble.left.fill\")"))
#expect(phoneTabContent.matches(of: /PhoneTabSettingsHost(?:\([^\n]+\))? \{/).count == 2)
}
@Test func `phone chat keeps one composer voice control without a tab bar accessory`() throws {
@Test func `unified root shell removes phone tab chrome`() throws {
let rootSource = try String(contentsOf: Self.rootTabsSourceURL(), encoding: .utf8)
let chromeSource = try String(contentsOf: Self.rootTabsPhoneChromeSourceURL(), encoding: .utf8)
let chatSource = try String(contentsOf: Self.chatProTabSourceURL(), encoding: .utf8)
#expect(!rootSource.contains("TabView("))
#expect(!rootSource.contains("AppTab"))
#expect(!rootSource.contains("RootTabsPhoneControlHub"))
#expect(!rootSource.contains("PhoneTabSettingsHost"))
#expect(!rootSource.contains("tabViewBottomAccessory"))
#expect(!rootSource.contains("PhoneVoiceTabAccessory"))
#expect(!chromeSource.contains("PhoneVoiceTabAccessory"))
#expect(chatSource.contains("talkControl: Self.shouldExposeCaptureControl("))
#expect(chatSource.contains("private var talkControl: OpenClawChatTalkControl"))
#expect(chatSource.contains("self.appModel.setTalkEnabled(!self.appModel.talkMode.isEnabled)"))
@@ -151,50 +131,133 @@ struct RootTabsSourceGuardTests {
}
@Test func `sidebar keeps navigation model destination only`() throws {
let source = try String(contentsOf: Self.rootTabsSourceURL(), encoding: .utf8)
let rootSource = try String(contentsOf: Self.rootTabsSourceURL(), encoding: .utf8)
let source = try String(contentsOf: Self.rootSidebarSourceURL(), encoding: .utf8)
let navigationSource = try String(contentsOf: Self.rootTabsNavigationSourceURL(), encoding: .utf8)
let sidebarColumn = try Self.extract(
source,
from: "private var sidebarColumn: some View",
to: "private var sidebarList: some View")
#expect(source.contains("ForEach(Self.sidebarGroups)"))
#expect(!source.contains("Section(\"Context\")"))
#expect(!source.contains("sidebarAgentMenu"))
#expect(!source.contains("sidebarDeviceMenu"))
#expect(sidebarColumn.contains("self.sidebarIdentityHeader"))
#expect(source.contains("private var sidebarIdentityHeader: some View"))
#expect(source.contains("OpenClawProMark(size: 30"))
#expect(source.contains("Text(\"OpenClaw\")"))
#expect(source.contains("private var sidebarGatewayStatusTitle: String"))
#expect(source.contains("private var sidebarGatewayStatusColor: Color"))
#expect(!sidebarColumn.contains("activeAgent"))
#expect(!source.contains("shouldShowSidebarColumnHeader"))
#expect(!source.contains("private var sidebarColumnHeader: some View"))
#expect(sidebarColumn.contains(".safeAreaPadding(.top, 8)"))
#expect(source.contains(".scrollContentBackground(.hidden)"))
#expect(source.contains(".listStyle(.sidebar)"))
#expect(source.contains("private var sidebarHorizontalSeparator: some View"))
#expect(source.contains("private var sidebarVerticalSeparator: some View"))
#expect(source.contains("1 / UIScreen.main.scale"))
#expect(!source.contains("geometry.size.height >= Self.sidebarListNonScrollingMinimumHeight"))
#expect(!source.contains("private var sidebarListContent: some View"))
#expect(source.contains(".listRowSeparator(.hidden, edges: .all)"))
#expect(source.contains(".listSectionSeparator(.hidden, edges: .all)"))
#expect(source.contains("if self.isSidebarDrawerLayout {"))
#expect(!source.contains("private var sidebarFooter: some View"))
#expect(!source.contains("LabeledContent(\"Version\""))
#expect(navigationSource.contains("SidebarGroup(title: \"CHAT\", destinations: [.chat])"))
#expect(rootSource.contains("RootSidebar("))
#expect(source.contains("ForEach(self.pinnedPages)"))
#expect(source.contains("ForEach(RootTabs.pinnableSidebarPages)"))
#expect(source.contains("private var brandHeader: some View"))
#expect(source.contains("private var agentsSection: some View"))
#expect(source.contains("static func shownAgentCount(configured: Int, total: Int) -> Int"))
#expect(source.contains("ChatSessionSidebarModel.workSubtitle(for: session)"))
#expect(source.contains("private var homeRow: some View"))
#expect(source.contains("RootTabs.pinnedSidebarPages(from: self.pinnedPagesStorage)"))
#expect(source.contains("struct RootSidebarPagesEditor: View"))
#expect(source.contains("private var gatewayStatusTitle: String"))
#expect(source.contains("private var gatewayStatusColor: Color"))
#expect(source.contains("private var sessionsSection: some View"))
#expect(source.contains("private var pagesSection: some View"))
#expect(!source.contains("attentionSection"))
#expect(source.contains("private func badgeCount(for destination: RootTabs.SidebarDestination) -> Int"))
#expect(source.contains("private var footer: some View"))
#expect(source.contains("TextField(\"\", text: self.$searchText)"))
#expect(source.contains("commandSessionActions("))
#expect(source.contains("1 / self.displayScale"))
#expect(!source.contains("UIScreen.main.scale"))
#expect(navigationSource.contains("static let sidebarDestinations"))
#expect(!navigationSource.contains("SidebarGroup"))
#expect(!navigationSource.contains("title: \"AGENT\""))
#expect(navigationSource.contains("case settings"))
#expect(!navigationSource.contains("case settingsChannels"))
#expect(!navigationSource.contains("case settingsApprovals"))
#expect(!navigationSource.contains("case settingsPrivacy"))
#expect(navigationSource.contains("SidebarGroup(\n title: \"SETTINGS\""))
#expect(navigationSource.contains("destinations: [.settings]"))
#expect(!navigationSource.contains("destinations: [.gateway"))
#expect(!navigationSource.contains("SidebarGroup(title: \"REFERENCE\", destinations: [.settings"))
#expect(navigationSource.contains("SidebarGroup(title: \"REFERENCE\", destinations: [.docs])"))
#expect(!navigationSource.contains("phoneControlGroups"))
}
@Test func `sidebar refresh generations keep dashboard independent from roster replacements`() throws {
let source = try String(contentsOf: Self.rootSidebarModelSourceURL(), encoding: .utf8)
let refresh = try Self.extract(
source,
from: "func refresh(appModel: NodeAppModel) async {",
to: "func refreshSessions(appModel: NodeAppModel) async {")
let refreshSessions = try Self.extract(
source,
from: "func refreshSessions(appModel: NodeAppModel) async {",
to: "func reportSessionError(_ error: any Error) {")
let rosterCommit = try #require(refresh.range(of: "self.sessions = loadedRoster.sessions"))
let dashboardWait = try #require(refresh.range(of: "let loadedDashboard = await dashboard"))
#expect(source.contains("private var rosterGeneration = 0"))
#expect(source.contains("private var dashboardGeneration = 0"))
#expect(source.matches(of: /self\.rosterGeneration &\+= 1/).count == 2)
#expect(source.matches(of: /self\.dashboardGeneration &\+= 1/).count == 1)
#expect(refresh.contains("if rosterGeneration == self.rosterGeneration"))
#expect(refresh.contains(
"guard !Task.isCancelled, dashboardGeneration == self.dashboardGeneration else { return }"))
#expect(refreshSessions.contains(
"guard !Task.isCancelled, rosterGeneration == self.rosterGeneration else { return }"))
#expect(!refreshSessions.contains("dashboardGeneration"))
#expect(source.contains("catch is CancellationError"))
#expect(source.contains("case .cancelled:\n return"))
#expect(rosterCommit.lowerBound < dashboardWait.lowerBound)
#expect(source.contains("allowCachedFallback: false"))
}
@Test func `sidebar refresh owner tracks sessions and periodically refreshes attention`() throws {
let source = try String(contentsOf: Self.rootTabsSourceURL(), encoding: .utf8)
let refreshTask = try Self.extract(
source,
from: "private var sidebarSplitContent: some View",
to: "private var sidebarRefreshID: String")
let refreshID = try Self.extract(
source,
from: "private var sidebarRefreshID: String",
to: "private func sidebarNavigationSplitContent(")
#expect(refreshTask.contains(".task(id: self.sidebarRefreshID)"))
#expect(refreshTask.contains("try? await Task.sleep(for: .seconds(600))"))
#expect(refreshTask.contains("while !Task.isCancelled"))
#expect(refreshTask.contains("guard !Task.isCancelled else { return }"))
#expect(refreshID.contains("self.appModel.chatViewModelIdentityID"))
#expect(refreshID.contains("self.appModel.chatSessionKey"))
#expect(refreshID.contains("self.scenePhase == .active"))
}
@Test func `sidebar dashboard keeps per field last known good values and drains cron pages`() throws {
let source = try String(contentsOf: Self.rootSidebarModelSourceURL(), encoding: .utf8)
let dashboardCommit = try Self.extract(
source,
from: "let loadedDashboard = await dashboard",
to: "func refreshSessions(appModel: NodeAppModel) async {")
let cronLoad = try Self.extract(
source,
from: "private func loadCronJobs(appModel: NodeAppModel) async -> [CronJob]? {",
to: "private func request<T: Decodable>(")
#expect(dashboardCommit.contains("if let usage = loadedDashboard.usage"))
#expect(dashboardCommit.contains("if let cronJobs = loadedDashboard.cronJobs"))
#expect(cronLoad.contains("let pageLimit = 5"))
#expect(cronLoad.contains("let jobLimit = 1000"))
#expect(cronLoad.contains("cronJobsSnapshotIdentity"))
#expect(cronLoad.contains("nextCronJobsListOffset"))
#expect(source.contains("return job.enabled &&"))
}
@Test func `sidebar session selections use resolved keys groups and eligibility`() throws {
let source = try String(contentsOf: Self.rootSidebarSourceURL(), encoding: .utf8)
let actionsSource = try String(contentsOf: Self.commandCenterSupportSourceURL(), encoding: .utf8)
let commandCenterSource = try String(contentsOf: Self.commandCenterSourceURL(), encoding: .utf8)
let defaultSession = try Self.extract(
commandCenterSource,
from: "private var effectiveDefaultChatSessionEntry: OpenClawChatSessionEntry?",
to: "private var effectiveRecentChatSessions:")
#expect(source.contains("private var resolvedSelectedSessionKey: String"))
#expect(source.contains("private var resolvedMainSessionKey: String"))
#expect(source.contains("groups: self.sessionGroups"))
#expect(source.contains("let isSelected = session.key == selectedSessionKey"))
#expect(source.contains("self.appModel.openChat(sessionKey: mainKey"))
#expect(source.contains("self.resolvedSelectedSessionKey.caseInsensitiveCompare(mainKey)"))
#expect(source.contains("canArchive: ChatSessionSidebarModel.canArchiveSession("))
#expect(source.contains("canDelete: ChatSessionSidebarModel.canDeleteSession("))
#expect(actionsSource.contains("if self.canArchive"))
#expect(actionsSource.contains("if self.canDelete"))
#expect(source.contains("private func selectSidebarDestination("))
#expect(source.contains("self.isSearchFocused = false"))
#expect(defaultSession.contains("ChatSessionSidebarModel.selectedSessionKey("))
#expect(defaultSession.contains("sessions.first { $0.key == mainKey }"))
}
@Test func `sidebar routes use destination headers instead of repeated product branding`() throws {
@@ -206,7 +269,8 @@ struct RootTabsSourceGuardTests {
from: "private var sidebarDetail: some View",
to: "private var sidebarDetailNavigationShell: some View")
#expect(sidebarDetail.contains("headerTitle: \"Chat\""))
#expect(!sidebarDetail.contains("headerTitle: \"Chat\""))
#expect(!sidebarDetail.contains("showsAgentBadge: false"))
#expect(sidebarDetail.contains("headerTitle: \"Overview\""))
#expect(sidebarDetail.contains("headerTitle: \"Agents\""))
#expect(sidebarDetail.contains("headerTitle: \"Instances\""))
@@ -238,18 +302,18 @@ struct RootTabsSourceGuardTests {
let dreamingSource = try String(contentsOf: Self.agentProDreamingDestinationSourceURL(), encoding: .utf8)
#expect(source
.contains("route != .agents && self.directHeaderLeadingAction(for: route) != nil ? .hidden : .visible"))
.contains("route != .agents && self.directHeaderSidebarAction(for: route) != nil ? .hidden : .visible"))
#expect(destinationsSource.contains(".navigationTitle(self.headerTitle)"))
#expect(destinationsSource.contains(".searchable(text: self.$agentSearchText"))
#expect(destinationsSource.contains("ToolbarItemGroup(placement: .topBarTrailing)"))
#expect(!destinationsSource.contains(".toolbar(.hidden, for: .navigationBar)"))
#expect(destinationsSource.contains("self.directHeaderLeadingAction(for: .instances)"))
#expect(destinationsSource.contains("self.directHeaderLeadingAction(for: .dreaming)"))
#expect(destinationsSource.contains("self.directHeaderSidebarAction(for: .instances)"))
#expect(destinationsSource.contains("self.directHeaderSidebarAction(for: .dreaming)"))
#expect(destinationsSource.contains("self.directHeader(\n for: .usage"))
#expect(destinationsSource.contains("self.directHeader(\n for: .cron"))
#expect(destinationsSource.contains("self.directRoute == route ? self.headerLeadingAction : nil"))
#expect(nodesSource.contains("OpenClawSidebarHeaderLeadingSlot(action: headerLeadingAction)"))
#expect(dreamingSource.contains("OpenClawSidebarHeaderLeadingSlot(action: headerLeadingAction)"))
#expect(destinationsSource.contains("self.directRoute == route ? self.headerSidebarAction : nil"))
#expect(nodesSource.contains("OpenClawSidebarHeaderLeadingSlot(action: headerSidebarAction)"))
#expect(dreamingSource.contains("OpenClawSidebarHeaderLeadingSlot(action: headerSidebarAction)"))
}
@Test func `iOS 26 chrome uses native glass while content cards stay quiet`() throws {
@@ -261,10 +325,11 @@ struct RootTabsSourceGuardTests {
from: "private struct ProPanelSurfaceModifier: ViewModifier",
to: "struct ProIconBadge: View")
#expect(rootSource.contains(".openClawTabBarBehavior()"))
#expect(!rootSource.contains(".openClawTabBarBehavior()"))
#expect(!rootSource.contains("TabView("))
#expect(appSource.contains(".preferredColorScheme(self.appearanceModel.preference.colorScheme)"))
#expect(!appSource.contains("overrideUserInterfaceStyle"))
#expect(componentsSource.contains("content.tabBarMinimizeBehavior(.onScrollDown)"))
#expect(!componentsSource.contains("tabBarMinimizeBehavior"))
#expect(componentsSource.contains(".buttonStyle(.glassProminent)"))
#expect(componentsSource.contains(".buttonStyle(.glass)"))
#expect(componentsSource.contains("GlassEffectContainer(spacing: 8)"))
@@ -404,7 +469,7 @@ struct RootTabsSourceGuardTests {
let overviewSource = try String(contentsOf: Self.commandCenterSourceURL(), encoding: .utf8)
let chatSource = try String(contentsOf: Self.chatProTabSourceURL(), encoding: .utf8)
let agentOverviewSource = try String(contentsOf: Self.agentProTabOverviewSourceURL(), encoding: .utf8)
let settingsSource = try String(contentsOf: Self.settingsProTabSectionsSourceURL(), encoding: .utf8)
let settingsSource = try String(contentsOf: Self.settingsProTabSourceURL(), encoding: .utf8)
#expect(componentsSource.contains("struct OpenClawAdaptiveHeaderRow<Leading: View, Accessory: View>: View"))
#expect(componentsSource.contains("ViewThatFits(in: .horizontal)"))
@@ -413,7 +478,7 @@ struct RootTabsSourceGuardTests {
#expect(componentsSource.contains(".fixedSize(horizontal: true, vertical: false)"))
#expect(featureChromeSource.contains("OpenClawAdaptiveHeaderRow("))
#expect(featureChromeSource.contains("if !self.usesNativeNavigationChrome"))
#expect(!featureChromeSource.contains("if self.headerLeadingAction != nil"))
#expect(!featureChromeSource.contains("if self.headerSidebarAction != nil"))
#expect(docsSource.contains("OpenClawAdaptiveHeaderRow("))
#expect(docsSource.contains("if !self.usesNativeNavigationChrome"))
#expect(overviewSource.contains("OpenClawAdaptiveHeaderRow("))
@@ -422,10 +487,11 @@ struct RootTabsSourceGuardTests {
#expect(chatSource.contains("self.headerAgentIdentity"))
#expect(!chatSource.contains("headerAgentModelPicker"))
#expect(chatSource.contains(".sharedBackgroundVisibility(.hidden)"))
#expect(chatSource.contains("OpenClawSidebarRevealButton(action: headerLeadingAction)"))
#expect(chatSource.contains("OpenClawSidebarRevealButton(action: headerSidebarAction)"))
#expect(!chatSource.contains("OpenClawAdaptiveHeaderRow("))
#expect(agentOverviewSource.contains("OpenClawAdaptiveHeaderRow("))
#expect(settingsSource.contains("ToolbarItem(placement: .topBarLeading)"))
#expect(!settingsSource.contains("ToolbarItem(placement: .topBarTrailing)"))
}
@Test func `chat keeps layered canvas behind soft native scroll edges`() throws {
@@ -436,21 +502,11 @@ struct RootTabsSourceGuardTests {
#expect(!source.contains(".background(Color(uiColor: .systemBackground))"))
}
@Test func `phone hub keeps docs as destination only`() throws {
let source = try String(contentsOf: Self.phoneHubSourceURL(), encoding: .utf8)
#expect(source.contains("case .docs:"))
#expect(source.contains("OpenClawDocsScreen("))
#expect(source.contains("gatewayAction: { self.openGatewayDetail() }"))
#expect(!source.contains("phoneDetailBackAction"))
#expect(!source.contains("Label(\"Docs\", systemImage: \"book\")"))
#expect(!source.contains("https://docs.openclaw.ai"))
}
@Test func `root shell preview matrix covers phone and I pad states`() throws {
let source = try String(contentsOf: Self.rootTabsSourceURL(), encoding: .utf8)
#expect(source.contains("#Preview(\n \"Shell iPhone portrait\""))
#expect(source.contains("#Preview(\n \"Shell iPhone drawer open\""))
#expect(source.contains("#Preview(\n \"Shell iPhone landscape\""))
#expect(source.contains("#Preview(\n \"Shell iPhone connected\""))
#expect(source.contains("#Preview(\n \"Shell iPhone gateway error\""))
@@ -474,62 +530,6 @@ struct RootTabsSourceGuardTests {
#expect(source.contains("case error"))
#expect(source.contains("Gateway not connected. Check Tailscale and retry."))
}
@Test func `phone hub lets the native list respect the floating tab bar`() throws {
let source = try String(contentsOf: Self.phoneHubSourceURL(), encoding: .utf8)
#expect(source.contains("List {"))
#expect(source.contains(".listStyle(.insetGrouped)"))
#expect(!source.contains("bottomScrollInset"))
#expect(!source.contains("safeAreaPadding(.bottom"))
}
@Test func `phone hub promotes unified chat while filtering root tabs from its destination list`() throws {
let source = try String(contentsOf: Self.phoneHubSourceURL(), encoding: .utf8)
#expect(source.contains("private var gatewayHeader: some View"))
#expect(source.contains("private var gatewayIdentityTitle: some View"))
#expect(source.contains("Text(verbatim: gatewayDisplayLabel)"))
#expect(source.contains("Text(\"Gateway\")"))
#expect(source.contains(".accessibilityLabel(self.gatewayAccessibilityLabel)"))
#expect(source.contains("private var chatShortcut: some View"))
#expect(source.contains(
".listRowInsets(EdgeInsets(top: 4, leading: 0, bottom: 4, trailing: 0))"))
#expect(source.contains("self.prominentDestinationCard(\n .chat,"))
#expect(source.contains("Agent chat and recent work."))
#expect(!source.contains("TalkProTab("))
#expect(source.contains("private var phoneDestinations: [RootTabs.SidebarDestination]"))
#expect(source.contains("self.groups.flatMap(\\.destinations).filter { !self.opensRootTab($0) }"))
#expect(source.contains("private struct ControlCircleIcon: View"))
#expect(source.contains(".foregroundStyle(self.iconForegroundStyle)"))
#expect(!source.contains("ProValuePill(value: self.gatewayStateText"))
#expect(!source.contains("destination.subtitle"))
#expect(source.contains("self.openGatewayDetail()"))
#expect(!source.contains("self.openPhoneRootDestination(.gateway)"))
#expect(!source.contains("phoneDetailBackAction"))
#expect(!source.contains(".navigationBarBackButtonHidden(true)"))
#expect(!source.contains(".toolbar(.hidden, for: .navigationBar)"))
#expect(source.matches(of: /usesNativeNavigationChrome: true/).count == 7)
#expect(!source.contains("directRoute: .agents"))
#expect(source.contains("Image(systemName: \"slider.horizontal.3\")"))
#expect(!source.contains("self.metric(label:"))
#expect(!source.contains("private func metric(label:"))
}
@Test func `phone hub clears detail path before root tab handoff`() throws {
let source = try String(contentsOf: Self.phoneHubSourceURL(), encoding: .utf8)
let handoff = try Self.extract(
source,
from: "private func openPhoneRootDestination(_ destination: RootTabs.SidebarDestination)",
to: "private func opensRootTab(_ destination: RootTabs.SidebarDestination)")
let clearRange = try #require(handoff.range(of: "self.navigationPath.removeAll()"))
let openRange = try #require(handoff.range(of: "self.openRootDestination(destination)"))
#expect(source.contains("NavigationStack(path: self.$navigationPath)"))
#expect(!source.contains("self.openRootDestination(.gateway)"))
#expect(source.contains("self.navigationPath.append(.gateway)"))
#expect(clearRange.lowerBound < openRange.lowerBound)
}
}
extension RootTabsSourceGuardTests {
@@ -716,9 +716,9 @@ extension RootTabsSourceGuardTests {
#expect(source.contains("self.previewHeader(\"Loading\")"))
#expect(source.contains("self.previewHeader(\"Empty\")"))
#expect(source.contains("self.previewHeader(\"Error\")"))
#expect(source.contains("title: \"Threads unavailable\""))
#expect(source.contains("title: \"No recent threads\""))
#expect(source.contains("title: \"Loading threads\""))
#expect(source.contains("title: \"Sessions unavailable\""))
#expect(source.contains("title: \"No recent sessions\""))
#expect(source.contains("title: \"Loading sessions\""))
}
@Test func `routed feature screens reuse shared pro components`() throws {
@@ -763,7 +763,7 @@ extension RootTabsSourceGuardTests {
let projectSource = try String(contentsOf: Self.xcodeProjectSourceURL(), encoding: .utf8)
#expect(chromeSource.contains("struct IPadSidebarScreenChrome<Content: View>: View"))
#expect(chromeSource.contains("OpenClawSidebarHeaderLeadingSlot(action: headerLeadingAction)"))
#expect(chromeSource.contains("OpenClawSidebarHeaderLeadingSlot(action: headerSidebarAction)"))
#expect(chromeSource.contains("OpenClawGatewayCompactPill()"))
#expect(!taskSource.contains("struct IPadSidebarScreenChrome"))
#expect(projectSource.contains("IPadSidebarScreenChrome.swift in Sources"))
@@ -801,7 +801,7 @@ extension RootTabsSourceGuardTests {
encoding: .utf8)
let settingsRoutePattern = try Regex(
#"case \.settings:[\s\S]*?SettingsProTab\("#
+ #"[\s\S]*?headerLeadingAction: self\.sidebarHeaderLeadingAction,"#
+ #"[\s\S]*?headerSidebarAction: self\.sidebarHeaderAction,"#
+ #"[\s\S]*?ownsNavigationStack: false"#
+ #"[\s\S]*?onRouteChange: handleSettingsRouteChange"#)
let approvalSuppression = try Self.extract(
@@ -811,7 +811,7 @@ extension RootTabsSourceGuardTests {
let sidebarNavigationShell = try Self.extract(
rootSource,
from: "private var sidebarDetailNavigationShell: some View",
to: "private var usesSidebarTabs: Bool")
to: "private var sidebarDetailShellID: String")
let settingsRoutePropagation = try Self.extract(
rootSource,
from: "private func handleSettingsRouteChange(_ route: SettingsRoute?)",
@@ -863,8 +863,7 @@ extension RootTabsSourceGuardTests {
#expect(rootSource.contains("@State private var sidebarNavigationPath: [SettingsRoute] = []"))
#expect(rootSource.contains("NavigationStack(path: self.$sidebarNavigationPath)"))
#expect(rootSource.contains("self.sidebarNavigationPath.removeAll()"))
#expect(rootSource.matches(of: /SettingsProTab\(\s*initialRoute: self\.selectedSettingsRoute,/).count == 1)
#expect(rootSource.contains(".id(self.settingsTabViewID)"))
#expect(rootSource.contains("directRoute: selectedSettingsRoute"))
#expect(rootSource.contains("@State private var selectedSettingsRouteRequestID: Int = 0"))
#expect(rootSource.contains("@State private var activeSettingsRoute: SettingsRoute?"))
#expect(rootSource.contains("self.selectedSettingsRouteRequestID &+= 1"))
@@ -889,7 +888,7 @@ extension RootTabsSourceGuardTests {
#expect(rootSource.contains(
"self.suppressedExecApprovalForNotificationSettings = NodeAppModel.execApprovalInboxKey(prompt)"))
#expect(rootSource.contains(
"onApprovalNotificationsRoute: self.suppressExecApprovalPromptForNotificationSettings"))
"onApprovalNotificationsRoute: suppressExecApprovalPromptForNotificationSettings"))
#expect(rootSource.contains("private func suppressExecApprovalPromptForNotificationSettings("))
#expect(rootSource.contains("onRouteChange: handleSettingsRouteChange"))
#expect(rootSource.contains("navigateToRoute: pushSidebarSettingsRoute"))
@@ -1275,7 +1274,7 @@ extension RootTabsSourceGuardTests {
let onboardingContent = try #require(onboardingScannerSheet.range(of: "content: {"))
#expect(appSource.contains("deferDiscoveryUntilLocalNetworkRequest: true"))
#expect(appSource.contains("func application(\n _ app: UIApplication,\n open url: URL,"))
#expect(appSource.contains("func application(\n _: UIApplication,\n open url: URL,"))
#expect(appSource.contains("self.pendingOpenURLs.append(url)"))
#expect(appSource.contains("model.stageGatewaySetupLink(link)"))
#expect(appSource.contains(".onOpenURL"))
@@ -1520,12 +1519,12 @@ extension RootTabsSourceGuardTests {
}
@Test func `approval inbox stays reopenable and modal isolates accessibility`() throws {
let rootSource = try String(contentsOf: Self.rootTabsSourceURL(), encoding: .utf8)
let rootSource = try String(contentsOf: Self.rootSidebarSourceURL(), encoding: .utf8)
let modelSource = try String(contentsOf: Self.nodeAppModelSourceURL(), encoding: .utf8)
let dialogSource = try String(contentsOf: Self.execApprovalPromptDialogSourceURL(), encoding: .utf8)
let settingsSource = try String(contentsOf: Self.settingsProTabSectionsSourceURL(), encoding: .utf8)
#expect(rootSource.contains(".badge(self.appModel.pendingExecApprovalCount)"))
#expect(rootSource.contains("case .overview: self.appModel.pendingExecApprovalCount"))
#expect(modelSource.contains("var pendingExecApprovalInboxItems: [ExecApprovalInboxItem]"))
#expect(modelSource.contains("self.dismissedExecApprovalPresentationKeys.insert(inboxKey)"))
#expect(modelSource.contains("func presentPendingExecApprovalFromInbox("))
@@ -1545,6 +1544,20 @@ extension RootTabsSourceGuardTests {
.appendingPathComponent("Sources/RootTabs.swift")
}
private static func rootSidebarSourceURL() -> URL {
URL(fileURLWithPath: #filePath)
.deletingLastPathComponent()
.deletingLastPathComponent()
.appendingPathComponent("Sources/RootSidebar.swift")
}
private static func rootSidebarModelSourceURL() -> URL {
URL(fileURLWithPath: #filePath)
.deletingLastPathComponent()
.deletingLastPathComponent()
.appendingPathComponent("Sources/RootSidebarModel.swift")
}
static func nodeAppModelSourceURL() -> URL {
URL(fileURLWithPath: #filePath)
.deletingLastPathComponent()
@@ -1566,13 +1579,6 @@ extension RootTabsSourceGuardTests {
.appendingPathComponent("Sources/Chat/IOSGatewayChatTransport.swift")
}
private static func phoneHubSourceURL() -> URL {
URL(fileURLWithPath: #filePath)
.deletingLastPathComponent()
.deletingLastPathComponent()
.appendingPathComponent("Sources/Design/RootTabsPhoneControlHub.swift")
}
private static func proComponentsSourceURL() -> URL {
URL(fileURLWithPath: #filePath)
.deletingLastPathComponent()
@@ -1695,13 +1701,6 @@ extension RootTabsSourceGuardTests {
.appendingPathComponent("Sources/Design/ChatProTab.swift")
}
private static func rootTabsPhoneChromeSourceURL() -> URL {
URL(fileURLWithPath: #filePath)
.deletingLastPathComponent()
.deletingLastPathComponent()
.appendingPathComponent("Sources/Design/RootTabsPhoneChrome.swift")
}
private static func docsSourceURL() -> URL {
URL(fileURLWithPath: #filePath)
.deletingLastPathComponent()
@@ -47,12 +47,11 @@ struct RuntimeLocalizationSourceGuardTests {
let widget = try Self.source("ActivityWidget/OpenClawLiveActivity.swift")
let project = try Self.source("project.yml")
let dreaming = try Self.source("Sources/Design/AgentProDreamingDestination.swift")
let phoneControlHub = try Self.source("Sources/Design/RootTabsPhoneControlHub.swift")
let rootSidebar = try Self.source("Sources/RootSidebar.swift")
let proComponents = try Self.source("Sources/Design/OpenClawProComponents.swift")
let skillWorkshop = try Self.source("Sources/Design/IPadSkillWorkshopScreen.swift")
let workboard = try Self.source("Sources/Design/IPadWorkboardScreen.swift")
let talkManager = try Self.source("Sources/Voice/TalkModeManager.swift")
let rootTabs = try Self.source("Sources/RootTabs.swift")
let rootTabsNavigation = try Self.source("Sources/RootTabsNavigation.swift")
let watchInbox = try Self.source("WatchApp/Sources/WatchInboxView.swift")
let chat = try Self.sharedSource("OpenClawChatUI/ChatMessageViews.swift")
@@ -82,7 +81,7 @@ struct RuntimeLocalizationSourceGuardTests {
#expect(!watchInbox.contains("WatchTextValue: ExpressibleByStringLiteral"))
#expect(watchInbox.contains("accessory: .verbatim(self.store.talkSummaryText)"))
for status in ["Online", "Connecting", "Needs attention", "Offline"] {
#expect(rootTabs.contains("String(localized: \"\(status)\")"))
#expect(rootSidebar.contains("String(localized: \"\(status)\")"))
}
let destinationTitles = [
"Chat",
@@ -107,10 +106,9 @@ struct RuntimeLocalizationSourceGuardTests {
}
#expect(rootTabsNavigation.contains("case .gateway: String(localized: \"Connection\")"))
for status in ["Online", "Connecting", "Attention", "Offline"] {
#expect(phoneControlHub.contains("String(localized: \"\(status)\")"))
#expect(proComponents.contains("String(localized: \"\(status)\")"))
}
#expect(phoneControlHub.contains("String(localized: \"Default Agent\")"))
#expect(rootSidebar.contains("String(localized: \"New Chat\")"))
#expect(proComponents.contains("OpenClawStatusBadge(label: .verbatim(self.title)"))
#expect(
skillWorkshop.components(separatedBy: "String(localized: \"Default agent\")").count - 1 == 2)
@@ -170,5 +168,5 @@ struct RuntimeLocalizationSourceGuardTests {
var isDisconnected = false
var isConnecting = false
var startedAt = Date(timeIntervalSince1970: 1234)
}
}
}
+34 -22
View File
@@ -294,12 +294,11 @@ struct SwiftUIRenderSmokeTests {
let appModel = NodeAppModel()
let gatewayController = GatewayConnectionController(appModel: appModel, startDiscovery: false)
let root = RootTabs()
let root = RootTabs(initialSidebarVisibility: scenario.sidebarVisible)
.environment(AppAppearanceModel())
.environment(appModel)
.environment(appModel.voiceWake)
.environment(gatewayController)
.environment(\.rootTabsUserInterfaceIdiomOverride, scenario.idiom)
.environment(\.horizontalSizeClass, scenario.horizontalSizeClass)
.environment(\.verticalSizeClass, scenario.verticalSizeClass)
@@ -488,33 +487,35 @@ struct SwiftUIRenderSmokeTests {
await controller.connectManual(host: host, port: port, useTLS: true)
}
@Test @MainActor func `phone control hub builds gateway state view hierarchies`() {
@Test @MainActor func `root sidebar builds gateway state view hierarchies`() {
for appModel in Self.rootTabsGatewayStateModels() {
let root = RootTabsPhoneControlHub(
groups: RootTabs.phoneControlGroups,
initialDestination: nil,
navigationRequest: nil,
openRootDestination: { _ in },
openChatFromControlDetail: { _ in })
let root = RootSidebar(
model: RootSidebarModel(),
selectedDestination: .overview,
isDrawerLayout: true,
selectDestination: { _ in },
selectSettingsRoute: { _ in },
hideSidebar: {})
.environment(appModel)
_ = Self.host(root)
_ = Self.host(root, size: CGSize(width: 340, height: 852))
}
}
@Test @MainActor func `phone control hub builds landscape compact state`() {
@Test @MainActor func `root sidebar builds landscape compact state`() {
let appModel = NodeAppModel()
let root = RootTabsPhoneControlHub(
groups: RootTabs.phoneControlGroups,
initialDestination: nil,
navigationRequest: nil,
openRootDestination: { _ in },
openChatFromControlDetail: { _ in })
let root = RootSidebar(
model: RootSidebarModel(),
selectedDestination: .chat,
isDrawerLayout: true,
selectDestination: { _ in },
selectSettingsRoute: { _ in },
hideSidebar: {})
.environment(appModel)
.environment(\.horizontalSizeClass, .regular)
.environment(\.verticalSizeClass, .compact)
_ = Self.host(root)
_ = Self.host(root, size: CGSize(width: 340, height: 393))
}
@Test @MainActor func `routed sidebar screens build offline states`() {
@@ -598,22 +599,32 @@ struct SwiftUIRenderSmokeTests {
idiom: .phone,
size: CGSize(width: 393, height: 852),
horizontalSizeClass: .compact,
verticalSizeClass: .regular),
verticalSizeClass: .regular,
sidebarVisible: false),
RootTabsShellScenario(
idiom: .phone,
size: CGSize(width: 393, height: 852),
horizontalSizeClass: .compact,
verticalSizeClass: .regular,
sidebarVisible: true),
RootTabsShellScenario(
idiom: .phone,
size: CGSize(width: 852, height: 393),
horizontalSizeClass: .regular,
verticalSizeClass: .compact),
verticalSizeClass: .compact,
sidebarVisible: false),
RootTabsShellScenario(
idiom: .pad,
size: CGSize(width: 1024, height: 1366),
horizontalSizeClass: .regular,
verticalSizeClass: .regular),
verticalSizeClass: .regular,
sidebarVisible: true),
RootTabsShellScenario(
idiom: .pad,
size: CGSize(width: 1366, height: 1024),
horizontalSizeClass: .regular,
verticalSizeClass: .regular),
verticalSizeClass: .regular,
sidebarVisible: true),
]
}
@@ -622,6 +633,7 @@ struct SwiftUIRenderSmokeTests {
let size: CGSize
let horizontalSizeClass: UserInterfaceSizeClass
let verticalSizeClass: UserInterfaceSizeClass
let sidebarVisible: Bool
}
}
+71 -61
View File
@@ -77,18 +77,17 @@ final class OpenClawSnapshotUITests: XCTestCase {
self.attachScreenshot(named: "onboarding-capabilities-and-trust")
}
func testControlOverviewNavigation() throws {
try XCTSkipIf(UIDevice.current.userInterfaceIdiom != .phone, "Phone control hub only")
func testSidebarOverviewNavigation() throws {
try XCTSkipIf(UIDevice.current.userInterfaceIdiom != .phone, "Phone sidebar only")
self.launchApp(for: ScreenshotTarget(
initialTab: "control",
initialDestination: "control",
initialDestination: "overview",
name: "control-overview-navigation"))
let overview = self.app?.buttons.containing(.staticText, identifier: "Overview").firstMatch
XCTAssertTrue(overview?.waitForExistence(timeout: 5) == true)
overview?.tap()
XCTAssertTrue(self.app?.staticTexts["Agent session"].waitForExistence(timeout: 8) == true)
try self.selectSidebarDestination("Overview")
XCTAssertTrue(self.app?.navigationBars.buttons["Control"].waitForExistence(timeout: 5) == true)
XCTAssertTrue(self.app?.buttons["RootTabs.Sidebar.Show"].waitForExistence(timeout: 5) == true)
XCTAssertTrue(self.app?.buttons["Gateway settings"].waitForExistence(timeout: 5) == true)
XCTAssertEqual(self.app?.state, .runningForeground)
}
@@ -205,8 +204,8 @@ final class OpenClawSnapshotUITests: XCTestCase {
XCTAssertTrue(self.app?.buttons["While Using"].isSelected == true)
}
func testSettingsBackReturnsToOriginatingPhoneTab() throws {
try XCTSkipIf(UIDevice.current.userInterfaceIdiom != .phone, "Phone settings navigation only")
func testSettingsBackReturnsToOriginatingSidebarDestination() throws {
try XCTSkipIf(UIDevice.current.userInterfaceIdiom != .phone, "Phone sidebar navigation only")
self.launchApp(for: ScreenshotTarget(
initialTab: "chat",
@@ -216,12 +215,12 @@ final class OpenClawSnapshotUITests: XCTestCase {
try self.openChatGatewaySettings()
let gatewayNavigationBar = try XCTUnwrap(self.app?.navigationBars["Gateway"])
XCTAssertTrue(gatewayNavigationBar.waitForExistence(timeout: 5))
XCTAssertTrue(self.app?.tabBars.buttons["Chat"].isSelected == true)
XCTAssertTrue(self.app?.buttons["RootTabs.Sidebar.Show"].exists == true)
self.attachScreenshot(named: "chat-gateway-origin-stack")
gatewayNavigationBar.buttons["BackButton"].tap()
XCTAssertTrue(self.app?.otherElements["chat-agent-identity"].waitForExistence(timeout: 5) == true)
XCTAssertTrue(self.app?.tabBars.buttons["Chat"].isSelected == true)
XCTAssertTrue(self.app?.buttons["RootTabs.Sidebar.Show"].exists == true)
self.attachScreenshot(named: "chat-after-settings-back")
}
@@ -508,8 +507,8 @@ final class OpenClawSnapshotUITests: XCTestCase {
self.attachScreenshot(named: "onboarding-connected-go-to-chat")
app.buttons["Go to Chat"].tap()
XCTAssertTrue(app.tabBars.buttons["Chat"].waitForExistence(timeout: 5))
XCTAssertTrue(app.tabBars.buttons["Chat"].isSelected)
XCTAssertTrue(app.otherElements["chat-agent-identity"].waitForExistence(timeout: 5))
XCTAssertTrue(app.buttons["RootTabs.Sidebar.Show"].exists)
}
func testAppearanceUsesSettingsRow() throws {
@@ -561,65 +560,39 @@ final class OpenClawSnapshotUITests: XCTestCase {
self.attachScreenshot(named: "appearance-system-restored")
}
func testChatReturnsToOriginatingControlDetail() throws {
try XCTSkipIf(UIDevice.current.userInterfaceIdiom != .phone, "Phone Control proof only")
func testChatAndOverviewNavigateThroughSidebar() throws {
try XCTSkipIf(UIDevice.current.userInterfaceIdiom != .phone, "Phone sidebar proof only")
self.launchApp(for: ScreenshotTarget(
initialTab: "control",
initialDestination: "activity",
name: "control-chat-return"))
let chatTab = try XCTUnwrap(self.app?.tabBars.buttons["Chat"])
let controlTab = try XCTUnwrap(self.app?.tabBars.buttons["Control"])
// Retain an embedded Chat Settings route, then prove contextual routing pops it.
chatTab.tap()
try self.openChatGatewaySettings()
XCTAssertTrue(self.app?.navigationBars["Gateway"].waitForExistence(timeout: 5) == true)
controlTab.tap()
XCTAssertTrue(self.app?.navigationBars["Control"].waitForExistence(timeout: 8) == true)
let activity = try XCTUnwrap(self.app?.buttons["Activity"])
XCTAssertTrue(activity.waitForExistence(timeout: 5))
activity.tap()
let recentActivity = try XCTUnwrap(self.app?.staticTexts["Recent activity"])
XCTAssertTrue(recentActivity.waitForExistence(timeout: 8))
self.attachScreenshot(named: "control-activity-before-chat")
let activityChat = try self.controlDetailChatButton(above: chatTab)
activityChat.tap()
XCTAssertTrue(chatTab.isSelected)
let returnButton = try XCTUnwrap(self.app?.buttons["OpenClawChatBackToControlDetailButton"])
XCTAssertTrue(returnButton.waitForExistence(timeout: 5))
XCTAssertEqual(returnButton.label, "Back to Activity")
try self.startNewChatFromSidebar()
XCTAssertTrue(self.app?.otherElements["chat-composer-surface"].waitForExistence(timeout: 8) == true)
self.attachScreenshot(named: "chat-return-to-activity")
returnButton.tap()
try self.selectSidebarDestination("Activity")
XCTAssertTrue(recentActivity.waitForExistence(timeout: 8))
XCTAssertTrue(controlTab.isSelected)
self.attachScreenshot(named: "control-activity-after-chat")
try self.controlDetailChatButton(above: chatTab).tap()
XCTAssertTrue(chatTab.isSelected)
controlTab.tap()
XCTAssertTrue(self.app?.navigationBars["Control"].waitForExistence(timeout: 8) == true)
let overview = try XCTUnwrap(self.app?.buttons["Overview"])
XCTAssertTrue(overview.exists)
try self.startNewChatFromSidebar()
try self.selectSidebarDestination("Overview")
XCTAssertTrue(self.app?.staticTexts["Agent session"].waitForExistence(timeout: 8) == true)
self.attachScreenshot(named: "control-tab-returns-to-root")
overview.tap()
XCTAssertTrue(self.app?.staticTexts["Agent session"].waitForExistence(timeout: 8) == true)
let agentSession = try XCTUnwrap(
self.app?.buttons.containing(.staticText, identifier: "Molty").firstMatch)
XCTAssertTrue(agentSession.waitForExistence(timeout: 8))
agentSession.tap()
XCTAssertTrue(returnButton.waitForExistence(timeout: 8))
XCTAssertEqual(returnButton.label, "Back to Overview")
XCTAssertTrue(self.app?.otherElements["chat-composer-surface"].waitForExistence(timeout: 8) == true)
self.attachScreenshot(named: "chat-session-return-to-overview")
returnButton.tap()
XCTAssertTrue(self.app?.navigationBars["Overview"].waitForExistence(timeout: 8) == true)
try self.selectSidebarDestination("Overview")
XCTAssertTrue(self.app?.staticTexts["Agent session"].waitForExistence(timeout: 8) == true)
}
func testAgentUsesToolbarFilter() throws {
@@ -646,9 +619,9 @@ final class OpenClawSnapshotUITests: XCTestCase {
let controlApp = self.relaunchConnectedLiveGatewayApp(
initialTab: "control",
initialDestination: "control")
let overview = controlApp.buttons.containing(.staticText, identifier: "Overview").firstMatch
XCTAssertTrue(overview.waitForExistence(timeout: 8))
initialDestination: "overview")
XCTAssertTrue(controlApp.staticTexts["Agent session"].waitForExistence(timeout: 8))
XCTAssertTrue(controlApp.buttons["RootTabs.Sidebar.Show"].exists)
XCTAssertEqual(controlApp.state, .runningForeground)
}
@@ -691,12 +664,10 @@ final class OpenClawSnapshotUITests: XCTestCase {
let controlApp = self.relaunchConnectedLiveGatewayApp(
initialTab: "control",
initialDestination: "control")
let overview = controlApp.buttons.containing(.staticText, identifier: "Overview").firstMatch
XCTAssertTrue(overview.waitForExistence(timeout: 8))
initialDestination: "overview")
XCTAssertTrue(controlApp.staticTexts["Agent session"].waitForExistence(timeout: 8))
self.attachScreenshot(named: "live-gateway-control")
overview.tap()
XCTAssertTrue(controlApp.navigationBars.buttons["Control"].waitForExistence(timeout: 8))
try self.selectSidebarDestination("Overview")
XCTAssertTrue(controlApp.buttons["Gateway settings"].waitForExistence(timeout: 5))
self.attachScreenshot(named: "live-gateway-overview")
XCTAssertEqual(controlApp.state, .runningForeground)
@@ -856,9 +827,48 @@ final class OpenClawSnapshotUITests: XCTestCase {
XCTAssertEqual(XCTWaiter.wait(for: [expectation], timeout: 3), .completed)
}
private func controlDetailChatButton(above chatTab: XCUIElement) throws -> XCUIElement {
let buttons = try XCTUnwrap(self.app?.buttons.matching(NSPredicate(format: "label == 'Chat'")))
return try XCTUnwrap(buttons.allElementsBoundByIndex.first { $0.frame.maxY < chatTab.frame.minY })
private func selectSidebarDestination(
_ title: String,
file: StaticString = #filePath,
line: UInt = #line) throws
{
let app = try XCTUnwrap(self.app, file: file, line: line)
let hideSidebar = app.buttons["RootTabs.Sidebar.Hide"]
if !hideSidebar.exists {
let showSidebar = app.buttons["RootTabs.Sidebar.Show"]
XCTAssertTrue(showSidebar.waitForExistence(timeout: 5), file: file, line: line)
showSidebar.tap()
XCTAssertTrue(hideSidebar.waitForExistence(timeout: 5), file: file, line: line)
}
let destination = app.buttons[title]
XCTAssertTrue(destination.waitForExistence(timeout: 5), file: file, line: line)
destination.tap()
XCTAssertTrue(hideSidebar.waitForNonExistence(timeout: 5), file: file, line: line)
XCTAssertTrue(app.buttons["RootTabs.Sidebar.Show"].waitForExistence(timeout: 5), file: file, line: line)
}
private func startNewChatFromSidebar(
file: StaticString = #filePath,
line: UInt = #line) throws
{
let app = try XCTUnwrap(self.app, file: file, line: line)
let hideSidebar = app.buttons["RootTabs.Sidebar.Hide"]
if !hideSidebar.exists {
let showSidebar = app.buttons["RootTabs.Sidebar.Show"]
XCTAssertTrue(showSidebar.waitForExistence(timeout: 5), file: file, line: line)
showSidebar.tap()
XCTAssertTrue(hideSidebar.waitForExistence(timeout: 5), file: file, line: line)
}
let newChat = app.buttons["New Chat"]
XCTAssertTrue(newChat.waitForExistence(timeout: 5), file: file, line: line)
XCTAssertTrue(newChat.isEnabled, file: file, line: line)
newChat.tap()
XCTAssertTrue(hideSidebar.waitForNonExistence(timeout: 5), file: file, line: line)
XCTAssertTrue(app.buttons["RootTabs.Sidebar.Show"].waitForExistence(timeout: 5), file: file, line: line)
}
private func launchPairedLiveGatewayApp(
@@ -2,6 +2,12 @@
import AppKit
import SwiftUI
extension ChatSessionSidebarModel.Node {
fileprivate var outlineChildren: [Self]? {
self.children.isEmpty ? nil : self.children
}
}
@MainActor
struct ChatSessionSidebar: View {
@Bindable var viewModel: OpenClawChatViewModel
@@ -222,7 +228,9 @@ struct ChatSessionSidebar: View {
let isCurrentSession = self.viewModel.matchesCurrentSessionKey(
incoming: node.session.key,
current: self.viewModel.sessionKey)
if node.hasUnreadDescendant || (node.session.unread == true && !isCurrentSession) {
if node.children.contains(where: \.badges.hasUnread) ||
(node.session.unread == true && !isCurrentSession)
{
Circle()
.fill(.tint)
.frame(width: 7, height: 7)
@@ -1,55 +1,46 @@
import Foundation
/// Pure grouping/filtering for the macOS sessions sidebar. Kept UI-free so the
/// pin/search/ordering rules stay unit-testable.
enum ChatSessionSidebarModel {
struct Badges: Equatable {
let runningCount: Int
let failedCount: Int
let hasUnread: Bool
/// Pure grouping/filtering shared by the Apple sessions sidebars. Kept UI-free
/// so pin/search/ordering rules stay unit-testable across macOS and iOS.
public enum ChatSessionSidebarModel {
public struct Badges: Equatable, Sendable {
public let runningCount: Int
public let failedCount: Int
public let hasUnread: Bool
}
struct Node: Identifiable, Equatable {
let session: OpenClawChatSessionEntry
let children: [Node]
let badges: Badges
public struct Node: Identifiable, Equatable, Sendable {
public let session: OpenClawChatSessionEntry
public let children: [Node]
public let badges: Badges
var id: String {
public var id: String {
self.session.key
}
var outlineChildren: [Node]? {
self.children.isEmpty ? nil : self.children
}
var hasUnreadDescendant: Bool {
self.children.contains { $0.badges.hasUnread }
}
}
struct Section: Identifiable, Equatable {
let id: String
let title: String?
let nodes: [Node]
var sessions: [OpenClawChatSessionEntry] {
self.nodes.map(\.session)
}
public struct Section: Identifiable, Equatable, Sendable {
public let id: String
public let title: String?
public let nodes: [Node]
}
static func isHiddenInternalSession(_ key: String) -> Bool {
public static func isHiddenInternalSession(_ key: String) -> Bool {
let trimmed = key.trimmingCharacters(in: .whitespacesAndNewlines)
guard !trimmed.isEmpty else { return false }
return trimmed == "onboarding" || trimmed.hasSuffix(":onboarding")
}
/// `excludesMainSession` is for sidebars with a dedicated Home row (iOS);
/// the macOS sidebar keeps the main session inside its sections.
@MainActor
static func sections(
public static func sections(
sessions: [OpenClawChatSessionEntry],
currentSessionKey: String,
mainSessionKey: String = "main",
activeAgentID: String? = nil,
groups: [OpenClawChatSessionGroup] = [],
excludesMainSession: Bool = false,
query: String) -> [Section]
{
let visible = self.visibleSessions(
@@ -57,6 +48,7 @@ enum ChatSessionSidebarModel {
currentSessionKey: currentSessionKey,
mainSessionKey: mainSessionKey,
activeAgentID: activeAgentID,
excludesMainSession: excludesMainSession,
query: query)
// Pin state owns first placement. Group sections then preserve the
// same tree builder, so grouped parent/child rosters still nest.
@@ -182,7 +174,7 @@ enum ChatSessionSidebarModel {
return trimmed?.isEmpty == false ? trimmed : nil
}
static func displayName(for session: OpenClawChatSessionEntry) -> String {
public static func displayName(for session: OpenClawChatSessionEntry) -> String {
for candidate in [session.displayName, session.label] {
if let trimmed = candidate?.trimmingCharacters(in: .whitespacesAndNewlines),
!trimmed.isEmpty
@@ -193,13 +185,25 @@ enum ChatSessionSidebarModel {
return self.displayName(forKey: session.key)
}
static func canDeleteSession(key: String, mainSessionKey: String) -> Bool {
/// Compact "repo \u{2387} branch" line for worktree/work sessions; mirrors the
/// web sidebar row subtitle (ui/src/lib/session-display.ts).
public static func workSubtitle(for session: OpenClawChatSessionEntry) -> String? {
let repoRoot = session.worktree?.repoRoot?.trimmingCharacters(in: .whitespacesAndNewlines)
let branch = session.worktree?.branch?.trimmingCharacters(in: .whitespacesAndNewlines)
let repoName = repoRoot?.split(separator: "/").last.map(String.init)
let shortBranch = branch.map { $0.hasPrefix("openclaw/") ? String($0.dropFirst("openclaw/".count)) : $0 }
guard let repoName, !repoName.isEmpty else { return nil }
guard let shortBranch, !shortBranch.isEmpty else { return repoName }
return "\(repoName) \u{2387} \(shortBranch)"
}
public static func canDeleteSession(key: String, mainSessionKey: String) -> Bool {
let normalized = key.trimmingCharacters(in: .whitespacesAndNewlines).lowercased()
let normalizedMain = mainSessionKey.trimmingCharacters(in: .whitespacesAndNewlines).lowercased()
return normalized != "main" && normalized != "global" && normalized != normalizedMain
}
static func canArchiveSession(
public static func canArchiveSession(
_ session: OpenClawChatSessionEntry,
mainSessionKey: String) -> Bool
{
@@ -210,8 +214,16 @@ enum ChatSessionSidebarModel {
status != "running"
}
static func isSessionInActiveAgentScope(key: String, activeAgentID: String?) -> Bool {
let normalizedAgent = activeAgentID?.trimmingCharacters(in: .whitespacesAndNewlines).lowercased() ?? ""
guard !normalizedAgent.isEmpty else { return true }
let parts = key.split(separator: ":", maxSplits: 2, omittingEmptySubsequences: false)
guard parts.count == 3, parts[0].lowercased() == "agent" else { return true }
return parts[1].lowercased() == normalizedAgent
}
@MainActor
static func selectedSessionKey(
public static func selectedSessionKey(
sessions: [OpenClawChatSessionEntry],
currentSessionKey: String,
mainSessionKey: String,
@@ -248,7 +260,7 @@ enum ChatSessionSidebarModel {
/// Session keys read as routing ids ("agent:main:main"); show the human
/// part and keep the owning agent as a suffix only when it disambiguates.
static func displayName(forKey key: String) -> String {
public static func displayName(forKey key: String) -> String {
let trimmed = key.trimmingCharacters(in: .whitespacesAndNewlines)
let parts = trimmed.split(separator: ":", maxSplits: 2, omittingEmptySubsequences: false)
guard parts.count == 3, parts[0] == "agent" else {
@@ -266,24 +278,44 @@ enum ChatSessionSidebarModel {
currentSessionKey: String,
mainSessionKey: String,
activeAgentID: String?,
excludesMainSession: Bool,
query: String) -> [OpenClawChatSessionEntry]
{
let scopedSessions = sessions.filter {
self.isSessionInActiveAgentScope(key: $0.key, activeAgentID: activeAgentID)
}
let selectedSessionKey = self.selectedSessionKey(
sessions: sessions,
sessions: scopedSessions,
currentSessionKey: currentSessionKey,
mainSessionKey: mainSessionKey,
activeAgentID: activeAgentID)
let resolvedMainSessionKey = self.selectedSessionKey(
sessions: scopedSessions,
currentSessionKey: "main",
mainSessionKey: mainSessionKey,
activeAgentID: activeAgentID)
let normalizedCurrent = currentSessionKey.trimmingCharacters(in: .whitespacesAndNewlines).lowercased()
let selectedIsResolvedAlias = (normalizedCurrent == "main" || normalizedCurrent == "global") &&
selectedSessionKey.lowercased() != normalizedCurrent
var entries = sessions.filter { entry in
let selectedIsMain = normalizedCurrent == "main" ||
selectedSessionKey.caseInsensitiveCompare(resolvedMainSessionKey) == .orderedSame
var entries = scopedSessions.filter { entry in
if excludesMainSession,
entry.key.caseInsensitiveCompare(resolvedMainSessionKey) == .orderedSame
{
// Home owns the main row. Removing it before tree construction
// naturally promotes any retained child rows to section roots.
return false
}
if selectedIsResolvedAlias, entry.key.lowercased() == normalizedCurrent {
return false
}
return entry.key == selectedSessionKey ||
(!self.isHiddenInternalSession(entry.key) && entry.archived != true)
}
if !entries.contains(where: { $0.key == selectedSessionKey }),
if !(excludesMainSession && selectedIsMain),
!entries.contains(where: { $0.key == selectedSessionKey }),
self.isSessionInActiveAgentScope(key: selectedSessionKey, activeAgentID: activeAgentID),
!currentSessionKey.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty
{
// Sessions can lag behind a fresh switch/new-session; keep the
@@ -240,6 +240,12 @@ public struct OpenClawChatSessionWorktree: Codable, Sendable, Hashable {
public let id: String?
public let branch: String?
public let repoRoot: String?
public init(id: String?, branch: String?, repoRoot: String?) {
self.id = id
self.branch = branch
self.repoRoot = repoRoot
}
}
public struct OpenClawChatAgentRuntime: Codable, Sendable, Hashable {
@@ -255,6 +261,11 @@ public struct OpenClawChatSessionGroup: Codable, Identifiable, Sendable, Hashabl
public let name: String
public let position: Int
public init(name: String, position: Int) {
self.name = name
self.position = position
}
}
public struct OpenClawChatSessionGroupsResponse: Codable, Sendable, Equatable {
@@ -62,8 +62,8 @@ struct ChatSessionSidebarModelTests {
query: "")
#expect(sections.map(\.id) == ["pinned", "recent"])
#expect(sections[0].sessions.map(\.key) == ["b"])
#expect(sections[1].sessions.map(\.key) == ["c", "a"])
#expect(sections[0].nodes.map(\.session.key) == ["b"])
#expect(sections[1].nodes.map(\.session.key) == ["c", "a"])
#expect(sections[1].title == "Recent")
}
@@ -106,8 +106,8 @@ struct ChatSessionSidebarModelTests {
query: "")
#expect(sections.map(\.id) == ["group:Projects", "recent"])
#expect(sections[0].sessions.map(\.key) == ["exact"])
#expect(Set(sections[1].sessions.map(\.key)) == Set(["case", "spaces"]))
#expect(sections[0].nodes.map(\.session.key) == ["exact"])
#expect(Set(sections[1].nodes.map(\.session.key)) == Set(["case", "spaces"]))
}
@Test func `pinned descendants move to pinned section independently`() {
@@ -134,7 +134,9 @@ struct ChatSessionSidebarModelTests {
currentSessionKey: "main",
query: "")
#expect(sections.flatMap(\.sessions).map(\.key) == ["main"])
// Default (macOS) sections keep the main row; only Home-row sidebars
// opt into excludesMainSession.
#expect(sections.flatMap(\.nodes).map(\.session.key) == ["main"])
}
@Test func `active session gets a placeholder row before lists load`() {
@@ -143,7 +145,7 @@ struct ChatSessionSidebarModelTests {
currentSessionKey: "agent:main:main",
query: "")
#expect(sections.flatMap(\.sessions).map(\.key) == ["agent:main:main"])
#expect(sections.flatMap(\.nodes).map(\.session.key) == ["agent:main:main"])
}
@Test func `main aliases select the resolved row without adding a placeholder`() {
@@ -153,9 +155,10 @@ struct ChatSessionSidebarModelTests {
currentSessionKey: "main",
mainSessionKey: "agent:default:main",
activeAgentID: "default",
excludesMainSession: true,
query: "")
#expect(sections.flatMap(\.sessions).map(\.key) == ["agent:default:main"])
#expect(sections.flatMap(\.nodes).isEmpty)
#expect(ChatSessionSidebarModel.selectedSessionKey(
sessions: sessions,
currentSessionKey: "main",
@@ -163,6 +166,53 @@ struct ChatSessionSidebarModelTests {
activeAgentID: "default") == "agent:default:main")
}
@Test func `agent scope keeps active agent and unprefixed sessions`() {
let sections = ChatSessionSidebarModel.sections(
sessions: [
self.entry(key: "agent:ops:main", updatedAt: 400),
self.entry(key: "agent:ops:deploy", updatedAt: 300),
self.entry(key: "agent:other:private", updatedAt: 200),
self.entry(key: "global-tool", updatedAt: 100),
],
currentSessionKey: "main",
mainSessionKey: "agent:ops:main",
activeAgentID: "ops",
excludesMainSession: true,
query: "")
#expect(sections.flatMap(\.nodes).map(\.session.key) == ["agent:ops:deploy", "global-tool"])
#expect(ChatSessionSidebarModel.isSessionInActiveAgentScope(
key: "agent:OPS:deploy",
activeAgentID: "ops"))
#expect(!ChatSessionSidebarModel.isSessionInActiveAgentScope(
key: "agent:other:private",
activeAgentID: "ops"))
#expect(ChatSessionSidebarModel.isSessionInActiveAgentScope(
key: "global-tool",
activeAgentID: "ops"))
}
@Test func `main row is excluded while its children are promoted`() {
let sections = ChatSessionSidebarModel.sections(
sessions: [
self.entry(
key: "agent:ops:main",
updatedAt: 300,
childSessions: ["agent:ops:child"]),
self.entry(
key: "agent:ops:child",
updatedAt: 200,
parentSessionKey: "agent:ops:main"),
],
currentSessionKey: "main",
mainSessionKey: "agent:ops:main",
activeAgentID: "ops",
excludesMainSession: true,
query: "")
#expect(sections.flatMap(\.nodes).map(\.session.key) == ["agent:ops:child"])
}
@Test func `global aliases select their agent wrapped row`() {
let sessions = [
self.entry(key: "global", updatedAt: 200),
@@ -180,7 +230,7 @@ struct ChatSessionSidebarModelTests {
currentSessionKey: "global",
mainSessionKey: "agent:main:main",
activeAgentID: "ops") == "agent:ops:global")
#expect(sections.flatMap(\.sessions).map(\.key) == ["agent:ops:global"])
#expect(sections.flatMap(\.nodes).map(\.session.key) == ["agent:ops:global"])
}
@Test func `query filters on display name and key`() {
@@ -192,7 +242,7 @@ struct ChatSessionSidebarModelTests {
currentSessionKey: "agent:main:main",
query: "research")
#expect(sections.flatMap(\.sessions).map(\.key) == ["agent:main:research"])
#expect(sections.flatMap(\.nodes).map(\.session.key) == ["agent:main:research"])
}
@Test func `session keys render as human names`() {
@@ -316,7 +366,7 @@ struct ChatSessionSidebarModelTests {
#expect(nodes[0].children.map(\.id) == ["child"])
#expect(nodes[0].children[0].children.map(\.id) == ["grandchild"])
#expect(nodes[0].badges == .init(runningCount: 1, failedCount: 1, hasUnread: true))
#expect(nodes[0].hasUnreadDescendant)
#expect(nodes[0].children.contains { $0.badges.hasUnread })
}
@Test func `tree breaks cycles without dropping or duplicating sessions`() {