micro-models-agent 0.52.1 → 0.54.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 (232) hide show
  1. package/README.md +358 -358
  2. package/dist/certification/certifications.json +494 -0
  3. package/dist/cli/commands.js +447 -0
  4. package/dist/cli/completer.js +167 -0
  5. package/dist/cli/index.js +2 -0
  6. package/dist/cli/main.js +153 -0
  7. package/dist/cli/plugin-commands.js +36 -0
  8. package/dist/cli/repl-commands.js +761 -0
  9. package/dist/cli/repl.js +702 -0
  10. package/dist/cli/run-result.js +33 -0
  11. package/dist/cli/security-commands.js +164 -0
  12. package/dist/cli/setup.js +237 -0
  13. package/dist/config/config.js +276 -0
  14. package/dist/config/defaults.js +141 -0
  15. package/dist/config/domains.js +179 -0
  16. package/dist/config/experts.js +15 -0
  17. package/dist/config/index.js +4 -0
  18. package/dist/config/security.js +213 -0
  19. package/dist/config/types.js +1 -0
  20. package/dist/core/agent-moe.js +102 -0
  21. package/dist/core/agent.js +1018 -0
  22. package/dist/core/bootstrap.js +481 -0
  23. package/dist/core/crash-handler.js +51 -0
  24. package/dist/core/environment.js +199 -0
  25. package/dist/core/index.js +2 -0
  26. package/dist/core/prompt-builder.js +76 -0
  27. package/dist/core/session-logger.js +251 -0
  28. package/dist/core/types.js +1 -0
  29. package/dist/core/version.js +26 -0
  30. package/dist/core/workspace.js +76 -0
  31. package/dist/i18n/en.json +679 -0
  32. package/dist/i18n/index.js +46 -0
  33. package/dist/i18n/ru.json +679 -0
  34. package/dist/index.js +22 -0
  35. package/dist/llm/image-utils.js +143 -0
  36. package/dist/llm/index.js +4 -0
  37. package/dist/llm/model-loader.js +78 -0
  38. package/dist/llm/openai-compat.js +497 -0
  39. package/dist/llm/orchestrator.js +200 -0
  40. package/dist/llm/provider.js +10 -0
  41. package/dist/llm/response.js +39 -0
  42. package/dist/llm/token-counter.js +39 -0
  43. package/dist/llm/types.js +1 -0
  44. package/dist/logger/app-logger.js +189 -0
  45. package/dist/logger/file-log.js +151 -0
  46. package/dist/logger/index.js +1 -0
  47. package/dist/main.js +304 -157
  48. package/dist/migration/backup.js +45 -0
  49. package/dist/migration/detect.js +50 -0
  50. package/dist/migration/index.js +2 -0
  51. package/dist/modules/artifacts/store.js +61 -0
  52. package/dist/modules/browser/actions.js +76 -0
  53. package/dist/modules/browser/bridge-client.js +199 -0
  54. package/dist/modules/browser/bridge-path.js +10 -0
  55. package/dist/modules/browser/bridge-server.mjs +202 -202
  56. package/dist/modules/browser/cookie-store.js +24 -0
  57. package/dist/modules/browser/driver.js +136 -0
  58. package/dist/modules/browser/index.js +7 -0
  59. package/dist/modules/browser/module.js +29 -0
  60. package/dist/modules/browser/session.js +342 -0
  61. package/dist/modules/browser/snapshot.js +148 -0
  62. package/dist/modules/browser/types.js +12 -0
  63. package/dist/modules/certification/cli.js +213 -0
  64. package/dist/modules/certification/fact-checker.js +82 -0
  65. package/dist/modules/certification/loader.js +106 -0
  66. package/dist/modules/certification/manifest.js +58 -0
  67. package/dist/modules/certification/runner.js +245 -0
  68. package/dist/modules/certification/scenarios.js +407 -0
  69. package/dist/modules/certification/types.js +1 -0
  70. package/dist/modules/context/chunk-query.js +100 -0
  71. package/dist/modules/context/fact-extractor.js +168 -0
  72. package/dist/modules/context/history.js +15 -0
  73. package/dist/modules/context/index.js +1 -0
  74. package/dist/modules/context/manager.js +440 -0
  75. package/dist/modules/execution/audit-runners.js +206 -0
  76. package/dist/modules/execution/auditor.js +218 -0
  77. package/dist/modules/execution/execution-plugin.js +431 -0
  78. package/dist/modules/execution/index.js +8 -0
  79. package/dist/modules/execution/module.js +625 -0
  80. package/dist/modules/execution/moe-executor.js +304 -0
  81. package/dist/modules/execution/plan-coverage.js +68 -0
  82. package/dist/modules/execution/plan-persister.js +46 -0
  83. package/dist/modules/execution/plan-store.js +196 -0
  84. package/dist/modules/execution/plan-tool.js +677 -0
  85. package/dist/modules/execution/plan-validator.js +153 -0
  86. package/dist/modules/execution/planner.js +94 -0
  87. package/dist/modules/execution/stuck-detector.js +746 -0
  88. package/dist/modules/execution/tracker.js +69 -0
  89. package/dist/modules/execution/types.js +1 -0
  90. package/dist/modules/execution/verifier.js +235 -0
  91. package/dist/modules/execution/windows-commands.js +41 -0
  92. package/dist/modules/hallucination/confidence.js +66 -0
  93. package/dist/modules/hallucination/consistency.js +26 -0
  94. package/dist/modules/hallucination/detector.js +47 -0
  95. package/dist/modules/hallucination/factual.js +169 -0
  96. package/dist/modules/hallucination/index.js +5 -0
  97. package/dist/modules/hallucination/js-identifiers.js +262 -0
  98. package/dist/modules/hallucination/llm-judge.js +101 -0
  99. package/dist/modules/index.js +5 -0
  100. package/dist/modules/indexer/cache.js +40 -0
  101. package/dist/modules/indexer/index.js +3 -0
  102. package/dist/modules/indexer/module.js +246 -0
  103. package/dist/modules/indexer/project-profile.js +183 -0
  104. package/dist/modules/indexer/walker.js +101 -0
  105. package/dist/modules/lsp/check-tool.js +58 -0
  106. package/dist/modules/lsp/client.js +389 -0
  107. package/dist/modules/lsp/command.js +60 -0
  108. package/dist/modules/lsp/config.js +135 -0
  109. package/dist/modules/lsp/index.js +3 -0
  110. package/dist/modules/lsp/module.js +260 -0
  111. package/dist/modules/lsp/probe.js +86 -0
  112. package/dist/modules/lsp/project-root.js +32 -0
  113. package/dist/modules/lsp/startup-check.js +144 -0
  114. package/dist/modules/lsp/types.js +1 -0
  115. package/dist/modules/mcp/client.js +399 -0
  116. package/dist/modules/mcp/index.js +3 -0
  117. package/dist/modules/mcp/module.js +142 -0
  118. package/dist/modules/mcp/registry.js +15 -0
  119. package/dist/modules/memory/index.js +1 -0
  120. package/dist/modules/memory/module.js +96 -0
  121. package/dist/modules/memory/search.js +42 -0
  122. package/dist/modules/memory/store.js +69 -0
  123. package/dist/modules/pipelines/engine.js +60 -0
  124. package/dist/modules/pipelines/index.js +3 -0
  125. package/dist/modules/pipelines/parser.js +56 -0
  126. package/dist/modules/pipelines/template.js +14 -0
  127. package/dist/modules/plugins/builtin/lint-on-write.js +334 -0
  128. package/dist/modules/plugins/builtin/notify.js +9 -0
  129. package/dist/modules/plugins/index.js +1 -0
  130. package/dist/modules/plugins/loader.js +70 -0
  131. package/dist/modules/plugins/manager.js +261 -0
  132. package/dist/modules/plugins/types.js +1 -0
  133. package/dist/modules/pricing/index.js +61 -0
  134. package/dist/modules/pricing/prices.js +129 -0
  135. package/dist/modules/processes/detect.js +34 -0
  136. package/dist/modules/processes/index.js +2 -0
  137. package/dist/modules/processes/registry.js +327 -0
  138. package/dist/modules/processes/runner.js +23 -0
  139. package/dist/modules/providers/create.js +22 -0
  140. package/dist/modules/providers/fallback.js +79 -0
  141. package/dist/modules/providers/health.js +46 -0
  142. package/dist/modules/providers/index.js +5 -0
  143. package/dist/modules/providers/manager.js +161 -0
  144. package/dist/modules/providers/presets.js +128 -0
  145. package/dist/modules/providers/registry.js +22 -0
  146. package/dist/modules/providers/types.js +1 -0
  147. package/dist/modules/registry.js +48 -0
  148. package/dist/modules/security/audit-log.js +136 -0
  149. package/dist/modules/security/audit-notifier.js +292 -0
  150. package/dist/modules/security/command-validator.js +219 -0
  151. package/dist/modules/security/content-scanner.js +53 -0
  152. package/dist/modules/security/data-sanitizer.js +89 -0
  153. package/dist/modules/security/encryption.js +242 -0
  154. package/dist/modules/security/index.js +14 -0
  155. package/dist/modules/security/network-validator.js +88 -0
  156. package/dist/modules/security/path-validator.js +203 -0
  157. package/dist/modules/security/rate-limiter.js +119 -0
  158. package/dist/modules/security/security-policies.js +531 -0
  159. package/dist/modules/security/session-encryption.js +210 -0
  160. package/dist/modules/security/session-isolation.js +95 -0
  161. package/dist/modules/session/index.js +3 -0
  162. package/dist/modules/session/manager.js +172 -0
  163. package/dist/modules/session/module.js +24 -0
  164. package/dist/modules/session/store.js +222 -0
  165. package/dist/modules/session/types.js +1 -0
  166. package/dist/modules/skills/index.js +2 -0
  167. package/dist/modules/skills/loader.js +72 -0
  168. package/dist/modules/skills/matcher.js +27 -0
  169. package/dist/modules/skills/module.js +129 -0
  170. package/dist/modules/types.js +1 -0
  171. package/dist/modules/updater/checker.js +96 -0
  172. package/dist/modules/updater/index.js +2 -0
  173. package/dist/modules/updater/module.js +116 -0
  174. package/dist/modules/user-profile/compressor.js +16 -0
  175. package/dist/modules/user-profile/index.js +1 -0
  176. package/dist/modules/user-profile/profile.js +68 -0
  177. package/dist/skills/builtin/git.md +36 -36
  178. package/dist/skills/builtin/typescript.md +35 -35
  179. package/dist/tools/approve.js +33 -0
  180. package/dist/tools/attach-image.js +101 -0
  181. package/dist/tools/bash.js +519 -0
  182. package/dist/tools/browser.js +115 -0
  183. package/dist/tools/chunk-query.js +100 -0
  184. package/dist/tools/create-dir.js +56 -0
  185. package/dist/tools/delete-file.js +63 -0
  186. package/dist/tools/download-file.js +117 -0
  187. package/dist/tools/edit-file.js +80 -0
  188. package/dist/tools/enable-tools.js +59 -0
  189. package/dist/tools/executor.js +154 -0
  190. package/dist/tools/file-info.js +47 -0
  191. package/dist/tools/filter-tools.js +17 -0
  192. package/dist/tools/glob-tool.js +27 -0
  193. package/dist/tools/grep-tool.js +125 -0
  194. package/dist/tools/hidden-tools-block.js +37 -0
  195. package/dist/tools/index.js +78 -0
  196. package/dist/tools/list-dir.js +49 -0
  197. package/dist/tools/load-skill.js +43 -0
  198. package/dist/tools/mcp-call.js +69 -0
  199. package/dist/tools/move-file.js +86 -0
  200. package/dist/tools/path-utils.js +101 -0
  201. package/dist/tools/pipeline-run.js +145 -0
  202. package/dist/tools/preview.js +2 -0
  203. package/dist/tools/process-kill.js +40 -0
  204. package/dist/tools/process-list.js +37 -0
  205. package/dist/tools/process-log.js +54 -0
  206. package/dist/tools/question.js +141 -0
  207. package/dist/tools/read-file.js +179 -0
  208. package/dist/tools/recall.js +118 -0
  209. package/dist/tools/registry.js +47 -0
  210. package/dist/tools/remember.js +68 -0
  211. package/dist/tools/scope-check.js +32 -0
  212. package/dist/tools/search-history.js +85 -0
  213. package/dist/tools/subagent.js +196 -0
  214. package/dist/tools/types.js +1 -0
  215. package/dist/tools/user-input.js +123 -0
  216. package/dist/tools/web-browse.js +87 -0
  217. package/dist/tools/web-fetch.js +119 -0
  218. package/dist/tools/web-search.js +105 -0
  219. package/dist/tools/write-file.js +82 -0
  220. package/dist/ui/box.js +77 -0
  221. package/dist/ui/colors.js +4 -0
  222. package/dist/ui/diff.js +178 -0
  223. package/dist/ui/index.js +6 -0
  224. package/dist/ui/line-editor.js +822 -0
  225. package/dist/ui/line-math.js +73 -0
  226. package/dist/ui/md-formatter.js +212 -0
  227. package/dist/ui/output.js +13 -0
  228. package/dist/ui/plan-view.js +103 -0
  229. package/dist/ui/renderer.js +259 -0
  230. package/dist/ui/spinner.js +70 -0
  231. package/dist/ui/table.js +144 -0
  232. package/package.json +50 -50
