micro-models-agent 0.51.1 → 0.52.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.
Files changed (107) hide show
  1. package/dist/cli/commands.js +162 -38
  2. package/dist/cli/completer.js +5 -5
  3. package/dist/cli/main.js +42 -54
  4. package/dist/cli/repl-commands.js +138 -38
  5. package/dist/cli/repl.js +175 -89
  6. package/dist/cli/run-result.js +11 -0
  7. package/dist/cli/security-commands.js +6 -6
  8. package/dist/cli/setup.js +21 -15
  9. package/dist/config/config.js +54 -27
  10. package/dist/config/defaults.js +17 -0
  11. package/dist/config/domains.js +179 -0
  12. package/dist/config/index.js +2 -1
  13. package/dist/config/security.js +28 -8
  14. package/dist/core/agent.js +162 -30
  15. package/dist/core/bootstrap.js +94 -17
  16. package/dist/core/crash-handler.js +51 -0
  17. package/dist/core/environment.js +199 -0
  18. package/dist/core/session-logger.js +60 -6
  19. package/dist/core/version.js +2 -0
  20. package/dist/i18n/en.json +120 -39
  21. package/dist/i18n/ru.json +91 -10
  22. package/dist/llm/openai-compat.js +191 -53
  23. package/dist/llm/orchestrator.js +5 -3
  24. package/dist/logger/app-logger.js +50 -4
  25. package/dist/main.js +1288 -635
  26. package/dist/modules/browser/session.js +4 -0
  27. package/dist/modules/certification/cli.js +58 -19
  28. package/dist/modules/certification/loader.js +2 -1
  29. package/dist/modules/certification/manifest.js +22 -14
  30. package/dist/modules/certification/runner.js +91 -5
  31. package/dist/modules/certification/scenarios.js +290 -7
  32. package/dist/modules/context/fact-extractor.js +6 -0
  33. package/dist/modules/context/manager.js +19 -2
  34. package/dist/modules/execution/audit-runners.js +61 -7
  35. package/dist/modules/execution/execution-plugin.js +219 -60
  36. package/dist/modules/execution/module.js +207 -18
  37. package/dist/modules/execution/moe-executor.js +33 -20
  38. package/dist/modules/execution/plan-store.js +39 -0
  39. package/dist/modules/execution/plan-tool.js +188 -19
  40. package/dist/modules/execution/planner.js +27 -23
  41. package/dist/modules/execution/stuck-detector.js +244 -8
  42. package/dist/modules/execution/tracker.js +8 -6
  43. package/dist/modules/execution/verifier.js +15 -2
  44. package/dist/modules/hallucination/detector.js +4 -0
  45. package/dist/modules/hallucination/factual.js +45 -5
  46. package/dist/modules/indexer/module.js +1 -0
  47. package/dist/modules/lsp/client.js +123 -12
  48. package/dist/modules/lsp/index.js +1 -1
  49. package/dist/modules/lsp/module.js +30 -2
  50. package/dist/modules/lsp/probe.js +11 -1
  51. package/dist/modules/lsp/startup-check.js +5 -2
  52. package/dist/modules/plugins/builtin/lint-on-write.js +144 -41
  53. package/dist/modules/plugins/manager.js +57 -13
  54. package/dist/modules/pricing/index.js +61 -0
  55. package/dist/modules/pricing/prices.js +129 -0
  56. package/dist/modules/providers/create.js +22 -0
  57. package/dist/modules/providers/fallback.js +79 -0
  58. package/dist/modules/providers/health.js +46 -0
  59. package/dist/modules/providers/index.js +5 -0
  60. package/dist/modules/providers/manager.js +161 -0
  61. package/dist/modules/providers/presets.js +128 -0
  62. package/dist/modules/providers/registry.js +22 -0
  63. package/dist/modules/providers/types.js +1 -0
  64. package/dist/modules/registry.js +1 -0
  65. package/dist/modules/security/command-validator.js +14 -0
  66. package/dist/modules/security/encryption.js +6 -6
  67. package/dist/modules/security/network-validator.js +17 -0
  68. package/dist/modules/security/path-validator.js +22 -26
  69. package/dist/modules/session/store.js +10 -10
  70. package/dist/tools/approve.js +1 -0
  71. package/dist/tools/attach-image.js +12 -0
  72. package/dist/tools/bash.js +27 -4
  73. package/dist/tools/browser.js +1 -0
  74. package/dist/tools/chunk-query.js +1 -0
  75. package/dist/tools/create-dir.js +1 -0
  76. package/dist/tools/delete-file.js +1 -0
  77. package/dist/tools/download-file.js +1 -0
  78. package/dist/tools/edit-file.js +2 -1
  79. package/dist/tools/enable-tools.js +1 -0
  80. package/dist/tools/executor.js +17 -7
  81. package/dist/tools/file-info.js +1 -0
  82. package/dist/tools/glob-tool.js +1 -0
  83. package/dist/tools/grep-tool.js +54 -13
  84. package/dist/tools/list-dir.js +1 -0
  85. package/dist/tools/load-skill.js +1 -0
  86. package/dist/tools/mcp-call.js +1 -0
  87. package/dist/tools/move-file.js +1 -0
  88. package/dist/tools/path-utils.js +51 -1
  89. package/dist/tools/pipeline-run.js +1 -0
  90. package/dist/tools/process-kill.js +11 -0
  91. package/dist/tools/process-list.js +1 -0
  92. package/dist/tools/process-log.js +9 -0
  93. package/dist/tools/question.js +1 -0
  94. package/dist/tools/read-file.js +94 -6
  95. package/dist/tools/recall.js +1 -0
  96. package/dist/tools/remember.js +1 -0
  97. package/dist/tools/scope-check.js +7 -5
  98. package/dist/tools/search-history.js +1 -0
  99. package/dist/tools/subagent.js +4 -4
  100. package/dist/tools/web-browse.js +1 -0
  101. package/dist/tools/web-fetch.js +27 -6
  102. package/dist/tools/web-search.js +70 -43
  103. package/dist/tools/write-file.js +1 -0
  104. package/dist/ui/line-editor.js +142 -23
  105. package/dist/ui/line-math.js +8 -4
  106. package/dist/ui/renderer.js +57 -7
  107. package/package.json +50 -48
