micro-models-agent 2.10.0 → 2.12.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 (359) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/dist/assets/app.js +22 -4
  3. package/dist/assets/index.html +29 -0
  4. package/dist/assets/js/dom.js +2 -1
  5. package/dist/assets/js/feed.js +38 -26
  6. package/dist/assets/js/format.js +1 -1
  7. package/dist/assets/js/rail.js +114 -0
  8. package/dist/assets/js/settings-controls.js +2 -2
  9. package/dist/assets/js/settings.js +246 -51
  10. package/dist/assets/js/store.js +3 -0
  11. package/dist/assets/js/tabs.js +104 -2
  12. package/dist/assets/styles.css +215 -66
  13. package/dist/cli/cache-line.js +1 -0
  14. package/dist/cli/command-suggest.js +5 -4
  15. package/dist/cli/commands.js +231 -122
  16. package/dist/cli/completer.js +132 -31
  17. package/dist/cli/index.js +1 -0
  18. package/dist/cli/json-payload.js +4 -4
  19. package/dist/cli/main.js +166 -61
  20. package/dist/cli/onboarding-commands.js +126 -0
  21. package/dist/cli/plugin-commands.js +2 -1
  22. package/dist/cli/relaunch.js +16 -13
  23. package/dist/cli/repl-commands-lsp.js +75 -0
  24. package/dist/cli/repl-commands-skills.js +105 -0
  25. package/dist/cli/repl-commands.js +589 -266
  26. package/dist/cli/repl.js +436 -177
  27. package/dist/cli/run-result.js +5 -6
  28. package/dist/cli/security-commands.js +37 -28
  29. package/dist/cli/setup-order.js +4 -55
  30. package/dist/cli/setup-prompt.js +3 -2
  31. package/dist/cli/setup.js +27 -107
  32. package/dist/cli/web-command.js +98 -0
  33. package/dist/config/budget.js +5 -5
  34. package/dist/config/config.js +103 -96
  35. package/dist/config/defaults.js +38 -8
  36. package/dist/config/domains.js +24 -27
  37. package/dist/config/env.js +46 -0
  38. package/dist/config/experts.js +2 -0
  39. package/dist/config/index.js +1 -0
  40. package/dist/config/paths.js +56 -0
  41. package/dist/config/redact.js +44 -0
  42. package/dist/config/registry-extra.js +334 -0
  43. package/dist/config/registry.js +584 -0
  44. package/dist/config/security.js +35 -36
  45. package/dist/config/timeouts.js +74 -0
  46. package/dist/config/utils.js +16 -15
  47. package/dist/core/agent/artifact-progress.js +59 -0
  48. package/dist/core/agent/artifact-resolve.js +79 -0
  49. package/dist/core/agent/audit-gate.js +7 -3
  50. package/dist/core/agent/compaction.js +2 -2
  51. package/dist/core/agent/constants.js +33 -4
  52. package/dist/core/agent/context-log.js +454 -0
  53. package/dist/core/agent/context-renderer.js +5 -0
  54. package/dist/core/agent/critic-gate.js +132 -0
  55. package/dist/core/agent/hallucination-gate.js +148 -38
  56. package/dist/core/agent/loop-state.js +15 -0
  57. package/dist/core/agent/prefix-monitor.js +1 -1
  58. package/dist/core/agent/reasoning-resolver.js +10 -1
  59. package/dist/core/agent/token-tracker.js +7 -4
  60. package/dist/core/agent/tool-batch.js +93 -18
  61. package/dist/core/agent/tool-images.js +18 -0
  62. package/dist/core/agent/tool-output.js +65 -11
  63. package/dist/core/agent/tool-pairing.js +60 -0
  64. package/dist/core/agent-moe.js +25 -24
  65. package/dist/core/agent.js +429 -108
  66. package/dist/core/bootstrap/agent-phase.js +66 -0
  67. package/dist/core/bootstrap/config-phase.js +86 -0
  68. package/dist/core/bootstrap/modules-phase.js +269 -0
  69. package/dist/core/bootstrap/provider-phase.js +183 -0
  70. package/dist/core/bootstrap/session-phase.js +204 -0
  71. package/dist/core/bootstrap/state.js +94 -0
  72. package/dist/core/bootstrap/workspace-phase.js +115 -0
  73. package/dist/core/bootstrap.js +92 -660
  74. package/dist/core/crash-handler.js +17 -7
  75. package/dist/core/environment.js +37 -12
  76. package/dist/core/host-plan.js +43 -0
  77. package/dist/core/host.js +23 -0
  78. package/dist/core/index.js +1 -0
  79. package/dist/core/prompt-builder.js +17 -1
  80. package/dist/core/prompt-overflow.js +42 -43
  81. package/dist/core/session-logger.js +122 -30
  82. package/dist/core/system-prompt.js +117 -0
  83. package/dist/core/version.js +6 -4
  84. package/dist/core/web-host.js +34 -0
  85. package/dist/core/workspace.js +19 -15
  86. package/dist/i18n/en.json +106 -21
  87. package/dist/i18n/index.js +37 -3
  88. package/dist/i18n/ru.json +109 -21
  89. package/dist/index.js +7 -3
  90. package/dist/llm/image-utils.js +55 -64
  91. package/dist/llm/llm-errors.js +9 -0
  92. package/dist/llm/model-loader.js +10 -32
  93. package/dist/llm/models-dev.js +121 -0
  94. package/dist/llm/openai-compat.js +146 -73
  95. package/dist/llm/orchestrator.js +33 -11
  96. package/dist/llm/provider-budget.js +2 -2
  97. package/dist/llm/provider-context.js +233 -0
  98. package/dist/llm/provider.js +1 -1
  99. package/dist/llm/response.js +5 -0
  100. package/dist/llm/token-counter.js +27 -11
  101. package/dist/logger/app-logger.js +48 -22
  102. package/dist/logger/file-log.js +28 -19
  103. package/dist/logger/index.js +1 -0
  104. package/dist/main.js +24285 -22447
  105. package/dist/migration/backup.js +14 -3
  106. package/dist/migration/detect.js +12 -3
  107. package/dist/migration/index.js +1 -0
  108. package/dist/modules/artifacts/store.js +9 -8
  109. package/dist/modules/browser/actions.js +6 -0
  110. package/dist/modules/browser/bridge-client.js +14 -12
  111. package/dist/modules/browser/bridge-path.js +4 -4
  112. package/dist/modules/browser/console-buffer.js +37 -0
  113. package/dist/modules/browser/cookie-store.js +5 -0
  114. package/dist/modules/browser/driver-types.js +1 -0
  115. package/dist/modules/browser/driver.js +19 -11
  116. package/dist/modules/browser/index.js +3 -1
  117. package/dist/modules/browser/module.js +2 -1
  118. package/dist/modules/browser/session.js +10 -30
  119. package/dist/modules/browser/snapshot.js +19 -13
  120. package/dist/modules/browser/types.js +1 -0
  121. package/dist/modules/certification/cli.js +28 -20
  122. package/dist/modules/certification/fact-checker.js +9 -1
  123. package/dist/modules/certification/loader.js +9 -2
  124. package/dist/modules/certification/manifest.js +83 -21
  125. package/dist/modules/certification/runner.js +23 -13
  126. package/dist/modules/certification/scenarios.js +20 -20
  127. package/dist/modules/certification/syntax-scenarios.js +1 -2
  128. package/dist/modules/context/chunk-query.js +11 -9
  129. package/dist/modules/context/fact-extractor.js +37 -39
  130. package/dist/modules/context/index.js +1 -0
  131. package/dist/modules/context/manager.js +106 -80
  132. package/dist/modules/critic/client.js +176 -0
  133. package/dist/modules/critic/evidence.js +81 -0
  134. package/dist/modules/critic/provider.js +45 -0
  135. package/dist/modules/critic/tools.js +78 -0
  136. package/dist/modules/critic/types.js +1 -0
  137. package/dist/modules/execution/audit-runners.js +28 -34
  138. package/dist/modules/execution/auditor.js +53 -49
  139. package/dist/modules/execution/execution-plugin.js +142 -102
  140. package/dist/modules/execution/index.js +1 -1
  141. package/dist/modules/execution/input-from.js +37 -13
  142. package/dist/modules/execution/module.js +368 -191
  143. package/dist/modules/execution/moe-executor.js +53 -26
  144. package/dist/modules/execution/plan-actions.js +320 -202
  145. package/dist/modules/execution/plan-checks.js +35 -0
  146. package/dist/modules/execution/plan-coverage.js +36 -33
  147. package/dist/modules/execution/plan-steps.js +11 -3
  148. package/dist/modules/execution/plan-store.js +83 -17
  149. package/dist/modules/execution/plan-tool.js +89 -35
  150. package/dist/modules/execution/plan-validator.js +30 -10
  151. package/dist/modules/execution/planner.js +22 -13
  152. package/dist/modules/execution/stuck-detector.js +196 -93
  153. package/dist/modules/execution/tracker.js +22 -8
  154. package/dist/modules/execution/verifier.js +69 -48
  155. package/dist/modules/execution/windows-commands.js +12 -12
  156. package/dist/modules/hallucination/artifact-claim.js +93 -0
  157. package/dist/modules/hallucination/confidence.js +13 -11
  158. package/dist/modules/hallucination/consistency.js +10 -2
  159. package/dist/modules/hallucination/detector.js +10 -5
  160. package/dist/modules/hallucination/factual.js +43 -26
  161. package/dist/modules/hallucination/index.js +1 -0
  162. package/dist/modules/hallucination/js-identifiers.js +44 -45
  163. package/dist/modules/hallucination/llm-judge.js +17 -12
  164. package/dist/modules/hallucination/success-claim.js +59 -0
  165. package/dist/modules/indexer/cache.js +52 -4
  166. package/dist/modules/indexer/index.js +1 -0
  167. package/dist/modules/indexer/map-command.js +2 -4
  168. package/dist/modules/indexer/map-select.js +16 -16
  169. package/dist/modules/indexer/module.js +47 -12
  170. package/dist/modules/indexer/project-profile.js +8 -7
  171. package/dist/modules/indexer/symbols.js +15 -15
  172. package/dist/modules/indexer/walker.js +159 -29
  173. package/dist/modules/lsp/check-tool.js +7 -5
  174. package/dist/modules/lsp/client.js +39 -39
  175. package/dist/modules/lsp/command.js +17 -24
  176. package/dist/modules/lsp/config.js +12 -11
  177. package/dist/modules/lsp/index.js +1 -0
  178. package/dist/modules/lsp/module.js +48 -46
  179. package/dist/modules/lsp/probe.js +13 -14
  180. package/dist/modules/lsp/project-root.js +14 -17
  181. package/dist/modules/lsp/startup-check.js +18 -16
  182. package/dist/modules/mcp/client.js +59 -62
  183. package/dist/modules/mcp/index.js +1 -0
  184. package/dist/modules/mcp/module.js +66 -37
  185. package/dist/modules/mcp/registry.js +5 -0
  186. package/dist/modules/memory/index.js +1 -0
  187. package/dist/modules/memory/module.js +12 -8
  188. package/dist/modules/memory/search.js +4 -1
  189. package/dist/modules/memory/store.js +40 -2
  190. package/dist/modules/onboarding/init.js +47 -0
  191. package/dist/modules/onboarding/meet.js +30 -0
  192. package/dist/modules/onboarding/mode.js +30 -0
  193. package/dist/modules/onboarding/prompts.js +43 -0
  194. package/dist/modules/pipelines/engine.js +10 -0
  195. package/dist/modules/pipelines/index.js +1 -0
  196. package/dist/modules/pipelines/parser.js +4 -1
  197. package/dist/modules/pipelines/template.js +4 -0
  198. package/dist/modules/plugins/builtin/lint-on-write.js +80 -67
  199. package/dist/modules/plugins/builtin/notify.js +2 -0
  200. package/dist/modules/plugins/index.js +1 -0
  201. package/dist/modules/plugins/loader.js +18 -3
  202. package/dist/modules/plugins/manager.js +37 -17
  203. package/dist/modules/pricing/index.js +10 -11
  204. package/dist/modules/pricing/prices.js +12 -12
  205. package/dist/modules/processes/index.js +1 -0
  206. package/dist/modules/processes/kill-tree.js +27 -31
  207. package/dist/modules/processes/registry.js +44 -25
  208. package/dist/modules/processes/runner.js +4 -4
  209. package/dist/modules/providers/capabilities.js +28 -0
  210. package/dist/modules/providers/create.js +3 -4
  211. package/dist/modules/providers/factory.js +7 -7
  212. package/dist/modules/providers/fallback.js +12 -12
  213. package/dist/modules/providers/health.js +4 -4
  214. package/dist/modules/providers/manager.js +50 -19
  215. package/dist/modules/providers/naming.js +15 -0
  216. package/dist/modules/providers/preflight.js +71 -0
  217. package/dist/modules/providers/presets.js +39 -8
  218. package/dist/modules/providers/registry.js +7 -2
  219. package/dist/modules/reasoning/policy.js +8 -6
  220. package/dist/modules/reasoning/probe.js +30 -25
  221. package/dist/modules/security/audit-log.js +19 -36
  222. package/dist/modules/security/audit-notifier.js +35 -75
  223. package/dist/modules/security/command-validator.js +99 -51
  224. package/dist/modules/security/content-scanner.js +8 -8
  225. package/dist/modules/security/data-sanitizer.js +9 -16
  226. package/dist/modules/security/encryption.js +32 -52
  227. package/dist/modules/security/index.js +2 -1
  228. package/dist/modules/security/network-validator.js +120 -43
  229. package/dist/modules/security/path-validator.js +61 -46
  230. package/dist/modules/security/protected-paths.js +73 -0
  231. package/dist/modules/security/rate-limiter.js +17 -49
  232. package/dist/modules/security/security-policies.js +25 -57
  233. package/dist/modules/security/session-encryption.js +32 -71
  234. package/dist/modules/security/session-isolation.js +15 -28
  235. package/dist/modules/session/auto-name.js +63 -0
  236. package/dist/modules/session/export.js +98 -0
  237. package/dist/modules/session/index.js +1 -0
  238. package/dist/modules/session/manager.js +79 -28
  239. package/dist/modules/session/module.js +4 -3
  240. package/dist/modules/session/store.js +57 -20
  241. package/dist/modules/setup/answers.js +35 -0
  242. package/dist/modules/setup/apply.js +79 -0
  243. package/dist/modules/setup/discovery.js +72 -0
  244. package/dist/modules/skills/index.js +1 -0
  245. package/dist/modules/skills/loader.js +9 -1
  246. package/dist/modules/skills/module.js +11 -0
  247. package/dist/modules/updater/changelog-reader.js +15 -16
  248. package/dist/modules/updater/checker.js +9 -4
  249. package/dist/modules/updater/dev-detect.js +7 -6
  250. package/dist/modules/updater/index.js +1 -0
  251. package/dist/modules/updater/module.js +17 -15
  252. package/dist/modules/user-profile/compressor.js +2 -0
  253. package/dist/modules/user-profile/index.js +1 -0
  254. package/dist/modules/user-profile/profile.js +10 -1
  255. package/dist/modules/webui/answer-api.js +29 -0
  256. package/dist/modules/webui/assets.js +50 -0
  257. package/dist/modules/webui/body.js +21 -0
  258. package/dist/modules/webui/commands-settings.js +209 -0
  259. package/dist/modules/webui/commands-shared.js +60 -0
  260. package/dist/modules/webui/commands.js +174 -0
  261. package/dist/modules/webui/config-api.js +134 -0
  262. package/dist/modules/webui/file-api.js +202 -0
  263. package/dist/modules/webui/forward.js +159 -0
  264. package/dist/modules/webui/history-api.js +112 -0
  265. package/dist/modules/webui/host-state.js +60 -0
  266. package/dist/modules/webui/i18n-api.js +9 -0
  267. package/dist/modules/webui/limits.js +6 -0
  268. package/dist/modules/webui/log-forward.js +20 -0
  269. package/dist/modules/webui/memory-commands.js +64 -0
  270. package/dist/modules/webui/model-cache.js +18 -0
  271. package/dist/modules/webui/module.js +148 -0
  272. package/dist/modules/webui/persist.js +24 -0
  273. package/dist/modules/webui/prompt-io.js +97 -0
  274. package/dist/modules/webui/providers-api.js +337 -0
  275. package/dist/modules/webui/providers-view.js +56 -0
  276. package/dist/modules/webui/reasoning-view.js +15 -0
  277. package/dist/modules/webui/run-agent.js +81 -0
  278. package/dist/modules/webui/server.js +284 -0
  279. package/dist/modules/webui/sessions-api.js +178 -0
  280. package/dist/modules/webui/settings-api.js +561 -0
  281. package/dist/modules/webui/setup-api.js +201 -0
  282. package/dist/modules/webui/state.js +74 -0
  283. package/dist/modules/webui/util.js +261 -0
  284. package/dist/output/bus.js +7 -2
  285. package/dist/output/channel.js +80 -28
  286. package/dist/output/format.js +2 -1
  287. package/dist/output/index.js +1 -0
  288. package/dist/output/json-sink.js +5 -3
  289. package/dist/output/machine.js +4 -3
  290. package/dist/output/session-sink.js +4 -4
  291. package/dist/tools/approve.js +4 -0
  292. package/dist/tools/attach-image.js +5 -4
  293. package/dist/tools/auto-fixer.js +26 -44
  294. package/dist/tools/auto-tags.js +83 -0
  295. package/dist/tools/bash.js +193 -116
  296. package/dist/tools/browser.js +76 -31
  297. package/dist/tools/chunk-query.js +14 -6
  298. package/dist/tools/create-dir.js +9 -5
  299. package/dist/tools/delete-file.js +9 -5
  300. package/dist/tools/download-file.js +32 -7
  301. package/dist/tools/edit-file.js +52 -14
  302. package/dist/tools/enable-tools.js +6 -6
  303. package/dist/tools/executor.js +132 -27
  304. package/dist/tools/file-info.js +3 -1
  305. package/dist/tools/filter-tools.js +3 -3
  306. package/dist/tools/glob-tool.js +4 -1
  307. package/dist/tools/grep-tool.js +13 -10
  308. package/dist/tools/hidden-tools-block.js +6 -6
  309. package/dist/tools/index.js +16 -8
  310. package/dist/tools/list-dir.js +4 -2
  311. package/dist/tools/load-skill.js +7 -0
  312. package/dist/tools/mcp-call.js +15 -4
  313. package/dist/tools/meet-done.js +14 -0
  314. package/dist/tools/move-file.js +14 -7
  315. package/dist/tools/path-utils.js +29 -29
  316. package/dist/tools/pipeline-run.js +29 -7
  317. package/dist/tools/preview.js +1 -1
  318. package/dist/tools/process-ids.js +31 -0
  319. package/dist/tools/process-kill.js +9 -16
  320. package/dist/tools/process-list.js +1 -0
  321. package/dist/tools/process-log.js +11 -16
  322. package/dist/tools/process-wait.js +63 -0
  323. package/dist/tools/prompt-io.js +4 -3
  324. package/dist/tools/question.js +172 -25
  325. package/dist/tools/read-file.js +55 -34
  326. package/dist/tools/recall.js +14 -8
  327. package/dist/tools/registry.js +6 -5
  328. package/dist/tools/remember.js +8 -4
  329. package/dist/tools/scope-request.js +11 -6
  330. package/dist/tools/search-history.js +5 -2
  331. package/dist/tools/session-info.js +2 -0
  332. package/dist/tools/set-thinking.js +8 -4
  333. package/dist/tools/subagent.js +59 -39
  334. package/dist/tools/syntax-validator.js +292 -90
  335. package/dist/tools/user-input.js +22 -18
  336. package/dist/tools/web-browse.js +9 -3
  337. package/dist/tools/web-fetch.js +12 -23
  338. package/dist/tools/web-search.js +7 -5
  339. package/dist/tools/write-file.js +45 -15
  340. package/dist/ui/action-log.js +13 -0
  341. package/dist/ui/box.js +4 -3
  342. package/dist/ui/colors.js +2 -0
  343. package/dist/ui/diff.js +6 -5
  344. package/dist/ui/index.js +1 -0
  345. package/dist/ui/line-editor.js +230 -122
  346. package/dist/ui/line-math.js +10 -2
  347. package/dist/ui/md-formatter.js +57 -37
  348. package/dist/ui/output.js +8 -3
  349. package/dist/ui/plan-view.js +21 -10
  350. package/dist/ui/renderer.js +393 -67
  351. package/dist/ui/spinner.js +16 -5
  352. package/dist/ui/table.js +15 -17
  353. package/dist/ui/theme.js +143 -0
  354. package/dist/utils/child-run.js +20 -0
  355. package/dist/utils/error.js +1 -1
  356. package/dist/utils/index.js +2 -0
  357. package/dist/utils/retry.js +2 -2
  358. package/dist/utils/truncate.js +1 -1
  359. package/package.json +1 -1
