zames_pro 2.64.0 → 2.65.0
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/CHANGELOG.md +46 -1
- package/README.md +16 -11
- package/dist/backlog.js +20 -0
- package/dist/browser.js +11 -0
- package/dist/commands.js +81 -0
- package/dist/config-menu.js +71 -33
- package/dist/i18n/common.js +362 -0
- package/dist/i18n/config.js +199 -0
- package/dist/i18n/deepseek.js +194 -0
- package/dist/i18n/doctor.js +127 -0
- package/dist/i18n/help.js +552 -0
- package/dist/i18n/mcp.js +41 -0
- package/dist/i18n/prompt.js +20 -0
- package/dist/i18n/self-review.js +198 -0
- package/dist/i18n/spinner.js +36 -0
- package/dist/i18n.js +21 -1724
- package/dist/index.js +39 -503
- package/dist/input/layout.js +292 -0
- package/dist/input.js +37 -290
- package/dist/run-task.js +451 -0
- package/package.json +2 -2
- package/scripts/render-demo.mjs +153 -0
- package/logo.jpg +0 -0
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
// DeepSeek-side problems and login/auth messages.
|
|
2
|
+
export const deepseekMessages = {
|
|
3
|
+
// The operator must understand WHY the agent is waiting or stopped: a rate
|
|
4
|
+
// limit, a server hiccup, a refused send, a login problem. These strings are
|
|
5
|
+
// printed around the moment they happen (browser.ts / agent-loop.ts), not as
|
|
6
|
+
// a bare error at the end of the run.
|
|
7
|
+
'ds.rate_limit_wait': {
|
|
8
|
+
ru: '⏳ DeepSeek: «слишком часто». Жду {min} мин ({attempt}/{max}) и повторю отправку...',
|
|
9
|
+
en: '⏳ DeepSeek: "too frequent". Waiting {min} min ({attempt}/{max}), then resending...',
|
|
10
|
+
},
|
|
11
|
+
'ds.rate_limit_give_up': {
|
|
12
|
+
ru: '✖ DeepSeek не принял сообщение после {attempt} пауз по {min} мин. Подожди и попробуй снова.',
|
|
13
|
+
en: '✖ DeepSeek refused the message after {attempt} waits of {min} min. Wait and try again.',
|
|
14
|
+
},
|
|
15
|
+
'ds.server_busy_wait': {
|
|
16
|
+
ru: '⏳ DeepSeek: сервер занят. Жду {sec}с ({attempt}/{max}) и повторю...',
|
|
17
|
+
en: '⏳ DeepSeek: server busy. Waiting {sec}s ({attempt}/{max}), then retrying...',
|
|
18
|
+
},
|
|
19
|
+
'ds.server_busy_give_up': {
|
|
20
|
+
ru: '✖ DeepSeek: сервер не ответил после {attempt} повторов. Попробуй позже.',
|
|
21
|
+
en: '✖ DeepSeek: the server did not respond after {attempt} retries. Try again later.',
|
|
22
|
+
},
|
|
23
|
+
'ds.ask_retry': {
|
|
24
|
+
ru: '⚠ Отправка не удалась (попытка {attempt}/{max} на этот запрос): {error} — повторяю...',
|
|
25
|
+
en: '⚠ Send failed (attempt {attempt}/{max} for this request): {error} — retrying...',
|
|
26
|
+
},
|
|
27
|
+
'ds.incomplete_retry': {
|
|
28
|
+
ru: '⏳ DeepSeek оборвал ответ и кнопки Continue нет — переотправляю задачу ({attempt}/{max})...',
|
|
29
|
+
en: '⏳ DeepSeek truncated the answer and there is no Continue button — resending the task ({attempt}/{max})...',
|
|
30
|
+
},
|
|
31
|
+
'ds.attach_read_failed': {
|
|
32
|
+
ru: '⚠ не удалось прочитать вложение {name}: {error}',
|
|
33
|
+
en: '⚠ could not read the attachment {name}: {error}',
|
|
34
|
+
},
|
|
35
|
+
'ds.attach_no_input': {
|
|
36
|
+
ru: '⚠ не найдено поле загрузки файлов — вложения не прикреплены',
|
|
37
|
+
en: '⚠ file upload field not found — the attachments were not attached',
|
|
38
|
+
},
|
|
39
|
+
'ds.attach_failed': {
|
|
40
|
+
ru: '⚠ не удалось прикрепить файлы: {error}',
|
|
41
|
+
en: '⚠ could not attach the files: {error}',
|
|
42
|
+
},
|
|
43
|
+
'ds.incomplete_give_up': {
|
|
44
|
+
ru: '✖ DeepSeek {attempt} раз подряд оборвал ответ, не дойдя до конца. Возможно, включён режим размышления — попробуй выключить его (browser.deepThinking) или повтори позже.',
|
|
45
|
+
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.',
|
|
46
|
+
},
|
|
47
|
+
'ds.ask_restart_browser': {
|
|
48
|
+
ru: '⚠ Браузер потерял страницу — перезапускаю и вхожу заново...',
|
|
49
|
+
en: '⚠ The browser lost the page — restarting and signing in again...',
|
|
50
|
+
},
|
|
51
|
+
'ds.ask_restart_failed': {
|
|
52
|
+
ru: '⚠ Не удалось перезапустить браузер: {error}',
|
|
53
|
+
en: '⚠ Could not restart the browser: {error}',
|
|
54
|
+
},
|
|
55
|
+
'ds.ask_failed': {
|
|
56
|
+
ru: '✖ Не удалось получить ответ от DeepSeek после {max} попыток: {error}',
|
|
57
|
+
en: '✖ Could not get an answer from DeepSeek after {max} attempts: {error}',
|
|
58
|
+
},
|
|
59
|
+
'ds.input_missing': {
|
|
60
|
+
ru: '✖ Не найдено поле ввода на странице DeepSeek. Запусти /debug-dom и поправь INPUT_SELECTORS.',
|
|
61
|
+
en: '✖ The DeepSeek input field was not found. Run /debug-dom and fix INPUT_SELECTORS.',
|
|
62
|
+
},
|
|
63
|
+
'ds.input_partial': {
|
|
64
|
+
ru: '✖ Не удалось вставить текст в поле ввода целиком ({got} из {want} символов). Сообщение не отправлено, чтобы не отправить обрезанный текст. Попробуй ещё раз или разбей сообщение.',
|
|
65
|
+
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.',
|
|
66
|
+
},
|
|
67
|
+
'ds.send_no_start': {
|
|
68
|
+
ru: '✖ Ответ не начал генерироваться за 35с даже после повторной отправки. Проверь чат DeepSeek вручную (возможно, кнопка отправки не нажимается или сессия разлогинилась).',
|
|
69
|
+
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).',
|
|
70
|
+
},
|
|
71
|
+
'ds.send_no_new_answer': {
|
|
72
|
+
ru: '✖ Новый ответ не получен — на странице остался прежний текст. Возможно, сообщение не отправилось. Проверь чат DeepSeek вручную.',
|
|
73
|
+
en: '✖ No new answer received — the page still shows the previous text. The message may not have been sent. Check the DeepSeek chat manually.',
|
|
74
|
+
},
|
|
75
|
+
'ds.continue_clicked': {
|
|
76
|
+
ru: '▶ Нажал «Continue» (DeepSeek приостановил вывод — возобновляю).',
|
|
77
|
+
en: '▶ Clicked "Continue" (DeepSeek paused the output — resuming).',
|
|
78
|
+
},
|
|
79
|
+
'ds.answer_timeout': {
|
|
80
|
+
ru: '⏳ DeepSeek не ответил за {sec}с ({attempt}/{max}) — повторяю запрос...',
|
|
81
|
+
en: '⏳ DeepSeek did not answer within {sec}s ({attempt}/{max}) — retrying the request...',
|
|
82
|
+
},
|
|
83
|
+
'ds.answer_timeout_give_up': {
|
|
84
|
+
ru: '✖ DeepSeek перестал отвечать, лимит повторов исчерпан. Модель не дала ответа — проверь чат DeepSeek вручную.',
|
|
85
|
+
en: '✖ DeepSeek stopped responding, retry limit exhausted. The model gave no answer — check the DeepSeek chat manually.',
|
|
86
|
+
},
|
|
87
|
+
'ds.tool_retry': {
|
|
88
|
+
ru: '⏳ Агент не распознал ответ модели — прошу продолжить ({attempt}/{max})...',
|
|
89
|
+
en: '⏳ The agent did not recognize the model answer — asking it to continue ({attempt}/{max})...',
|
|
90
|
+
},
|
|
91
|
+
'ds.stalled': {
|
|
92
|
+
ru: '⚠ Агент остановился, не завершив задачу (модель перестала вызывать инструменты). Проверь чат DeepSeek — задача может быть не выполнена.',
|
|
93
|
+
en: '⚠ The agent stopped before finishing (the model stopped calling tools). Check the DeepSeek chat — the task may be incomplete.',
|
|
94
|
+
},
|
|
95
|
+
'ds.not_launched': {
|
|
96
|
+
ru: '✖ Браузер не запущен.',
|
|
97
|
+
en: '✖ The browser is not launched.',
|
|
98
|
+
},
|
|
99
|
+
'ds.open_chat_failed': {
|
|
100
|
+
ru: '✖ Не удалось открыть чат {id}: {error}',
|
|
101
|
+
en: '✖ Could not open chat {id}: {error}',
|
|
102
|
+
},
|
|
103
|
+
'auth.need_login': {
|
|
104
|
+
ru: '🔐 Требуется вход в DeepSeek.',
|
|
105
|
+
en: '🔐 DeepSeek sign-in required.',
|
|
106
|
+
},
|
|
107
|
+
'auth.prompt_login': {
|
|
108
|
+
ru: 'Логин DeepSeek (телефон/email): ',
|
|
109
|
+
en: 'DeepSeek login (phone/email): ',
|
|
110
|
+
},
|
|
111
|
+
'auth.prompt_password': {
|
|
112
|
+
ru: 'Пароль DeepSeek: ',
|
|
113
|
+
en: 'DeepSeek password: ',
|
|
114
|
+
},
|
|
115
|
+
'auth.prompt_password_saved': {
|
|
116
|
+
ru: 'Пароль DeepSeek (Enter — использовать сохранённый): ',
|
|
117
|
+
en: 'DeepSeek password (Enter — use the saved one): ',
|
|
118
|
+
},
|
|
119
|
+
'auth.auto_login': {
|
|
120
|
+
ru: 'Авто-вход в DeepSeek...',
|
|
121
|
+
en: 'Signing in to DeepSeek...',
|
|
122
|
+
},
|
|
123
|
+
'auth.auto_login_ok': { ru: 'Вход выполнен.', en: 'Signed in.' },
|
|
124
|
+
'auth.auto_login_failed': {
|
|
125
|
+
ru: 'Авто-вход не удался: {v}',
|
|
126
|
+
en: 'Auto sign-in failed: {v}',
|
|
127
|
+
},
|
|
128
|
+
'auth.login_rejected': {
|
|
129
|
+
ru: 'DeepSeek отклонил вход: {v}',
|
|
130
|
+
en: 'DeepSeek rejected the sign-in: {v}',
|
|
131
|
+
},
|
|
132
|
+
'auth.form_not_found': {
|
|
133
|
+
ru: 'Форма входа не распознана. Запустите с --headed и войдите вручную.',
|
|
134
|
+
en: 'Login form not recognized. Run with --headed and sign in manually.',
|
|
135
|
+
},
|
|
136
|
+
'auth.no_reason': {
|
|
137
|
+
ru: 'причина не определена (возможно, неверный логин/пароль или капча)',
|
|
138
|
+
en: 'no reason detected (possibly wrong login/password or a captcha)',
|
|
139
|
+
},
|
|
140
|
+
'auth.manual_hint': {
|
|
141
|
+
ru: 'Войдите в DeepSeek в открытом браузере, затем нажмите Enter.',
|
|
142
|
+
en: 'Sign in to DeepSeek in the open browser, then press Enter.',
|
|
143
|
+
},
|
|
144
|
+
'auth.manual_hint_headless': {
|
|
145
|
+
ru: 'Войдите в DeepSeek: откройте https://chat.deepseek.com/ в своём браузере. Если включён headless — задайте логин/пароль через /config или запустите с --headed.',
|
|
146
|
+
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.',
|
|
147
|
+
},
|
|
148
|
+
'auth.session_saved': {
|
|
149
|
+
ru: 'Сессия DeepSeek сохранена.',
|
|
150
|
+
en: 'DeepSeek session saved.',
|
|
151
|
+
},
|
|
152
|
+
'auth.session_restored': {
|
|
153
|
+
ru: 'Сессия DeepSeek восстановлена.',
|
|
154
|
+
en: 'DeepSeek session restored.',
|
|
155
|
+
},
|
|
156
|
+
'auth.enter_to_continue': {
|
|
157
|
+
ru: 'Нажмите Enter, чтобы продолжить...',
|
|
158
|
+
en: 'Press Enter to continue...',
|
|
159
|
+
},
|
|
160
|
+
'cfg.menu.title': {
|
|
161
|
+
ru: '⚙ Настройки — выбери параметр',
|
|
162
|
+
en: '⚙ Settings — choose a parameter',
|
|
163
|
+
},
|
|
164
|
+
'cfg.menu.hint': {
|
|
165
|
+
ru: '↑/↓ — выбор, Enter — изменить, g — след. группа, / — поиск, q/Esc — выйти',
|
|
166
|
+
en: '↑/↓ select, Enter edit, g next group, / search, q/Esc quit',
|
|
167
|
+
},
|
|
168
|
+
'cfg.menu.edit_hint': {
|
|
169
|
+
ru: 'Введи значение и Enter (пусто — отмена)',
|
|
170
|
+
en: 'Enter a value and press Enter (empty — cancel)',
|
|
171
|
+
},
|
|
172
|
+
'cfg.menu.saved': {
|
|
173
|
+
ru: '✔ Сохранено: {v} = {value}',
|
|
174
|
+
en: '✔ Saved: {v} = {value}',
|
|
175
|
+
},
|
|
176
|
+
'cfg.menu.default': { ru: 'по умолчанию', en: 'default' },
|
|
177
|
+
'cfg.menu.filter_hint': {
|
|
178
|
+
ru: '/ — поиск по настройкам, d — сбросить (дважды), * — изменено от дефолта',
|
|
179
|
+
en: '/ search settings, d reset (press twice), * changed from default',
|
|
180
|
+
},
|
|
181
|
+
'cfg.menu.filter_active': {
|
|
182
|
+
ru: 'Фильтр: «{q}» (Esc/Enter — очистить)',
|
|
183
|
+
en: 'Filter: "{q}" (Esc/Enter to clear)',
|
|
184
|
+
},
|
|
185
|
+
'cfg.menu.no_match': { ru: '(нет совпадений)', en: '(no matches)' },
|
|
186
|
+
'cfg.menu.reset_confirm': {
|
|
187
|
+
ru: 'Нажми d ещё раз, чтобы сбросить {v}',
|
|
188
|
+
en: 'Press d again to reset {v}',
|
|
189
|
+
},
|
|
190
|
+
'cfg.menu.notty': {
|
|
191
|
+
ru: 'Меню доступно только в интерактивном терминале. Используй /config list|get|set.',
|
|
192
|
+
en: 'The menu needs an interactive terminal. Use /config list|get|set.',
|
|
193
|
+
},
|
|
194
|
+
};
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
// /doctor and /add-dir diagnostics.
|
|
2
|
+
export const doctorMessages = {
|
|
3
|
+
'doctor.title': { ru: 'Диагностика:', en: 'Doctor:' },
|
|
4
|
+
'doctor.repo': { ru: 'репозиторий ({v})', en: 'repo ({v})' },
|
|
5
|
+
'doctor.detached': { ru: 'detached', en: 'detached' },
|
|
6
|
+
'doctor.not_repo': { ru: 'не репозиторий', en: 'not a repository' },
|
|
7
|
+
'doctor.loaded': { ru: 'загружен', en: 'loaded' },
|
|
8
|
+
'doctor.error': { ru: 'ошибка: {v}', en: 'error: {v}' },
|
|
9
|
+
'doctor.unknown': { ru: 'неизвестно', en: 'unknown' },
|
|
10
|
+
'doctor.bundled': { ru: 'встроенный chromium', en: 'bundled chromium' },
|
|
11
|
+
'doctor.auth_saved': {
|
|
12
|
+
ru: 'сессия сохранена (авто-вход готов)',
|
|
13
|
+
en: 'session saved (auto re-login ready)',
|
|
14
|
+
},
|
|
15
|
+
'doctor.auth_none': { ru: 'нет сохранённой сессии', en: 'no saved session' },
|
|
16
|
+
'doctor.clipboard_none': {
|
|
17
|
+
ru: 'инструмент не найден (вставка картинок отключена)',
|
|
18
|
+
en: 'no tool found (image paste disabled)',
|
|
19
|
+
},
|
|
20
|
+
'doctor.mcp': {
|
|
21
|
+
ru: '{servers} сервер(ов), {tools} инструмент(ов)',
|
|
22
|
+
en: '{servers} server(s), {tools} tool(s)',
|
|
23
|
+
},
|
|
24
|
+
'doctor.tokens': { ru: '{v} токенов', en: '{v} tokens' },
|
|
25
|
+
'doctor.origin_ok': { ru: 'origin настроен', en: 'origin configured' },
|
|
26
|
+
'doctor.origin_none': { ru: 'нет origin', en: 'no origin' },
|
|
27
|
+
'doctor.send_pause': {
|
|
28
|
+
ru: '{n}с между отправками агента',
|
|
29
|
+
en: '{n}s between agent sends',
|
|
30
|
+
},
|
|
31
|
+
'doctor.ssh': { ru: 'SSH-подключение', en: 'SSH remote' },
|
|
32
|
+
'doctor.local': { ru: 'локальный терминал', en: 'local terminal' },
|
|
33
|
+
'doctor.ua_cached': {
|
|
34
|
+
ru: 'UA закэширован (без перезапуска)',
|
|
35
|
+
en: 'UA cached (no relaunch)',
|
|
36
|
+
},
|
|
37
|
+
'doctor.ua_not_cached': {
|
|
38
|
+
ru: 'UA ещё не закэширован (первый запуск перезапустится один раз)',
|
|
39
|
+
en: 'no cached UA yet (first start relaunches once)',
|
|
40
|
+
},
|
|
41
|
+
'adddir.usage': {
|
|
42
|
+
ru: 'Использование: /add-dir <path>',
|
|
43
|
+
en: 'Usage: /add-dir <path>',
|
|
44
|
+
},
|
|
45
|
+
'adddir.same': {
|
|
46
|
+
ru: 'Это уже рабочая директория.',
|
|
47
|
+
en: 'This is already the working directory.',
|
|
48
|
+
},
|
|
49
|
+
'msg.from_queue': { ru: '▶ Из очереди: ', en: '▶ From queue: ' },
|
|
50
|
+
'msg.from_queue_batch': {
|
|
51
|
+
ru: '▶ Из очереди ({n} сообщ.): ',
|
|
52
|
+
en: '▶ From queue ({n} messages): ',
|
|
53
|
+
},
|
|
54
|
+
'msg.batch_joined': {
|
|
55
|
+
ru: 'объединил {n} сообщений в одну задачу',
|
|
56
|
+
en: 'merged {n} messages into one task',
|
|
57
|
+
},
|
|
58
|
+
'msg.queue_title': { ru: 'Очередь сообщений:', en: 'Pending messages:' },
|
|
59
|
+
'msg.queue_empty': { ru: 'Очередь пуста.', en: 'The queue is empty.' },
|
|
60
|
+
'msg.queue_cleared': { ru: 'Очередь очищена.', en: 'Queue cleared.' },
|
|
61
|
+
'msg.queue_usage': {
|
|
62
|
+
ru: 'Использование: /queue [clear]',
|
|
63
|
+
en: 'Usage: /queue [clear]',
|
|
64
|
+
},
|
|
65
|
+
'msg.queue_cleared_hint': {
|
|
66
|
+
ru: 'Очистить: /queue clear',
|
|
67
|
+
en: 'Clear: /queue clear',
|
|
68
|
+
},
|
|
69
|
+
'msg.agent_error': { ru: '✖ Ошибка агента:', en: '✖ Agent error:' },
|
|
70
|
+
'msg.tool_loop': {
|
|
71
|
+
ru: 'Агент повторяет один и тот же вызов инструмента — переключаю на другой подход.',
|
|
72
|
+
en: 'The agent keeps repeating the same tool call — switching it to a different approach.',
|
|
73
|
+
},
|
|
74
|
+
'msg.suspicious_stop': {
|
|
75
|
+
ru: 'агент, похоже, остановился, не распознав вызов инструмента. Ответ сохранён в транскрипте (событие suspicious_final). Можно попросить продолжить или переотправить задачу.',
|
|
76
|
+
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.',
|
|
77
|
+
},
|
|
78
|
+
'msg.critical': { ru: 'Критическая ошибка:', en: 'Critical error:' },
|
|
79
|
+
'msg.error': { ru: 'Ошибка:', en: 'Error:' },
|
|
80
|
+
'msg.reloaded': {
|
|
81
|
+
ru: 'Перезагружено модулей: {n}. Браузер и чат не тронуты.',
|
|
82
|
+
en: 'Modules reloaded: {n}. Browser and chat untouched.',
|
|
83
|
+
},
|
|
84
|
+
'msg.not_dir': { ru: 'Не директория: {v}', en: 'Not a directory: {v}' },
|
|
85
|
+
'prompt.review': { ru: 'REVIEW', en: 'REVIEW' },
|
|
86
|
+
'msg.workdir_error': {
|
|
87
|
+
ru: 'Не удалось определить рабочую директорию:',
|
|
88
|
+
en: 'Failed to determine the working directory:',
|
|
89
|
+
},
|
|
90
|
+
'msg.browser_error': {
|
|
91
|
+
ru: 'Не удалось запустить браузер:',
|
|
92
|
+
en: 'Failed to launch the browser:',
|
|
93
|
+
},
|
|
94
|
+
'msg.open_chat_error': {
|
|
95
|
+
ru: 'Не удалось открыть чат: {v}',
|
|
96
|
+
en: 'Failed to open chat: {v}',
|
|
97
|
+
},
|
|
98
|
+
'msg.new_chat_error': {
|
|
99
|
+
ru: 'Не удалось создать новый чат: {v}',
|
|
100
|
+
en: 'Failed to create a new chat: {v}',
|
|
101
|
+
},
|
|
102
|
+
'msg.reload_start': {
|
|
103
|
+
ru: 'Перечитываю модули логики...',
|
|
104
|
+
en: 'Reloading logic modules...',
|
|
105
|
+
},
|
|
106
|
+
'msg.reload_partial': {
|
|
107
|
+
ru: 'Часть модулей не перезагрузилась:',
|
|
108
|
+
en: 'Some modules failed to reload:',
|
|
109
|
+
},
|
|
110
|
+
'msg.reload_done': {
|
|
111
|
+
ru: 'Перезагружено модулей: {n}. Браузер и чат не тронуты.',
|
|
112
|
+
en: 'Reloaded modules: {n}. Browser and chat untouched.',
|
|
113
|
+
},
|
|
114
|
+
'msg.reload_error': { ru: 'Ошибка reload:', en: 'Reload error:' },
|
|
115
|
+
'msg.abort_gen_short': {
|
|
116
|
+
ru: '⏹ Esc — прерываю генерацию...',
|
|
117
|
+
en: '⏹ Esc — aborting generation...',
|
|
118
|
+
},
|
|
119
|
+
'msg.abort_tool_short': {
|
|
120
|
+
ru: '⏹ Ctrl+C — прерываю текущий инструмент (ещё раз — стоп всему прогону)...',
|
|
121
|
+
en: '⏹ Ctrl+C — aborting the current tool (press again to stop the whole run)...',
|
|
122
|
+
},
|
|
123
|
+
'msg.abort_ctrlc_short': {
|
|
124
|
+
ru: '⏹ Ctrl+C — прерываю генерацию...',
|
|
125
|
+
en: '⏹ Ctrl+C — aborting generation...',
|
|
126
|
+
},
|
|
127
|
+
};
|