package/dist/i18n/ru.json CHANGED
@@ -3,19 +3,20 @@
3
3
  "file.deleted": "Удалён {path}",
4
4
  "file.updated": "Обновлён {path}",
5
5
  "file.written": "Записан {path}",
6
- "file.notfound": "Файл не найден: {path}",
7
- "file.dir_notfound": "Каталог не найден: {path}",
6
+ "file.notfound": "Файл не найден: {path}\nЭто НЕ значит, что проект отсутствует — возможно, путь неверный. Выполни list_dir по рабочей директории; создавай файлы только после проверки того, что уже есть.",
7
+ "file.dir_notfound": "Каталог не найден: {path}\nЭто НЕ значит, что проект отсутствует — возможно, путь неверный. Выполни list_dir по рабочей директории (и родителю этого пути), чтобы найти реальное расположение, прежде что-то создавать.",
8
8
  "file.path_not_allowed": "Путь недопустим: {path}",
9
9
  "file.path_not_allowed_short": "Путь недопустим",
10
10
  "file.is_directory": "Это каталог, используйте rmdir: {path}",
11
11
  "file.replaced_in": "Заменено в {path}",
12
- "file.string_not_found": "Строка не найдена в файле:\n{str}",
12
+ "file.string_not_found": "Строка не найдена в файле:\n{str}\n\nИспользуй read_file для {path}, чтобы увидеть текущее содержимое файла перед редактированием — искомая строка может отличаться (пробелы, переводы строк) или уже была заменена.",
13
13
  "file.moved": "Перемещён {from} → {to}",
14
14
  "file.not_found_short": "Не найдено: {path}",
15
15
  "file.empty": "(пусто)",
16
16
  "file.no_matches": "Нет совпадений",
17
17
  "file.truncated": "\n... (обрезано)",
18
18
  "file.read_header": "── {path} ({ext}, {total} строк, строки {from}-{to})",
19
+ "file.read_range": "строки {from}-{to} из {total}",
19
20
  "file.read_truncated": "\n\n[Обрезано: ещё {remaining} строк. Продолжите чтение через read_file с offset={next}]",