package/dist/i18n/ru.json CHANGED
@@ -34,6 +34,7 @@
34
34
  "error.max_iters": "Достигнут максимум итераций ({max})",
35
35
  "error.empty_response": "Модель вернула пустой ответ после повторных попыток",
36
36
  "error.audit_failed": "Задача не может быть подтверждена как выполненная: {summary}",
37
+ "error.retry_loop_stopped": "Остановлено после {count} провальных пакетов тулов подряд — агент крутил повторы падающего действия вместо завершения",
37
38
  "error.grep_failed": "Ошибка grep: {message}",
38
39
  "error.search_failed": "Ошибка поиска: {message}",
39
40
  "error.fetch_failed": "Ошибка загрузки: {message}",
@@ -164,6 +165,10 @@
164
165
  "tool.question.no_questions": "Вопросы не указаны",
165
166
  "tool.question.unanswered": "Без ответа",
166
167
  "tool.question.answered": "Пользователь ответил на ваши вопросы: {formatted}. Теперь продолжайте с учётом ответов.",
168
+ "tool.question.memory_only": "Вопросы не задавались — на всё уже ответила память. Продолжайте с учётом этого.",
169
+ "tool.question.memory_known": "Память уже отвечает: {formatted}. Эти вопросы НЕ задавались.",
170
+ "tool.question.session_only": "Ответы живут только в этой сессии — ничего не пишите через remember без явной просьбы пользователя.",
171
+ "tool.question.batch_truncated": "Заданы первые {shown} из {total} неизвестных вопросов — вызовите тул ещё раз для остальных.",
167
172
  "tool.name_or_task": "Укажите параметр \"name\" или \"task\"",
