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/en.json CHANGED
@@ -35,6 +35,7 @@
35
35
  "error.max_iters": "Max iterations ({max}) reached",
36
36
  "error.empty_response": "Model returned an empty response after retries",
37
37
  "error.audit_failed": "Task could not be verified as complete: {summary}",
38
+ "error.retry_loop_stopped": "Stopped after {count} consecutive failed tool batches — the agent kept retrying a failing action instead of finishing",
38
39
  "error.grep_failed": "Grep failed: {message}",
39
40
  "error.search_failed": "Search failed: {message}",
40
41
  "error.fetch_failed": "Fetch failed: {message}",
@@ -166,6 +167,10 @@
166
167
  "tool.question.no_questions": "No questions provided",
167
168
  "tool.question.unanswered": "Unanswered",
168
169
  "tool.question.answered": "User has answered your questions: {formatted}. You can now continue with the user's answers in mind.",
170
+ "tool.question.memory_only": "No questions were asked — memory already answered everything. Continue with that in mind.",
171
+ "tool.question.memory_known": "Memory already answers: {formatted}. These were NOT asked.",
172
+ "tool.question.session_only": "Answers live only in this session — persist nothing via remember unless the user explicitly asks.",
173
+ "tool.question.batch_truncated": "Asked the first {shown} of {total} unknown questions — call the tool again for the rest.",
169
174
  "tool.name_or_task": "Provide either \"name\" or \"task\" parameter",
170
175
  "tool.chunk_query_no_query": "chunk_query: a query string is required.",
171
176
  "tool.chunk_query_no_input": "chunk_query: provide input_path or text.",
@@ -224,7 +229,13 @@
224
229
  "tool.friendly.process_wait": "Waiting for process",
225
230
  "plan.no_steps": "No plan steps specified. Provide concrete steps with files and commands.",
226
231
  "plan.created": "Plan created: {title} ({steps} steps)",
227
- "plan.coverage_warning": "Plan may be missing required files from the task: {missing}. Add steps covering them.",
232
+ "plan.coverage_blocked": "Plan does not cover files required by the task: {missing}. Add steps naming these files (exact paths) with checks, then call plan create again.",
233
+ "plan.checks_required": "Each step needs a verification contract: pass checks aligned 1:1 with steps — one per step: \"file-exists:<path>\" (auto-verified on done), \"command:<cmd>\" (run it before done), or \"manual:<what to check by eye>\" (UI/visual work only).",
234
+ "plan.checks_not_array": "checks must be an array of check strings, aligned 1:1 with steps",
235
+ "plan.checks_mismatch": "checks array length must match steps",
236
+ "plan.checks_invalid": "Invalid check(s): {kinds}. Each check must start with \"file-exists:\", \"command:\", or \"manual:\".",
237
+ "plan.check_failed": "Cannot mark step {step} done: its check failed — {check}. Run the check first (create the file / run the command), then mark done.",
238
+ "plan.check_self_certified": "check self-certified: {check} — confirmed run before done.",
228
239
  "plan.step_done": "Step {n}/{total}: {description} ✓",
229
240
  "plan.complete": "Task complete: {summary}",
230
241
  "plan.title_steps": "Plan \"{title}\" created with {count} steps",
@@ -237,6 +248,7 @@
237
248
  "plan.step_status": "Step {step}: {status}",
238
249
  "plan.no_active": "No active plan",
239
250
  "plan.step_not_found": "Step not found",
251
+ "plan.step_required": "Provide the step number: plan_step step=N status=done|failed|skipped.",
240
252
  "plan.bad_status": "Invalid status \"{status}\". Use one of: {allowed}.",
241
253
  "plan.step_already_done": "Step {step} is already done — nothing to do. Plan progress:",
242
254
  "plan.order_blocked": "Cannot mark step {step} done: step {first} (\"{desc}\") is not finished yet. Complete earlier steps first, or mark step {first} status=skipped if it is not needed.",
@@ -264,21 +276,22 @@
264
276
  "plan.delete_no_id": "Provide a plan id to delete (plan delete id=plan_xxx).",
265
277
  "plan.deleted": "Plan {id} deleted permanently.",
266
278
  "plan.purged": "Deleted {count} plan(s). Plan storage is empty.",