20
21
  "file.empty_page": "(пустая страница)",
21
22
  "error.timeout": "Таймаут запроса",
@@ -35,7 +36,19 @@
35
36
  "error.http": "HTTP {status}: {statusText}",
36
37
  "error.llm_api": "Ошибка LLM API {status} ({statusText}): {errorText}",
37
38
  "error.llm_retries": "Запрос LLM не удался после повторов",
39
+ "error.llm_429": "Превышен лимит запросов (HTTP 429) для {model} на {baseUrl}. Провайдер ограничивает трафик — особенно строгие free-модели. Получите API-ключ или переключитесь на платную/быструю модель: {baseUrl}",
38
40
  "error.no_response_body": "Нет потока тела ответа",
41
+ "error.llm_stream_idle": "Поток LLM завис — нет данных {timeout}мс. Если провайдер буферизирует стрим (например, LM Studio) или генерирует очень длинные tool calls, увеличьте \"retry.noDataTimeoutMs\" в ~/.mma/config.json (нужен рестарт)",
42
+ "error.llm_stream_idle_toolcall": "Поток LLM завис после начала tool_call — нет данных {timeout}мс. Скорее всего провайдер буферизирует SSE вместо потоковой передачи аргументов tool_call (наблюдается в LM Studio). Увеличьте \"retry.noDataTimeoutMs\" в ~/.mma/config.json (нужен рестарт)",
43
+ "error.llm_truncated": "Ответ упёрся в лимит токенов генерации ({tokens}) и был обрезан до какого-либо содержимого. Разбейте задачу на меньшие порции вывода или увеличьте \"maxCompletionTokens\" в конфиге",
44
+ "error.llm_truncated_toolcall": "Ответ упёрся в лимит токенов генерации ({tokens}) посреди tool_call — его аргументы обрезаны. Пишите файл частями (несколько вызовов write_file/edit_file) или увеличьте \"maxCompletionTokens\" в конфиге",
45
+ "error.llm_timeout": "Время запроса LLM истекло ({timeout}мс)",
46
+ "env.runtime_node": "Запущено под Node (v{version}) — вставка изображений из буфера и LSP на Windows работают урезанно. Установите Bun (https://bun.sh) для полного функционала.",
47
+ "env.runtime_old": "Версия рантайма {version} ниже требуемой engines {engine}.",
48
+ "env.tool_missing": "Инструмент не найден в PATH: {tool}",
49
+ "env.playwright_missing": "Пакет Playwright не установлен — браузерный инструмент не будет работать. Установите: bun add playwright",
50
+ "env.playwright_browsers_missing": "Браузеры Playwright не скачаны ({dir}). Браузерный инструмент не будет работать. Установите: bunx playwright install chromium",
51
+ "env.crash_stderr": "MMA упал ({type}): {message} — отчёт о падении записан в ~/.mma/logs/crash.jsonl",
39
52
  "session.started": "Сессия начата: {id}",
40
53
  "session.ended": "Сессия завершена: {id}",
41
54
  "session.not_found": "Сессия не найдена: {id}",
@@ -89,7 +102,7 @@
89
102
  "tool.web_fetch_result": "Загружена страница: {url} — {chars} симв., {lines} строк{truncated}",
90
103
  "tool.web_browse_result": "Просмотрена страница: {url} — {chars} симв., {lines} строк{truncated}",
91
104
  "tool.web_search_result": "Результаты поиска \"{query}\" — {count} результатов",
92
- "tool.downloaded": "Скачано {url} \u2192 {path} ({size} байт, {type})",
105
+ "tool.downloaded": "Скачано {url} {path} ({size} байт, {type})",
93
106
  "tool.download_too_large": "Скачивание заблокировано: файл превышает лимит {max} байт",
94
107
  "tool.friendly.browser": "Браузер",
95
108
  "tool.friendly.subagent": "Задача подагенту",
@@ -129,6 +142,7 @@
129
142
  "tool.skill_available_hint": "Доступные скиллы",
130
143
  "tool.no_results": "Нет результатов по \"{query}\"",
