zames_pro 2.64.1 → 2.65.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/i18n.js CHANGED
@@ -7,6 +7,15 @@
7
7
  //
8
8
  // Strategy: a single key->translation map. New keys are easy to add.
9
9
  // Russian texts (ru) are the default, English (en) is the alternative.
10
+ import { commonMessages } from './i18n/common.js';
11
+ import { helpMessages } from './i18n/help.js';
12
+ import { spinnerMessages } from './i18n/spinner.js';
13
+ import { doctorMessages } from './i18n/doctor.js';
14
+ import { deepseekMessages } from './i18n/deepseek.js';
15
+ import { selfReviewMessages } from './i18n/self-review.js';
16
+ import { mcpMessages } from './i18n/mcp.js';
17
+ import { configMessages } from './i18n/config.js';
18
+ import { promptMessages } from './i18n/prompt.js';
10
19
  export const DEFAULT_LOCALE = 'ru';
11
20
  export const LOCALES = [
12
21
  { code: 'ru', name: 'Русский', englishName: 'Russian' },
@@ -25,1731 +34,19 @@ export function normalizeLocale(v) {
25
34
  return 'en';
26
35
  return DEFAULT_LOCALE;
27
36
  }
28
- // String catalog. Key -> { ru, en }. If a key is missing — we return the key itself.
37
+ // String catalog. Key -> { ru, en }. If a key is missing we return the key itself.
38
+ // Split into section files (C3 step 1); merged here so callers keep importing
39
+ // CATALOG from a single place.
29
40
  export const CATALOG = {
30
- 'app.tagline': {
31
- ru: 'агент поверх chat.deepseek.com через Playwright',
32
- en: 'coding agent over chat.deepseek.com via Playwright',
33
- },
34
- 'common.yes': { ru: 'да', en: 'yes' },
35
- 'common.no': { ru: 'нет', en: 'no' },
36
- 'common.on': { ru: 'вкл', en: 'on' },
37
- 'common.off': { ru: 'выкл', en: 'off' },
38
- 'common.none': { ru: '(нет)', en: '(none)' },
39
- 'common.unknown': { ru: 'неизвестно', en: 'unknown' },
40
- // ---------- help ----------
41
- 'help.options': { ru: 'Опции CLI:', en: 'CLI options:' },
42
- 'help.color_note': {
43
- ru: 'Цвет отключается переменной окружения NO_COLOR=1.',
44
- en: 'Disable color with the NO_COLOR=1 environment variable.',
45
- },
46
- 'help.opt.dir': {
47
- ru: 'рабочая директория агента',
48
- en: 'agent working directory',
49
- },
50
- 'help.opt.task': { ru: 'задача одной строкой', en: 'single-line task' },
51
- 'help.opt.chat': {
52
- ru: 'продолжить существующий чат по id',
53
- en: 'resume an existing chat by id',
54
- },
55
- 'help.opt.resume_last': {
56
- ru: 'вернуться в последний сохранённый чат',
57
- en: 'resume the last saved chat',
58
- },
59
- 'help.opt.new_chat': {
60
- ru: 'начать новый чат (по умолчанию)',
61
- en: 'start a new chat (default)',
62
- },
63
- 'help.opt.resend_prompt': {
64
- ru: 'дослать system-prompt в существующий чат',
65
- en: 'resend system-prompt into an existing chat',
66
- },
67
- 'help.opt.max_iter': {
68
- ru: 'лимит итераций, 0 = без лимита ({n})',
69
- en: 'iteration limit, 0 = unlimited ({n})',
70
- },
71
- 'help.opt.headless': {
72
- ru: 'браузер без UI (по умолчанию)',
73
- en: 'headless browser (default)',
74
- },
75
- 'help.opt.headed': {
76
- ru: 'показать окно браузера (отладка/вход)',
77
- en: 'show the browser window (debug/sign-in)',
78
- },
79
- 'help.opt.debug': { ru: 'подробный лог', en: 'verbose log' },
80
- 'help.opt.dev': {
81
- ru: 'режим разработки: авто-перечитывание модулей',
82
- en: 'dev mode: auto-reload modules',
83
- },
84
- 'help.opt.version': { ru: 'показать версию', en: 'show version' },
85
- 'help.opt.no_color': {
86
- ru: 'отключить цвет (то же, что NO_COLOR=1)',
87
- en: 'disable color (same as NO_COLOR=1)',
88
- },
89
- 'help.opt.help': { ru: 'эта справка', en: 'this help' },
90
- 'help.while_working': {
91
- ru: 'Пока агент работает:',
92
- en: 'While the agent is working:',
93
- },
94
- 'help.key.queue': {
95
- ru: 'печать + Enter поставить сообщение в очередь (уйдёт после текущей задачи)',
96
- en: 'type + Enter queue a message (sent after the current task)',
97
- },
98
- 'help.key.history': {
99
- ru: '↑ / ↓ история введённых сообщений',
100
- en: '↑ / ↓ input history',
101
- },
102
- 'help.key.search': {
103
- ru: 'Ctrl+R поиск по истории (обратный)',
104
- en: 'Ctrl+R reverse-search the history',
105
- },
106
- 'help.key.undo': {
107
- ru: 'Ctrl+_ отменить правку в строке ввода',
108
- en: 'Ctrl+_ undo the last edit in the input line',
109
- },
110
- 'help.key.words': {
111
- ru: 'Ctrl+← / Ctrl+→ перемещение по словам',
112
- en: 'Ctrl+← / Ctrl+→ move by words',
113
- },
114
- 'help.key.slash': {
115
- ru: '/ + Tab подсказка и автодополнение slash-команд (Ctrl+N/P — листать)',
116
- en: '/ + Tab slash-command hints and completion (Ctrl+N/P to page)',
117
- },
118
- 'help.key.newline': {
119
- ru: 'Ctrl+J / Ctrl+Enter новая строка (Shift+Enter в терминалах с поддержкой)',
120
- en: 'Ctrl+J / Ctrl+Enter new line (Shift+Enter in capable terminals)',
121
- },
122
- 'help.key.backslash': {
123
- ru: '\\ + Enter тоже новая строка',
124
- en: '\\ + Enter also a new line',
125
- },
126
- 'help.key.attach': {
127
- ru: 'Ctrl+Shift+V картинки вставить изображение/файл (сохранится в tmp)',
128
- en: 'Ctrl+Shift+V image paste an image/file (saved to tmp)',
129
- },
130
- 'help.key.esc': {
131
- ru: 'Esc, Ctrl+C прервать текущую генерацию',
132
- en: 'Esc, Ctrl+C abort current generation',
133
- },
134
- 'help.key.bang': {
135
- ru: '!команда выполнить shell-команду напрямую (мимо модели)',
136
- en: '!command run a shell command directly (bypass the model)',
137
- },
138
- 'help.commands': { ru: 'Команды:', en: 'Commands:' },
139
- 'help.sec.session': { ru: 'Сессия', en: 'Session' },
140
- 'help.sec.workspace': { ru: 'Рабочая директория', en: 'Workspace' },
141
- 'help.sec.git': { ru: 'Git', en: 'Git' },
142
- 'help.sec.agent': { ru: 'Агент', en: 'Agent' },
143
- 'help.sec.context': { ru: 'Контекст и настройки', en: 'Context & settings' },
144
- 'help.sec.files': { ru: 'Файлы и прочее', en: 'Files & misc' },
145
- 'help.cmd.new': {
146
- ru: '/new, /clear новый чат (сброс контекста)',
147
- en: '/new, /clear new chat (reset context)',
148
- },
149
- 'help.cmd.sessions': {
150
- ru: '/sessions [фильтр] список сохранённых сессий (можно фильтровать)',
151
- en: '/sessions [filter] list saved sessions (optionally filtered)',
152
- },
153
- 'help.cmd.resume_id': {
154
- ru: '/resume-id <id> восстановить сессию по полному id',
155
- en: '/resume-id <id> resume a session by full id',
156
- },
157
- 'help.cmd.chats': {
158
- ru: '/chats [фильтр] список последних чатов DeepSeek',
159
- en: '/chats [filter] recent DeepSeek chats',
160
- },
161
- 'help.cmd.resume': {
162
- ru: '/resume <n> открыть чат №n из /chats',
163
- en: '/resume <n> open chat #n from /chats',
164
- },
165
- 'help.cmd.last': {
166
- ru: '/last открыть последний чат этого каталога',
167
- en: '/last open the last chat of this directory',
168
- },
169
- 'help.cmd.chat': {
170
- ru: '/chat показать текущий chat id',
171
- en: '/chat show current chat id',
172
- },
173
- 'help.cmd.cd': {
174
- ru: '/cd <path> сменить рабочую директорию',
175
- en: '/cd <path> change working directory',
176
- },
177
- 'help.cmd.pwd': {
178
- ru: '/pwd текущая директория',
179
- en: '/pwd current directory',
180
- },
181
- 'help.cmd.status': {
182
- ru: '/status состояние сессии',
183
- en: '/status session state',
184
- },
185
- 'help.cmd.reload': {
186
- ru: '/reload перечитать модули логики без перезапуска',
187
- en: '/reload hot-reload logic modules',
188
- },
189
- 'help.cmd.undo': {
190
- ru: '/undo откатить последнюю запись/правку',
191
- en: '/undo revert the last write/edit',
192
- },
193
- 'help.cmd.undo_list': {
194
- ru: '/undo-list список того, что можно откатить',
195
- en: '/undo-list list revertable changes',
196
- },
197
- 'help.cmd.rewind': {
198
- ru: '/rewind [n] откатить рабочее дерево к чекпойнту',
199
- en: '/rewind [n] roll the working tree back to a checkpoint',
200
- },
201
- 'help.cmd.rewind_list': {
202
- ru: '/rewind-list список чекпойнтов',
203
- en: '/rewind-list list checkpoints',
204
- },
205
- 'help.cmd.transcript': {
206
- ru: '/transcript путь к файлу транскрипта',
207
- en: '/transcript transcript file path',
208
- },
209
- 'help.cmd.diff': {
210
- ru: '/diff [--staged] показать git diff',
211
- en: '/diff [--staged] show working tree git diff',
212
- },
213
- 'help.cmd.diffstat': {
214
- ru: '/diffstat сводка изменений (git diff --stat)',
215
- en: '/diffstat change summary (git diff --stat)',
216
- },
217
- 'help.cmd.retry': {
218
- ru: '/retry повторить последнюю задачу в этом чате',
219
- en: '/retry resend the last task into this chat',
220
- },
221
- 'help.cmd.rename': {
222
- ru: '/rename <title> задать имя текущей сессии',
223
- en: '/rename <title> set the current session title',
224
- },
225
- 'help.cmd.context': {
226
- ru: '/context что загружено в промпт (AGENTS/MEMORY/skills/commands)',
227
- en: '/context what is loaded into the prompt (AGENTS/MEMORY/skills/commands)',
228
- },
229
- 'help.cmd.copy': {
230
- ru: '/copy скопировать последний ответ в буфер обмена',
231
- en: '/copy copy the last answer to the clipboard',
232
- },
233
- 'help.cmd.cost': { ru: '/cost статистика сессии', en: '/cost session stats' },
234
- 'help.cmd.export': {
235
- ru: '/export [file] выгрузить сессию в Markdown',
236
- en: '/export [file] export the session to Markdown',
237
- },
238
- 'help.cmd.doctor': {
239
- ru: '/doctor диагностика установки и конфига',
240
- en: '/doctor diagnose install and config',
241
- },
242
- 'help.cmd.add_dir': {
243
- ru: '/add-dir <path> проверить директорию',
244
- en: '/add-dir <path> validate a directory',
245
- },
246
- 'help.cmd.review': {
247
- ru: '/review [focus] ревью незакоммиченных изменений',
248
- en: '/review [focus] review uncommitted changes',
249
- },
250
- 'help.cmd.improve': {
251
- ru: '/improve [id] взять следующий пункт BACKLOG и довести до тестов',
252
- en: '/improve [id] take the next BACKLOG item and drive it to green tests',
253
- },
254
- 'improve.no_backlog': {
255
- ru: 'BACKLOG.md не найден в рабочей директории.',
256
- en: 'BACKLOG.md was not found in the working directory.',
257
- },
258
- 'improve.all_done': {
259
- ru: 'Открытых пунктов в BACKLOG нет.',
260
- en: 'There are no open BACKLOG items.',
261
- },
262
- 'improve.not_found': {
263
- ru: 'Пункт {v} не найден в BACKLOG.',
264
- en: 'Item {v} was not found in BACKLOG.',
265
- },
266
- 'improve.start': {
267
- ru: 'Улучшение {id}: {title}',
268
- en: 'Improving {id}: {title}',
269
- },
270
- 'improve.collapsed': {
271
- ru: 'BACKLOG свёрнут: удалено архивных блоков — {n}.',
272
- en: 'BACKLOG collapsed: {n} archived block(s) removed.',
273
- },
274
- 'help.cmd.backlog': {
275
- ru: '/backlog <текст> записать идею в BACKLOG.md',
276
- en: '/backlog <text> record an idea in BACKLOG.md',
277
- },
278
- 'backlog.usage': {
279
- ru: 'Использование: /backlog <текст идеи>',
280
- en: 'Usage: /backlog <idea text>',
281
- },
282
- 'backlog.none': {
283
- ru: 'BACKLOG.md не найден в рабочей директории.',
284
- en: 'BACKLOG.md was not found in the working directory.',
285
- },
286
- 'backlog.adding': {
287
- ru: 'Записываю в BACKLOG: {v}',
288
- en: 'Recording in BACKLOG: {v}',
289
- },
290
- 'backlog.warn': {
291
- ru: 'BACKLOG.md разросся ({lines} строк, {chars} символов). Сверни сделанное: /backlog collapse',
292
- en: 'BACKLOG.md has grown large ({lines} lines, {chars} chars). Collapse it: /backlog collapse',
293
- },
294
- 'backlog.empty': {
295
- ru: 'Свёртывать нечего: архивных блоков нет.',
296
- en: 'Nothing to collapse: there are no archived blocks.',
297
- },
298
- 'help.cmd.compact': {
299
- ru: '/compact сжать историю и открыть новый чат с резюме',
300
- en: '/compact compact the history and open a new chat with the summary',
301
- },
302
- 'help.cmd.queue': {
303
- ru: '/queue [clear] показать/очистить очередь сообщений',
304
- en: '/queue [clear] list/clear the pending message queue',
305
- },
306
- 'help.cmd.tasks': {
307
- ru: '/tasks список задач агента (TodoWrite)',
308
- en: '/tasks the agent task list (TodoWrite)',
309
- },
310
- 'help.cmd.thinking': {
311
- ru: '/thinking [on|off] включить/выключить режим размышления (можно во время работы)',
312
- en: '/thinking [on|off] toggle Deep thinking (works while the agent is busy)',
313
- },
314
- 'help.cmd.web': {
315
- ru: '/web [on|off] включить/выключить поиск в интернете (можно во время работы)',
316
- en: '/web [on|off] toggle Smart search (works while the agent is busy)',
317
- },
318
- 'help.cmd.goal': {
319
- ru: '/goal [текст|clear] задать долгоживущую цель сессии',
320
- en: '/goal [text|clear] set a long-lived session goal',
321
- },
322
- 'help.cmd.plan': {
323
- ru: '/plan [on|off] режим плана: только чтение, без правок и команд',
324
- en: '/plan [on|off] plan mode: read-only, no edits or commands',
325
- },
326
- 'plan.on': {
327
- ru: 'Режим плана ВКЛ: доступны только инструменты чтения. Правки и команды запрещены. /plan off — выключить.',
328
- en: 'Plan mode ON: only read tools are available. Edits and commands are disabled. /plan off to disable.',
329
- },
330
- 'plan.off': {
331
- ru: 'Режим плана ВЫКЛ: агент снова может писать и запускать команды.',
332
- en: 'Plan mode OFF: the agent can edit and run commands again.',
333
- },
334
- 'help.opt.output_format': {
335
- ru: 'формат вывода: text|json|jsonl (для скриптов)',
336
- en: 'output format: text|json|jsonl (for scripts)',
337
- },
338
- 'help.opt.plan': {
339
- ru: 'стартовать в режиме плана (только чтение)',
340
- en: 'start in plan mode (read-only)',
341
- },
342
- 'help.cmd.loop': {
343
- ru: '/loop <интервал> <задача> периодически повторять задачу (напр. 10m)',
344
- en: '/loop <interval> <task> repeat a task periodically (e.g. 10m)',
345
- },
346
- 'help.cmd.cron': {
347
- ru: '/cron <выражение> <задача> запускать по расписанию (5 полей)',
348
- en: '/cron <expr> <task> schedule a task (5-field cron)',
349
- },
350
- 'help.cmd.jobs': {
351
- ru: '/jobs [rm <id>|clear] список/удаление запланированных задач',
352
- en: '/jobs [rm <id>|clear] list/remove scheduled tasks',
353
- },
354
- 'sched.loop_usage': {
355
- ru: 'Использование: /loop <интервал> <задача>, например /loop 10m проверь тесты',
356
- en: 'Usage: /loop <interval> <task>, e.g. /loop 10m check the tests',
357
- },
358
- 'sched.cron_usage': {
359
- ru: 'Использование: /cron "<мин> <час> <день> <мес> <день недели>" <задача>',
360
- en: 'Usage: /cron "<min> <hour> <dom> <month> <dow>" <task>',
361
- },
362
- 'sched.loop_too_short': {
363
- ru: 'Слишком часто: минимум {min} (троттлинг отправок 15с).',
364
- en: 'Too frequent: minimum {min} (the send throttle is 15s).',
365
- },
366
- 'sched.added': {
367
- ru: '⏰ Задача #{id} добавлена ({when}): {task}',
368
- en: '⏰ Job #{id} added ({when}): {task}',
369
- },
370
- 'sched.title': { ru: 'Запланированные задачи:', en: 'Scheduled jobs:' },
371
- 'sched.none': { ru: 'Запланированных задач нет.', en: 'No scheduled jobs.' },
372
- 'sched.fired': {
373
- ru: '⏰ Задача #{id} сработала: {task}',
374
- en: '⏰ Job #{id} fired: {task}',
375
- },
376
- 'sched.cleared': { ru: 'Задачи очищены: {n}', en: 'Jobs cleared: {n}' },
377
- 'sched.removed': { ru: 'Задача #{id} удалена.', en: 'Job #{id} removed.' },
378
- 'sched.rm_usage': {
379
- ru: 'Использование: /jobs rm <id>',
380
- en: 'Usage: /jobs rm <id>',
381
- },
382
- 'sched.remove_hint': {
383
- ru: 'Удалить: /jobs rm <id> · очистить всё: /jobs clear',
384
- en: 'Remove: /jobs rm <id> · clear all: /jobs clear',
385
- },
386
- 'goal.set': { ru: '🎯 Цель сессии: {goal}', en: '🎯 Session goal: {goal}' },
387
- 'goal.loaded': {
388
- ru: '🎯 Восстановлена цель сессии: {goal}',
389
- en: '🎯 Restored session goal: {goal}',
390
- },
391
- 'goal.current': {
392
- ru: '🎯 Цель сессии: {goal}',
393
- en: '🎯 Session goal: {goal}',
394
- },
395
- 'goal.none': {
396
- ru: 'Цель сессии не задана. /goal <текст>, /goal clear.',
397
- en: 'No session goal. /goal <text>, /goal clear.',
398
- },
399
- 'goal.cleared': {
400
- ru: '🎯 Цель сессии очищена.',
401
- en: '🎯 Session goal cleared.',
402
- },
403
- 'toggle.thinking': { ru: 'Размышление', en: 'Deep thinking' },
404
- 'toggle.search': { ru: 'Поиск в интернете', en: 'Smart search' },
405
- 'toggle.set': { ru: '{name}: {state}', en: '{name}: {state}' },
406
- 'compact.auto_trigger': {
407
- ru: '🗜️ Контекст заполнен на {pct}% ({tokens} токенов) — сжимаю историю и открываю новый чат...',
408
- en: '🗜️ Context at {pct}% ({tokens} tokens) — compacting the history and opening a fresh chat...',
409
- },
410
- 'compact.auto_same_chat': {
411
- ru: '🗜️ Сжатие не открыло новый чат (тот же id) — отключаю авто-сжатие до конца задачи, чтобы не зациклиться.',
412
- en: '🗜️ Compaction did not open a fresh chat (same id) — disabling auto-compact for the rest of the task to avoid a loop.',
413
- },
414
- 'compact.start': {
415
- ru: '🗜️ Сжимаю историю чата (DeepSeek)...',
416
- en: '🗜️ Compacting the chat history (DeepSeek)...',
417
- },
418
- 'compact.empty': {
419
- ru: 'Нечего сжимать: в чате ещё нет ответов.',
420
- en: 'Nothing to compact: the chat has no answers yet.',
421
- },
422
- 'compact.summary_failed': {
423
- ru: 'Не удалось получить резюме от модели: {v}',
424
- en: 'Could not get the summary from the model: {v}',
425
- },
426
- 'compact.summary_retry': {
427
- ru: 'Не удалось получить резюме ({v}). Повтор {attempt}/{max}...',
428
- en: 'Could not get the summary ({v}). Retry {attempt}/{max}...',
429
- },
430
- 'compact.summary_fallback': {
431
- ru: 'Модель не смогла сделать резюме — переношу последние {v} сообщений диалога как есть.',
432
- en: 'The model could not produce a summary — carrying the last {v} messages over as-is.',
433
- },
434
- 'compact.done': {
435
- ru: '✅ История сжата, открыт новый чат с резюме.',
436
- en: '✅ History compacted, a new chat with the summary is open.',
437
- },
438
- 'compact.report': {
439
- ru: 'Резюме перенесено в новый чат ({chars} символов, токенов было ~{tokens}).',
440
- en: 'The summary was carried into the new chat ({chars} chars, ~{tokens} tokens before).',
441
- },
442
- 'compact.no_chat': {
443
- ru: 'Чат ещё не создан — сжимать нечего.',
444
- en: 'No chat created yet — nothing to compact.',
445
- },
446
- 'diff.not_repo': { ru: 'Не git-репозиторий.', en: 'Not a git repository.' },
447
- 'export.done': { ru: 'Сессия выгружена: {v}', en: 'Session exported: {v}' },
448
- 'export.outside': {
449
- ru: 'Путь вне рабочей директории.',
450
- en: 'Path is outside the working directory.',
451
- },
452
- 'adddir.not_dir': {
453
- ru: 'Нет такой директории: {v}',
454
- en: 'No such directory: {v}',
455
- },
456
- 'adddir.note': {
457
- ru: 'Директория существует: {v}. Только проверка — песочница фиксируется при запуске, доступ не расширяется (перезапустите с --dir, чтобы работать там).',
458
- en: 'Directory exists: {v}. Check only — the sandbox is fixed at startup, access is NOT granted (relaunch with --dir to work there).',
459
- },
460
- 'help.cmd.config': {
461
- ru: '/config настройки: показать и изменить',
462
- en: '/config settings: view and edit',
463
- },
464
- 'help.cmd.lang': {
465
- ru: '/config lang <ru|en> сменить язык интерфейса и агента',
466
- en: '/config lang <ru|en> switch UI and agent language',
467
- },
468
- 'help.cmd.debug_dom': {
469
- ru: '/debug-dom сохранить HTML страницы (для отладки)',
470
- en: '/debug-dom dump page HTML (debug)',
471
- },
472
- 'help.no_topic': {
473
- ru: 'Нет команды по запросу «{v}». Попробуй /help без аргумента.',
474
- en: 'No command matches "{v}". Try /help without arguments.',
475
- },
476
- 'help.cmd.help': {
477
- ru: '/help, help справка',
478
- en: '/help, help this help',
479
- },
480
- 'help.cmd.exit': {
481
- ru: '/exit, /quit, exit выход',
482
- en: '/exit, /quit, exit exit',
483
- },
484
- 'skills.none': {
485
- ru: 'Навыки не найдены. Добавьте SKILL.md в .zames/skills/<имя>/ или ~/.zames/skills/.',
486
- en: 'No skills found. Add SKILL.md under .zames/skills/<name>/ or ~/.zames/skills/.',
487
- },
488
- 'skills.title': { ru: 'Найдено навыков: {n}', en: 'Skills found: {n}' },
489
- 'memory.agents': {
490
- ru: 'Инструкции (AGENTS.md):',
491
- en: 'Instructions (AGENTS.md):',
492
- },
493
- 'memory.memory': { ru: 'Память (MEMORY.md):', en: 'Memory (MEMORY.md):' },
494
- 'remember.usage': {
495
- ru: 'Использование: /remember <текст заметки>',
496
- en: 'Usage: /remember <note text>',
497
- },
498
- 'remember.saved': {
499
- ru: '🧠 Заметка добавлена в {v}',
500
- en: '🧠 Note appended to {v}',
501
- },
502
- 'init.exists': {
503
- ru: 'AGENTS.md уже существует: {v}',
504
- en: 'AGENTS.md already exists: {v}',
505
- },
506
- 'init.created': { ru: 'Создан {v}', en: 'Created {v}' },
507
- 'init.analyzing': {
508
- ru: 'Изучаю проект и готовлю AGENTS.md...',
509
- en: 'Analyzing the project and preparing AGENTS.md...',
510
- },
511
- 'init.done': {
512
- ru: 'AGENTS.md создан агентом: {v}',
513
- en: 'AGENTS.md created by the agent: {v}',
514
- },
515
- 'init.failed': {
516
- ru: 'Не удалось создать AGENTS.md автоматически, записан базовый шаблон.',
517
- en: 'Could not create AGENTS.md automatically, wrote a basic template.',
518
- },
519
- 'init.overwrite': {
520
- ru: 'AGENTS.md уже существует: {v} (используйте /init --force для перезаписи)',
521
- en: 'AGENTS.md already exists: {v} (use /init --force to overwrite)',
522
- },
523
- 'help.cmd.skill': { ru: 'навык (SKILL.md)', en: 'skill (SKILL.md)' },
524
- 'help.cmd.custom': { ru: 'пользовательская команда', en: 'custom command' },
525
- 'help.cmd.skills': {
526
- ru: '/skills список найденных навыков',
527
- en: '/skills list discovered skills',
528
- },
529
- 'help.cmd.memory': {
530
- ru: '/memory показать MEMORY.md и AGENTS.md',
531
- en: '/memory show MEMORY.md and AGENTS.md',
532
- },
533
- 'help.cmd.remember': {
534
- ru: '/remember <текст> дописать заметку в MEMORY.md',
535
- en: '/remember <text> append a note to MEMORY.md',
536
- },
537
- 'help.cmd.init': {
538
- ru: '/init [--force] изучить проект и создать AGENTS.md',
539
- en: '/init [--force] analyze the project and create AGENTS.md',
540
- },
541
- 'help.skills': {
542
- ru: 'Навыки и свои команды:',
543
- en: 'Skills and custom commands:',
544
- },
545
- 'help.self_review': {
546
- ru: 'Самообзор (отладка агента):',
547
- en: 'Self-review (agent debugging):',
548
- },
549
- 'help.self.review': {
550
- ru: '/self-review [фокус] снять снапшот src/ и запустить ревью',
551
- en: '/self-review [focus] snapshot src/ and run review',
552
- },
553
- 'help.self.fix': {
554
- ru: '/self-fix <name> [фокус] вернуться в существующий снапшот и продолжить',
555
- en: '/self-fix <name> [focus] enter an existing snapshot and continue',
556
- },
557
- 'help.self.done': {
558
- ru: '/self-done выйти из режима ревью (вернуться в свою папку)',
559
- en: '/self-done leave review mode (back to your dir)',
560
- },
561
- 'help.self.list': {
562
- ru: '/self-list список снапшотов',
563
- en: '/self-list list snapshots',
564
- },
565
- 'help.self.diff': {
566
- ru: '/self-diff <name> различия между текущим src/ и снапшотом',
567
- en: '/self-diff <name> diff between current src/ and snapshot',
568
- },
569
- 'help.self.apply': {
570
- ru: '/self-apply <name> применить снапшот к src/ (с бэкапом)',
571
- en: '/self-apply <name> apply snapshot to src/ (with backup)',
572
- },
573
- 'help.files': { ru: 'Файлы:', en: 'Files:' },
574
- 'help.files.logs': { ru: 'Логи:', en: 'Logs:' },
575
- 'help.files.undo': { ru: 'Undo:', en: 'Undo:' },
576
- 'help.files.checkpoints': { ru: 'Чекпойнты:', en: 'Checkpoints:' },
577
- 'help.files.sessions': { ru: 'Сессии:', en: 'Sessions:' },
578
- 'help.files.profile': { ru: 'Профиль:', en: 'Profile:' },
579
- 'help.files.snapshots': { ru: 'Снапшоты:', en: 'Snapshots:' },
580
- 'help.files.tmp': { ru: 'Временные:', en: 'Temp:' },
581
- 'help.files.tmp_note': {
582
- ru: '(в .gitignore, очищается при старте)',
583
- en: '(.gitignore, cleaned on start)',
584
- },
585
- 'help.files.config': { ru: 'Конфиг:', en: 'Config:' },
586
- 'help.toggles_legend': {
587
- ru: 'Индикаторы в статус-строке: 🧠 — глубокое размышление, 🌐 — поиск в интернете (видны, когда включены).',
588
- en: 'Status-line icons: 🧠 — Deep thinking, 🌐 — web search (shown when enabled).',
589
- },
590
- // ---------- spinner ----------
591
- 'spinner.phrases': {
592
- ru: 'Анализирую запрос…|Изучаю контекст…|Планирую решение…|Обрабатываю данные…|Формулирую ответ…|Проверяю детали…|Собираю информацию…|Обдумываю варианты…|Структурирую мысли…|Готовлю решение…|Анализирую код…|Уточняю детали…|Выполняю вычисления…|Систематизирую данные…|Прорабатываю задачу…|Проверяю логику…|Оптимизирую подход…|Формирую выводы…',
593
- en: 'Analyzing the request…|Reviewing the context…|Planning the solution…|Processing the data…|Formulating the answer…|Checking the details…|Gathering information…|Weighing the options…|Structuring the thoughts…|Preparing the solution…|Analyzing the code…|Clarifying the details…|Running the computation…|Organizing the data…|Working through the task…|Verifying the logic…|Optimizing the approach…|Forming conclusions…',
594
- },
595
- 'spinner.hint': { ru: 'Esc — стоп', en: 'Esc — stop' },
596
- 'spinner.pause': {
597
- ru: '⏳ пауза {n}с перед отправкой',
598
- en: '⏳ pause {n}s before send',
599
- },
600
- 'spinner.running_tool': {
601
- ru: '⚙ выполняю {name}',
602
- en: '⚙ running {name}',
603
- },
604
- // Send/generation lifecycle indicator in the status line. Unlike the
605
- // animated thinking phrase, it says explicitly that a generation is in
606
- // flight. 'paused'/'settled' have no label (see LineEditor._stateLabel).
607
- 'state.generating': { ru: '▶ генерация', en: '▶ generating' },
608
- 'state.settled': { ru: '✓ готово', en: '✓ done' },
609
- 'editor.more': { ru: '…ещё {n}', en: '…{n} more' },
610
- 'editor.page_hint': {
611
- ru: '(Ctrl+N/Ctrl+P — листать, Tab — вставить)',
612
- en: '(Ctrl+N/Ctrl+P to page, Tab to insert)',
613
- },
614
- 'editor.answer': { ru: '● Ответ', en: '● Answer' },
615
- // Reverse search (Ctrl+R) status line. The query may be empty.
616
- 'editor.search_prompt': {
617
- ru: '(обратный поиск) `{q}` — Ctrl+R дальше, Enter принять, Esc отмена',
618
- en: '(reverse-i-search) `{q}` — Ctrl+R next, Enter accept, Esc cancel',
619
- },
620
- 'editor.search_fail': {
621
- ru: '(обратный поиск) `{q}` — не найдено, Esc отмена',
622
- en: '(reverse-i-search) `{q}` — not found, Esc cancel',
623
- },
624
- // ---------- status ----------
625
- 'status.workdir': {
626
- ru: 'Рабочая директория: {v}',
627
- en: 'Working directory: {v}',
628
- },
629
- 'status.review_mode': { ru: 'Режим ревью: {v}', en: 'Review mode: {v}' },
630
- 'status.review_none': { ru: 'нет', en: 'no' },
631
- 'status.orig_dir': {
632
- ru: 'Исходная директория: {v}',
633
- en: 'Original directory: {v}',
634
- },
635
- 'status.chat': { ru: 'Текущий чат: {v}', en: 'Current chat: {v}' },
636
- 'status.fresh_next': {
637
- ru: 'Fresh chat на след. задаче: {v}',
638
- en: 'Fresh chat next task: {v}',
639
- },
640
- 'status.prompt_next': {
641
- ru: 'System prompt на след. задаче: {v}',
642
- en: 'System prompt next task: {v}',
643
- },
644
- 'status.resend': {
645
- ru: 'Resend prompt (--resend-prompt): {v}',
646
- en: 'Resend prompt (--resend-prompt): {v}',
647
- },
648
- 'status.last_chat': { ru: 'Last chat: {v}', en: 'Last chat: {v}' },
649
- 'status.sessions': { ru: 'Сессии: {v}', en: 'Sessions: {v}' },
650
- 'status.dev': {
651
- ru: 'Dev mode (auto-reload): {v}',
652
- en: 'Dev mode (auto-reload): {v}',
653
- },
654
- 'status.max_iter': {
655
- ru: 'Лимит итераций: {v} (0 = без лимита)',
656
- en: 'Iteration limit: {v} (0 = unlimited)',
657
- },
658
- 'status.headless': { ru: 'Headless: {v}', en: 'Headless: {v}' },
659
- 'status.debug': { ru: 'Debug: {v}', en: 'Debug: {v}' },
660
- 'status.undo': { ru: 'Undo: {v}', en: 'Undo: {v}' },
661
- 'status.checkpoint': { ru: 'Чекпойнты: {v}', en: 'Checkpoints: {v}' },
662
- 'status.transcript': { ru: 'Транскрипт: {v}', en: 'Transcript: {v}' },
663
- 'status.locale': { ru: 'Язык: {v}', en: 'Language: {v}' },
664
- 'status.goal': { ru: 'Цель сессии: {v}', en: 'Session goal: {v}' },
665
- 'status.tasks_summary': {
666
- ru: 'задачи: {done}/{total}',
667
- en: 'tasks: {done}/{total}',
668
- },
669
- // ---------- tasks (/tasks) ----------
670
- 'tasks.title': { ru: 'Задачи агента:', en: 'Agent tasks:' },
671
- 'tasks.empty': {
672
- ru: 'Список задач пуст (агент ещё не вызывал TodoWrite).',
673
- en: 'The task list is empty (the agent has not called TodoWrite yet).',
674
- },
675
- 'tasks.restored': {
676
- ru: 'Восстановлен список задач: {done}/{total}',
677
- en: 'Task list restored: {done}/{total}',
678
- },
679
- // ---------- messages ----------
680
- 'msg.working_dir': {
681
- ru: 'Рабочая директория: {v}',
682
- en: 'Working directory: {v}',
683
- },
684
- 'msg.transcript': { ru: 'Транскрипт: {v}', en: 'Transcript: {v}' },
685
- 'msg.new_chat': { ru: 'Создаю новый чат...', en: 'Creating a new chat...' },
686
- 'msg.new_chat_ok': { ru: 'Новый чат.', en: 'New chat.' },
687
- 'msg.resuming': {
688
- ru: 'Восстанавливаю сессию {id}...',
689
- en: 'Restoring session {id}...',
690
- },
691
- 'msg.input_locked': {
692
- ru: 'Идёт операция, ввод временно заблокирован…',
693
- en: 'Operation in progress, input is temporarily locked…',
694
- },
695
- 'msg.opening_chat': {
696
- ru: 'Открываю чат {id}...',
697
- en: 'Opening chat {id}...',
698
- },
699
- 'msg.chat_opened': { ru: 'Чат открыт.', en: 'Chat opened.' },
700
- 'msg.version': { ru: 'Версия: {v}', en: 'Version: {v}' },
701
- 'msg.interactive': {
702
- ru: 'Интерактивный режим. Введите задачу. Команды — /help. Выход — /exit.',
703
- en: 'Interactive mode. Enter a task. Commands — /help. Exit — /exit.',
704
- },
705
- 'msg.first_login_hint': {
706
- ru: 'Сохранённой сессии DeepSeek нет — при первом запросе потребуется вход (логин/пароль спросят в терминале или открой --headed).',
707
- en: 'No saved DeepSeek session — the first task will need a sign-in (login/password are asked in the terminal, or use --headed).',
708
- },
709
- 'msg.first_hint': {
710
- ru: 'Подсказка: «/» — список команд, Ctrl+R — поиск по истории, картинку можно вставить через Ctrl+Shift+V.',
711
- en: 'Hint: "/" lists commands, Ctrl+R searches history, paste an image with Ctrl+Shift+V.',
712
- },
713
- 'msg.queue_hint': {
714
- ru: 'Пока агент работает, можно печатать следующее сообщение — оно уйдёт в очередь (Enter — отправить, Esc — прервать).',
715
- en: 'While the agent works you can type the next message — it goes to the queue (Enter — send, Esc — abort).',
716
- },
717
- 'msg.unknown_cmd': {
718
- ru: 'Неизвестная команда: {v}. Набери /help.',
719
- en: 'Unknown command: {v}. Type /help.',
720
- },
721
- 'msg.missing_args': {
722
- ru: 'Не хватает обязательных аргументов: {v}.',
723
- en: 'Missing required arguments: {v}.',
724
- },
725
- 'perm.ask': {
726
- ru: '⚠ Запрос подтверждения: {tool} ({reason})',
727
- en: '⚠ Approval required: {tool} ({reason})',
728
- },
729
- 'perm.confirm': {
730
- ru: 'Разрешить выполнение?',
731
- en: 'Allow this call?',
732
- },
733
- 'perm.allowed': {
734
- ru: '✔ Разрешено оператором.',
735
- en: '✔ Allowed by operator.',
736
- },
737
- 'perm.denied': {
738
- ru: '✖ Отклонено оператором — вызов не выполнен.',
739
- en: '✖ Denied by operator — the call was not run.',
740
- },
741
- 'msg.dev_only': {
742
- ru: 'Команда {v} доступна только в dev-режиме (--dev или hotReload).',
743
- en: 'The {v} command is only available in dev mode (--dev or hotReload).',
744
- },
745
- 'msg.bye': { ru: 'Выход.', en: 'Bye.' },
746
- 'shell.empty': {
747
- ru: 'После ! нужна команда, например !git status.',
748
- en: 'A command is required after !, e.g. !git status.',
749
- },
750
- 'shell.running': {
751
- ru: 'выполняю shell-команду...',
752
- en: 'running shell command...',
753
- },
754
- 'msg.exit_summary': {
755
- ru: 'Транскрипт: {transcript} · чат: {chat}',
756
- en: 'Transcript: {transcript} · chat: {chat}',
757
- },
758
- 'msg.abort_gen': {
759
- ru: '⏹ Esc — прерываю генерацию...',
760
- en: '⏹ Esc — aborting generation...',
761
- },
762
- 'msg.abort_ctrlc': {
763
- ru: '⏹ Ctrl+C — прерываю генерацию...',
764
- en: '⏹ Ctrl+C — aborting generation...',
765
- },
766
- 'msg.queued': { ru: '📨 В очередь ({n}): ', en: '📨 Queued ({n}): ' },
767
- // Shown ONCE per session, the first time a message is queued while the
768
- // agent is working. It explains what happens (sent after the current task)
769
- // and how to inspect/clear the queue, so the operator knows nothing is lost.
770
- 'msg.queued_hint': {
771
- ru: 'Сообщение в очереди — уйдёт после текущей задачи; /queue покажет и очистит.',
772
- en: 'Message queued — it will be sent after the current task; /queue lists or clears it.',
773
- },
774
- 'msg.attached_image': {
775
- ru: '🖼 Вложено изображение {marker} ({size}) — {path}',
776
- en: '🖼 Attached image {marker} ({size}) — {path}',
777
- },
778
- 'msg.attached_file': {
779
- ru: '📎 Вложен файл {marker} {name} ({size}) — {path}',
780
- en: '📎 Attached file {marker} {name} ({size}) — {path}',
781
- },
782
- // B5: shown when `@path` references in a task were inlined as file contents.
783
- 'msg.at_refs': {
784
- ru: '📄 Встроено файлов по @-ссылкам: {n} —',
785
- en: '📄 Inlined @-referenced files: {n} —',
786
- },
787
- 'msg.clip_empty': {
788
- ru: '⚠ В буфере обмена нет картинки (проверено: {via}).',
789
- en: '⚠ No image found in the clipboard (tried: {via}).',
790
- },
791
- 'msg.clip_hint': {
792
- ru: ' Проще всего: вставьте путь к файлу (например tmp/pic.png) — файл приложится к сообщению. Для клипборда нужна утилита (Linux/X11 — xclip или xsel, Wayland — wl-clipboard; Windows — PowerShell, macOS — pngpaste).',
793
- en: ' Easiest: paste a path to a file (e.g. tmp/pic.png) — it will be attached to the message. Clipboard paste needs a tool (Linux/X11 — xclip or xsel, Wayland — wl-clipboard; Windows — PowerShell, macOS — pngpaste).',
794
- },
795
- 'msg.clip_container': {
796
- ru: ' Похоже, вы в контейнере/Dev Container: клипборд Windows отсюда недоступен. Вставьте путь к файлу (например tmp/pic.png) — он приложится к сообщению.',
797
- en: ' Looks like a container/Dev Container: the Windows clipboard is not reachable from here. Paste a path to a file (e.g. tmp/pic.png) — it will be attached to the message.',
798
- },
799
- // Per-task summary parts (joined with "·" by index.ts). Split into separate
800
- // keys so the tokens part can be omitted when the counter is unknown.
801
- 'task_sum.dur': { ru: 'длительность: {dur}', en: 'duration: {dur}' },
802
- 'task_sum.tools': { ru: 'инструментов: {n}', en: 'tools: {n}' },
803
- 'task_sum.tokens': { ru: 'токенов: {n}', en: 'tokens: {n}' },
804
- // Unit labels for the localized task duration (see formatDuration).
805
- 'dur.h': { ru: 'ч', en: 'h' },
806
- 'dur.m': { ru: 'м', en: 'm' },
807
- 'dur.s': { ru: 'с', en: 's' },
808
- // ---------- /diff ----------
809
- 'diff.no_changes': { ru: '(нет изменений)', en: '(no changes)' },
810
- 'diff.more_lines': {
811
- ru: '... [{n} строк ещё, полный вывод — Bash git diff]',
812
- en: '... [{n} more lines, use Bash git diff for the full output]',
813
- },
814
- // ---------- /cost ----------
815
- // ---------- /context ----------
816
- 'context.title': {
817
- ru: 'Загружено в промпт:',
818
- en: 'Loaded into the prompt:',
819
- },
820
- 'context.system_prompt': {
821
- ru: ' системный промпт: {n} символов',
822
- en: ' system prompt: {n} chars',
823
- },
824
- 'context.agents': {
825
- ru: 'AGENTS.md / инструкции:',
826
- en: 'AGENTS.md / instructions:',
827
- },
828
- 'context.memory': {
829
- ru: 'MEMORY.md:',
830
- en: 'MEMORY.md:',
831
- },
832
- 'context.skills': {
833
- ru: 'Скиллы:',
834
- en: 'Skills:',
835
- },
836
- 'context.commands': {
837
- ru: 'Кастомные команды:',
838
- en: 'Custom commands:',
839
- },
840
- 'context.none': { ru: '(нет)', en: '(none)' },
841
- 'context.near_full': {
842
- ru: '⚠ Контекст заполнен на {pct}% — подумайте о /compact, чтобы сжать историю.',
843
- en: '⚠ Context is {pct}% full — consider /compact to shrink the history.',
844
- },
845
- // ---------- /retry, /rename ----------
846
- 'retry.none': {
847
- ru: 'Нет последней задачи для повтора.',
848
- en: 'No last task to retry.',
849
- },
850
- 'copy.none': {
851
- ru: 'Нет ответа для копирования.',
852
- en: 'No answer to copy.',
853
- },
854
- 'copy.done': {
855
- ru: 'Скопировано в буфер обмена ({tool}).',
856
- en: 'Copied to clipboard ({tool}).',
857
- },
858
- 'copy.failed': {
859
- ru: 'Не удалось скопировать (нет {tool} или он недоступен).',
860
- en: 'Could not copy ({tool} missing or unavailable).',
861
- },
862
- 'retry.running': { ru: 'Повторяю задачу…', en: 'Retrying the task...' },
863
- 'rename.usage': {
864
- ru: 'Использование: /rename <title>',
865
- en: 'Usage: /rename <title>',
866
- },
867
- 'rename.done': {
868
- ru: 'Сессия переименована: {v}',
869
- en: 'Session renamed: {v}',
870
- },
871
- 'cost.title': { ru: 'Статистика сессии:', en: 'Session stats:' },
872
- 'cost.context_known': {
873
- ru: ' контекст: ~{n} токенов (DeepSeek accumulated_token_usage)',
874
- en: ' context: ~{n} tokens (DeepSeek accumulated_token_usage)',
875
- },
876
- 'cost.context_unknown': {
877
- ru: ' контекст: неизвестно (DeepSeek сообщит после первого ответа в чате)',
878
- en: ' context: unknown (DeepSeek reports it after the first answer in a chat)',
879
- },
880
- 'cost.tasks': { ru: ' задач: {n}', en: ' tasks: {n}' },
881
- 'cost.tool_calls': {
882
- ru: ' вызовов инструментов: {n}',
883
- en: ' tool calls: {n}',
884
- },
885
- 'cost.auto_compacts': { ru: ' авто-сжатий: {n}', en: ' auto-compacts: {n}' },
886
- 'cost.by_tool': { ru: ' по инструментам:', en: ' by tool:' },
887
- // T-D3: total time spent inside tools, then a top-N per-tool breakdown.
888
- 'cost.by_time': {
889
- ru: ' время в инструментах: {dur}; топ по времени:',
890
- en: ' time in tools: {dur}; top by time:',
891
- },
892
- 'cost.duration': { ru: ' длительность: {dur}', en: ' duration: {dur}' },
893
- 'cost.started': { ru: ' начало: {v}', en: ' started: {v}' },
894
- 'cost.transcript': { ru: ' транскрипт: {v}', en: ' transcript: {v}' },
895
- 'cost.off': { ru: '(выкл)', en: '(off)' },
896
- // ---------- /doctor ----------
897
- 'doctor.title': { ru: 'Диагностика:', en: 'Doctor:' },
898
- 'doctor.repo': { ru: 'репозиторий ({v})', en: 'repo ({v})' },
899
- 'doctor.detached': { ru: 'detached', en: 'detached' },
900
- 'doctor.not_repo': { ru: 'не репозиторий', en: 'not a repository' },
901
- 'doctor.loaded': { ru: 'загружен', en: 'loaded' },
902
- 'doctor.error': { ru: 'ошибка: {v}', en: 'error: {v}' },
903
- 'doctor.unknown': { ru: 'неизвестно', en: 'unknown' },
904
- 'doctor.bundled': { ru: 'встроенный chromium', en: 'bundled chromium' },
905
- 'doctor.auth_saved': {
906
- ru: 'сессия сохранена (авто-вход готов)',
907
- en: 'session saved (auto re-login ready)',
908
- },
909
- 'doctor.auth_none': { ru: 'нет сохранённой сессии', en: 'no saved session' },
910
- 'doctor.clipboard_none': {
911
- ru: 'инструмент не найден (вставка картинок отключена)',
912
- en: 'no tool found (image paste disabled)',
913
- },
914
- 'doctor.mcp': {
915
- ru: '{servers} сервер(ов), {tools} инструмент(ов)',
916
- en: '{servers} server(s), {tools} tool(s)',
917
- },
918
- 'doctor.tokens': { ru: '{v} токенов', en: '{v} tokens' },
919
- 'doctor.origin_ok': { ru: 'origin настроен', en: 'origin configured' },
920
- 'doctor.origin_none': { ru: 'нет origin', en: 'no origin' },
921
- 'doctor.send_pause': {
922
- ru: '{n}с между отправками агента',
923
- en: '{n}s between agent sends',
924
- },
925
- 'doctor.ssh': { ru: 'SSH-подключение', en: 'SSH remote' },
926
- 'doctor.local': { ru: 'локальный терминал', en: 'local terminal' },
927
- 'doctor.ua_cached': {
928
- ru: 'UA закэширован (без перезапуска)',
929
- en: 'UA cached (no relaunch)',
930
- },
931
- 'doctor.ua_not_cached': {
932
- ru: 'UA ещё не закэширован (первый запуск перезапустится один раз)',
933
- en: 'no cached UA yet (first start relaunches once)',
934
- },
935
- // ---------- /add-dir ----------
936
- 'adddir.usage': {
937
- ru: 'Использование: /add-dir <path>',
938
- en: 'Usage: /add-dir <path>',
939
- },
940
- 'adddir.same': {
941
- ru: 'Это уже рабочая директория.',
942
- en: 'This is already the working directory.',
943
- },
944
- 'msg.from_queue': { ru: '▶ Из очереди: ', en: '▶ From queue: ' },
945
- 'msg.from_queue_batch': {
946
- ru: '▶ Из очереди ({n} сообщ.): ',
947
- en: '▶ From queue ({n} messages): ',
948
- },
949
- 'msg.batch_joined': {
950
- ru: 'объединил {n} сообщений в одну задачу',
951
- en: 'merged {n} messages into one task',
952
- },
953
- 'msg.queue_title': { ru: 'Очередь сообщений:', en: 'Pending messages:' },
954
- 'msg.queue_empty': { ru: 'Очередь пуста.', en: 'The queue is empty.' },
955
- 'msg.queue_cleared': { ru: 'Очередь очищена.', en: 'Queue cleared.' },
956
- 'msg.queue_usage': {
957
- ru: 'Использование: /queue [clear]',
958
- en: 'Usage: /queue [clear]',
959
- },
960
- 'msg.queue_cleared_hint': {
961
- ru: 'Очистить: /queue clear',
962
- en: 'Clear: /queue clear',
963
- },
964
- 'msg.agent_error': { ru: '✖ Ошибка агента:', en: '✖ Agent error:' },
965
- 'msg.tool_loop': {
966
- ru: 'Агент повторяет один и тот же вызов инструмента — переключаю на другой подход.',
967
- en: 'The agent keeps repeating the same tool call — switching it to a different approach.',
968
- },
969
- 'msg.suspicious_stop': {
970
- ru: 'агент, похоже, остановился, не распознав вызов инструмента. Ответ сохранён в транскрипте (событие suspicious_final). Можно попросить продолжить или переотправить задачу.',
971
- en: 'the agent seems to have stopped without recognizing a tool call. The response is saved in the transcript (suspicious_final event). You can ask it to continue or resend the task.',
972
- },
973
- 'msg.critical': { ru: 'Критическая ошибка:', en: 'Critical error:' },
974
- 'msg.error': { ru: 'Ошибка:', en: 'Error:' },
975
- 'msg.reloaded': {
976
- ru: 'Перезагружено модулей: {n}. Браузер и чат не тронуты.',
977
- en: 'Modules reloaded: {n}. Browser and chat untouched.',
978
- },
979
- 'msg.not_dir': { ru: 'Не директория: {v}', en: 'Not a directory: {v}' },
980
- 'prompt.review': { ru: 'REVIEW', en: 'REVIEW' },
981
- 'msg.workdir_error': {
982
- ru: 'Не удалось определить рабочую директорию:',
983
- en: 'Failed to determine the working directory:',
984
- },
985
- 'msg.browser_error': {
986
- ru: 'Не удалось запустить браузер:',
987
- en: 'Failed to launch the browser:',
988
- },
989
- 'msg.open_chat_error': {
990
- ru: 'Не удалось открыть чат: {v}',
991
- en: 'Failed to open chat: {v}',
992
- },
993
- 'msg.new_chat_error': {
994
- ru: 'Не удалось создать новый чат: {v}',
995
- en: 'Failed to create a new chat: {v}',
996
- },
997
- 'msg.reload_start': {
998
- ru: 'Перечитываю модули логики...',
999
- en: 'Reloading logic modules...',
1000
- },
1001
- 'msg.reload_partial': {
1002
- ru: 'Часть модулей не перезагрузилась:',
1003
- en: 'Some modules failed to reload:',
1004
- },
1005
- 'msg.reload_done': {
1006
- ru: 'Перезагружено модулей: {n}. Браузер и чат не тронуты.',
1007
- en: 'Reloaded modules: {n}. Browser and chat untouched.',
1008
- },
1009
- 'msg.reload_error': { ru: 'Ошибка reload:', en: 'Reload error:' },
1010
- 'msg.abort_gen_short': {
1011
- ru: '⏹ Esc — прерываю генерацию...',
1012
- en: '⏹ Esc — aborting generation...',
1013
- },
1014
- 'msg.abort_tool_short': {
1015
- ru: '⏹ Ctrl+C — прерываю текущий инструмент (ещё раз — стоп всему прогону)...',
1016
- en: '⏹ Ctrl+C — aborting the current tool (press again to stop the whole run)...',
1017
- },
1018
- 'msg.abort_ctrlc_short': {
1019
- ru: '⏹ Ctrl+C — прерываю генерацию...',
1020
- en: '⏹ Ctrl+C — aborting generation...',
1021
- },
1022
- // ---------- DeepSeek-side problems (what is happening right now) ----------
1023
- // The operator must understand WHY the agent is waiting or stopped: a rate
1024
- // limit, a server hiccup, a refused send, a login problem. These strings are
1025
- // printed around the moment they happen (browser.ts / agent-loop.ts), not as
1026
- // a bare error at the end of the run.
1027
- 'ds.rate_limit_wait': {
1028
- ru: '⏳ DeepSeek: «слишком часто». Жду {min} мин ({attempt}/{max}) и повторю отправку...',
1029
- en: '⏳ DeepSeek: "too frequent". Waiting {min} min ({attempt}/{max}), then resending...',
1030
- },
1031
- 'ds.rate_limit_give_up': {
1032
- ru: '✖ DeepSeek не принял сообщение после {attempt} пауз по {min} мин. Подожди и попробуй снова.',
1033
- en: '✖ DeepSeek refused the message after {attempt} waits of {min} min. Wait and try again.',
1034
- },
1035
- 'ds.server_busy_wait': {
1036
- ru: '⏳ DeepSeek: сервер занят. Жду {sec}с ({attempt}/{max}) и повторю...',
1037
- en: '⏳ DeepSeek: server busy. Waiting {sec}s ({attempt}/{max}), then retrying...',
1038
- },
1039
- 'ds.server_busy_give_up': {
1040
- ru: '✖ DeepSeek: сервер не ответил после {attempt} повторов. Попробуй позже.',
1041
- en: '✖ DeepSeek: the server did not respond after {attempt} retries. Try again later.',
1042
- },
1043
- 'ds.ask_retry': {
1044
- ru: '⚠ Отправка не удалась (попытка {attempt}/{max} на этот запрос): {error} — повторяю...',
1045
- en: '⚠ Send failed (attempt {attempt}/{max} for this request): {error} — retrying...',
1046
- },
1047
- 'ds.incomplete_retry': {
1048
- ru: '⏳ DeepSeek оборвал ответ и кнопки Continue нет — переотправляю задачу ({attempt}/{max})...',
1049
- en: '⏳ DeepSeek truncated the answer and there is no Continue button — resending the task ({attempt}/{max})...',
1050
- },
1051
- 'ds.attach_read_failed': {
1052
- ru: '⚠ не удалось прочитать вложение {name}: {error}',
1053
- en: '⚠ could not read the attachment {name}: {error}',
1054
- },
1055
- 'ds.attach_no_input': {
1056
- ru: '⚠ не найдено поле загрузки файлов — вложения не прикреплены',
1057
- en: '⚠ file upload field not found — the attachments were not attached',
1058
- },
1059
- 'ds.attach_failed': {
1060
- ru: '⚠ не удалось прикрепить файлы: {error}',
1061
- en: '⚠ could not attach the files: {error}',
1062
- },
1063
- 'ds.incomplete_give_up': {
1064
- ru: '✖ DeepSeek {attempt} раз подряд оборвал ответ, не дойдя до конца. Возможно, включён режим размышления — попробуй выключить его (browser.deepThinking) или повтори позже.',
1065
- en: '✖ DeepSeek truncated the answer {attempt} times in a row. The reasoning mode (deep thinking) may be on — try turning it off (browser.deepThinking) or retry later.',
1066
- },
1067
- 'ds.ask_restart_browser': {
1068
- ru: '⚠ Браузер потерял страницу — перезапускаю и вхожу заново...',
1069
- en: '⚠ The browser lost the page — restarting and signing in again...',
1070
- },
1071
- 'ds.ask_restart_failed': {
1072
- ru: '⚠ Не удалось перезапустить браузер: {error}',
1073
- en: '⚠ Could not restart the browser: {error}',
1074
- },
1075
- 'ds.ask_failed': {
1076
- ru: '✖ Не удалось получить ответ от DeepSeek после {max} попыток: {error}',
1077
- en: '✖ Could not get an answer from DeepSeek after {max} attempts: {error}',
1078
- },
1079
- 'ds.input_missing': {
1080
- ru: '✖ Не найдено поле ввода на странице DeepSeek. Запусти /debug-dom и поправь INPUT_SELECTORS.',
1081
- en: '✖ The DeepSeek input field was not found. Run /debug-dom and fix INPUT_SELECTORS.',
1082
- },
1083
- 'ds.input_partial': {
1084
- ru: '✖ Не удалось вставить текст в поле ввода целиком ({got} из {want} символов). Сообщение не отправлено, чтобы не отправить обрезанный текст. Попробуй ещё раз или разбей сообщение.',
1085
- en: '✖ Could not paste the whole text into the input ({got} of {want} chars). The message was not sent to avoid sending a truncated text. Retry or split the message.',
1086
- },
1087
- 'ds.send_no_start': {
1088
- ru: '✖ Ответ не начал генерироваться за 35с даже после повторной отправки. Проверь чат DeepSeek вручную (возможно, кнопка отправки не нажимается или сессия разлогинилась).',
1089
- en: '✖ The answer did not start generating within 35s even after resending. Check the DeepSeek chat manually (the send button may not be clickable or the session may have expired).',
1090
- },
1091
- 'ds.send_no_new_answer': {
1092
- ru: '✖ Новый ответ не получен — на странице остался прежний текст. Возможно, сообщение не отправилось. Проверь чат DeepSeek вручную.',
1093
- en: '✖ No new answer received — the page still shows the previous text. The message may not have been sent. Check the DeepSeek chat manually.',
1094
- },
1095
- 'ds.continue_clicked': {
1096
- ru: '▶ Нажал «Continue» (DeepSeek приостановил вывод — возобновляю).',
1097
- en: '▶ Clicked "Continue" (DeepSeek paused the output — resuming).',
1098
- },
1099
- 'ds.answer_timeout': {
1100
- ru: '⏳ DeepSeek не ответил за {sec}с ({attempt}/{max}) — повторяю запрос...',
1101
- en: '⏳ DeepSeek did not answer within {sec}s ({attempt}/{max}) — retrying the request...',
1102
- },
1103
- 'ds.answer_timeout_give_up': {
1104
- ru: '✖ DeepSeek перестал отвечать, лимит повторов исчерпан. Модель не дала ответа — проверь чат DeepSeek вручную.',
1105
- en: '✖ DeepSeek stopped responding, retry limit exhausted. The model gave no answer — check the DeepSeek chat manually.',
1106
- },
1107
- 'ds.tool_retry': {
1108
- ru: '⏳ Агент не распознал ответ модели — прошу продолжить ({attempt}/{max})...',
1109
- en: '⏳ The agent did not recognize the model answer — asking it to continue ({attempt}/{max})...',
1110
- },
1111
- 'ds.stalled': {
1112
- ru: '⚠ Агент остановился, не завершив задачу (модель перестала вызывать инструменты). Проверь чат DeepSeek — задача может быть не выполнена.',
1113
- en: '⚠ The agent stopped before finishing (the model stopped calling tools). Check the DeepSeek chat — the task may be incomplete.',
1114
- },
1115
- 'ds.not_launched': {
1116
- ru: '✖ Браузер не запущен.',
1117
- en: '✖ The browser is not launched.',
1118
- },
1119
- 'ds.open_chat_failed': {
1120
- ru: '✖ Не удалось открыть чат {id}: {error}',
1121
- en: '✖ Could not open chat {id}: {error}',
1122
- },
1123
- // ---------- self-review ----------
1124
- 'self.review_failed': {
1125
- ru: 'Самообзор провалился:',
1126
- en: 'Self-review failed:',
1127
- },
1128
- 'self.fix_usage': {
1129
- ru: 'Использование: /self-fix <name> [фокус]',
1130
- en: 'Usage: /self-fix <name> [focus]',
1131
- },
1132
- 'self.snapshot_not_found': {
1133
- ru: 'Снапшот не найден: {v}',
1134
- en: 'Snapshot not found: {v}',
1135
- },
1136
- 'self.init_review_chat': {
1137
- ru: 'Инициализирую review-чат для снапшота...',
1138
- en: 'Initializing review chat for the snapshot...',
1139
- },
1140
- 'self.enter_failed': {
1141
- ru: 'Не удалось войти в снапшот:',
1142
- en: 'Failed to enter the snapshot:',
1143
- },
1144
- 'self.not_in_review': {
1145
- ru: 'Ты и так не в режиме ревью.',
1146
- en: 'You are not in review mode.',
1147
- },
1148
- 'self.diff_usage': {
1149
- ru: 'Использование: /self-diff <name>',
1150
- en: 'Usage: /self-diff <name>',
1151
- },
1152
- 'self.apply_usage': {
1153
- ru: 'Использование: /self-apply <name>',
1154
- en: 'Usage: /self-apply <name>',
1155
- },
1156
- 'self.no_src': {
1157
- ru: 'Самообзор отменён: в {dir} нет .ts файлов. Проверь, что src/ не пуст и ты запускаешь агента из корня проекта.',
1158
- en: 'Self-review aborted: no .ts files in {dir}. Check that src/ is not empty and you run the agent from the project root.',
1159
- },
1160
- 'self.no_src_err': {
1161
- ru: 'SRC_DIR пуст — нечего ревьюить',
1162
- en: 'SRC_DIR is empty - nothing to review',
1163
- },
1164
- 'self.snapshot': { ru: '📸 Снапшот: {dir}', en: '📸 Snapshot: {dir}' },
1165
- 'self.files': { ru: 'Файлов: {n} — {list}', en: 'Files: {n} — {list}' },
1166
- 'self.starting': {
1167
- ru: 'Начинаю самообзор...',
1168
- en: 'Starting self-review...',
1169
- },
1170
- 'self.report': { ru: '📋 Отчёт:', en: '📋 Report:' },
1171
- 'self.report_empty': { ru: '(пусто)', en: '(empty)' },
1172
- 'self.report_path': { ru: 'Отчёт: {v}', en: 'Report: {v}' },
1173
- 'self.snapshot_path': { ru: 'Снапшот: {v}', en: 'Snapshot: {v}' },
1174
- 'self.changed': {
1175
- ru: 'Изменено: {n} файл(ов): {list}',
1176
- en: 'Changed: {n} file(s): {list}',
1177
- },
1178
- 'self.changed_none': {
1179
- ru: 'Изменено: (ничего — только отчёт)',
1180
- en: 'Changed: (nothing - report only)',
1181
- },
1182
- 'self.next': { ru: 'Дальше:', en: 'Next:' },
1183
- 'self.diff_hint': {
1184
- ru: ' /self-diff {name} — посмотреть различия',
1185
- en: ' /self-diff {name} — view the diff',
1186
- },
1187
- 'self.apply_hint': {
1188
- ru: ' /self-apply {name} — применить к живому src/',
1189
- en: ' /self-apply {name} — apply to the live src/',
1190
- },
1191
- 'self.no_diff': { ru: 'Различий нет.', en: 'No differences.' },
1192
- 'self.apply_no_ts': {
1193
- ru: 'В снапшоте {dir} нет .ts файлов. Apply отменён, чтобы не стирать src/.',
1194
- en: 'Snapshot {dir} has no .ts files. Apply aborted to avoid wiping src/.',
1195
- },
1196
- 'self.applied': {
1197
- ru: '✅ Применено: {n} файл(ов)',
1198
- en: '✅ Applied: {n} file(s)',
1199
- },
1200
- 'self.backup': { ru: 'Бэкап: {dir}', en: 'Backup: {dir}' },
1201
- 'self.restart_hint': {
1202
- ru: 'Перезапусти агента, чтобы изменения вступили в силу.',
1203
- en: 'Restart the agent for the changes to take effect.',
1204
- },
1205
- 'self.no_snapshots': { ru: 'Снапшотов нет.', en: 'No snapshots.' },
1206
- 'self.list_title': {
1207
- ru: 'Снапшоты самообзора:',
1208
- en: 'Self-review snapshots:',
1209
- },
1210
- 'self.list_changed': { ru: '[{n} изменено]', en: '[{n} changed]' },
1211
- 'self.list_unchanged': { ru: '[без правок]', en: '[no changes]' },
1212
- 'self.list_commands': {
1213
- ru: 'Команды: /self-diff <name>, /self-apply <name>',
1214
- en: 'Commands: /self-diff <name>, /self-apply <name>',
1215
- },
1216
- 'self.fix_hint': {
1217
- ru: '\n💡 Режим ревью по снапшоту {name}. Пиши агенту задачу или /self-done.\n',
1218
- en: '\n💡 Review mode on snapshot {name}. Send the agent a task or /self-done.\n',
1219
- },
1220
- 'self.done_hint': {
1221
- ru: 'Вернулся в {v}. Следующая задача начнёт новый чат.\n',
1222
- en: 'Back to {v}. The next task will start a new chat.\n',
1223
- },
1224
- 'self.review_hint': {
1225
- ru: '\n💡 Теперь ты в режиме ревью. Просто пиши агенту, например:\n «исправь ошибки»\n «доработай обработку ошибок в ask()»\n «покажи, что не так с undo»\nВыйти: /self-done. Применить: /self-apply {name}\n',
1226
- en: '\n💡 You are now in review mode. Just ask the agent, e.g.:\n "fix the errors"\n "improve error handling in ask()"\n "show what is wrong with undo"\nExit: /self-done. Apply: /self-apply {name}\n',
1227
- },
1228
- // ---------- chats / sessions ----------
1229
- 'chats.recent': {
1230
- ru: 'Последние чаты DeepSeek:',
1231
- en: 'Recent DeepSeek chats:',
1232
- },
1233
- 'chats.use_resume': {
1234
- ru: '\nИспользуй /resume <n> для продолжения.\n',
1235
- en: '\nUse /resume <n> to continue.\n',
1236
- },
1237
- 'chats.none': { ru: 'Чатов не найдено.', en: 'No chats found.' },
1238
- 'chats.none_hint': {
1239
- ru: 'Чатов не найдено. Возможно, сайдбар свёрнут или селекторы устарели.',
1240
- en: 'No chats found. The sidebar may be collapsed or the selectors are outdated.',
1241
- },
1242
- 'chats.fetch_error': {
1243
- ru: 'Не удалось получить список:',
1244
- en: 'Failed to fetch the list:',
1245
- },
1246
- 'chats.prompt_no_resend': {
1247
- ru: ' Системный промпт НЕ пересылается (он уже в начале чата). Включить: /config set browser.resendPromptOnResume true.\n',
1248
- en: ' The system prompt is NOT resent (it is already at the start of the chat). Enable: /config set browser.resendPromptOnResume true.\n',
1249
- },
1250
- 'chats.resume_usage': {
1251
- ru: 'Использование: /resume <n> (или /chats для списка)',
1252
- en: 'Usage: /resume <n> (or /chats for the list)',
1253
- },
1254
- 'chats.need_number': {
1255
- ru: 'Нужен номер из /chats.',
1256
- en: 'A number from /chats is required.',
1257
- },
1258
- 'chats.run_chats_first': {
1259
- ru: 'Сначала выполни /chats.',
1260
- en: 'Run /chats first.',
1261
- },
1262
- 'chats.no_n': {
1263
- ru: 'Нет чата №{n}. Всего: {total}.',
1264
- en: 'No chat #{n}. Total: {total}.',
1265
- },
1266
- 'chats.opening': { ru: 'Открываю: {v}', en: 'Opening: {v}' },
1267
- 'chats.context_kept': {
1268
- ru: ' Контекст чата сохранён. Системный промпт будет переслан на следующей задаче.\n',
1269
- en: ' Chat context kept. The system prompt will be resent on the next task.\n',
1270
- },
1271
- 'chats.prompt_will_resend': {
1272
- ru: ' Системный промпт будет переслан на следующей задаче.\n',
1273
- en: ' System prompt will be resent on the next task.\n',
1274
- },
1275
- 'chats.current_id': {
1276
- ru: 'Текущий chat id: {v}',
1277
- en: 'Current chat id: {v}',
1278
- },
1279
- 'chats.not_created': { ru: 'Чат ещё не создан.', en: 'No chat created yet.' },
1280
- 'chats.history_title': { ru: 'Диалог чата:', en: 'Chat dialogue:' },
1281
- 'chats.history_near_limit': {
1282
- ru: '⚠ Контекст чата заполнен на {pct}% — рекомендую /compact.',
1283
- en: '⚠ The chat context is {pct}% full — /compact is recommended.',
1284
- },
1285
- 'chats.history_tokens': {
1286
- ru: 'Контекст чата: ~{v} токенов',
1287
- en: 'Chat context: ~{v} tokens',
1288
- },
1289
- 'chats.history_empty': {
1290
- ru: 'Диалог пуст или не удалось прочитать сообщения.',
1291
- en: 'The dialogue is empty or the messages could not be read.',
1292
- },
1293
- 'chats.history_service_only': {
1294
- ru: 'В этом чате нет пользовательских реплик — только служебные сообщения агента (вызовы инструментов).',
1295
- en: 'This chat has no user turns — only the agent service messages (tool calls).',
1296
- },
1297
- 'chats.history_truncated': {
1298
- ru: '… показаны последние {n} сообщений.',
1299
- en: '… showing the last {n} messages.',
1300
- },
1301
- 'chats.history_you': { ru: 'Вы', en: 'You' },
1302
- 'chats.history_agent': { ru: 'Агент', en: 'Agent' },
1303
- 'time.now': { ru: 'только что', en: 'just now' },
1304
- 'time.min_ago': { ru: '{n} мин назад', en: '{n}m ago' },
1305
- 'time.hour_ago': { ru: '{n} ч назад', en: '{n}h ago' },
1306
- 'time.day_ago': { ru: '{n} дн назад', en: '{n}d ago' },
1307
- 'sessions.dir': { ru: 'Папка сессий: {v}', en: 'Sessions dir: {v}' },
1308
- 'sessions.none': {
1309
- ru: 'Сохранённых сессий нет. Они появятся после первой задачи/чата.',
1310
- en: 'No saved sessions. They appear after the first task/chat.',
1311
- },
1312
- 'sessions.restore_hint': {
1313
- ru: 'Восстановить: /resume-id <id> (полный id) или /resume <n> после /chats.',
1314
- en: 'Restore: /resume-id <id> (full id) or /resume <n> after /chats.',
1315
- },
1316
- 'sessions.resume_id_usage': {
1317
- ru: 'Использование: /resume-id <chat id>',
1318
- en: 'Usage: /resume-id <chat id>',
1319
- },
1320
- // ---------- undo / dom ----------
1321
- 'undo.empty': { ru: 'История пуста.', en: 'History is empty.' },
1322
- 'undo.reverted': { ru: '↶ Откатили: {v}', en: '↶ Reverted: {v}' },
1323
- 'undo.restored': { ru: ' (восстановлено)', en: ' (restored)' },
1324
- 'undo.deleted': { ru: ' (удалено)', en: ' (deleted)' },
1325
- 'undo.failed': {
1326
- ru: 'Не удалось откатить: {v}',
1327
- en: 'Failed to revert: {v}',
1328
- },
1329
- 'undo.changed': { ru: 'изменён', en: 'changed' },
1330
- 'undo.created': { ru: 'создан', en: 'created' },
1331
- 'undo.reason_empty': { ru: 'история пуста', en: 'history is empty' },
1332
- 'undo.reason_disabled': {
1333
- ru: 'undo отключён в конфиге',
1334
- en: 'undo is disabled in the config',
1335
- },
1336
- 'rewind.empty': { ru: 'Чекпойнтов нет.', en: 'No checkpoints.' },
1337
- 'rewind.created': {
1338
- ru: '📸 Чекпойнт: {v}',
1339
- en: '📸 Checkpoint: {v}',
1340
- },
1341
- 'rewind.list_title': { ru: 'Чекпойнты:', en: 'Checkpoints:' },
1342
- 'rewind.reverted': {
1343
- ru: '↶ Откатили рабочее дерево к чекпойнту {v}',
1344
- en: '↶ Rolled the working tree back to checkpoint {v}',
1345
- },
1346
- 'rewind.backup': {
1347
- ru: 'Текущее состояние сохранено как чекпойнт {v}',
1348
- en: 'Current state saved as checkpoint {v}',
1349
- },
1350
- 'rewind.failed': {
1351
- ru: 'Не удалось откатить: {v}',
1352
- en: 'Failed to rewind: {v}',
1353
- },
1354
- 'rewind.reason_not_found': {
1355
- ru: 'чекпойнт не найден',
1356
- en: 'checkpoint not found',
1357
- },
1358
- 'rewind.reason_archive_missing': {
1359
- ru: 'архив чекпойнта отсутствует',
1360
- en: 'checkpoint archive is missing',
1361
- },
1362
- 'rewind.reason_extract_failed': {
1363
- ru: 'не удалось распаковать архив',
1364
- en: 'failed to unpack the archive',
1365
- },
1366
- 'rewind.reason_disabled': {
1367
- ru: 'чекпойнты отключены в конфиге',
1368
- en: 'checkpoints are disabled in the config',
1369
- },
1370
- 'rewind.confirm': {
1371
- ru: 'Откатить рабочее дерево к чекпойнту {v}? Текущее состояние будет сохранено как бэкап.',
1372
- en: 'Roll the working tree back to checkpoint {v}? The current state will be saved as a backup.',
1373
- },
1374
- 'rewind.cancelled': { ru: 'Отменено.', en: 'Cancelled.' },
1375
- 'rewind.label_backup': { ru: 'бэкап', en: 'backup' },
1376
- 'dom.saved': { ru: 'HTML сохранён: {v}', en: 'HTML saved: {v}' },
1377
- 'dom.selectors': { ru: 'Селекторы:', en: 'Selectors:' },
1378
- 'dom.save_error': {
1379
- ru: 'Не удалось сохранить DOM:',
1380
- en: 'Failed to save DOM:',
1381
- },
1382
- // ---------- cd ----------
1383
- 'cd.outside': {
1384
- ru: 'Нельзя выйти за пределы: {v}',
1385
- en: 'Cannot leave the sandbox: {v}',
1386
- },
1387
- 'cd.not_dir': { ru: 'Не директория: {v}', en: 'Not a directory: {v}' },
1388
- 'cd.already': { ru: 'Уже здесь.', en: 'Already here.' },
1389
- 'cd.left_review': {
1390
- ru: 'Вышел из режима ревью (/cd).',
1391
- en: 'Left review mode (/cd).',
1392
- },
1393
- 'cd.changed': { ru: 'Рабочая директория: {v}', en: 'Working directory: {v}' },
1394
- 'cd.failed': {
1395
- ru: 'Не удалось перейти: {v}',
1396
- en: 'Failed to change directory: {v}',
1397
- },
1398
- 'reload.auto_partial': {
1399
- ru: '⚠ авто-reload: часть модулей не загрузилась, работаю на прежней версии:',
1400
- en: '⚠ auto-reload: some modules failed, using previous version:',
1401
- },
1402
- 'reload.browser_restart': {
1403
- ru: '⚠ browser.ts изменился, но он НЕ перезагружается на лету (в нём Playwright-контекст). Перезапусти zames, иначе изменения не применятся.',
1404
- en: '⚠ browser.ts changed, but it is NOT hot-reloaded (it owns the Playwright context). Restart zames or the change will not apply.',
1405
- },
1406
- // ---------- MCP ----------
1407
- 'help.cmd.mcp': {
1408
- ru: '/mcp показать MCP-серверы и их инструменты',
1409
- en: '/mcp show MCP servers and their tools',
1410
- },
1411
- 'mcp.loaded': {
1412
- ru: 'MCP: подключено инструментов {n} ({servers})',
1413
- en: 'MCP: {n} tool(s) from {servers}',
1414
- },
1415
- 'mcp.server_error': {
1416
- ru: 'MCP-сервер {name} недоступен: {error}',
1417
- en: 'MCP server {name} unavailable: {error}',
1418
- },
1419
- 'mcp.load_failed': {
1420
- ru: 'Не удалось загрузить MCP: {v}',
1421
- en: 'Failed to load MCP: {v}',
1422
- },
1423
- 'mcp.none': {
1424
- ru: 'MCP-серверы не настроены.',
1425
- en: 'No MCP servers configured.',
1426
- },
1427
- 'mcp.hint': {
1428
- ru: 'Добавь ~/.zames/mcp.json или <project>/.zames/mcp.json.',
1429
- en: 'Add ~/.zames/mcp.json or <project>/.zames/mcp.json.',
1430
- },
1431
- 'mcp.title': {
1432
- ru: 'MCP-серверы (инструментов: {n}):',
1433
- en: 'MCP servers ({n} tools):',
1434
- },
1435
- 'mcp.status_error': { ru: '(ошибка: {v})', en: '(error: {v})' },
1436
- 'status.mcp': { ru: 'MCP-инструменты: {v}', en: 'MCP tools: {v}' },
1437
- 'status.toggles': {
1438
- ru: 'Размышление: {think} · Поиск: {search}',
1439
- en: 'Deep thinking: {think} · Search: {search}',
1440
- },
1441
- 'status.tokens': {
1442
- ru: 'Контекст (токенов): {v}',
1443
- en: 'Context (tokens): {v}',
1444
- },
1445
- // ---------- config menu ----------
1446
- 'cfg.group.ui': { ru: 'Интерфейс', en: 'Interface' },
1447
- 'cfg.group.agent': { ru: 'Агент', en: 'Agent' },
1448
- 'cfg.group.undo': { ru: 'Откат (undo)', en: 'Undo' },
1449
- 'cfg.group.checkpoint': { ru: 'Чекпойнты', en: 'Checkpoints' },
1450
- 'cfg.group.transcript': { ru: 'Транскрипт', en: 'Transcript' },
1451
- 'cfg.group.browser': { ru: 'Браузер / DeepSeek', en: 'Browser / DeepSeek' },
1452
- 'cfg.f.ui_contextLimit': {
1453
- ru: 'Размер контекста (токены)',
1454
- en: 'Context window (tokens)',
1455
- },
1456
- 'cfg.f.ui_locale': {
1457
- ru: 'Язык интерфейса и ответов агента',
1458
- en: 'Interface and agent reply language',
1459
- },
1460
- 'cfg.f.ui_answerWidth': {
1461
- ru: 'Максимальная ширина ответа в колонках (0 — авто, до 100)',
1462
- en: 'Max answer width in columns (0 = auto, capped at 100)',
1463
- },
1464
- 'cfg.f.maxIterations': {
1465
- ru: 'Лимит итераций на задачу',
1466
- en: 'Max agent loop iterations per task',
1467
- },
1468
- 'cfg.f.headless': {
1469
- ru: 'Браузер без UI (нужен перезапуск)',
1470
- en: 'Headless browser (needs restart)',
1471
- },
1472
- 'cfg.f.debug': { ru: 'Подробный лог', en: 'Verbose debug logging' },
1473
- 'cfg.f.hotReload': {
1474
- ru: 'Авто-перечитывание модулей перед задачей',
1475
- en: 'Auto-reload logic modules before each task',
1476
- },
1477
- 'cfg.f.undo_enabled': {
1478
- ru: 'Включить бэкапы для отката',
1479
- en: 'Enable undo backups',
1480
- },
1481
- 'cfg.f.undo_maxBackups': {
1482
- ru: 'Сколько бэкапов хранить',
1483
- en: 'Max undo backups kept',
1484
- },
1485
- 'cfg.f.checkpoint_enabled': {
1486
- ru: 'Чекпойнт в начале каждой задачи (для /rewind)',
1487
- en: 'Checkpoint at the start of each task (for /rewind)',
1488
- },
1489
- 'cfg.f.checkpoint_maxBackups': {
1490
- ru: 'Сколько чекпойнтов хранить',
1491
- en: 'How many checkpoints to keep',
1492
- },
1493
- 'cfg.f.transcript_enabled': {
1494
- ru: 'Вести транскрипт',
1495
- en: 'Write transcript log',
1496
- },
1497
- 'cfg.f.browser_answerTimeoutMs': {
1498
- ru: 'Ждать ответ, мс',
1499
- en: 'Wait for an answer, ms',
1500
- },
1501
- 'cfg.f.browser_askRetries': {
1502
- ru: 'Число повторов ask()',
1503
- en: 'ask() retry count',
1504
- },
1505
- 'cfg.f.browser_stabilityChecks': {
1506
- ru: 'Проверки стабильности ответа',
1507
- en: 'Answer stability checks',
1508
- },
1509
- 'cfg.f.browser_stabilityDelayMs': {
1510
- ru: 'Пауза между проверками, мс',
1511
- en: 'Delay between stability checks, ms',
1512
- },
1513
- 'cfg.f.browser_minSendIntervalMs': {
1514
- ru: 'Мин. пауза между отправками, мс',
1515
- en: 'Min pause between sends, ms',
1516
- },
1517
- 'cfg.f.browser_thinkingExtraMs': {
1518
- ru: 'Доп. пауза в режиме размышления, мс',
1519
- en: 'Extra pause in thinking mode, ms',
1520
- },
1521
- 'cfg.f.browser_rateLimitWaitMs': {
1522
- ru: 'Пауза при лимите частоты, мс',
1523
- en: 'Wait on rate limit, ms',
1524
- },
1525
- 'cfg.f.browser_maxRateLimitRetries': {
1526
- ru: 'Число повторов при лимите',
1527
- en: 'Rate-limit retry count',
1528
- },
1529
- 'cfg.f.browser_maxIncompleteRetries': {
1530
- ru: 'Повторы при обрыве ответа (Continue)',
1531
- en: 'Retries when the answer is truncated (Continue)',
1532
- },
1533
- 'cfg.f.browser_incompleteWaitMs': {
1534
- ru: 'Пауза перед повтором после обрыва, мс',
1535
- en: 'Wait before retrying a truncated turn, ms',
1536
- },
1537
- 'cfg.f.browser_autoContinue': {
1538
- ru: 'Автонажатие кнопки Continue (режим размышления)',
1539
- en: 'Auto-click Continue (reasoning mode)',
1540
- },
1541
- 'cfg.f.browser_autoCompact': {
1542
- ru: 'Авто-сжатие контекста',
1543
- en: 'Auto-compact the context',
1544
- },
1545
- 'cfg.f.browser_autoCompactPct': {
1546
- ru: 'Порог авто-сжатия (%)',
1547
- en: 'Auto-compact threshold (%)',
1548
- },
1549
- 'cfg.f.browser_askDeadlineMs': {
1550
- ru: 'Watchdog-таймаут ask (мс)',
1551
- en: 'ask() watchdog deadline (ms)',
1552
- },
1553
- 'cfg.f.browser_maxAfterToolRetries': {
1554
- ru: 'Повторов после таймаута',
1555
- en: 'Retries after a timeout',
1556
- },
1557
- 'cfg.f.browser_continueMinGapMs': {
1558
- ru: 'Мин. пауза перед нажатием Continue, мс',
1559
- en: 'Min gap before a Continue click, ms',
1560
- },
1561
- 'cfg.f.browser_resendPromptOnResume': {
1562
- ru: 'Пересылать системный промпт при возобновлении чата',
1563
- en: 'Resend the system prompt on chat resume',
1564
- },
1565
- 'cfg.f.browser_deepThinking': {
1566
- ru: 'Глубокое мышление (долго; размышления не выводятся)',
1567
- en: 'Deep thinking (slow; reasoning is hidden)',
1568
- },
1569
- 'cfg.f.browser_webSearch': {
1570
- ru: 'Умный поиск в интернете',
1571
- en: 'Smart web search',
1572
- },
1573
- 'cfg.f.browser_authUsername': {
1574
- ru: 'Логин DeepSeek для авто-входа',
1575
- en: 'DeepSeek login for auto sign-in',
1576
- },
1577
- 'cfg.f.browser_authPassword': {
1578
- ru: 'Пароль DeepSeek для авто-входа',
1579
- en: 'DeepSeek password for auto sign-in',
1580
- },
1581
- 'cfg.f.browser_authSaveSession': {
1582
- ru: 'Сохранять сессию входа в профиле',
1583
- en: 'Persist the login session in the profile',
1584
- },
1585
- // ---------- login / auth ----------
1586
- 'auth.need_login': {
1587
- ru: '🔐 Требуется вход в DeepSeek.',
1588
- en: '🔐 DeepSeek sign-in required.',
1589
- },
1590
- 'auth.prompt_login': {
1591
- ru: 'Логин DeepSeek (телефон/email): ',
1592
- en: 'DeepSeek login (phone/email): ',
1593
- },
1594
- 'auth.prompt_password': {
1595
- ru: 'Пароль DeepSeek: ',
1596
- en: 'DeepSeek password: ',
1597
- },
1598
- 'auth.prompt_password_saved': {
1599
- ru: 'Пароль DeepSeek (Enter — использовать сохранённый): ',
1600
- en: 'DeepSeek password (Enter — use the saved one): ',
1601
- },
1602
- 'auth.auto_login': {
1603
- ru: 'Авто-вход в DeepSeek...',
1604
- en: 'Signing in to DeepSeek...',
1605
- },
1606
- 'auth.auto_login_ok': { ru: 'Вход выполнен.', en: 'Signed in.' },
1607
- 'auth.auto_login_failed': {
1608
- ru: 'Авто-вход не удался: {v}',
1609
- en: 'Auto sign-in failed: {v}',
1610
- },
1611
- 'auth.login_rejected': {
1612
- ru: 'DeepSeek отклонил вход: {v}',
1613
- en: 'DeepSeek rejected the sign-in: {v}',
1614
- },
1615
- 'auth.form_not_found': {
1616
- ru: 'Форма входа не распознана. Запустите с --headed и войдите вручную.',
1617
- en: 'Login form not recognized. Run with --headed and sign in manually.',
1618
- },
1619
- 'auth.no_reason': {
1620
- ru: 'причина не определена (возможно, неверный логин/пароль или капча)',
1621
- en: 'no reason detected (possibly wrong login/password or a captcha)',
1622
- },
1623
- 'auth.manual_hint': {
1624
- ru: 'Войдите в DeepSeek в открытом браузере, затем нажмите Enter.',
1625
- en: 'Sign in to DeepSeek in the open browser, then press Enter.',
1626
- },
1627
- 'auth.manual_hint_headless': {
1628
- ru: 'Войдите в DeepSeek: откройте https://chat.deepseek.com/ в своём браузере. Если включён headless — задайте логин/пароль через /config или запустите с --headed.',
1629
- en: 'Sign in to DeepSeek: open https://chat.deepseek.com/ in your browser. If headless is on — set the login/password via /config or run with --headed.',
1630
- },
1631
- 'auth.session_saved': {
1632
- ru: 'Сессия DeepSeek сохранена.',
1633
- en: 'DeepSeek session saved.',
1634
- },
1635
- 'auth.session_restored': {
1636
- ru: 'Сессия DeepSeek восстановлена.',
1637
- en: 'DeepSeek session restored.',
1638
- },
1639
- 'auth.enter_to_continue': {
1640
- ru: 'Нажмите Enter, чтобы продолжить...',
1641
- en: 'Press Enter to continue...',
1642
- },
1643
- 'cfg.menu.title': {
1644
- ru: '⚙ Настройки — выбери параметр',
1645
- en: '⚙ Settings — choose a parameter',
1646
- },
1647
- 'cfg.menu.hint': {
1648
- ru: '↑/↓ — выбор, Enter — изменить, g — след. группа, / — поиск, q/Esc — выйти',
1649
- en: '↑/↓ select, Enter edit, g next group, / search, q/Esc quit',
1650
- },
1651
- 'cfg.menu.edit_hint': {
1652
- ru: 'Введи значение и Enter (пусто — отмена)',
1653
- en: 'Enter a value and press Enter (empty — cancel)',
1654
- },
1655
- 'cfg.menu.saved': {
1656
- ru: '✔ Сохранено: {v} = {value}',
1657
- en: '✔ Saved: {v} = {value}',
1658
- },
1659
- 'cfg.menu.default': { ru: 'по умолчанию', en: 'default' },
1660
- 'cfg.menu.filter_hint': {
1661
- ru: '/ — поиск по настройкам, d — сбросить (дважды), * — изменено от дефолта',
1662
- en: '/ search settings, d reset (press twice), * changed from default',
1663
- },
1664
- 'cfg.menu.filter_active': {
1665
- ru: 'Фильтр: «{q}» (Esc/Enter — очистить)',
1666
- en: 'Filter: "{q}" (Esc/Enter to clear)',
1667
- },
1668
- 'cfg.menu.no_match': { ru: '(нет совпадений)', en: '(no matches)' },
1669
- 'cfg.menu.reset_confirm': {
1670
- ru: 'Нажми d ещё раз, чтобы сбросить {v}',
1671
- en: 'Press d again to reset {v}',
1672
- },
1673
- 'cfg.menu.notty': {
1674
- ru: 'Меню доступно только в интерактивном терминале. Используй /config list|get|set.',
1675
- en: 'The menu needs an interactive terminal. Use /config list|get|set.',
1676
- },
1677
- // ---------- config ----------
1678
- 'cfg.title': { ru: 'Настройки zames', en: 'zames settings' },
1679
- 'cfg.current': { ru: 'Текущий конфиг:', en: 'Current config:' },
1680
- 'cfg.usage': {
1681
- ru: 'Использование: /config [menu | list | get <путь> | set <путь> <значение> | reset <путь> | path | lang <ru|en>]',
1682
- en: 'Usage: /config [menu | list | get <path> | set <path> <value> | reset <path> | path | lang <ru|en>]',
1683
- },
1684
- 'cfg.saved': {
1685
- ru: 'Сохранено: {v} = {value} ({file})',
1686
- en: 'Saved: {v} = {value} ({file})',
1687
- },
1688
- 'cfg.reset': { ru: 'Сброшено к дефолту: {v}', en: 'Reset to default: {v}' },
1689
- 'cfg.value': { ru: '{v} = {value}', en: '{v} = {value}' },
1690
- 'cfg.unknown_key': {
1691
- ru: 'Неизвестный параметр: {v}',
1692
- en: 'Unknown setting: {v}',
1693
- },
1694
- 'cfg.bad_value': {
1695
- ru: 'Неверное значение для {v}: ожидалось {type}',
1696
- en: 'Invalid value for {v}: expected {type}',
1697
- },
1698
- 'cfg.range_hint': {
1699
- ru: 'число от {min} до {max}',
1700
- en: 'a number from {min} to {max}',
1701
- },
1702
- 'cfg.write_error': {
1703
- ru: 'Не удалось записать конфиг: {v}',
1704
- en: 'Failed to write config: {v}',
1705
- },
1706
- 'cfg.paths': {
1707
- ru: 'Конфиг (глобальный): {global}\nКонфиг (проект): {project}',
1708
- en: 'Config (global): {global}\nConfig (project): {project}',
1709
- },
1710
- 'cfg.keys': { ru: 'Доступные параметры:', en: 'Available settings:' },
1711
- 'cfg.lang_set': {
1712
- ru: 'Язык переключён на {v}.',
1713
- en: 'Language switched to {v}.',
1714
- },
1715
- 'cfg.lang_usage': {
1716
- ru: 'Использование: /config lang <ru|en>',
1717
- en: 'Usage: /config lang <ru|en>',
1718
- },
1719
- 'cfg.scope_current': {
1720
- ru: 'Запись конфига: {v} ({file})',
1721
- en: 'Config write scope: {v} ({file})',
1722
- },
1723
- 'cfg.scope_usage': {
1724
- ru: 'Использование: /config scope <project|home>. project = .zamesrc.json (в git), home = ~/.zames/. Для личных настроек выбери home, чтобы не коммитить их.',
1725
- en: 'Usage: /config scope <project|home>. project = .zamesrc.json (committed), home = ~/.zames/. Use home for personal settings so they are not committed.',
1726
- },
1727
- 'cfg.scope_set': {
1728
- ru: 'Запись конфига: {v} ({file})',
1729
- en: 'Config write scope: {v} ({file})',
1730
- },
1731
- 'cfg.scope_bad': {
1732
- ru: 'Неизвестный scope: {v}. Используй project или home.',
1733
- en: 'Unknown scope: {v}. Use project or home.',
1734
- },
1735
- // ---------- system prompt ----------
1736
- 'prompt.answer_language': {
1737
- ru: 'ВАЖНО: отвечай оператору на русском языке. Весь текст в поле message инструмента respond, а также любые пояснения — на русском.',
1738
- en: 'IMPORTANT: reply to the operator in English. All text in the respond tool message field, and any explanations, must be in English.',
1739
- },
1740
- 'prompt.tools_header': {
1741
- ru: 'You have access to the following tools:',
1742
- en: 'You have access to the following tools:',
1743
- },
1744
- // The hard "ONLY TOOL CALLS" block. All prose around a tool call is a
1745
- // protocol violation: the operator never sees it (only tool calls and the
1746
- // final respond reach the terminal), so it is pure pollution. We cannot
1747
- // stop DeepSeek from generating it INSIDE its chat with code (that is the
1748
- // model's output); we can only forbid it by prompt and hide it here.
1749
- 'prompt.only_tool_calls': {
1750
- ru: '## ТОЛЬКО ВЫЗОВЫ ИНСТРУМЕНТОВ (жёсткое правило)\n\nОбщайся с оператором ТОЛЬКО через вызовы инструментов. Любой обычный текст — объяснения, планы, рассуждения, комментарии, извинения, приветствия, заголовки, списки, markdown, эмодзи — ЗАПРЕЩЁН. Он не читается и считается ошибкой.\n\nТВОЙ ЕДИНСТВЕННЫЙ ВЫВОД — вызов инструмента. В каждом ответе ровно один JSON-объект вызова (или массив независимых вызовов), без единого слова до и после.\n\nНЕЛЬЗЯ писать: «сейчас сделаю», «давай посмотрим», «проверю», планы, объяснения, итоги между шагами.\n\nМОЖНО только вызов инструмента и, в самом конце, когда задача выполнена, respond с итогом.\n\nЕдинственное место, где допускается текст, — поле message внутри respond, и только в самом конце.',
1751
- en: '## ONLY TOOL CALLS (hard rule)\n\nTalk to the operator ONLY through tool calls. Any plain text — explanations, plans, reasoning, comments, apologies, greetings, headings, lists, markdown, emoji — is FORBIDDEN. It is not read and counts as an error.\n\nYOUR ONLY OUTPUT is a tool call. Each turn contains exactly one JSON tool-call object (or an array of independent calls), with not a single word before or after.\n\nYou MUST NOT write: "I will now...", "let us look...", "let me check", plans, explanations, progress notes between steps.\n\nALLOWED: only a tool call and, at the very end, when the task is done, respond with the summary.\n\nThe only place where text is allowed is the message field inside respond, and only at the very end.',
1752
- },
41
+ ...commonMessages,
42
+ ...helpMessages,
43
+ ...spinnerMessages,
44
+ ...doctorMessages,
45
+ ...deepseekMessages,
46
+ ...selfReviewMessages,
47
+ ...mcpMessages,
48
+ ...configMessages,
49
+ ...promptMessages,
1753
50
  };
1754
51
  export function translate(locale) {
1755
52
  const loc = isLocale(locale) ? locale : DEFAULT_LOCALE;