@@ -0,0 +1,679 @@
1
+ {
2
+ "file.created": "Создан {path}",
3
+ "file.deleted": "Удалён {path}",
4
+ "file.updated": "Обновлён {path}",
5
+ "file.written": "Записан {path}",
6
+ "file.notfound": "Файл не найден: {path}\nЭто НЕ значит, что проект отсутствует — возможно, путь неверный. Выполни list_dir по рабочей директории; создавай файлы только после проверки того, что уже есть.",
7
+ "file.dir_notfound": "Каталог не найден: {path}\nЭто НЕ значит, что проект отсутствует — возможно, путь неверный. Выполни list_dir по рабочей директории (и родителю этого пути), чтобы найти реальное расположение, прежде что-то создавать.",
8
+ "file.path_not_allowed": "Путь недопустим: {path}",
9
+ "file.path_not_allowed_short": "Путь недопустим",
10
+ "file.is_directory": "Это каталог, используйте rmdir: {path}",
11
+ "file.replaced_in": "Заменено в {path}",
12
+ "file.string_not_found": "Строка не найдена в файле:\n{str}\n\nИспользуй read_file для {path}, чтобы увидеть текущее содержимое файла перед редактированием — искомая строка может отличаться (пробелы, переводы строк) или уже была заменена.",
13
+ "file.moved": "Перемещён {from} → {to}",
14
+ "file.not_found_short": "Не найдено: {path}",
15
+ "file.empty": "(пусто)",
16
+ "file.no_matches": "Нет совпадений",
17
+ "file.truncated": "\n... (обрезано)",
18
+ "file.read_header": "── {path} ({ext}, {total} строк, строки {from}-{to})",
19
+ "file.read_range": "строки {from}-{to} из {total}",
20
+ "file.read_truncated": "\n\n[Обрезано: ещё {remaining} строк. Продолжите чтение через read_file с offset={next}]",
21
+ "file.empty_page": "(пустая страница)",
22
+ "error.timeout": "Таймаут запроса",
23
+ "error.unknown": "Неизвестная ошибка",
24
+ "error.notfound": "Не найдено: {path}",
25
+ "error.prefix": "Ошибка: ",
26
+ "error.command_error": "Ошибка команды: {message}",
27
+ "error.llm": "Ошибка LLM: {message}",
28
+ "error.response_blocked": "Ответ заблокирован: {reason}",
29
+ "error.max_iters": "Достигнут максимум итераций ({max})",
30
+ "error.empty_response": "Модель вернула пустой ответ после повторных попыток",
31
+ "error.audit_failed": "Задача не может быть подтверждена как выполненная: {summary}",
32
+ "error.grep_failed": "Ошибка grep: {message}",
33
+ "error.search_failed": "Ошибка поиска: {message}",
34
+ "error.fetch_failed": "Ошибка загрузки: {message}",
35
+ "error.fetch_url_failed": "Не удалось загрузить {url}: {message}",
36
+ "error.http": "HTTP {status}: {statusText}",
37
+ "error.llm_api": "Ошибка LLM API {status} ({statusText}): {errorText}",
38
+ "error.llm_retries": "Запрос LLM не удался после повторов",
39
+ "error.llm_429": "Превышен лимит запросов (HTTP 429) для {model} на {baseUrl}. Провайдер ограничивает трафик — особенно строгие free-модели. Получите API-ключ или переключитесь на платную/быструю модель: {baseUrl}",
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",
52
+ "session.started": "Сессия начата: {id}",
53
+ "session.ended": "Сессия завершена: {id}",
54
+ "session.not_found": "Сессия не найдена: {id}",
55
+ "session.no_active": "Нет активной сессии",
56
+ "session.deleted": "Сессия удалена: {id}",
57
+ "session.renamed": "Сессия переименована в: {name}",
58
+ "session.created": "Создана сессия: {name}",
59
+ "session.resumed": "Возобновлена сессия: {name}",
60
+ "session.chat_cleared": "Чат очищен. Начните вводить.",
61
+ "session.chat_loaded": "История чата загружена. Продолжите с места остановки.",
62
+ "session.chat_history": "История чата:",
63
+ "session.user_label": "Пользователь",
64
+ "session.assistant_label": "Ассистент",
65
+ "session.no_history": "История чата пуста",
66
+ "session.no_sessions": "Сессии не найдены",
67
+ "session.no_sessions_hint": "Сессии не найдены. Создайте одну командой /new <имя>",
68
+ "session.available": "Доступные сессии:",
69
+ "session.no_match": "Нет сессии подходящей по \"{query}\"",
70
+ "session.default_name": "Сессия {date}",
71
+ "session.info": "[Сессия: \"{name}\" ({id}) — {count} сообщений]",
72
+ "session.col_active": "",
73
+ "session.col_id": "ID",
74
+ "session.col_name": "Имя",
75
+ "session.col_updated": "Обновлена",
76
+ "session.col_msgs": "Сообщ.",
77
+ "tool.executed": "Выполнен {name}",
78
+ "tool.failed": "Инструмент {name} упал: {error}",
79
+ "tool.unknown": "Неизвестный инструмент: {name}",
80
+ "tool.blocked": "Заблокировано плагином: {plugin}",
81
+ "tool.blocked_reason": "Заблокировано плагином: {plugin}. Причина: {reason}",
82
+ "tool.using": "[{label}]",
83
+ "tool.friendly.write_file": "Запись файла",
84
+ "tool.friendly.read_file": "Чтение файла",
85
+ "tool.friendly.edit_file": "Редактирование файла",
86
+ "tool.friendly.create_dir": "Создание папки",
87
+ "tool.friendly.delete_file": "Удаление файла",
88
+ "tool.friendly.move_file": "Перемещение файла",
89
+ "tool.friendly.list_dir": "Список файлов",
90
+ "tool.friendly.file_info": "Информация о файле",
91
+ "tool.friendly.glob": "Поиск файлов",
92
+ "tool.friendly.grep": "Поиск по содержимому",
93
+ "tool.friendly.bash": "Выполнение команды",
94
+ "tool.friendly.load_skill": "Загрузка скилла",
95
+ "tool.friendly.plan": "Планирование",
96
+ "tool.friendly.todo": "Обновление задач",
97
+ "tool.friendly.verify": "Проверка",
98
+ "tool.friendly.web_search": "Поиск в интернете",
99
+ "tool.friendly.web_fetch": "Загрузка страницы",
100
+ "tool.friendly.web_browse": "Просмотр страницы",
101
+ "tool.friendly.download_file": "Скачивание файла",
102
+ "tool.web_fetch_result": "Загружена страница: {url} — {chars} симв., {lines} строк{truncated}",
103
+ "tool.web_browse_result": "Просмотрена страница: {url} — {chars} симв., {lines} строк{truncated}",
104
+ "tool.web_search_result": "Результаты поиска \"{query}\" — {count} результатов",
105
+ "tool.downloaded": "Скачано {url} → {path} ({size} байт, {type})",
106
+ "tool.download_too_large": "Скачивание заблокировано: файл превышает лимит {max} байт",
107
+ "tool.friendly.browser": "Браузер",
108
+ "tool.friendly.subagent": "Задача подагенту",
109
+ "tool.friendly.question": "Вопрос пользователю",
110
+ "tool.friendly.approve": "Запрос подтверждения",
111
+ "tool.friendly.search_history": "Поиск в истории",
112
+ "tool.friendly.pipeline_run": "Запуск пайплайна",
113
+ "tool.friendly.mcp_call": "MCP вызов",
114
+ "tool.friendly.lsp_check": "Проверка кода",
115
+ "tool.truncated": "[Обрезано: удалено {tokens} токенов]",
116
+ "tool.subagent_queued": "Задача подагенту добавлена: {task}",
117
+ "tool.subagent_artifact": "Суб-агент завершён. Полный результат сохранён в артефакт: {path}\nИтераций: {iterations}\nСводка:\n{summary}",
118
+ "tool.pipeline_started": "Пайплайн \"{name}\" запущен. Движок пайплайнов — заглушка, задача отправлена.",
119
+ "tool.mcp_call": "MCP вызов: {server}/{tool} с {args}",
120
+ "tool.action_required": "Требуется действие.",
121
+ "tool.approve_prompt": "Одобрить? {action}",
122
+ "tool.approve_yes": "Да",
123
+ "tool.approve_yes_desc": "Одобрить действие",
124
+ "tool.approve_no": "Нет",
125
+ "tool.approve_no_desc": "Отклонить действие",
126
+ "tool.approved": "Одобрено",
127
+ "tool.rejected": "Отклонено пользователем",
128
+ "tool.user_input.custom_option": "Свой вариант",
129
+ "tool.user_input.choice_single": "Ваш выбор (1-{max}): ",
130
+ "tool.user_input.choice_multiple": "Ваш выбор (через запятую, напр. 1,3): ",
131
+ "tool.user_input.invalid": "Неверный выбор, попробуйте ещё раз.",
132
+ "tool.user_input.custom_prompt": "Ваш ответ: ",
133
+ "tool.question.progress": "Вопрос {current}/{total}",
134
+ "tool.question.no_questions": "Вопросы не указаны",
135
+ "tool.question.unanswered": "Без ответа",
136
+ "tool.question.answered": "Пользователь ответил на ваши вопросы: {formatted}. Теперь продолжайте с учётом ответов.",
137
+ "tool.name_or_task": "Укажите параметр \"name\" или \"task\"",
138
+ "tool.chunk_query_no_query": "chunk_query: требуется строка запроса.",
139
+ "tool.chunk_query_no_input": "chunk_query: укажите input_path или text.",
140
+ "tool.invalid_params": "Неверные параметры",
141
+ "tool.skill_budget": "Скилл \"{name}\" загружен ({tokens} токенов, осталось {remaining} в бюджете скиллов). Контент скилла теперь в системном промпте — перезагрузка после компрессии не нужна.",
142
+ "tool.skill_available_hint": "Доступные скиллы",
143
+ "tool.no_results": "Нет результатов по \"{query}\"",
144
+ "tool.search_results": "Результаты поиска \"{query}\":\n{results}",
145
+ "tool.web_search_disabled": "Веб-поиск отключён (webSearch.enabled: false). Используй только файловые и системные инструменты.",
146
+ "tool.history_results": "Результаты истории \"{query}\":\n{results}",
147
+ "tool.no_history": "Нет записей истории по \"{query}\"",
148
+ "tool.no_sessions_dir": "Каталог сессий не найден по {dir}",
149
+ "tool.history_error": "Ошибка поиска истории: {error}",
150
+ "tool.memory_error": "Ошибка памяти: {error}",
151
+ "tool.screenshot_unavailable": "[Скриншот сделан — изображение недоступно для текстовой модели]",
152
+ "tool.timeout": "Инструмент {name} превысил таймаут ({seconds} сек)",
153
+ "tool.aborted": "Инструмент {name} прерван пользователем",
154
+ "tool.interactive_disabled": "Интерактивный инструмент отключён в режиме exit-on-complete. Продолжай без вопроса пользователю.",
155
+ "proc.started": "Фоновый процесс запущен: {id} (PID {pid}).\nКоманда: {command}",
156
+ "proc.promoted_hint": "Команда всё ещё выполняется через {ms} мс — переведена в фоновый режим",
157
+ "proc.manage_hint": "Проверить вывод: process_log id={id}. Остановить: process_kill id={id}. Список всех: process_list.",
158
+ "proc.output_preview": "Первые строки вывода:\n{lines}",
159
+ "proc.none": "Фоновых процессов нет.",
160
+ "proc.not_found": "Процесс не найден: {id}",
161
+ "proc.missing_id": "Укажите id процесса: process_kill id=proc_xxx (id возвращается bash при уходе команды в фон или выводится через process_list).",
162
+ "proc.missing_id_list": "Сейчас фоновых процессов нет.",
163
+ "proc.killed": "Процесс {id} (PID {pid}) остановлен.",
164
+ "proc.kill_failed": "Не удалось остановить процесс {id}",
165
+ "proc.list_header": "Фоновые процессы",
166
+ "proc.log_header": "Вывод процесса {id} ({status}):",
167
+ "proc.log_empty": "(вывода пока нет)",
168
+ "proc.hint": "Управление: {list}, {log}, {kill}.",
169
+ "proc.status_running": "работает",
170
+ "proc.status_exited": "завершён",
171
+ "proc.status_killed": "остановлен",
172
+ "tool.friendly.process_list": "Список фоновых процессов",
173
+ "tool.friendly.process_log": "Вывод процесса",
174
+ "tool.friendly.process_kill": "Остановка процесса",
175
+ "plan.no_steps": "Не указаны шаги плана. Укажите конкретные шаги с файлами и командами.",
176
+ "plan.created": "План создан: {title} ({steps} шагов)",
177
+ "plan.coverage_warning": "План может не покрывать требуемые файлы из постановки: {missing}. Добавьте шаги, покрывающие их.",
178
+ "plan.step_done": "Шаг {n}/{total}: {description} ✓",
179
+ "plan.complete": "Задача выполнена: {summary}",
180
+ "plan.title_steps": "План \"{title}\" создан с {count} шагами",
181
+ "plan.step_marked": "Шаг {step} отмечен как {status}",
182
+ "plan.aborted": "План отменён",
183
+ "plan.completed_archived": "План {id} завершён ({done}/{total} шагов) — архивирован. Для новой задачи создай новый план (plan create) или дай финальный ответ.",
184
+ "plan.unknown_action": "Неизвестное действие плана: {action}",
185
+ "plan.updated": "План обновлён: {title} ({steps} шагов)",
186
+ "plan.acknowledged": "План {action}: принято",
187
+ "plan.step_status": "Шаг {step}: {status}",
188
+ "plan.no_active": "Нет активного плана",
189
+ "plan.step_not_found": "Шаг не найден",
190
+ "plan.step_already_done": "Шаг {step} уже выполнен — ничего делать не нужно. Прогресс плана:",
191
+ "plan.order_blocked": "Нельзя отметить шаг {step} выполненным: шаг {first} («{desc}») ещё не завершён. Сначала завершите предыдущие шаги или отметьте шаг {first} status=skipped, если он не нужен.",
192
+ "plan.deliverables_missing": "Нельзя отметить шаг {step} выполненным: указанные в нём файлы ещё не существуют: {files}. Сначала создайте эти файлы (или отметьте шаг status=skipped, если они на самом деле не нужны).",
193
+ "plan.kinds_mismatch": "Длина kinds должна совпадать с числом шагов",
194
+ "plan.kinds_invalid": "Недопустимый kind шага: {kinds}. Используй \"create\" или \"delete\".",
195
+ "plan.kinds_not_array": "kinds должен быть массивом значений \"create\" или \"delete\"",
196
+ "plan.deliverables_remain": "Нельзя пометить шаг {step} как выполненный: указанные файлы всё ещё существуют: {files}. Шаг имеет kind=delete — сначала удали их (или поставь status=skipped, если они должны остаться).",
197
+ "plan.typecheck_failed": "Нельзя отметить шаг {step} выполненным: последняя проверка всё ещё сообщает об ошибке компиляции:\n{error}\nИсправь ошибку и снова отредактируй файл (чистая запись снимает блокировку), либо отметь шаг status=skipped, если он не нужен.",
198
+ "plan.show_header": "Статус плана:",
199
+ "plan.show_empty": "(в плане нет шагов)",
200
+ "plan.list_header": "Планы:",
201
+ "plan.list_empty": "Нет планов",
202
+ "plan.switch_no_id": "Укажите id плана для переключения",
203
+ "plan.not_found": "План не найден: {id}",
204
+ "plan.switched": "Переключено на план {id}: {title}",
205
+ "plan.replanned": "План перепланирован: {kept} выполненных шагов сохранено, {steps} новых шагов добавлено",
206
+ "plan.replan_no_steps": "Укажите новые шаги для перепланирования",
207
+ "plan.active_in_progress": "Нельзя создать новый план: активный план {id} уже имеет прогресс ({done}/{total} выполнено, текущий: шаг {current}). Продолжай его — вызови \"plan show\", чтобы увидеть, и продолжай работу. Чтобы заменить план, сначала вызови \"plan abort\", затем \"plan create\".",
208
+ "plan.id_ignored": "примечание: id плана генерируется автоматически; используй \"plan switch\", чтобы активировать существующий план по id.",
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) с конкретными шагами (точные имена файлов, команды, результаты), а потом продолжай.",
221
+ "todo.added": "Добавлено {count} задач: {items}",
222
+ "todo.marked_done": "Отмечено выполненными: {count}",
223
+ "todo.no_active": "Нет активных задач",
224
+ "todo.no_items": "Не указаны подзадачи — укажите items для отметки выполненными",
225
+ "todo.subtask_not_found": "Подзадачи не найдены: {items}",
226
+ "todo.unknown_action": "Неизвестное действие todo: {action}",
227
+ "todo.acknowledged": "Todo принято",
228
+ "verify.passed": "Проверка пройдена",
229
+ "verify.failed": "Проверка не пройдена: {details}",
230
+ "verify.file_exists": "Файл существует: {path}",
231
+ "verify.file_not_found": "Файл не найден: {path}",
232
+ "verify.script_passed": "Скрипт '{script}' пройден",
233
+ "verify.script_failed": "Скрипт '{script}' не пройден: {message}",
234
+ "verify.syntax_error": "Синтаксическая ошибка в: {path}",
235
+ "verify.file_still_exists": "Файл должен быть удалён, но всё ещё существует: {path}",
236
+ "verify.no_files": "Шаг {step} не содержит именованных файлов для проверки — выполни реальную проверку (bun run build / bun test / lsp_check) и подтверди результат.",
237
+ "lsp.unavailable": "статические проверки недоступны (сервер не найден). Проверяйте через собственный build/test проекта.",
238
+ "lsp.check_disabled": "LSP-проверки отключены в конфигурации.",
239
+ "lsp.check_no_path": "Укажите путь (файл или каталог) для проверки.",
240
+ "lsp.check_notfound": "Путь не найден: {path}",
241
+ "lsp.check_unsupported": "Для файла не настроен LSP-сервер: {path}",
242
+ "lsp.check_clean": "Ошибок и предупреждений не обнаружено (проверено файлов: {count}).",
243
+ "lsp.checked_files": "Проверено файлов: {count}:",
244
+ "lsp.startup_header": "[Существующие ошибки проекта (проверено при старте сессии) — исправьте их перед продолжением]:",
245
+ "cli.description": "Micro Models Agent — ИИ-агент для кодинга на малых моделях",
246
+ "cli.init": "Запустить мастер настройки",
247
+ "cli.config_saved": "Конфигурация сохранена в ~/.mma/config.json",
248
+ "cli.manage_config": "Управление конфигурацией",
249
+ "cli.config_key": "Ключ конфига (напр., model, provider.baseUrl)",
250
+ "cli.set_value": "Установить значение",
251
+ "cli.set_done": "Установлено {key}={value}",
252
+ "cli.show_config": "Показать текущий конфиг",
253
+ "cli.migrate_config": "Мигрировать legacy config.json в domain-формат",
254
+ "cli.manage_models": "Управление моделями",
255
+ "cli.list_models": "Список доступных моделей",
256
+ "cli.current_model": "Текущая модель:",
257
+ "cli.model_hint": "(Используйте /model use <имя> для смены)",
258
+ "cli.model_fetch_failed": "Не удалось получить модели: {error}",
259
+ "cli.available_models": "Доступные модели:",
260
+ "cli.no_models_found": "Модели не найдены у провайдера",
261
+ "cli.fetching_models": "Загрузка списка моделей...",
262
+ "cli.manage_context": "Управление контекстным окном",
263
+ "cli.invalid_context_size": "Некорректный размер контекста. Должно быть число >= 1024",
264
+ "cli.context_set": "Контекстное окно установлено: {size} токенов",
265
+ "cli.set_model": "Установить модель по умолчанию",
266
+ "cli.model_set": "Модель установлена: {name}",
267
+ "cli.certify": "Запустить сертификационный набор для модели",
268
+ "cli.cert_provider_url": "Базовый URL провайдера для сертификации (по умолчанию — текущий конфиг)",
269
+ "cli.cert_provider_key": "API-ключ провайдера (необязательно)",
270
+ "cli.cert_context_window": "Размер контекстного окна в токенах",
271
+ "cli.cert_tags": "Теги сценариев через запятую (core, security, image, network, browser)",
272
+ "cli.cert_reps": "Повторов по умолчанию на сценарий (переопределяется сценарием)",
273
+ "cli.cert_force": "Перепрогнать существующую сертификацию",
274
+ "cli.cert_clean": "Удалить песочницы после успешного прогона",
275
+ "cli.cert_security_required": "Безопасность отключена. Включите её (например `mma security set-policy balanced`), чтобы запустить security-сьют.",
276
+ "cli.cert_no_scenarios": "Нет сценариев под теги: {tags}",
277
+ "cli.cert_exists": "Сертификация {model} на этом провайдере уже существует.",
278
+ "cli.cert_exists_hint": "Используйте --force для перепрогона.",
279
+ "cli.cert_started": "Сертификация {model} на {provider}...",
280
+ "cli.cert_done": "Сертификация завершена: {passed} pass, {failed} fail, {skipped} skipped ({total} всего)",
281
+ "cli.cert_rep_pass": "pass",
282
+ "cli.cert_rep_fail": "fail",
283
+ "cli.cert_status": "Показать статус сертификации модели",
284
+ "cli.cert_list": "Список всех сертификаций",
285
+ "cli.cert_uncertify": "Удалить сертификацию",
286
+ "cli.cert_not_found": "Сертификация {model} не найдена",
287
+ "cli.cert_uncertified": "Сертификация {model} удалена",
288
+ "cli.cert_empty": "Сертификаций пока нет. Запустите `mma model certify <модель>`.",
289
+ "cli.cert_provider_col": "провайдер",
290
+ "cli.cert_suite_col": "сьют",
291
+ "cli.cert_date_col": "дата",
292
+ "cli.cert_version_col": "версия MMA",
293
+ "cli.cert_stale_hint": "Запустите `mma model certify --force` для обновления.",
294
+ "cli.cert_fixture_missing": "Фикстура отсутствует для {id}: {path}",
295
+ "cli.cert_marks_hint": "Маркеры: ✔ сертифицировано на этом провайдере, ○ сертифицировано на старой версии MMA, · не сертифицировано",
296
+ "cli.manage_providers": "Управление провайдерами",
297
+ "cli.provider_check": "Проверить доступность провайдеров (бесплатный вызов listModels)",
298
+ "repl.provider_down": "[ВНИМАНИЕ] Провайдер «{name}» недоступен: {error}",
299
+ "cli.list_providers": "Список провайдеров",
300
+ "cli.current_provider": "Текущий провайдер:",
301
+ "cli.base_url": "Базовый URL:",
302
+ "cli.set_provider": "Установить активный провайдер",
303
+ "cli.provider_set": "Провайдер установлен: {name}",
304
+ "cli.manage_sessions": "Управление сессиями",
305
+ "cli.list_sessions": "Список всех сессий",
306
+ "cli.show_details": "Показать детали сессии",
307
+ "cli.delete_session": "Удалить сессию",
308
+ "cli.first_run": "Первый запуск. Запускаем мастер настройки...",
309
+ "cli.unknown_cmd": "Неизвестная команда: {name}.",
310
+ "cli.help_hint": "Введите /help для списка команд.",
311
+ "cli.available_cmds": "\nДоступные команды:",
312
+ "cli.no_output": "Агент завершил работу, но не выдал результата. Возможно, задача не выполнена до конца.",
313
+ "cli.no_agents_md": "Отключить загрузку AGENTS.md в системный промпт",
314
+ "cli.dir": "Рабочая директория агента (по умолчанию — текущая)",
315
+ "cli.exit_on_complete": "Завершить сразу после выполнения задачи; интерактивные тулзы (question/approve) не блокируют stdin, а возвращают ошибку",
316
+ "cli.json": "Вывести результат в формате JSON (режим однократного запуска)",
317
+ "cli.security.description": "Управление настройками безопасности",
318
+ "cli.security.status": "Показать текущую конфигурацию безопасности",
319
+ "cli.security.policies": "Список доступных политик безопасности",
320
+ "cli.security.set_policy": "Применить пресет политики безопасности",
321
+ "cli.security.preset": "Пресет политики (strict, balanced, permissive)",
322
+ "cli.security.invalid_preset": "Некорректный пресет. Доступные: {presets}",
323
+ "cli.security.policy_applied": "Политика безопасности применена: {name}",
324
+ "cli.security.policy_description": "Описание: {description}",
325
+ "cli.security.enable_encryption": "Включить шифрование файлов сессий",
326
+ "cli.security.disable_encryption": "Отключить шифрование файлов сессий",
327
+ "cli.security.encryption_enabled": "Шифрование файлов сессий включено",
328
+ "cli.security.encryption_disabled": "Шифрование файлов сессий отключено",
329
+ "cli.security.enable_audit": "Включить уведомления аудита",
330
+ "cli.security.disable_audit": "Отключить уведомления аудита",
331
+ "cli.security.audit_enabled": "Уведомления аудита включены",
332
+ "cli.security.audit_disabled": "Уведомления аудита отключены",
333
+ "cli.security.audit_stats": "Показать статистику уведомлений аудита",
334
+ "cli.security.audit_stats_title": "Статистика уведомлений аудита",
335
+ "cli.security.total_notifications": "Всего уведомлений",
336
+ "cli.security.by_severity": "По уровню серьезности",
337
+ "cli.security.by_type": "По типу",
338
+ "cli.security.low": "Низкий",
339
+ "cli.security.medium": "Средний",
340
+ "cli.security.high": "Высокий",
341
+ "cli.security.critical": "Критический",
342
+ "cli.security.current_policy": "Текущая конфигурация безопасности",
343
+ "cli.security.bash_enabled": "Проверка команд bash",
344
+ "cli.security.path_validation": "Проверка доступа к путям",
345
+ "cli.security.network_validation": "Проверка сетевых запросов",
346
+ "cli.security.content_scanning": "Сканирование содержимого",
347
+ "cli.security.max_recursion": "Максимальная глубина рекурсии",
348
+ "cli.security.max_file_ops": "Максимум операций с файлами",
349
+ "cli.security.rate_limit": "Ограничение запросов",
350
+ "cli.security.session_encryption": "Шифрование сессий",
351
+ "cli.security.audit_notifier": "Уведомления аудита",
352
+ "cli.security.available_policies": "Доступные политики безопасности",
353
+ "cli.security.recommended_for": "Рекомендуется для",
354
+ "cli.yes": "Да",
355
+ "cli.no": "Нет",
356
+ "cli.plugins.description": "Управление плагинами",
357
+ "cli.plugins.list": "Список загруженных плагинов (имя, версия, источник)",
358
+ "cli.plugins.all": "Включить встроенные плагины",
359
+ "cli.plugins.only_external": "(встроенные плагины скрыты — используйте --all)",
360
+ "cli.plugins.none": "Плагины не загружены",
361
+ "cli.plugins.header": "Плагины: {count} загружено (MMA v{mma})",
362
+ "cli.plugins.builtin_mark": "●",
363
+ "repl.help": "Показать доступные команды",
364
+ "repl.help_usage": "Использование: /help",
365
+ "repl.exit": "Выйти из REPL",
366
+ "repl.exit_usage": "Использование: /exit",
367
+ "repl.clear": "Очистить экран",
368
+ "repl.clear_usage": "Использование: /clear",
369
+ "repl.run": "Выполнить запрос через агента",
370
+ "repl.run_usage": "Использование: /run <запрос>",
371
+ "repl.config": "Показать текущую конфигурацию",
372
+ "repl.config_usage": "Использование: /config",
373
+ "repl.reasoning": "Переключить показ рассуждений модели",
374
+ "repl.reasoning_usage": "Использование: /reasoning",
375
+ "repl.status": "Показать статус агента",
376
+ "repl.status_usage": "Использование: /status",
377
+ "repl.plugins": "Список загруженных плагинов",
378
+ "repl.plugins_usage": "Использование: /plugins [--all]",
379
+ "repl.sessions": "Список всех сессий (* активная)",
380
+ "repl.sessions_usage": "Использование: /sessions",
381
+ "repl.new": "Создать новую сессию",
382
+ "repl.new_usage": "Использование: /new [имя]",
383
+ "repl.resume": "Переключиться на сессию по id или имени",
384
+ "repl.resume_usage": "Использование: /resume <id|имя>",
385
+ "repl.rename": "Переименовать текущую сессию",
386
+ "repl.rename_usage": "Использование: /rename <новое-имя>",
387
+ "repl.delete": "Удалить сессию по id",
388
+ "repl.delete_usage": "Использование: /delete <id-сессии>",
389
+ "repl.skill": "Управление скиллами (list, loaded, load, unload, search)",
390
+ "repl.no_skills": "Нет доступных скиллов",
391
+ "repl.available_skills": "Доступные скиллы:",
392
+ "repl.no_loaded": "Нет загруженных скиллов",
393
+ "repl.loaded_skills": "Загруженные скиллы:",
394
+ "repl.budget": "Бюджет: {used} / {total} токенов (осталось {remaining})",
395
+ "repl.skill_load_usage": "Использование: /skill load <имя>",
396
+ "repl.skill_unload_usage": "Использование: /skill unload <имя>",
397
+ "repl.skill_unloaded": "Скилл \"{name}\" выгружен",
398
+ "repl.skill_not_loaded": "Скилл \"{name}\" не загружен",
399
+ "repl.skill_search_usage": "Использование: /skill search <запрос>",
400
+ "repl.no_skill_match": "Нет скиллов по \"{query}\"",
401
+ "repl.skills_matching": "Скиллы по \"{query}\":",
402
+ "repl.skill_unknown_sub": "Неизвестная подкоманда скилла: {subcmd}",
403
+ "repl.skill_usage": "Использование: /skill [list|loaded|load|unload|search]",
404
+ "repl.agent": "Агент: ",
405
+ "repl.you": "Вы: ",
406
+ "repl.interrupt": "Прервано (Esc)",
407
+ "repl.title": "MMA REPL v{version}",
408
+ "repl.model": "Модель:",
409
+ "repl.provider": "Провайдер:",
410
+ "repl.context": "Контекст:",
411
+ "repl.sysprompt_label": "Системный промпт:",
412
+ "repl.sysprompt_size": "{used} / {budget} токенов",
413
+ "repl.sysprompt_desc": "Показать системный промпт",
414
+ "repl.max_iters": "Макс итераций:",
415
+ "repl.stuck_thresh": "Порог зависания:",
416
+ "repl.reasoning_label": "Рассуждения:",
417
+ "repl.log_level": "Уровень лога:",
418
+ "repl.locale": "Язык:",
419
+ "repl.session_label": "Сессия:",
420
+ "repl.skills_label": "Скиллы:",
421
+ "repl.plugins_label": "Плагины:",
422
+ "repl.mcp_label": "MCP:",
423
+ "repl.lsp_label": "LSP:",
424
+ "repl.lsp_timeout": "таймаут",
425
+ "repl.lsp_failed": "не стартовал",
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}",
440
+ "repl.work_dir": "Директория:",
441
+ "repl.agents_label": "Инструкции:",
442
+ "repl.not_found": "не найден",
443
+ "repl.disabled": "отключено (--no-agents-md)",
444
+ "repl.show": "показ",
445
+ "repl.hide": "скрыть",
446
+ "repl.resume_hint": "Используйте /resume <id> или /resume <имя> для переключения между сессиями",
447
+ "repl.reasoning_status": "Рассуждения: {status}",
448
+ "repl.wizard": "Запустить мастер настройки",
449
+ "repl.wizard_usage": "Использование: /wizard",
450
+ "repl.wizard_running": "Запуск мастера настройки... (текущая конфигурация будет перезаписана)",
451
+ "repl.provider_list": "Список настроенных провайдеров или горячая смена активного",
452
+ "repl.provider_current": "Текущий провайдер",
453
+ "repl.provider_set": "Провайдер установлен: {name}",
454
+ "repl.provider_usage": "/provider list — записи (* = активный, prio = порядок fallback) | /provider use <имя> — смена без перезапуска",
455
+ "repl.model_list": "Список моделей активного провайдера или смена модели",
456
+ "repl.model_current": "Текущая модель",
457
+ "repl.model_set": "Модель установлена: {name}",
458
+ "repl.model_usage": "/model list — получить модели активного провайдера | /model use <имя> — сменить модель",
459
+ "repl.reload": "Перезагрузить агента с текущим конфигом",
460
+ "repl.reload_usage": "Использование: /reload",
461
+ "repl.reloading": "Перезагрузка агента...",
462
+ "repl.reloaded": "Агент перезагружен",
463
+ "repl.group.general": "Общее",
464
+ "repl.group.agent": "Агент",
465
+ "repl.group.session": "Сессии",
466
+ "repl.group.skill": "Скиллы",
467
+ "setup.title": "\n Мастер настройки MMA v2\n",
468
+ "setup.select_provider": "\n Выберите тип провайдера:",
469
+ "setup.select_provider_num": "\n Выберите провайдер (1-{max})",
470
+ "setup.scanning": " Сканирование локальных LLM-серверов...",
471
+ "setup.found_servers": " Найдено серверов: {count}",
472
+ "setup.no_servers": " Локальные серверы не найдены. Введите URL вручную.",
473
+ "setup.api_base": " API Base URL",
474
+ "setup.provider_type": " Тип провайдера",
475
+ "setup.api_key": " API ключ (нажмите Enter для пропуска)",
476
+ "setup.fetching_models": " Загрузка списка моделей...",
477
+ "setup.available_models": " Доступные модели:",
478
+ "setup.select_model": " Выберите модель (1-{max})",
479
+ "setup.model_name": " Имя модели",
480
+ "setup.testing": "\n Тестирование чата с моделью \"{model}\"...",
481
+ "setup.ok": " OK — соединение успешно",
482
+ "setup.warning": " ВНИМАНИЕ: не удалось подключиться — проверьте API endpoint и ключ",
483
+ "setup.agent_settings": "\n --- Настройки агента ---",
484
+ "setup.context_window": " Контекстное окно (токены)",
485
+ "setup.max_iters": " Макс итераций инструментов",
486
+ "setup.language": "\n --- Язык ---",
487
+ "setup.ui_lang": " Язык интерфейса (en/ru)",
488
+ "setup.complete": "\n Настройка завершена!\n",
489
+ "setup.select_server": "\n Выберите сервер (1-{max})",
490
+ "setup.custom_url": "Свой URL",
491
+ "setup.scanning_spinner": "Сканирование локальных LLM-серверов…",
492
+ "setup.fetching_spinner": "Загрузка списка моделей…",
493
+ "setup.testing_spinner": "Проверка чата с \"{model}\"…",
494
+ "setup.summary_setting": "Параметр",
495
+ "setup.summary_value": "Значение",
496
+ "setup.security_header": "\n --- Безопасность ---",
497
+ "setup.security_status_off": " Безопасность: ВЫКЛ (по умолчанию — все команды разрешены)",
498
+ "setup.security_status_on": " Безопасность: ВКЛ (по умолчанию — политика balanced)",
499
+ "setup.security_configure": " Настроить безопасность? (y/N)",
500
+ "setup.security_bash_block": " Блокировать опасные команды (rm, sudo, ssh и т.д.)? (y/N)",
501
+ "setup.security_flags_block": " Блокировать опасные флаги (--force, -rf и т.д.)? (y/N)",
502
+ "setup.security_paths_deny": " Разрешить доступ к .git/, .env, node_modules/? (y/N)",
503
+ "skill.already_loaded": "Скилл \"{name}\" уже загружен",
504
+ "skill.not_found": "Скилл \"{name}\" не найден ни в одном каталоге",
505
+ "skill.no_match": "Нет скиллов подходящих для: {task}",
506
+ "skill.too_large": "Скилл \"{name}\" слишком большой ({tokens} токенов). Бюджет: {budget} токенов. Продолжайте задачу без этого скилла.",
507
+ "skill.exceeds_budget": "Скилл \"{name}\" ({tokens} токенов) превышает остаток бюджета ({remaining} токенов). Сначала выгрузите другие скиллы.",
508
+ "skill.loaded": "Скилл \"{name}\" загружен ({tokens} токенов, осталось {remaining})",
509
+ "skill.auto_loaded": "[Автозагружен скилл: {name}]",
510
+ "skill.prompt_hint": "НЕ загружайте скиллы автоматически. Загружайте скилл ТОЛЬКО когда пользователь явно об этом просит (например 'используй скилл X' или 'загрузи скилл Y'). Скиллы ниже перечислены только для справки — не угадывайте какой скилл подходит по описанию задачи.",
511
+ "skill.prompt_fallback": "Если load_skill не удался из-за большого размера скилла, продолжайте задачу без него — не останавливайтесь.",
512
+ "skill.loaded_content": "[Скилл загружен: {name}]\n{content}\n\nИспользуйте эти знания для ответа на вопрос пользователя.",
513
+ "exec.stuck": "Нет прогресса на шаге {stepId} ({description}) — {iterations} итераций.",
514
+ "exec.stuck_recovery": "Шаг {stepId} — \"{description}\" — без прогресса уже {iterations} итераций. Попробуйте другой подход: проверьте что нужно для этого шага, установлены ли зависимости, или создайте файлы напрямую через write_file вместо команд терминала. После завершения шага вызовите plan update step={stepId} status=done.",
515
+ "exec.tool_errors": "Инструмент {tool} упал {count} раз. Попробуйте другой инструмент.",
516
+ "exec.tool_errors_recovery": "Инструмент {tool} упал {count} раз подряд. Попробуйте альтернативу: создайте файлы напрямую через write_file, используйте другую команду, или пропустите этот шаг через plan update step=N status=skipped с пометкой почему.",
517
+ "exec.repetitive_tool": "Инструмент {tool} вызван {count} раз с одинаковыми аргументами и результатом. Попробуйте другой подход — создайте файлы напрямую, измените аргументы или проверьте статус процесса через process_log.",
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 для поиска",
520
+ "exec.read_only_loop": "Нет записи/выполнения за {count} вызовов — агент только читает/исследует.",
521
+ "exec.read_only_loop_recovery": "{count} вызовов только для чтения подряд (read_file/glob/grep/browser) без записи. Хватит исследовать — внесите правку, которую требует задача: прочитайте файл, затем вызовите write_file или edit_file. Если не можете завершить задачу — спросите пользователя, а не перечитывайте одни и те же файлы.",
522
+ "exec.plan_warning": "Текущий шаг плана {step} — \"{description}\", но вызывается {tool} для файлов вне этого шага. Завершите текущий шаг, вызовите plan update step={step} status=done, затем переходите к следующему.",
523
+ "exec.plan_blocked": "{max} вызовов подряд вне текущего шага. Завершите шаг {step} — остальные шаги ждут пока этот не будет выполнен.",
524
+ "exec.off_track": "Шаг {stepId} — \"{description}\", но используется {tool} для другого пути. Вернитесь к текущему шагу.",
525
+ "exec.step_gate_deps": "[⚠ Шаг {step} \"{description}\": зависимости не установлены. Сначала выполните команду установки (npm install, pip install и т.д.). Проверьте что lock-файл или директория зависимостей существует. Если этот шаг на самом деле не нужен (внешних зависимостей нет) — пропусти его: plan update step={step} status=skipped note=\"зависимости не нужны\".]",
526
+ "exec.step_gate_deps_force": "[⚠ Шаг {step}: зависимости всё ещё не установлены (нет lock-файла) — второе предупреждение. Если этот шаг НЕ нужен — НЕМЕДЛЕННО вызови: plan update step={step} status=skipped note=\"зависимости не нужны\". Если нужен — выполни установку прямо сейчас. Не делай других вызовов инструментов до обновления плана.]",
527
+ "exec.step_gate_empty": "[⚠ Шаг {step}: файлы существуют, но выглядят пустыми: {files}. Добавьте реальный код в эти файлы перед тем как переходить к следующему шагу.]",
528
+ "exec.step_gate_ok": "[✓] Шаг {step} завершён и проверен. ПЕРЕХОДИМ к шагу {nextStep}: \"{nextDesc}\". Работайте ТОЛЬКО над этим шагом.",
529
+ "exec.step_gate_last": "[✓] Шаг {step} завершён — это был последний шаг. Проверьте всё вместе и предоставьте финальный ответ.]",
530
+ "exec.audit_pass": "[✓] Задача выполнена: {done}/{total} шагов, {files} файлов проверено",
531
+ "exec.audit_pending": "[✗] Задача не выполнена: {done}/{total} шагов — оставшиеся шаги не отмечены выполненными",
532
+ "exec.audit_fail": "[✗] Задача не выполнена: {done}/{total} шагов, {files} файлов отсутствует",
533
+ "exec.audit_leftovers": "[✗] Задача не выполнена: {done}/{total} шагов, {files} файлов из delete-шагов всё ещё существуют",
534
+ "exec.audit_fail_tests": "[✗] Задача не выполнена: {done}/{total} шагов, тесты ПАДАЮТ: {failed} failed / {passed} passed — {detail}",
535
+ "exec.audit_fail_typecheck": "[✗] Задача не выполнена: {done}/{total} шагов, {missing} файлов отсутствует, ошибка typecheck: {typeError}",
536
+ "exec.audit_incomplete": "[⚠ Финальная проверка не пройдена: {summary}. Задача НЕ завершена — продолжайте работу. Оставшиеся шаги: {steps}]",
537
+ "exec.mass_edit_warning": "⚠️ План затрагивает {count} файлов — проверьте полный список перед продолжением.",
538
+ "exec.escalation": "\n\n⚠️ Агент застрял на шаге {stepId} ({description}). Эскалация к пользователю — пожалуйста, подскажите как действовать.",
539
+ "exec.hints": "\n[Подсказки]\n{hints}",
540
+ "exec.file_rewrite_warning": "⚠️ Файл {file} был перезаписан {count} раз. Попробуйте другой подход — текущая стратегия исправлений не работает.",
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": "Текст ошибки незначимый — поиск в интернете пропущен.",
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}. Продолжай работу — не повторяй неудачные действия.",
548
+ "hall.max_retries_exhausted": "Модель вернула пустой или недостаточный ответ после нескольких попыток",
549
+ "hall.short_response": "Слишком короткий или пустой ответ",
550
+ "hall.repetitive": "Слишком повторяющийся ответ ({pct}% совпадение)",
551
+ "hall.uncertainty": "Маркеры неопределённости: {markers}",
552
+ "hall.unknown_paths": "Упомянутые файлы не найдены: {paths}",
553
+ "hall.contradiction_llm": "Противоречит ранее принятому решению{reason}",
554
+ "hall.uncertainty_prefix": "\n\n[⚠️ Неопределённость] ",
555
+ "browser.repeated_action": "Вы повторили то же действие ({action}) {threshold} раз. Попробуйте другой подход: используйте \"snapshot\" для перечитки страницы, другие номера элементов или другой URL.",
556
+ "browser.unknown_action": "Неизвестное действие: {action}",
557
+ "browser.error": "Ошибка браузера: {message}",
558
+ "browser.no_page": "Нет открытой страницы. Сначала выполните \"open\".",
559
+ "browser.url_required": "Требуется URL",
560
+ "browser.create_page_failed": "Не удалось создать страницу",
561
+ "browser.nav_failed": "Ошибка навигации: {message}",
562
+ "browser.invalid_target": "Неверный таргет. Укажите номер элемента из snapshot.",
563
+ "browser.click_failed": "Ошибка клика: {message}. Проверьте номер элемента.",
564
+ "browser.invalid_target_short": "Неверный таргет.",
565
+ "browser.text_required": "Требуется текст.",
566
+ "browser.type_failed": "Ошибка ввода: {message}",
567
+ "browser.direction_invalid": "Направление должно быть: up, down, top, bottom",
568
+ "browser.scroll_failed": "Ошибка прокрутки: {message}",
569
+ "browser.closed": "Браузер закрыт.",
570
+ "browser.no_page_short": "Нет страницы",
571
+ "browser.no_elements": "(нет интерактивных элементов на странице)",
572
+ "browser.more_elements": "... и другие элементы не показаны. Используйте прокрутку или поиск.",
573
+ "browser.content_header": "Содержимое:",
574
+ "browser.console_header": "Консоль:",
575
+ "browser.network_errors_header": "Сетевые ошибки:",
576
+ "browser.truncated": "... (обрезано)",
577
+ "pipeline.invalid": "Невалидный пайплайн: требуются name и steps",
578
+ "pipeline.step_missing_fields": "Шаг не содержит обязательных полей (id, agent, prompt): {step}",
579
+ "pipeline.circular": "Циклическая зависимость: {stepId}",
580
+ "plugin.loaded": "Загружен плагин: {name}",
581
+ "plugin.skipped": "Пропущен несовместимый плагин: {entry} ({message})",
582
+ "plugin.incompatible": "Пропущен плагин {name}: требуется MMA v{min}, текущая v{current}",
583
+ "plugin.dedup_older": "Плагин {name} v{version} пропущен: уже загружена более новая версия",
584
+ "migration.detected": "[MMA] Обнаружен старый конфиг. {summary}",
585
+ "migration.summary": "[MMA] {summary}",
586
+ "migration.config_bak": "- config → config.json.bak",
587
+ "migration.dir_bak": "- .mma/ → .mma.bak/ ({count} файлов)",
588
+ "migration.migrated": "Мигрировано:",
589
+ "migration.not_needed": "Миграция не требуется",
590
+ "ui.error_prefix": "Ошибка: ",
591
+ "ui.success_prefix": "✓ ",
592
+ "ui.warning_prefix": "⚠ ",
593
+ "ui.thinking": "Думаю…",
594
+ "ui.tool_running": "{tool}…",
595
+ "ui.step_context": "шаг {id}: {desc}",
596
+ "indexer.map_header": "Карта проекта",
597
+ "indexer.top_directories": "Основные директории",
598
+ "indexer.files": "Файлы",
599
+ "indexer.empty": "Нет проиндексированных файлов",
600
+ "indexer.and_more": "... и ещё {count} файлов",
601
+ "indexer.project_map_desc": "Получить карту проекта: сводка по файлам, языкам и экспортам. Используйте действие 'find' для поиска файлов по пути или экспорту, 'refresh' для перестроения индекса.",
602
+ "indexer.project_map_action_desc": "Действие: summary, refresh или find",
603
+ "indexer.project_map_query_desc": "Строка поиска для действия find (совпадение по пути или экспортированным именам)",
604
+ "indexer.summary": "Карта проекта: {summary}",
605
+ "indexer.refreshed": "Карта проекта обновлена: {summary}",
606
+ "indexer.not_indexed": "Проект ещё не проиндексирован",
607
+ "indexer.find_results": "Найдено {count} совпадающих файлов:\n{results}",
608
+ "indexer.no_matches": "Нет совпадающих файлов для \"{query}\"",
609
+ "indexer.duplicates": "Дубликаты basename (проверьте, какой файл реально используется): {names}",
610
+ "indexer.stack_deps": "зависимости",
611
+ "indexer.stack_dev": "dev",
612
+ "indexer.stack_scripts": "скрипты",
613
+ "tool.friendly.project_map": "Карта проекта",
614
+ "config.decryption_warning": "Предупреждение: не удалось расшифровать конфигурацию: {error}",
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-формату.",
621
+ "image.source_required": "Укажите источник изображения: путь к файлу, URL или \"clipboard\".",
622
+ "image.clipboard_empty": "Буфер обмена не содержит изображение. Скопируйте изображение (например, скриншот через Win+Shift+S).",
623
+ "image.not_found": "Файл изображения не найден: {path}",
624
+ "image.no_context": "Менеджер контекста недоступен. Изображение можно прикрепить только во время активной сессии.",
625
+ "image.attached": "Изображение прикреплено из {source} ({size}). Оно будет включено в следующее сообщение.",
626
+ "image.error": "Не удалось загрузить изображение: {message}",
627
+ "tool.friendly.attach_image": "Прикрепить изображение",
628
+ "repl.image": "Прикрепить изображение",
629
+ "repl.image_usage": "/image <путь|URL|clipboard> — прикрепить изображение к следующему сообщению",
630
+ "tool.friendly.remember": "Запомнить",
631
+ "tool.friendly.recall": "Вспомнить",
632
+ "tool.remember.preference": "Запомнено: {key} = {value}",
633
+ "tool.remember.entry": "Запомнено: {category} — \"{entry}\"",
634
+ "tool.remember.key_required": "Для preferences требуется ключ (key)",
635
+ "tool.remember.entry_required": "Требуется текст записи",
636
+ "tool.recall.empty": "Ничего не найдено по \"{query}\"",
637
+ "tool.recall.no_memory": "Память пуста",
638
+ "tool.recall.search_results": "Результаты {category}:\n{results}",
639
+ "ctx.compactions": "сжатий: {count}",
640
+ "ctx.quality": "качество: {percent}%",
641
+ "ctx.delta_pos": "контекст +{tokens}",
642
+ "ctx.delta_neg": "контекст -{tokens} ↓",
643
+ "ctx.delta_zero": "контекст ±0",
644
+ "file.notfound_resolved": "Файл не найден: {path} (резолвится в {resolved})\nПуть был склеен с рабочей директорией, потому что в исходном виде он не существует. Выполни list_dir, чтобы найти корректный путь.",
645
+ "bash.echo_write_blocked": "Запись файлов через echo/printf ненадёжна в Windows cmd.exe (кавычки и многострочность ломаются). Используй инструмент write_file вместо этого (цель: {path}).",
646
+ "updater.check_error": "[updater] Ошибка проверки обновления: {error}",
647
+ "updater.available": "[updater] Доступно обновление: {current} → {latest}. Выполните `npm install -g micro-models-agent` для обновления.",
648
+ "updater.installing": "[updater] Установка {latest} глобально (текущая: {current})…",
649
+ "updater.installed": "[updater] Установлена {latest}. Перезапустите MMA для применения (была {current}).",
650
+ "updater.install_failed": "[updater] Не удалось установить {latest}: {error}. Обновите вручную: `npm install -g micro-models-agent`.",
651
+ "tools.enable_no_tags": "enable_tools требует хотя бы один тег в массиве \"tags\".",
652
+ "tools.enable_no_executor": "Исполнитель тулов недоступен — невозможно перечислить включённые тулы.",
653
+ "tools.enable_already_active": "Теги тулов уже активны: {tags}.",
654
+ "tools.enable_added": "Включены теги тулов: {tags}. Теперь доступны тулы: {tools}",
655
+ "tools.hidden_header": "Дополнительные тулы (включите по требованию через enable_tools или маршрутизируйте через subagent tool_tags):",
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."
679
+ }