131
144
  "tool.search_results": "Результаты поиска \"{query}\":\n{results}",
145
+ "tool.web_search_disabled": "Веб-поиск отключён (webSearch.enabled: false). Используй только файловые и системные инструменты.",
132
146
  "tool.history_results": "Результаты истории \"{query}\":\n{results}",
133
147
  "tool.no_history": "Нет записей истории по \"{query}\"",
134
148
  "tool.no_sessions_dir": "Каталог сессий не найден по {dir}",
@@ -144,6 +158,8 @@
144
158
  "proc.output_preview": "Первые строки вывода:\n{lines}",
145
159
  "proc.none": "Фоновых процессов нет.",
146
160
  "proc.not_found": "Процесс не найден: {id}",
161
+ "proc.missing_id": "Укажите id процесса: process_kill id=proc_xxx (id возвращается bash при уходе команды в фон или выводится через process_list).",
162
+ "proc.missing_id_list": "Сейчас фоновых процессов нет.",
147
163
  "proc.killed": "Процесс {id} (PID {pid}) остановлен.",
148
164
  "proc.kill_failed": "Не удалось остановить процесс {id}",
149
165
  "proc.list_header": "Фоновые процессы",
@@ -178,6 +194,7 @@
178
194
  "plan.kinds_invalid": "Недопустимый kind шага: {kinds}. Используй \"create\" или \"delete\".",
179
195
  "plan.kinds_not_array": "kinds должен быть массивом значений \"create\" или \"delete\"",
180
196
  "plan.deliverables_remain": "Нельзя пометить шаг {step} как выполненный: указанные файлы всё ещё существуют: {files}. Шаг имеет kind=delete — сначала удали их (или поставь status=skipped, если они должны остаться).",
197
+ "plan.typecheck_failed": "Нельзя отметить шаг {step} выполненным: последняя проверка всё ещё сообщает об ошибке компиляции:\n{error}\nИсправь ошибку и снова отредактируй файл (чистая запись снимает блокировку), либо отметь шаг status=skipped, если он не нужен.",
181
198
  "plan.show_header": "Статус плана:",
182
199
  "plan.show_empty": "(в плане нет шагов)",
183
200
  "plan.list_header": "Планы:",
@@ -190,6 +207,17 @@
190
207
  "plan.active_in_progress": "Нельзя создать новый план: активный план {id} уже имеет прогресс ({done}/{total} выполнено, текущий: шаг {current}). Продолжай его — вызови \"plan show\", чтобы увидеть, и продолжай работу. Чтобы заменить план, сначала вызови \"plan abort\", затем \"plan create\".",
191
208
  "plan.id_ignored": "примечание: id плана генерируется автоматически; используй \"plan switch\", чтобы активировать существующий план по id.",
192
209
  "plan.existing_fresh": "примечание: предыдущий активный план не имел прогресса и сохранён как черновик.",
210
+ "plan.already_active": "План {id} уже активен — переключаться некуда.",
211
+ "plan.already_archived": "План {id} уже в архиве — отменять нечего.",
212
+ "plan.aborted_id": "План {id} отменён и архивирован.",
213
+ "plan.delete_no_id": "Укажите id плана для удаления (plan delete id=plan_xxx).",
214
+ "plan.deleted": "План {id} удалён окончательно.",
215
+ "plan.purged": "Удалено планов: {count}. Хранилище планов пусто.",
216
+ "plan.no_deliverables": "примечание: шаг {step} не называет файлов — его выполнение нельзя проверить автоматически; перед финальным ответом явно проверь результат (например, запусти сборку/тесты).",
217
+ "plan.bulk_update_rejected": "Массовая перезапись steps[] через action=update не поддерживается: она бы стёрла статусы всех шагов. Используй \"re-plan\" (сохраняет завершённые шаги, заменяет остальные) или отмечай шаги по одному: plan update step=N status=done|failed|skipped.",
218
+ "plan.readonly": "План {id} имеет статус {status} (только чтение) — обновить его нельзя. Используй \"plan switch\", чтобы активировать его, или создай новый план для новой задачи.",
219
+ "plan.list_legend": "[*] активный · [ ] черновик · [-] архив",
220
+ "exec.plan_nudge": "Ты сделал(а) {count} вызов(ов), изменяющих файлы, без плана. Для задач, создающих/изменяющих файлы или состоящих из нескольких шагов, сначала создай план (plan create) с конкретными шагами (точные имена файлов, команды, результаты), а потом продолжай.",
193
221
  "todo.added": "Добавлено {count} задач: {items}",