168
173
  "tool.chunk_query_no_query": "chunk_query: требуется строка запроса.",
169
174
  "tool.chunk_query_no_input": "chunk_query: укажите input_path или text.",
@@ -222,7 +227,13 @@
222
227
  "tool.friendly.process_wait": "Ожидание процесса",
223
228
  "plan.no_steps": "Не указаны шаги плана. Укажите конкретные шаги с файлами и командами.",
224
229
  "plan.created": "План создан: {title} ({steps} шагов)",
225
- "plan.coverage_warning": "План может не покрывать требуемые файлы из постановки: {missing}. Добавьте шаги, покрывающие их.",
230
+ "plan.coverage_blocked": "План не покрывает файлы из постановки: {missing}. Добавь шаги с точными путями этих файлов и проверками, затем вызови plan create снова.",
231
+ "plan.checks_required": "Каждому шагу нужен контракт проверки: передай checks 1:1 к steps — по одному на шаг: \"file-exists:<путь>\" (проверяется автоматически), \"command:<команда>\" (запусти перед done) или \"manual:<что проверить глазами>\" (только UI/визуал).",
232
+ "plan.checks_not_array": "checks должен быть массивом строк проверок 1:1 к шагам",
233
+ "plan.checks_mismatch": "Длина checks должна совпадать с числом шагов",
234
+ "plan.checks_invalid": "Недопустимые проверки: {kinds}. Каждая должна начинаться с \"file-exists:\", \"command:\" или \"manual:\".",
235
+ "plan.check_failed": "Нельзя отметить шаг {step} выполненным: его проверка не прошла — {check}. Сначала выполни проверку (создай файл / запусти команду), затем отмечай done.",
236
+ "plan.check_self_certified": "проверка подтверждена: {check} — выполнено перед done.",
226
237
  "plan.step_done": "Шаг {n}/{total}: {description} ✓",
227
238
  "plan.complete": "Задача выполнена: {summary}",
228
239
  "plan.title_steps": "План \"{title}\" создан с {count} шагами",
@@ -235,6 +246,7 @@
235
246
  "plan.step_status": "Шаг {step}: {status}",
236
247
  "plan.no_active": "Нет активного плана",
237
248
  "plan.step_not_found": "Шаг не найден",
249
+ "plan.step_required": "Укажи номер шага: plan_step step=N status=done|failed|skipped.",
238
250
  "plan.bad_status": "Недопустимый статус «{status}». Используйте один из: {allowed}.",
239
251
  "plan.step_already_done": "Шаг {step} уже выполнен — ничего делать не нужно. Прогресс плана:",
240
252
  "plan.order_blocked": "Нельзя отметить шаг {step} выполненным: шаг {first} («{desc}») ещё не завершён. Сначала завершите предыдущие шаги или отметьте шаг {first} status=skipped, если он не нужен.",
@@ -262,21 +274,22 @@
262
274
  "plan.delete_no_id": "Укажите id плана для удаления (plan delete id=plan_xxx).",
263
275
  "plan.deleted": "План {id} удалён окончательно.",
264
276
  "plan.purged": "Удалено планов: {count}. Хранилище планов пусто.",