267
- "plan.no_deliverables": "note: step {step} names no files — its completion cannot be auto-verified; run an explicit check (e.g. build/tests) before your final answer.",
268
- "plan.bulk_update_rejected": "Bulk steps[] rewrite via action=update is not supported: it would discard all step statuses. Use \"re-plan\" (keeps completed steps, replaces the rest) or mark steps individually: plan update step=N status=done|failed|skipped.",
279
+ "plan.no_deliverables": "note: step {step} names no files — verify the result in a task-appropriate way before your final answer (for code: build/tests/lint; for research/advice tasks: re-check the answer, do NOT create files just to have deliverables).",
280
+ "plan.bulk_update_rejected": "Bulk steps[] rewrite via action=update is not supported: it would discard all step statuses. Use \"re-plan\" (keeps completed steps, replaces the rest) or mark steps individually: plan_step step=N status=done|failed|skipped.",
269
281
  "plan.readonly": "Plan {id} is {status} (read-only) — it cannot be updated. Use \"plan switch\" to activate it, or create a new plan for new work.",
270
282
  "plan.list_legend": "[*] active · [ ] draft · [-] archived",
271
283
  "exec.plan_nudge": "You made {count} file-changing tool call(s) without a plan. For tasks that create or modify files, or span multiple steps, create a plan first (plan create) with concrete steps (exact filenames, commands, deliverables), then continue.",
272
284
  "exec.plan_summary_complete": "[{id}] \"{title}\" {done}/{total} done — plan complete. You may create a new plan for new work (plan create), or reply with your final answer.",
273
285
  "exec.plan_summary_continue": "[{id}] \"{title}\" {done}/{total} done, current: step {current} — continue it (plan show / re-plan), do NOT create a new plan",
274
286
  "exec.test_fail_summary": "{framework} reported {failed} FAILING test(s) ({passed} passing). Do NOT mark the current step as done — fix the failing tests (read the failure output, correct the code) and re-run them until all pass.",
275
- "exec.test_pass_summary": "{framework}: all {passed} test(s) passed for \"{cmd}\". You may mark the current step as done via plan update step=N status=done.",
287
+ "exec.test_pass_summary": "{framework}: all {passed} test(s) passed for \"{cmd}\". You may mark the current step as done via plan_step step=N status=done.",
276
288
  "exec.skills_hint": "If relevant skills are available, consider loading one with load_skill for expert guidance.",
277
289
  "todo.added": "Added {count} todo(s): {items}",
278
290
  "todo.marked_done": "Marked {count} item(s) as done",
279
291
  "todo.no_active": "No active todos",
280
292
  "todo.no_items": "No todo items specified — provide items to mark done",
281
- "todo.subtask_not_found": "No matching sub-task(s) found for: {items}",
293
+ "todo.subtask_not_found": "No matching sub-task(s) found for: {items}. Use ids from todo list (todo done ids=[...]) for reliable matching.",
294
+ "todo.subtask_id_not_found": "No sub-task(s) with id(s): {ids}. Check ids with todo list.",
282
295
  "todo.unknown_action": "Unknown todo action: {action}",
283
296
  "todo.acknowledged": "Todo acknowledged",
284
297
  "verify.passed": "Verification passed",
@@ -346,6 +359,7 @@
346
359
  "repl.reloading": "Reloading agent...",
347
360
  "repl.reloaded": "Agent reloaded",
348
361
  "cli.set_model": "Set default model",
362
+ "cli.model_name": "Model name",
349
363
  "cli.model_set": "Model set to: {name}",
350
364
  "cli.certify": "Run certification suite for a model",
351
365
  "cli.cert_provider_url": "Provider base URL to certify against (default: current config)",
@@ -382,6 +396,7 @@
382
396
  "cli.cert_marks_hint": "Markers: ✔ certified on this provider, ○ certified on an older MMA version, · not certified",
383
397
  "cli.manage_providers": "Manage providers",
384
398
  "cli.provider_check": "Probe configured providers (free listModels call)",
399
+ "cli.probe_timeout": "Per-provider probe timeout in ms",
385
400
  "repl.provider_down": "[WARN] Provider \"{name}\" is unreachable: {error}",
386
401
  "repl.meet_start_prompt": "Let's get acquainted. Start the interview now.",
387
402
  "repl.meet_unavailable": "Can't start: the provider is not responding ({reason}).",
@@ -415,9 +430,28 @@
415
430
  "cli.base_url": "Base URL:",
416
431
  "cli.set_provider": "Set active provider",