194
222
  "todo.marked_done": "Отмечено выполненными: {count}",
195
223
  "todo.no_active": "Нет активных задач",
@@ -204,6 +232,7 @@
204
232
  "verify.script_passed": "Скрипт '{script}' пройден",
205
233
  "verify.script_failed": "Скрипт '{script}' не пройден: {message}",
206
234
  "verify.syntax_error": "Синтаксическая ошибка в: {path}",
235
+ "verify.file_still_exists": "Файл должен быть удалён, но всё ещё существует: {path}",
207
236
  "verify.no_files": "Шаг {step} не содержит именованных файлов для проверки — выполни реальную проверку (bun run build / bun test / lsp_check) и подтверди результат.",
208
237
  "lsp.unavailable": "статические проверки недоступны (сервер не найден). Проверяйте через собственный build/test проекта.",
209
238
  "lsp.check_disabled": "LSP-проверки отключены в конфигурации.",
@@ -211,6 +240,7 @@
211
240
  "lsp.check_notfound": "Путь не найден: {path}",
212
241
  "lsp.check_unsupported": "Для файла не настроен LSP-сервер: {path}",
213
242
  "lsp.check_clean": "Ошибок и предупреждений не обнаружено (проверено файлов: {count}).",
243
+ "lsp.checked_files": "Проверено файлов: {count}:",
214
244
  "lsp.startup_header": "[Существующие ошибки проекта (проверено при старте сессии) — исправьте их перед продолжением]:",
215
245
  "cli.description": "Micro Models Agent — ИИ-агент для кодинга на малых моделях",
216
246
  "cli.init": "Запустить мастер настройки",
@@ -220,6 +250,7 @@
220
250
  "cli.set_value": "Установить значение",
221
251
  "cli.set_done": "Установлено {key}={value}",
222
252
  "cli.show_config": "Показать текущий конфиг",
253
+ "cli.migrate_config": "Мигрировать legacy config.json в domain-формат",
223
254
  "cli.manage_models": "Управление моделями",
224
255
  "cli.list_models": "Список доступных моделей",
225
256
  "cli.current_model": "Текущая модель:",
@@ -263,6 +294,8 @@
263
294
  "cli.cert_fixture_missing": "Фикстура отсутствует для {id}: {path}",
264
295
  "cli.cert_marks_hint": "Маркеры: ✔ сертифицировано на этом провайдере, ○ сертифицировано на старой версии MMA, · не сертифицировано",
265
296
  "cli.manage_providers": "Управление провайдерами",
297
+ "cli.provider_check": "Проверить доступность провайдеров (бесплатный вызов listModels)",
298
+ "repl.provider_down": "[ВНИМАНИЕ] Провайдер «{name}» недоступен: {error}",
266
299
  "cli.list_providers": "Список провайдеров",
267
300
  "cli.current_provider": "Текущий провайдер:",
268
301
  "cli.base_url": "Базовый URL:",
@@ -391,6 +424,19 @@
391
424
  "repl.lsp_timeout": "таймаут",
392
425
  "repl.lsp_failed": "не стартовал",
393
426
  "repl.lsp_unknown": "неизвестно",
427
+ "repl.lsp": "Управление LSP-серверами (status, restart, check)",
428
+ "repl.lsp_usage": "Использование: /lsp [status|restart|check <путь>]",
429
+ "repl.lsp_not_available": "Модуль LSP недоступен",
430
+ "repl.lsp_status_header": "Статус LSP:",
431
+ "repl.lsp_enabled": "Включён:",
432
+ "repl.lsp_disabled_servers": "Отключённые серверы:",
433
+ "repl.lsp_failure_counts": "Количество ошибок:",
434
+ "repl.lsp_all_ok": "Все серверы работают",
435
+ "repl.lsp_restarting": "Сброс состояния LSP-серверов...",
436
+ "repl.lsp_restarted": "LSP-серверы сброшены. Упавшие серверы будут повторно запущены при следующем использовании.",
437
+ "repl.lsp_check_usage": "Использование: /lsp check <файл-или-каталог>",
438
+ "repl.lsp_checking": "Запуск LSP-проверки {path}...",
439
+ "repl.lsp_check_error": "LSP-проверка не удалась: {error}",
394
440
  "repl.work_dir": "Директория:",