265
- "plan.no_deliverables": "примечание: шаг {step} не называет файлов — его выполнение нельзя проверить автоматически; перед финальным ответом явно проверь результат (например, запусти сборку/тесты).",
266
- "plan.bulk_update_rejected": "Массовая перезапись steps[] через action=update не поддерживается: она бы стёрла статусы всех шагов. Используй \"re-plan\" (сохраняет завершённые шаги, заменяет остальные) или отмечай шаги по одному: plan update step=N status=done|failed|skipped.",
277
+ "plan.no_deliverables": "примечание: шаг {step} не называет файлов — проверь результат способом, подходящим задаче (для кода: сборка/тесты/линт; для исследования/совета: перепроверь ответ, НЕ создавай файлы ради деливераблов).",
278
+ "plan.bulk_update_rejected": "Массовая перезапись steps[] через action=update не поддерживается: она бы стёрла статусы всех шагов. Используй \"re-plan\" (сохраняет завершённые шаги, заменяет остальные) или отмечай шаги по одному: plan_step step=N status=done|failed|skipped.",
267
279
  "plan.readonly": "План {id} имеет статус {status} (только чтение) — обновить его нельзя. Используй \"plan switch\", чтобы активировать его, или создай новый план для новой задачи.",
268
280
  "plan.list_legend": "[*] активный · [ ] черновик · [-] архив",
269
281
  "exec.plan_nudge": "Ты сделал(а) {count} вызов(ов), изменяющих файлы, без плана. Для задач, создающих/изменяющих файлы или состоящих из нескольких шагов, сначала создай план (plan create) с конкретными шагами (точные имена файлов, команды, результаты), а потом продолжай.",
270
282
  "exec.plan_summary_complete": "[{id}] \"{title}\" — {done}/{total} готово, план завершён. Можешь создать новый план для новой работы (plan create) или дать финальный ответ.",
271
283
  "exec.plan_summary_continue": "[{id}] \"{title}\" — {done}/{total} готово, текущий: шаг {current} — продолжай его (plan show / re-plan), НЕ создавай новый план",
272
284
  "exec.test_fail_summary": "{framework}: {failed} падающих тест(ов) ({passed} пройдено). НЕ отмечай текущий шаг как done — исправь падающие тесты (прочитай вывод, поправь код) и перезапусти до полного успеха.",
273
- "exec.test_pass_summary": "{framework}: все {passed} тест(ов) пройдены для \"{cmd}\". Можно отметить текущий шаг как done через plan update step=N status=done.",
285
+ "exec.test_pass_summary": "{framework}: все {passed} тест(ов) пройдены для \"{cmd}\". Можно отметить текущий шаг как done через plan_step step=N status=done.",
274
286
  "exec.skills_hint": "Если доступны подходящие навыки, рассмотри загрузку одного через load_skill для экспертной подсказки.",
275
287
  "todo.added": "Добавлено {count} задач: {items}",
276
288
  "todo.marked_done": "Отмечено выполненными: {count}",
277
289
  "todo.no_active": "Нет активных задач",
278
290
  "todo.no_items": "Не указаны подзадачи — укажите items для отметки выполненными",
279
- "todo.subtask_not_found": "Подзадачи не найдены: {items}",
291
+ "todo.subtask_not_found": "Подзадачи не найдены: {items}. Используй id из todo list (todo done ids=[...]) — так надёжнее.",
292
+ "todo.subtask_id_not_found": "Нет подзадач с id: {ids}. Проверь id через todo list.",
280
293
  "todo.unknown_action": "Неизвестное действие todo: {action}",
281
294
  "todo.acknowledged": "Todo принято",
282
295
  "verify.passed": "Проверка пройдена",
@@ -312,11 +325,13 @@
312
325
  "cli.config_saved": "Конфигурация сохранена в ~/.mma/config.json",
313
326
  "cli.manage_config": "Управление конфигурацией",
314
327
  "cli.config_key": "Ключ конфига (напр., model, provider.baseUrl)",
328
+ "cli.config_value": "Значение конфига",
315
329
  "cli.set_value": "Установить значение",
316
330
  "cli.config_force": "Обойти проверку и записать сырое значение как есть",
317
331
  "cli.set_done": "Установлено {key}={value}",
318
332
  "cli.config_invalid": "Недопустимое значение для '{key}' ({reason}). Конфиг не изменён.",
319
333
  "cli.show_config": "Показать действующую конфигурацию (секреты скрыты; используйте --show-secrets)",
334
+ "cli.show_secrets": "Показать секреты (API-ключи, токены) открыто",
320
335
  "cli.migrate_config": "Мигрировать legacy config.json в domain-формат",
321
336
  "cli.manage_models": "Управление моделями",
322
337
  "cli.list_models": "Список доступных моделей",
@@ -329,6 +344,7 @@
329
344
  "cli.no_models_found": "Модели не найдены у провайдера",
330
345
  "cli.fetching_models": "Загрузка списка моделей...",
331
346
  "cli.manage_context": "Управление контекстным окном",
347
+ "cli.context_size_arg": "Размер контекстного окна в токенах (без значения — показать разбивку бюджета)",
332
348
  "cli.invalid_context_size": "Некорректный размер контекста. Должно быть число >= 1024",
333
349
  "cli.context_set": "Контекстное окно установлено: {size} токенов",
334
350
  "cli.context_budget_header": "Бюджет контекста (окно {window} токенов):",
@@ -340,6 +356,7 @@
340
356
  "cli.context_fraction_set": "Доля {key} установлена: {value}",
341
357
  "cli.context_invalid_fraction": "Некорректная доля. Нужно число от 0.05 до 0.9 (системный + резерв должны оставаться ниже 0.95).",
342
358
  "cli.set_model": "Установить модель по умолчанию",
359
+ "cli.model_name": "Имя модели",
343
360
  "cli.model_set": "Модель установлена: {name}",
344
361
  "cli.certify": "Запустить сертификационный набор для модели",
345
362
  "cli.cert_provider_url": "Базовый URL провайдера для сертификации (по умолчанию — текущий конфиг)",
@@ -376,6 +393,7 @@
376
393
  "cli.cert_marks_hint": "Маркеры: ✔ сертифицировано на этом провайдере, ○ сертифицировано на старой версии MMA, · не сертифицировано",
377
394
  "cli.manage_providers": "Управление провайдерами",
378
395
  "cli.provider_check": "Проверить доступность провайдеров (бесплатный вызов listModels)",
396
+ "cli.probe_timeout": "Таймаут проверки провайдера в мс",
379
397
  "repl.provider_down": "[ВНИМАНИЕ] Провайдер «{name}» недоступен: {error}",
380
398
  "repl.meet_start_prompt": "Давай познакомимся. Начни интервью.",
381
399
  "repl.meet_unavailable": "Не могу начать: провайдер не отвечает ({reason}).",
@@ -409,9 +427,28 @@
409
427
  "cli.base_url": "Базовый URL:",
410
428
  "cli.set_provider": "Установить активный провайдер",
411
429
  "cli.provider_set": "Провайдер установлен: {name}",
430
+ "cli.provider_name": "Имя провайдера",
431
+ "cli.provider_type_label": "Тип провайдера или метка",
432
+ "cli.provider_base_url": "Базовый URL",
433
+ "cli.provider_api_key": "API-ключ",
434
+ "cli.provider_priority": "Приоритет переключения (меньше — раньше)",
435
+ "cli.provider_context_window": "Переопределение контекстного окна для этой записи",
436
+ "cli.provider_rpm": "Максимум запросов в минуту для этой записи",
437
+ "cli.provider_parallel": "Максимум параллельных задач для этой записи",
412
438
  "cli.manage_sessions": "Управление сессиями",
413
439
  "cli.list_sessions": "Список всех сессий",
414
440
  "cli.show_details": "Показать детали сессии",
441
+ "cli.session_id": "ID сессии",
442
+ "cli.session_id_or_prefix": "ID сессии (или начало имени)",
443
+ "cli.session_field_id": "ID:",
444
+ "cli.session_field_name": "Имя:",
445
+ "cli.session_field_created": "Создана:",
446
+ "cli.session_field_updated": "Обновлена:",
447
+ "cli.session_field_messages": "Сообщений:",
448
+ "cli.session_field_model": "Модель:",
449
+ "cli.session_field_context": "Контекст:",
450
+ "cli.session_field_project": "Проект:",
451
+ "cli.session_moe_events": "События MoE:",
415
452
  "cli.delete_session": "Удалить сессию",
416
453
  "cli.prune_sessions": "Удалить сессии без сообщений пользователя",
417
454
  "cli.prune_dry_run": "Показать кандидатов без удаления",
@@ -429,6 +466,10 @@
429
466
  "cli.web.token": "требовать этот токен (обязателен для не-loopback)",
430
467
  "cli.web.no_open": "не открывать браузер автоматически",
