zames_pro 2.20.0 → 2.21.2
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/agent-loop.js +20 -12
- package/dist/attachments.js +80 -17
- package/dist/browser.js +55 -12
- package/dist/commands.js +7 -2
- package/dist/config-menu.js +3 -1
- package/dist/config.js +157 -23
- package/dist/context.js +68 -13
- package/dist/extraTools.js +8 -2
- package/dist/i18n.js +745 -187
- package/dist/index.js +37 -16
- package/dist/input.js +144 -22
- package/dist/mcp.js +16 -4
- package/dist/path-token.js +4 -3
- package/dist/self-review.js +6 -6
- package/dist/spinner.js +8 -2
- package/dist/system-prompt.js +19 -5
- package/dist/tools.js +2 -6
- package/dist/web.js +1 -1
- package/dist/xml-toolcall.js +10 -5
- package/package.json +13 -2
- package/scripts/eslint-ts6.mjs +51 -0
package/dist/i18n.js
CHANGED
|
@@ -39,93 +39,303 @@ const CATALOG = {
|
|
|
39
39
|
'common.unknown': { ru: 'неизвестно', en: 'unknown' },
|
|
40
40
|
// ---------- help ----------
|
|
41
41
|
'help.options': { ru: 'Опции CLI:', en: 'CLI options:' },
|
|
42
|
-
'help.opt.dir': {
|
|
42
|
+
'help.opt.dir': {
|
|
43
|
+
ru: 'рабочая директория агента',
|
|
44
|
+
en: 'agent working directory',
|
|
45
|
+
},
|
|
43
46
|
'help.opt.task': { ru: 'задача одной строкой', en: 'single-line task' },
|
|
44
|
-
'help.opt.chat': {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
'help.opt.
|
|
49
|
-
|
|
50
|
-
|
|
47
|
+
'help.opt.chat': {
|
|
48
|
+
ru: 'продолжить существующий чат по id',
|
|
49
|
+
en: 'resume an existing chat by id',
|
|
50
|
+
},
|
|
51
|
+
'help.opt.resume_last': {
|
|
52
|
+
ru: 'вернуться в последний сохранённый чат',
|
|
53
|
+
en: 'resume the last saved chat',
|
|
54
|
+
},
|
|
55
|
+
'help.opt.new_chat': {
|
|
56
|
+
ru: 'начать новый чат (по умолчанию)',
|
|
57
|
+
en: 'start a new chat (default)',
|
|
58
|
+
},
|
|
59
|
+
'help.opt.resend_prompt': {
|
|
60
|
+
ru: 'дослать system-prompt в существующий чат',
|
|
61
|
+
en: 'resend system-prompt into an existing chat',
|
|
62
|
+
},
|
|
63
|
+
'help.opt.max_iter': {
|
|
64
|
+
ru: 'лимит итераций, 0 = без лимита ({n})',
|
|
65
|
+
en: 'iteration limit, 0 = unlimited ({n})',
|
|
66
|
+
},
|
|
67
|
+
'help.opt.headless': {
|
|
68
|
+
ru: 'браузер без UI (по умолчанию)',
|
|
69
|
+
en: 'headless browser (default)',
|
|
70
|
+
},
|
|
71
|
+
'help.opt.headed': {
|
|
72
|
+
ru: 'показать окно браузера (отладка/вход)',
|
|
73
|
+
en: 'show the browser window (debug/sign-in)',
|
|
74
|
+
},
|
|
51
75
|
'help.opt.debug': { ru: 'подробный лог', en: 'verbose log' },
|
|
52
|
-
'help.opt.calibrate': {
|
|
53
|
-
|
|
76
|
+
'help.opt.calibrate': {
|
|
77
|
+
ru: 'режим калибровки селекторов',
|
|
78
|
+
en: 'selector calibration mode',
|
|
79
|
+
},
|
|
80
|
+
'help.opt.dev': {
|
|
81
|
+
ru: 'режим разработки: авто-перечитывание модулей',
|
|
82
|
+
en: 'dev mode: auto-reload modules',
|
|
83
|
+
},
|
|
54
84
|
'help.opt.version': { ru: 'показать версию', en: 'show version' },
|
|
55
85
|
'help.opt.help': { ru: 'эта справка', en: 'this help' },
|
|
56
|
-
'help.while_working': {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
'help.key.
|
|
61
|
-
|
|
62
|
-
|
|
86
|
+
'help.while_working': {
|
|
87
|
+
ru: 'Пока агент работает:',
|
|
88
|
+
en: 'While the agent is working:',
|
|
89
|
+
},
|
|
90
|
+
'help.key.queue': {
|
|
91
|
+
ru: 'печать + Enter поставить сообщение в очередь (уйдёт после текущей задачи)',
|
|
92
|
+
en: 'type + Enter queue a message (sent after the current task)',
|
|
93
|
+
},
|
|
94
|
+
'help.key.history': {
|
|
95
|
+
ru: '↑ / ↓ история введённых сообщений',
|
|
96
|
+
en: '↑ / ↓ input history',
|
|
97
|
+
},
|
|
98
|
+
'help.key.words': {
|
|
99
|
+
ru: 'Ctrl+← / Ctrl+→ перемещение по словам',
|
|
100
|
+
en: 'Ctrl+← / Ctrl+→ move by words',
|
|
101
|
+
},
|
|
102
|
+
'help.key.slash': {
|
|
103
|
+
ru: '/ + Tab подсказка и автодополнение slash-команд',
|
|
104
|
+
en: '/ + Tab slash-command hints and completion',
|
|
105
|
+
},
|
|
106
|
+
'help.key.newline': {
|
|
107
|
+
ru: 'Ctrl+J / Ctrl+Enter новая строка (Shift+Enter в терминалах с поддержкой)',
|
|
108
|
+
en: 'Ctrl+J / Ctrl+Enter new line (Shift+Enter in capable terminals)',
|
|
109
|
+
},
|
|
110
|
+
'help.key.backslash': {
|
|
111
|
+
ru: '\\ + Enter тоже новая строка',
|
|
112
|
+
en: '\\ + Enter also a new line',
|
|
113
|
+
},
|
|
63
114
|
'help.key.attach': {
|
|
64
115
|
ru: 'Ctrl+Shift+V картинки вставить изображение/файл (сохранится в tmp)',
|
|
65
116
|
en: 'Ctrl+Shift+V image paste an image/file (saved to tmp)',
|
|
66
117
|
},
|
|
67
|
-
'help.key.esc': {
|
|
118
|
+
'help.key.esc': {
|
|
119
|
+
ru: 'Esc, Ctrl+C прервать текущую генерацию',
|
|
120
|
+
en: 'Esc, Ctrl+C abort current generation',
|
|
121
|
+
},
|
|
68
122
|
'help.commands': { ru: 'Обычные команды:', en: 'Commands:' },
|
|
69
|
-
'help.cmd.new': {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
'help.cmd.
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
'help.cmd.
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
'help.cmd.
|
|
82
|
-
|
|
123
|
+
'help.cmd.new': {
|
|
124
|
+
ru: '/new, /clear новый чат (сброс контекста)',
|
|
125
|
+
en: '/new, /clear new chat (reset context)',
|
|
126
|
+
},
|
|
127
|
+
'help.cmd.sessions': {
|
|
128
|
+
ru: '/sessions список сохранённых сессий',
|
|
129
|
+
en: '/sessions list saved sessions',
|
|
130
|
+
},
|
|
131
|
+
'help.cmd.resume_id': {
|
|
132
|
+
ru: '/resume-id <id> восстановить сессию по полному id',
|
|
133
|
+
en: '/resume-id <id> resume a session by full id',
|
|
134
|
+
},
|
|
135
|
+
'help.cmd.chats': {
|
|
136
|
+
ru: '/chats список последних чатов DeepSeek',
|
|
137
|
+
en: '/chats recent DeepSeek chats',
|
|
138
|
+
},
|
|
139
|
+
'help.cmd.resume': {
|
|
140
|
+
ru: '/resume <n> открыть чат №n из /chats',
|
|
141
|
+
en: '/resume <n> open chat #n from /chats',
|
|
142
|
+
},
|
|
143
|
+
'help.cmd.chat': {
|
|
144
|
+
ru: '/chat показать текущий chat id',
|
|
145
|
+
en: '/chat show current chat id',
|
|
146
|
+
},
|
|
147
|
+
'help.cmd.cd': {
|
|
148
|
+
ru: '/cd <path> сменить рабочую директорию',
|
|
149
|
+
en: '/cd <path> change working directory',
|
|
150
|
+
},
|
|
151
|
+
'help.cmd.pwd': {
|
|
152
|
+
ru: '/pwd текущая директория',
|
|
153
|
+
en: '/pwd current directory',
|
|
154
|
+
},
|
|
155
|
+
'help.cmd.status': {
|
|
156
|
+
ru: '/status состояние сессии',
|
|
157
|
+
en: '/status session state',
|
|
158
|
+
},
|
|
159
|
+
'help.cmd.reload': {
|
|
160
|
+
ru: '/reload перечитать модули логики без перезапуска',
|
|
161
|
+
en: '/reload hot-reload logic modules',
|
|
162
|
+
},
|
|
163
|
+
'help.cmd.undo': {
|
|
164
|
+
ru: '/undo откатить последнюю запись/правку',
|
|
165
|
+
en: '/undo revert the last write/edit',
|
|
166
|
+
},
|
|
167
|
+
'help.cmd.undo_list': {
|
|
168
|
+
ru: '/undo-list список того, что можно откатить',
|
|
169
|
+
en: '/undo-list list revertable changes',
|
|
170
|
+
},
|
|
171
|
+
'help.cmd.transcript': {
|
|
172
|
+
ru: '/transcript путь к файлу транскрипта',
|
|
173
|
+
en: '/transcript transcript file path',
|
|
174
|
+
},
|
|
175
|
+
'help.cmd.diff': {
|
|
176
|
+
ru: '/diff [--staged] показать git diff',
|
|
177
|
+
en: '/diff [--staged] show working tree git diff',
|
|
178
|
+
},
|
|
83
179
|
'help.cmd.cost': { ru: '/cost статистика сессии', en: '/cost session stats' },
|
|
84
|
-
'help.cmd.export': {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
'help.cmd.
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
'
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
180
|
+
'help.cmd.export': {
|
|
181
|
+
ru: '/export [file] выгрузить сессию в Markdown',
|
|
182
|
+
en: '/export [file] export the session to Markdown',
|
|
183
|
+
},
|
|
184
|
+
'help.cmd.doctor': {
|
|
185
|
+
ru: '/doctor диагностика установки и конфига',
|
|
186
|
+
en: '/doctor diagnose install and config',
|
|
187
|
+
},
|
|
188
|
+
'help.cmd.permissions': {
|
|
189
|
+
ru: '/permissions настройки подтверждений',
|
|
190
|
+
en: '/permissions confirmation settings',
|
|
191
|
+
},
|
|
192
|
+
'help.cmd.add_dir': {
|
|
193
|
+
ru: '/add-dir <path> проверить директорию',
|
|
194
|
+
en: '/add-dir <path> validate a directory',
|
|
195
|
+
},
|
|
196
|
+
'help.cmd.review': {
|
|
197
|
+
ru: '/review [focus] ревью незакоммиченных изменений',
|
|
198
|
+
en: '/review [focus] review uncommitted changes',
|
|
199
|
+
},
|
|
200
|
+
'help.cmd.compact': {
|
|
201
|
+
ru: '/compact сжать историю и открыть новый чат с резюме',
|
|
202
|
+
en: '/compact compact the history and open a new chat with the summary',
|
|
203
|
+
},
|
|
204
|
+
'compact.start': {
|
|
205
|
+
ru: '🗜️ Сжимаю историю чата (DeepSeek)...',
|
|
206
|
+
en: '🗜️ Compacting the chat history (DeepSeek)...',
|
|
207
|
+
},
|
|
208
|
+
'compact.empty': {
|
|
209
|
+
ru: 'Нечего сжимать: в чате ещё нет ответов.',
|
|
210
|
+
en: 'Nothing to compact: the chat has no answers yet.',
|
|
211
|
+
},
|
|
212
|
+
'compact.summary_failed': {
|
|
213
|
+
ru: 'Не удалось получить резюме от модели: {v}',
|
|
214
|
+
en: 'Could not get the summary from the model: {v}',
|
|
215
|
+
},
|
|
216
|
+
'compact.done': {
|
|
217
|
+
ru: '✅ История сжата, открыт новый чат с резюме.',
|
|
218
|
+
en: '✅ History compacted, a new chat with the summary is open.',
|
|
219
|
+
},
|
|
220
|
+
'compact.report': {
|
|
221
|
+
ru: 'Резюме перенесено в новый чат ({chars} символов, токенов было ~{tokens}).',
|
|
222
|
+
en: 'The summary was carried into the new chat ({chars} chars, ~{tokens} tokens before).',
|
|
223
|
+
},
|
|
224
|
+
'compact.no_chat': {
|
|
225
|
+
ru: 'Чат ещё не создан — сжимать нечего.',
|
|
226
|
+
en: 'No chat created yet — nothing to compact.',
|
|
227
|
+
},
|
|
96
228
|
'diff.not_repo': { ru: 'Не git-репозиторий.', en: 'Not a git repository.' },
|
|
97
229
|
'export.done': { ru: 'Сессия выгружена: {v}', en: 'Session exported: {v}' },
|
|
98
|
-
'export.outside': {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
'
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
'
|
|
230
|
+
'export.outside': {
|
|
231
|
+
ru: 'Путь вне рабочей директории.',
|
|
232
|
+
en: 'Path is outside the working directory.',
|
|
233
|
+
},
|
|
234
|
+
'adddir.not_dir': {
|
|
235
|
+
ru: 'Нет такой директории: {v}',
|
|
236
|
+
en: 'No such directory: {v}',
|
|
237
|
+
},
|
|
238
|
+
'adddir.note': {
|
|
239
|
+
ru: 'Директория существует: {v}. Песочница фиксируется при запуске.',
|
|
240
|
+
en: 'Directory exists: {v}. The sandbox is fixed at startup.',
|
|
241
|
+
},
|
|
242
|
+
'help.cmd.config': {
|
|
243
|
+
ru: '/config настройки: показать и изменить',
|
|
244
|
+
en: '/config settings: view and edit',
|
|
245
|
+
},
|
|
246
|
+
'help.cmd.lang': {
|
|
247
|
+
ru: '/config lang <ru|en> сменить язык интерфейса и агента',
|
|
248
|
+
en: '/config lang <ru|en> switch UI and agent language',
|
|
249
|
+
},
|
|
250
|
+
'help.cmd.debug_dom': {
|
|
251
|
+
ru: '/debug-dom сохранить HTML страницы (для отладки)',
|
|
252
|
+
en: '/debug-dom dump page HTML (debug)',
|
|
253
|
+
},
|
|
254
|
+
'help.cmd.help': {
|
|
255
|
+
ru: '/help, help справка',
|
|
256
|
+
en: '/help, help this help',
|
|
257
|
+
},
|
|
258
|
+
'help.cmd.exit': {
|
|
259
|
+
ru: '/exit, /quit, exit выход',
|
|
260
|
+
en: '/exit, /quit, exit exit',
|
|
261
|
+
},
|
|
262
|
+
'skills.none': {
|
|
263
|
+
ru: 'Навыки не найдены. Добавьте SKILL.md в .zames/skills/<имя>/ или ~/.zames/skills/.',
|
|
264
|
+
en: 'No skills found. Add SKILL.md under .zames/skills/<name>/ or ~/.zames/skills/.',
|
|
265
|
+
},
|
|
107
266
|
'skills.title': { ru: 'Найдено навыков: {n}', en: 'Skills found: {n}' },
|
|
108
|
-
'memory.agents': {
|
|
267
|
+
'memory.agents': {
|
|
268
|
+
ru: 'Инструкции (AGENTS.md):',
|
|
269
|
+
en: 'Instructions (AGENTS.md):',
|
|
270
|
+
},
|
|
109
271
|
'memory.memory': { ru: 'Память (MEMORY.md):', en: 'Memory (MEMORY.md):' },
|
|
110
|
-
'init.exists': {
|
|
272
|
+
'init.exists': {
|
|
273
|
+
ru: 'AGENTS.md уже существует: {v}',
|
|
274
|
+
en: 'AGENTS.md already exists: {v}',
|
|
275
|
+
},
|
|
111
276
|
'init.created': { ru: 'Создан {v}', en: 'Created {v}' },
|
|
112
|
-
'init.analyzing': {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
277
|
+
'init.analyzing': {
|
|
278
|
+
ru: 'Изучаю проект и готовлю AGENTS.md...',
|
|
279
|
+
en: 'Analyzing the project and preparing AGENTS.md...',
|
|
280
|
+
},
|
|
281
|
+
'init.done': {
|
|
282
|
+
ru: 'AGENTS.md создан агентом: {v}',
|
|
283
|
+
en: 'AGENTS.md created by the agent: {v}',
|
|
284
|
+
},
|
|
285
|
+
'init.failed': {
|
|
286
|
+
ru: 'Не удалось создать AGENTS.md автоматически, записан базовый шаблон.',
|
|
287
|
+
en: 'Could not create AGENTS.md automatically, wrote a basic template.',
|
|
288
|
+
},
|
|
289
|
+
'init.overwrite': {
|
|
290
|
+
ru: 'AGENTS.md уже существует: {v} (используйте /init --force для перезаписи)',
|
|
291
|
+
en: 'AGENTS.md already exists: {v} (use /init --force to overwrite)',
|
|
292
|
+
},
|
|
116
293
|
'help.cmd.skill': { ru: 'навык (SKILL.md)', en: 'skill (SKILL.md)' },
|
|
117
294
|
'help.cmd.custom': { ru: 'пользовательская команда', en: 'custom command' },
|
|
118
|
-
'help.cmd.skills': {
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
'help.
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
'help.
|
|
127
|
-
|
|
128
|
-
|
|
295
|
+
'help.cmd.skills': {
|
|
296
|
+
ru: '/skills список найденных навыков',
|
|
297
|
+
en: '/skills list discovered skills',
|
|
298
|
+
},
|
|
299
|
+
'help.cmd.memory': {
|
|
300
|
+
ru: '/memory показать MEMORY.md и AGENTS.md',
|
|
301
|
+
en: '/memory show MEMORY.md and AGENTS.md',
|
|
302
|
+
},
|
|
303
|
+
'help.cmd.init': {
|
|
304
|
+
ru: '/init [--force] изучить проект и создать AGENTS.md',
|
|
305
|
+
en: '/init [--force] analyze the project and create AGENTS.md',
|
|
306
|
+
},
|
|
307
|
+
'help.skills': {
|
|
308
|
+
ru: 'Навыки и свои команды:',
|
|
309
|
+
en: 'Skills and custom commands:',
|
|
310
|
+
},
|
|
311
|
+
'help.self_review': {
|
|
312
|
+
ru: 'Самообзор (отладка агента):',
|
|
313
|
+
en: 'Self-review (agent debugging):',
|
|
314
|
+
},
|
|
315
|
+
'help.self.review': {
|
|
316
|
+
ru: '/self-review [фокус] снять снапшот src/ и запустить ревью',
|
|
317
|
+
en: '/self-review [focus] snapshot src/ and run review',
|
|
318
|
+
},
|
|
319
|
+
'help.self.fix': {
|
|
320
|
+
ru: '/self-fix <name> [фокус] вернуться в существующий снапшот и продолжить',
|
|
321
|
+
en: '/self-fix <name> [focus] enter an existing snapshot and continue',
|
|
322
|
+
},
|
|
323
|
+
'help.self.done': {
|
|
324
|
+
ru: '/self-done выйти из режима ревью (вернуться в свою папку)',
|
|
325
|
+
en: '/self-done leave review mode (back to your dir)',
|
|
326
|
+
},
|
|
327
|
+
'help.self.list': {
|
|
328
|
+
ru: '/self-list список снапшотов',
|
|
329
|
+
en: '/self-list list snapshots',
|
|
330
|
+
},
|
|
331
|
+
'help.self.diff': {
|
|
332
|
+
ru: '/self-diff <name> различия между текущим src/ и снапшотом',
|
|
333
|
+
en: '/self-diff <name> diff between current src/ and snapshot',
|
|
334
|
+
},
|
|
335
|
+
'help.self.apply': {
|
|
336
|
+
ru: '/self-apply <name> применить снапшот к src/ (с бэкапом)',
|
|
337
|
+
en: '/self-apply <name> apply snapshot to src/ (with backup)',
|
|
338
|
+
},
|
|
129
339
|
'help.files': { ru: 'Файлы:', en: 'Files:' },
|
|
130
340
|
'help.files.logs': { ru: 'Логи:', en: 'Logs:' },
|
|
131
341
|
'help.files.undo': { ru: 'Undo:', en: 'Undo:' },
|
|
@@ -140,42 +350,93 @@ const CATALOG = {
|
|
|
140
350
|
en: 'Mixing the slurry…|Whipping it to a smooth paste…|Stirring logic into it…|Shaking it into a cocktail…|Whisking it around…|Blending it with caffeine…|Kneading dough out of it…|Whipping it into foam…|Tossing it with a spatula…|Kneading clay out of it…|Homogenizing it into concrete…|Shaking it until clear…|Blending it into a smoothie…|Mixing cement out of it…|Whipping porridge out of it…|Stirring it with hope…|Swirling the sediment…|Running the blender over it…|Mixing it beyond recognition…|Mixing mortar out of it…|Whipping a cocktail of it…|Stirring it with the deadline spatula…|Whipping foam out of it…|Homogenizing it evenly…|Tumbling it in a cement mixer…|Beating it into a uniform mass…|Stirring it until clear…|Mixing it from whatever is around…',
|
|
141
351
|
},
|
|
142
352
|
'spinner.hint': { ru: 'Esc — стоп', en: 'Esc — stop' },
|
|
143
|
-
'spinner.pause': {
|
|
353
|
+
'spinner.pause': {
|
|
354
|
+
ru: '⏳ пауза {n}с перед отправкой',
|
|
355
|
+
en: '⏳ pause {n}s before send',
|
|
356
|
+
},
|
|
144
357
|
'editor.more': { ru: '…ещё {n}', en: '…{n} more' },
|
|
145
358
|
'editor.answer': { ru: '● Ответ', en: '● Answer' },
|
|
146
359
|
// ---------- status ----------
|
|
147
|
-
'status.workdir': {
|
|
360
|
+
'status.workdir': {
|
|
361
|
+
ru: 'Рабочая директория: {v}',
|
|
362
|
+
en: 'Working directory: {v}',
|
|
363
|
+
},
|
|
148
364
|
'status.review_mode': { ru: 'Режим ревью: {v}', en: 'Review mode: {v}' },
|
|
149
365
|
'status.review_none': { ru: 'нет', en: 'no' },
|
|
150
|
-
'status.orig_dir': {
|
|
366
|
+
'status.orig_dir': {
|
|
367
|
+
ru: 'Исходная директория: {v}',
|
|
368
|
+
en: 'Original directory: {v}',
|
|
369
|
+
},
|
|
151
370
|
'status.chat': { ru: 'Текущий чат: {v}', en: 'Current chat: {v}' },
|
|
152
|
-
'status.fresh_next': {
|
|
153
|
-
|
|
154
|
-
|
|
371
|
+
'status.fresh_next': {
|
|
372
|
+
ru: 'Fresh chat на след. задаче: {v}',
|
|
373
|
+
en: 'Fresh chat next task: {v}',
|
|
374
|
+
},
|
|
375
|
+
'status.prompt_next': {
|
|
376
|
+
ru: 'System prompt на след. задаче: {v}',
|
|
377
|
+
en: 'System prompt next task: {v}',
|
|
378
|
+
},
|
|
379
|
+
'status.resend': {
|
|
380
|
+
ru: 'Resend prompt (--resend-prompt): {v}',
|
|
381
|
+
en: 'Resend prompt (--resend-prompt): {v}',
|
|
382
|
+
},
|
|
155
383
|
'status.last_chat': { ru: 'Last chat: {v}', en: 'Last chat: {v}' },
|
|
156
384
|
'status.sessions': { ru: 'Сессии: {v}', en: 'Sessions: {v}' },
|
|
157
|
-
'status.dev': {
|
|
158
|
-
|
|
385
|
+
'status.dev': {
|
|
386
|
+
ru: 'Dev mode (auto-reload): {v}',
|
|
387
|
+
en: 'Dev mode (auto-reload): {v}',
|
|
388
|
+
},
|
|
389
|
+
'status.max_iter': {
|
|
390
|
+
ru: 'Лимит итераций: {v} (0 = без лимита)',
|
|
391
|
+
en: 'Iteration limit: {v} (0 = unlimited)',
|
|
392
|
+
},
|
|
159
393
|
'status.headless': { ru: 'Headless: {v}', en: 'Headless: {v}' },
|
|
160
394
|
'status.debug': { ru: 'Debug: {v}', en: 'Debug: {v}' },
|
|
161
395
|
'status.undo': { ru: 'Undo: {v}', en: 'Undo: {v}' },
|
|
162
396
|
'status.transcript': { ru: 'Транскрипт: {v}', en: 'Transcript: {v}' },
|
|
163
397
|
'status.locale': { ru: 'Язык: {v}', en: 'Language: {v}' },
|
|
164
398
|
// ---------- messages ----------
|
|
165
|
-
'msg.working_dir': {
|
|
399
|
+
'msg.working_dir': {
|
|
400
|
+
ru: 'Рабочая директория: {v}',
|
|
401
|
+
en: 'Working directory: {v}',
|
|
402
|
+
},
|
|
166
403
|
'msg.transcript': { ru: 'Транскрипт: {v}', en: 'Transcript: {v}' },
|
|
167
404
|
'msg.new_chat': { ru: 'Создаю новый чат...', en: 'Creating a new chat...' },
|
|
168
405
|
'msg.new_chat_ok': { ru: 'Новый чат.', en: 'New chat.' },
|
|
169
|
-
'msg.resuming': {
|
|
170
|
-
|
|
171
|
-
|
|
406
|
+
'msg.resuming': {
|
|
407
|
+
ru: 'Восстанавливаю сессию {id}...',
|
|
408
|
+
en: 'Restoring session {id}...',
|
|
409
|
+
},
|
|
410
|
+
'msg.input_locked': {
|
|
411
|
+
ru: 'Идёт операция, ввод временно заблокирован…',
|
|
412
|
+
en: 'Operation in progress, input is temporarily locked…',
|
|
413
|
+
},
|
|
414
|
+
'msg.opening_chat': {
|
|
415
|
+
ru: 'Открываю чат {id}...',
|
|
416
|
+
en: 'Opening chat {id}...',
|
|
417
|
+
},
|
|
172
418
|
'msg.chat_opened': { ru: 'Чат открыт.', en: 'Chat opened.' },
|
|
173
|
-
'msg.interactive': {
|
|
174
|
-
|
|
175
|
-
|
|
419
|
+
'msg.interactive': {
|
|
420
|
+
ru: 'Интерактивный режим. Введите задачу. Команды — /help. Выход — /exit.',
|
|
421
|
+
en: 'Interactive mode. Enter a task. Commands — /help. Exit — /exit.',
|
|
422
|
+
},
|
|
423
|
+
'msg.queue_hint': {
|
|
424
|
+
ru: 'Пока агент работает, можно печатать следующее сообщение — оно уйдёт в очередь (Enter — отправить, Esc — прервать).',
|
|
425
|
+
en: 'While the agent works you can type the next message — it goes to the queue (Enter — send, Esc — abort).',
|
|
426
|
+
},
|
|
427
|
+
'msg.unknown_cmd': {
|
|
428
|
+
ru: 'Неизвестная команда: {v}. Набери /help.',
|
|
429
|
+
en: 'Unknown command: {v}. Type /help.',
|
|
430
|
+
},
|
|
176
431
|
'msg.bye': { ru: 'Выход.', en: 'Bye.' },
|
|
177
|
-
'msg.abort_gen': {
|
|
178
|
-
|
|
432
|
+
'msg.abort_gen': {
|
|
433
|
+
ru: '⏹ Esc — прерываю генерацию...',
|
|
434
|
+
en: '⏹ Esc — aborting generation...',
|
|
435
|
+
},
|
|
436
|
+
'msg.abort_ctrlc': {
|
|
437
|
+
ru: '⏹ Ctrl+C — прерываю генерацию...',
|
|
438
|
+
en: '⏹ Ctrl+C — aborting generation...',
|
|
439
|
+
},
|
|
179
440
|
'msg.queued': { ru: '📨 В очередь ({n}): ', en: '📨 Queued ({n}): ' },
|
|
180
441
|
'msg.attached_image': {
|
|
181
442
|
ru: '🖼 Вложено изображение {marker} ({size}) — сохранено в tmp',
|
|
@@ -206,16 +467,43 @@ const CATALOG = {
|
|
|
206
467
|
'msg.critical': { ru: 'Критическая ошибка:', en: 'Critical error:' },
|
|
207
468
|
'msg.not_dir': { ru: 'Не директория: {v}', en: 'Not a directory: {v}' },
|
|
208
469
|
'prompt.review': { ru: 'REVIEW', en: 'REVIEW' },
|
|
209
|
-
'msg.workdir_error': {
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
'msg.
|
|
214
|
-
|
|
215
|
-
|
|
470
|
+
'msg.workdir_error': {
|
|
471
|
+
ru: 'Не удалось определить рабочую директорию:',
|
|
472
|
+
en: 'Failed to determine the working directory:',
|
|
473
|
+
},
|
|
474
|
+
'msg.browser_error': {
|
|
475
|
+
ru: 'Не удалось запустить браузер:',
|
|
476
|
+
en: 'Failed to launch the browser:',
|
|
477
|
+
},
|
|
478
|
+
'msg.open_chat_error': {
|
|
479
|
+
ru: 'Не удалось открыть чат: {v}',
|
|
480
|
+
en: 'Failed to open chat: {v}',
|
|
481
|
+
},
|
|
482
|
+
'msg.new_chat_error': {
|
|
483
|
+
ru: 'Не удалось создать новый чат: {v}',
|
|
484
|
+
en: 'Failed to create a new chat: {v}',
|
|
485
|
+
},
|
|
486
|
+
'msg.reload_start': {
|
|
487
|
+
ru: 'Перечитываю модули логики...',
|
|
488
|
+
en: 'Reloading logic modules...',
|
|
489
|
+
},
|
|
490
|
+
'msg.reload_partial': {
|
|
491
|
+
ru: 'Часть модулей не перезагрузилась:',
|
|
492
|
+
en: 'Some modules failed to reload:',
|
|
493
|
+
},
|
|
494
|
+
'msg.reload_done': {
|
|
495
|
+
ru: 'Перезагружено модулей: {n}. Браузер и чат не тронуты.',
|
|
496
|
+
en: 'Reloaded modules: {n}. Browser and chat untouched.',
|
|
497
|
+
},
|
|
216
498
|
'msg.reload_error': { ru: 'Ошибка reload:', en: 'Reload error:' },
|
|
217
|
-
'msg.abort_gen_short': {
|
|
218
|
-
|
|
499
|
+
'msg.abort_gen_short': {
|
|
500
|
+
ru: '⏹ Esc — прерываю генерацию...',
|
|
501
|
+
en: '⏹ Esc — aborting generation...',
|
|
502
|
+
},
|
|
503
|
+
'msg.abort_ctrlc_short': {
|
|
504
|
+
ru: '⏹ Ctrl+C — прерываю генерацию...',
|
|
505
|
+
en: '⏹ Ctrl+C — aborting generation...',
|
|
506
|
+
},
|
|
219
507
|
// ---------- DeepSeek-side problems (what is happening right now) ----------
|
|
220
508
|
// The operator must understand WHY the agent is waiting or stopped: a rate
|
|
221
509
|
// limit, a server hiccup, a refused send, a login problem. These strings are
|
|
@@ -294,73 +582,196 @@ const CATALOG = {
|
|
|
294
582
|
en: '✖ Could not open chat {id}: {error}',
|
|
295
583
|
},
|
|
296
584
|
// ---------- self-review ----------
|
|
297
|
-
'self.review_failed': {
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
'self.
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
'self.
|
|
306
|
-
|
|
585
|
+
'self.review_failed': {
|
|
586
|
+
ru: 'Самообзор провалился:',
|
|
587
|
+
en: 'Self-review failed:',
|
|
588
|
+
},
|
|
589
|
+
'self.fix_usage': {
|
|
590
|
+
ru: 'Использование: /self-fix <name> [фокус]',
|
|
591
|
+
en: 'Usage: /self-fix <name> [focus]',
|
|
592
|
+
},
|
|
593
|
+
'self.snapshot_not_found': {
|
|
594
|
+
ru: 'Снапшот не найден: {v}',
|
|
595
|
+
en: 'Snapshot not found: {v}',
|
|
596
|
+
},
|
|
597
|
+
'self.init_review_chat': {
|
|
598
|
+
ru: 'Инициализирую review-чат для снапшота...',
|
|
599
|
+
en: 'Initializing review chat for the snapshot...',
|
|
600
|
+
},
|
|
601
|
+
'self.enter_failed': {
|
|
602
|
+
ru: 'Не удалось войти в снапшот:',
|
|
603
|
+
en: 'Failed to enter the snapshot:',
|
|
604
|
+
},
|
|
605
|
+
'self.not_in_review': {
|
|
606
|
+
ru: 'Ты и так не в режиме ревью.',
|
|
607
|
+
en: 'You are not in review mode.',
|
|
608
|
+
},
|
|
609
|
+
'self.diff_usage': {
|
|
610
|
+
ru: 'Использование: /self-diff <name>',
|
|
611
|
+
en: 'Usage: /self-diff <name>',
|
|
612
|
+
},
|
|
613
|
+
'self.apply_usage': {
|
|
614
|
+
ru: 'Использование: /self-apply <name>',
|
|
615
|
+
en: 'Usage: /self-apply <name>',
|
|
616
|
+
},
|
|
617
|
+
'self.fix_hint': {
|
|
618
|
+
ru: '\n💡 Режим ревью по снапшоту {name}. Пиши агенту задачу или /self-done.\n',
|
|
619
|
+
en: '\n💡 Review mode on snapshot {name}. Send the agent a task or /self-done.\n',
|
|
620
|
+
},
|
|
621
|
+
'self.done_hint': {
|
|
622
|
+
ru: 'Вернулся в {v}. Следующая задача начнёт новый чат.\n',
|
|
623
|
+
en: 'Back to {v}. The next task will start a new chat.\n',
|
|
624
|
+
},
|
|
307
625
|
'self.review_hint': {
|
|
308
626
|
ru: '\n💡 Теперь ты в режиме ревью. Просто пиши агенту, например:\n «исправь ошибки»\n «доработай обработку ошибок в ask()»\n «покажи, что не так с undo»\nВыйти: /self-done. Применить: /self-apply {name}\n',
|
|
309
627
|
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',
|
|
310
628
|
},
|
|
311
629
|
// ---------- chats / sessions ----------
|
|
312
|
-
'chats.recent': {
|
|
313
|
-
|
|
630
|
+
'chats.recent': {
|
|
631
|
+
ru: 'Последние чаты DeepSeek:',
|
|
632
|
+
en: 'Recent DeepSeek chats:',
|
|
633
|
+
},
|
|
634
|
+
'chats.use_resume': {
|
|
635
|
+
ru: '\nИспользуй /resume <n> для продолжения.\n',
|
|
636
|
+
en: '\nUse /resume <n> to continue.\n',
|
|
637
|
+
},
|
|
314
638
|
'chats.none': { ru: 'Чатов не найдено.', en: 'No chats found.' },
|
|
315
|
-
'chats.fetch_error': {
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
'chats.
|
|
639
|
+
'chats.fetch_error': {
|
|
640
|
+
ru: 'Не удалось получить список:',
|
|
641
|
+
en: 'Failed to fetch the list:',
|
|
642
|
+
},
|
|
643
|
+
'chats.resume_usage': {
|
|
644
|
+
ru: 'Использование: /resume <n> (или /chats для списка)',
|
|
645
|
+
en: 'Usage: /resume <n> (or /chats for the list)',
|
|
646
|
+
},
|
|
647
|
+
'chats.need_number': {
|
|
648
|
+
ru: 'Нужен номер из /chats.',
|
|
649
|
+
en: 'A number from /chats is required.',
|
|
650
|
+
},
|
|
651
|
+
'chats.run_chats_first': {
|
|
652
|
+
ru: 'Сначала выполни /chats.',
|
|
653
|
+
en: 'Run /chats first.',
|
|
654
|
+
},
|
|
655
|
+
'chats.no_n': {
|
|
656
|
+
ru: 'Нет чата №{n}. Всего: {total}.',
|
|
657
|
+
en: 'No chat #{n}. Total: {total}.',
|
|
658
|
+
},
|
|
320
659
|
'chats.opening': { ru: 'Открываю: {v}', en: 'Opening: {v}' },
|
|
321
|
-
'chats.context_kept': {
|
|
322
|
-
|
|
323
|
-
|
|
660
|
+
'chats.context_kept': {
|
|
661
|
+
ru: ' Контекст чата сохранён. Системный промпт не пересылается (--resend-prompt чтобы дослать).\n',
|
|
662
|
+
en: ' Chat context kept. System prompt is not resent (--resend-prompt to force).\n',
|
|
663
|
+
},
|
|
664
|
+
'chats.prompt_will_resend': {
|
|
665
|
+
ru: ' Системный промпт будет переслан на следующей задаче.\n',
|
|
666
|
+
en: ' System prompt will be resent on the next task.\n',
|
|
667
|
+
},
|
|
668
|
+
'chats.current_id': {
|
|
669
|
+
ru: 'Текущий chat id: {v}',
|
|
670
|
+
en: 'Current chat id: {v}',
|
|
671
|
+
},
|
|
324
672
|
'chats.not_created': { ru: 'Чат ещё не создан.', en: 'No chat created yet.' },
|
|
325
673
|
'chats.history_title': { ru: 'Диалог чата:', en: 'Chat dialogue:' },
|
|
326
|
-
'chats.history_tokens': {
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
674
|
+
'chats.history_tokens': {
|
|
675
|
+
ru: 'Контекст чата: ~{v} токенов',
|
|
676
|
+
en: 'Chat context: ~{v} tokens',
|
|
677
|
+
},
|
|
678
|
+
'chats.history_empty': {
|
|
679
|
+
ru: 'Диалог пуст или не удалось прочитать сообщения.',
|
|
680
|
+
en: 'The dialogue is empty or the messages could not be read.',
|
|
681
|
+
},
|
|
682
|
+
'chats.history_service_only': {
|
|
683
|
+
ru: 'В этом чате нет пользовательских реплик — только служебные сообщения агента (вызовы инструментов).',
|
|
684
|
+
en: 'This chat has no user turns — only the agent service messages (tool calls).',
|
|
685
|
+
},
|
|
686
|
+
'chats.history_truncated': {
|
|
687
|
+
ru: '… показаны последние {n} сообщений.',
|
|
688
|
+
en: '… showing the last {n} messages.',
|
|
689
|
+
},
|
|
330
690
|
'chats.history_you': { ru: 'Вы', en: 'You' },
|
|
331
691
|
'chats.history_agent': { ru: 'Агент', en: 'Agent' },
|
|
332
692
|
'sessions.dir': { ru: 'Папка сессий: {v}', en: 'Sessions dir: {v}' },
|
|
333
|
-
'sessions.none': {
|
|
334
|
-
|
|
335
|
-
|
|
693
|
+
'sessions.none': {
|
|
694
|
+
ru: 'Сохранённых сессий нет. Они появятся после первой задачи/чата.',
|
|
695
|
+
en: 'No saved sessions. They appear after the first task/chat.',
|
|
696
|
+
},
|
|
697
|
+
'sessions.restore_hint': {
|
|
698
|
+
ru: 'Восстановить: /resume-id <id> (полный id) или /resume <n> после /chats.',
|
|
699
|
+
en: 'Restore: /resume-id <id> (full id) or /resume <n> after /chats.',
|
|
700
|
+
},
|
|
701
|
+
'sessions.resume_id_usage': {
|
|
702
|
+
ru: 'Использование: /resume-id <chat id>',
|
|
703
|
+
en: 'Usage: /resume-id <chat id>',
|
|
704
|
+
},
|
|
336
705
|
// ---------- undo / dom ----------
|
|
337
706
|
'undo.empty': { ru: 'История пуста.', en: 'History is empty.' },
|
|
338
707
|
'undo.reverted': { ru: '↶ Откатили: {v}', en: '↶ Reverted: {v}' },
|
|
339
708
|
'undo.restored': { ru: ' (восстановлено)', en: ' (restored)' },
|
|
340
709
|
'undo.deleted': { ru: ' (удалено)', en: ' (deleted)' },
|
|
341
|
-
'undo.failed': {
|
|
710
|
+
'undo.failed': {
|
|
711
|
+
ru: 'Не удалось откатить: {v}',
|
|
712
|
+
en: 'Failed to revert: {v}',
|
|
713
|
+
},
|
|
342
714
|
'undo.changed': { ru: 'изменён', en: 'changed' },
|
|
343
715
|
'undo.created': { ru: 'создан', en: 'created' },
|
|
344
716
|
'dom.saved': { ru: 'HTML сохранён: {v}', en: 'HTML saved: {v}' },
|
|
345
717
|
'dom.selectors': { ru: 'Селекторы:', en: 'Selectors:' },
|
|
346
|
-
'dom.save_error': {
|
|
718
|
+
'dom.save_error': {
|
|
719
|
+
ru: 'Не удалось сохранить DOM:',
|
|
720
|
+
en: 'Failed to save DOM:',
|
|
721
|
+
},
|
|
347
722
|
// ---------- cd ----------
|
|
348
|
-
'cd.outside': {
|
|
723
|
+
'cd.outside': {
|
|
724
|
+
ru: 'Нельзя выйти за пределы: {v}',
|
|
725
|
+
en: 'Cannot leave the sandbox: {v}',
|
|
726
|
+
},
|
|
349
727
|
'cd.not_dir': { ru: 'Не директория: {v}', en: 'Not a directory: {v}' },
|
|
350
728
|
'cd.already': { ru: 'Уже здесь.', en: 'Already here.' },
|
|
351
|
-
'cd.left_review': {
|
|
729
|
+
'cd.left_review': {
|
|
730
|
+
ru: 'Вышел из режима ревью (/cd).',
|
|
731
|
+
en: 'Left review mode (/cd).',
|
|
732
|
+
},
|
|
352
733
|
'cd.changed': { ru: 'Рабочая директория: {v}', en: 'Working directory: {v}' },
|
|
353
|
-
'cd.failed': {
|
|
354
|
-
|
|
355
|
-
|
|
734
|
+
'cd.failed': {
|
|
735
|
+
ru: 'Не удалось перейти: {v}',
|
|
736
|
+
en: 'Failed to change directory: {v}',
|
|
737
|
+
},
|
|
738
|
+
calibrate: {
|
|
739
|
+
ru: '\n🔧 Режим калибровки селекторов\n',
|
|
740
|
+
en: '\n🔧 Selector calibration mode\n',
|
|
741
|
+
},
|
|
742
|
+
'reload.auto_partial': {
|
|
743
|
+
ru: '⚠ авто-reload: часть модулей не загрузилась, работаю на прежней версии:',
|
|
744
|
+
en: '⚠ auto-reload: some modules failed, using previous version:',
|
|
745
|
+
},
|
|
356
746
|
// ---------- MCP ----------
|
|
357
|
-
'help.cmd.mcp': {
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
'mcp.
|
|
362
|
-
|
|
363
|
-
|
|
747
|
+
'help.cmd.mcp': {
|
|
748
|
+
ru: '/mcp показать MCP-серверы и их инструменты',
|
|
749
|
+
en: '/mcp show MCP servers and their tools',
|
|
750
|
+
},
|
|
751
|
+
'mcp.loaded': {
|
|
752
|
+
ru: 'MCP: подключено инструментов {n} ({servers})',
|
|
753
|
+
en: 'MCP: {n} tool(s) from {servers}',
|
|
754
|
+
},
|
|
755
|
+
'mcp.server_error': {
|
|
756
|
+
ru: 'MCP-сервер {name} недоступен: {error}',
|
|
757
|
+
en: 'MCP server {name} unavailable: {error}',
|
|
758
|
+
},
|
|
759
|
+
'mcp.load_failed': {
|
|
760
|
+
ru: 'Не удалось загрузить MCP: {v}',
|
|
761
|
+
en: 'Failed to load MCP: {v}',
|
|
762
|
+
},
|
|
763
|
+
'mcp.none': {
|
|
764
|
+
ru: 'MCP-серверы не настроены.',
|
|
765
|
+
en: 'No MCP servers configured.',
|
|
766
|
+
},
|
|
767
|
+
'mcp.hint': {
|
|
768
|
+
ru: 'Добавь ~/.zames/mcp.json или <project>/.zames/mcp.json.',
|
|
769
|
+
en: 'Add ~/.zames/mcp.json or <project>/.zames/mcp.json.',
|
|
770
|
+
},
|
|
771
|
+
'mcp.title': {
|
|
772
|
+
ru: 'MCP-серверы (инструментов: {n}):',
|
|
773
|
+
en: 'MCP servers ({n} tools):',
|
|
774
|
+
},
|
|
364
775
|
'mcp.status_error': { ru: '(ошибка: {v})', en: '(error: {v})' },
|
|
365
776
|
'status.mcp': { ru: 'MCP-инструменты: {v}', en: 'MCP tools: {v}' },
|
|
366
777
|
'status.tokens': {
|
|
@@ -374,41 +785,125 @@ const CATALOG = {
|
|
|
374
785
|
'cfg.group.undo': { ru: 'Откат (undo)', en: 'Undo' },
|
|
375
786
|
'cfg.group.transcript': { ru: 'Транскрипт', en: 'Transcript' },
|
|
376
787
|
'cfg.group.browser': { ru: 'Браузер / DeepSeek', en: 'Browser / DeepSeek' },
|
|
377
|
-
'cfg.f.ui_locale': {
|
|
378
|
-
|
|
379
|
-
|
|
788
|
+
'cfg.f.ui_locale': {
|
|
789
|
+
ru: 'Язык интерфейса и ответов агента',
|
|
790
|
+
en: 'Interface and agent reply language',
|
|
791
|
+
},
|
|
792
|
+
'cfg.f.maxIterations': {
|
|
793
|
+
ru: 'Лимит итераций на задачу',
|
|
794
|
+
en: 'Max agent loop iterations per task',
|
|
795
|
+
},
|
|
796
|
+
'cfg.f.headless': {
|
|
797
|
+
ru: 'Браузер без UI (нужен перезапуск)',
|
|
798
|
+
en: 'Headless browser (needs restart)',
|
|
799
|
+
},
|
|
380
800
|
'cfg.f.debug': { ru: 'Подробный лог', en: 'Verbose debug logging' },
|
|
381
|
-
'cfg.f.hotReload': {
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
'cfg.f.
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
'cfg.f.
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
'cfg.f.
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
'cfg.f.
|
|
398
|
-
|
|
399
|
-
|
|
801
|
+
'cfg.f.hotReload': {
|
|
802
|
+
ru: 'Авто-перечитывание модулей перед задачей',
|
|
803
|
+
en: 'Auto-reload logic modules before each task',
|
|
804
|
+
},
|
|
805
|
+
'cfg.f.confirmation_write': {
|
|
806
|
+
ru: 'Спрашивать перед Write',
|
|
807
|
+
en: 'Ask before Write',
|
|
808
|
+
},
|
|
809
|
+
'cfg.f.confirmation_edit': {
|
|
810
|
+
ru: 'Спрашивать перед Edit',
|
|
811
|
+
en: 'Ask before Edit',
|
|
812
|
+
},
|
|
813
|
+
'cfg.f.confirmation_bash': {
|
|
814
|
+
ru: 'Спрашивать перед Bash',
|
|
815
|
+
en: 'Ask before Bash',
|
|
816
|
+
},
|
|
817
|
+
'cfg.f.undo_enabled': {
|
|
818
|
+
ru: 'Включить бэкапы для отката',
|
|
819
|
+
en: 'Enable undo backups',
|
|
820
|
+
},
|
|
821
|
+
'cfg.f.undo_maxBackups': {
|
|
822
|
+
ru: 'Сколько бэкапов хранить',
|
|
823
|
+
en: 'Max undo backups kept',
|
|
824
|
+
},
|
|
825
|
+
'cfg.f.transcript_enabled': {
|
|
826
|
+
ru: 'Вести транскрипт',
|
|
827
|
+
en: 'Write transcript log',
|
|
828
|
+
},
|
|
829
|
+
'cfg.f.browser_answerTimeoutMs': {
|
|
830
|
+
ru: 'Ждать ответ, мс',
|
|
831
|
+
en: 'Wait for an answer, ms',
|
|
832
|
+
},
|
|
833
|
+
'cfg.f.browser_askRetries': {
|
|
834
|
+
ru: 'Число повторов ask()',
|
|
835
|
+
en: 'ask() retry count',
|
|
836
|
+
},
|
|
837
|
+
'cfg.f.browser_stabilityChecks': {
|
|
838
|
+
ru: 'Проверки стабильности ответа',
|
|
839
|
+
en: 'Answer stability checks',
|
|
840
|
+
},
|
|
841
|
+
'cfg.f.browser_stabilityDelayMs': {
|
|
842
|
+
ru: 'Пауза между проверками, мс',
|
|
843
|
+
en: 'Delay between stability checks, ms',
|
|
844
|
+
},
|
|
845
|
+
'cfg.f.browser_minSendIntervalMs': {
|
|
846
|
+
ru: 'Мин. пауза между отправками, мс',
|
|
847
|
+
en: 'Min pause between sends, ms',
|
|
848
|
+
},
|
|
849
|
+
'cfg.f.browser_rateLimitWaitMs': {
|
|
850
|
+
ru: 'Пауза при лимите частоты, мс',
|
|
851
|
+
en: 'Wait on rate limit, ms',
|
|
852
|
+
},
|
|
853
|
+
'cfg.f.browser_maxRateLimitRetries': {
|
|
854
|
+
ru: 'Число повторов при лимите',
|
|
855
|
+
en: 'Rate-limit retry count',
|
|
856
|
+
},
|
|
857
|
+
'cfg.f.browser_deepThinking': {
|
|
858
|
+
ru: 'Глубокое мышление (долго; размышления не выводятся)',
|
|
859
|
+
en: 'Deep thinking (slow; reasoning is hidden)',
|
|
860
|
+
},
|
|
861
|
+
'cfg.f.browser_webSearch': {
|
|
862
|
+
ru: 'Умный поиск в интернете',
|
|
863
|
+
en: 'Smart web search',
|
|
864
|
+
},
|
|
865
|
+
'cfg.f.browser_authUsername': {
|
|
866
|
+
ru: 'Логин DeepSeek для авто-входа',
|
|
867
|
+
en: 'DeepSeek login for auto sign-in',
|
|
868
|
+
},
|
|
869
|
+
'cfg.f.browser_authPassword': {
|
|
870
|
+
ru: 'Пароль DeepSeek для авто-входа',
|
|
871
|
+
en: 'DeepSeek password for auto sign-in',
|
|
872
|
+
},
|
|
873
|
+
'cfg.f.browser_authSaveSession': {
|
|
874
|
+
ru: 'Сохранять сессию входа в профиле',
|
|
875
|
+
en: 'Persist the login session in the profile',
|
|
876
|
+
},
|
|
400
877
|
// ---------- login / auth ----------
|
|
401
|
-
'auth.need_login': {
|
|
402
|
-
|
|
403
|
-
|
|
878
|
+
'auth.need_login': {
|
|
879
|
+
ru: '🔐 Требуется вход в DeepSeek.',
|
|
880
|
+
en: '🔐 DeepSeek sign-in required.',
|
|
881
|
+
},
|
|
882
|
+
'auth.prompt_login': {
|
|
883
|
+
ru: 'Логин DeepSeek (телефон/email): ',
|
|
884
|
+
en: 'DeepSeek login (phone/email): ',
|
|
885
|
+
},
|
|
886
|
+
'auth.prompt_password': {
|
|
887
|
+
ru: 'Пароль DeepSeek: ',
|
|
888
|
+
en: 'DeepSeek password: ',
|
|
889
|
+
},
|
|
404
890
|
'auth.prompt_password_saved': {
|
|
405
891
|
ru: 'Пароль DeepSeek (Enter — использовать сохранённый): ',
|
|
406
892
|
en: 'DeepSeek password (Enter — use the saved one): ',
|
|
407
893
|
},
|
|
408
|
-
'auth.auto_login': {
|
|
894
|
+
'auth.auto_login': {
|
|
895
|
+
ru: 'Авто-вход в DeepSeek...',
|
|
896
|
+
en: 'Signing in to DeepSeek...',
|
|
897
|
+
},
|
|
409
898
|
'auth.auto_login_ok': { ru: 'Вход выполнен.', en: 'Signed in.' },
|
|
410
|
-
'auth.auto_login_failed': {
|
|
411
|
-
|
|
899
|
+
'auth.auto_login_failed': {
|
|
900
|
+
ru: 'Авто-вход не удался: {v}',
|
|
901
|
+
en: 'Auto sign-in failed: {v}',
|
|
902
|
+
},
|
|
903
|
+
'auth.login_rejected': {
|
|
904
|
+
ru: 'DeepSeek отклонил вход: {v}',
|
|
905
|
+
en: 'DeepSeek rejected the sign-in: {v}',
|
|
906
|
+
},
|
|
412
907
|
'auth.form_not_found': {
|
|
413
908
|
ru: 'Форма входа не распознана. Запустите с --headed и войдите вручную.',
|
|
414
909
|
en: 'Login form not recognized. Run with --headed and sign in manually.',
|
|
@@ -417,20 +912,47 @@ const CATALOG = {
|
|
|
417
912
|
ru: 'причина не определена (возможно, неверный логин/пароль или капча)',
|
|
418
913
|
en: 'no reason detected (possibly wrong login/password or a captcha)',
|
|
419
914
|
},
|
|
420
|
-
'auth.manual_hint': {
|
|
915
|
+
'auth.manual_hint': {
|
|
916
|
+
ru: 'Войдите в DeepSeek в открытом браузере, затем нажмите Enter.',
|
|
917
|
+
en: 'Sign in to DeepSeek in the open browser, then press Enter.',
|
|
918
|
+
},
|
|
421
919
|
'auth.manual_hint_headless': {
|
|
422
920
|
ru: 'Войдите в DeepSeek: откройте https://chat.deepseek.com/ в своём браузере. Если включён headless — задайте логин/пароль через /config или запустите с --headed.',
|
|
423
921
|
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.',
|
|
424
922
|
},
|
|
425
|
-
'auth.session_saved': {
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
'
|
|
430
|
-
|
|
431
|
-
|
|
923
|
+
'auth.session_saved': {
|
|
924
|
+
ru: 'Сессия DeepSeek сохранена.',
|
|
925
|
+
en: 'DeepSeek session saved.',
|
|
926
|
+
},
|
|
927
|
+
'auth.session_restored': {
|
|
928
|
+
ru: 'Сессия DeepSeek восстановлена.',
|
|
929
|
+
en: 'DeepSeek session restored.',
|
|
930
|
+
},
|
|
931
|
+
'auth.enter_to_continue': {
|
|
932
|
+
ru: 'Нажмите Enter, чтобы продолжить...',
|
|
933
|
+
en: 'Press Enter to continue...',
|
|
934
|
+
},
|
|
935
|
+
'cfg.menu.title': {
|
|
936
|
+
ru: '⚙ Настройки — выбери параметр',
|
|
937
|
+
en: '⚙ Settings — choose a parameter',
|
|
938
|
+
},
|
|
939
|
+
'cfg.menu.hint': {
|
|
940
|
+
ru: '↑/↓ — выбор, Enter — изменить, q/Esc — выйти',
|
|
941
|
+
en: '↑/↓ select, Enter edit, q/Esc quit',
|
|
942
|
+
},
|
|
943
|
+
'cfg.menu.edit_hint': {
|
|
944
|
+
ru: 'Введи значение и Enter (пусто — отмена)',
|
|
945
|
+
en: 'Enter a value and press Enter (empty — cancel)',
|
|
946
|
+
},
|
|
947
|
+
'cfg.menu.saved': {
|
|
948
|
+
ru: '✔ Сохранено: {v} = {value}',
|
|
949
|
+
en: '✔ Saved: {v} = {value}',
|
|
950
|
+
},
|
|
432
951
|
'cfg.menu.default': { ru: 'по умолчанию', en: 'default' },
|
|
433
|
-
'cfg.menu.notty': {
|
|
952
|
+
'cfg.menu.notty': {
|
|
953
|
+
ru: 'Меню доступно только в интерактивном терминале. Используй /config list|get|set.',
|
|
954
|
+
en: 'The menu needs an interactive terminal. Use /config list|get|set.',
|
|
955
|
+
},
|
|
434
956
|
// ---------- config ----------
|
|
435
957
|
'cfg.title': { ru: 'Настройки zames', en: 'zames settings' },
|
|
436
958
|
'cfg.current': { ru: 'Текущий конфиг:', en: 'Current config:' },
|
|
@@ -438,26 +960,62 @@ const CATALOG = {
|
|
|
438
960
|
ru: 'Использование: /config [menu | list | get <путь> | set <путь> <значение> | reset <путь> | path | lang <ru|en>]',
|
|
439
961
|
en: 'Usage: /config [menu | list | get <path> | set <path> <value> | reset <path> | path | lang <ru|en>]',
|
|
440
962
|
},
|
|
441
|
-
'cfg.saved': {
|
|
963
|
+
'cfg.saved': {
|
|
964
|
+
ru: 'Сохранено: {v} = {value} ({file})',
|
|
965
|
+
en: 'Saved: {v} = {value} ({file})',
|
|
966
|
+
},
|
|
442
967
|
'cfg.reset': { ru: 'Сброшено к дефолту: {v}', en: 'Reset to default: {v}' },
|
|
443
968
|
'cfg.value': { ru: '{v} = {value}', en: '{v} = {value}' },
|
|
444
|
-
'cfg.unknown_key': {
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
969
|
+
'cfg.unknown_key': {
|
|
970
|
+
ru: 'Неизвестный параметр: {v}',
|
|
971
|
+
en: 'Unknown setting: {v}',
|
|
972
|
+
},
|
|
973
|
+
'cfg.bad_value': {
|
|
974
|
+
ru: 'Неверное значение для {v}: ожидалось {type}',
|
|
975
|
+
en: 'Invalid value for {v}: expected {type}',
|
|
976
|
+
},
|
|
977
|
+
'cfg.write_error': {
|
|
978
|
+
ru: 'Не удалось записать конфиг: {v}',
|
|
979
|
+
en: 'Failed to write config: {v}',
|
|
980
|
+
},
|
|
981
|
+
'cfg.paths': {
|
|
982
|
+
ru: 'Конфиг (глобальный): {global}\nКонфиг (проект): {project}',
|
|
983
|
+
en: 'Config (global): {global}\nConfig (project): {project}',
|
|
984
|
+
},
|
|
448
985
|
'cfg.keys': { ru: 'Доступные параметры:', en: 'Available settings:' },
|
|
449
|
-
'cfg.lang_set': {
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
'cfg.
|
|
454
|
-
|
|
986
|
+
'cfg.lang_set': {
|
|
987
|
+
ru: 'Язык переключён на {v}.',
|
|
988
|
+
en: 'Language switched to {v}.',
|
|
989
|
+
},
|
|
990
|
+
'cfg.lang_usage': {
|
|
991
|
+
ru: 'Использование: /config lang <ru|en>',
|
|
992
|
+
en: 'Usage: /config lang <ru|en>',
|
|
993
|
+
},
|
|
994
|
+
'cfg.scope_current': {
|
|
995
|
+
ru: 'Запись конфига: {v} ({file})',
|
|
996
|
+
en: 'Config write scope: {v} ({file})',
|
|
997
|
+
},
|
|
998
|
+
'cfg.scope_usage': {
|
|
999
|
+
ru: 'Использование: /config scope <project|home>. project = .zamesrc.json (в git), home = ~/.zames/. Для личных настроек (confirmations) выбери home, чтобы не коммитить их.',
|
|
1000
|
+
en: 'Usage: /config scope <project|home>. project = .zamesrc.json (committed), home = ~/.zames/. Use home for personal settings (confirmations) so they are not committed.',
|
|
1001
|
+
},
|
|
1002
|
+
'cfg.scope_set': {
|
|
1003
|
+
ru: 'Запись конфига: {v} ({file})',
|
|
1004
|
+
en: 'Config write scope: {v} ({file})',
|
|
1005
|
+
},
|
|
1006
|
+
'cfg.scope_bad': {
|
|
1007
|
+
ru: 'Неизвестный scope: {v}. Используй project или home.',
|
|
1008
|
+
en: 'Unknown scope: {v}. Use project or home.',
|
|
1009
|
+
},
|
|
455
1010
|
// ---------- system prompt ----------
|
|
456
1011
|
'prompt.answer_language': {
|
|
457
1012
|
ru: 'ВАЖНО: отвечай оператору на русском языке. Весь текст в поле message инструмента respond, а также любые пояснения — на русском.',
|
|
458
1013
|
en: 'IMPORTANT: reply to the operator in English. All text in the respond tool message field, and any explanations, must be in English.',
|
|
459
1014
|
},
|
|
460
|
-
'prompt.tools_header': {
|
|
1015
|
+
'prompt.tools_header': {
|
|
1016
|
+
ru: 'You have access to the following tools:',
|
|
1017
|
+
en: 'You have access to the following tools:',
|
|
1018
|
+
},
|
|
461
1019
|
// The hard "ONLY TOOL CALLS" block. All prose around a tool call is a
|
|
462
1020
|
// protocol violation: the operator never sees it (only tool calls and the
|
|
463
1021
|
// final respond reach the terminal), so it is pure pollution. We cannot
|
|
@@ -472,7 +1030,7 @@ export function translate(locale) {
|
|
|
472
1030
|
const loc = isLocale(locale) ? locale : DEFAULT_LOCALE;
|
|
473
1031
|
return (key, params) => {
|
|
474
1032
|
const entry = CATALOG[key];
|
|
475
|
-
|
|
1033
|
+
const template = entry ? entry[loc] || entry[DEFAULT_LOCALE] : key;
|
|
476
1034
|
if (!params)
|
|
477
1035
|
return template;
|
|
478
1036
|
return template.replace(/\{(\w+)\}/g, (m, name) => {
|