417
432
  "cli.provider_set": "Provider set to: {name}",
433
+ "cli.provider_name": "Provider name",
434
+ "cli.provider_type_label": "Provider type or label",
435
+ "cli.provider_base_url": "Base URL",
436
+ "cli.provider_api_key": "API key",
437
+ "cli.provider_priority": "Fallback priority (lower = tried first)",
438
+ "cli.provider_context_window": "Context window override for this entry",
439
+ "cli.provider_rpm": "Max requests per minute for this entry",
440
+ "cli.provider_parallel": "Max parallel tasks for this entry",
418
441
  "cli.manage_sessions": "Manage sessions",
419
442
  "cli.list_sessions": "List all sessions",
420
443
  "cli.show_details": "Show session details",
444
+ "cli.session_id": "Session id",
445
+ "cli.session_id_or_prefix": "Session id (or name prefix)",
446
+ "cli.session_field_id": "ID:",
447
+ "cli.session_field_name": "Name:",
448
+ "cli.session_field_created": "Created:",
449
+ "cli.session_field_updated": "Updated:",
450
+ "cli.session_field_messages": "Messages:",
451
+ "cli.session_field_model": "Model:",
452
+ "cli.session_field_context": "Context:",
453
+ "cli.session_field_project": "Project:",
454
+ "cli.session_moe_events": "MoE events:",
421
455
  "cli.delete_session": "Delete a session",
422
456
  "cli.prune_sessions": "Delete sessions without user messages",
423
457
  "cli.prune_dry_run": "Show what would be deleted without deleting",
@@ -435,6 +469,10 @@
435
469
  "cli.web.token": "require this token (mandatory for non-loopback)",
436
470
  "cli.web.no_open": "do not open the browser automatically",
437
471
  "cli.web_started": "web ui → {url} (directory: {dir})",
472
+ "cli.web_invalid_port": "invalid --port \"{port}\": expected an integer between 1 and 65535",
473
+ "cli.relaunch_failed": "Failed to relaunch the CLI: {message}",
474
+ "cli.prompt_arg": "Prompt to execute",
475
+ "cli.run_prompt": "Run a single prompt",
438
476
  "cli.setup_saved_restart": "Settings saved. Restarting with the new configuration...",
439
477
  "cli.unknown_cmd": "Unknown command: {name}.",
440
478
  "cli.unknown_command": "Unknown command \"{input}\". Did you mean \"{suggestion}\"?",
@@ -755,22 +793,23 @@
755
793
  "skill.prompt_fallback": "If load_skill fails because a skill is too large, continue the task without it — do not stop.",
756
794
  "skill.loaded_content": "[Skill loaded: {name}]\n{content}\n\nUse this knowledge to answer the user's question.",
757
795
  "exec.stuck": "No progress on step {stepId} ({description}) for {iterations} iterations.",
758
- "exec.stuck_recovery": "Step {stepId} — \"{description}\" — has had no progress for {iterations} iterations. Try a different approach: review what this step needs, check if dependencies are installed, or create files directly via write_file instead of shell commands. After completing the step call plan update step={stepId} status=done.",
796
+ "exec.stuck_recovery": "Step {stepId} — \"{description}\" — has had no progress for {iterations} iterations. Try a different approach: review what this step needs, check if dependencies are installed, or create files directly via write_file instead of shell commands. After completing the step call plan_step step={stepId} status=done.",
759
797
  "exec.tool_errors": "Tool {tool} failed {count} times. Consider using a different tool.",
760
- "exec.tool_errors_recovery": "Tool {tool} has failed {count} times in a row. Try an alternative: create files directly via write_file, use a different command, or if nothing works — skip this step via plan update step=N status=skipped with a note explaining why.",
798
+ "exec.tool_errors_recovery": "Tool {tool} has failed {count} times in a row. Try an alternative: create files directly via write_file, use a different command, or if nothing works — skip this step via plan_step step=N status=skipped with a note explaining why.",
761
799
  "exec.repetitive_tool": "Called {tool} {count} times with identical arguments and result. Try a different approach — create files directly, change arguments, or check process status via process_log.",
762
800
  "exec.repetitive_process_log_hint": "You are polling a background process — call process_wait once instead of polling process_log.",
763
801
  "exec.consecutive_failures_recovery": "{count} consecutive tool failures. Create files directly via write_file instead of terminal commands. Check that dependencies are installed (npm install). Do not run build/tests until all files are created.",