431
468
  "cli.web_started": "веб-интерфейс → {url} (директория: {dir})",
469
+ "cli.web_invalid_port": "некорректный --port «{port}»: нужно целое число от 1 до 65535",
470
+ "cli.relaunch_failed": "Не удалось перезапустить CLI: {message}",
471
+ "cli.prompt_arg": "Промпт для выполнения",
472
+ "cli.run_prompt": "Выполнить одиночный промпт",
432
473
  "cli.setup_saved_restart": "Настройки сохранены. Перезапуск с новой конфигурацией...",
433
474
  "cli.unknown_cmd": "Неизвестная команда: {name}.",
434
475
  "cli.unknown_command": "Неизвестная команда \"{input}\". Возможно, вы имели в виду \"{suggestion}\"?",
@@ -753,22 +794,23 @@
753
794
  "skill.prompt_fallback": "Если load_skill не удался из-за большого размера скилла, продолжайте задачу без него — не останавливайтесь.",
754
795
  "skill.loaded_content": "[Скилл загружен: {name}]\n{content}\n\nИспользуйте эти знания для ответа на вопрос пользователя.",
755
796
  "exec.stuck": "Нет прогресса на шаге {stepId} ({description}) — {iterations} итераций.",
756
- "exec.stuck_recovery": "Шаг {stepId} — \"{description}\" — без прогресса уже {iterations} итераций. Попробуйте другой подход: проверьте что нужно для этого шага, установлены ли зависимости, или создайте файлы напрямую через write_file вместо команд терминала. После завершения шага вызовите plan update step={stepId} status=done.",
797
+ "exec.stuck_recovery": "Шаг {stepId} — \"{description}\" — без прогресса уже {iterations} итераций. Попробуйте другой подход: проверьте что нужно для этого шага, установлены ли зависимости, или создайте файлы напрямую через write_file вместо команд терминала. После завершения шага вызовите plan_step step={stepId} status=done.",
757
798
  "exec.tool_errors": "Инструмент {tool} упал {count} раз. Попробуйте другой инструмент.",
758
- "exec.tool_errors_recovery": "Инструмент {tool} упал {count} раз подряд. Попробуйте альтернативу: создайте файлы напрямую через write_file, используйте другую команду, или пропустите этот шаг через plan update step=N status=skipped с пометкой почему.",
799
+ "exec.tool_errors_recovery": "Инструмент {tool} упал {count} раз подряд. Попробуйте альтернативу: создайте файлы напрямую через write_file, используйте другую команду, или пропустите этот шаг через plan_step step=N status=skipped с пометкой почему.",
759
800
  "exec.repetitive_tool": "Инструмент {tool} вызван {count} раз с одинаковыми аргументами и результатом. Попробуйте другой подход — создайте файлы напрямую, измените аргументы или проверьте статус процесса через process_log.",
760
801
  "exec.repetitive_process_log_hint": "Вы опрашиваете фоновый процесс в цикле — вызовите process_wait один раз вместо опроса через process_log.",
761
802
  "exec.consecutive_failures_recovery": "{count} инструментов подряд упали. Создавайте файлы напрямую через write_file вместо команд терминала. Проверьте что зависимости установлены (npm install). Не запускайте сборку/тесты пока не созданы все файлы.",
762
803
  "exec.bash_flailing_recovery": "bash упал в {fails} из последних {window} попыток. Хватит использовать шелл-команды для файловых операций на этой машине — они не работают. Используй специализированные инструменты: read_file (в заголовке число строк), write_file, edit_file, file_info (размер файла), glob/grep для поиска",
763
804
  "exec.bash_flailing": "bash упал в {fails} из последних {window} попыток.",
764
805
  "exec.consecutive_failures": "{count} подряд неудачных вызовов тулов.",
806
+ "exec.honest_stop": "ХВАТИТ повторять. {count} пакетов тулов подряд упали или заблокированы, успешных вызовов между ними не было — новые варианты того же действия не помогут. НЕ пробуй другую команду, флаг или обход. Напиши финальный текстовый ответ СЕЙЧАС: честно укажи что сделано, что НЕ сделано или НЕ проверено и почему. НЕ вставляй вывод, который не получал от тула.",
765
807
  "exec.read_only_loop": "Нет записи/выполнения за {count} вызовов — агент только читает/исследует.",
766
808
  "exec.read_only_loop_recovery": "{count} вызовов только для чтения подряд (read_file/glob/grep/browser) без записи. Хватит исследовать — внесите правку, которую требует задача: прочитайте файл, затем вызовите write_file или edit_file. Если не можете завершить задачу — спросите пользователя, а не перечитывайте одни и те же файлы.",
767
- "exec.plan_warning": "Текущий шаг плана {step} — \"{description}\", но вызывается {tool} для файлов вне этого шага. Завершите текущий шаг, вызовите plan update step={step} status=done, затем переходите к следующему.",
809
+ "exec.plan_warning": "Текущий шаг плана {step} — \"{description}\", но вызывается {tool} для файлов вне этого шага. Завершите текущий шаг, вызовите plan_step step={step} status=done, затем переходите к следующему.",
768
810
  "exec.plan_blocked": "{max} вызовов подряд вне текущего шага. Завершите шаг {step} — остальные шаги ждут пока этот не будет выполнен.",
769
811
  "exec.off_track": "Шаг {stepId} — \"{description}\", но используется {tool} для другого пути. Вернитесь к текущему шагу.",
770
- "exec.step_gate_deps": "[⚠ Шаг {step} \"{description}\": зависимости не установлены. Сначала выполните команду установки (npm install, pip install и т.д.). Проверьте что lock-файл или директория зависимостей существует. Если этот шаг на самом деле не нужен (внешних зависимостей нет) — пропусти его: plan update step={step} status=skipped note=\"зависимости не нужны\".]",
771
- "exec.step_gate_deps_force": "[⚠ Шаг {step}: зависимости всё ещё не установлены (нет lock-файла) — второе предупреждение. Если этот шаг НЕ нужен — НЕМЕДЛЕННО вызови: plan update step={step} status=skipped note=\"зависимости не нужны\". Если нужен — выполни установку прямо сейчас. Не делай других вызовов инструментов до обновления плана.]",
812
+ "exec.step_gate_deps": "[⚠ Шаг {step} \"{description}\": зависимости не установлены. Сначала выполните команду установки (npm install, pip install и т.д.). Проверьте что lock-файл или директория зависимостей существует. Если этот шаг на самом деле не нужен (внешних зависимостей нет) — пропусти его: plan_step step={step} status=skipped note=\"зависимости не нужны\".]",
813
+ "exec.step_gate_deps_force": "[⚠ Шаг {step}: зависимости всё ещё не установлены (нет lock-файла) — второе предупреждение. Если этот шаг НЕ нужен — НЕМЕДЛЕННО вызови: plan_step step={step} status=skipped note=\"зависимости не нужны\". Если нужен — выполни установку прямо сейчас. Не делай других вызовов инструментов до обновления плана.]",
772
814
  "exec.step_gate_empty": "[⚠ Шаг {step}: файлы существуют, но выглядят пустыми: {files}. Добавьте реальный код в эти файлы перед тем как переходить к следующему шагу.]",
773
815
  "exec.step_gate_ok": "[✓] Шаг {step} завершён и проверен. ПЕРЕХОДИМ к шагу {nextStep}: \"{nextDesc}\". Работайте ТОЛЬКО над этим шагом.",
774
816
  "exec.step_gate_last": "[✓] Шаг {step} завершён — это был последний шаг. Проверьте всё вместе и предоставьте финальный ответ.]",
@@ -778,10 +820,10 @@
778
820
  "exec.audit_leftovers": "[✗] Задача не выполнена: {done}/{total} шагов, {files} файлов из delete-шагов всё ещё существуют",
779
821
  "exec.audit_fail_tests": "[✗] Задача не выполнена: {done}/{total} шагов, тесты ПАДАЮТ: {failed} failed / {passed} passed — {detail}",
780
822
  "exec.audit_fail_typecheck": "[✗] Задача не выполнена: {done}/{total} шагов, {missing} файлов отсутствует, ошибка typecheck: {typeError}",
781
- "exec.audit_incomplete": "❗ Финальная проверка не пройдена: {summary}. Задача НЕ завершена. Незакрытые шаги: {steps}. Устрани одним путём: (a) если результат шага уже существует на диске — закрой шаг (plan update step=N status=done); (b) если шаг больше не нужен — status=skipped; (c) если план разошёлся с реальностью (другие имена файлов, сменился подход) — сделай re-plan. Не повторяй plan update без изменений.",
823
+ "exec.audit_incomplete": "❗ Финальная проверка не пройдена: {summary}. Задача НЕ завершена. Незакрытые шаги: {steps}. Устрани одним путём: (a) если результат шага уже существует на диске — закрой шаг (plan_step step=N status=done); (b) если шаг больше не нужен — status=skipped; (c) если план разошёлся с реальностью (другие имена файлов, сменился подход) — сделай re-plan. Не повторяй plan_step без изменений.",
782
824
  "exec.mass_edit_warning": "⚠️ План затрагивает {count} файлов — проверьте полный список перед продолжением.",
