feat(control-ui): drag sessions into split view with animated drop preview (#101191)

* feat(control-ui): drag sessions into split view with animated drop preview

* fix(i18n): translate split drop labels and pending upstream strings
This commit is contained in:
Peter Steinberger
2026-07-07 03:30:46 +01:00
committed by GitHub
parent 6273e82ca5
commit 6a5726b808
69 changed files with 853 additions and 143 deletions
+1
View File
@@ -246,6 +246,7 @@ The terminal is also available as a full-screen, terminal-only document at `/?vi
- Consecutive duplicate text-only messages render as one bubble with a count badge. Messages that carry images, attachments, tool output, or canvas previews are left uncollapsed.
- The chat header model and thinking pickers patch the active session immediately through `sessions.patch`; they are persistent session overrides, not one-turn-only send options.
- **Split view:** open it from the composer controls, then split any pane right or down for as many panes as fit. Each pane has its own session, transcript, composer, and tool stream.
- Drag a session from the sidebar into chat to open it in a pane. An animated drop preview glides between zones and labels the outcome — "Split" over the exact half a new pane will occupy, "Open here" over a whole pane — and drops also work from single-pane mode.
- The active split pane drives the sidebar selection and URL. Dividers resize columns and stacked panes, and the browser stores the layout locally across reloads.
- On narrow screens, split view keeps the layout but renders only the active pane; its pane header still provides session switching and close controls.
- If you send a message while a model picker change for the same session is still saving, the composer waits for that session patch before calling `chat.send` so the send uses the selected model.
+24
View File
@@ -37,11 +37,18 @@ import {
renameSessionGroup,
saveStoredSessionCustomGroups,
} from "../lib/sessions/custom-groups.ts";
<<<<<<< HEAD
import {
groupSidebarSessionRows,
normalizeSidebarSessionsGrouping,
type SidebarSessionsGrouping,
} from "../lib/sessions/grouping.ts";
||||||| parent of 34789c2eac0 (feat(control-ui): drag sessions into split view with animated drop preview)
import { groupSidebarSessionRows } from "../lib/sessions/grouping.ts";
=======
import { writeSessionDragData } from "../lib/sessions/drag.ts";
import { groupSidebarSessionRows } from "../lib/sessions/grouping.ts";
>>>>>>> 34789c2eac0 (feat(control-ui): drag sessions into split view with animated drop preview)
import {
compareSessionRowsByUpdatedAt,
resolveSessionNavigation,
@@ -148,7 +155,12 @@ export class AppSidebar extends LitElement {
@state() private customizeMenuPosition: { x: number; y: number } | null = null;
@state() private sessionMenu: SidebarSessionMenuState | null = null;
@state() private sessionGroupSubmenuOpen = false;
<<<<<<< HEAD
@state() private sessionGroupMenu: SidebarSessionGroupMenuState | null = null;
||||||| parent of 34789c2eac0 (feat(control-ui): drag sessions into split view with animated drop preview)
=======
@state() private draggingSessionKey: string | null = null;
>>>>>>> 34789c2eac0 (feat(control-ui): drag sessions into split view with animated drop preview)
@state() private sessionSortMode: SidebarSessionSortMode = "created";
@state() private sessionsGrouping: SidebarSessionsGrouping = loadStoredSidebarSessionsGrouping();
@state() private sessionSortMenuPosition: { x: number; y: number } | null = null;
@@ -1207,6 +1219,7 @@ export class AppSidebar extends LitElement {
session.active ? "sidebar-recent-session--active" : "",
session.pinned ? "session-row-host--pinned" : "",
session.hasActiveRun ? "session-row-host--running" : "",
this.draggingSessionKey === session.key ? "sidebar-recent-session--dragging" : "",
]
.filter(Boolean)
.join(" ");
@@ -1214,6 +1227,16 @@ export class AppSidebar extends LitElement {
<div
class=${rowClass}
data-session-key=${session.key}
draggable="true"
@dragstart=${(event: DragEvent) => {
if (event.dataTransfer) {
writeSessionDragData(event.dataTransfer, session.key);
this.draggingSessionKey = session.key;
}
}}
@dragend=${() => {
this.draggingSessionKey = null;
}}
@contextmenu=${(event: MouseEvent) => {
event.preventDefault();
this.openSessionMenu(session, event.clientX, event.clientY);
@@ -1224,6 +1247,7 @@ export class AppSidebar extends LitElement {
<a
href=${session.href}
class="sidebar-recent-session__link"
draggable="false"
title=${`${session.label} · ${session.key}`}
@click=${(event: MouseEvent) => {
if (!shouldHandleNavigationClick(event)) {
+4 -4
View File
@@ -1,11 +1,11 @@
{
"fallbackKeys": [],
"generatedAt": "2026-07-06T23:41:03.551Z",
"generatedAt": "2026-07-07T02:26:52.310Z",
"locale": "ar",
"model": "gpt-5.5",
"provider": "openai",
"sourceHash": "ff787c22bac9fbc29702f49e4a9062521d338fed4c8a2b97fec21bf52ee0892e",
"totalKeys": 1666,
"translatedKeys": 1666,
"sourceHash": "378b4e5380384a33d9e31a49a5483cdb991245705193e067d5fb8c5311bc20fb",
"totalKeys": 1668,
"translatedKeys": 1668,
"workflow": 1
}
+2
View File
@@ -51,6 +51,7 @@
{"cache_key":"4de60b635c8d318ef96812b307db0266b5a0b974433b3a475da7058c642d50c1","model":"gpt-5.5","provider":"openai","segment_id":"tabs.worktrees","source_path":"ui/src/i18n/locales/ar.ts","src_lang":"en","text":"Worktrees","text_hash":"aec2f93d67b7c4c5fd9b94042f33299f7a0e55cdcb7e8e35feb9d0f6da697f3d","tgt_lang":"ar","translated":"مساحات العمل","updated_at":"2026-07-05T21:01:06.223Z"}
{"cache_key":"4f59bc6df25e2495ede201a5cd831658d42000f5f645df19553afc9be514e0b2","model":"gpt-5.5","provider":"openai","segment_id":"sessionsView.archiveSession","source_path":"ui/src/i18n/locales/ar.ts","src_lang":"en","text":"Archive session","text_hash":"740ded37480365eae8bf833ccaaa58350fc9434a77b7bb65b5516eba476fbec3","tgt_lang":"ar","translated":"أرشفة الجلسة","updated_at":"2026-07-02T14:30:22.962Z"}
{"cache_key":"4f5df68126b4a7506e392871313afb6007b65be723d33e6f1dd1c395d43635c7","model":"gpt-5.5","provider":"openai","segment_id":"chat.composer.contextUsage.contextWindow","source_path":"ui/src/i18n/locales/ar.ts","src_lang":"en","text":"Context window","text_hash":"7696d0855331622dc12438057f5509348f9d6f0ec2eb3580e18a99d31eba86db","tgt_lang":"ar","translated":"نافذة السياق","updated_at":"2026-07-05T10:16:14.365Z"}
{"cache_key":"51c230ab687ba027ff013718b13ce69541910ed472bd5a11f23a58bcc61c3fba","model":"gpt-5.5","provider":"openai","segment_id":"chat.splitView.dropSplit","source_path":"ui/src/i18n/locales/ar.ts","src_lang":"en","text":"Split","text_hash":"32afaa784333648025e24b162bece7474051bcaaa29e98e19922b400b4ceb04b","tgt_lang":"ar","translated":"تقسيم","updated_at":"2026-07-06T22:56:27.100Z"}
{"cache_key":"541a93bf518e064a9d0a79ea654c4cd71be771dd6471b4ec3c8fd33041577938","model":"gpt-5.5","provider":"openai","segment_id":"chat.composer.microphoneAccessFailed","source_path":"ui/src/i18n/locales/ar.ts","src_lang":"en","text":"Unable to access microphone inputs.","text_hash":"5125ca209d6d3c763713490ec0de3a44db42aeab03cb21dcf4b047a1a4970669","tgt_lang":"ar","translated":"تعذّر الوصول إلى مدخلات الميكروفون.","updated_at":"2026-07-06T17:56:46.696Z"}
{"cache_key":"56d2b9f7ed6b2bcefdfae9336946b14a96da27c781baf9d405b7100ab4930169","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.detailUpdated","source_path":"ui/src/i18n/locales/ar.ts","src_lang":"en","text":"Updated","text_hash":"3a5ecca188c0579c00ee24cf3cab21bd02c15a06f7a70cc8e0a8ff2381dcbbfd","tgt_lang":"ar","translated":"آخر تحديث","updated_at":"2026-06-16T14:15:27.039Z"}
{"cache_key":"571f1918b7f3976555081141e7c5e24cb588d8f0eca873af458c47400334f664","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.workspaceFiles.search","source_path":"ui/src/i18n/locales/ar.ts","src_lang":"en","text":"Search files","text_hash":"179fed85ec50a433bb23932745d18f1ade2f84a6ebe145b0025ed3ce5f89fd5a","tgt_lang":"ar","translated":"البحث في الملفات","updated_at":"2026-06-16T14:15:41.761Z"}
@@ -141,6 +142,7 @@
{"cache_key":"a966b482a7ef4d2125ca664a5d0c51a73b26c3bec8241a49471e6c2cbb5edf51","model":"gpt-5.5","provider":"openai","segment_id":"sessionsView.deleteGroupConfirm","source_path":"ui/src/i18n/locales/ar.ts","src_lang":"en","text":"Delete group \"{group}\"? Its sessions move to Ungrouped.","text_hash":"8efc8cb301bca2d82627c05eb36558e603c1b1ad0d58a2bd6584aa1c3a01c710","tgt_lang":"ar","translated":"حذف المجموعة \"{group}\"؟ ستُنقل جلساتها إلى غير مصنفة.","updated_at":"2026-07-06T23:41:03.547Z"}
{"cache_key":"ac81d0f4da372a1dfec5bc4eb1ee59c19b725019bb6bd6bde56033a0b19bd0cb","model":"gpt-5.5","provider":"openai","segment_id":"connection.lostTitle","source_path":"ui/src/i18n/locales/ar.ts","src_lang":"en","text":"Gateway connection lost","text_hash":"ec6cd265976239ff6fc4f227bb25e8e6286fe38c3d1c64326dcdbb76c28b515e","tgt_lang":"ar","translated":"فُقد الاتصال بـ Gateway","updated_at":"2026-07-05T21:55:35.324Z"}
{"cache_key":"ad347383ad8b4c8e1a1ee03b01dbacfbf7aecd8fdbad6c330572a8c2d8178b9c","model":"gpt-5.5","provider":"openai","segment_id":"chat.composer.microphoneListUnsupported","source_path":"ui/src/i18n/locales/ar.ts","src_lang":"en","text":"This browser cannot list microphone inputs.","text_hash":"fa99f66cc346509afe8c5e3437ad299409a60be69d8b2b70138d8c42176052d9","tgt_lang":"ar","translated":"لا يمكن لهذا المتصفح عرض مدخلات الميكروفون.","updated_at":"2026-07-06T17:56:46.696Z"}
{"cache_key":"afa5a9edc17af85b1208a48df54da9be84e951b058067504ebbdce7fa8b539a2","model":"gpt-5.5","provider":"openai","segment_id":"chat.splitView.dropOpenHere","source_path":"ui/src/i18n/locales/ar.ts","src_lang":"en","text":"Open here","text_hash":"b08e2fd2e872adcb575b305187b9db8482369325806953ce80190fc2dc1ab9fb","tgt_lang":"ar","translated":"افتح هنا","updated_at":"2026-07-06T22:56:27.100Z"}
{"cache_key":"b0475f9cbf7b5f2f0fbd766e3d999ff95a64591f2d1eda580fb23bfaa75d8548","model":"gpt-5.5","provider":"openai","segment_id":"chat.splitView.closePane","source_path":"ui/src/i18n/locales/ar.ts","src_lang":"en","text":"Close pane","text_hash":"7fa0f9613d919e167b0f9aa03c22809d446af293eb6c3bac6866bae66d2656c9","tgt_lang":"ar","translated":"إغلاق الجزء","updated_at":"2026-07-06T07:23:44.872Z"}
{"cache_key":"b0b45f77a8a2f9de94ffd0d0a299b834fc8f69ce291878ed6471e1abe86fcd8c","model":"gpt-5.5","provider":"openai","segment_id":"sessionsView.ungrouped","source_path":"ui/src/i18n/locales/ar.ts","src_lang":"en","text":"Ungrouped","text_hash":"674b38cae72bb0c8be97cea114f7ce84a6ad4ae3c7f3ceb0c869d62db8e53fa2","tgt_lang":"ar","translated":"غير مجمّع","updated_at":"2026-07-05T14:39:56.977Z"}
{"cache_key":"b0fe8a7e77db10bf497226f711f15db25b4c0ecc915174c2250999c582a349cf","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.workspaceFiles.browser","source_path":"ui/src/i18n/locales/ar.ts","src_lang":"en","text":"Project files","text_hash":"2a3d9a240c9206964ee7237a1d99fda05ed501a485262e18f33c446c9f735d1c","tgt_lang":"ar","translated":"ملفات المشروع","updated_at":"2026-06-16T14:15:41.761Z"}
+4 -4
View File
@@ -1,11 +1,11 @@
{
"fallbackKeys": [],
"generatedAt": "2026-07-06T23:40:48.843Z",
"generatedAt": "2026-07-07T02:26:51.577Z",
"locale": "de",
"model": "gpt-5.5",
"provider": "openai",
"sourceHash": "ff787c22bac9fbc29702f49e4a9062521d338fed4c8a2b97fec21bf52ee0892e",
"totalKeys": 1666,
"translatedKeys": 1666,
"sourceHash": "378b4e5380384a33d9e31a49a5483cdb991245705193e067d5fb8c5311bc20fb",
"totalKeys": 1668,
"translatedKeys": 1668,
"workflow": 1
}
+2
View File
@@ -82,6 +82,7 @@
{"cache_key":"595a2bc0419491adf3174e4a49cb1303005277ea35e7a5eccd1035ff8f55be0d","model":"gpt-5.5","provider":"openai","segment_id":"sessionsView.renameSessionPrompt","source_path":"ui/src/i18n/locales/de.ts","src_lang":"en","text":"Rename session","text_hash":"2cad0766accc2d3f70f007068524cea983e0d53f54543e9e82a4e73b2a07987f","tgt_lang":"de","translated":"Sitzung umbenennen","updated_at":"2026-07-02T14:30:04.036Z"}
{"cache_key":"59a3e874dc9b1299daf4a2644ec2659a6e9c50587c91ac357f24215c16b94169","model":"claude-opus-4-8","provider":"anthropic","segment_id":"cron.jobDetail.cwd","source_path":"ui/src/i18n/locales/de.ts","src_lang":"en","text":"CWD","text_hash":"0217f1cb7725737f15a6710df3bcfa3bc10a239f0f7801ec3d7168e675f5ebd6","tgt_lang":"de","translated":"CWD","updated_at":"2026-06-16T14:13:08.672Z"}
{"cache_key":"5b0ab59138fd65f7f3a236db3c04458d74c99539c8ab736086c9637395c06d55","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.workspaceFiles.expand","source_path":"ui/src/i18n/locales/de.ts","src_lang":"en","text":"Expand session workspace","text_hash":"ac1d210db40c5026879774849ad74a9e1247523192a795ac33965b3ee72691c2","tgt_lang":"de","translated":"Sitzungsarbeitsbereich aufklappen","updated_at":"2026-06-16T14:12:59.821Z"}
{"cache_key":"5ececc63e9826d838193ef14ce70f2a3205483bc21dcc131e08a9f399fd7e1a3","model":"gpt-5.5","provider":"openai","segment_id":"chat.splitView.dropOpenHere","source_path":"ui/src/i18n/locales/de.ts","src_lang":"en","text":"Open here","text_hash":"b08e2fd2e872adcb575b305187b9db8482369325806953ce80190fc2dc1ab9fb","tgt_lang":"de","translated":"Hier öffnen","updated_at":"2026-07-06T22:56:17.559Z"}
{"cache_key":"5f1f2104d573498016492a32bf5bab9cda32beb4b00961488f01579a0acf6ead","model":"gpt-5","provider":"openai","segment_id":"usage.costWindows.lastDays","source_path":"ui/src/i18n/locales/de.ts","src_lang":"en","text":"Last {count} days","text_hash":"4aa456a0fa9b73dcc14766740b19fc52c452950ccb7bc892499c3c29a4122162","tgt_lang":"de","translated":"Letzte {count} Tage","updated_at":"2026-07-05T20:24:32.108Z"}
{"cache_key":"5f60d04e50be0e22c14d761f808667c2dfd5623e67247c367c1d280613bcffca","model":"gpt-5.5","provider":"openai","segment_id":"workboard.badgeWorkerLogs","source_path":"ui/src/i18n/locales/de.ts","src_lang":"en","text":"{count} worker logs","text_hash":"2923e2a84e6ed0ca048d280206198b156da6148859e474498d335a44e323e0a8","tgt_lang":"de","translated":"{count} Worker-Protokolle","updated_at":"2026-05-30T15:38:11.508Z"}
{"cache_key":"619a6d19fa8353908ccc6666ae1fb62f5fba13a7b58ab0e6416c0114477d067f","model":"gpt-5","provider":"openai","segment_id":"usage.costWindows.selectedRange","source_path":"ui/src/i18n/locales/de.ts","src_lang":"en","text":"Selected Range","text_hash":"95917ae71066a19c266cd4530068f4bf775ed2401951ebf37ab0c91daa1a67d3","tgt_lang":"de","translated":"Ausgewählter Zeitraum","updated_at":"2026-07-05T20:24:32.108Z"}
@@ -109,6 +110,7 @@
{"cache_key":"7396a5b4343048cfb536321f308d573c700d794397c1f253106b1af5f070fcba","model":"gpt-5","provider":"openai","segment_id":"usage.costWindows.title","source_path":"ui/src/i18n/locales/de.ts","src_lang":"en","text":"Cost Windows","text_hash":"d085ca9b7dffb14e13dd359e697260f29a1201cc065356abc06b7e3ed3fafd64","tgt_lang":"de","translated":"Kostenzeiträume","updated_at":"2026-07-05T20:24:32.108Z"}
{"cache_key":"7431ce4c8c6fda32a44e65f3881f395281632b9c2af979b87d2326db8b9b7a5c","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.detailAutomationWorkspace","source_path":"ui/src/i18n/locales/de.ts","src_lang":"en","text":"Workspace: {workspace}","text_hash":"17f5e696e557a646a9003fc8448f6f6761f5fe6bdf7478f750f471496e87c17b","tgt_lang":"de","translated":"Workspace: {workspace}","updated_at":"2026-06-16T14:12:53.111Z"}
{"cache_key":"75507443ba20151f010fb8087682336e30d411531b090a32c6e45685756c0576","model":"gpt-5","provider":"openai","segment_id":"usage.costWindows.subtitle","source_path":"ui/src/i18n/locales/de.ts","src_lang":"en","text":"Calendar windows ending {date}","text_hash":"f01adb920b86724f393ee7bca5ea4a90bd5a777d39f6191ed9c13530ceb7851d","tgt_lang":"de","translated":"Kalenderzeiträume bis {date}","updated_at":"2026-07-05T20:24:32.108Z"}
{"cache_key":"79e67b9e2ccc8d716f813154abf8bc817461f00ab8fc0daf3da7bab5a5ce1752","model":"gpt-5.5","provider":"openai","segment_id":"chat.splitView.dropSplit","source_path":"ui/src/i18n/locales/de.ts","src_lang":"en","text":"Split","text_hash":"32afaa784333648025e24b162bece7474051bcaaa29e98e19922b400b4ceb04b","tgt_lang":"de","translated":"Teilen","updated_at":"2026-07-06T22:56:17.559Z"}
{"cache_key":"7a8f93ecfc4045545dd27474b1163e402cea16c1f59237fd0da8f9799894c858","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.workspaceFiles.loading","source_path":"ui/src/i18n/locales/de.ts","src_lang":"en","text":"Loading session workspace…","text_hash":"bc6b2400fad20ee1d95d8de4ec6eef9ff1818ab080f86513384029519eaf4f4e","tgt_lang":"de","translated":"Sitzungsarbeitsbereich wird geladen…","updated_at":"2026-06-16T14:12:59.821Z"}
{"cache_key":"7a914bc3ff11171804b4dd619808328e0548527e3164a6bb9cb262496c687e98","model":"gpt-5.5","provider":"openai","segment_id":"sessionsView.dateThisWeek","source_path":"ui/src/i18n/locales/de.ts","src_lang":"en","text":"This week","text_hash":"8c4eef5ab2532515ef24a662db70f6e5b8063c7f924342b2a463f763f1091634","tgt_lang":"de","translated":"Diese Woche","updated_at":"2026-07-05T14:39:38.809Z"}
{"cache_key":"7b28f67720f0e5da93623c47a444ff0f232d241bfdeb8f0088c7ff7b42475153","model":"gpt-5.5","provider":"openai","segment_id":"chat.composer.microphonePermissionBlocked","source_path":"ui/src/i18n/locales/de.ts","src_lang":"en","text":"Microphone access is blocked. Allow it in browser site settings to list inputs.","text_hash":"707f9594b092cf816d6d7a74381665a74acfecbe32d859d0a4adac9e9c9ff77b","tgt_lang":"de","translated":"Der Mikrofonzugriff ist blockiert. Erlaube ihn in den Website-Einstellungen des Browsers, um Eingänge aufzulisten.","updated_at":"2026-07-06T17:56:14.727Z"}
+4 -4
View File
@@ -1,11 +1,11 @@
{
"fallbackKeys": [],
"generatedAt": "2026-07-06T23:40:50.936Z",
"generatedAt": "2026-07-07T02:26:51.695Z",
"locale": "es",
"model": "gpt-5.5",
"provider": "openai",
"sourceHash": "ff787c22bac9fbc29702f49e4a9062521d338fed4c8a2b97fec21bf52ee0892e",
"totalKeys": 1666,
"translatedKeys": 1666,
"sourceHash": "378b4e5380384a33d9e31a49a5483cdb991245705193e067d5fb8c5311bc20fb",
"totalKeys": 1668,
"translatedKeys": 1668,
"workflow": 1
}
+2
View File
@@ -85,6 +85,7 @@
{"cache_key":"5b84b909827f179e73a5b5c4684712492c397bdc35d50482ce1e2b270c5a7892","model":"gpt-5.5","provider":"openai","segment_id":"usage.providerUsage.lastDays","source_path":"ui/src/i18n/locales/es.ts","src_lang":"en","text":"{count} days","text_hash":"e9f0a85930cc6fa61b7ac01763893020adc4c712d1b8e8897bdd13971637d529","tgt_lang":"es","translated":"{count} días","updated_at":"2026-07-06T06:40:15.357Z"}
{"cache_key":"5d3b656957833268e13752ae570040470f719d92fc1d45948503ac0bf86e3eef","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.healthFailedAttempts","source_path":"ui/src/i18n/locales/es.ts","src_lang":"en","text":"failed attempts","text_hash":"fd9023af0795825a458100ddbe894a7a8f603324a2b7ad2305d4c9d2334cbd26","tgt_lang":"es","translated":"intentos fallidos","updated_at":"2026-06-17T14:14:13.986Z"}
{"cache_key":"5d964babaa27481505821df551bcaf5932e299b3b31235eeaecf692d6e67f776","model":"gpt-5.5","provider":"openai","segment_id":"sessionsView.ungrouped","source_path":"ui/src/i18n/locales/es.ts","src_lang":"en","text":"Ungrouped","text_hash":"674b38cae72bb0c8be97cea114f7ce84a6ad4ae3c7f3ceb0c869d62db8e53fa2","tgt_lang":"es","translated":"Sin agrupar","updated_at":"2026-07-05T14:39:41.363Z"}
{"cache_key":"5dca5fa9990e4ff6485c657fcf79d3f98e896854c281835664ed91bb6698f46b","model":"gpt-5.5","provider":"openai","segment_id":"chat.splitView.dropSplit","source_path":"ui/src/i18n/locales/es.ts","src_lang":"en","text":"Split","text_hash":"32afaa784333648025e24b162bece7474051bcaaa29e98e19922b400b4ceb04b","tgt_lang":"es","translated":"Dividir","updated_at":"2026-07-06T22:56:19.249Z"}
{"cache_key":"5fa5f353c2dd6b0a8085e1f7e44c161a8ce5765c6cfea51dd771218c6123ce2f","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.detailAutomationTenant","source_path":"ui/src/i18n/locales/es.ts","src_lang":"en","text":"Tenant: {tenant}","text_hash":"e896dc96a6847d7aaa593069e890e7a712fd60d7be60280ee24e1942e10411b0","tgt_lang":"es","translated":"Tenant: {tenant}","updated_at":"2026-06-16T14:14:11.215Z"}
{"cache_key":"60a8bfa89026989e6a4bc79e4b7094af5910881bf1b554adf36142e19535951a","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.autoRefresh5s","source_path":"ui/src/i18n/locales/es.ts","src_lang":"en","text":"5s","text_hash":"93e3d8c5b10657d2884f177488b689aadf82a83f962237cb602b3314386ab3b7","tgt_lang":"es","translated":"5s","updated_at":"2026-06-17T14:14:13.986Z"}
{"cache_key":"618a589f34990673e9d3eddf322bbd5d18841f3510743957f09b5c059b79f04e","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.detailUpdatedValue","source_path":"ui/src/i18n/locales/es.ts","src_lang":"en","text":"Updated: {time}","text_hash":"5e72d5445f018c9d08aa34ae0178fb9aa49eea6a0afd0c8d379f20b7af3e8aa0","tgt_lang":"es","translated":"Actualizado: {time}","updated_at":"2026-06-16T14:14:11.215Z"}
@@ -205,6 +206,7 @@
{"cache_key":"d85830d728eec1fab6b54921c31423f72103161e1e895ba13fc13f4d5a36040d","model":"gpt-5.5","provider":"openai","segment_id":"connection.lostTitle","source_path":"ui/src/i18n/locales/es.ts","src_lang":"en","text":"Gateway connection lost","text_hash":"ec6cd265976239ff6fc4f227bb25e8e6286fe38c3d1c64326dcdbb76c28b515e","tgt_lang":"es","translated":"Conexión con Gateway perdida","updated_at":"2026-07-05T21:55:14.304Z"}
{"cache_key":"d8c20e37a13a86954dcd60220a2da3f1db8e5ac108979eb780c3d29531ae940b","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.autoRefresh60s","source_path":"ui/src/i18n/locales/es.ts","src_lang":"en","text":"60s","text_hash":"f79f071ab5b033ca8fb42c077f39708930d194b18f4608eb26ac1d9665a8836f","tgt_lang":"es","translated":"60s","updated_at":"2026-06-17T14:14:13.986Z"}
{"cache_key":"dad83b2af9efdc98e72d1b9457c68e9e3e8b8748ab0afe07bed410995443e8c0","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.composer.talkMoreInSettings","source_path":"ui/src/i18n/locales/es.ts","src_lang":"en","text":"More in Settings","text_hash":"87f1e602d68bdc42ae3fddc0c1541d323adc718b7b9b3f889b2ca71823e319b9","tgt_lang":"es","translated":"Más en Configuración","updated_at":"2026-07-06T20:20:02.809Z"}
{"cache_key":"dbf7a646077822f407b2017df056ca85fe2f5dcc2df8eccc5cf6af61b47bf2b8","model":"gpt-5.5","provider":"openai","segment_id":"chat.splitView.dropOpenHere","source_path":"ui/src/i18n/locales/es.ts","src_lang":"en","text":"Open here","text_hash":"b08e2fd2e872adcb575b305187b9db8482369325806953ce80190fc2dc1ab9fb","tgt_lang":"es","translated":"Abrir aquí","updated_at":"2026-07-06T22:56:19.249Z"}
{"cache_key":"dc711ef2c2a02b8dd347cc128774fa21b697a587293589630bba05e2a9928a2f","model":"gpt-5.5","provider":"openai","segment_id":"chat.composer.microphoneBusy","source_path":"ui/src/i18n/locales/es.ts","src_lang":"en","text":"Microphone inputs are busy or unavailable to the browser.","text_hash":"9f33c30cb2370916f2edd079ad5cabab6a94dd185a89f4f7db357b4f31d1f3dd","tgt_lang":"es","translated":"Las entradas de micrófono están ocupadas o no están disponibles para el navegador.","updated_at":"2026-07-06T17:56:20.380Z"}
{"cache_key":"ddee0310ae22b896e63790dd27363c2fb84b6dbcd04f33dcdbe7d032b9e170d4","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.refreshError","source_path":"ui/src/i18n/locales/es.ts","src_lang":"en","text":"Refresh failed","text_hash":"8fa7e6d90bef4e5cb735233347bf6a71b5b30d96e7c1a50b73f10cb441b275c2","tgt_lang":"es","translated":"Error al actualizar","updated_at":"2026-06-17T14:14:13.986Z"}
{"cache_key":"e3d78817f4f01e6b7df5e7d4af14355d2043188b77d481a7633b82ba4a056dba","model":"gpt-5.5","provider":"openai","segment_id":"languages.ru","source_path":"ui/src/i18n/locales/es.ts","src_lang":"en","text":"Русский (Russian)","text_hash":"ea81bf0fd46410b501bddee074ab6f00b0cdf377a6cafe608dcf2c28f7cb2f4e","tgt_lang":"es","translated":"Русский (ruso)","updated_at":"2026-06-26T21:43:26.471Z"}
+4 -4
View File
@@ -1,11 +1,11 @@
{
"fallbackKeys": [],
"generatedAt": "2026-07-06T23:41:23.359Z",
"generatedAt": "2026-07-07T02:26:53.383Z",
"locale": "fa",
"model": "gpt-5.5",
"provider": "openai",
"sourceHash": "ff787c22bac9fbc29702f49e4a9062521d338fed4c8a2b97fec21bf52ee0892e",
"totalKeys": 1666,
"translatedKeys": 1666,
"sourceHash": "378b4e5380384a33d9e31a49a5483cdb991245705193e067d5fb8c5311bc20fb",
"totalKeys": 1668,
"translatedKeys": 1668,
"workflow": 1
}
+2
View File
@@ -11,6 +11,7 @@
{"cache_key":"10bb8c5bb20fbe0279094987b6b2a96ec76aec9d9531c1ee7109142129a55416","model":"gpt-5.5","provider":"openai","segment_id":"worktrees.restorable","source_path":"ui/src/i18n/locales/fa.ts","src_lang":"en","text":"Restorable","text_hash":"bc97d2ddd2dba3ab2391f21314316556111065c4b870bc05679fadd60a754c01","tgt_lang":"fa","translated":"قابل بازیابی","updated_at":"2026-07-05T21:01:42.282Z"}
{"cache_key":"113b0902e6bbde83fcd6d05027131c47415439d7dc9c52599d688ae23c7c94d3","model":"gpt-5.5","provider":"openai","segment_id":"sessionsView.archivedOnly","source_path":"ui/src/i18n/locales/fa.ts","src_lang":"en","text":"Archived only","text_hash":"da7ebd8c482f38dc2a5b693a0ec25aaa04ea7b5fa3713cce9fa41a28f2201a6b","tgt_lang":"fa","translated":"فقط بایگانی‌شده‌ها","updated_at":"2026-07-02T14:31:11.668Z"}
{"cache_key":"1167cc7da538df715e50c8e48d81c211e39137f01bb9c2553a3cae14faf4163f","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.workspaceFiles.search","source_path":"ui/src/i18n/locales/fa.ts","src_lang":"en","text":"Search files","text_hash":"179fed85ec50a433bb23932745d18f1ade2f84a6ebe145b0025ed3ce5f89fd5a","tgt_lang":"fa","translated":"جستجوی فایل‌ها","updated_at":"2026-06-16T14:18:48.730Z"}
{"cache_key":"132eb33a9e5b4a35a77d77a38256a9027f7d86208ae41a4c9eb806b2a921e151","model":"gpt-5.5","provider":"openai","segment_id":"chat.splitView.dropSplit","source_path":"ui/src/i18n/locales/fa.ts","src_lang":"en","text":"Split","text_hash":"32afaa784333648025e24b162bece7474051bcaaa29e98e19922b400b4ceb04b","tgt_lang":"fa","translated":"تقسیم","updated_at":"2026-07-06T22:56:40.069Z"}
{"cache_key":"14160078de1ee3ae94b667d248d532efd92386a5b90d43494d5848e014c5223b","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.agentFilterUnassigned","source_path":"ui/src/i18n/locales/fa.ts","src_lang":"en","text":"Unassigned (uses {agent})","text_hash":"2700af0c4ab5e86726f72a723ecdf50370b87690db35f00b83723d6457879c8e","tgt_lang":"fa","translated":"تخصیص‌نیافته (از {agent} استفاده می‌کند)","updated_at":"2026-06-17T14:17:45.318Z"}
{"cache_key":"141af5cbd195c30628ce0abc754dcf0295c13afb9fa5d5d48ca055bfaa04da26","model":"gpt-5.5","provider":"openai","segment_id":"worktrees.subtitle","source_path":"ui/src/i18n/locales/fa.ts","src_lang":"en","text":"Isolated repository checkouts owned by OpenClaw.","text_hash":"6a3984ca864c9188fa8c05e732f6831b501b4caed6bd61b60e48e9b0cf74bd0c","tgt_lang":"fa","translated":"checkoutهای ایزولهٔ مخزن که متعلق به OpenClaw هستند.","updated_at":"2026-07-05T21:01:42.282Z"}
{"cache_key":"1738c6f38084a9682b2810ea3320e5e0660e194b508a383fac0e4810c30f1c82","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.viewPresetCount","source_path":"ui/src/i18n/locales/fa.ts","src_lang":"en","text":"{count} cards","text_hash":"4b3e5442ebd2f839d45fddf95b2c2a18427dbd6ac06c8b57f9d9e996dcb73607","tgt_lang":"fa","translated":"{count} کارت","updated_at":"2026-06-17T14:17:45.319Z"}
@@ -19,6 +20,7 @@
{"cache_key":"1924d681d5364c4a38b5ee7c5acc960841cfbedffdb14456778e58aa596aaae7","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.composer.talkVoice","source_path":"ui/src/i18n/locales/fa.ts","src_lang":"en","text":"Voice","text_hash":"87bf2bc08589f0bd4a078db145c34ad5e14b8fda53c3ae65b78601294913df95","tgt_lang":"fa","translated":"صدا","updated_at":"2026-07-06T20:20:02.809Z"}
{"cache_key":"196b631e1aa644da1a172721644d1fde9ba7fde80373610df4398549c87a5721","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.pairingQrExpired.title","source_path":"ui/src/i18n/locales/fa.ts","src_lang":"en","text":"Pairing QR expired","text_hash":"74e09eafc1d35cad5b62b7a9c321a4d090bb8fefdfa8b33913d6194186eadda6","tgt_lang":"fa","translated":"کد QR جفت‌سازی منقضی شد","updated_at":"2026-07-01T10:34:16.869Z"}
{"cache_key":"1ccc8296bd027e777d834e2740449b34b1e1ab06122e1ad5d41ec51c5f31501b","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.viewReview","source_path":"ui/src/i18n/locales/fa.ts","src_lang":"en","text":"Review","text_hash":"aff0766a5290e117b8433c351bae7b7b23bed682b2369bd822d88a647cc58512","tgt_lang":"fa","translated":"بازبینی","updated_at":"2026-06-17T14:17:45.319Z"}
{"cache_key":"1d0f48781e0038ebada1e02f24050dc850846ca2b4f988391494eedb79065316","model":"gpt-5.5","provider":"openai","segment_id":"chat.splitView.dropOpenHere","source_path":"ui/src/i18n/locales/fa.ts","src_lang":"en","text":"Open here","text_hash":"b08e2fd2e872adcb575b305187b9db8482369325806953ce80190fc2dc1ab9fb","tgt_lang":"fa","translated":"اینجا باز شود","updated_at":"2026-07-06T22:56:40.069Z"}
{"cache_key":"1ef38d19380701c599cab94e903fcaa8728b53a44fc444fa663441300acc1b61","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.detailRun","source_path":"ui/src/i18n/locales/fa.ts","src_lang":"en","text":"Run","text_hash":"00d60e31a4e6b8344d4201f25a6a7dee770713107f6d097abb01559d32b17f26","tgt_lang":"fa","translated":"اجرا","updated_at":"2026-06-16T14:18:33.052Z"}
{"cache_key":"1f6dec88b77390e395c7b0bdcd671756e3aa20c23e6676339a41a692e670112e","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.workspaceFiles.changed","source_path":"ui/src/i18n/locales/fa.ts","src_lang":"en","text":"Changed","text_hash":"2a6141e43be0c2125e3b5d9f74b4ff1261a0b320ff927c83d4d9b1b65585bad7","tgt_lang":"fa","translated":"تغییر‌یافته","updated_at":"2026-06-16T14:18:48.730Z"}
{"cache_key":"1ff41358995e014dcbc62393e62438ad388537fa6213214f728524249fd7162e","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.detailWorkerLogs","source_path":"ui/src/i18n/locales/fa.ts","src_lang":"en","text":"Worker logs","text_hash":"67766b9f222a7ccdae6beb7d6e7877d1a13abb8a346a8c5c803a4380bdf851b1","tgt_lang":"fa","translated":"گزارش‌های کارگر","updated_at":"2026-06-16T14:18:33.052Z"}
+4 -4
View File
@@ -1,11 +1,11 @@
{
"fallbackKeys": [],
"generatedAt": "2026-07-06T23:40:56.807Z",
"generatedAt": "2026-07-07T02:26:52.062Z",
"locale": "fr",
"model": "gpt-5.5",
"provider": "openai",
"sourceHash": "ff787c22bac9fbc29702f49e4a9062521d338fed4c8a2b97fec21bf52ee0892e",
"totalKeys": 1666,
"translatedKeys": 1666,
"sourceHash": "378b4e5380384a33d9e31a49a5483cdb991245705193e067d5fb8c5311bc20fb",
"totalKeys": 1668,
"translatedKeys": 1668,
"workflow": 1
}
+2
View File
@@ -31,6 +31,7 @@
{"cache_key":"27ce8e37b65777b3f85840ba03dfb77e82253f310a0add1db17653d9e7649bec","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.workspaceFiles.session","source_path":"ui/src/i18n/locales/fr.ts","src_lang":"en","text":"Session","text_hash":"6959b4159575d8dd76d9f3bbe2c6437904f861e7860c35abd18deffb1c3425a0","tgt_lang":"fr","translated":"Session","updated_at":"2026-06-16T14:14:38.496Z"}
{"cache_key":"29543289b89e37bfcf5463f542622dbc78302bfc7b168de33bc9c12a4a75a80b","model":"gpt-5.5","provider":"openai","segment_id":"subtitles.skillWorkshop","source_path":"ui/src/i18n/locales/fr.ts","src_lang":"en","text":"Review, refine, and apply proposals before they become live skills.","text_hash":"f907c72e9f18a205027257cd6fecdd52b03732227a17dcec0db038e11de3f8cc","tgt_lang":"fr","translated":"Examinez, affinez et appliquez les propositions avant quelles ne deviennent des skills actives.","updated_at":"2026-05-31T21:48:25.015Z"}
{"cache_key":"2f5c0d4d98314b8109548a8930ca5a33f1fe4524fdb3732d3a0926367d414e0e","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.composer.talkSensitivityMedium","source_path":"ui/src/i18n/locales/fr.ts","src_lang":"en","text":"Medium","text_hash":"8e588cd187741f1cd76f5fab77b7208782a8c21d764ce7d7a4cf3ac4e0968873","tgt_lang":"fr","translated":"Moyenne","updated_at":"2026-07-06T20:20:02.809Z"}
{"cache_key":"2f7fb7335938fd29ef05e0ceb033a1a748e2d86d6c9937fb5f3200cf5d6bfc74","model":"gpt-5.5","provider":"openai","segment_id":"chat.splitView.dropSplit","source_path":"ui/src/i18n/locales/fr.ts","src_lang":"en","text":"Split","text_hash":"32afaa784333648025e24b162bece7474051bcaaa29e98e19922b400b4ceb04b","tgt_lang":"fr","translated":"Scinder","updated_at":"2026-07-06T22:56:24.145Z"}
{"cache_key":"32508a245b7f297458454d0d6b421f18bfb8e5b30cc485b6c8efb83efe906823","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.autoRefresh60s","source_path":"ui/src/i18n/locales/fr.ts","src_lang":"en","text":"60s","text_hash":"f79f071ab5b033ca8fb42c077f39708930d194b18f4608eb26ac1d9665a8836f","tgt_lang":"fr","translated":"60s","updated_at":"2026-06-17T14:14:37.466Z"}
{"cache_key":"332aa29d6dc5e485013d1490b2de888ccd79e840cb107e67ac89eb4c4b374455","model":"gpt-5.5","provider":"openai","segment_id":"chat.composer.contextUsage.open","source_path":"ui/src/i18n/locales/fr.ts","src_lang":"en","text":"Open context usage details","text_hash":"8765adde14aebe600e7c9c69196c5b4a9ccc654802a94626d0391d9eaed725b1","tgt_lang":"fr","translated":"Ouvrir les détails de lutilisation du contexte","updated_at":"2026-07-05T10:16:09.189Z"}
{"cache_key":"33f08936ac956a25ff1afbce1f6967a17269c18d5c829f5fc007dde85c338703","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.viewAll","source_path":"ui/src/i18n/locales/fr.ts","src_lang":"en","text":"All cards","text_hash":"2306120917506b5998ec702f3661068b102dac538ba4c9e4634d65fe33eea98a","tgt_lang":"fr","translated":"Toutes les cartes","updated_at":"2026-06-17T14:14:32.183Z"}
@@ -44,6 +45,7 @@
{"cache_key":"3ced3592ea6acebeac1c5b2e06684c1aabd1fdc1deed38906e62320a9fe51bd4","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.agentFilterConfiguredDefault","source_path":"ui/src/i18n/locales/fr.ts","src_lang":"en","text":"{agent} (default)","text_hash":"7e996234f0fa55605720f9dc954a58411795bd882e948c87c739d43bd02137c3","tgt_lang":"fr","translated":"{agent} (par défaut)","updated_at":"2026-06-17T14:14:32.183Z"}
{"cache_key":"3edc00a38a3d13ced2578a684c2ae62a7bcd6cc73e235c78fb64d7a572b8b8fa","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.detailAutomationSkills","source_path":"ui/src/i18n/locales/fr.ts","src_lang":"en","text":"Skills: {skills}","text_hash":"4788d5f9db66e1421a762bbd942c64450c73d2145a6ef929ce32a919a0f2e3a1","tgt_lang":"fr","translated":"Skills : {skills}","updated_at":"2026-06-16T14:14:26.985Z"}
{"cache_key":"3f2a1680c4c8f175feb2765b734b9dfbeb633b1c333c3ed7d1d00945c8a7dae1","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.emptyFilteredTitle","source_path":"ui/src/i18n/locales/fr.ts","src_lang":"en","text":"No cards match this view","text_hash":"a272617e183ba1dff3f7f140d0851b64baf95f4827ff729d23dfeb05c2069875","tgt_lang":"fr","translated":"Aucune carte ne correspond à cette vue","updated_at":"2026-06-17T14:14:37.466Z"}
{"cache_key":"40546e90cf39a2dafd476f982b890514b8468f0d8937c957cbef62cf59b66f73","model":"gpt-5.5","provider":"openai","segment_id":"chat.splitView.dropOpenHere","source_path":"ui/src/i18n/locales/fr.ts","src_lang":"en","text":"Open here","text_hash":"b08e2fd2e872adcb575b305187b9db8482369325806953ce80190fc2dc1ab9fb","tgt_lang":"fr","translated":"Ouvrir ici","updated_at":"2026-07-06T22:56:24.145Z"}
{"cache_key":"41417f07a0c6ed543378910a910566667149f9b110fab6e5ffb36d64400e9f12","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.pairingQrExpired.badge","source_path":"ui/src/i18n/locales/fr.ts","src_lang":"en","text":"Expired","text_hash":"424a2551d356754c882d04ac16c63e6b50b80b159549d23231001f629455756e","tgt_lang":"fr","translated":"Expiré","updated_at":"2026-07-01T10:32:03.163Z"}
{"cache_key":"424f9b28aaa8357013433e8caad46c51ad5141083f8de91f9215824cad9d34e3","model":"gpt-5.5","provider":"openai","segment_id":"workboard.eventOrchestration","source_path":"ui/src/i18n/locales/fr.ts","src_lang":"en","text":"Orchestration","text_hash":"ed4fdd1721677737cffb2862fe34d5b63901c7cc76b8c67c51e92a467b31a5e7","tgt_lang":"fr","translated":"Orchestration","updated_at":"2026-05-30T15:38:23.998Z"}
{"cache_key":"4255a719f4f69f4be7edecc3dbdc5279ceb09478ea0e2d4f428d4b10b5dd6740","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.workspaceFiles.parentFolder","source_path":"ui/src/i18n/locales/fr.ts","src_lang":"en","text":"Parent folder","text_hash":"158f5a01ef8cfb1e6d91f8c321dd3a63f5e457f9650eecd662857701762bd31d","tgt_lang":"fr","translated":"Dossier parent","updated_at":"2026-06-16T14:14:38.496Z"}
+4 -4
View File
@@ -1,11 +1,11 @@
{
"fallbackKeys": [],
"generatedAt": "2026-07-06T23:41:00.556Z",
"generatedAt": "2026-07-07T02:26:52.188Z",
"locale": "hi",
"model": "gpt-5.5",
"provider": "openai",
"sourceHash": "ff787c22bac9fbc29702f49e4a9062521d338fed4c8a2b97fec21bf52ee0892e",
"totalKeys": 1666,
"translatedKeys": 1666,
"sourceHash": "378b4e5380384a33d9e31a49a5483cdb991245705193e067d5fb8c5311bc20fb",
"totalKeys": 1668,
"translatedKeys": 1668,
"workflow": 1
}
+2
View File
@@ -971,6 +971,7 @@
{"cache_key":"a108b77f5f9ac597558625affffb48ecb0a02bb03fe1fb53f93b39a3810ecd21","model":"gpt-5.5","provider":"openai","segment_id":"terminal.title","source_path":"ui/src/i18n/locales/hi.ts","src_lang":"en","text":"Terminal","text_hash":"e0926fdac700b09497b5f0218ea3dd54fa13c0bdeaee6caa7b85e50b852aa05f","tgt_lang":"hi","translated":"टर्मिनल","updated_at":"2026-06-26T21:33:40.484Z"}
{"cache_key":"a133506eef2399e6dd92514309a743fcbbc7cfe4460230bdf10a6efcfe8f1666","model":"gpt-5.5","provider":"openai","segment_id":"cron.errors.staggerAmountInvalid","source_path":"ui/src/i18n/locales/hi.ts","src_lang":"en","text":"Stagger must be greater than 0.","text_hash":"4d3aefc4b3c8f5972553b956e503e31933ad74ce6538e8561bf2068c4ab96f86","tgt_lang":"hi","translated":"Stagger 0 से अधिक होना चाहिए।","updated_at":"2026-06-26T21:38:17.792Z"}
{"cache_key":"a17eabfb863dd70737ca640a0e3a9ae97fb52c5e36c34debe43fed14b90b8865","model":"gpt-5.5","provider":"openai","segment_id":"usage.details.filtered","source_path":"ui/src/i18n/locales/hi.ts","src_lang":"en","text":"(filtered)","text_hash":"ff5bcbf42db8f900aa7678f0c3859d3f48f33f9279f6582e19952c885cea371b","tgt_lang":"hi","translated":"(फ़िल्टर किया गया)","updated_at":"2026-06-26T21:35:20.292Z"}
{"cache_key":"a1a65669307ca20ce751e5a0fc85bff97ea324993fe806ebdcf16c3e60e0255a","model":"gpt-5.5","provider":"openai","segment_id":"chat.splitView.dropOpenHere","source_path":"ui/src/i18n/locales/hi.ts","src_lang":"en","text":"Open here","text_hash":"b08e2fd2e872adcb575b305187b9db8482369325806953ce80190fc2dc1ab9fb","tgt_lang":"hi","translated":"यहाँ खोलें","updated_at":"2026-07-06T22:56:25.594Z"}
{"cache_key":"a1a82f910389bb2354f3f36d08b07430c8e41cb47cbb22b67d73aa58423d1540","model":"gpt-5.5","provider":"openai","segment_id":"workboard.lifecycleUnlinked","source_path":"ui/src/i18n/locales/hi.ts","src_lang":"en","text":"No session","text_hash":"64f06c9698cd0e17a303ad674d436c04ca60f5d0b358989e7369bb7ce5556b88","tgt_lang":"hi","translated":"कोई सत्र नहीं","updated_at":"2026-06-26T21:32:52.647Z"}
{"cache_key":"a21909d3e36a5e99153ee472d789eb3bc0ecadb20969ca55dcf705d100ba13ae","model":"gpt-5.5","provider":"openai","segment_id":"agents.files.empty","source_path":"ui/src/i18n/locales/hi.ts","src_lang":"en","text":"No files found.","text_hash":"17d558b60b5e0c699055b8554ad23fce2c1665b2e270796380bbd1eeca8dc48f","tgt_lang":"hi","translated":"कोई फ़ाइल नहीं मिली।","updated_at":"2026-06-26T21:30:58.804Z"}
{"cache_key":"a246d62d720ff84d4ebe4b851359a28d6005d8799c94872d6640d1f067396c1b","model":"gpt-5.5","provider":"openai","segment_id":"sessionsView.autoThreshold","source_path":"ui/src/i18n/locales/hi.ts","src_lang":"en","text":"auto-threshold","text_hash":"1226b481f4c922e35ec4ce19374ef387fc5d7a1fc014bcb0bebd07265b2171d9","tgt_lang":"hi","translated":"ऑटो-थ्रेशोल्ड","updated_at":"2026-06-26T21:30:26.471Z"}
@@ -1495,6 +1496,7 @@
{"cache_key":"f89c585a2b1de981064ae85977b35c654c36c7b85811235d9ccde8c6a2fa27eb","model":"gpt-5.5","provider":"openai","segment_id":"chat.composer.contextUsage.title","source_path":"ui/src/i18n/locales/hi.ts","src_lang":"en","text":"Context usage details","text_hash":"0e04e44654b5a2abf769dcd2f82a32e0501a41689d6635d7f718978c160958f0","tgt_lang":"hi","translated":"संदर्भ उपयोग विवरण","updated_at":"2026-07-05T10:16:11.934Z"}
{"cache_key":"f8ec79be32c3af4c0c9675588136b563d7f75948f44d56dff136720222e678ea","model":"gpt-5.5","provider":"openai","segment_id":"cron.quickCreate.promptPlaceholder","source_path":"ui/src/i18n/locales/hi.ts","src_lang":"en","text":"e.g., Check my inbox for urgent emails and summarize them...","text_hash":"f4675787351dcf3b421c7f187fc9e501f37cb0a5ca79ddcde938cf99efe2dac1","tgt_lang":"hi","translated":"उदा., मेरे इनबॉक्स में ज़रूरी ईमेल जाँचें और उनका सारांश दें...","updated_at":"2026-06-26T21:36:59.582Z"}
{"cache_key":"f90380429beb95d907b7115fb569e29cbfd5ad959b72d50db892e3a86a5d897a","model":"gpt-5.5","provider":"openai","segment_id":"overview.palette.items.settings","source_path":"ui/src/i18n/locales/hi.ts","src_lang":"en","text":"Settings","text_hash":"74a883a037bc227f91891ab654a753d3a99f31ab06ae5b5d2b6e594a692b41f8","tgt_lang":"hi","translated":"सेटिंग्स","updated_at":"2026-06-26T21:33:46.154Z"}
{"cache_key":"f9430f699861525e730844548b910daefb29604477005c3e664ef75f830b7851","model":"gpt-5.5","provider":"openai","segment_id":"chat.splitView.dropSplit","source_path":"ui/src/i18n/locales/hi.ts","src_lang":"en","text":"Split","text_hash":"32afaa784333648025e24b162bece7474051bcaaa29e98e19922b400b4ceb04b","tgt_lang":"hi","translated":"विभाजित करें","updated_at":"2026-07-06T22:56:25.594Z"}
{"cache_key":"f94eecafb0b66380faf3a1e489ced0cdda5aea0ca4404eacd1be7248d10cbad7","model":"gpt-5.5","provider":"openai","segment_id":"overview.insecure.stayHttp","source_path":"ui/src/i18n/locales/hi.ts","src_lang":"en","text":"If you must stay on HTTP, set {config} (token-only).","text_hash":"d1a4cb0c430ca9f73d0dbb992f19d6e7e301e24acdc269d368b31fa1efd4ff1e","tgt_lang":"hi","translated":"अगर आपको HTTP पर ही रहना है, तो {config} (token-only) सेट करें।","updated_at":"2026-06-26T21:33:25.942Z"}
{"cache_key":"f98d47c5b187ddcaa5e9354da1ff99e739647f49174fa5dcf97d2af4c6099500","model":"gpt-5.5","provider":"openai","segment_id":"chat.composer.talkAdvancedSettingsRequiresAdminTitle","source_path":"ui/src/i18n/locales/hi.ts","src_lang":"en","text":"Advanced Talk settings require operator.admin access.","text_hash":"fa933a90d7dde5f8f1a324bd13a5daceb0ad9e04bd77f3aae07c8348edfe4dd7","tgt_lang":"hi","translated":"उन्नत Talk सेटिंग्स के लिए operator.admin एक्सेस आवश्यक है।","updated_at":"2026-07-06T20:20:02.809Z"}
{"cache_key":"f99128956eeb05331c5034e79446729b2c3a319ab6846d5d8533d5069e9f703a","model":"gpt-5.5","provider":"openai","segment_id":"workboard.badgeSkills","source_path":"ui/src/i18n/locales/hi.ts","src_lang":"en","text":"{count} skills","text_hash":"c6c2928e3abbbdfaae0f5608b23b1a805b43a8d1daf54e1d307126ff01e80718","tgt_lang":"hi","translated":"{count} कौशल","updated_at":"2026-06-26T21:32:45.360Z"}
+4 -4
View File
@@ -1,11 +1,11 @@
{
"fallbackKeys": [],
"generatedAt": "2026-07-06T23:41:12.295Z",
"generatedAt": "2026-07-07T02:26:52.782Z",
"locale": "id",
"model": "gpt-5.5",
"provider": "openai",
"sourceHash": "ff787c22bac9fbc29702f49e4a9062521d338fed4c8a2b97fec21bf52ee0892e",
"totalKeys": 1666,
"translatedKeys": 1666,
"sourceHash": "378b4e5380384a33d9e31a49a5483cdb991245705193e067d5fb8c5311bc20fb",
"totalKeys": 1668,
"translatedKeys": 1668,
"workflow": 1
}
+2
View File
@@ -163,6 +163,7 @@
{"cache_key":"ad3853e3b218bb97b77b7153296ab380a9e6518ed82ce10ce45f1b64fa5fcc8b","model":"gpt-5.5","provider":"openai","segment_id":"chat.composer.microphoneListUnsupported","source_path":"ui/src/i18n/locales/id.ts","src_lang":"en","text":"This browser cannot list microphone inputs.","text_hash":"fa99f66cc346509afe8c5e3437ad299409a60be69d8b2b70138d8c42176052d9","tgt_lang":"id","translated":"Browser ini tidak dapat menampilkan daftar input mikrofon.","updated_at":"2026-07-06T17:57:03.488Z"}
{"cache_key":"ade96abc5cf5bc4a64c8b6fe6e2a0424aec0c71ab0ca76187e22ce2f60bc955f","model":"gpt-5.5","provider":"openai","segment_id":"chat.composer.systemDefaultMicrophone","source_path":"ui/src/i18n/locales/id.ts","src_lang":"en","text":"System default","text_hash":"b0459211f9f76871059135050a2afd9a01e7e41dc32ea58006c51483b9ceab6d","tgt_lang":"id","translated":"Default sistem","updated_at":"2026-07-06T17:33:58.361Z"}
{"cache_key":"ae1b62a9507bfd496990604778447daa341c3d974891c34d9a1daa91680d5e17","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.composer.talkSensitivityLow","source_path":"ui/src/i18n/locales/id.ts","src_lang":"en","text":"Low","text_hash":"f793de205ead5ac302c4a1627829dea41f176b1068b993a32373fc869918374b","tgt_lang":"id","translated":"Rendah","updated_at":"2026-07-06T20:20:02.809Z"}
{"cache_key":"afd6c473845ca0c4834a776246c87d5fffa28256c3ba8561bdc9af32906c723a","model":"gpt-5.5","provider":"openai","segment_id":"chat.splitView.dropSplit","source_path":"ui/src/i18n/locales/id.ts","src_lang":"en","text":"Split","text_hash":"32afaa784333648025e24b162bece7474051bcaaa29e98e19922b400b4ceb04b","tgt_lang":"id","translated":"Bagi","updated_at":"2026-07-06T22:56:32.657Z"}
{"cache_key":"b037f499cec5f612909a291b6ad3f50324e90bb86d66166f35577ce496c3d16f","model":"gpt-5.5","provider":"openai","segment_id":"languages.ru","source_path":"ui/src/i18n/locales/id.ts","src_lang":"en","text":"Русский (Russian)","text_hash":"ea81bf0fd46410b501bddee074ab6f00b0cdf377a6cafe608dcf2c28f7cb2f4e","tgt_lang":"id","translated":"Русский (Russian)","updated_at":"2026-06-26T21:43:38.080Z"}
{"cache_key":"b0640aa8dff3b5711cefa898e460b01e285a1e5948869b19ee80d82018193f2d","model":"gpt-5.5","provider":"openai","segment_id":"usage.providerUsage.topModels","source_path":"ui/src/i18n/locales/id.ts","src_lang":"en","text":"Top models","text_hash":"79489561d9efe32b89add781323318355ae49e3d71f9c5a45a34c21825778663","tgt_lang":"id","translated":"Model teratas","updated_at":"2026-07-06T06:40:15.357Z"}
{"cache_key":"b0e566400a353278f40b1479ba6dd94a64e6303abedadf5914829b199f9fd71b","model":"gpt-5.5","provider":"openai","segment_id":"workboard.eventProtocolViolation","source_path":"ui/src/i18n/locales/id.ts","src_lang":"en","text":"Protocol violation","text_hash":"367bb2052963f7d75beb672d3ca0430d7d49ac48a2759d578c7df933178fe564","tgt_lang":"id","translated":"Pelanggaran protokol","updated_at":"2026-05-30T15:38:39.708Z"}
@@ -176,6 +177,7 @@
{"cache_key":"bc30c976e2acb3f362c9dd434f7e1ecfac8da80e65f5f3075d739c59621fa1d2","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.workspaceFiles.noSearchResults","source_path":"ui/src/i18n/locales/id.ts","src_lang":"en","text":"No matching files.","text_hash":"6ba2ede6c6019b640f63e7e48c5ee8238e701c6e539ce9abb5a7a9d9c71d8a73","tgt_lang":"id","translated":"Tidak ada file yang cocok.","updated_at":"2026-06-16T14:16:57.267Z"}
{"cache_key":"bc943e1fdb3cebd9366a4b42fc82605da5ec87056f1c2ca1f450144a728919c1","model":"gpt-5.5","provider":"openai","segment_id":"sessionsView.archivedOnly","source_path":"ui/src/i18n/locales/id.ts","src_lang":"en","text":"Archived only","text_hash":"da7ebd8c482f38dc2a5b693a0ec25aaa04ea7b5fa3713cce9fa41a28f2201a6b","tgt_lang":"id","translated":"Hanya yang diarsipkan","updated_at":"2026-07-02T14:30:35.554Z"}
{"cache_key":"be2567712d43d5604dec1e9417d633db34a90edd4383e93afb6595d20d9fa6bf","model":"gpt-5.5","provider":"openai","segment_id":"tabs.worktrees","source_path":"ui/src/i18n/locales/id.ts","src_lang":"en","text":"Worktrees","text_hash":"aec2f93d67b7c4c5fd9b94042f33299f7a0e55cdcb7e8e35feb9d0f6da697f3d","tgt_lang":"id","translated":"Worktree","updated_at":"2026-07-05T21:01:23.086Z"}
{"cache_key":"c09bed7cc6fff4cd103c8aff90f2745427f815abaf825b6ebed105cf92f1d554","model":"gpt-5.5","provider":"openai","segment_id":"chat.splitView.dropOpenHere","source_path":"ui/src/i18n/locales/id.ts","src_lang":"en","text":"Open here","text_hash":"b08e2fd2e872adcb575b305187b9db8482369325806953ce80190fc2dc1ab9fb","tgt_lang":"id","translated":"Buka di sini","updated_at":"2026-07-06T22:56:32.657Z"}
{"cache_key":"c1975e34b46eb09c6e3da8876097d8d07b1eb3f19a3e156f4009e4dc195bfc06","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.autoRefresh5s","source_path":"ui/src/i18n/locales/id.ts","src_lang":"en","text":"5s","text_hash":"93e3d8c5b10657d2884f177488b689aadf82a83f962237cb602b3314386ab3b7","tgt_lang":"id","translated":"5d","updated_at":"2026-06-17T14:16:03.086Z"}
{"cache_key":"c555d35c23340c4c8ce7a451c92f251d655b3e777cef38ffa5dd3b6631e6a31a","model":"gpt-5.5","provider":"openai","segment_id":"chat.composer.microphoneNoneFound","source_path":"ui/src/i18n/locales/id.ts","src_lang":"en","text":"No microphone inputs were found.","text_hash":"3aa0952aa2a5987227a12656a28131c7e153b5efe3fca4043c742fb289eeb37c","tgt_lang":"id","translated":"Tidak ditemukan input mikrofon.","updated_at":"2026-07-06T17:57:03.488Z"}
{"cache_key":"ca1cd7818628ba3e873a7b3679124ff1868b88af4647fb8ed91f168f8997199b","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.autoRefresh15s","source_path":"ui/src/i18n/locales/id.ts","src_lang":"en","text":"15s","text_hash":"21b5f52ded33ab19c16a680c4e280b8f9992395b514290163abf272f06394a6f","tgt_lang":"id","translated":"15d","updated_at":"2026-06-17T14:16:03.086Z"}
+4 -4
View File
@@ -1,11 +1,11 @@
{
"fallbackKeys": [],
"generatedAt": "2026-07-06T23:41:05.441Z",
"generatedAt": "2026-07-07T02:26:52.426Z",
"locale": "it",
"model": "gpt-5.5",
"provider": "openai",
"sourceHash": "ff787c22bac9fbc29702f49e4a9062521d338fed4c8a2b97fec21bf52ee0892e",
"totalKeys": 1666,
"translatedKeys": 1666,
"sourceHash": "378b4e5380384a33d9e31a49a5483cdb991245705193e067d5fb8c5311bc20fb",
"totalKeys": 1668,
"translatedKeys": 1668,
"workflow": 1
}
+2
View File
@@ -3,6 +3,7 @@
{"cache_key":"0211275042f628fca767913ee41baf7cfe767fe528e674dd67f9ef332c2ecf6f","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.dependenciesReadyTitle","source_path":"ui/src/i18n/locales/it.ts","src_lang":"en","text":"{count} dependencies are done.","text_hash":"559fe92cd5fe39b4f511a146fc7ce6b51e7f528e1d388bbfde1d85dddb60604d","tgt_lang":"it","translated":"{count} dipendenze completate.","updated_at":"2026-06-16T14:15:46.111Z"}
{"cache_key":"034b6f860ea33856004add07b07ef3c5c40658482954d7b1cf22eb4d0d1dddf8","model":"gpt-5.5","provider":"openai","segment_id":"workboard.eventOrchestration","source_path":"ui/src/i18n/locales/it.ts","src_lang":"en","text":"Orchestration","text_hash":"ed4fdd1721677737cffb2862fe34d5b63901c7cc76b8c67c51e92a467b31a5e7","tgt_lang":"it","translated":"Orchestrazione","updated_at":"2026-05-30T15:38:31.723Z"}
{"cache_key":"04ffebf265ed2c2f33aeb8c7ee5552a7311b922e6e88f95a39a47510aeac37be","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.dependenciesReady","source_path":"ui/src/i18n/locales/it.ts","src_lang":"en","text":"{count} ready","text_hash":"f5f5fd424d7c18f19a51ee147857efddc320a0ec6e1eeb4354be129425632f05","tgt_lang":"it","translated":"{count} pronte","updated_at":"2026-06-16T14:15:46.111Z"}
{"cache_key":"062403cf33337e0782d382f0037af0c0a272fa749ab87f7d9427a240b5c5df51","model":"gpt-5.5","provider":"openai","segment_id":"chat.splitView.dropSplit","source_path":"ui/src/i18n/locales/it.ts","src_lang":"en","text":"Split","text_hash":"32afaa784333648025e24b162bece7474051bcaaa29e98e19922b400b4ceb04b","tgt_lang":"it","translated":"Dividi","updated_at":"2026-07-06T22:56:28.456Z"}
{"cache_key":"0676e07f40f1cf2d4b4a7ca4222b8549cb16de22673976bba62a3c9dc7485f19","model":"gpt-5.5","provider":"openai","segment_id":"worktrees.branch","source_path":"ui/src/i18n/locales/it.ts","src_lang":"en","text":"Branch","text_hash":"52656e8104eef3fddd3d4546903fa0de93c0625abf47b3dd8130f7705d6a513e","tgt_lang":"it","translated":"Branch","updated_at":"2026-07-05T21:01:11.440Z"}
{"cache_key":"0681f73108535aeaa33e3f79f8fa88ac54de304ca08fcb9f6950bd475ce896bb","model":"gpt-5.5","provider":"openai","segment_id":"chat.sidebar.sortUpdated","source_path":"ui/src/i18n/locales/it.ts","src_lang":"en","text":"Last updated","text_hash":"382ac5f308f76c24b2c981e2041943bc2be2229cbd285ad362b9af1cfc386ef8","tgt_lang":"it","translated":"Ultimo aggiornamento","updated_at":"2026-07-06T15:07:02.499Z"}
{"cache_key":"07d31d045a2692f4a59176552a7e449802b4b94c15e6323e890e03f40ab01122","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.emptyFilteredHint","source_path":"ui/src/i18n/locales/it.ts","src_lang":"en","text":"Change the view, search, priority, agent, or archive filter.","text_hash":"049dfae940263ace9707334af06b298c1223c38a449b1cec5a712553badebbd0","tgt_lang":"it","translated":"Modifica la vista, la ricerca, la priorità, l'agente o il filtro archivio.","updated_at":"2026-06-17T14:19:20.279Z"}
@@ -212,6 +213,7 @@
{"cache_key":"e00c84cdd19454aa5ff136719ed6bdee9bc9323bd21a452f51f99fd00cf6b176","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.composer.talkMoreInSettings","source_path":"ui/src/i18n/locales/it.ts","src_lang":"en","text":"More in Settings","text_hash":"87f1e602d68bdc42ae3fddc0c1541d323adc718b7b9b3f889b2ca71823e319b9","tgt_lang":"it","translated":"Altro nelle Impostazioni","updated_at":"2026-07-06T20:20:02.809Z"}
{"cache_key":"e0526360f13695cbb4cd4e34f72530e0be10f9845c4f25bb3d9a2d9325e5c2c0","model":"gpt-5.5","provider":"openai","segment_id":"sessionsView.groupByCategory","source_path":"ui/src/i18n/locales/it.ts","src_lang":"en","text":"Custom groups","text_hash":"9636b3c175d0e2a9fb982785a84275d191a8b4ef28e4d842a9e35a38e3c12f10","tgt_lang":"it","translated":"Gruppi personalizzati","updated_at":"2026-07-05T14:39:59.770Z"}
{"cache_key":"e07fe4644104233a4c3e29c7ad2c23358eae26b86f11644d2fc8053f96750a1f","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.detailDiagnostics","source_path":"ui/src/i18n/locales/it.ts","src_lang":"en","text":"Diagnostics","text_hash":"268f14bbfe119c1e92150583af960a086d7db9619a097f8aa72ff6779842f610","tgt_lang":"it","translated":"Diagnostica","updated_at":"2026-06-16T14:15:39.914Z"}
{"cache_key":"e432401ecb612f02b179a4a6854352c01fd78da772297d659dea09701032f7bc","model":"gpt-5.5","provider":"openai","segment_id":"chat.splitView.dropOpenHere","source_path":"ui/src/i18n/locales/it.ts","src_lang":"en","text":"Open here","text_hash":"b08e2fd2e872adcb575b305187b9db8482369325806953ce80190fc2dc1ab9fb","tgt_lang":"it","translated":"Apri qui","updated_at":"2026-07-06T22:56:28.456Z"}
{"cache_key":"e46ec9eee700a9a153d4c046b2a558c48108f2a76ebf7968b8f5bbc12329e6b8","model":"gpt-5.5","provider":"openai","segment_id":"sessionsView.renameSession","source_path":"ui/src/i18n/locales/it.ts","src_lang":"en","text":"Rename session","text_hash":"2cad0766accc2d3f70f007068524cea983e0d53f54543e9e82a4e73b2a07987f","tgt_lang":"it","translated":"Rinomina sessione","updated_at":"2026-07-02T14:30:25.278Z"}
{"cache_key":"e472ffa060374ac1bb242992b43d84b17e341e6bd6df33f5780ac16f453f3c09","model":"gpt-5.5","provider":"openai","segment_id":"worktrees.repo","source_path":"ui/src/i18n/locales/it.ts","src_lang":"en","text":"Repository","text_hash":"13d6ff07b8a5d792ec87d5ec83bff2730ee77fa8f4fcd89ca5f1d688f64b4c73","tgt_lang":"it","translated":"Repository","updated_at":"2026-07-05T21:01:11.440Z"}
{"cache_key":"e73d23872261649106291ad0797021f11272f286362b5cbf4e6488170d056891","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.composer.talkSensitivityLow","source_path":"ui/src/i18n/locales/it.ts","src_lang":"en","text":"Low","text_hash":"f793de205ead5ac302c4a1627829dea41f176b1068b993a32373fc869918374b","tgt_lang":"it","translated":"Bassa","updated_at":"2026-07-06T20:20:02.809Z"}
+4 -4
View File
@@ -1,11 +1,11 @@
{
"fallbackKeys": [],
"generatedAt": "2026-07-06T23:40:52.795Z",
"generatedAt": "2026-07-07T02:26:51.821Z",
"locale": "ja-JP",
"model": "gpt-5.5",
"provider": "openai",
"sourceHash": "ff787c22bac9fbc29702f49e4a9062521d338fed4c8a2b97fec21bf52ee0892e",
"totalKeys": 1666,
"translatedKeys": 1666,
"sourceHash": "378b4e5380384a33d9e31a49a5483cdb991245705193e067d5fb8c5311bc20fb",
"totalKeys": 1668,
"translatedKeys": 1668,
"workflow": 1
}
+4 -4
View File
@@ -1,11 +1,11 @@
{
"fallbackKeys": [],
"generatedAt": "2026-07-06T23:40:54.651Z",
"generatedAt": "2026-07-07T02:26:51.942Z",
"locale": "ko",
"model": "gpt-5.5",
"provider": "openai",
"sourceHash": "ff787c22bac9fbc29702f49e4a9062521d338fed4c8a2b97fec21bf52ee0892e",
"totalKeys": 1666,
"translatedKeys": 1666,
"sourceHash": "378b4e5380384a33d9e31a49a5483cdb991245705193e067d5fb8c5311bc20fb",
"totalKeys": 1668,
"translatedKeys": 1668,
"workflow": 1
}
+2
View File
@@ -97,6 +97,7 @@
{"cache_key":"65f7b9e49b06a20ec530637e73ee1299092a25239331e5006c1cc5c15362fd9d","model":"gpt-5.5","provider":"openai","segment_id":"worktrees.title","source_path":"ui/src/i18n/locales/ko.ts","src_lang":"en","text":"Managed Worktrees","text_hash":"dde32010185098a47e873fb25dd99446b0cb1a75614068587f7cd0bffb5aed18","tgt_lang":"ko","translated":"관리되는 Worktree","updated_at":"2026-07-05T21:00:52.590Z"}
{"cache_key":"6602035139205feea1a60df0cc551f5c152109a00d9a41eb445ea1a4b6ba4678","model":"gpt-5.5","provider":"openai","segment_id":"sessionsView.dragSessionHint","source_path":"ui/src/i18n/locales/ko.ts","src_lang":"en","text":"Drag to move between groups","text_hash":"3e8692b1cd1c1f9a606a779f1037aa390c885fde224ddb841df9259e8aab03ae","tgt_lang":"ko","translated":"드래그하여 그룹 간 이동","updated_at":"2026-07-05T14:39:46.951Z"}
{"cache_key":"6661a8580f033e530995fca7fa9a21141d4c43f499c3bac4b5bcde8e4f085a50","model":"gpt-5.5","provider":"openai","segment_id":"sessionsView.goalNote","source_path":"ui/src/i18n/locales/ko.ts","src_lang":"en","text":"Goal note","text_hash":"1afb7855a394ef7078728de1c804d6b995413db4eafe7d74190076cb9ed2c9f5","tgt_lang":"ko","translated":"목표 메모","updated_at":"2026-05-29T21:00:36.520Z"}
{"cache_key":"6719ecb96c12dc8c13a5d1ca977c7d5cb5d5951617052df9c9d6e5197fc95ad1","model":"gpt-5.5","provider":"openai","segment_id":"chat.splitView.dropOpenHere","source_path":"ui/src/i18n/locales/ko.ts","src_lang":"en","text":"Open here","text_hash":"b08e2fd2e872adcb575b305187b9db8482369325806953ce80190fc2dc1ab9fb","tgt_lang":"ko","translated":"여기에서 열기","updated_at":"2026-07-06T22:56:22.479Z"}
{"cache_key":"696d861bfac8358a9de4a213c457761ac32ab99f42e6f44dd1b2f40f6390174a","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.viewDetails","source_path":"ui/src/i18n/locales/ko.ts","src_lang":"en","text":"View details","text_hash":"d1bf045bb524dae5b02c471c230958bcd1bf232d7a49367b1cdf977855a06b41","tgt_lang":"ko","translated":"세부 정보 보기","updated_at":"2026-06-16T14:14:21.259Z"}
{"cache_key":"6aa0c48e467ffeeeb2f4c2c5ebde0c38d70f49d779a73c2e0b8b72b74b7d87c2","model":"gpt-5.5","provider":"openai","segment_id":"sessionsView.groupByCategory","source_path":"ui/src/i18n/locales/ko.ts","src_lang":"en","text":"Custom groups","text_hash":"9636b3c175d0e2a9fb982785a84275d191a8b4ef28e4d842a9e35a38e3c12f10","tgt_lang":"ko","translated":"사용자 지정 그룹","updated_at":"2026-07-05T14:39:46.951Z"}
{"cache_key":"6c2c490ea3016befc0d5e801018f9149b0fe3b7e32e4016b60c0d3b6d3858b94","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.refreshError","source_path":"ui/src/i18n/locales/ko.ts","src_lang":"en","text":"Refresh failed","text_hash":"8fa7e6d90bef4e5cb735233347bf6a71b5b30d96e7c1a50b73f10cb441b275c2","tgt_lang":"ko","translated":"새로 고침 실패","updated_at":"2026-06-17T14:14:20.553Z"}
@@ -206,6 +207,7 @@
{"cache_key":"e5f9103bed688cce3a94d8fffcf00e9abda609c9027d95f01765ea3fd40a82fe","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.workspaceFiles.preview","source_path":"ui/src/i18n/locales/ko.ts","src_lang":"en","text":"Preview","text_hash":"324b134f57c70c729ae3dc4d298bb451656717d70523e942c1ce667b8024ea07","tgt_lang":"ko","translated":"미리보기","updated_at":"2026-06-16T14:14:37.028Z"}
{"cache_key":"e60f801b1f26addebd51f21bd9656ee7432e2a09068ef936e1d40c6f3d20ac67","model":"gpt-5.5","provider":"openai","segment_id":"tabs.mcp","source_path":"ui/src/i18n/locales/ko.ts","src_lang":"en","text":"MCP","text_hash":"53f13ae99ed53bd346eb8e1c8cefb7ef8260683b50401caf101360967ea052aa","tgt_lang":"ko","translated":"MCP","updated_at":"2026-05-31T05:36:39.349Z"}
{"cache_key":"e79300da7415b9125237edc0370bdd624813f16992a1519d3b0006aca737adea","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.dependenciesBlockedTitle","source_path":"ui/src/i18n/locales/ko.ts","src_lang":"en","text":"Waiting on dependencies: {parents}.","text_hash":"50fb8f9b1326b69bd67d25583ddb4f70b9d75ae6e3ff8a9056a9361daa4b7d8b","tgt_lang":"ko","translated":"종속성 대기 중: {parents}.","updated_at":"2026-06-16T14:14:28.718Z"}
{"cache_key":"e7ad94cd4ac1aa0e07a008e0c6dba335c3a440f15ebb37ef1ba0af56d50d3bb1","model":"gpt-5.5","provider":"openai","segment_id":"chat.splitView.dropSplit","source_path":"ui/src/i18n/locales/ko.ts","src_lang":"en","text":"Split","text_hash":"32afaa784333648025e24b162bece7474051bcaaa29e98e19922b400b4ceb04b","tgt_lang":"ko","translated":"분할","updated_at":"2026-07-06T22:56:22.479Z"}
{"cache_key":"e7c11ccf9f90b61836b988450545ec1b989a94063b51174e1c03b603e4cf3637","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.lastRefreshed","source_path":"ui/src/i18n/locales/ko.ts","src_lang":"en","text":"Updated {time}","text_hash":"2f87419441e6111b4d62893d3c4ef5ddeb2c8e1af82fabab6132856faf77f907","tgt_lang":"ko","translated":"업데이트됨 {time}","updated_at":"2026-06-17T14:14:20.553Z"}
{"cache_key":"e8081578e7e6a0677dc97db787a50cc648eb66b509828be1acd8929fc1064dda","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.detailNotePlaceholder","source_path":"ui/src/i18n/locales/ko.ts","src_lang":"en","text":"Add a decision, blocker, or proof note...","text_hash":"0e40ea8371be2fcbd8379458b0da541ca0dce5dc86357dea64a4d8fac1c742dc","tgt_lang":"ko","translated":"결정, 차단 요소 또는 증빙 메모를 추가하세요...","updated_at":"2026-06-16T14:14:28.718Z"}
{"cache_key":"eb949e3f2e0fa63843317a46e9048b29ae6830d1792fb79d6700ef5ee442759b","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.workspaceFiles.empty","source_path":"ui/src/i18n/locales/ko.ts","src_lang":"en","text":"No files touched in this session yet","text_hash":"6b295e4e11bcdd52340c4cc7987565f848cf477a1f0b96c0f47a2b718418298e","tgt_lang":"ko","translated":"이 세션에서 아직 변경된 파일이 없습니다","updated_at":"2026-06-16T14:14:28.718Z"}
+4 -4
View File
@@ -1,11 +1,11 @@
{
"fallbackKeys": [],
"generatedAt": "2026-07-06T23:41:19.186Z",
"generatedAt": "2026-07-07T02:26:53.264Z",
"locale": "nl",
"model": "gpt-5.5",
"provider": "openai",
"sourceHash": "ff787c22bac9fbc29702f49e4a9062521d338fed4c8a2b97fec21bf52ee0892e",
"totalKeys": 1666,
"translatedKeys": 1666,
"sourceHash": "378b4e5380384a33d9e31a49a5483cdb991245705193e067d5fb8c5311bc20fb",
"totalKeys": 1668,
"translatedKeys": 1668,
"workflow": 1
}
+2
View File
@@ -162,6 +162,7 @@
{"cache_key":"bbc4ce34d65947b136b334bc6de173832f8df27f9a057f0a157883b44a9de3d4","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.workspaceFiles.readCount","source_path":"ui/src/i18n/locales/nl.ts","src_lang":"en","text":"{count} read","text_hash":"b3c6c64f1153fb7b2672d2894f532d3f7adea1dd1c473363587fc520be35998e","tgt_lang":"nl","translated":"{count} gelezen","updated_at":"2026-06-16T14:18:24.009Z"}
{"cache_key":"bc958fd40402013b5d5811be3290a4fe07db7bcc8198055e7cffa1a9ed1978ed","model":"gpt-5.5","provider":"openai","segment_id":"sessionsView.renameSession","source_path":"ui/src/i18n/locales/nl.ts","src_lang":"en","text":"Rename session","text_hash":"2cad0766accc2d3f70f007068524cea983e0d53f54543e9e82a4e73b2a07987f","tgt_lang":"nl","translated":"Sessie hernoemen","updated_at":"2026-07-02T14:31:07.310Z"}
{"cache_key":"bea2efe67c6d9fc7efe520d772b92edaf474a7d048e35d4e6d5e557151e5b0e2","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.pairingQrExpired.title","source_path":"ui/src/i18n/locales/nl.ts","src_lang":"en","text":"Pairing QR expired","text_hash":"74e09eafc1d35cad5b62b7a9c321a4d090bb8fefdfa8b33913d6194186eadda6","tgt_lang":"nl","translated":"Koppelings-QR verlopen","updated_at":"2026-07-01T10:34:14.146Z"}
{"cache_key":"bf3d29e7f74d361e8d1599bd0deb0ad081f6aaef32c96c336ffeb3bc0e73fa56","model":"gpt-5.5","provider":"openai","segment_id":"chat.splitView.dropOpenHere","source_path":"ui/src/i18n/locales/nl.ts","src_lang":"en","text":"Open here","text_hash":"b08e2fd2e872adcb575b305187b9db8482369325806953ce80190fc2dc1ab9fb","tgt_lang":"nl","translated":"Hier openen","updated_at":"2026-07-06T22:56:38.316Z"}
{"cache_key":"c13bde4c03cc44274c7dfb74e31a7592f92a6c3e5395c9cd7550de40b7f873b5","model":"gpt-5.5","provider":"openai","segment_id":"worktrees.subtitle","source_path":"ui/src/i18n/locales/nl.ts","src_lang":"en","text":"Isolated repository checkouts owned by OpenClaw.","text_hash":"6a3984ca864c9188fa8c05e732f6831b501b4caed6bd61b60e48e9b0cf74bd0c","tgt_lang":"nl","translated":"Geïsoleerde repository-checkouts beheerd door OpenClaw.","updated_at":"2026-07-05T21:01:37.071Z"}
{"cache_key":"c210b3270e9de05dfe8ac280e9c022cb999e3c88276570f2fffb3b25fd3de70e","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.viewMissingProof","source_path":"ui/src/i18n/locales/nl.ts","src_lang":"en","text":"Missing proof","text_hash":"b46debe888e32eec183dc5936c79d22ea43bec580c410c2b3c1aa24aaa75d677","tgt_lang":"nl","translated":"Bewijs ontbreekt","updated_at":"2026-06-17T14:17:30.702Z"}
{"cache_key":"c3adb0fbf9360a046f9d3444994643f49b2b4f09a0c66bef8fbfc2fb472b6f60","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.composer.talkDefault","source_path":"ui/src/i18n/locales/nl.ts","src_lang":"en","text":"Default","text_hash":"21b111cbfe6e8fca2d181c43f53ad548b22e38aca955b9824706a504b0a07a2d","tgt_lang":"nl","translated":"Standaard","updated_at":"2026-07-06T20:20:02.809Z"}
@@ -174,6 +175,7 @@
{"cache_key":"cb6c84443ca09ca66b9cc3bebc2538399e0634bbb3214579aa84fe99ee311828","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.detailAutomationSummary","source_path":"ui/src/i18n/locales/nl.ts","src_lang":"en","text":"Summary: {summary}","text_hash":"3a2270b3cd47b523936c13efec489f36112e0a64fe763dbe972d21fef029e814","tgt_lang":"nl","translated":"Samenvatting: {summary}","updated_at":"2026-06-16T14:18:09.152Z"}
{"cache_key":"cb8038b94c017757920e8ad341143e8bc172fb9e33794542b1702bccc2245756","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.autoRefresh","source_path":"ui/src/i18n/locales/nl.ts","src_lang":"en","text":"Auto-refresh","text_hash":"9ea4d7fd1550f0866089d18b1344546bfed91502b41c0484d6023ceb0fdeb75c","tgt_lang":"nl","translated":"Automatisch vernieuwen","updated_at":"2026-06-17T14:17:30.702Z"}
{"cache_key":"ccbb3082801b225c7dcfa386897983fe5030a274e3725112da01a906ed9936c3","model":"gpt-5.5","provider":"openai","segment_id":"sessionsView.pinSession","source_path":"ui/src/i18n/locales/nl.ts","src_lang":"en","text":"Pin session","text_hash":"813273b54d2df112a0fa1903110e9386779f8848ae288142d3f91d7a5891c8ff","tgt_lang":"nl","translated":"Sessie vastzetten","updated_at":"2026-07-02T14:31:07.310Z"}
{"cache_key":"cdfeaad30fc1babbc82cd33e77366dac8a2ab59d0e4ce5842f926b8a21bd9654","model":"gpt-5.5","provider":"openai","segment_id":"chat.splitView.dropSplit","source_path":"ui/src/i18n/locales/nl.ts","src_lang":"en","text":"Split","text_hash":"32afaa784333648025e24b162bece7474051bcaaa29e98e19922b400b4ceb04b","tgt_lang":"nl","translated":"Splitsen","updated_at":"2026-07-06T22:56:38.316Z"}
{"cache_key":"ce7f256609a2bf160d44331f0c5277864a36f9c0f9ee4c7c64a50fd39e3b917d","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.workspaceFiles.label","source_path":"ui/src/i18n/locales/nl.ts","src_lang":"en","text":"Session workspace","text_hash":"c0e8ea0cf983d14e8ba3f8fc28976954d637fd50f807c69e9695715fd2384b78","tgt_lang":"nl","translated":"Sessiewerkruimte","updated_at":"2026-06-16T14:18:17.492Z"}
{"cache_key":"cef8e7ca7aa858ae93e78b6e22483364b1ba7a2d4562b98fef26981db9cfcf55","model":"gpt-5.5","provider":"openai","segment_id":"workboard.eventAttachmentAdded","source_path":"ui/src/i18n/locales/nl.ts","src_lang":"en","text":"Attachment added","text_hash":"f39a309fb0054d8e6c512733d6f3a4791c6b63157a388d72f635574d98b49b3e","tgt_lang":"nl","translated":"Bijlage toegevoegd","updated_at":"2026-05-30T15:38:50.257Z"}
{"cache_key":"cf13a84f99451bc287c6e2bf80a263868297f1404f553fa69fe3e0fb98d6d20d","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.workspaceFiles.changedCount","source_path":"ui/src/i18n/locales/nl.ts","src_lang":"en","text":"{count} changed","text_hash":"db3cb1c116f0a410592fe8556a43513156ce84faa3b69de7e68635474b2f6a10","tgt_lang":"nl","translated":"{count} gewijzigd","updated_at":"2026-06-16T14:18:24.009Z"}
+4 -4
View File
@@ -1,11 +1,11 @@
{
"fallbackKeys": [],
"generatedAt": "2026-07-06T23:41:14.107Z",
"generatedAt": "2026-07-07T02:26:52.916Z",
"locale": "pl",
"model": "gpt-5.5",
"provider": "openai",
"sourceHash": "ff787c22bac9fbc29702f49e4a9062521d338fed4c8a2b97fec21bf52ee0892e",
"totalKeys": 1666,
"translatedKeys": 1666,
"sourceHash": "378b4e5380384a33d9e31a49a5483cdb991245705193e067d5fb8c5311bc20fb",
"totalKeys": 1668,
"translatedKeys": 1668,
"workflow": 1
}
+4 -4
View File
@@ -1,11 +1,11 @@
{
"fallbackKeys": [],
"generatedAt": "2026-07-06T23:40:46.283Z",
"generatedAt": "2026-07-07T02:26:51.461Z",
"locale": "pt-BR",
"model": "gpt-5.5",
"provider": "openai",
"sourceHash": "ff787c22bac9fbc29702f49e4a9062521d338fed4c8a2b97fec21bf52ee0892e",
"totalKeys": 1666,
"translatedKeys": 1666,
"sourceHash": "378b4e5380384a33d9e31a49a5483cdb991245705193e067d5fb8c5311bc20fb",
"totalKeys": 1668,
"translatedKeys": 1668,
"workflow": 1
}
+2
View File
@@ -53,6 +53,7 @@
{"cache_key":"2cc26199dd8364292a5bf914820a7968ec35b8829f5377edd895c2198dad2ff4","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.emptyFilteredTitle","source_path":"ui/src/i18n/locales/pt-BR.ts","src_lang":"en","text":"No cards match this view","text_hash":"a272617e183ba1dff3f7f140d0851b64baf95f4827ff729d23dfeb05c2069875","tgt_lang":"pt-BR","translated":"Nenhum cartão corresponde a esta visualização","updated_at":"2026-06-17T14:13:19.801Z"}
{"cache_key":"2d440683dcdc1f2a6014267ec37197b9401f2088180d948a601d177fd739b218","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.autoRefresh","source_path":"ui/src/i18n/locales/pt-BR.ts","src_lang":"en","text":"Auto-refresh","text_hash":"9ea4d7fd1550f0866089d18b1344546bfed91502b41c0484d6023ceb0fdeb75c","tgt_lang":"pt-BR","translated":"Atualização automática","updated_at":"2026-06-17T14:13:15.046Z"}
{"cache_key":"2d72431956bb4e3f2f59aa41d8c8b830e7aa07d8270f585ee9abcf1a56c33a6f","model":"gpt-5.5","provider":"openai","segment_id":"sessionsView.dateThisWeek","source_path":"ui/src/i18n/locales/pt-BR.ts","src_lang":"en","text":"This week","text_hash":"8c4eef5ab2532515ef24a662db70f6e5b8063c7f924342b2a463f763f1091634","tgt_lang":"pt-BR","translated":"Esta semana","updated_at":"2026-07-05T14:39:34.196Z"}
{"cache_key":"2e70ed1778cd433ffa352c27e101e5654b5249ab0556685513c6a4526cd4a648","model":"gpt-5.5","provider":"openai","segment_id":"chat.splitView.dropSplit","source_path":"ui/src/i18n/locales/pt-BR.ts","src_lang":"en","text":"Split","text_hash":"32afaa784333648025e24b162bece7474051bcaaa29e98e19922b400b4ceb04b","tgt_lang":"pt-BR","translated":"Dividir","updated_at":"2026-07-06T22:56:16.035Z"}
{"cache_key":"2e728de38c036086ac443c7963c6eb7f8cdef8a1d6bc161e7d428afd7ad4fb02","model":"gpt-5.5","provider":"openai","segment_id":"chat.composer.microphoneInput","source_path":"ui/src/i18n/locales/pt-BR.ts","src_lang":"en","text":"Microphone input","text_hash":"5c8a6025b9d96fb0c090d33c9def15ee64aa520a83cf5d64c784b4f0699bb15e","tgt_lang":"pt-BR","translated":"Entrada de microfone","updated_at":"2026-07-06T17:33:35.115Z"}
{"cache_key":"2e96fe8a39f2d5d5c4540db5ecfd13fafafb36f7f917e21c16c127802a547db4","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.composer.talkVoice","source_path":"ui/src/i18n/locales/pt-BR.ts","src_lang":"en","text":"Voice","text_hash":"87bf2bc08589f0bd4a078db145c34ad5e14b8fda53c3ae65b78601294913df95","tgt_lang":"pt-BR","translated":"Voz","updated_at":"2026-07-06T20:20:02.809Z"}
{"cache_key":"2eeef23403bf900df82006215ad440ee45b24cb7e75801167765f7bef800171b","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.detailOperatorNotes","source_path":"ui/src/i18n/locales/pt-BR.ts","src_lang":"en","text":"Operator notes","text_hash":"7d2a121620cebfb9c4f6c0f82b693b75d65a4210b8232d77ef87e45fce334347","tgt_lang":"pt-BR","translated":"Notas do operador","updated_at":"2026-06-16T14:13:11.260Z"}
@@ -202,6 +203,7 @@
{"cache_key":"e27861e63616e21a32b7e6de4e3886ef63ff3054ffcfe40c0546181f1d5b3123","model":"gpt-5.5","provider":"openai","segment_id":"sessionsView.groupByAgent","source_path":"ui/src/i18n/locales/pt-BR.ts","src_lang":"en","text":"Agent","text_hash":"11b39c93777e8f1f3983bdba7c72b22fe68cfea20c677e9de53e17cb7dbfb19f","tgt_lang":"pt-BR","translated":"Agente","updated_at":"2026-07-05T14:39:34.196Z"}
{"cache_key":"e31cd66e142bae39642471c7b1981a3205507bfaaae9d715bc162caa0faad452","model":"gpt-5.5","provider":"openai","segment_id":"workboard.badgeAttachments","source_path":"ui/src/i18n/locales/pt-BR.ts","src_lang":"en","text":"{count} attachments","text_hash":"7bb1847693bc91e6e4624d996a96840396a71052786ab143ccb47fbdaa77cf41","tgt_lang":"pt-BR","translated":"{count} anexos","updated_at":"2026-05-30T15:38:08.357Z"}
{"cache_key":"e67fbd2381e4037fa51378a2553b422e7e84ad182a1ef99f80223a2c5849af61","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.workspaceFiles.refresh","source_path":"ui/src/i18n/locales/pt-BR.ts","src_lang":"en","text":"Refresh session workspace","text_hash":"c7a97b20a3a3ce348239c4893c99f1902d44877567cb32f752c30cdfbc9a2468","tgt_lang":"pt-BR","translated":"Atualizar espaço de trabalho da sessão","updated_at":"2026-06-16T14:13:17.394Z"}
{"cache_key":"e9f2b19159823e2c1f2fbcf5c13d56bd99778ebf90f0a0f7cbc3ef62ac134364","model":"gpt-5.5","provider":"openai","segment_id":"chat.splitView.dropOpenHere","source_path":"ui/src/i18n/locales/pt-BR.ts","src_lang":"en","text":"Open here","text_hash":"b08e2fd2e872adcb575b305187b9db8482369325806953ce80190fc2dc1ab9fb","tgt_lang":"pt-BR","translated":"Abrir aqui","updated_at":"2026-07-06T22:56:16.035Z"}
{"cache_key":"ea39326411d6647b16a232138b1b10db501ed97ae30a19983787088f7259b6b7","model":"gpt-5.5","provider":"openai","segment_id":"sessionsView.dragSessionHint","source_path":"ui/src/i18n/locales/pt-BR.ts","src_lang":"en","text":"Drag to move between groups","text_hash":"3e8692b1cd1c1f9a606a779f1037aa390c885fde224ddb841df9259e8aab03ae","tgt_lang":"pt-BR","translated":"Arraste para mover entre grupos","updated_at":"2026-07-05T14:39:34.196Z"}
{"cache_key":"ea9deb7b47e4cdfa527378dcdc35ca2a92b1c3afa75d8071627f2b3c76f34320","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.workspaceFiles.read","source_path":"ui/src/i18n/locales/pt-BR.ts","src_lang":"en","text":"Read","text_hash":"9b9a8d05a7ec353bda84f9c1bb3178c299de3001b5e970508ddc889c487f92ca","tgt_lang":"pt-BR","translated":"Lido","updated_at":"2026-06-16T14:13:25.058Z"}
{"cache_key":"eb37354b7038031ee05185ebdece89d174157129408775a325a71dda5fa297f8","model":"gpt-5.5","provider":"openai","segment_id":"sessionsView.renameGroupPrompt","source_path":"ui/src/i18n/locales/pt-BR.ts","src_lang":"en","text":"Rename group","text_hash":"98d254a311d0e820bb8739eb28d4e1eb5fc1cfc34f755167759864cd15504b4c","tgt_lang":"pt-BR","translated":"Renomear grupo","updated_at":"2026-07-06T23:40:46.278Z"}
+4 -4
View File
@@ -1,11 +1,11 @@
{
"fallbackKeys": [],
"generatedAt": "2026-07-06T23:41:27.248Z",
"generatedAt": "2026-07-07T02:26:53.508Z",
"locale": "ru",
"model": "gpt-5.5",
"provider": "openai",
"sourceHash": "ff787c22bac9fbc29702f49e4a9062521d338fed4c8a2b97fec21bf52ee0892e",
"totalKeys": 1666,
"translatedKeys": 1666,
"sourceHash": "378b4e5380384a33d9e31a49a5483cdb991245705193e067d5fb8c5311bc20fb",
"totalKeys": 1668,
"translatedKeys": 1668,
"workflow": 1
}
+2
View File
@@ -705,6 +705,7 @@
{"cache_key":"6f307c5a799a35f0deefaf82f76869d0b21f58d5ab9ba00a787ed1528f539a4f","model":"gpt-5.5","provider":"openai","segment_id":"dreaming.advanced.emptyShortTerm","source_path":"ui/src/i18n/locales/ru.ts","src_lang":"en","text":"No short-term entries to inspect.","text_hash":"2da0eeafc31b59fa5ff2c473c82b4d2589378ff500e4e06d5daad8ce3988a6e9","tgt_lang":"ru","translated":"Нет краткосрочных записей для просмотра.","updated_at":"2026-06-26T21:40:48.120Z"}
{"cache_key":"6f387d2c95e9e205da08aad7d98c2448e2ccca87444c9f335198721a7961dd90","model":"gpt-5.5","provider":"openai","segment_id":"cron.jobs.emptyHint","source_path":"ui/src/i18n/locales/ru.ts","src_lang":"en","text":"Create one from a plain-language prompt; advanced fields can wait.","text_hash":"be6372063cab6a5d3b0c9764e1eb1f0b59cfff12aafc6eca771fff1570779ef7","tgt_lang":"ru","translated":"Создайте задание с помощью запроса на обычном языке; расширенные поля можно заполнить позже.","updated_at":"2026-06-26T21:42:21.706Z"}
{"cache_key":"6f40f06099aa2f03ebed14fd3322c6123b2f44c6bbb2554a22ee8d1a6ebee2b1","model":"gpt-5.5","provider":"openai","segment_id":"tabs.dreams","source_path":"ui/src/i18n/locales/ru.ts","src_lang":"en","text":"Dreaming","text_hash":"c82c37f336bc03f4c2a8f4896faab890ee3b96b54f5cea23c72d82b7c7540d16","tgt_lang":"ru","translated":"Сновидения","updated_at":"2026-06-26T21:39:27.659Z"}
{"cache_key":"6f42063f9aefcf5479b0e6fd3f88753ca2101b8b499405562f0bb081608337da","model":"gpt-5.5","provider":"openai","segment_id":"chat.splitView.dropSplit","source_path":"ui/src/i18n/locales/ru.ts","src_lang":"en","text":"Split","text_hash":"32afaa784333648025e24b162bece7474051bcaaa29e98e19922b400b4ceb04b","tgt_lang":"ru","translated":"Разделить","updated_at":"2026-07-06T22:56:41.513Z"}
{"cache_key":"6f50bd2c99e8a4b9b87c94d33b08962afe00adca45e97940d595933e24505d89","model":"gpt-5.5","provider":"openai","segment_id":"overview.quickActions.refreshAll","source_path":"ui/src/i18n/locales/ru.ts","src_lang":"en","text":"Refresh All","text_hash":"e0463641297da021b6f6e1e6f914442c613282e06813cf4d6b73ce97e1d946ac","tgt_lang":"ru","translated":"Обновить все","updated_at":"2026-06-26T21:40:31.548Z"}
{"cache_key":"6fe8b8b82b119b4508deecc7000b03f4aa91fbc7c629a8c4d81162301798783a","model":"gpt-5.5","provider":"openai","segment_id":"dreaming.advanced.sortSignals","source_path":"ui/src/i18n/locales/ru.ts","src_lang":"en","text":"Strongest support","text_hash":"7a78c39506cf7151ca2ccb1b378c3c35e0fb551c4d15aea0c404e86de10f6244","tgt_lang":"ru","translated":"Самая сильная поддержка","updated_at":"2026-06-26T21:40:44.743Z"}
{"cache_key":"6fecd6ee23d5eb414d117d6973da837445e38b3f0f43dcd4dde303c2cead6da6","model":"gpt-5.5","provider":"openai","segment_id":"chat.splitView.splitRight","source_path":"ui/src/i18n/locales/ru.ts","src_lang":"en","text":"Split right","text_hash":"aa9997bb1d8c23d0b88521c4093fc8c3ee01b187f78635ae4d3e16d27e8a8475","tgt_lang":"ru","translated":"Разделить вправо","updated_at":"2026-07-06T07:24:46.448Z"}
@@ -1502,6 +1503,7 @@
{"cache_key":"f86e511303df40c74db4a1e9ad9803c68716427fbdba55e442a64433d69eb5ad","model":"gpt-5.5","provider":"openai","segment_id":"sessionsView.filters","source_path":"ui/src/i18n/locales/ru.ts","src_lang":"en","text":"Filters","text_hash":"546ebb8eb993ea561029d9febd84c363bdb09010bb2cb915a8287762b76b9a64","tgt_lang":"ru","translated":"Фильтры","updated_at":"2026-06-26T21:38:48.084Z"}
{"cache_key":"f8d1664c037238e7b7966b8af30a892ceffd853ee093dcda14325c2e08271995","model":"gpt-5.5","provider":"openai","segment_id":"common.reloadConfig","source_path":"ui/src/i18n/locales/ru.ts","src_lang":"en","text":"Reload Config","text_hash":"48e6315352561c36be84097326fbb3558b4c2fa3fc4f833402d32040ccb640f7","tgt_lang":"ru","translated":"Перезагрузить конфигурацию","updated_at":"2026-06-26T21:38:30.975Z"}
{"cache_key":"f8d36cbffbfdec2566a29cc23f954616dee2fc091172edc9c98a74ea674d6328","model":"gpt-5.5","provider":"openai","segment_id":"sessionsView.dateToday","source_path":"ui/src/i18n/locales/ru.ts","src_lang":"en","text":"Today","text_hash":"2b065c7c9ce466e5ebcad757987d5d660ee4c9ea708bc62c43444b53334738ba","tgt_lang":"ru","translated":"Сегодня","updated_at":"2026-06-26T21:40:56.975Z"}
{"cache_key":"f8f19313d5c89afd52c6594b2f4a9eee73b587ceb58b5f736f9ba7362da03982","model":"gpt-5.5","provider":"openai","segment_id":"chat.splitView.dropOpenHere","source_path":"ui/src/i18n/locales/ru.ts","src_lang":"en","text":"Open here","text_hash":"b08e2fd2e872adcb575b305187b9db8482369325806953ce80190fc2dc1ab9fb","tgt_lang":"ru","translated":"Открыть здесь","updated_at":"2026-07-06T22:56:41.513Z"}
{"cache_key":"f8f59741ac91cc1e5f791e8212b5da7c29534ba58a4190f06ce5b374bc0785d0","model":"gpt-5.5","provider":"openai","segment_id":"usage.providerUsage.outputTokens","source_path":"ui/src/i18n/locales/ru.ts","src_lang":"en","text":"{count} output","text_hash":"e433f6601aaa1a1cce63c5ca6b15fddd247bf53697d09171d25592f70f2e949a","tgt_lang":"ru","translated":"{count} выходных токенов","updated_at":"2026-07-06T06:40:15.357Z"}
{"cache_key":"f90e2afa75fd28c2343eb5d1d7a1d93d752908b82541467b72f068efd06b0b5d","model":"gpt-5.5","provider":"openai","segment_id":"worktrees.repo","source_path":"ui/src/i18n/locales/ru.ts","src_lang":"en","text":"Repository","text_hash":"13d6ff07b8a5d792ec87d5ec83bff2730ee77fa8f4fcd89ca5f1d688f64b4c73","tgt_lang":"ru","translated":"Репозиторий","updated_at":"2026-07-05T21:01:47.002Z"}
{"cache_key":"f916c281d5f241348f6f364e7942c224b9012e916e535e12186a3853b5147be1","model":"gpt-5.5","provider":"openai","segment_id":"chat.pairingQrExpired.badge","source_path":"ui/src/i18n/locales/ru.ts","src_lang":"en","text":"Expired","text_hash":"424a2551d356754c882d04ac16c63e6b50b80b159549d23231001f629455756e","tgt_lang":"ru","translated":"Истек","updated_at":"2026-07-02T14:31:15.337Z"}
+4 -4
View File
@@ -1,11 +1,11 @@
{
"fallbackKeys": [],
"generatedAt": "2026-07-06T23:41:15.867Z",
"generatedAt": "2026-07-07T02:26:53.032Z",
"locale": "th",
"model": "gpt-5.5",
"provider": "openai",
"sourceHash": "ff787c22bac9fbc29702f49e4a9062521d338fed4c8a2b97fec21bf52ee0892e",
"totalKeys": 1666,
"translatedKeys": 1666,
"sourceHash": "378b4e5380384a33d9e31a49a5483cdb991245705193e067d5fb8c5311bc20fb",
"totalKeys": 1668,
"translatedKeys": 1668,
"workflow": 1
}
+2
View File
@@ -164,11 +164,13 @@
{"cache_key":"b7bd1f8e778ba585d2499f544bb64489e0cd919df3fa332c472d50d4fa96251c","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.autoRefresh15s","source_path":"ui/src/i18n/locales/th.ts","src_lang":"en","text":"15s","text_hash":"21b5f52ded33ab19c16a680c4e280b8f9992395b514290163abf272f06394a6f","tgt_lang":"th","translated":"15 วินาที","updated_at":"2026-06-17T14:16:55.187Z"}
{"cache_key":"b82a6688135e77e9c30819144f64667232cf33c3d8c513311ca361bdeb407d32","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.detailTitle","source_path":"ui/src/i18n/locales/th.ts","src_lang":"en","text":"Card details","text_hash":"93985f84673405070ffdf7e6f64175caff0f2c489c10e40627718525e79af631","tgt_lang":"th","translated":"รายละเอียดการ์ด","updated_at":"2026-06-16T14:17:16.747Z"}
{"cache_key":"b8ea0d4df287b5ae12bdd9e1dadabb00569abed296d1c605afbbcff7eeda1c3d","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.detailTask","source_path":"ui/src/i18n/locales/th.ts","src_lang":"en","text":"Gateway task","text_hash":"6696e7c592238747dd39d7ba000db600a92f843add73ee90b028c72a2dfd37dd","tgt_lang":"th","translated":"งาน Gateway","updated_at":"2026-06-16T14:17:16.747Z"}
{"cache_key":"ba84c92a20667c397bb9f23df0432459ef2c42b0319eed08f493b56dc9886ae4","model":"gpt-5.5","provider":"openai","segment_id":"chat.splitView.dropSplit","source_path":"ui/src/i18n/locales/th.ts","src_lang":"en","text":"Split","text_hash":"32afaa784333648025e24b162bece7474051bcaaa29e98e19922b400b4ceb04b","tgt_lang":"th","translated":"แยก","updated_at":"2026-07-06T22:56:35.269Z"}
{"cache_key":"bad4530a9d88678677a333a214edbef1ee1feda76032a4e9bc7897fb627be5b4","model":"gpt-5.5","provider":"openai","segment_id":"chat.composer.loadingMicrophones","source_path":"ui/src/i18n/locales/th.ts","src_lang":"en","text":"Loading microphones…","text_hash":"042a481c407f31b97b0cc8ff4e6c8b8f3f6e85d798cba8549c348d6d33a9945c","tgt_lang":"th","translated":"กำลังโหลดไมโครโฟน…","updated_at":"2026-07-06T17:34:01.837Z"}
{"cache_key":"badee6b9e90cf4d48a5437e16b224ac95203d808cf3b2630461fef00e57c48c4","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.detailAutomationWorkspace","source_path":"ui/src/i18n/locales/th.ts","src_lang":"en","text":"Workspace: {workspace}","text_hash":"17f5e696e557a646a9003fc8448f6f6761f5fe6bdf7478f750f471496e87c17b","tgt_lang":"th","translated":"พื้นที่ทำงาน: {workspace}","updated_at":"2026-06-16T14:17:16.747Z"}
{"cache_key":"bd15fbd4aae4a9f2d33a8560b09707ad2c2d2ab01837d46df2ab654f7be9c2c7","model":"gpt-5.5","provider":"openai","segment_id":"workboard.badgeWorkerProtocol","source_path":"ui/src/i18n/locales/th.ts","src_lang":"en","text":"worker {state}","text_hash":"f16b9e04d42182b421ce4f4e982b2ef75fab9bd581bdc8b87e62899ba28de11c","tgt_lang":"th","translated":"worker {state}","updated_at":"2026-05-30T15:38:44.763Z"}
{"cache_key":"bdb0d8aa3825f469d703aca5d30b55d316308bc7a2a473d6012e0d18a5dc1513","model":"gpt-5.5","provider":"openai","segment_id":"chat.composer.contextUsage.summary","source_path":"ui/src/i18n/locales/th.ts","src_lang":"en","text":"Session context usage: {used} of {limit} ({pct}%)","text_hash":"a62b97af0e5d02b8722725e2be0a936dd3d317a1f506ea15c766e87413b66a0d","tgt_lang":"th","translated":"การใช้บริบทของเซสชัน: {used} จาก {limit} ({pct}%)","updated_at":"2026-07-05T10:16:28.752Z"}
{"cache_key":"c13f9139970832fe4a46a22f485a4144c95ffbd8339d8225c7734a857c9d8fd9","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.workspaceFiles.browser","source_path":"ui/src/i18n/locales/th.ts","src_lang":"en","text":"Project files","text_hash":"2a3d9a240c9206964ee7237a1d99fda05ed501a485262e18f33c446c9f735d1c","tgt_lang":"th","translated":"ไฟล์โปรเจกต์","updated_at":"2026-06-16T14:17:36.173Z"}
{"cache_key":"c1f38f9de79ea8dde83f267f5a05fa5ec3f08336d592e14e9b48918ed19a2840","model":"gpt-5.5","provider":"openai","segment_id":"chat.splitView.dropOpenHere","source_path":"ui/src/i18n/locales/th.ts","src_lang":"en","text":"Open here","text_hash":"b08e2fd2e872adcb575b305187b9db8482369325806953ce80190fc2dc1ab9fb","tgt_lang":"th","translated":"เปิดที่นี่","updated_at":"2026-07-06T22:56:35.269Z"}
{"cache_key":"c3cfcb94e542aabbb0056e14f4de6974ba01e71dc0039b0ce5ff5efb6c0af3d0","model":"claude-opus-4-8","provider":"anthropic","segment_id":"cron.jobDetail.cwd","source_path":"ui/src/i18n/locales/th.ts","src_lang":"en","text":"CWD","text_hash":"0217f1cb7725737f15a6710df3bcfa3bc10a239f0f7801ec3d7168e675f5ebd6","tgt_lang":"th","translated":"CWD","updated_at":"2026-06-16T14:17:40.285Z"}
{"cache_key":"c4d1fed3ad0cc1f443682b1e4801ee6438bd17c5181bee912fbd1bdc67d68fd4","model":"gpt-5.5","provider":"openai","segment_id":"chat.splitView.splitRight","source_path":"ui/src/i18n/locales/th.ts","src_lang":"en","text":"Split right","text_hash":"aa9997bb1d8c23d0b88521c4093fc8c3ee01b187f78635ae4d3e16d27e8a8475","tgt_lang":"th","translated":"แบ่งไปทางขวา","updated_at":"2026-07-06T07:24:12.973Z"}
{"cache_key":"c522aa383c390d7d68c659d4b320ca2052aa6534ebb6437180f267360f7c8b9b","model":"gpt-5.5","provider":"openai","segment_id":"worktrees.confirmForceDelete","source_path":"ui/src/i18n/locales/th.ts","src_lang":"en","text":"Snapshot failed: {error}\n\nDelete without a snapshot?","text_hash":"200ce9b8fb04659df79e1d26e69ec1014631ad5a85a92130dbdb9fcb550ba34f","tgt_lang":"th","translated":"สร้างสแนปช็อตไม่สำเร็จ: {error}\n\nลบโดยไม่มีสแนปช็อตหรือไม่?","updated_at":"2026-07-05T21:01:30.011Z"}
+4 -4
View File
@@ -1,11 +1,11 @@
{
"fallbackKeys": [],
"generatedAt": "2026-07-06T23:41:07.087Z",
"generatedAt": "2026-07-07T02:26:52.541Z",
"locale": "tr",
"model": "gpt-5.5",
"provider": "openai",
"sourceHash": "ff787c22bac9fbc29702f49e4a9062521d338fed4c8a2b97fec21bf52ee0892e",
"totalKeys": 1666,
"translatedKeys": 1666,
"sourceHash": "378b4e5380384a33d9e31a49a5483cdb991245705193e067d5fb8c5311bc20fb",
"totalKeys": 1668,
"translatedKeys": 1668,
"workflow": 1
}
+2
View File
@@ -98,6 +98,7 @@
{"cache_key":"6d88c150bd277aaa537ae3055d71b0e223669d7a29523d84c684287de408a80f","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.workspaceFiles.preview","source_path":"ui/src/i18n/locales/tr.ts","src_lang":"en","text":"Preview","text_hash":"324b134f57c70c729ae3dc4d298bb451656717d70523e942c1ce667b8024ea07","tgt_lang":"tr","translated":"Önizleme","updated_at":"2026-06-16T14:15:58.007Z"}
{"cache_key":"6dd4e221a22ba8d118a0d14f1480bc2fa116773cf6565aa48139c7e51a4b876d","model":"gpt-5.5","provider":"openai","segment_id":"sessionsView.deleteGroupMenu","source_path":"ui/src/i18n/locales/tr.ts","src_lang":"en","text":"Delete group…","text_hash":"996ee6f0d878196a0b88da2c0c3dc44c65428e3ffb7097d0ecae054154654675","tgt_lang":"tr","translated":"Grubu sil…","updated_at":"2026-07-06T23:41:07.084Z"}
{"cache_key":"6e26905dc1b186b14367c6edcec7393195733683e8747bb6d8170003d9faed74","model":"gpt-5.5","provider":"openai","segment_id":"chat.composer.microphoneListUnsupported","source_path":"ui/src/i18n/locales/tr.ts","src_lang":"en","text":"This browser cannot list microphone inputs.","text_hash":"fa99f66cc346509afe8c5e3437ad299409a60be69d8b2b70138d8c42176052d9","tgt_lang":"tr","translated":"Bu tarayıcı mikrofon girişlerini listeleyemiyor.","updated_at":"2026-07-06T17:56:54.065Z"}
{"cache_key":"6e99e58afea4dd163235745577c624405d4e8a8869577cbc18b882ff7410ba1e","model":"gpt-5.5","provider":"openai","segment_id":"chat.splitView.dropSplit","source_path":"ui/src/i18n/locales/tr.ts","src_lang":"en","text":"Split","text_hash":"32afaa784333648025e24b162bece7474051bcaaa29e98e19922b400b4ceb04b","tgt_lang":"tr","translated":"Böl","updated_at":"2026-07-06T22:56:29.564Z"}
{"cache_key":"6ecaf32bd6b038b29b99f4a5752a25ff239024274ab56573736f77975e413e97","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.workspaceFiles.empty","source_path":"ui/src/i18n/locales/tr.ts","src_lang":"en","text":"No files touched in this session yet","text_hash":"6b295e4e11bcdd52340c4cc7987565f848cf477a1f0b96c0f47a2b718418298e","tgt_lang":"tr","translated":"Bu oturumda henüz hiçbir dosyaya dokunulmadı","updated_at":"2026-06-16T14:15:44.904Z"}
{"cache_key":"6ece2e2648fede9d3b6c310b32cad183b97eff6e8c30f760f6567a1d1213ddbb","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.viewMissingProof","source_path":"ui/src/i18n/locales/tr.ts","src_lang":"en","text":"Missing proof","text_hash":"b46debe888e32eec183dc5936c79d22ea43bec580c410c2b3c1aa24aaa75d677","tgt_lang":"tr","translated":"Kanıt eksik","updated_at":"2026-06-17T14:15:34.754Z"}
{"cache_key":"6f13df8b845a7b2e26bcb704017fccd1d1cb5ee46ab204b6440e3dcfc0f7a63e","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.viewRecentlyDone","source_path":"ui/src/i18n/locales/tr.ts","src_lang":"en","text":"Recently done","text_hash":"46b889592a2f5e79197f62b5f96c76993545626bf207740ea58632ceed9623be","tgt_lang":"tr","translated":"Son tamamlananlar","updated_at":"2026-06-17T14:15:34.754Z"}
@@ -208,6 +209,7 @@
{"cache_key":"eaa8338820ff1ee2d48719a4b881d13c98a90afaf64d1b4771d74fd0bcc2ea18","model":"gpt-5.5","provider":"openai","segment_id":"worktrees.status","source_path":"ui/src/i18n/locales/tr.ts","src_lang":"en","text":"Status","text_hash":"920e413c7d411b61ef3e8c63b1cb6ad058d5f95f8b481dbafe60248387d8c355","tgt_lang":"tr","translated":"Durum","updated_at":"2026-07-05T21:01:15.459Z"}
{"cache_key":"ef076ed851ac04302da699a1cb853733152b535c91f035429a64dcbf6a7f0d9e","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.workspaceFiles.root","source_path":"ui/src/i18n/locales/tr.ts","src_lang":"en","text":"Root","text_hash":"44cb005ee2e65d9cc817b0a083579369fb6c24a4be728cb43fd9d4c3ca7f4c2e","tgt_lang":"tr","translated":"Kök","updated_at":"2026-06-16T14:15:55.679Z"}
{"cache_key":"efa08e578bca0a9d95b888d1e705a3f9a52217aa93bf23b853eae16fdc18868e","model":"gpt-5.5","provider":"openai","segment_id":"usage.providerUsage.inputTokens","source_path":"ui/src/i18n/locales/tr.ts","src_lang":"en","text":"{count} input","text_hash":"f24231cff78fed82d155712973ede6f9369e96b015acc30d5de2b740677edce9","tgt_lang":"tr","translated":"{count} giriş belirteci","updated_at":"2026-07-06T06:40:15.357Z"}
{"cache_key":"f0a7a04b0f7ae959edd0746e81aa24fc5c01a3bc67e8d9b588037284b04d01c3","model":"gpt-5.5","provider":"openai","segment_id":"chat.splitView.dropOpenHere","source_path":"ui/src/i18n/locales/tr.ts","src_lang":"en","text":"Open here","text_hash":"b08e2fd2e872adcb575b305187b9db8482369325806953ce80190fc2dc1ab9fb","tgt_lang":"tr","translated":"Burada aç","updated_at":"2026-07-06T22:56:29.564Z"}
{"cache_key":"f0aa575b9c8b229574dd918c574821d2cf1b52f60f014b88c2a556ddd3538639","model":"gpt-5.5","provider":"openai","segment_id":"tabs.mcp","source_path":"ui/src/i18n/locales/tr.ts","src_lang":"en","text":"MCP","text_hash":"53f13ae99ed53bd346eb8e1c8cefb7ef8260683b50401caf101360967ea052aa","tgt_lang":"tr","translated":"MCP","updated_at":"2026-05-31T05:36:46.292Z"}
{"cache_key":"f269e0584fa4c79357ebddf2841dd009af4e1512ff0ec8fafb7ef4f75c33a560","model":"gpt-5.5","provider":"openai","segment_id":"chat.composer.microphoneFallback","source_path":"ui/src/i18n/locales/tr.ts","src_lang":"en","text":"Microphone {number}","text_hash":"357eae20db9739dfdbb59ec21db70200f6ca9ee257c28ed637712f147af419ec","tgt_lang":"tr","translated":"Mikrofon {number}","updated_at":"2026-07-06T17:56:54.065Z"}
{"cache_key":"f3eb09f69c1f31341c5bba3f15096d252ebb520a5df89b538135ebc3d83b6925","model":"gpt-5.5","provider":"openai","segment_id":"chat.composer.noMicrophones","source_path":"ui/src/i18n/locales/tr.ts","src_lang":"en","text":"No additional microphones found","text_hash":"a6e4a20dda44dead8daa06da30fca7e7d90fa5aa4c15cbada30af1f52874d347","tgt_lang":"tr","translated":"Ek mikrofon bulunamadı","updated_at":"2026-07-06T17:33:54.041Z"}
+4 -4
View File
@@ -1,11 +1,11 @@
{
"fallbackKeys": [],
"generatedAt": "2026-07-06T23:41:10.450Z",
"generatedAt": "2026-07-07T02:26:52.666Z",
"locale": "uk",
"model": "gpt-5.5",
"provider": "openai",
"sourceHash": "ff787c22bac9fbc29702f49e4a9062521d338fed4c8a2b97fec21bf52ee0892e",
"totalKeys": 1666,
"translatedKeys": 1666,
"sourceHash": "378b4e5380384a33d9e31a49a5483cdb991245705193e067d5fb8c5311bc20fb",
"totalKeys": 1668,
"translatedKeys": 1668,
"workflow": 1
}
+4 -4
View File
@@ -1,11 +1,11 @@
{
"fallbackKeys": [],
"generatedAt": "2026-07-06T23:41:17.643Z",
"generatedAt": "2026-07-07T02:26:53.149Z",
"locale": "vi",
"model": "gpt-5.5",
"provider": "openai",
"sourceHash": "ff787c22bac9fbc29702f49e4a9062521d338fed4c8a2b97fec21bf52ee0892e",
"totalKeys": 1666,
"translatedKeys": 1666,
"sourceHash": "378b4e5380384a33d9e31a49a5483cdb991245705193e067d5fb8c5311bc20fb",
"totalKeys": 1668,
"translatedKeys": 1668,
"workflow": 1
}
+2
View File
@@ -96,6 +96,7 @@
{"cache_key":"5fb21ed031fab4b2929050fac823e8407d8772434740bee3c03ce6a94585234e","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.ageHours","source_path":"ui/src/i18n/locales/vi.ts","src_lang":"en","text":"{count}h","text_hash":"5828ef1c1e95e0bae1c98548d1795a2482cc8e14a8b161b183960a06018ce10d","tgt_lang":"vi","translated":"{count}h","updated_at":"2026-06-17T14:17:32.599Z"}
{"cache_key":"60b2771d5ca89ca701f8c340ca5963df2a3770c233fc2835ee6c27d7e0a2fb79","model":"gpt-5.5","provider":"openai","segment_id":"worktrees.title","source_path":"ui/src/i18n/locales/vi.ts","src_lang":"en","text":"Managed Worktrees","text_hash":"dde32010185098a47e873fb25dd99446b0cb1a75614068587f7cd0bffb5aed18","tgt_lang":"vi","translated":"Worktree được quản lý","updated_at":"2026-07-05T21:01:34.014Z"}
{"cache_key":"60b914baf813cd34a8942785e4e29ec278c7b5cd615241a0ab76088178e578d9","model":"gpt-5.5","provider":"openai","segment_id":"terminal.detached","source_path":"ui/src/i18n/locales/vi.ts","src_lang":"en","text":"detached","text_hash":"88e34e4cdbb5c6066cb1b0d0abe74714bd72f86259433bc8287614e4ae052605","tgt_lang":"vi","translated":"đã tách","updated_at":"2026-07-04T21:24:04.456Z"}
{"cache_key":"611a8dac5e35eabb5527decc9b97df09907e2a85a53ca2544b9827790eda9c8c","model":"gpt-5.5","provider":"openai","segment_id":"chat.splitView.dropOpenHere","source_path":"ui/src/i18n/locales/vi.ts","src_lang":"en","text":"Open here","text_hash":"b08e2fd2e872adcb575b305187b9db8482369325806953ce80190fc2dc1ab9fb","tgt_lang":"vi","translated":"Mở tại đây","updated_at":"2026-07-06T22:56:36.739Z"}
{"cache_key":"62549420b352ce02b3febeaa7784233d56c6b36e11dc4027779ee15c35619da8","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.autoRefresh5s","source_path":"ui/src/i18n/locales/vi.ts","src_lang":"en","text":"5s","text_hash":"93e3d8c5b10657d2884f177488b689aadf82a83f962237cb602b3314386ab3b7","tgt_lang":"vi","translated":"5s","updated_at":"2026-06-17T14:17:32.599Z"}
{"cache_key":"638a65e2aabb16aeba45605c352e25d3f1f491bbee0ec98a4802dea1d87ae0b2","model":"gpt-5.5","provider":"openai","segment_id":"subtitles.worktrees","source_path":"ui/src/i18n/locales/vi.ts","src_lang":"en","text":"Isolated agent task checkouts and recovery snapshots.","text_hash":"bc794dc846493e3c5f88964268af19b7dd818eae942c596002ef4067ba5a3d0c","tgt_lang":"vi","translated":"Các bản checkout tác vụ agent được cô lập và snapshot khôi phục.","updated_at":"2026-07-05T21:01:34.014Z"}
{"cache_key":"667debca469dfeae512c327f1eab61fad4c1cbac25be0ba79ab9903226348146","model":"gpt-5.5","provider":"openai","segment_id":"workboard.eventProtocolViolation","source_path":"ui/src/i18n/locales/vi.ts","src_lang":"en","text":"Protocol violation","text_hash":"367bb2052963f7d75beb672d3ca0430d7d49ac48a2759d578c7df933178fe564","tgt_lang":"vi","translated":"Vi phạm giao thức","updated_at":"2026-05-30T15:38:47.755Z"}
@@ -189,6 +190,7 @@
{"cache_key":"c5ac111d8ed618e49c10f987602b9f893f9041679b87960d39291979c332e2e0","model":"gpt-5.5","provider":"openai","segment_id":"workboard.badgeAttachments","source_path":"ui/src/i18n/locales/vi.ts","src_lang":"en","text":"{count} attachments","text_hash":"7bb1847693bc91e6e4624d996a96840396a71052786ab143ccb47fbdaa77cf41","tgt_lang":"vi","translated":"{count} tệp đính kèm","updated_at":"2026-05-30T15:38:47.755Z"}
{"cache_key":"c6df2a5116d0d089a663fc5434139c780d8db1b6924a974905272efe4cfcf972","model":"gpt-5.5","provider":"openai","segment_id":"worktrees.restore","source_path":"ui/src/i18n/locales/vi.ts","src_lang":"en","text":"Restore","text_hash":"a76e13b9839270eb73ed11417f7d8acca55df0ad52065799361631d0fff74f27","tgt_lang":"vi","translated":"Khôi phục","updated_at":"2026-07-05T21:01:34.014Z"}
{"cache_key":"c774a220b056309855c53b16f81e1afe2ae174a8724ff2a98927ee38112f45f1","model":"gpt-5.5","provider":"openai","segment_id":"chat.composer.microphoneBusy","source_path":"ui/src/i18n/locales/vi.ts","src_lang":"en","text":"Microphone inputs are busy or unavailable to the browser.","text_hash":"9f33c30cb2370916f2edd079ad5cabab6a94dd185a89f4f7db357b4f31d1f3dd","tgt_lang":"vi","translated":"Đầu vào micrô đang bận hoặc không khả dụng với trình duyệt.","updated_at":"2026-07-06T17:57:16.954Z"}
{"cache_key":"c79366c0fb5deb2ae3e5defc41f8b0d884ddae789182784b8af1c7d8ec40508d","model":"gpt-5.5","provider":"openai","segment_id":"chat.splitView.dropSplit","source_path":"ui/src/i18n/locales/vi.ts","src_lang":"en","text":"Split","text_hash":"32afaa784333648025e24b162bece7474051bcaaa29e98e19922b400b4ceb04b","tgt_lang":"vi","translated":"Chia đôi","updated_at":"2026-07-06T22:56:36.739Z"}
{"cache_key":"c8957a8ee0627f74ac54f2ad0f696bf8c9922d35fd381ff9ef8cd40b5ce2c6f9","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.workspaceFiles.actions","source_path":"ui/src/i18n/locales/vi.ts","src_lang":"en","text":"Workspace file actions","text_hash":"461817d921bc7672e95fe4a3b23f4ac2a4a20e35b3d6eef3f02e8f5ba4201050","tgt_lang":"vi","translated":"Thao tác tệp workspace","updated_at":"2026-06-16T14:17:25.261Z"}
{"cache_key":"c944edb2a38f76ff8b901c31fcc84f972d4c81f462bbaff2b1fd38ea2226adbb","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.composer.talkSensitivityHigh","source_path":"ui/src/i18n/locales/vi.ts","src_lang":"en","text":"High","text_hash":"c4ebc6d4a5832cd9415f906ad03661110c705a72381c8b8b145761d02e2dd23a","tgt_lang":"vi","translated":"Cao","updated_at":"2026-07-06T20:20:02.809Z"}
{"cache_key":"c9c84c2bc40c83168861eee263c38ca3b752ccc5064d99038f842ec6c349c6f6","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.workspaceFiles.missing","source_path":"ui/src/i18n/locales/vi.ts","src_lang":"en","text":"Missing","text_hash":"6be36ca49ee85210c5d1ad9c377d90a9859c66d889110a2a5b0dccd390d12e20","tgt_lang":"vi","translated":"Thiếu","updated_at":"2026-06-16T14:17:25.260Z"}
+4 -4
View File
@@ -1,11 +1,11 @@
{
"fallbackKeys": [],
"generatedAt": "2026-07-06T23:40:42.212Z",
"generatedAt": "2026-07-07T02:26:51.014Z",
"locale": "zh-CN",
"model": "gpt-5.5",
"provider": "openai",
"sourceHash": "ff787c22bac9fbc29702f49e4a9062521d338fed4c8a2b97fec21bf52ee0892e",
"totalKeys": 1666,
"translatedKeys": 1666,
"sourceHash": "378b4e5380384a33d9e31a49a5483cdb991245705193e067d5fb8c5311bc20fb",
"totalKeys": 1668,
"translatedKeys": 1668,
"workflow": 1
}
+2
View File
@@ -80,6 +80,7 @@
{"cache_key":"50a5daadc1dd8e76f30020d58f996b528bd77b8b7c379930f05643861e014d36","model":"gpt-5.5","provider":"openai","segment_id":"languages.ru","source_path":"ui/src/i18n/locales/zh-CN.ts","src_lang":"en","text":"Русский (Russian)","text_hash":"ea81bf0fd46410b501bddee074ab6f00b0cdf377a6cafe608dcf2c28f7cb2f4e","tgt_lang":"zh-CN","translated":"Русский(俄语)","updated_at":"2026-06-26T21:43:19.728Z"}
{"cache_key":"51650687c0ab2b5af885ca6be20375b3dd6b4c8a1b22fa946ad0c815baaafd2d","model":"gpt-5.5","provider":"openai","segment_id":"connection.retryNow","source_path":"ui/src/i18n/locales/zh-CN.ts","src_lang":"en","text":"Retry now","text_hash":"5148c3e20576923b589bd801ea84dc376213b82fbf8694f64437b621f1690615","tgt_lang":"zh-CN","translated":"立即重试","updated_at":"2026-07-05T21:54:55.187Z"}
{"cache_key":"51efad7a7ea87c645dc8c1d2ecf08a5db18883a5a6652e7ccd06fa5fe89a06a6","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.badgeHeartbeat","source_path":"ui/src/i18n/locales/zh-CN.ts","src_lang":"en","text":"heartbeat {age}","text_hash":"000637b3800ae069edbbe207cfad0a3f5037f06e9661ee89d70a1dfe6f404485","tgt_lang":"zh-CN","translated":"心跳 {age}","updated_at":"2026-06-17T14:13:17.789Z"}
{"cache_key":"52efd1cfee466f374422e77ece583302bf3dd2cf8356e5f61a3aebed5ac6c2a1","model":"gpt-5.5","provider":"openai","segment_id":"chat.splitView.dropSplit","source_path":"ui/src/i18n/locales/zh-CN.ts","src_lang":"en","text":"Split","text_hash":"32afaa784333648025e24b162bece7474051bcaaa29e98e19922b400b4ceb04b","tgt_lang":"zh-CN","translated":"拆分","updated_at":"2026-07-06T22:56:12.834Z"}
{"cache_key":"5644303cd0b9f4812ff2f792dd0cd80041ca5cae312af731fc94cbae0d88e4ef","model":"gpt-5.5","provider":"openai","segment_id":"usage.providerUsage.lastDays","source_path":"ui/src/i18n/locales/zh-CN.ts","src_lang":"en","text":"{count} days","text_hash":"e9f0a85930cc6fa61b7ac01763893020adc4c712d1b8e8897bdd13971637d529","tgt_lang":"zh-CN","translated":"{count} 天","updated_at":"2026-07-06T06:40:15.357Z"}
{"cache_key":"566c749d2a13bfa6bf24553ae9d0d7ea1b4fdc9ee9c06af7ca21dda461d56d04","model":"gpt-5.5","provider":"openai","segment_id":"sessionsView.dateToday","source_path":"ui/src/i18n/locales/zh-CN.ts","src_lang":"en","text":"Today","text_hash":"2b065c7c9ce466e5ebcad757987d5d660ee4c9ea708bc62c43444b53334738ba","tgt_lang":"zh-CN","translated":"今天","updated_at":"2026-07-05T14:39:29.129Z"}
{"cache_key":"57628f1023df1a1470b9753bcbdbfc70c7cec0565f4ab84bab87e24620e2184c","model":"gpt-5.5","provider":"openai","segment_id":"tabs.worktrees","source_path":"ui/src/i18n/locales/zh-CN.ts","src_lang":"en","text":"Worktrees","text_hash":"aec2f93d67b7c4c5fd9b94042f33299f7a0e55cdcb7e8e35feb9d0f6da697f3d","tgt_lang":"zh-CN","translated":"Worktrees","updated_at":"2026-07-05T21:00:21.877Z"}
@@ -199,6 +200,7 @@
{"cache_key":"e5cd58b0a8db51e61783f7119307bfb22dca19c02ebec7a056f019f90107adbf","model":"gpt-5.5","provider":"openai","segment_id":"sessionsView.groupByChannel","source_path":"ui/src/i18n/locales/zh-CN.ts","src_lang":"en","text":"Channel","text_hash":"ce4683e7013a18cdf3d224bfcb4e9594ea8f559e946a837c633defe7d3c32172","tgt_lang":"zh-CN","translated":"渠道","updated_at":"2026-07-05T14:39:29.129Z"}
{"cache_key":"e6376fdbb23ac9fe7cf1ffd514de37d8b8ef720018503454896b5afe8b9257fd","model":"gpt-5.5","provider":"openai","segment_id":"sessionsView.groupRowCount","source_path":"ui/src/i18n/locales/zh-CN.ts","src_lang":"en","text":"{count} sessions","text_hash":"27de9b3be346a2abd2cb67f9f93abfe8100d7ce996e1204b75fc84670c7818e6","tgt_lang":"zh-CN","translated":"{count} 个会话","updated_at":"2026-07-05T14:39:29.129Z"}
{"cache_key":"e65b0fbd24ba3241afa211e53f284c5a8446d414fc4d89ea39b97da5825b146c","model":"gpt-5.5","provider":"openai","segment_id":"chat.sidebar.sortSessions","source_path":"ui/src/i18n/locales/zh-CN.ts","src_lang":"en","text":"Sort sessions","text_hash":"6680f07d3df817d60180acbbc6e207689d28caaa27ac23749f93261b8111a38d","tgt_lang":"zh-CN","translated":"排序会话","updated_at":"2026-07-06T15:07:02.499Z"}
{"cache_key":"e6a98ac4a522259f3561cc7cce39221a255937a191e9a7f171b56e4eaa1c9de5","model":"gpt-5.5","provider":"openai","segment_id":"chat.splitView.dropOpenHere","source_path":"ui/src/i18n/locales/zh-CN.ts","src_lang":"en","text":"Open here","text_hash":"b08e2fd2e872adcb575b305187b9db8482369325806953ce80190fc2dc1ab9fb","tgt_lang":"zh-CN","translated":"在此处打开","updated_at":"2026-07-06T22:56:12.834Z"}
{"cache_key":"e74cbaca3fb022ecddce09a4ec183689d52341d5aafa49cf9974fd4b3fe480ae","model":"gpt-5.5","provider":"openai","segment_id":"worktrees.branch","source_path":"ui/src/i18n/locales/zh-CN.ts","src_lang":"en","text":"Branch","text_hash":"52656e8104eef3fddd3d4546903fa0de93c0625abf47b3dd8130f7705d6a513e","tgt_lang":"zh-CN","translated":"分支","updated_at":"2026-07-05T21:00:21.876Z"}
{"cache_key":"e8ba2231314380ef7d455617f316fe194b075dd3ed626c1ce41fa62c6ea0753f","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.workspaceFiles.copyPath","source_path":"ui/src/i18n/locales/zh-CN.ts","src_lang":"en","text":"Copy path","text_hash":"720ff4160412b943370afdb8fc1c082ff057d54713d5fb4b4b7a9634bfabf5fe","tgt_lang":"zh-CN","translated":"复制路径","updated_at":"2026-06-16T14:13:09.659Z"}
{"cache_key":"eac61937cea7a2fe57800d170b6ab7197de171e9e8ee3d6183cdf0e46a9b3b32","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.workspaceFiles.read","source_path":"ui/src/i18n/locales/zh-CN.ts","src_lang":"en","text":"Read","text_hash":"9b9a8d05a7ec353bda84f9c1bb3178c299de3001b5e970508ddc889c487f92ca","tgt_lang":"zh-CN","translated":"已读取","updated_at":"2026-06-16T14:13:07.632Z"}
+4 -4
View File
@@ -1,11 +1,11 @@
{
"fallbackKeys": [],
"generatedAt": "2026-07-06T23:40:44.300Z",
"generatedAt": "2026-07-07T02:26:51.342Z",
"locale": "zh-TW",
"model": "gpt-5.5",
"provider": "openai",
"sourceHash": "ff787c22bac9fbc29702f49e4a9062521d338fed4c8a2b97fec21bf52ee0892e",
"totalKeys": 1666,
"translatedKeys": 1666,
"sourceHash": "378b4e5380384a33d9e31a49a5483cdb991245705193e067d5fb8c5311bc20fb",
"totalKeys": 1668,
"translatedKeys": 1668,
"workflow": 1
}
+2
View File
@@ -196,6 +196,7 @@
{"cache_key":"c2c2e45fc3581350cb2d0ed404cf96605a73c976ed106d79f0f259c7566e70e7","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.dependencyMissing","source_path":"ui/src/i18n/locales/zh-TW.ts","src_lang":"en","text":"{parent} (missing)","text_hash":"8daa419059727391c01e3b7021e05d8d70b4da67f9c57cd2d80f302af77aac53","tgt_lang":"zh-TW","translated":"{parent}(缺少)","updated_at":"2026-06-16T14:13:10.175Z"}
{"cache_key":"c38e20ce158639649de7b4ea479cc4b1d764fcbefcbe7a2a56d4e591797dd315","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.detailWorkerProtocol","source_path":"ui/src/i18n/locales/zh-TW.ts","src_lang":"en","text":"Worker protocol","text_hash":"e445d823cfa48c4e8fa1d8854771e9939955e772428be6d7957deec0f7968764","tgt_lang":"zh-TW","translated":"Worker 通訊協定","updated_at":"2026-06-16T14:12:59.400Z"}
{"cache_key":"c40752a1bede44892603dced6ccd915360de537f3e3b2ca3e80fd2af2607eed0","model":"gpt-5.5","provider":"openai","segment_id":"sessionsView.moveToGroup","source_path":"ui/src/i18n/locales/zh-TW.ts","src_lang":"en","text":"Move session to a group","text_hash":"7db4b663aebb86158b454c49ad05115941c0411cb8ed6182bdc8fd5840f32dff","tgt_lang":"zh-TW","translated":"將工作階段移至群組","updated_at":"2026-07-05T14:39:31.777Z"}
{"cache_key":"c4f580e24572d82a2cadd8a21b7ad97605ecb7af6caca59206bdfabe2da273b3","model":"gpt-5.5","provider":"openai","segment_id":"chat.splitView.dropSplit","source_path":"ui/src/i18n/locales/zh-TW.ts","src_lang":"en","text":"Split","text_hash":"32afaa784333648025e24b162bece7474051bcaaa29e98e19922b400b4ceb04b","tgt_lang":"zh-TW","translated":"分割","updated_at":"2026-07-06T22:56:14.610Z"}
{"cache_key":"c606380bc4dea275475ee0c807ede479a8e24e62f2250ad49397bf9d2d27fc5e","model":"gpt-5.5","provider":"openai","segment_id":"sessionsView.ungrouped","source_path":"ui/src/i18n/locales/zh-TW.ts","src_lang":"en","text":"Ungrouped","text_hash":"674b38cae72bb0c8be97cea114f7ce84a6ad4ae3c7f3ceb0c869d62db8e53fa2","tgt_lang":"zh-TW","translated":"未分組","updated_at":"2026-07-05T14:39:31.777Z"}
{"cache_key":"c8ce8b5c67380606b4ca689bff8bfeb5a5bc9cc59ea635a7bfadf7e01d50aba2","model":"gpt-5.5","provider":"openai","segment_id":"tabs.worktrees","source_path":"ui/src/i18n/locales/zh-TW.ts","src_lang":"en","text":"Worktrees","text_hash":"aec2f93d67b7c4c5fd9b94042f33299f7a0e55cdcb7e8e35feb9d0f6da697f3d","tgt_lang":"zh-TW","translated":"Worktrees","updated_at":"2026-07-05T21:00:31.397Z"}
{"cache_key":"ca7ad66b2d95356baadb06d6ea27654e57cfbb7e5629fbdb229e07b50515f1fc","model":"gpt-5.5","provider":"openai","segment_id":"chat.composer.microphoneBusy","source_path":"ui/src/i18n/locales/zh-TW.ts","src_lang":"en","text":"Microphone inputs are busy or unavailable to the browser.","text_hash":"9f33c30cb2370916f2edd079ad5cabab6a94dd185a89f4f7db357b4f31d1f3dd","tgt_lang":"zh-TW","translated":"麥克風輸入正忙碌或無法供瀏覽器使用。","updated_at":"2026-07-06T17:56:07.837Z"}
@@ -216,6 +217,7 @@
{"cache_key":"dad14b4854ecbd2f8afc7bf6c30f20ba0b8f35409d9c6463c1c41be586ef8dc1","model":"gpt-5.5","provider":"openai","segment_id":"sessionsView.groupBy","source_path":"ui/src/i18n/locales/zh-TW.ts","src_lang":"en","text":"Group by","text_hash":"956a51f6b098a41b7c3108015f0790bb24af7693717b07cee39d5df6a5da1826","tgt_lang":"zh-TW","translated":"分組依據","updated_at":"2026-07-05T14:39:31.777Z"}
{"cache_key":"de30a91cd96b0c6054b0d6430b4e87693b5f85f443fcee040ece1fa617582706","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.viewReview","source_path":"ui/src/i18n/locales/zh-TW.ts","src_lang":"en","text":"Review","text_hash":"aff0766a5290e117b8433c351bae7b7b23bed682b2369bd822d88a647cc58512","tgt_lang":"zh-TW","translated":"審查","updated_at":"2026-06-17T14:13:17.815Z"}
{"cache_key":"de54436908f6d2fd9df0c009a66b27614fc3f0ea242b416d07b12aabd6700d26","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.agentCurrentUnconfigured","source_path":"ui/src/i18n/locales/zh-TW.ts","src_lang":"en","text":"{agent} (not configured)","text_hash":"d138ab0079dea760c723d7c947d0c31178252e28e7dd70a40b9d3d85e5549b1d","tgt_lang":"zh-TW","translated":"{agent}(未設定)","updated_at":"2026-06-17T14:13:17.815Z"}
{"cache_key":"de71982df7d1f8036ae67fec0025e948feb6bfd1842042cb09110a1696ae75bb","model":"gpt-5.5","provider":"openai","segment_id":"chat.splitView.dropOpenHere","source_path":"ui/src/i18n/locales/zh-TW.ts","src_lang":"en","text":"Open here","text_hash":"b08e2fd2e872adcb575b305187b9db8482369325806953ce80190fc2dc1ab9fb","tgt_lang":"zh-TW","translated":"在此開啟","updated_at":"2026-07-06T22:56:14.610Z"}
{"cache_key":"dfff198833dd38bc303bca6823cf7a9a3ba7716e1546f03444c43868e2f11436","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.composer.talkSensitivityMedium","source_path":"ui/src/i18n/locales/zh-TW.ts","src_lang":"en","text":"Medium","text_hash":"8e588cd187741f1cd76f5fab77b7208782a8c21d764ce7d7a4cf3ac4e0968873","tgt_lang":"zh-TW","translated":"中","updated_at":"2026-07-06T20:20:02.809Z"}
{"cache_key":"e05a6faa1c1d4ffcaa66d10b34db03c44b8e716bb25018e34d45e53387ff1830","model":"gpt-5.5","provider":"openai","segment_id":"sessionsView.groupByCategory","source_path":"ui/src/i18n/locales/zh-TW.ts","src_lang":"en","text":"Custom groups","text_hash":"9636b3c175d0e2a9fb982785a84275d191a8b4ef28e4d842a9e35a38e3c12f10","tgt_lang":"zh-TW","translated":"自訂群組","updated_at":"2026-07-05T14:39:31.777Z"}
{"cache_key":"e217dfe5418b9eff51fa4bf31c37ee90a94d3a29bb3e93713758d96fd31fb042","model":"gpt-5.5","provider":"openai","segment_id":"languages.hi","source_path":"ui/src/i18n/locales/zh-TW.ts","src_lang":"en","text":"हिन्दी (Hindi)","text_hash":"fab2abfce45382f3031c59477017700a8cb5dfaf8d15379dc24304809b97c7d5","tgt_lang":"zh-TW","translated":"हिन्दी (Hindi)","updated_at":"2026-06-26T21:43:20.866Z"}
+2
View File
@@ -1573,6 +1573,8 @@ export const ar: TranslationMap = {
splitDown: "تقسيم إلى الأسفل",
closePane: "إغلاق الجزء",
sessionSelect: "جلسة الجزء",
dropSplit: "تقسيم",
dropOpenHere: "افتح هنا",
},
sidebar: {
allSessions: "كل الجلسات",
+2
View File
@@ -1603,6 +1603,8 @@ export const de: TranslationMap = {
splitDown: "Nach unten teilen",
closePane: "Bereich schließen",
sessionSelect: "Bereichssitzung",
dropSplit: "Teilen",
dropOpenHere: "Hier öffnen",
},
sidebar: {
allSessions: "Alle Sitzungen",
+2
View File
@@ -1579,6 +1579,8 @@ export const en: TranslationMap = {
splitDown: "Split down",
closePane: "Close pane",
sessionSelect: "Pane session",
dropSplit: "Split",
dropOpenHere: "Open here",
},
sidebar: {
allSessions: "All sessions",
+2
View File
@@ -1600,6 +1600,8 @@ export const es: TranslationMap = {
splitDown: "Dividir hacia abajo",
closePane: "Cerrar panel",
sessionSelect: "Sesión del panel",
dropSplit: "Dividir",
dropOpenHere: "Abrir aquí",
},
sidebar: {
allSessions: "Todas las sesiones",
+2
View File
@@ -1591,6 +1591,8 @@ export const fa: TranslationMap = {
splitDown: "تقسیم به پایین",
closePane: "بستن پنل",
sessionSelect: "نشست پنل",
dropSplit: "تقسیم",
dropOpenHere: "اینجا باز شود",
},
sidebar: {
allSessions: "همهٔ نشست‌ها",
+2
View File
@@ -1610,6 +1610,8 @@ export const fr: TranslationMap = {
splitDown: "Fractionner vers le bas",
closePane: "Fermer le volet",
sessionSelect: "Session du volet",
dropSplit: "Scinder",
dropOpenHere: "Ouvrir ici",
},
sidebar: {
allSessions: "Toutes les sessions",
+2
View File
@@ -1575,6 +1575,8 @@ export const hi: TranslationMap = {
splitDown: "नीचे विभाजित करें",
closePane: "पैन बंद करें",
sessionSelect: "पैन सत्र",
dropSplit: "विभाजित करें",
dropOpenHere: "यहाँ खोलें",
},
sidebar: {
allSessions: "सभी सत्र",
+2
View File
@@ -1592,6 +1592,8 @@ export const id: TranslationMap = {
splitDown: "Bagi ke bawah",
closePane: "Tutup panel",
sessionSelect: "Sesi panel",
dropSplit: "Bagi",
dropOpenHere: "Buka di sini",
},
sidebar: {
allSessions: "Semua sesi",
+2
View File
@@ -1602,6 +1602,8 @@ export const it: TranslationMap = {
splitDown: "Dividi in basso",
closePane: "Chiudi riquadro",
sessionSelect: "Sessione del riquadro",
dropSplit: "Dividi",
dropOpenHere: "Apri qui",
},
sidebar: {
allSessions: "Tutte le sessioni",
+2
View File
@@ -1598,6 +1598,8 @@ export const ja_JP: TranslationMap = {
splitDown: "下に分割",
closePane: "ペインを閉じる",
sessionSelect: "ペインのセッション",
dropSplit: "分割",
dropOpenHere: "ここで開く",
},
sidebar: {
allSessions: "すべてのセッション",
+2
View File
@@ -1580,6 +1580,8 @@ export const ko: TranslationMap = {
splitDown: "아래쪽으로 분할",
closePane: "창 닫기",
sessionSelect: "창 세션",
dropSplit: "분할",
dropOpenHere: "여기에서 열기",
},
sidebar: {
allSessions: "모든 세션",
+2
View File
@@ -1597,6 +1597,8 @@ export const nl: TranslationMap = {
splitDown: "Omlaag splitsen",
closePane: "Deelvenster sluiten",
sessionSelect: "Deelvenstersessie",
dropSplit: "Splitsen",
dropOpenHere: "Hier openen",
},
sidebar: {
allSessions: "Alle sessies",
+2
View File
@@ -1595,6 +1595,8 @@ export const pl: TranslationMap = {
splitDown: "Podziel w dół",
closePane: "Zamknij panel",
sessionSelect: "Sesja panelu",
dropSplit: "Podziel",
dropOpenHere: "Otwórz tutaj",
},
sidebar: {
allSessions: "Wszystkie sesje",
+2
View File
@@ -1593,6 +1593,8 @@ export const pt_BR: TranslationMap = {
splitDown: "Dividir para baixo",
closePane: "Fechar painel",
sessionSelect: "Sessão do painel",
dropSplit: "Dividir",
dropOpenHere: "Abrir aqui",
},
sidebar: {
allSessions: "Todas as sessões",
+2
View File
@@ -1604,6 +1604,8 @@ export const ru: TranslationMap = {
splitDown: "Разделить вниз",
closePane: "Закрыть панель",
sessionSelect: "Сессия панели",
dropSplit: "Разделить",
dropOpenHere: "Открыть здесь",
},
sidebar: {
allSessions: "Все сеансы",
+2
View File
@@ -1557,6 +1557,8 @@ export const th: TranslationMap = {
splitDown: "แบ่งลงด้านล่าง",
closePane: "ปิดบานหน้าต่าง",
sessionSelect: "เซสชันของบานหน้าต่าง",
dropSplit: "แยก",
dropOpenHere: "เปิดที่นี่",
},
sidebar: {
allSessions: "เซสชันทั้งหมด",
+2
View File
@@ -1597,6 +1597,8 @@ export const tr: TranslationMap = {
splitDown: "Aşağı böl",
closePane: "Bölmeyi kapat",
sessionSelect: "Bölme oturumu",
dropSplit: "Böl",
dropOpenHere: "Burada aç",
},
sidebar: {
allSessions: "Tüm oturumlar",
+2
View File
@@ -1593,6 +1593,8 @@ export const uk: TranslationMap = {
splitDown: "Розділити вниз",
closePane: "Закрити панель",
sessionSelect: "Сеанс панелі",
dropSplit: "Розділити",
dropOpenHere: "Відкрити тут",
},
sidebar: {
allSessions: "Усі сеанси",
+2
View File
@@ -1582,6 +1582,8 @@ export const vi: TranslationMap = {
splitDown: "Chia xuống dưới",
closePane: "Đóng khung",
sessionSelect: "Phiên trong khung",
dropSplit: "Chia đôi",
dropOpenHere: "Mở tại đây",
},
sidebar: {
allSessions: "Tất cả phiên",
+2
View File
@@ -1552,6 +1552,8 @@ export const zh_CN: TranslationMap = {
splitDown: "向下拆分",
closePane: "关闭窗格",
sessionSelect: "窗格会话",
dropSplit: "拆分",
dropOpenHere: "在此处打开",
},
sidebar: {
allSessions: "所有会话",
+2
View File
@@ -1554,6 +1554,8 @@ export const zh_TW: TranslationMap = {
splitDown: "向下分割",
closePane: "關閉窗格",
sessionSelect: "窗格工作階段",
dropSplit: "分割",
dropOpenHere: "在此開啟",
},
sidebar: {
allSessions: "所有工作階段",
+16
View File
@@ -0,0 +1,16 @@
export const SESSION_DRAG_MIME = "application/x-openclaw-session-key";
export function writeSessionDragData(dataTransfer: DataTransfer, sessionKey: string): void {
dataTransfer.setData(SESSION_DRAG_MIME, sessionKey);
dataTransfer.setData("text/plain", sessionKey);
dataTransfer.effectAllowed = "copy";
}
export function readSessionDragData(dataTransfer: DataTransfer | null): string | null {
const sessionKey = dataTransfer?.getData(SESSION_DRAG_MIME).trim();
return sessionKey || null;
}
export function sessionDragActive(dataTransfer: DataTransfer | null): boolean {
return Array.from(dataTransfer?.types ?? []).includes(SESSION_DRAG_MIME);
}
+158
View File
@@ -9,9 +9,13 @@ vi.mock("./chat-pane.ts", () => {
return {};
});
import { loadSettings } from "../../app/settings.ts";
import type { ResizableDivider } from "../../components/resizable-divider.ts";
import { SESSION_DRAG_MIME } from "../../lib/sessions/drag.ts";
import { searchForSession } from "../../lib/sessions/index.ts";
import { createStorageMock } from "../../test-helpers/storage.ts";
import { ChatPage } from "./chat-page.ts";
import type { SplitDropZone } from "./split-drop-zone.ts";
import { createSplitLayout, type ChatSplitLayout } from "./split-layout.ts";
type RenderedPane = HTMLElement & {
@@ -25,6 +29,33 @@ function setLayout(page: ChatPage, layout: ChatSplitLayout | undefined) {
(page as unknown as { layout: ChatSplitLayout | undefined }).layout = layout;
}
function getLayout(page: ChatPage): ChatSplitLayout | undefined {
return (page as unknown as { layout: ChatSplitLayout | undefined }).layout;
}
function applySessionDrop(page: ChatPage, sessionKey: string, paneId: string, zone: SplitDropZone) {
(
page as unknown as {
applySessionDrop: (sessionKey: string, paneId: string, zone: SplitDropZone) => void;
}
).applySessionDrop(sessionKey, paneId, zone);
}
function handleDrop(page: ChatPage, event: DragEvent) {
(page as unknown as { handleDrop: (event: DragEvent) => void }).handleDrop(event);
}
function setNavigationContext(page: ChatPage) {
const navigate = vi.fn();
const replace = vi.fn();
(page as unknown as { context: { navigate: typeof navigate; replace: typeof replace } }).context =
{
navigate,
replace,
};
return { navigate, replace };
}
function stubMatchMedia(matches: boolean) {
vi.stubGlobal(
"matchMedia",
@@ -112,4 +143,131 @@ describe("chat page split layout host", () => {
expect(panes[0].chrome).toBe("pane");
expect(page.querySelector("resizable-divider")).toBeNull();
});
it("routes a classic-mode center drop without creating a layout", () => {
const page = new ChatPage();
page.data = { sessionKey: "main" };
const navigation = setNavigationContext(page);
applySessionDrop(page, "agent:main:work", "single", { kind: "center" });
expect(getLayout(page)).toBeUndefined();
expect(loadSettings().chatSplitLayout).toBeUndefined();
expect(navigation.navigate).toHaveBeenCalledWith("chat", {
search: searchForSession("agent:main:work"),
});
expect(navigation.replace).not.toHaveBeenCalled();
});
it("creates and persists a classic-mode edge drop on the chosen side", () => {
const page = new ChatPage();
page.data = { sessionKey: "main" };
const navigation = setNavigationContext(page);
applySessionDrop(page, "agent:main:work", "single", { kind: "edge", edge: "left" });
const layout = getLayout(page);
expect(layout?.columns.map((column) => column.panes.map((pane) => pane.sessionKey))).toEqual([
["agent:main:work"],
["main"],
]);
expect(layout?.activePaneId).toBe("p2");
expect(loadSettings().chatSplitLayout).toEqual(layout);
expect(navigation.replace).toHaveBeenCalledWith("chat", {
search: searchForSession("agent:main:work"),
});
});
it("inserts and persists a dropped session at a layout edge", () => {
const page = new ChatPage();
page.data = { sessionKey: "main" };
setLayout(page, createSplitLayout("main"));
const navigation = setNavigationContext(page);
applySessionDrop(page, "agent:main:work", "p1", { kind: "edge", edge: "down" });
const layout = getLayout(page);
expect(layout?.columns[0].panes.map((pane) => pane.sessionKey)).toEqual([
"main",
"agent:main:work",
]);
expect(layout?.activePaneId).toBe("p3");
expect(loadSettings().chatSplitLayout).toEqual(layout);
expect(navigation.replace).toHaveBeenCalledWith("chat", {
search: searchForSession("agent:main:work"),
});
});
it("replaces and activates the pane under a layout center drop", () => {
const page = new ChatPage();
page.data = { sessionKey: "main" };
setLayout(page, createSplitLayout("main"));
const navigation = setNavigationContext(page);
applySessionDrop(page, "agent:main:work", "p1", { kind: "center" });
const layout = getLayout(page);
expect(layout?.columns[0].panes[0].sessionKey).toBe("agent:main:work");
expect(layout?.activePaneId).toBe("p1");
expect(loadSettings().chatSplitLayout).toEqual(layout);
expect(navigation.replace).toHaveBeenCalledWith("chat", {
search: searchForSession("agent:main:work"),
});
});
it("leaves a same-session center drop unchanged", () => {
const page = new ChatPage();
page.data = { sessionKey: "main" };
const layout = createSplitLayout("main");
setLayout(page, layout);
const navigation = setNavigationContext(page);
applySessionDrop(page, "main", "p1", { kind: "center" });
expect(getLayout(page)).toBe(layout);
expect(navigation.navigate).not.toHaveBeenCalled();
expect(navigation.replace).not.toHaveBeenCalled();
});
it("resolves the pane and zone from the drop event", async () => {
const page = new ChatPage();
page.data = { sessionKey: "main" };
document.body.append(page);
setLayout(page, createSplitLayout("main"));
const navigation = setNavigationContext(page);
await page.updateComplete;
const pane = [...page.querySelectorAll<RenderedPane>("openclaw-chat-pane")].find(
(candidate) => candidate.paneId === "p1",
);
const container = page.querySelector<HTMLElement>(".chat-split-view__drop-container");
expect(pane).toBeDefined();
expect(container).not.toBeNull();
const paneRect = { left: 100, top: 50, width: 200, height: 100 } as DOMRect;
const containerRect = { left: 100, top: 50, width: 400, height: 100 } as DOMRect;
vi.spyOn(pane!, "getBoundingClientRect").mockReturnValue(paneRect);
vi.spyOn(container!, "getBoundingClientRect").mockReturnValue(containerRect);
const preventDefault = vi.fn();
handleDrop(page, {
target: pane,
clientX: 105,
clientY: 100,
preventDefault,
dataTransfer: {
types: [SESSION_DRAG_MIME],
getData: (type: string) => (type === SESSION_DRAG_MIME ? "agent:main:work" : ""),
} as unknown as DataTransfer,
} as unknown as DragEvent);
expect(preventDefault).toHaveBeenCalledOnce();
expect(getLayout(page)?.columns.map((column) => column.panes[0].sessionKey)).toEqual([
"agent:main:work",
"main",
"main",
]);
expect(navigation.replace).toHaveBeenCalledWith("chat", {
search: searchForSession("agent:main:work"),
});
});
});
+222 -17
View File
@@ -6,19 +6,26 @@ import { applicationContext, type ApplicationContext } from "../../app/context.t
import { loadSettings, patchSettings } from "../../app/settings.ts";
import "../../components/resizable-divider.ts";
import { t } from "../../i18n/index.ts";
import { readSessionDragData, sessionDragActive } from "../../lib/sessions/drag.ts";
import { searchForSession } from "../../lib/sessions/index.ts";
import "./chat-pane.ts";
import {
resolveSplitDropZone,
splitDropIndicatorRect,
type SplitDropRect,
type SplitDropZone,
} from "./split-drop-zone.ts";
import {
closePane,
createSinglePaneLayout,
createSplitLayout,
findPane,
insertPane,
panesOf,
resizeColumns,
resizePanes,
setActivePane,
setPaneSession,
splitPaneDown,
splitPaneRight,
type ChatSplitLayout,
type ChatSplitPane,
} from "./split-layout.ts";
@@ -30,14 +37,23 @@ type ChatRouteData = {
const NARROW_SPLIT_QUERY = "(max-width: 1099px)";
type DropIndicator = { paneId: string; zone: SplitDropZone; rect: SplitDropRect };
type ChatPaneElement = HTMLElement & { paneId?: string };
export class ChatPage extends LitElement {
@consume({ context: applicationContext, subscribe: false })
private context!: ApplicationContext;
@property({ attribute: false }) data!: ChatRouteData;
@state() private layout: ChatSplitLayout | undefined;
@state() private narrow = false;
@state() private dropIndicator: DropIndicator | null = null;
private mediaQuery: MediaQueryList | null = null;
// Light-DOM enter/leave events bubble from every nested child, so only clear
// the shared preview after the whole balanced drag has left the page.
private dragDepth = 0;
private dragFrame = 0;
private pendingDragOver: { pane: ChatPaneElement; x: number; y: number } | null = null;
override createRenderRoot() {
return this;
@@ -49,12 +65,23 @@ export class ChatPage extends LitElement {
this.mediaQuery = window.matchMedia(NARROW_SPLIT_QUERY);
this.narrow = this.mediaQuery.matches;
this.mediaQuery.addEventListener("change", this.handleViewportChange);
this.addEventListener("dragenter", this.handleDragEnter);
this.addEventListener("dragover", this.handleDragOver);
this.addEventListener("dragleave", this.handleDragLeave);
this.addEventListener("drop", this.handleDrop);
window.addEventListener("dragend", this.handleWindowDragEnd);
this.syncRouteToActivePane();
}
override disconnectedCallback() {
this.mediaQuery?.removeEventListener("change", this.handleViewportChange);
this.mediaQuery = null;
this.removeEventListener("dragenter", this.handleDragEnter);
this.removeEventListener("dragover", this.handleDragOver);
this.removeEventListener("dragleave", this.handleDragLeave);
this.removeEventListener("drop", this.handleDrop);
window.removeEventListener("dragend", this.handleWindowDragEnd);
this.clearDropIndicator();
super.disconnectedCallback();
}
@@ -66,8 +93,131 @@ export class ChatPage extends LitElement {
private readonly handleViewportChange = (event: MediaQueryListEvent) => {
this.narrow = event.matches;
if (event.matches) {
this.clearDropIndicator();
}
};
private readonly handleDragEnter = (event: DragEvent) => {
if (this.narrow || !sessionDragActive(event.dataTransfer)) {
return;
}
this.dragDepth += 1;
};
private readonly handleDragOver = (event: DragEvent) => {
if (this.narrow || !sessionDragActive(event.dataTransfer)) {
return;
}
event.preventDefault();
if (event.dataTransfer) {
event.dataTransfer.dropEffect = "copy";
}
const target = event.target instanceof Element ? event.target : null;
const pane = target?.closest<ChatPaneElement>("openclaw-chat-pane");
if (!pane || !this.contains(pane)) {
// Dividers and pane gaps sit between drop targets; keep the last preview
// instead of flickering it away while the pointer crosses them.
return;
}
this.pendingDragOver = { pane, x: event.clientX, y: event.clientY };
if (this.dragFrame) {
return;
}
this.dragFrame = window.requestAnimationFrame(() => {
this.dragFrame = 0;
const pending = this.pendingDragOver;
this.pendingDragOver = null;
if (!pending || this.narrow || !this.isConnected) {
return;
}
const indicator = this.resolveDropIndicator(pending.pane, pending.x, pending.y);
if (!indicator) {
return;
}
const current = this.dropIndicator;
if (
current?.paneId === indicator.paneId &&
current.zone.kind === indicator.zone.kind &&
(indicator.zone.kind === "center" ||
(current.zone.kind === "edge" && current.zone.edge === indicator.zone.edge))
) {
return;
}
this.dropIndicator = indicator;
});
};
private readonly handleDragLeave = (event: DragEvent) => {
if (this.narrow || !sessionDragActive(event.dataTransfer)) {
return;
}
this.dragDepth = Math.max(0, this.dragDepth - 1);
if (this.dragDepth === 0) {
this.clearDropIndicator();
}
};
private readonly handleDrop = (event: DragEvent) => {
if (this.narrow || !sessionDragActive(event.dataTransfer)) {
return;
}
event.preventDefault();
const sessionKey = readSessionDragData(event.dataTransfer);
const target = event.target instanceof Element ? event.target : null;
const pane = target?.closest<ChatPaneElement>("openclaw-chat-pane");
// Fall back to the retained preview when the drop lands on a divider or
// gap, so the drop always matches what the indicator promised.
const indicator =
(pane && this.contains(pane)
? this.resolveDropIndicator(pane, event.clientX, event.clientY)
: null) ?? this.dropIndicator;
this.clearDropIndicator();
if (sessionKey && indicator) {
this.applySessionDrop(sessionKey, indicator.paneId, indicator.zone);
}
};
private readonly handleWindowDragEnd = () => {
this.clearDropIndicator();
};
private clearDropIndicator() {
this.dragDepth = 0;
this.clearDropPreview();
}
private clearDropPreview() {
this.pendingDragOver = null;
if (this.dragFrame) {
window.cancelAnimationFrame(this.dragFrame);
this.dragFrame = 0;
}
this.dropIndicator = null;
}
private resolveDropIndicator(pane: ChatPaneElement, x: number, y: number): DropIndicator | null {
const paneId = pane.paneId;
const container = this.querySelector<HTMLElement>(".chat-split-view__drop-container");
if (!paneId || !container) {
return null;
}
const paneRect = pane.getBoundingClientRect();
const zone = resolveSplitDropZone(paneRect, x, y);
const indicatorRect = splitDropIndicatorRect(paneRect, zone);
const containerRect = container.getBoundingClientRect();
return {
paneId,
zone,
rect: {
left: indicatorRect.left - containerRect.left,
top: indicatorRect.top - containerRect.top,
width: indicatorRect.width,
height: indicatorRect.height,
},
};
}
// Route and active pane mirror each other: route changes land in the active
// pane here, and pane-side changes call updateRoute. The equality guards on
// both paths are what keep that from looping.
@@ -101,6 +251,43 @@ export class ChatPage extends LitElement {
}
}
private applySessionDrop(sessionKey: string, paneId: string, zone: SplitDropZone): void {
const trimmed = sessionKey.trim();
if (!trimmed) {
return;
}
const layout = this.layout;
if (!layout) {
if (zone.kind === "center") {
this.updateRoute(trimmed);
return;
}
const currentSessionKey = this.data?.sessionKey?.trim();
if (!currentSessionKey) {
return;
}
const next = insertPane(createSinglePaneLayout(currentSessionKey), "p1", trimmed, zone.edge);
this.persistLayout(next);
this.updateRoute(trimmed, true);
return;
}
const pane = findPane(layout, paneId)?.pane;
if (!pane) {
return;
}
if (zone.kind === "center") {
if (pane.sessionKey === trimmed) {
return;
}
const active = setActivePane(layout, paneId);
this.persistLayout(setPaneSession(active, paneId, trimmed));
this.updateRoute(trimmed, true);
return;
}
this.persistLayout(insertPane(layout, paneId, trimmed, zone.edge));
this.updateRoute(trimmed, true);
}
private readonly handleFocusPane = (paneId: string) => {
const layout = this.layout;
if (!layout || layout.activePaneId === paneId) {
@@ -151,7 +338,7 @@ export class ChatPage extends LitElement {
if (!layout || !pane) {
return;
}
this.persistLayout(splitPaneRight(layout, paneId, pane.sessionKey));
this.persistLayout(insertPane(layout, paneId, pane.sessionKey, "right"));
};
private readonly handleSplitDown = (paneId: string) => {
@@ -160,7 +347,7 @@ export class ChatPage extends LitElement {
if (!layout || !pane) {
return;
}
this.persistLayout(splitPaneDown(layout, paneId, pane.sessionKey));
this.persistLayout(insertPane(layout, paneId, pane.sessionKey, "down"));
};
private readonly handleClosePane = (paneId: string) => {
@@ -282,20 +469,38 @@ export class ChatPage extends LitElement {
}
override render() {
if (this.layout) {
return this.renderSplitLayout(this.layout);
}
const indicator = this.dropIndicator;
return html`
<openclaw-chat-pane
.paneId=${"single"}
.sessionKey=${this.data?.sessionKey ?? ""}
.active=${true}
.chrome=${"none"}
.draft=${this.data?.draft}
.onFocusPane=${this.handleFocusPane}
.onPaneSessionChange=${this.handlePaneSessionChange}
.onOpenSplitView=${this.narrow ? undefined : this.openSplitView}
></openclaw-chat-pane>
<div class="chat-split-view__drop-container">
${this.layout
? this.renderSplitLayout(this.layout)
: html`
<openclaw-chat-pane
.paneId=${"single"}
.sessionKey=${this.data?.sessionKey ?? ""}
.active=${true}
.chrome=${"none"}
.draft=${this.data?.draft}
.onFocusPane=${this.handleFocusPane}
.onPaneSessionChange=${this.handlePaneSessionChange}
.onOpenSplitView=${this.narrow ? undefined : this.openSplitView}
></openclaw-chat-pane>
`}
${indicator
? html`<div
class="chat-split-view__drop-indicator ${indicator.zone.kind === "center"
? "chat-split-view__drop-indicator--center"
: ""}"
style=${`left: ${indicator.rect.left}px; top: ${indicator.rect.top}px; width: ${indicator.rect.width}px; height: ${indicator.rect.height}px;`}
>
<span class="chat-split-view__drop-indicator-label"
>${indicator.zone.kind === "center"
? t("chat.splitView.dropOpenHere")
: t("chat.splitView.dropSplit")}</span
>
</div>`
: nothing}
</div>
`;
}
}
+62
View File
@@ -0,0 +1,62 @@
import { describe, expect, it } from "vitest";
import { resolveSplitDropZone, splitDropIndicatorRect } from "./split-drop-zone.ts";
const rect = { left: 100, top: 200, width: 400, height: 200 };
describe("split drop zones", () => {
it.each([
[110, 300, { kind: "edge", edge: "left" }],
[490, 300, { kind: "edge", edge: "right" }],
[300, 210, { kind: "edge", edge: "up" }],
[300, 390, { kind: "edge", edge: "down" }],
[300, 300, { kind: "center" }],
] as const)("resolves the zone at %d, %d", (x, y, expected) => {
expect(resolveSplitDropZone(rect, x, y)).toEqual(expected);
});
it("chooses the nearer edge when both axes qualify", () => {
expect(resolveSplitDropZone(rect, 120, 240)).toEqual({ kind: "edge", edge: "left" });
expect(resolveSplitDropZone(rect, 140, 210)).toEqual({ kind: "edge", edge: "up" });
expect(resolveSplitDropZone(rect, 460, 390)).toEqual({ kind: "edge", edge: "down" });
expect(resolveSplitDropZone(rect, 490, 370)).toEqual({ kind: "edge", edge: "right" });
});
it("returns half-pane edge indicators and a full-pane center indicator", () => {
expect(splitDropIndicatorRect(rect, { kind: "edge", edge: "left" })).toEqual({
left: 100,
top: 200,
width: 200,
height: 200,
});
expect(splitDropIndicatorRect(rect, { kind: "edge", edge: "right" })).toEqual({
left: 300,
top: 200,
width: 200,
height: 200,
});
expect(splitDropIndicatorRect(rect, { kind: "edge", edge: "up" })).toEqual({
left: 100,
top: 200,
width: 400,
height: 100,
});
expect(splitDropIndicatorRect(rect, { kind: "edge", edge: "down" })).toEqual({
left: 100,
top: 300,
width: 400,
height: 100,
});
expect(splitDropIndicatorRect(rect, { kind: "center" })).toEqual(rect);
});
it("copies non-enumerable DOMRect fields into the indicator rect", () => {
const domRect = Object.create(rect) as typeof rect;
expect(splitDropIndicatorRect(domRect, { kind: "center" })).toEqual(rect);
expect(splitDropIndicatorRect(domRect, { kind: "edge", edge: "down" })).toEqual({
left: 100,
top: 300,
width: 400,
height: 100,
});
});
});
+52
View File
@@ -0,0 +1,52 @@
import type { ChatSplitEdge } from "./split-layout.ts";
export type SplitDropZone = { kind: "edge"; edge: ChatSplitEdge } | { kind: "center" };
export type SplitDropRect = { left: number; top: number; width: number; height: number };
const EDGE_BAND = 0.3;
export function resolveSplitDropZone(rect: SplitDropRect, x: number, y: number): SplitDropZone {
const nx = (x - rect.left) / rect.width;
const ny = (y - rect.top) / rect.height;
const horizontal =
nx <= EDGE_BAND
? { edge: "left" as const, distance: nx }
: 1 - nx <= EDGE_BAND
? { edge: "right" as const, distance: 1 - nx }
: null;
const vertical =
ny <= EDGE_BAND
? { edge: "up" as const, distance: ny }
: 1 - ny <= EDGE_BAND
? { edge: "down" as const, distance: 1 - ny }
: null;
const nearest =
horizontal && vertical
? horizontal.distance <= vertical.distance
? horizontal
: vertical
: (horizontal ?? vertical);
return nearest ? { kind: "edge", edge: nearest.edge } : { kind: "center" };
}
export function splitDropIndicatorRect(rect: SplitDropRect, zone: SplitDropZone): SplitDropRect {
const fullRect = {
left: rect.left,
top: rect.top,
width: rect.width,
height: rect.height,
};
if (zone.kind === "center") {
return fullRect;
}
if (zone.edge === "left") {
return { ...fullRect, width: rect.width / 2 };
}
if (zone.edge === "right") {
return { ...fullRect, left: rect.left + rect.width / 2, width: rect.width / 2 };
}
if (zone.edge === "up") {
return { ...fullRect, height: rect.height / 2 };
}
return { ...fullRect, top: rect.top + rect.height / 2, height: rect.height / 2 };
}
+55 -11
View File
@@ -1,8 +1,10 @@
import { describe, expect, it } from "vitest";
import {
closePane,
createSinglePaneLayout,
createSplitLayout,
findPane,
insertPane,
nextPaneId,
normalizeChatSplitLayout,
panesOf,
@@ -10,13 +12,11 @@ import {
resizePanes,
setActivePane,
setPaneSession,
splitPaneDown,
splitPaneRight,
type ChatSplitLayout,
} from "./split-layout.ts";
function threePaneLayout(): ChatSplitLayout {
return splitPaneDown(createSplitLayout("main"), "p2", "agent:main:second");
return insertPane(createSplitLayout("main"), "p2", "agent:main:second", "down");
}
describe("chat split layout", () => {
@@ -31,8 +31,24 @@ describe("chat split layout", () => {
});
});
it("splits immediately right and below the source while preserving other weights", () => {
const right = splitPaneRight(createSplitLayout("main"), "p1", "right");
it("composes the split layout from an ephemeral single pane", () => {
expect(createSinglePaneLayout("main")).toEqual({
columns: [{ id: "c1", panes: [{ id: "p1", sessionKey: "main" }], paneWeights: [1] }],
columnWeights: [1],
activePaneId: "p1",
});
expect(insertPane(createSinglePaneLayout("main"), "p1", "dropped", "left")).toEqual({
columns: [
{ id: "c2", panes: [{ id: "p2", sessionKey: "dropped" }], paneWeights: [1] },
{ id: "c1", panes: [{ id: "p1", sessionKey: "main" }], paneWeights: [1] },
],
columnWeights: [0.5, 0.5],
activePaneId: "p2",
});
});
it("inserts columns immediately left or right and halves only the target weight", () => {
const right = insertPane(createSplitLayout("main"), "p1", "right", "right");
expect(right.columns.map((column) => column.id)).toEqual(["c1", "c3", "c2"]);
expect(right.columns.map((column) => column.panes.map((pane) => pane.id))).toEqual([
["p1"],
@@ -42,13 +58,32 @@ describe("chat split layout", () => {
expect(right.columnWeights).toEqual([0.25, 0.25, 0.5]);
expect(right.activePaneId).toBe("p3");
const down = splitPaneDown(right, "p1", "down");
const left = insertPane(createSplitLayout("main"), "p2", "left", "left");
expect(left.columns.map((column) => column.panes[0].sessionKey)).toEqual([
"main",
"left",
"main",
]);
expect(left.columnWeights).toEqual([0.5, 0.25, 0.25]);
expect(left.activePaneId).toBe("p3");
});
it("inserts panes immediately up or down and halves only the target weight", () => {
const down = insertPane(createSplitLayout("main"), "p1", "down", "down");
expect(down.columns[0].panes).toEqual([
{ id: "p1", sessionKey: "main" },
{ id: "p4", sessionKey: "down" },
{ id: "p3", sessionKey: "down" },
]);
expect(down.columns[0].paneWeights).toEqual([0.5, 0.5]);
expect(down.activePaneId).toBe("p4");
expect(down.activePaneId).toBe("p3");
const up = insertPane(createSplitLayout("main"), "p1", "up", "up");
expect(up.columns[0].panes).toEqual([
{ id: "p3", sessionKey: "up" },
{ id: "p1", sessionKey: "main" },
]);
expect(up.columns[0].paneWeights).toEqual([0.5, 0.5]);
expect(up.activePaneId).toBe("p3");
});
it("closes panes, collapses columns, and chooses the specified adjacent active pane", () => {
@@ -64,7 +99,7 @@ describe("chat split layout", () => {
{ id: "p3", sessionKey: "agent:main:second" },
]);
const threeColumns = splitPaneRight(createSplitLayout("main"), "p1", "third");
const threeColumns = insertPane(createSplitLayout("main"), "p1", "third", "right");
const collapsedColumn = closePane(threeColumns, "p3");
expect(collapsedColumn?.columns.map((column) => column.id)).toEqual(["c1", "c2"]);
expect(collapsedColumn?.columnWeights[0]).toBeCloseTo(1 / 3);
@@ -86,7 +121,7 @@ describe("chat split layout", () => {
});
it("resizes only a boundary pair and clamps each side to fifteen percent", () => {
const layout = splitPaneRight(createSplitLayout("main"), "p1", "third");
const layout = insertPane(createSplitLayout("main"), "p1", "third", "right");
const columns = resizeColumns(layout, 0, 0.8);
expect(columns.columnWeights[0]).toBeCloseTo(0.4);
expect(columns.columnWeights[1]).toBeCloseTo(0.1);
@@ -178,6 +213,15 @@ describe("chat split layout", () => {
activePaneId: "custom",
};
expect(nextPaneId(layout)).toBe("p15");
expect(splitPaneRight(layout, "custom", "c").columns[1].id).toBe("c10");
const inserted = insertPane(layout, "custom", "c", "right");
expect(inserted.columns[1].id).toBe("c10");
expect(inserted.columns[1].panes[0].id).toBe("p15");
});
it("returns an unchanged clone when the target pane is unknown", () => {
const layout = createSplitLayout("main");
const unchanged = insertPane(layout, "missing", "new", "right");
expect(unchanged).toEqual(layout);
expect(unchanged).not.toBe(layout);
});
});
+28 -35
View File
@@ -1,5 +1,6 @@
export type ChatSplitPane = { id: string; sessionKey: string };
export type ChatSplitColumn = { id: string; panes: ChatSplitPane[]; paneWeights: number[] };
export type ChatSplitEdge = "left" | "right" | "up" | "down";
export type ChatSplitLayout = {
columns: ChatSplitColumn[];
columnWeights: number[];
@@ -50,17 +51,18 @@ export function nextPaneId(layout: ChatSplitLayout): string {
return `p${max + 1}`;
}
export function createSplitLayout(sessionKey: string): ChatSplitLayout {
export function createSinglePaneLayout(sessionKey: string): ChatSplitLayout {
return {
columns: [
{ id: "c1", panes: [{ id: "p1", sessionKey }], paneWeights: [1] },
{ id: "c2", panes: [{ id: "p2", sessionKey }], paneWeights: [1] },
],
columnWeights: [0.5, 0.5],
activePaneId: "p2",
columns: [{ id: "c1", panes: [{ id: "p1", sessionKey }], paneWeights: [1] }],
columnWeights: [1],
activePaneId: "p1",
};
}
export function createSplitLayout(sessionKey: string): ChatSplitLayout {
return insertPane(createSinglePaneLayout(sessionKey), "p1", sessionKey, "right");
}
export function findPane(
layout: ChatSplitLayout,
paneId: string,
@@ -88,43 +90,34 @@ export function panesOf(layout: ChatSplitLayout): ChatSplitPane[] {
return layout.columns.flatMap((column) => column.panes.map((pane) => ({ ...pane })));
}
export function splitPaneRight(
export function insertPane(
layout: ChatSplitLayout,
paneId: string,
targetPaneId: string,
sessionKey: string,
edge: ChatSplitEdge,
): ChatSplitLayout {
const location = findPane(layout, paneId);
const location = findPane(layout, targetPaneId);
const next = cloneLayout(layout);
if (!location) {
return next;
}
const sourceWeight = next.columnWeights[location.columnIndex];
const newPaneId = nextPaneId(layout);
next.columns.splice(location.columnIndex + 1, 0, {
id: nextColumnId(layout),
panes: [{ id: newPaneId, sessionKey }],
paneWeights: [1],
});
next.columnWeights.splice(location.columnIndex, 1, sourceWeight / 2, sourceWeight / 2);
next.activePaneId = newPaneId;
return next;
}
export function splitPaneDown(
layout: ChatSplitLayout,
paneId: string,
sessionKey: string,
): ChatSplitLayout {
const location = findPane(layout, paneId);
const next = cloneLayout(layout);
if (!location) {
return next;
if (edge === "left" || edge === "right") {
const sourceWeight = next.columnWeights[location.columnIndex];
const insertIndex = location.columnIndex + (edge === "right" ? 1 : 0);
next.columns.splice(insertIndex, 0, {
id: nextColumnId(layout),
panes: [{ id: newPaneId, sessionKey }],
paneWeights: [1],
});
next.columnWeights.splice(location.columnIndex, 1, sourceWeight / 2, sourceWeight / 2);
} else {
const column = next.columns[location.columnIndex];
const sourceWeight = column.paneWeights[location.paneIndex];
const insertIndex = location.paneIndex + (edge === "down" ? 1 : 0);
column.panes.splice(insertIndex, 0, { id: newPaneId, sessionKey });
column.paneWeights.splice(location.paneIndex, 1, sourceWeight / 2, sourceWeight / 2);
}
const column = next.columns[location.columnIndex];
const sourceWeight = column.paneWeights[location.paneIndex];
const newPaneId = nextPaneId(layout);
column.panes.splice(location.paneIndex + 1, 0, { id: newPaneId, sessionKey });
column.paneWeights.splice(location.paneIndex, 1, sourceWeight / 2, sourceWeight / 2);
next.activePaneId = newPaneId;
return next;
}
+75
View File
@@ -6,6 +6,16 @@ openclaw-chat-pane {
min-height: 0;
}
.chat-split-view__drop-container {
position: relative;
display: flex;
flex: 1 1 0;
width: 100%;
min-width: 0;
min-height: 0;
overflow: hidden;
}
.chat-split-view {
display: flex;
flex: 1 1 0;
@@ -32,6 +42,71 @@ openclaw-chat-pane {
min-height: 0;
}
.chat-split-view__drop-indicator {
position: absolute;
z-index: 20;
box-sizing: border-box;
pointer-events: none;
border: 1px solid color-mix(in srgb, var(--accent) 65%, transparent);
border-radius: var(--radius-sm);
background: color-mix(in srgb, var(--accent) 14%, transparent);
}
.chat-split-view__drop-indicator--center {
border-color: transparent;
background: transparent;
box-shadow: inset 0 0 0 2px var(--accent);
}
.chat-split-view__drop-indicator-label {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
padding: 3px 10px;
border: 1px solid var(--border);
border-radius: 999px;
background: var(--panel);
color: var(--text);
font-size: 11px;
font-weight: 500;
white-space: nowrap;
pointer-events: none;
}
@media (prefers-reduced-motion: no-preference) {
.chat-split-view__drop-indicator {
animation: chat-drop-indicator-in 0.12s ease;
transition:
left 0.14s ease,
top 0.14s ease,
width 0.14s ease,
height 0.14s ease,
opacity 0.12s ease;
}
.chat-split-view openclaw-chat-pane {
animation: chat-pane-in 0.16s ease;
}
@keyframes chat-drop-indicator-in {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@keyframes chat-pane-in {
from {
opacity: 0;
transform: scale(0.985);
}
}
}
.chat-pane__header {
display: flex;
align-items: center;
+4
View File
@@ -769,6 +769,10 @@
stroke-linejoin: round;
}
.sidebar-recent-session--dragging {
opacity: 0.45;
}
.sidebar-recent-session {
display: flex;
align-items: center;