764
802
  "exec.bash_flailing_recovery": "bash failed in {fails} of the last {window} attempts. Stop using shell commands for file operations on this machine — they do not work. Use the dedicated tools instead: read_file (the header shows line counts), write_file, edit_file, file_info (file size), glob/grep for search",
765
803
  "exec.bash_flailing": "bash failed in {fails} of the last {window} attempts.",
766
804
  "exec.consecutive_failures": "{count} consecutive tool failures.",
805
+ "exec.honest_stop": "STOP retrying. {count} consecutive tool batches failed or were blocked with no successful call in between — more variants of the same action will not help. Do NOT try another command, flag, or workaround for this. Write your final text answer NOW: state plainly what was done, what could NOT be done or verified, and why. Do NOT paste output you did not actually receive from a tool.",
767
806
  "exec.read_only_loop": "No write/exec for {count} tool calls — the agent is only reading/exploring.",
768
807
  "exec.read_only_loop_recovery": "{count} consecutive read-only tool calls (read_file/glob/grep/browser) with no writes. STOP exploring and make the edit the task requires: read the file, then call write_file or edit_file. If you cannot finish the task, ask the user instead of re-reading the same files.",
769
- "exec.plan_warning": "Current plan step {step} is \"{description}\", but {tool} is being called for files outside this step. Complete the current step first, then call plan update step={step} status=done before moving to the next step.",
808
+ "exec.plan_warning": "Current plan step {step} is \"{description}\", but {tool} is being called for files outside this step. Complete the current step first, then call plan_step step={step} status=done before moving to the next step.",
770
809
  "exec.plan_blocked": "{max} consecutive calls outside the current step. Finish step {step} before proceeding — other steps should wait until this one is complete.",
771
810
  "exec.off_track": "Step {stepId} — \"{description}\" — but you are using {tool} on a different path. Return to the current step.",
772
- "exec.step_gate_deps": "[⚠ Step {step} \"{description}\": dependencies are not installed. First run the install command (npm install, pip install, etc.). Verify the lock file or dependency directory exists. If this step is NOT actually needed (no external dependencies), skip it: plan update step={step} status=skipped note=\"deps not needed\".]",
773
- "exec.step_gate_deps_force": "[⚠ Step {step}: dependencies still not installed (no lock file) — 2nd warning. If this step is NOT needed, IMMEDIATELY call: plan update step={step} status=skipped note=\"deps not needed\". If it IS needed, run the install command right now. Do NOT make other tool calls before updating the plan.]",
811
+ "exec.step_gate_deps": "[⚠ Step {step} \"{description}\": dependencies are not installed. First run the install command (npm install, pip install, etc.). Verify the lock file or dependency directory exists. If this step is NOT actually needed (no external dependencies), skip it: plan_step step={step} status=skipped note=\"deps not needed\".]",
812
+ "exec.step_gate_deps_force": "[⚠ Step {step}: dependencies still not installed (no lock file) — 2nd warning. If this step is NOT needed, IMMEDIATELY call: plan_step step={step} status=skipped note=\"deps not needed\". If it IS needed, run the install command right now. Do NOT make other tool calls before updating the plan.]",
774
813
  "exec.step_gate_empty": "[⚠ Step {step}: files exist but appear empty: {files}. Add real code to these files before advancing to the next step.]",
775
814
  "exec.step_gate_ok": "[✓] Step {step} completed and verified. MOVING to step {nextStep}: \"{nextDesc}\". Work ONLY on this step.",
776
815
  "exec.step_gate_last": "[✓] Step {step} completed — that was the final step. Verify everything together and provide the final answer.]",
@@ -780,10 +819,10 @@
780
819
  "exec.audit_leftovers": "[✗] Task incomplete: {done}/{total} steps done, {files} files from delete-steps still exist",
781
820
  "exec.audit_fail_tests": "[✗] Task incomplete: {done}/{total} steps done, tests FAILING: {failed} failed / {passed} passed — {detail}",
782
821
  "exec.audit_fail_typecheck": "[✗] Task incomplete: {done}/{total} steps done, {missing} files missing, typecheck error: {typeError}",