783
825
  "exec.escalation": "\n\n⚠️ Агент застрял на шаге {stepId} ({description}). Эскалация к пользователю — пожалуйста, подскажите как действовать.",
784
- "exec.escalation_directive": "Ты застрял уже несколько попыток. Перестань повторять одно и то же и выбери ОДНО: (1) смени подход принципиально, (2) найди точный текст ошибки через web_search (или инструмент поиска ошибок), (3) задай пользователю короткий уточняющий вопрос, (4) если шаг невыполним — plan update step=<n> status=skipped с заметкой (или re-plan). Кратко объясни выбор.",
826
+ "exec.escalation_directive": "Ты застрял уже несколько попыток. Перестань повторять одно и то же и выбери ОДНО: (1) смени подход принципиально, (2) найди точный текст ошибки через web_search (или инструмент поиска ошибок), (3) задай пользователю короткий уточняющий вопрос, (4) если шаг невыполним — plan_step step=<n> status=skipped с заметкой (или re-plan). Кратко объясни выбор.",
785
827
  "exec.test_churn_nudge": "Ты несколько раз подряд правил тест/спек-файл \"{file}\" и не изменил ни строчки production-кода. Если тесты падают — исправляй КОД ПОД ТЕСТОМ (а не тест), если только сам тест не ошибочен — тогда объясни, почему. Если задумано test-first, теперь напиши реализацию.",
786
828
  "exec.script_workaround_nudge": "Ограничение безопасности уже заблокировало одну из твоих команд. Написание shell-скрипта (.bat/.cmd/.sh/.ps1), чтобы выполнить её иначе, НЕ снимает ограничение и обычно просто падает. Вместо этого: используй write_file для вывода в файл, запускай по одной простой команде за вызов, передавай \"workdir\" вместо \"cd\" или спроси пользователя.",
787
829
  "exec.hints": "\n[Подсказки]\n{hints}",
@@ -801,6 +843,8 @@
801
843
  "hall.unknown_paths": "Упомянутые файлы не найдены: {paths}",
802
844
  "hall.contradiction_llm": "Противоречит ранее принятому решению{reason}",
803
845
  "hall.claim_contradiction": "Ответ заявляет об успехе, но свежий результат тула указывает на проблему ({tool}: {snippet}). Либо проверь и исправь, затем перезапусти проверку — либо смягчи формулировку под факты (например, застейджено, появится в ближайшее время).",
846
+ "hall.claim_artifact": "В ответе {path} подан как готовый, но на диске: {detail}. Либо исправь файл и перепроверь реальным чтением — либо смягчи формулировку до того, что реально проверено.",
847
+ "hall.claim_output_unverified": "В ответе вывод подан как результат запуска ({detail}). Либо выполни разрешённым инструментом и процитируй реальный вывод — либо пометь его как ожидаемый/примерный.",
804
848
  "hall.uncertainty_prefix": "\n\n[⚠️ Неопределённость] ",
805
849
  "browser.repeated_action": "Вы повторили то же действие ({action}) {threshold} раз. Попробуйте другой подход: используйте \"snapshot\" для перечитки страницы, другие номера элементов или другой URL.",
806
850
  "browser.unknown_action": "Неизвестное действие: {action}",
@@ -847,8 +891,6 @@
847
891
  "ui.thinking_label_3": "прикидываю",
848
892
  "ui.action_fallback": "Действие",
849
893
  "ui.actions_summary": "{count} действий",
850
- "ui.critic_concern": "проверка · {count} замеч.",
851
- "ui.critic_repair": "проверка · исправление",
852
894
  "ui.plan_update": "шаг {step} → {status}",
853
895
  "ui.todo_action": "{action} · {count}",
854
896
  "ui.tool_running": "{tool}…",
@@ -957,10 +999,10 @@
957
999
  "cli.usage_empty": "Провайдер не вернул данных о балансе.",
958
1000
  "repl.ctrl_c_interrupt": "\n[Ctrl+C] Остановка агента... (ещё раз — принудительно)",
959
1001
  "repl.force_exit": "\nПринудительный выход — фоновая очистка может быть неполной.",
960
- "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.",
1002
+ "exec.stop_directive": "STOP. Step {stepId} (\"{description}\") took {iterations} iterations with no progress. DO NOT continue this step. Immediately call: plan_step step={stepId} status=done (if code works despite warnings) OR plan_step step={stepId} status=skipped note=\"reason\". Do NOT make any other tool calls before updating the plan.",
961
1003
  "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.",
962
1004
  "exec.test_runner_pass": "[test-runner] {framework}: all {passed} test(s) passing.",
963
- "plan.subtasks_done": "All sub-tasks done — call plan update step={stepId} status=done to complete this step.",
1005
+ "plan.subtasks_done": "All sub-tasks done — call plan_step step={stepId} status=done to complete this step.",
964
1006
  "plan.no_subtasks": "(no sub-tasks)",
965
1007
  "plan.step_label": "Step {stepId}: {description}",
966
1008
  "exec.hint_deps": "Check if a lock file exists (package-lock.json, poetry.lock). If missing, run the install command first.",
@@ -1008,6 +1050,8 @@
1008
1050
  "web.topbar.all_sessions": "все сессии",
1009
1051
  "web.topbar.sidebar": "сайдбар",
1010
1052
  "web.topbar.close": "закрыть",
1053
+ "web.sessbar.prev": "предыдущая сессия",
1054
+ "web.sessbar.next": "следующая сессия",
1011
1055
  "web.conn.reconnecting": "переподключение…",
1012
1056
  "web.sidebar.plan": "план",
1013
1057
  "web.sidebar.session": "сессия",
@@ -1057,6 +1101,9 @@
1057
1101
  "config.key.moe.enabled": "MoE",
1058
1102
  "config.key.moe.maxReplanCycles": "циклы re-plan MoE",
1059
1103
  "config.key.critic.enabled": "проверяющий (критик)",
1104
+ "config.key.critic.model": "модель критика",
1105
+ "config.key.critic.provider": "провайдер критика",
1106
+ "config.key.critic.tools": "проверки критика",
1060
1107
  "config.key.critic.maxCalls": "макс. вызовов критика",
1061
1108
  "config.key.critic.maxRepairCycles": "циклы исправления критика",
1062
1109
  "config.key.critic.timeoutMs": "таймаут критика (мс)",
@@ -1077,6 +1124,13 @@
1077
1124
  "config.enum.verbose": "подробно",
1078
1125
  "config.enum.auto": "авто",
1079
1126
  "config.enum.default": "по умолчанию",
1127
+ "config.enum.off": "выкл.",
1128
+ "config.enum.line": "строка",
1129
+ "config.enum.meta": "в подсказках",
1130
+ "config.enum.full": "во всю ширину",
1131
+ "config.enum.compact": "компактный",
1132
+ "config.enum.comfortable": "обычный",
1133
+ "config.enum.large": "крупный",
1080
1134
  "config.enum.none": "нет",
1081
1135
  "config.enum.low": "низкий",
1082
1136
  "config.enum.medium": "средний",
@@ -1223,6 +1277,7 @@
1223
1277
  "web.settings.provider_type": "тип",
1224
1278
  "web.settings.provider_label_field": "метка",
1225
1279
  "web.settings.provider_baseurl": "base URL",
1280
+ "web.settings.provider_baseurl_custom": "свой URL…",
1226
1281
  "web.settings.provider_apikey": "API-ключ",
1227
1282
  "web.settings.provider_key_keep": "оставь пустым, чтобы сохранить",
1228
1283
  "web.settings.provider_context": "окно контекста",
@@ -1234,6 +1289,15 @@
1234
1289
  "web.settings.provider_cache_report": "формат отчёта кеша",
1235
1290
  "web.settings.provider_cache_flags": "флаги кеша",
1236
1291
  "web.settings.provider_retry": "повторы",