395
441
  "repl.agents_label": "Инструкции:",
396
442
  "repl.not_found": "не найден",
@@ -402,14 +448,14 @@
402
448
  "repl.wizard": "Запустить мастер настройки",
403
449
  "repl.wizard_usage": "Использование: /wizard",
404
450
  "repl.wizard_running": "Запуск мастера настройки... (текущая конфигурация будет перезаписана)",
405
- "repl.provider_list": "Показать/сменить провайдер",
451
+ "repl.provider_list": "Список настроенных провайдеров или горячая смена активного",
406
452
  "repl.provider_current": "Текущий провайдер",
407
453
  "repl.provider_set": "Провайдер установлен: {name}",
408
- "repl.provider_usage": "Использование: /provider list | /provider use <тип>",
409
- "repl.model_list": "Показать/сменить модель",
454
+ "repl.provider_usage": "/provider list — записи (* = активный, prio = порядок fallback) | /provider use <имя> — смена без перезапуска",
455
+ "repl.model_list": "Список моделей активного провайдера или смена модели",
410
456
  "repl.model_current": "Текущая модель",
411
457
  "repl.model_set": "Модель установлена: {name}",
412
- "repl.model_usage": "Использование: /model list | /model use <имя>",
458
+ "repl.model_usage": "/model list — получить модели активного провайдера | /model use <имя> — сменить модель",
413
459
  "repl.reload": "Перезагрузить агента с текущим конфигом",
414
460
  "repl.reload_usage": "Использование: /reload",
415
461
  "repl.reloading": "Перезагрузка агента...",
@@ -449,6 +495,7 @@
449
495
  "setup.summary_value": "Значение",
450
496
  "setup.security_header": "\n --- Безопасность ---",
451
497
  "setup.security_status_off": " Безопасность: ВЫКЛ (по умолчанию — все команды разрешены)",
498
+ "setup.security_status_on": " Безопасность: ВКЛ (по умолчанию — политика balanced)",
452
499
  "setup.security_configure": " Настроить безопасность? (y/N)",
453
500
  "setup.security_bash_block": " Блокировать опасные команды (rm, sudo, ssh и т.д.)? (y/N)",
454
501
  "setup.security_flags_block": " Блокировать опасные флаги (--force, -rf и т.д.)? (y/N)",
@@ -469,6 +516,7 @@
469
516
  "exec.tool_errors_recovery": "Инструмент {tool} упал {count} раз подряд. Попробуйте альтернативу: создайте файлы напрямую через write_file, используйте другую команду, или пропустите этот шаг через plan update step=N status=skipped с пометкой почему.",
470
517
  "exec.repetitive_tool": "Инструмент {tool} вызван {count} раз с одинаковыми аргументами и результатом. Попробуйте другой подход — создайте файлы напрямую, измените аргументы или проверьте статус процесса через process_log.",
471
518
  "exec.consecutive_failures_recovery": "{count} инструментов подряд упали. Создавайте файлы напрямую через write_file вместо команд терминала. Проверьте что зависимости установлены (npm install). Не запускайте сборку/тесты пока не созданы все файлы.",
519
+ "exec.bash_flailing_recovery": "bash упал в {fails} из последних {window} попыток. Хватит использовать шелл-команды для файловых операций на этой машине — они не работают. Используй специализированные инструменты: read_file (в заголовке число строк), write_file, edit_file, file_info (размер файла), glob/grep для поиска",
472
520
  "exec.read_only_loop": "Нет записи/выполнения за {count} вызовов — агент только читает/исследует.",