783
- "exec.audit_incomplete": "❗ Final audit incomplete: {summary}. Task is NOT finished. Remaining steps: {steps}. Resolve them - pick ONE path: (a) if the step's deliverable already exists on disk, mark it done (plan update step=N status=done); (b) if the step is no longer needed, mark it skipped; (c) if the plan drifted from reality (wrong file names, changed approach), re-plan to align it. Do NOT retry plan update repeatedly without changing anything.",
822
+ "exec.audit_incomplete": "❗ Final audit incomplete: {summary}. Task is NOT finished. Remaining steps: {steps}. Resolve them - pick ONE path: (a) if the step's deliverable already exists on disk, mark it done (plan_step step=N status=done); (b) if the step is no longer needed, mark it skipped; (c) if the plan drifted from reality (wrong file names, changed approach), re-plan to align it. Do NOT retry plan_step repeatedly without changing anything.",
784
823
  "exec.mass_edit_warning": "⚠️ Plan affects {count} files — review the full list before proceeding.",
785
824
  "exec.escalation": "\n\n⚠️ Agent stuck on step {stepId} ({description}). Escalating to user — please provide guidance.",
786
- "exec.escalation_directive": "You have been stuck for several attempts. Stop repeating the same action and pick ONE of these: (1) switch to a fundamentally different approach, (2) search the exact error text with web_search (or the error-search tool), (3) ask the user a short clarifying question, or (4) if the step cannot be completed, use plan update step=<n> status=skipped with a note (or re-plan). Explain your choice briefly.",
825
+ "exec.escalation_directive": "You have been stuck for several attempts. Stop repeating the same action and pick ONE of these: (1) switch to a fundamentally different approach, (2) search the exact error text with web_search (or the error-search tool), (3) ask the user a short clarifying question, or (4) if the step cannot be completed, use plan_step step=<n> status=skipped with a note (or re-plan). Explain your choice briefly.",
787
826
  "exec.test_churn_nudge": "You have edited the test/spec file \"{file}\" several times in a row without changing any production code. If the tests fail, fix the PRODUCTION code under test (not the test) unless the test itself is genuinely wrong — and if so, explain why. If you intended test-first, now write the implementation.",
788
827
  "exec.script_workaround_nudge": "A security restriction already blocked one of your commands. Writing a shell script (.bat/.cmd/.sh/.ps1) to run it another way does NOT lift the restriction and usually just fails. Instead: use write_file for file output, run one plain command per call, pass \"workdir\" instead of \"cd\", or ask the user.",
789
828
  "exec.hints": "\n[Hints]\n{hints}",
@@ -803,6 +842,8 @@
803
842
  "hall.unknown_paths": "Mentioned file paths not found in known files: {paths}",
804
843
  "hall.contradiction_llm": "Contradicts an earlier decision{reason}",
805
844
  "hall.claim_contradiction": "The answer claims success, but a recent tool result indicates a problem ({tool}: {snippet}). Either verify and fix, then re-run the check — or soften the claim to match the evidence (e.g. staged, will appear shortly).",
845
+ "hall.claim_artifact": "The answer presents {path} as done, but on disk: {detail}. Either fix the file and re-verify by actually reading it — or soften the claim to what was really checked.",
846
+ "hall.claim_output_unverified": "The answer shows output as if produced by a run ({detail}). Either execute it with an allowed tool and quote the real output — or label it clearly as expected/example output.",
806
847
  "hall.uncertainty_prefix": "\n\n[⚠️ Uncertainty] ",
807
848
  "browser.repeated_action": "You have repeated the same action ({action}) {threshold} times. Try a different approach: use \"snapshot\" to re-read the page, try different element numbers, or navigate to a different URL.",
808
849
  "browser.unknown_action": "Unknown action: {action}",
@@ -849,8 +890,6 @@
849
890
  "ui.thinking_label_3": "considering",
850
891
  "ui.action_fallback": "Action",
851
892
  "ui.actions_summary": "{count} actions",
852
- "ui.critic_concern": "verifier · {count} issue(s)",
853
- "ui.critic_repair": "verifier · repairing",
854
893
  "ui.plan_update": "step {step} → {status}",
855
894
  "ui.todo_action": "{action} · {count}",
856
895
  "ui.tool_running": "{tool}…",
@@ -957,10 +996,10 @@
957
996
  "cli.usage_empty": "No balance information returned.",
958
997
  "repl.ctrl_c_interrupt": "\n[Ctrl+C] Stopping agent... (press again to force)",