1292
+ "web.settings.provider_retry_max": "макс. повторов",
1293
+ "web.settings.provider_retry_base": "базовая задержка (мс)",
1294
+ "web.settings.provider_retry_maxdelay": "макс. задержка (мс)",
1295
+ "web.settings.provider_flag.sessionHeader": "заголовок x-opencode-session",
1296
+ "web.settings.provider_flag.requestCachePrompt": "cache_prompt (llama.cpp)",
1297
+ "web.settings.provider_flag.requestPromptCacheKey": "prompt_cache_key (OpenAI)",
1298
+ "web.settings.provider_flag.requestSessionId": "session_id (OpenRouter)",
1299
+ "web.settings.provider_flag.requestCacheControl": "cache_control (Anthropic)",
1300
+ "web.settings.provider_flag.requestStreamUsage": "usage-чанк в стриме",
1237
1301
  "web.settings.provider_required": "тип и base URL обязательны",
1238
1302
  "web.settings.provider_invalid": "некорректное числовое значение",
1239
1303
  "web.settings.provider_active_guard": "нельзя удалить активного провайдера — сначала переключись",
@@ -1307,21 +1371,32 @@
1307
1371
  "web.selectors.model": "модель",
1308
1372
  "web.selectors.provider": "провайдер",
1309
1373
  "web.selectors.context": "контекст",
1374
+ "web.selectors.reasoning": "рассуждения",
1375
+ "web.selectors.switch_busy": "переключение уже идёт, подождите",
1376
+ "web.selectors.reasoning_off": "выкл (бэкенд игнорирует)",
1310
1377
  "web.selectors.no_models": "нет моделей",
1311
1378
  "web.selectors.refresh_list": "↻ обновить список",
1312
1379
  "web.selectors.custom": "другое…",
1313
1380
  "web.selectors.current": "текущее",
1314
1381
  "web.selectors.context_prompt": "контекстное окно (токены)",
1382
+ "web.rail.working": "выполняю",
1383
+ "web.rail.composing": "пишу",
1384
+ "web.rail.no_plan": "без плана",
1385
+ "web.rail.step_of": "шаг {cur}/{total}",
1386
+ "web.rail.last": "последнее:",
1387
+ "web.rail.none": "—",
1388
+ "web.rail.tools_one": "{count} тул",
1389
+ "web.rail.tools_few": "{count} тула",
1390
+ "web.rail.tools_many": "{count} тулов",
1391
+ "web.rail.events_one": "{count} событие",
1392
+ "web.rail.events_few": "{count} события",
1393
+ "web.rail.events_many": "{count} событий",
1315
1394
  "web.action.thinking": "думаю",
1316
1395
  "web.action.hide": "скрыть",
1317
1396
  "web.action.show": "показать",
1318
1397
  "web.action.actions_one": "{count} действие",
1319
1398
  "web.action.actions_few": "{count} действия",
1320
1399
  "web.action.actions_many": "{count} действий",
1321
- "web.critic_concern_one": "Проверка: {count} замечание",
1322
- "web.critic_concern_few": "Проверка: {count} замечания",
1323
- "web.critic_concern_many": "Проверка: {count} замечаний",
1324
- "web.critic_repair": "Проверка: проблема — исправление",
1325
1400
  "web.action.cancel": "отмена",
1326
1401
  "web.cmdk.label": "команды",
1327
1402
  "web.command.help": "список веб-команд",
@@ -1359,6 +1434,12 @@
1359
1434
  "web.msg.copy": "копировать",
1360
1435
  "web.msg.copy_md": "копировать как markdown",
1361
1436
  "web.card.open": "открыть ↗",
1437
+ "web.card.download": "скачать ⤓",
1438
+ "web.card.copy_path": "путь",
1439
+ "web.card.open_title": "Предпросмотр во вкладке браузера",
1440
+ "web.card.download_title": "Скачать файл",
1441
+ "web.card.copy_title": "Скопировать путь в рабочей папке",
1442
+ "web.card.drawio_hint": "Диаграмма draw.io — это XML: предпросмотр покажет код, схему смотри в draw.io / VS Code.",
1362
1443
  "web.card.screenshot": "снимок экрана",
1363
1444
  "web.card.attached_image": "прикреплённое изображение",
1364
1445
  "web.card.browser_viewport": "браузер · область просмотра",
@@ -1371,7 +1452,7 @@
1371
1452
  "web.file.error.outside_workspace": "Файл вне рабочей папки агента — открыть нельзя.",
1372
1453
  "web.file.error.protected_path": "Файл защищён (секреты/VCS) — открыть нельзя.",
1373
1454
  "web.file.error.too_large": "Файл слишком большой для показа в браузере (максимум {limit} байт).",
1374
- "web.file.error.binary_file": "Похоже на бинарный файл — текстом показать нельзя.",
1455
+ "web.file.error.binary_file": "Похоже на бинарный файл — текстом показать нельзя, скачай кнопкой «Скачать».",
1375
1456
  "web.file.error.not_found": "Файл не найден (возможно, это папка или он удалён).",
1376
1457
  "web.file.error.workspace_unavailable": "Рабочая папка не открыта.",
1377
1458
  "config.desc.model": "Модель основного агента.",
@@ -1387,6 +1468,9 @@
1387
1468
  "config.desc.moe.enabled": "Agent-level MoE: план → параллельные эксперты → проверка (через orchestrator-провайдер).",
1388
1469
  "config.desc.moe.maxReplanCycles": "Максимум циклов план→исполнение→проверка до принятия частичного результата.",
1389
1470
  "config.desc.critic.enabled": "Проверяющий в петле: ревью работы при мутациях и перед завершением.",
1471
+ "config.desc.critic.model": "Отдельная модель проверяющего (пусто = активная модель).",
1472
+ "config.desc.critic.provider": "Отдельный провайдер проверяющего (пусто = активный провайдер).",
1473
+ "config.desc.critic.tools": "Разрешить критику ограниченные read-only проверки файлов перед финальным вердиктом.",
1390
1474
  "config.desc.critic.maxCalls": "Жёсткий лимит LLM-вызовов критика за прогон.",
1391
1475
  "config.desc.critic.maxRepairCycles": "Ограниченные циклы исправления по критическому вердикту.",
1392
1476
  "config.desc.critic.timeoutMs": "Таймаут вызова критика (fail-open).",
@@ -1506,10 +1590,14 @@
1506
1590
  "config.desc.sessionIsolation.isolateTempFiles": "Выдавать каждой сессии отдельную папку временных файлов.",
1507
1591
  "config.key.ui.spinner": "спиннер",
1508
1592
  "config.desc.ui.spinner": "Показывать анимированный спиннер во время работы тулов.",
1593
+ "config.key.ui.activityRail": "рейка активности",
1594
+ "config.desc.ui.activityRail": "Индикатор над строкой ввода, пока агент работает.",
1509
1595
  "config.key.ui.showContextStats": "статистика контекста",
1510
1596
  "config.desc.ui.showContextStats": "Показывать статистику использования контекста после каждого хода.",
1511
1597
  "config.key.ui.showCompaction": "уведомление о компакции",
1512
1598
  "config.desc.ui.showCompaction": "Сообщать в чате о запуске компакции истории.",
1599
+ "config.key.ui.fontSize": "размер шрифта",
1600
+ "config.desc.ui.fontSize": "Размер шрифта веб-чата (только веб, на терминал не влияет).",
1513
1601
  "config.key.retry.maxRetries": "макс. повторов",
1514
1602
  "config.desc.retry.maxRetries": "Максимум повторов упавших LLM-запросов (0-10).",
1515
1603
  "config.key.retry.baseDelay": "базовая задержка повтора",
package/dist/index.js CHANGED
@@ -1,3 +1,6 @@
1
+ /**
2
+ * Публичные экспорты пакета и библиотечный хелпер миграции конфига.
3
+ */
1
4
  export { DEFAULTS, loadConfig } from "./config/index";
2
5
  export { Logger } from "./logger/index";
3
6
  export { PromptBuilder } from "./core/index";
@@ -10,12 +13,13 @@ import { t } from "./i18n/index";
10
13
  import { defaultOutputBus, getDefaultChannel } from "./output";
11
14
  import { homedir } from "os";
12
15
  import { join } from "path";