473
521
  "exec.read_only_loop_recovery": "{count} вызовов только для чтения подряд (read_file/glob/grep/browser) без записи. Хватит исследовать — внесите правку, которую требует задача: прочитайте файл, затем вызовите write_file или edit_file. Если не можете завершить задачу — спросите пользователя, а не перечитывайте одни и те же файлы.",
474
522
  "exec.plan_warning": "Текущий шаг плана {step} — \"{description}\", но вызывается {tool} для файлов вне этого шага. Завершите текущий шаг, вызовите plan update step={step} status=done, затем переходите к следующему.",
@@ -491,7 +539,12 @@
491
539
  "exec.hints": "\n[Подсказки]\n{hints}",
492
540
  "exec.file_rewrite_warning": "⚠️ Файл {file} был перезаписан {count} раз. Попробуйте другой подход — текущая стратегия исправлений не работает.",
493
541
  "exec.forbidden_cmd": "ПРЕКРАТИ использовать \"{cmd}\" через bash — это не команда Windows cmd.exe, и она уже неоднократно падала в этой сессии. Используй предназначенный тул: grep → тул grep, ls/dir → list_dir, find → glob, rm → delete_file, sed → edit_file, touch → write_file, which → `where`, cp/mv → move_file, diff → read_file. Больше не вызывай bash для этого.",
542
+ "exec.error_search_results": "Ошибка \"{sig}\" повторилась {count} раз. Поиск в интернете нашёл:\n{results}\nПримени подходящее решение из результатов. Если ни один результат не релевантен — НЕ повторяй тот же подход, смени стратегию или честно сообщи о застревании.",
543
+ "exec.error_search_failed": "Поиск в интернете для \"{query}\" ничего не дал.",
544
+ "exec.error_search_no_query": "Текст ошибки незначимый — поиск в интернете пропущен.",
494
545
  "exec.npm_exec_hint": "\"could not determine executable to run\" — у пакета/скрипта нет \"bin\". Используй \"npm run <script>\" (скрипт должен быть в package.json) или \"bunx <pkg>\" для пакета с объявленным bin.",
546
+ "exec.hidden_tool_hint": "\"{tool}\" — не команда оболочки, это инструмент MMA, который сейчас скрыт. Вызови тул enable_tools с tags [\"shell\"], чтобы включить его; он станет доступен на следующей итерации.",
547
+ "exec.task_reminder": "Задача: {task}. Продолжай работу — не повторяй неудачные действия.",
495
548
  "hall.max_retries_exhausted": "Модель вернула пустой или недостаточный ответ после нескольких попыток",
496
549
  "hall.short_response": "Слишком короткий или пустой ответ",
497
550
  "hall.repetitive": "Слишком повторяющийся ответ ({pct}% совпадение)",
@@ -538,6 +591,7 @@
538
591
  "ui.success_prefix": "✓ ",
539
592
  "ui.warning_prefix": "⚠ ",
540
593
  "ui.thinking": "Думаю…",
594
+ "ui.tool_running": "{tool}…",
541
595
  "ui.step_context": "шаг {id}: {desc}",
542
596
  "indexer.map_header": "Карта проекта",
543
597
  "indexer.top_directories": "Основные директории",
@@ -559,6 +613,11 @@
559
613
  "tool.friendly.project_map": "Карта проекта",
560
614
  "config.decryption_warning": "Предупреждение: не удалось расшифровать конфигурацию: {error}",
561
615
  "config.encryption_warning": "Предупреждение: не удалось зашифровать конфигурацию: {error}",
616
+ "config.migrate_start": "Миграция конфига в domain-формат...",
617
+ "config.migrate_done": "Миграция завершена. Создано {count} domain файлов. Legacy сохранён как config.json.bak.",
618
+ "config.migrate_no_legacy": "Legacy config.json не найден. Уже используется domain-формат.",
619
+ "config.migrate_error": "Ошибка миграции: {error}",
620
+ "config.legacy_hint": "Config: используется legacy config.json. Запустите \"mma config migrate\" для перехода к domain-формату.",
562
621
  "image.source_required": "Укажите источник изображения: путь к файлу, URL или \"clipboard\".",
563
622
  "image.clipboard_empty": "Буфер обмена не содержит изображение. Скопируйте изображение (например, скриншот через Win+Shift+S).",