959
998
  "repl.force_exit": "\nForcing exit — background cleanup may be incomplete.",
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.",
999
+ "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
1000
  "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
1001
  "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.",
1002
+ "plan.subtasks_done": "All sub-tasks done — call plan_step step={stepId} status=done to complete this step.",
964
1003
  "plan.no_subtasks": "(no sub-tasks)",
965
1004
  "plan.step_label": "Step {stepId}: {description}",
966
1005
  "exec.hint_deps": "Check if a lock file exists (package-lock.json, poetry.lock). If missing, run the install command first.",
@@ -1008,6 +1047,8 @@
1008
1047
  "web.topbar.all_sessions": "all sessions",
1009
1048
  "web.topbar.sidebar": "sidebar",
1010
1049
  "web.topbar.close": "close",
1050
+ "web.sessbar.prev": "previous session",
1051
+ "web.sessbar.next": "next session",
1011
1052
  "web.conn.reconnecting": "reconnecting…",
1012
1053
  "web.sidebar.plan": "plan",
1013
1054
  "web.sidebar.session": "session",
@@ -1057,6 +1098,9 @@
1057
1098
  "config.key.moe.enabled": "MoE",
1058
1099
  "config.key.moe.maxReplanCycles": "MoE re-plan cycles",
1059
1100
  "config.key.critic.enabled": "verifier (critic)",
1101
+ "config.key.critic.model": "verifier model",
1102
+ "config.key.critic.provider": "verifier provider",
1103
+ "config.key.critic.tools": "verifier checks",
1060
1104
  "config.key.critic.maxCalls": "verifier max calls",
1061
1105
  "config.key.critic.maxRepairCycles": "verifier repair cycles",
1062
1106
  "config.key.critic.timeoutMs": "verifier timeout (ms)",
@@ -1077,6 +1121,13 @@
1077
1121
  "config.enum.verbose": "verbose",
1078
1122
  "config.enum.auto": "auto",
1079
1123
  "config.enum.default": "default",
1124
+ "config.enum.off": "off",
1125
+ "config.enum.line": "line",
1126
+ "config.enum.meta": "hints row",
1127
+ "config.enum.full": "full width",
1128
+ "config.enum.compact": "compact",
1129
+ "config.enum.comfortable": "comfortable",
1130
+ "config.enum.large": "large",
1080
1131
  "config.enum.none": "none",
1081
1132
  "config.enum.low": "low",
1082
1133
  "config.enum.medium": "medium",
@@ -1106,6 +1157,9 @@
1106
1157
  "config.desc.moe.enabled": "Agent-level MoE: plan → parallel experts → verify (uses the orchestrator provider).",
1107
1158
  "config.desc.moe.maxReplanCycles": "Max plan→execute→verify cycles before a partial result is accepted.",
1108
1159
  "config.desc.critic.enabled": "In-loop verifier that reviews work on mutations and before finishing.",
1160
+ "config.desc.critic.model": "Dedicated verifier model (empty = active model).",
1161
+ "config.desc.critic.provider": "Dedicated verifier provider config (empty = active provider).",
1162
+ "config.desc.critic.tools": "Let the verifier run bounded read-only file checks before the final verdict.",
1109
1163
  "config.desc.critic.maxCalls": "Hard cap on verifier LLM calls per run.",
1110
1164
  "config.desc.critic.maxRepairCycles": "Bounded repair cycles triggered by a critical verdict.",
1111
1165
  "config.desc.critic.timeoutMs": "Verifier call timeout (fail-open).",
@@ -1247,6 +1301,7 @@
1247
1301
  "web.settings.provider_type": "type",
1248
1302
  "web.settings.provider_label_field": "label",
1249
1303
  "web.settings.provider_baseurl": "base URL",
1304
+ "web.settings.provider_baseurl_custom": "custom URL…",
1250
1305
  "web.settings.provider_apikey": "API key",
1251
1306
  "web.settings.provider_key_keep": "leave blank to keep",
1252
1307
  "web.settings.provider_context": "context window",
@@ -1258,6 +1313,15 @@
1258
1313
  "web.settings.provider_cache_report": "cache report format",
1259
1314
  "web.settings.provider_cache_flags": "cache flags",
1260
1315
  "web.settings.provider_retry": "retry",