16
+ import { MMA_DIR_NAME } from "./config/paths";
13
17
  export function checkMigration(configDir) {
14
- const dir = configDir || join(homedir(), ".mma");
18
+ const dir = configDir || join(homedir(), MMA_DIR_NAME);
15
19
  const detector = new MigrationDetector(dir);
16
20
  if (detector.needsMigration()) {
17
- // Ensure a terminal subscriber exists before emitting to the bus; library
18
- // consumers have no other eager channel creation.
21
+ // Терминальный подписчик должен существовать до отправки в шину: у
22
+ // библиотечных потребителей нет другого eager-создания канала.
19
23
  getDefaultChannel();
20
24
  const backup = new BackupManager(dir);
21
25
  backup.backupConfig();
@@ -1,3 +1,4 @@
1
+ /** Картинки: MIME, буфер обмена, загрузка файла/URL в data URL. */
1
2
  import { readFileSync } from "fs";
2
3
  import { extname } from "path";
3
4
  const MIME_MAP = {
@@ -9,31 +10,54 @@ const MIME_MAP = {
9
10
  ".bmp": "image/bmp",
10
11
  ".svg": "image/svg+xml",
11
12
  };
12
- /** Detect MIME type from file extension. */
13
+ /**
14
+ * Определяет MIME-тип по расширению файла.
15
+ * @param filePath путь к файлу; @returns MIME-тип (дефолт image/png).
16
+ */
13
17
  export function detectMime(filePath) {
14
18
  const ext = extname(filePath).toLowerCase();
15
19
  return MIME_MAP[ext] ?? "image/png";
16
20
  }
21
+ /** Конструктор Bun.Image под Bun, иначе undefined. */
22
+ function getBunImage() {
23
+ return globalThis.Bun?.Image;
24
+ }
25
+ /** Ужимает буфер в JPEG data URL через Bun.Image; null, если недоступно/упало. */
26
+ async function resizeToJpegDataUrl(buf) {
27
+ const Image = getBunImage();
28
+ if (!Image)
29
+ return null;
30
+ try {
31
+ const img = new Image(buf);
32
+ const { width } = await img.metadata();
33
+ const targetWidth = Math.min(800, width || 800);
34
+ return await img.resize(targetWidth, 800, { fit: "inside" }).jpeg({ quality: 60 }).dataurl();
35
+ }
36
+ catch {
37
+ return null;
38
+ }
39
+ }
17
40
  /**
18
- * Read image from system clipboard using Bun.Image (macOS/Windows).
19
- * Falls back to platform-specific commands on Linux.
20
- * Returns null if clipboard has no image.
41
+ * Читает картинку из буфера обмена через Bun.Image (macOS/Windows).
42
+ * На Linux — платформенные команды. Null, если картинки нет.
43
+ * @returns буфер PNG/JPEG либо null.
21
44
  */
22
45
  export async function readClipboardImage() {
23
- // Bun.Image.fromClipboard() works on macOS and Windows
24
- if (typeof Bun !== "undefined" && typeof Bun.Image !== "undefined") {
46
+ // Bun.Image.fromClipboard() работает на macOS и Windows
47
+ const Image = getBunImage();
48
+ if (Image) {
25
49
  try {
26
- const img = Bun.Image.fromClipboard();
50
+ const img = Image.fromClipboard();
27
51
  if (img) {
28
52
  const buf = await img.resize(800, 800, { fit: "inside" }).jpeg({ quality: 60 }).buffer();
29
53
  return Buffer.from(buf);
30
54
  }
31
55
  }
32
56
  catch {
33
- // Bun.Image.fromClipboard() failed — fall through to platform fallback
57
+ // Bun.Image.fromClipboard() упал — идём в платформенный фолбэк
34
58
  }
35
59
  }
36
- // Linux fallback: xclip/wl-paste → temp file → read
60
+ // Linux-фолбэк: xclip/wl-paste → временный файл → чтение
37
61
  return readClipboardFallback();
38
62
  }
39
63
  async function readClipboardFallback() {
@@ -44,7 +68,7 @@ async function readClipboardFallback() {
44
68
  if (platform() !== "linux")
45
69
  return null; // macOS/Windows use Bun.Image
46
70
  const tmpPath = join(process.env.TEMP || process.env.TMP || "/tmp", `mma-clip-${Date.now()}.png`);
47
- // Try Wayland (wl-paste) first, then X11 (xclip)
71
+ // Сначала Wayland (wl-paste), затем X11 (xclip)
48
72
  const commands = [
49
73
  `wl-paste --type image/png > "${tmpPath}" 2>/dev/null`,
50
74
  `xclip -selection clipboard -t image/png -o > "${tmpPath}" 2>/dev/null`,
@@ -58,45 +82,36 @@ async function readClipboardFallback() {
58
82
  return buf;
59
83
  }
60
84
  catch {
61
- // try next command
85
+ // пробуем следующую команду
62
86
  }
63
87
  }
64
88
  try {
65
89
  unlinkSync(tmpPath);
66
90
  }
67
- catch { }
91
+ catch {
92
+ // Best-effort чистка времянки — зависший файл не должен маскировать null.
93
+ }
68
94
  return null;
69
95
  }
70
96
  /**
71
- * Load an image from a file path, resize via Bun.Image, return as JPEG data URL.
72
- * Target: ~800px wide, JPEG quality 60 — typically 5-15KB (~2-4K tokens).
97
+ * Грузит картинку из файла, ужимает через Bun.Image, отдаёт JPEG data URL.
98
+ * Цель: ~800px по ширине, JPEG 60 — обычно 5–15KB (~2–4K токенов).
73
99
  */
74
100
  export async function loadFileAsDataUrl(filePath) {
75
101
  const buf = readFileSync(filePath);
76
- // Use Bun.Image if available — resize + convert to JPEG
77
- if (typeof Bun !== "undefined" && typeof Bun.Image !== "undefined") {
78
- try {
79
- const img = new Bun.Image(buf);
80
- const { width } = await img.metadata();
81
- const targetWidth = Math.min(800, width || 800);
82
- const dataUrl = await img
83
- .resize(targetWidth, 800, { fit: "inside" })
84
- .jpeg({ quality: 60 })
85
- .dataurl();
86
- return { dataUrl };
87
- }
88
- catch {
89
- // Bun.Image failed — fall through to raw base64
90
- }
91
- }
92
- // Fallback: raw base64 (no resize)
102
+ // Bun.Image, если есть — ресайз + конвертация в JPEG
103
+ const resized = await resizeToJpegDataUrl(buf);
104
+ if (resized)
105
+ return { dataUrl: resized };
106
+ // Фолбэк: сырой base64 (без ресайза)
93
107
  const b64 = buf.toString("base64");
94
108
  const ext = filePath.split(".").pop()?.toLowerCase();
95
109
  const mime = ext === "jpg" || ext === "jpeg" ? "image/jpeg" : ext === "webp" ? "image/webp" : "image/png";
96
110
  return { dataUrl: `data:${mime};base64,${b64}` };
97
111
  }
98
112
  /**
99
- * Load an image from a URL, resize, return as JPEG data URL.
113
+ * Грузит картинку по URL, ужимает, отдаёт JPEG data URL.
114
+ * @param url URL картинки; @returns data URL.
100
115
  */
101
116
  export async function loadUrlAsDataUrl(url) {
102
117
  const resp = await fetch(url);
@@ -104,44 +119,20 @@ export async function loadUrlAsDataUrl(url) {
104
119
  throw new Error(`Failed to fetch image: ${resp.status} ${resp.statusText}`);
105
120
  }
106
121
  const buf = Buffer.from(await resp.arrayBuffer());
107
- if (typeof Bun !== "undefined" && typeof Bun.Image !== "undefined") {
108
- try {
109
- const img = new Bun.Image(buf);
110
- const { width } = await img.metadata();
111
- const targetWidth = Math.min(800, width || 800);
112
- const dataUrl = await img
113
- .resize(targetWidth, 800, { fit: "inside" })
114
- .jpeg({ quality: 60 })
115
- .dataurl();
116
- return { dataUrl };
117
- }
118
- catch {
119
- // fall through
120
- }
121
- }
122
+ const resized = await resizeToJpegDataUrl(buf);
123
+ if (resized)
124
+ return { dataUrl: resized };
122
125
  const b64 = buf.toString("base64");
123
126
  return { dataUrl: `data:image/png;base64,${b64}` };
124
127
  }
125
128
  /**
126
- * Process a clipboard buffer (already resized by readClipboardImage)
127
- * into a data URL. Used by Ctrl+V handler.
129
+ * Превращает буфер обмена (уже ужатый readClipboardImage) в data URL.
130
+ * Нужен обработчику Ctrl+V.
128
131
  */
129
132
  export async function bufferToDataUrl(buf) {
130
- if (typeof Bun !== "undefined" && typeof Bun.Image !== "undefined") {
131
- try {
132
- const img = new Bun.Image(buf);
133
- const { width } = await img.metadata();
134
- const targetWidth = Math.min(800, width || 800);
135
- const dataUrl = await img
136
- .resize(targetWidth, 800, { fit: "inside" })
137
- .jpeg({ quality: 60 })
138
- .dataurl();
139
- return { dataUrl };
140
- }
141
- catch {
142
- // fall through
143
- }
144
- }
133
+ const resized = await resizeToJpegDataUrl(buf);
134
+ if (resized)
135
+ return { dataUrl: resized };
145
136
  const b64 = buf.toString("base64");
146
137
  return { dataUrl: `data:image/png;base64,${b64}` };
147
138
  }