564
623
  "image.not_found": "Файл изображения не найден: {path}",
@@ -582,7 +641,7 @@
582
641
  "ctx.delta_pos": "контекст +{tokens}",
583
642
  "ctx.delta_neg": "контекст -{tokens} ↓",
584
643
  "ctx.delta_zero": "контекст ±0",
585
- "file.notfound_resolved": "Файл не найден: {path} (резолвится в {resolved})",
644
+ "file.notfound_resolved": "Файл не найден: {path} (резолвится в {resolved})\nПуть был склеен с рабочей директорией, потому что в исходном виде он не существует. Выполни list_dir, чтобы найти корректный путь.",
586
645
  "bash.echo_write_blocked": "Запись файлов через echo/printf ненадёжна в Windows cmd.exe (кавычки и многострочность ломаются). Используй инструмент write_file вместо этого (цель: {path}).",
587
646
  "updater.check_error": "[updater] Ошибка проверки обновления: {error}",
588
647
  "updater.available": "[updater] Доступно обновление: {current} → {latest}. Выполните `npm install -g micro-models-agent` для обновления.",
@@ -594,5 +653,27 @@
594
653
  "tools.enable_already_active": "Теги тулов уже активны: {tags}.",
595
654
  "tools.enable_added": "Включены теги тулов: {tags}. Теперь доступны тулы: {tools}",
596
655
  "tools.hidden_header": "Дополнительные тулы (включите по требованию через enable_tools или маршрутизируйте через subagent tool_tags):",
597
- "tool.friendly.enable_tools": "Включить тулы"
656
+ "tool.friendly.enable_tools": "Включить тулы",
657
+ "cli.provider_base_hint": "Базовый URL установлен: {baseUrl}",
658
+ "cli.add_provider": "Добавить провайдера в конфиг",
659
+ "cli.provider_no_url": "Нет базового URL для провайдера \"{name}\". Укажите --url.",
660
+ "cli.provider_added": "Провайдер добавлен: {name}",
661
+ "cli.provider_switch_hint": "Переключитесь на него: mma provider use <имя>",
662
+ "repl.cost": "Итого потрачено: {cost}",
663
+ "repl.cost_breakdown": "По провайдерам: {breakdown}",
664
+ "repl.tokens": "Потрачено токенов: {tokens}",
665
+ "repl.ctrl_c_interrupt": "\n[Ctrl+C] Остановка агента... (ещё раз — принудительно)",
666
+ "exec.stop_directive": "STOP. Step {stepId} (\"{description}\") took {iterations} iterations with no progress. DO NOT continue this step. Immediately call: plan update step={stepId} status=done (if code works despite warnings) OR plan update step={stepId} status=skipped note=\"reason\". Do NOT make any other tool calls before updating the plan.",
667
+ "exec.test_runner_fail": "[test-runner] {framework}: {failed} test(s) FAILING, {passed} passing — do NOT mark verification steps as done while tests fail. Investigate the failures, fix the code, then re-run the tests.",
668
+ "exec.test_runner_pass": "[test-runner] {framework}: all {passed} test(s) passing.",
669
+ "plan.subtasks_done": "All sub-tasks done — call plan update step={stepId} status=done to complete this step.",
670
+ "plan.no_subtasks": "(no sub-tasks)",
671
+ "plan.step_label": "Step {stepId}: {description}",
672
+ "exec.hint_deps": "Check if a lock file exists (package-lock.json, poetry.lock). If missing, run the install command first.",
673
+ "exec.hint_test": "Make sure the source files exist and have real code before running tests.",
674
+ "exec.hint_build": "Check that all dependencies are installed and source files are not empty.",
675
+ "exec.hint_deploy": "Verify credentials and network access before deploying.",
676
+ "exec.hint_repetitive": "You are calling the same tool repeatedly with the same arguments. Try a different approach.",
677
+ "exec.hint_consecutive": "Multiple different tools are failing. Check if the environment is set up correctly.",
678
+ "exec.hint_read_only": "You have made many read-only tool calls (read_file/glob/grep/browser) without writing anything. Stop exploring — make the edit/write the task needs, or use the plan tool to decide next steps."
598
679
  }