1316
+ "web.settings.provider_retry_max": "max retries",
1317
+ "web.settings.provider_retry_base": "retry base delay (ms)",
1318
+ "web.settings.provider_retry_maxdelay": "retry max delay (ms)",
1319
+ "web.settings.provider_flag.sessionHeader": "x-opencode-session header",
1320
+ "web.settings.provider_flag.requestCachePrompt": "cache_prompt (llama.cpp)",
1321
+ "web.settings.provider_flag.requestPromptCacheKey": "prompt_cache_key (OpenAI)",
1322
+ "web.settings.provider_flag.requestSessionId": "session_id (OpenRouter)",
1323
+ "web.settings.provider_flag.requestCacheControl": "cache_control (Anthropic)",
1324
+ "web.settings.provider_flag.requestStreamUsage": "stream usage chunk",
1261
1325
  "web.settings.provider_required": "type and base URL are required",
1262
1326
  "web.settings.provider_invalid": "invalid numeric value",
1263
1327
  "web.settings.provider_active_guard": "cannot delete the active provider — switch first",
@@ -1331,21 +1395,32 @@
1331
1395
  "web.selectors.model": "model",
1332
1396
  "web.selectors.provider": "provider",
1333
1397
  "web.selectors.context": "context",
1398
+ "web.selectors.reasoning": "reasoning",
1399
+ "web.selectors.switch_busy": "switch in progress, please wait",
1400
+ "web.selectors.reasoning_off": "off (backend ignores it)",
1334
1401
  "web.selectors.no_models": "no models",
1335
1402
  "web.selectors.refresh_list": "↻ refresh list",
1336
1403
  "web.selectors.custom": "custom…",
1337
1404
  "web.selectors.current": "current",
1338
1405
  "web.selectors.context_prompt": "context window (tokens)",
1406
+ "web.rail.working": "working",
1407
+ "web.rail.composing": "composing",
1408
+ "web.rail.no_plan": "no plan",
1409
+ "web.rail.step_of": "step {cur}/{total}",
1410
+ "web.rail.last": "last:",
1411
+ "web.rail.none": "—",
1412
+ "web.rail.tools_one": "{count} tool",
1413
+ "web.rail.tools_many": "{count} tools",
1414
+ "web.rail.tools_few": "{count} tools",
1415
+ "web.rail.events_one": "{count} event",
1416
+ "web.rail.events_many": "{count} events",
1417
+ "web.rail.events_few": "{count} events",
1339
1418
  "web.action.thinking": "thinking",
1340
1419
  "web.action.hide": "hide",
1341
1420
  "web.action.show": "show",
1342
1421
  "web.action.actions_one": "{count} action",
1343
1422
  "web.action.actions_few": "{count} actions",
1344
1423
  "web.action.actions_many": "{count} actions",
1345
- "web.critic_concern_one": "Verifier: {count} note",
1346
- "web.critic_concern_few": "Verifier: {count} notes",
1347
- "web.critic_concern_many": "Verifier: {count} notes",
1348
- "web.critic_repair": "Verifier flagged a problem — repairing",
1349
1424
  "web.action.cancel": "cancel",
1350
1425
  "web.cmdk.label": "commands",
1351
1426
  "web.command.help": "list web commands",
@@ -1383,6 +1458,12 @@
1383
1458
  "web.msg.copy": "copy",
1384
1459
  "web.msg.copy_md": "copy as markdown",
1385
1460
  "web.card.open": "open ↗",
1461
+ "web.card.download": "download ⤓",
1462
+ "web.card.copy_path": "copy path",
1463
+ "web.card.open_title": "Preview in a browser tab",
1464
+ "web.card.download_title": "Download the file",
1465
+ "web.card.copy_title": "Copy the workspace path",
1466
+ "web.card.drawio_hint": "Draw.io diagram is XML — preview shows code; open it in draw.io / VS Code to see the scheme.",
1386
1467
  "web.card.screenshot": "screenshot",
1387
1468
  "web.card.attached_image": "attached image",
1388
1469
  "web.card.browser_viewport": "browser · viewport",
@@ -1395,7 +1476,7 @@
1395
1476
  "web.file.error.outside_workspace": "This file is outside the agent workspace and cannot be opened.",
1396
1477
  "web.file.error.protected_path": "This file is protected (secrets/VCS) and cannot be opened.",
1397
1478
  "web.file.error.too_large": "File is too large to open in the browser ({limit} bytes max).",
1398
- "web.file.error.binary_file": "This looks like a binary file and cannot be shown as text.",
1479
+ "web.file.error.binary_file": "This looks like a binary file and cannot be shown as text — download it with the Download button.",
1399
1480
  "web.file.error.not_found": "File not found (it may be a directory or it was deleted).",
1400
1481
  "web.file.error.workspace_unavailable": "No workspace is open.",
1401
1482
  "web.setup.title": "Set up MMA",
@@ -1506,10 +1587,14 @@
1506
1587
  "config.desc.sessionIsolation.isolateTempFiles": "Give each session its own temp-file directory.",
1507
1588
  "config.key.ui.spinner": "spinner",
1508
1589
  "config.desc.ui.spinner": "Animate a progress spinner while tools run.",
1590
+ "config.key.ui.activityRail": "activity rail",
1591
+ "config.desc.ui.activityRail": "Indicator above the input line while the agent works.",
1509
1592
  "config.key.ui.showContextStats": "context stats",
1510
1593
  "config.desc.ui.showContextStats": "Show context usage stats after each turn.",
1511
1594
  "config.key.ui.showCompaction": "compaction notice",
1512
1595
  "config.desc.ui.showCompaction": "Notify in chat when history compaction runs.",
1596
+ "config.key.ui.fontSize": "font size",
1597
+ "config.desc.ui.fontSize": "Web chat font size (web only, the terminal is unaffected).",
1513
1598
  "config.key.retry.maxRetries": "max retries",
1514
1599
  "config.desc.retry.maxRetries": "Max retries for failed LLM requests (0-10).",
1515
1600
  "config.key.retry.baseDelay": "retry base delay",
@@ -1,3 +1,4 @@
1
+ // i18n: плоские словари en/ru, t(key, params) с фолбэком на английский.
1
2
  import en from "./en.json";
2
3
  import ru from "./ru.json";
3
4
  const locales = { en, ru };
@@ -22,25 +23,58 @@ const flat = {};
22
23
  for (const [name, dict] of Object.entries(locales)) {
23
24
  flat[name] = flatten(dict);
24
25
  }
26
+ /**
27
+ * Переключает текущую локаль. Неизвестное имя игнорируется.
28
+ * @param locale имя локали ("en" | "ru").
29
+ */
25
30
  export function setLocale(locale) {
26
31
  if (flat[locale]) {
27
32
  currentLocale = locale;
28
33
  }
29
34
  }
35
+ /**
36
+ * Плоские словари по именам локалей. Нужны веб-API, чтобы отдать все переводы
37
+ * в браузер для локализации его интерфейса. Только чтение — не мутировать.
38
+ */
39
+ export function getFlatDicts() {
40
+ return flat;
41
+ }
42
+ /**
43
+ * Подменяет/добавляет словарь локали в рантайме (плагины, тесты).
44
+ * @param name имя локали; @param dict вложенный словарь переводов.
45
+ */
30
46
  export function loadLocale(name, dict) {
31
47
  locales[name] = dict;
32
48
  flat[name] = flatten(dict);
33
49
  }
50
+ /**
51
+ * Ставит обработчик отсутствующих ключей (debug-диагностика). Подключается
52
+ * из bootstrap на logger.debug, чтобы не тянуть логер в i18n (циклы).
53
+ */
54
+ let missingKeyReporter;
55
+ export function setMissingKeyReporter(reporter) {
56
+ missingKeyReporter = reporter;
57
+ }
58
+ /**
59
+ * Переводит ключ с подстановкой `{params}`. Нет ключа — вернёт сам ключ.
60
+ * @param key точечный ключ; @param params значения подстановок.
61
+ */
34
62
  export function t(key, params) {
35
63
  const localeDict = flat[currentLocale];
36
- const enDict = flat["en"];
37
- let template = localeDict?.[key] ?? enDict?.[key] ?? key;
64
+ const enDict = flat.en;
65
+ const template = localeDict?.[key] ?? enDict?.[key];
66
+ if (template === undefined) {
67
+ missingKeyReporter?.(key);
68
+ return key;
69
+ }
38
70
  if (!template)
39
71
  return key;
40
72
  if (params) {
73
+ let result = template;
41
74
  for (const [k, v] of Object.entries(params)) {
42
- template = template.replaceAll(`{${k}}`, String(v));
75
+ result = result.replaceAll(`{${k}}`, String(v));
43
76
  }
77
+ return result;
44
78
  }
45
79
  return template;
46
80
  }