micro-models-agent 0.60.1 → 0.61.1

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 (233) hide show
  1. package/CHANGELOG.md +601 -584
  2. package/README.md +358 -358
  3. package/dist/certification/certifications.json +493 -493
  4. package/dist/cli/commands.js +447 -0
  5. package/dist/cli/completer.js +167 -0
  6. package/dist/cli/index.js +2 -0
  7. package/dist/cli/main.js +153 -0
  8. package/dist/cli/plugin-commands.js +36 -0
  9. package/dist/cli/repl-commands.js +761 -0
  10. package/dist/cli/repl.js +702 -0
  11. package/dist/cli/run-result.js +33 -0
  12. package/dist/cli/security-commands.js +164 -0
  13. package/dist/cli/setup.js +237 -0
  14. package/dist/config/config.js +276 -0
  15. package/dist/config/defaults.js +141 -0
  16. package/dist/config/domains.js +179 -0
  17. package/dist/config/experts.js +15 -0
  18. package/dist/config/index.js +4 -0
  19. package/dist/config/security.js +213 -0
  20. package/dist/config/types.js +1 -0
  21. package/dist/core/agent-moe.js +102 -0
  22. package/dist/core/agent.js +1018 -0
  23. package/dist/core/bootstrap.js +481 -0
  24. package/dist/core/crash-handler.js +51 -0
  25. package/dist/core/environment.js +199 -0
  26. package/dist/core/index.js +2 -0
  27. package/dist/core/prompt-builder.js +76 -0
  28. package/dist/core/session-logger.js +251 -0
  29. package/dist/core/types.js +1 -0
  30. package/dist/core/version.js +26 -0
  31. package/dist/core/workspace.js +76 -0
  32. package/dist/i18n/en.json +757 -746
  33. package/dist/i18n/index.js +46 -0
  34. package/dist/i18n/ru.json +757 -746
  35. package/dist/index.js +22 -0
  36. package/dist/llm/image-utils.js +143 -0
  37. package/dist/llm/index.js +4 -0
  38. package/dist/llm/model-loader.js +78 -0
  39. package/dist/llm/openai-compat.js +497 -0
  40. package/dist/llm/orchestrator.js +200 -0
  41. package/dist/llm/provider.js +10 -0
  42. package/dist/llm/response.js +39 -0
  43. package/dist/llm/token-counter.js +39 -0
  44. package/dist/llm/types.js +1 -0
  45. package/dist/logger/app-logger.js +189 -0
  46. package/dist/logger/file-log.js +151 -0
  47. package/dist/logger/index.js +1 -0
  48. package/dist/main.js +503 -340
  49. package/dist/migration/backup.js +45 -0
  50. package/dist/migration/detect.js +50 -0
  51. package/dist/migration/index.js +2 -0
  52. package/dist/modules/artifacts/store.js +61 -0
  53. package/dist/modules/browser/actions.js +76 -0
  54. package/dist/modules/browser/bridge-client.js +199 -0
  55. package/dist/modules/browser/bridge-path.js +10 -0
  56. package/dist/modules/browser/bridge-server.mjs +219 -219
  57. package/dist/modules/browser/cookie-store.js +24 -0
  58. package/dist/modules/browser/driver.js +136 -0
  59. package/dist/modules/browser/index.js +7 -0
  60. package/dist/modules/browser/module.js +29 -0
  61. package/dist/modules/browser/session.js +342 -0
  62. package/dist/modules/browser/snapshot.js +148 -0
  63. package/dist/modules/browser/types.js +12 -0
  64. package/dist/modules/certification/cli.js +213 -0
  65. package/dist/modules/certification/fact-checker.js +82 -0
  66. package/dist/modules/certification/loader.js +106 -0
  67. package/dist/modules/certification/manifest.js +58 -0
  68. package/dist/modules/certification/runner.js +245 -0
  69. package/dist/modules/certification/scenarios.js +407 -0
  70. package/dist/modules/certification/types.js +1 -0
  71. package/dist/modules/context/chunk-query.js +100 -0
  72. package/dist/modules/context/fact-extractor.js +168 -0
  73. package/dist/modules/context/history.js +15 -0
  74. package/dist/modules/context/index.js +1 -0
  75. package/dist/modules/context/manager.js +440 -0
  76. package/dist/modules/execution/audit-runners.js +206 -0
  77. package/dist/modules/execution/auditor.js +218 -0
  78. package/dist/modules/execution/execution-plugin.js +431 -0
  79. package/dist/modules/execution/index.js +8 -0
  80. package/dist/modules/execution/module.js +625 -0
  81. package/dist/modules/execution/moe-executor.js +304 -0
  82. package/dist/modules/execution/plan-coverage.js +68 -0
  83. package/dist/modules/execution/plan-persister.js +46 -0
  84. package/dist/modules/execution/plan-store.js +196 -0
  85. package/dist/modules/execution/plan-tool.js +677 -0
  86. package/dist/modules/execution/plan-validator.js +153 -0
  87. package/dist/modules/execution/planner.js +94 -0
  88. package/dist/modules/execution/stuck-detector.js +746 -0
  89. package/dist/modules/execution/tracker.js +69 -0
  90. package/dist/modules/execution/types.js +1 -0
  91. package/dist/modules/execution/verifier.js +235 -0
  92. package/dist/modules/execution/windows-commands.js +41 -0
  93. package/dist/modules/hallucination/confidence.js +66 -0
  94. package/dist/modules/hallucination/consistency.js +26 -0
  95. package/dist/modules/hallucination/detector.js +47 -0
  96. package/dist/modules/hallucination/factual.js +169 -0
  97. package/dist/modules/hallucination/index.js +5 -0
  98. package/dist/modules/hallucination/js-identifiers.js +262 -0
  99. package/dist/modules/hallucination/llm-judge.js +101 -0
  100. package/dist/modules/index.js +5 -0
  101. package/dist/modules/indexer/cache.js +40 -0
  102. package/dist/modules/indexer/index.js +3 -0
  103. package/dist/modules/indexer/module.js +246 -0
  104. package/dist/modules/indexer/project-profile.js +183 -0
  105. package/dist/modules/indexer/walker.js +101 -0
  106. package/dist/modules/lsp/check-tool.js +58 -0
  107. package/dist/modules/lsp/client.js +389 -0
  108. package/dist/modules/lsp/command.js +60 -0
  109. package/dist/modules/lsp/config.js +135 -0
  110. package/dist/modules/lsp/index.js +3 -0
  111. package/dist/modules/lsp/module.js +260 -0
  112. package/dist/modules/lsp/probe.js +86 -0
  113. package/dist/modules/lsp/project-root.js +32 -0
  114. package/dist/modules/lsp/startup-check.js +144 -0
  115. package/dist/modules/lsp/types.js +1 -0
  116. package/dist/modules/mcp/client.js +399 -0
  117. package/dist/modules/mcp/index.js +3 -0
  118. package/dist/modules/mcp/module.js +142 -0
  119. package/dist/modules/mcp/registry.js +15 -0
  120. package/dist/modules/memory/index.js +1 -0
  121. package/dist/modules/memory/module.js +96 -0
  122. package/dist/modules/memory/search.js +42 -0
  123. package/dist/modules/memory/store.js +69 -0
  124. package/dist/modules/pipelines/engine.js +60 -0
  125. package/dist/modules/pipelines/index.js +3 -0
  126. package/dist/modules/pipelines/parser.js +56 -0
  127. package/dist/modules/pipelines/template.js +14 -0
  128. package/dist/modules/plugins/builtin/lint-on-write.js +334 -0
  129. package/dist/modules/plugins/builtin/notify.js +9 -0
  130. package/dist/modules/plugins/index.js +1 -0
  131. package/dist/modules/plugins/loader.js +70 -0
  132. package/dist/modules/plugins/manager.js +261 -0
  133. package/dist/modules/plugins/types.js +1 -0
  134. package/dist/modules/pricing/index.js +61 -0
  135. package/dist/modules/pricing/prices.js +129 -0
  136. package/dist/modules/processes/detect.js +34 -0
  137. package/dist/modules/processes/index.js +2 -0
  138. package/dist/modules/processes/registry.js +327 -0
  139. package/dist/modules/processes/runner.js +23 -0
  140. package/dist/modules/providers/create.js +22 -0
  141. package/dist/modules/providers/fallback.js +79 -0
  142. package/dist/modules/providers/health.js +46 -0
  143. package/dist/modules/providers/index.js +5 -0
  144. package/dist/modules/providers/manager.js +161 -0
  145. package/dist/modules/providers/presets.js +128 -0
  146. package/dist/modules/providers/registry.js +22 -0
  147. package/dist/modules/providers/types.js +1 -0
  148. package/dist/modules/registry.js +48 -0
  149. package/dist/modules/security/audit-log.js +136 -0
  150. package/dist/modules/security/audit-notifier.js +292 -0
  151. package/dist/modules/security/command-validator.js +219 -0
  152. package/dist/modules/security/content-scanner.js +53 -0
  153. package/dist/modules/security/data-sanitizer.js +89 -0
  154. package/dist/modules/security/encryption.js +242 -0
  155. package/dist/modules/security/index.js +14 -0
  156. package/dist/modules/security/network-validator.js +88 -0
  157. package/dist/modules/security/path-validator.js +203 -0
  158. package/dist/modules/security/rate-limiter.js +119 -0
  159. package/dist/modules/security/security-policies.js +531 -0
  160. package/dist/modules/security/session-encryption.js +210 -0
  161. package/dist/modules/security/session-isolation.js +95 -0
  162. package/dist/modules/session/index.js +3 -0
  163. package/dist/modules/session/manager.js +172 -0
  164. package/dist/modules/session/module.js +24 -0
  165. package/dist/modules/session/store.js +222 -0
  166. package/dist/modules/session/types.js +1 -0
  167. package/dist/modules/skills/index.js +2 -0
  168. package/dist/modules/skills/loader.js +72 -0
  169. package/dist/modules/skills/matcher.js +27 -0
  170. package/dist/modules/skills/module.js +129 -0
  171. package/dist/modules/types.js +1 -0
  172. package/dist/modules/updater/checker.js +96 -0
  173. package/dist/modules/updater/index.js +2 -0
  174. package/dist/modules/updater/module.js +116 -0
  175. package/dist/modules/user-profile/compressor.js +16 -0
  176. package/dist/modules/user-profile/index.js +1 -0
  177. package/dist/modules/user-profile/profile.js +68 -0
  178. package/dist/skills/builtin/git.md +36 -36
  179. package/dist/skills/builtin/typescript.md +35 -35
  180. package/dist/tools/approve.js +33 -0
  181. package/dist/tools/attach-image.js +101 -0
  182. package/dist/tools/bash.js +519 -0
  183. package/dist/tools/browser.js +115 -0
  184. package/dist/tools/chunk-query.js +100 -0
  185. package/dist/tools/create-dir.js +56 -0
  186. package/dist/tools/delete-file.js +63 -0
  187. package/dist/tools/download-file.js +117 -0
  188. package/dist/tools/edit-file.js +80 -0
  189. package/dist/tools/enable-tools.js +59 -0
  190. package/dist/tools/executor.js +154 -0
  191. package/dist/tools/file-info.js +47 -0
  192. package/dist/tools/filter-tools.js +17 -0
  193. package/dist/tools/glob-tool.js +27 -0
  194. package/dist/tools/grep-tool.js +125 -0
  195. package/dist/tools/hidden-tools-block.js +37 -0
  196. package/dist/tools/index.js +78 -0
  197. package/dist/tools/list-dir.js +49 -0
  198. package/dist/tools/load-skill.js +43 -0
  199. package/dist/tools/mcp-call.js +69 -0
  200. package/dist/tools/move-file.js +86 -0
  201. package/dist/tools/path-utils.js +101 -0
  202. package/dist/tools/pipeline-run.js +145 -0
  203. package/dist/tools/preview.js +2 -0
  204. package/dist/tools/process-kill.js +40 -0
  205. package/dist/tools/process-list.js +37 -0
  206. package/dist/tools/process-log.js +54 -0
  207. package/dist/tools/question.js +141 -0
  208. package/dist/tools/read-file.js +179 -0
  209. package/dist/tools/recall.js +118 -0
  210. package/dist/tools/registry.js +47 -0
  211. package/dist/tools/remember.js +68 -0
  212. package/dist/tools/scope-check.js +32 -0
  213. package/dist/tools/search-history.js +85 -0
  214. package/dist/tools/subagent.js +196 -0
  215. package/dist/tools/types.js +1 -0
  216. package/dist/tools/user-input.js +123 -0
  217. package/dist/tools/web-browse.js +87 -0
  218. package/dist/tools/web-fetch.js +119 -0
  219. package/dist/tools/web-search.js +105 -0
  220. package/dist/tools/write-file.js +82 -0
  221. package/dist/ui/box.js +77 -0
  222. package/dist/ui/colors.js +4 -0
  223. package/dist/ui/diff.js +178 -0
  224. package/dist/ui/index.js +6 -0
  225. package/dist/ui/line-editor.js +822 -0
  226. package/dist/ui/line-math.js +73 -0
  227. package/dist/ui/md-formatter.js +212 -0
  228. package/dist/ui/output.js +13 -0
  229. package/dist/ui/plan-view.js +103 -0
  230. package/dist/ui/renderer.js +259 -0
  231. package/dist/ui/spinner.js +70 -0
  232. package/dist/ui/table.js +144 -0
  233. package/package.json +51 -51
package/dist/i18n/en.json CHANGED
@@ -1,746 +1,757 @@
1
- {
2
- "file.created": "Created {path}",
3
- "file.deleted": "Deleted {path}",
4
- "file.updated": "Updated {path}",
5
- "file.written": "Written {path}",
6
- "file.syntax_error": "Syntax error in {path}:\n{error}\n\nFile was NOT written. Fix the syntax error and try again.",
7
- "file.notfound": "File not found: {path}\nThis does NOT mean the project is missing — the path may be wrong. Run list_dir on the working directory first; create files only after confirming what exists.",
8
- "file.dir_notfound": "Directory not found: {path}",
9
- "file.path_not_allowed": "Path not allowed: {path}",
10
- "file.path_not_allowed_short": "Path not allowed",
11
- "file.is_directory": "Is a directory, use rmdir: {path}",
12
- "file.replaced_in": "Replaced in {path}",
13
- "file.string_not_found": "String not found in file:\n{str}\n\nUse read_file on {path} to see the current content before editing — the target may differ (whitespace, line endings) or was already replaced.",
14
- "file.moved": "Moved {from} → {to}",
15
- "file.not_found_short": "Not found: {path}",
16
- "file.notfound_resolved": "File not found: {path} (resolved to {resolved})\nThe path was joined onto the working directory because it does not exist as given. Run list_dir to find the correct path.",
17
- "file.empty": "(empty)",
18
- "file.no_matches": "No matches",
19
- "file.truncated": "\n... (truncated)",
20
- "file.read_header": "── {path} ({ext}, {total} lines, lines {from}-{to})",
21
- "file.read_range": "lines {from}-{to} of {total}",
22
- "file.read_truncated": "\n\n[Truncated: {remaining} more lines. Use read_file with offset={next} to continue]",
23
- "file.empty_page": "(empty page)",
24
- "error.timeout": "Request timed out",
25
- "error.unknown": "An unknown error occurred",
26
- "error.notfound": "Not found: {path}",
27
- "error.prefix": "Error: ",
28
- "error.command_error": "Command error: {message}",
29
- "error.llm": "LLM error: {message}",
30
- "error.response_blocked": "Response blocked: {reason}",
31
- "error.max_iters": "Max iterations ({max}) reached",
32
- "error.empty_response": "Model returned an empty response after retries",
33
- "error.audit_failed": "Task could not be verified as complete: {summary}",
34
- "error.grep_failed": "Grep failed: {message}",
35
- "error.search_failed": "Search failed: {message}",
36
- "error.fetch_failed": "Fetch failed: {message}",
37
- "error.fetch_url_failed": "Failed to fetch {url}: {message}",
38
- "error.http": "HTTP {status}: {statusText}",
39
- "error.llm_api": "LLM API error {status} ({statusText}): {errorText}",
40
- "error.llm_retries": "LLM request failed after retries",
41
- "error.llm_429": "Rate limit exceeded (HTTP 429) for {model} on {baseUrl}. The provider is throttling requests — free models are especially strict. Get an API key or switch to a paid/faster model: {baseUrl}",
42
- "error.no_response_body": "No response body stream",
43
- "error.llm_stream_idle": "LLM stream stalled — no data for {timeout}ms. If the provider buffers streaming (e.g. LM Studio) or generates very long tool calls, raise \"retry.noDataTimeoutMs\" in ~/.mma/config.json (restart required)",
44
- "error.llm_stream_idle_toolcall": "LLM stream stalled after a tool_call started — no data for {timeout}ms. The provider most likely buffers SSE instead of streaming tool-call argument deltas (seen with LM Studio). Raise \"retry.noDataTimeoutMs\" in ~/.mma/config.json (restart required)",
45
- "error.llm_truncated": "Response hit the completion token limit ({tokens}) and was cut off before any content arrived. Split the task into smaller outputs or raise \"maxCompletionTokens\" in the config",
46
- "error.llm_truncated_toolcall": "Response hit the completion token limit ({tokens}) in the middle of a tool_call — its arguments were cut off. Write the file in smaller chunks (several write_file/edit_file calls) or raise \"maxCompletionTokens\" in the config",
47
- "error.llm_provider_stream_error": "Provider returned an error mid-stream: {error}",
48
- "error.llm_timeout": "LLM request timed out ({timeout}ms)",
49
- "env.runtime_node": "Running under Node (v{version}) — clipboard image paste, subagent performance and LSP spawn on Windows degrade. Install Bun (https://bun.sh) for full features.",
50
- "env.runtime_old": "Runtime version {version} is below the required engines {engine}.",
51
- "env.tool_missing": "Tool not found on PATH: {tool}",
52
- "env.playwright_missing": "Playwright package is not installed — the browser tool will fail. Install with: bun add playwright",
53
- "env.playwright_browsers_missing": "Playwright browsers not downloaded ({dir}). The browser tool will fail. Install with: bunx playwright install chromium",
54
- "env.crash_stderr": "MMA crashed ({type}): {message} — crash report written to ~/.mma/logs/crash.jsonl",
55
- "env.model_autoload_failed": "Model auto-load failed: {error}. Continuing with manual load.",
56
- "env.model_loaded": "Model {model} loaded in {seconds}s",
57
- "env.reasoning_probe": "Reasoning probe: strategy={strategy} → {result}",
58
- "env.reasoning_respected": "mechanism respected",
59
- "env.reasoning_ignored": "mechanism IGNORED",
60
- "env.indexing": "Indexing project files…",
61
- "env.indexed": "Indexed {files} file(s) for the project map",
62
- "env.indexing_failed": "Project indexing failed: {error}",
63
- "env.index_skip_unreadable": "indexer: skipping unreadable entry \"{path}\"",
64
- "env.killed_processes": "Killed {count} background process(es) on shutdown",
65
- "session.started": "Session started: {id}",
66
- "session.ended": "Session ended: {id}",
67
- "session.not_found": "Session not found: {id}",
68
- "session.no_active": "No active session",
69
- "session.deleted": "Session deleted: {id}",
70
- "session.renamed": "Session renamed to: {name}",
71
- "session.created": "Created session: {name}",
72
- "session.resumed": "Resumed session: {name}",
73
- "session.chat_cleared": "Chat cleared. Start typing to begin.",
74
- "session.chat_loaded": "Chat history loaded. Pick up where you left off.",
75
- "session.chat_history": "Chat history:",
76
- "session.user_label": "User",
77
- "session.assistant_label": "Assistant",
78
- "session.no_history": "Chat history is empty",
79
- "session.no_sessions": "No sessions found",
80
- "session.no_sessions_hint": "No sessions found. Create one with /new <name>",
81
- "session.available": "Available sessions:",
82
- "session.no_match": "No session matching \"{query}\"",
83
- "session.default_name": "Session {date}",
84
- "session.info_full": "[Session: \"{name}\" ({id}) | model: {model} | context: {contextWindow} tokens]",
85
- "session.col_active": "",
86
- "session.col_id": "ID",
87
- "session.col_name": "Name",
88
- "session.col_updated": "Updated",
89
- "session.col_msgs": "Msgs",
90
- "tool.executed": "Executed {name}",
91
- "tool.failed": "Tool {name} failed: {error}",
92
- "tool.unknown": "Unknown tool: {name}",
93
- "tool.blocked": "Blocked by plugin: {plugin}",
94
- "tool.blocked_reason": "Blocked by plugin: {plugin}. Reason: {reason}",
95
- "tool.using": "[{label}]",
96
- "tool.friendly.write_file": "Writing file",
97
- "tool.friendly.read_file": "Reading file",
98
- "tool.friendly.edit_file": "Editing file",
99
- "tool.friendly.create_dir": "Creating directory",
100
- "tool.friendly.delete_file": "Deleting file",
101
- "tool.friendly.move_file": "Moving file",
102
- "tool.friendly.list_dir": "Listing files",
103
- "tool.friendly.file_info": "File info",
104
- "tool.friendly.glob": "Searching files",
105
- "tool.friendly.grep": "Searching content",
106
- "tool.friendly.bash": "Running command",
107
- "bash.echo_write_blocked": "Writing files via echo/printf is unreliable in Windows cmd.exe (quotes and multi-line break). Use the write_file tool instead (target: {path}).",
108
- "tool.friendly.load_skill": "Loading skill",
109
- "tool.friendly.plan": "Planning",
110
- "tool.friendly.todo": "Updating tasks",
111
- "tool.friendly.verify": "Verifying",
112
- "tool.friendly.web_search": "Web search",
113
- "tool.friendly.web_fetch": "Fetching page",
114
- "tool.friendly.web_browse": "Browsing page",
115
- "tool.friendly.download_file": "Downloading file",
116
- "tool.friendly.chunk_query": "Querying chunks",
117
- "tool.web_fetch_result": "Fetched page: {url} — {chars} chars, {lines} lines{truncated}",
118
- "tool.web_browse_result": "Browsed page: {url} — {chars} chars, {lines} lines{truncated}",
119
- "tool.web_search_result": "Search results for \"{query}\" — {count} results",
120
- "tool.downloaded": "Downloaded {url} → {path} ({size} bytes, {type})",
121
- "tool.download_too_large": "Download blocked: file exceeds the {max} bytes limit",
122
- "tool.friendly.browser": "Browser",
123
- "tool.friendly.subagent": "Sub-agent task",
124
- "tool.friendly.question": "Question to user",
125
- "tool.friendly.approve": "Approval request",
126
- "tool.friendly.search_history": "Searching history",
127
- "tool.friendly.pipeline_run": "Running pipeline",
128
- "tool.friendly.mcp_call": "MCP call",
129
- "tool.friendly.lsp_check": "Checking code",
130
- "tool.truncated": "[Truncated: {tokens} tokens removed]",
131
- "tool.subagent_queued": "Sub-agent task queued: {task}",
132
- "tool.subagent_artifact": "Sub-agent completed. Full result saved to artifact: {path}\nIterations: {iterations}\nSummary:\n{summary}",
133
- "tool.pipeline_started": "Pipeline \"{name}\" execution started. Pipeline engine is a stub — run dispatched.",
134
- "tool.mcp_call": "MCP call: {server}/{tool} with {args}",
135
- "tool.action_required": "Action is required.",
136
- "tool.approve_prompt": "Approve? {action}",
137
- "tool.approve_yes": "Yes",
138
- "tool.approve_yes_desc": "Approve the action",
139
- "tool.approve_no": "No",
140
- "tool.approve_no_desc": "Reject the action",
141
- "tool.approved": "Approved",
142
- "tool.rejected": "Rejected by user",
143
- "tool.user_input.custom_option": "Type your own answer",
144
- "tool.user_input.choice_single": "Your choice (1-{max}): ",
145
- "tool.user_input.choice_multiple": "Your choice (comma-separated, e.g. 1,3): ",
146
- "tool.user_input.invalid": "Invalid choice, try again.",
147
- "tool.user_input.custom_prompt": "Your answer: ",
148
- "tool.question.progress": "Question {current}/{total}",
149
- "tool.question.no_questions": "No questions provided",
150
- "tool.question.unanswered": "Unanswered",
151
- "tool.question.answered": "User has answered your questions: {formatted}. You can now continue with the user's answers in mind.",
152
- "tool.name_or_task": "Provide either \"name\" or \"task\" parameter",
153
- "tool.chunk_query_no_query": "chunk_query: a query string is required.",
154
- "tool.chunk_query_no_input": "chunk_query: provide input_path or text.",
155
- "tool.invalid_params": "Invalid parameters",
156
- "tool.skill_budget": "Skill \"{name}\" loaded ({tokens} tokens, {remaining} remaining in skills budget). Skill content is now in system prompt — no need to reload after context compaction.",
157
- "tool.skill_available_hint": "Available skills",
158
- "tool.no_results": "No results found for \"{query}\"",
159
- "tool.search_results": "Search results for \"{query}\":\n{results}",
160
- "tool.web_search_disabled": "Web search is disabled (webSearch.enabled: false). Use file/system tools only.",
161
- "tool.history_results": "History results for \"{query}\":\n{results}",
162
- "tool.no_history": "No history entries matching \"{query}\"",
163
- "tool.no_sessions_dir": "No sessions directory found at {dir}",
164
- "tool.history_error": "Error searching history: {error}",
165
- "tool.memory_error": "Memory error: {error}",
166
- "tool.screenshot_unavailable": "[Screenshot captured — image not available for text-only model]",
167
- "tool.timeout": "Tool {name} timed out after {seconds} seconds",
168
- "tool.aborted": "Tool {name} was interrupted by user",
169
- "tool.interactive_disabled": "Interactive tool is disabled in exit-on-complete mode. Proceed without asking the user.",
170
- "proc.started": "Started background process {id} (PID {pid}).\nCommand: {command}",
171
- "proc.promoted_hint": "Command still running after {ms} ms — moved to the background",
172
- "proc.manage_hint": "Check output: process_log id={id}. Stop it: process_kill id={id}. List all: process_list.",
173
- "proc.output_preview": "First output:\n{lines}",
174
- "proc.none": "No background processes running.",
175
- "proc.not_found": "Process not found: {id}",
176
- "proc.missing_id": "Provide the process id: process_kill id=proc_xxx (the id is returned by bash when a command goes to the background, or by process_list).",
177
- "proc.missing_id_list": "No background processes are currently running.",
178
- "proc.killed": "Process {id} (PID {pid}) killed.",
179
- "proc.kill_failed": "Failed to kill process {id}",
180
- "proc.list_header": "Background processes",
181
- "proc.log_header": "Process {id} ({status}) output:",
182
- "proc.log_empty": "(no output yet)",
183
- "proc.hint": "Manage them with {list}, {log}, {kill}.",
184
- "proc.status_running": "running",
185
- "proc.status_exited": "exited",
186
- "proc.status_killed": "killed",
187
- "tool.friendly.process_list": "Listing background processes",
188
- "tool.friendly.process_log": "Process output",
189
- "tool.friendly.process_kill": "Stopping process",
190
- "plan.no_steps": "No plan steps specified. Provide concrete steps with files and commands.",
191
- "plan.created": "Plan created: {title} ({steps} steps)",
192
- "plan.coverage_warning": "Plan may be missing required files from the task: {missing}. Add steps covering them.",
193
- "plan.step_done": "Step {n}/{total}: {description} ✓",
194
- "plan.complete": "Task complete: {summary}",
195
- "plan.title_steps": "Plan \"{title}\" created with {count} steps",
196
- "plan.step_marked": "Step {step} marked as {status}",
197
- "plan.aborted": "Plan aborted",
198
- "plan.completed_archived": "Plan {id} is complete ({done}/{total} steps) — archived. You may create a new plan for new work (plan create), or reply with your final answer.",
199
- "plan.unknown_action": "Unknown plan action: {action}",
200
- "plan.updated": "Plan updated: {title} ({steps} steps)",
201
- "plan.acknowledged": "Plan {action}: acknowledged",
202
- "plan.step_status": "Step {step}: {status}",
203
- "plan.no_active": "No active plan",
204
- "plan.step_not_found": "Step not found",
205
- "plan.step_already_done": "Step {step} is already done — nothing to do. Plan progress:",
206
- "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.",
207
- "plan.deliverables_missing": "Cannot mark step {step} done: the files it names do not exist yet: {files}. Create these files first (or mark the step status=skipped if they are not actually needed).",
208
- "plan.kinds_mismatch": "kinds array length must match steps",
209
- "plan.kinds_invalid": "Invalid step kind(s): {kinds}. Use \"create\" or \"delete\".",
210
- "plan.kinds_not_array": "kinds must be an array of \"create\" or \"delete\"",
211
- "plan.deliverables_remain": "Cannot mark step {step} done: the files it names still exist: {files}. This step is kind=delete — delete these files first (or set status=skipped if they should stay).",
212
- "plan.typecheck_failed": "Cannot mark step {step} done: the last check still reports a compile error:\n{error}\nFix the error and re-edit the file (a clean write clears the failure), or mark the step status=skipped if it is not needed.",
213
- "plan.show_header": "Plan status:",
214
- "plan.show_empty": "(plan has no steps)",
215
- "plan.list_header": "Plans:",
216
- "plan.list_empty": "No plans",
217
- "plan.switch_no_id": "Provide a plan id to switch to",
218
- "plan.not_found": "Plan not found: {id}",
219
- "plan.switched": "Switched to plan {id}: {title}",
220
- "plan.replanned": "Plan re-planned: {kept} completed steps kept, {steps} new steps added",
221
- "plan.replan_no_steps": "Provide new steps for re-planning",
222
- "plan.active_in_progress": "Cannot create a new plan: active plan {id} already has progress ({done}/{total} done, current: step {current}). Resume it — use \"plan show\" to view, then continue working. To replace it, call \"plan abort\" first, then \"plan create\" again.",
223
- "plan.id_ignored": "note: plan ids are auto-generated; use \"plan switch\" to activate an existing plan by id.",
224
- "plan.existing_fresh": "note: the previous active plan had no progress and was preserved as a draft.",
225
- "plan.already_active": "Plan {id} is already active — nothing to switch.",
226
- "plan.already_archived": "Plan {id} is already archived — nothing to abort.",
227
- "plan.aborted_id": "Plan {id} aborted and archived.",
228
- "plan.delete_no_id": "Provide a plan id to delete (plan delete id=plan_xxx).",
229
- "plan.deleted": "Plan {id} deleted permanently.",
230
- "plan.purged": "Deleted {count} plan(s). Plan storage is empty.",
231
- "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.",
232
- "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.",
233
- "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.",
234
- "plan.list_legend": "[*] active · [ ] draft · [-] archived",
235
- "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.",
236
- "todo.added": "Added {count} todo(s): {items}",
237
- "todo.marked_done": "Marked {count} item(s) as done",
238
- "todo.no_active": "No active todos",
239
- "todo.no_items": "No todo items specified — provide items to mark done",
240
- "todo.subtask_not_found": "No matching sub-task(s) found for: {items}",
241
- "todo.unknown_action": "Unknown todo action: {action}",
242
- "todo.acknowledged": "Todo acknowledged",
243
- "verify.passed": "Verification passed",
244
- "verify.failed": "Verification failed: {details}",
245
- "verify.file_exists": "File exists: {path}",
246
- "verify.file_not_found": "File not found: {path}",
247
- "verify.script_passed": "Script '{script}' passed",
248
- "verify.script_failed": "Script '{script}' failed: {message}",
249
- "verify.syntax_error": "Syntax error in: {path}",
250
- "verify.file_still_exists": "File should be deleted but still exists: {path}",
251
- "verify.no_files": "Step {step} has no named files to verify — run a real check instead (bash: bun run build / bun test / lsp_check) and confirm the result.",
252
- "lsp.unavailable": "static checks are unavailable (server not found). Verify via the project's own build/test instead.",
253
- "lsp.check_disabled": "LSP checks are disabled in the config.",
254
- "lsp.check_no_path": "Provide a path (file or directory) to check.",
255
- "lsp.check_notfound": "Path not found: {path}",
256
- "lsp.check_unsupported": "No LSP server configured for: {path}",
257
- "lsp.check_clean": "No errors or warnings detected ({count} file(s) checked).",
258
- "lsp.checked_files": "Checked {count} file(s):",
259
- "lsp.startup_header": "[Existing project errors (baseline, checked at session start) — informational. Do NOT fix them unless the current request is about these errors; otherwise ignore them and work only on what the user asked.]:",
260
- "cli.description": "Micro Models Agent — AI coding agent for small models",
261
- "cli.init": "Run interactive setup wizard",
262
- "cli.config_saved": "Configuration saved to ~/.mma/config.json",
263
- "cli.manage_config": "Manage configuration",
264
- "cli.config_key": "Config key (e.g., model, provider.baseUrl)",
265
- "cli.set_value": "Set a config value",
266
- "cli.set_done": "Set {key}={value}",
267
- "cli.show_config": "Show current config",
268
- "cli.migrate_config": "Migrate legacy config.json to domain format",
269
- "cli.manage_models": "Manage models",
270
- "cli.list_models": "List available models",
271
- "cli.current_model": "Current model:",
272
- "cli.model_hint": "(Use /model use <name> to change)",
273
- "cli.model_fetch_failed": "Failed to fetch models: {error}",
274
- "cli.available_models": "Available models:",
275
- "cli.cert_label": "supported — certified on this provider",
276
- "cli.cert_stale_label": "certified on an older MMA version — recommended",
277
- "cli.no_models_found": "No models found from provider",
278
- "cli.fetching_models": "Fetching model list...",
279
- "cli.manage_context": "Manage context window",
280
- "cli.invalid_context_size": "Invalid context size. Must be a number >= 1024",
281
- "cli.context_set": "Context window set to: {size} tokens",
282
- "repl.reload": "Reload agent with current config",
283
- "repl.reload_usage": "Usage: /reload",
284
- "repl.reloading": "Reloading agent...",
285
- "repl.reloaded": "Agent reloaded",
286
- "cli.set_model": "Set default model",
287
- "cli.model_set": "Model set to: {name}",
288
- "cli.certify": "Run certification suite for a model",
289
- "cli.cert_provider_url": "Provider base URL to certify against (default: current config)",
290
- "cli.cert_provider_key": "Provider API key (optional)",
291
- "cli.cert_context_window": "Context window size in tokens",
292
- "cli.cert_tags": "Comma-separated scenario tags (core, security, image, network, browser, shell, research)",
293
- "cli.cert_scenarios": "Comma-separated scenario ids to (re-)run (e.g. 3.5-data-pipeline); other results are preserved",
294
- "cli.cert_scenarios_unknown": "Unknown scenario(s): {ids}. Available: {available}",
295
- "cli.cert_partial_merge": "Preserved {kept} result(s) from the previous certification",
296
- "cli.cert_reps": "Default repetitions per scenario (overridden by scenario)",
297
- "cli.cert_timeout": "Per-rep timeout in ms (default 300000; overridden by scenario)",
298
- "cli.cert_force": "Re-run an existing certification",
299
- "cli.cert_clean": "Remove sandbox directories after a successful run",
300
- "cli.cert_security_required": "Security is disabled. Enable it first (e.g. `mma security set-policy balanced`) to run the security suite.",
301
- "cli.cert_no_scenarios": "No scenarios match tags: {tags}",
302
- "cli.cert_exists": "A certification for {model} already exists on this provider.",
303
- "cli.cert_exists_hint": "Use --force to re-run.",
304
- "cli.cert_started": "Certifying {model} on {provider}...",
305
- "cli.cert_done": "Certification complete: {passed} pass, {failed} fail, {skipped} skipped ({total} total)",
306
- "cli.cert_rep_pass": "pass",
307
- "cli.cert_rep_fail": "fail",
308
- "cli.cert_status": "Show certification status for a model",
309
- "cli.cert_list": "List all certifications",
310
- "cli.cert_uncertify": "Remove a certification",
311
- "cli.cert_not_found": "No certification found for {model}",
312
- "cli.cert_uncertified": "Certification removed for {model}",
313
- "cli.cert_empty": "No certifications yet. Run `mma model certify <model>` first.",
314
- "cli.cert_provider_col": "provider",
315
- "cli.cert_suite_col": "suite",
316
- "cli.cert_date_col": "date",
317
- "cli.cert_version_col": "MMA version",
318
- "cli.cert_stale_hint": "Run `mma model certify --force` to refresh.",
319
- "cli.cert_fixture_missing": "Fixture missing for {id}: {path}",
320
- "cli.cert_marks_hint": "Markers: certified on this provider, ○ certified on an older MMA version, · not certified",
321
- "cli.manage_providers": "Manage providers",
322
- "cli.provider_check": "Probe configured providers (free listModels call)",
323
- "repl.provider_down": "[WARN] Provider \"{name}\" is unreachable: {error}",
324
- "cli.list_providers": "List providers",
325
- "cli.current_provider": "Current provider:",
326
- "cli.base_url": "Base URL:",
327
- "cli.set_provider": "Set active provider",
328
- "cli.provider_set": "Provider set to: {name}",
329
- "cli.manage_sessions": "Manage sessions",
330
- "cli.list_sessions": "List all sessions",
331
- "cli.show_details": "Show session details",
332
- "cli.delete_session": "Delete a session",
333
- "cli.first_run": "First run detected. Running setup wizard...",
334
- "cli.unknown_cmd": "Unknown command: {name}.",
335
- "cli.unknown_command": "Unknown command \"{input}\". Did you mean \"{suggestion}\"?",
336
- "cli.help_hint": "Type /help for available commands.",
337
- "cli.available_cmds": "\nAvailable commands:",
338
- "cli.no_output": "The agent finished but produced no output. The task may be incomplete.",
339
- "cli.no_agents_md": "Disable loading AGENTS.md files into system prompt",
340
- "cli.dir": "Working directory for the agent (defaults to current directory)",
341
- "cli.exit_on_complete": "Exit immediately when the task is done; interactive tools (question/approve) fail fast instead of blocking on stdin",
342
- "cli.reasoning_level": "Set reasoning effort level (auto|none|low|medium|high|max)",
343
- "cli.json": "Output the result as JSON (single-run mode)",
344
- "cli.security.description": "Manage security settings",
345
- "cli.security.status": "Show current security configuration",
346
- "cli.security.policies": "List available security policies",
347
- "cli.security.set_policy": "Apply a security policy preset",
348
- "cli.security.preset": "Policy preset (strict, balanced, permissive)",
349
- "cli.security.invalid_preset": "Invalid preset. Available: {presets}",
350
- "cli.security.policy_applied": "Security policy applied: {name}",
351
- "cli.security.policy_description": "Description: {description}",
352
- "cli.security.enable_encryption": "Enable session file encryption",
353
- "cli.security.disable_encryption": "Disable session file encryption",
354
- "cli.security.encryption_enabled": "Session file encryption enabled",
355
- "cli.security.encryption_disabled": "Session file encryption disabled",
356
- "cli.security.enable_audit": "Enable audit notifications",
357
- "cli.security.disable_audit": "Disable audit notifications",
358
- "cli.security.audit_enabled": "Audit notifications enabled",
359
- "cli.security.audit_disabled": "Audit notifications disabled",
360
- "cli.security.audit_stats": "Show audit notification statistics",
361
- "cli.security.audit_stats_title": "Audit Notification Statistics",
362
- "cli.security.total_notifications": "Total notifications",
363
- "cli.security.by_severity": "By severity",
364
- "cli.security.by_type": "By type",
365
- "cli.security.low": "Low",
366
- "cli.security.medium": "Medium",
367
- "cli.security.high": "High",
368
- "cli.security.critical": "Critical",
369
- "cli.security.current_policy": "Current Security Configuration",
370
- "cli.security.bash_enabled": "Bash command validation",
371
- "cli.security.path_validation": "Path access validation",
372
- "cli.security.network_validation": "Network request validation",
373
- "cli.security.content_scanning": "Content scanning",
374
- "cli.security.max_recursion": "Max recursion depth",
375
- "cli.security.max_file_ops": "Max file operations",
376
- "cli.security.rate_limit": "Rate limit",
377
- "cli.security.session_encryption": "Session encryption",
378
- "cli.security.audit_notifier": "Audit notifications",
379
- "cli.security.available_policies": "Available Security Policies",
380
- "cli.security.recommended_for": "Recommended for",
381
- "cli.yes": "Yes",
382
- "cli.no": "No",
383
- "cli.plugins.description": "Manage plugins",
384
- "cli.plugins.list": "List loaded plugins (name, version, source)",
385
- "cli.plugins.all": "Include builtin plugins",
386
- "cli.plugins.only_external": "(builtin plugins omitted — use --all to show them)",
387
- "cli.plugins.none": "No plugins loaded",
388
- "cli.plugins.header": "Plugins: {count} loaded (MMA v{mma})",
389
- "cli.plugins.builtin_mark": "",
390
- "repl.help": "Show available commands",
391
- "repl.help_usage": "Usage: /help",
392
- "repl.exit": "Exit the REPL",
393
- "repl.exit_usage": "Usage: /exit",
394
- "repl.clear": "Clear the screen",
395
- "repl.clear_usage": "Usage: /clear",
396
- "repl.run": "Run a prompt through the agent",
397
- "repl.run_usage": "Usage: /run <prompt>",
398
- "repl.config": "Show current configuration",
399
- "repl.config_usage": "Usage: /config",
400
- "repl.reasoning": "Toggle showing model reasoning/thinking",
401
- "repl.reasoning_usage": "Usage: /reasoning [auto|none|low|medium|high|max]",
402
- "repl.reasoning_level_set": "Reasoning level set to: {level}",
403
- "repl.reasoning_invalid_level": "Invalid level '{level}'. Valid: {valid}",
404
- "repl.status": "Show agent status",
405
- "repl.status_usage": "Usage: /status",
406
- "repl.plugins": "List loaded plugins",
407
- "repl.plugins_usage": "Usage: /plugins [--all]",
408
- "repl.sessions": "List all sessions (* active)",
409
- "repl.sessions_usage": "Usage: /sessions",
410
- "repl.new": "Create a new session",
411
- "repl.new_usage": "Usage: /new [name]",
412
- "repl.resume": "Switch to a session by id or name prefix",
413
- "repl.resume_usage": "Usage: /resume <id|name>",
414
- "repl.rename": "Rename the current session",
415
- "repl.rename_usage": "Usage: /rename <new-name>",
416
- "repl.delete": "Delete a session by id",
417
- "repl.delete_usage": "Usage: /delete <session-id>",
418
- "repl.skill": "Manage skills (list, loaded, load, unload, search)",
419
- "repl.no_skills": "No skills available",
420
- "repl.available_skills": "Available skills:",
421
- "repl.no_loaded": "No skills loaded",
422
- "repl.loaded_skills": "Loaded skills:",
423
- "repl.budget": "Budget: {used} / {total} tokens ({remaining} remaining)",
424
- "repl.skill_load_usage": "Usage: /skill load <name>",
425
- "repl.skill_unload_usage": "Usage: /skill unload <name>",
426
- "repl.skill_unloaded": "Skill \"{name}\" unloaded",
427
- "repl.skill_not_loaded": "Skill \"{name}\" is not loaded",
428
- "repl.skill_search_usage": "Usage: /skill search <query>",
429
- "repl.no_skill_match": "No skills match \"{query}\"",
430
- "repl.skills_matching": "Skills matching \"{query}\":",
431
- "repl.skill_unknown_sub": "Unknown skill subcommand: {subcmd}",
432
- "repl.skill_usage": "Usage: /skill [list|loaded|load|unload|search]",
433
- "repl.agent": "Agent: ",
434
- "repl.you": "You: ",
435
- "repl.interrupt": "Interrupted (Esc)",
436
- "repl.title": "MMA REPL v{version}",
437
- "repl.model": "Model:",
438
- "repl.provider": "Provider:",
439
- "repl.context": "Context:",
440
- "repl.sysprompt_label": "System prompt:",
441
- "repl.sysprompt_size": "{used} / {budget} tokens",
442
- "repl.sysprompt_desc": "Show system prompt",
443
- "repl.sysprompt_tokens": "System prompt ({count} tokens):",
444
- "repl.excluded_blocks": "\nExcluded blocks: {count}",
445
- "repl.context_usage": "Usage: /context <size> (min 1024)",
446
- "repl.msgs": "msgs",
447
- "repl.max_iters": "Max iters:",
448
- "repl.stuck_thresh": "Stuck thresh:",
449
- "repl.reasoning_label": "Reasoning:",
450
- "repl.log_level": "Log level:",
451
- "repl.locale": "Locale:",
452
- "repl.session_label": "Session:",
453
- "repl.skills_label": "Skills:",
454
- "repl.plugins_label": "Plugins:",
455
- "repl.mcp_label": "MCP:",
456
- "repl.lsp_label": "LSP:",
457
- "repl.lsp_timeout": "timeout",
458
- "repl.lsp_failed": "did not start",
459
- "repl.lsp_unknown": "unknown",
460
- "repl.lsp": "LSP server management (status, restart, check)",
461
- "repl.lsp_usage": "Usage: /lsp [status|restart|check <path>]",
462
- "repl.lsp_not_available": "LSP module not available",
463
- "repl.lsp_status_header": "LSP Status:",
464
- "repl.lsp_enabled": "Enabled:",
465
- "repl.lsp_disabled_servers": "Disabled servers:",
466
- "repl.lsp_failure_counts": "Failure counts:",
467
- "repl.lsp_all_ok": "All servers operational",
468
- "repl.lsp_restarting": "Resetting LSP server state...",
469
- "repl.lsp_restarted": "LSP servers reset. Failed servers will be retried on next use.",
470
- "repl.lsp_check_usage": "Usage: /lsp check <file-or-directory>",
471
- "repl.lsp_checking": "Running LSP check on {path}...",
472
- "repl.lsp_check_error": "LSP check failed: {error}",
473
- "repl.work_dir": "Dir:",
474
- "repl.agents_label": "Instructions:",
475
- "repl.not_found": "not found",
476
- "repl.disabled": "disabled (--no-agents-md)",
477
- "repl.context_probe_small": "Context probe: model \"{model}\" is loaded with {actual} tokens, configured {configured} — overflow risk",
478
- "repl.context_probe_big": "Context probe: model \"{model}\" supports {actual} tokens — consider \"mma context {actual}\"",
479
- "repl.show": "show",
480
- "repl.hide": "hide",
481
- "repl.resume_hint": "Use /resume <id> or /resume <name> to switch between sessions",
482
- "repl.reasoning_status": "Reasoning: {status}",
483
- "repl.wizard": "Run setup wizard",
484
- "repl.wizard_usage": "Usage: /wizard",
485
- "repl.wizard_running": "Running setup wizard... (current config will be overwritten)",
486
- "repl.provider_list": "List configured providers or hot-swap the active one",
487
- "repl.provider_current": "Current provider",
488
- "repl.provider_set": "Provider set to: {name}",
489
- "repl.provider_usage": "/provider list - show entries (* = active, prio = fallback order) | /provider use <name> - switch without restart",
490
- "repl.model_list": "List models of the active provider or switch the model",
491
- "repl.model_current": "Current model",
492
- "repl.model_set": "Model set to: {name}",
493
- "repl.model_usage": "/model list - fetch models from the active provider | /model use <name> - switch model",
494
- "repl.group.general": "General",
495
- "repl.group.agent": "Agent",
496
- "repl.group.session": "Sessions",
497
- "repl.group.skill": "Skills",
498
- "setup.title": "\n MMA Setup Wizard v2\n",
499
- "setup.select_provider": "\n Select provider type:",
500
- "setup.select_provider_num": "\n Select provider (1-{max})",
501
- "setup.scanning": " Scanning local LLM servers...",
502
- "setup.found_servers": " Found {count} server(s):",
503
- "setup.no_servers": " No local servers found. Enter URL manually.",
504
- "setup.api_base": " API Base URL",
505
- "setup.provider_type": " Provider type",
506
- "setup.api_key": " API Key (press Enter to skip)",
507
- "setup.fetching_models": " Fetching model list...",
508
- "setup.available_models": " Available models:",
509
- "setup.select_model": " Select model (1-{max})",
510
- "setup.model_name": " Model name",
511
- "setup.testing": "\n Testing chat with model \"{model}\"...",
512
- "setup.ok": " OK connection successful",
513
- "setup.warning": " WARNING: could not connect — check your API endpoint and key",
514
- "setup.agent_settings": "\n --- Agent settings ---",
515
- "setup.context_window": " Context window (tokens)",
516
- "setup.max_iters": " Max tool iterations",
517
- "setup.language": "\n --- Language ---",
518
- "setup.ui_lang": " UI language (en/ru)",
519
- "setup.complete": "\n Setup complete!\n",
520
- "setup.select_server": "\n Select server (1-{max})",
521
- "setup.custom_url": "Custom URL",
522
- "setup.scanning_spinner": "Scanning local LLM servers…",
523
- "setup.fetching_spinner": "Fetching model list…",
524
- "setup.testing_spinner": "Testing chat with \"{model}\"…",
525
- "setup.summary_setting": "Setting",
526
- "setup.summary_value": "Value",
527
- "setup.security_header": "\n --- Security ---",
528
- "setup.security_status_off": " Security: OFF (default — all commands allowed)",
529
- "setup.security_status_on": " Security: ON (balanced policy by default)",
530
- "setup.security_configure": " Configure security? (y/N)",
531
- "setup.security_bash_block": " Block dangerous commands (rm, sudo, ssh, etc.)? (y/N)",
532
- "setup.security_flags_block": " Block dangerous flags (--force, -rf, etc.)? (y/N)",
533
- "setup.security_paths_deny": " Allow access to .git/, .env, node_modules/? (y/N)",
534
- "skill.already_loaded": "Skill \"{name}\" is already loaded",
535
- "skill.not_found": "Skill \"{name}\" not found in any source directory",
536
- "skill.no_match": "No skills match for: {task}",
537
- "skill.too_large": "Skill \"{name}\" is too large ({tokens} tokens). Budget: {budget} tokens. Continue the task without this skill.",
538
- "skill.exceeds_budget": "Skill \"{name}\" ({tokens} tokens) exceeds remaining budget ({remaining} tokens). Unload other skills first.",
539
- "skill.loaded": "Skill \"{name}\" loaded ({tokens} tokens, {remaining} remaining)",
540
- "skill.auto_loaded": "[Auto-loaded skill: {name}]",
541
- "skill.prompt_hint": "Do NOT load skills automatically. Only load a skill when the user explicitly asks for it (e.g. 'use skill X' or 'load the Y skill'). Skills are listed below for reference only — do not guess which skill to use based on the task description.",
542
- "skill.prompt_fallback": "If load_skill fails because a skill is too large, continue the task without it — do not stop.",
543
- "skill.loaded_content": "[Skill loaded: {name}]\n{content}\n\nUse this knowledge to answer the user's question.",
544
- "exec.stuck": "No progress on step {stepId} ({description}) for {iterations} iterations.",
545
- "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.",
546
- "exec.tool_errors": "Tool {tool} failed {count} times. Consider using a different tool.",
547
- "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.",
548
- "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.",
549
- "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.",
550
- "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",
551
- "exec.read_only_loop": "No write/exec for {count} tool calls the agent is only reading/exploring.",
552
- "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.",
553
- "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.",
554
- "exec.plan_blocked": "{max} consecutive calls outside the current step. Finish step {step} before proceeding other steps should wait until this one is complete.",
555
- "exec.off_track": "Step {stepId} \"{description}\" but you are using {tool} on a different path. Return to the current step.",
556
- "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\".]",
557
- "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.]",
558
- "exec.step_gate_empty": "[⚠ Step {step}: files exist but appear empty: {files}. Add real code to these files before advancing to the next step.]",
559
- "exec.step_gate_ok": "[✓] Step {step} completed and verified. MOVING to step {nextStep}: \"{nextDesc}\". Work ONLY on this step.",
560
- "exec.step_gate_last": "[✓] Step {step} completed that was the final step. Verify everything together and provide the final answer.]",
561
- "exec.audit_pass": "[✓] Task complete: {done}/{total} steps done, {files} files verified",
562
- "exec.audit_pending": "[✗] Task incomplete: {done}/{total} steps doneremaining steps are not marked done",
563
- "exec.audit_fail": "[✗] Task incomplete: {done}/{total} steps done, {files} files missing",
564
- "exec.audit_leftovers": "[✗] Task incomplete: {done}/{total} steps done, {files} files from delete-steps still exist",
565
- "exec.audit_fail_tests": "[✗] Task incomplete: {done}/{total} steps done, tests FAILING: {failed} failed / {passed} passed {detail}",
566
- "exec.audit_fail_typecheck": "[✗] Task incomplete: {done}/{total} steps done, {missing} files missing, typecheck error: {typeError}",
567
- "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.",
568
- "exec.mass_edit_warning": "⚠️ Plan affects {count} filesreview the full list before proceeding.",
569
- "exec.escalation": "\n\n⚠️ Agent stuck on step {stepId} ({description}). Escalating to user please provide guidance.",
570
- "exec.hints": "\n[Hints]\n{hints}",
571
- "exec.file_rewrite_warning": "⚠️ File {file} has been rewritten {count} times. Consider a different approach — the current fix strategy is not working.",
572
- "exec.forbidden_cmd": "STOP using \"{cmd}\" via the bash tool — it is not a native Windows cmd.exe command and has failed repeatedly this session. Use the dedicated tool instead: grep → the grep tool, ls/dir list_dir, find glob, rm delete_file, sed → edit_file, touch → write_file, which → `where`, cp/mv → move_file, diff → read_file. Do NOT call bash for this purpose again.",
573
- "exec.error_search_results": "The error \"{sig}\" has occurred {count} times. Web search found:\n{results}\nApply a matching solution from these results. If none is relevant do NOT repeat the same approach; change strategy or honestly report being stuck.",
574
- "exec.error_search_failed": "Web search returned nothing for \"{query}\".",
575
- "exec.error_search_no_query": "Error output is not meaningful skipping the web search.",
576
- "exec.npm_exec_hint": "\"could not determine executable to run\" no \"bin\" for that package/script. Use \"npm run <script>\" (script must exist in package.json) or \"bunx <pkg>\" for a package that declares a bin.",
577
- "exec.hidden_tool_hint": "\"{tool}\" is not a shell command — it is an MMA tool that is currently hidden. Call the enable_tools tool with tags [\"shell\"] to unlock it; it becomes available on the next iteration.",
578
- "exec.task_reminder": "Task: {task}. Continue making progress — do not repeat failed actions.",
579
- "hall.max_retries_exhausted": "Model returned empty or insufficient responses after multiple retries",
580
- "hall.short_response": "Response too short or empty",
581
- "hall.repetitive": "Response too repetitive ({pct}% overlap)",
582
- "hall.uncertainty": "Uncertainty markers: {markers}",
583
- "hall.unknown_paths": "Mentioned file paths not found in known files: {paths}",
584
- "hall.contradiction_llm": "Contradicts an earlier decision{reason}",
585
- "hall.uncertainty_prefix": "\n\n[⚠️ Uncertainty] ",
586
- "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.",
587
- "browser.unknown_action": "Unknown action: {action}",
588
- "browser.error": "Browser error: {message}",
589
- "browser.no_page": "No page open. Use action \"open\" first.",
590
- "browser.url_required": "URL is required",
591
- "browser.create_page_failed": "Failed to create page",
592
- "browser.nav_failed": "Navigation failed: {message}",
593
- "browser.invalid_target": "Invalid target. Provide element number from snapshot.",
594
- "browser.click_failed": "Click failed: {message}. Check element number.",
595
- "browser.invalid_target_short": "Invalid target.",
596
- "browser.text_required": "Text is required.",
597
- "browser.type_failed": "Type failed: {message}",
598
- "browser.direction_invalid": "Direction must be: up, down, top, bottom",
599
- "browser.scroll_failed": "Scroll failed: {message}",
600
- "browser.closed": "Browser closed.",
601
- "browser.no_page_short": "No page",
602
- "browser.no_elements": "(no interactive elements on page)",
603
- "browser.more_elements": "... and more elements not shown. Use scroll or search to find others.",
604
- "browser.content_header": "Content:",
605
- "browser.console_header": "Console:",
606
- "browser.network_errors_header": "Network errors:",
607
- "browser.truncated": "... (truncated)",
608
- "pipeline.invalid": "Invalid pipeline: name and steps required",
609
- "pipeline.step_missing_fields": "Step missing required fields (id, agent, prompt): {step}",
610
- "pipeline.circular": "Circular dependency: {stepId}",
611
- "plugin.loaded": "Loaded plugin: {name}",
612
- "plugin.skipped": "Skipped incompatible plugin: {entry} ({message})",
613
- "plugin.incompatible": "Skipped plugin {name}: requires MMA v{min}, current is v{current}",
614
- "plugin.dedup_older": "Plugin {name} v{version} skipped: a newer version is already loaded",
615
- "migration.detected": "[MMA] Detected old config. {summary}",
616
- "migration.summary": "[MMA] {summary}",
617
- "migration.config_bak": "- config config.json.bak",
618
- "migration.dir_bak": "- .mma/ → .mma.bak/ ({count} files)",
619
- "migration.migrated": "Migrated:",
620
- "migration.not_needed": "No migration needed",
621
- "ui.error_prefix": "Error: ",
622
- "ui.success_prefix": " ",
623
- "ui.warning_prefix": " ",
624
- "ui.thinking": "Thinking…",
625
- "ui.tool_running": "{tool}…",
626
- "ui.step_context": "step {id}: {desc}",
627
- "indexer.map_header": "Project map",
628
- "indexer.top_directories": "Top directories",
629
- "indexer.files": "Files",
630
- "indexer.empty": "No indexed files",
631
- "indexer.and_more": "... and {count} more files",
632
- "indexer.project_map_desc": "Get a map of the project: summary of files, languages, and exports. Use action 'find' to search files by path or exported name, 'refresh' to rebuild the index.",
633
- "indexer.project_map_action_desc": "Action: summary, refresh, or find",
634
- "indexer.project_map_query_desc": "Search query for the find action (matches file path or exported names)",
635
- "indexer.summary": "Project map: {summary}",
636
- "indexer.refreshed": "Project map refreshed: {summary}",
637
- "indexer.not_indexed": "Project has not been indexed yet",
638
- "indexer.find_results": "Found {count} matching files:\n{results}",
639
- "indexer.no_matches": "No matching files for \"{query}\"",
640
- "indexer.duplicates": "Duplicate basenames (verify which file is the real source): {names}",
641
- "indexer.stack_deps": "deps",
642
- "indexer.stack_dev": "dev",
643
- "indexer.stack_scripts": "scripts",
644
- "tool.friendly.project_map": "Project map",
645
- "config.decryption_warning": "Warning: Failed to decrypt config: {error}",
646
- "config.encryption_warning": "Warning: Failed to encrypt config: {error}",
647
- "config.migrate_start": "Migrating config to domain format...",
648
- "config.migrate_done": "Migration complete. Created {count} domain files. Legacy saved as config.json.bak.",
649
- "config.migrate_no_legacy": "No legacy config.json found. Already using domain format.",
650
- "config.migrate_error": "Migration failed: {error}",
651
- "config.legacy_hint": "Config: using legacy config.json. Run \"mma config migrate\" to switch to domain format.",
652
- "config.parse_failed": "Warning: failed to parse {path} — falling back to defaults. Fix or delete the file to restore your settings.",
653
- "image.source_required": "Image source is required. Provide a file path, URL, or \"clipboard\".",
654
- "image.clipboard_empty": "Clipboard does not contain an image. Copy an image first (e.g. screenshot with Win+Shift+S).",
655
- "image.not_found": "Image file not found: {path}",
656
- "image.no_context": "No context manager available. Image can only be attached during an active session.",
657
- "image.attached": "Image attached from {source} ({size}). It will be included in the next message.",
658
- "image.error": "Failed to load image: {message}",
659
- "tool.friendly.attach_image": "Attach image",
660
- "repl.image": "Attach image",
661
- "repl.image_usage": "/image <path|url|clipboard> attach an image to the next message",
662
- "tool.friendly.remember": "Remember",
663
- "tool.friendly.recall": "Recall",
664
- "tool.remember.preference": "Remembered: {key} = {value}",
665
- "tool.remember.entry": "Remembered: {category} — \"{entry}\"",
666
- "tool.remember.key_required": "Key is required for preferences",
667
- "tool.remember.entry_required": "Entry text is required",
668
- "tool.recall.empty": "Nothing found for \"{query}\"",
669
- "tool.recall.no_memory": "Memory is empty",
670
- "tool.recall.search_results": "{category} results:\n{results}",
671
- "ctx.compactions": "compactions: {count}",
672
- "ctx.quality": "quality: {percent}%",
673
- "ctx.delta_pos": "ctx +{tokens}",
674
- "ctx.delta_neg": "ctx -{tokens} ",
675
- "ctx.delta_zero": "ctx +0",
676
- "updater.check_error": "[updater] update check failed: {error}",
677
- "updater.available": "[updater] Update available: {current} → {latest}. Run `npm install -g micro-models-agent` to upgrade.",
678
- "updater.installing": "[updater] Installing {latest} globally (current: {current})…",
679
- "updater.installed": "[updater] Installed {latest}. Restart MMA to use it (was {current}).\n{changelog}",
680
- "updater.install_failed": "[updater] Failed to install {latest}: {error}. Update manually with `npm install -g micro-models-agent`.",
681
- "cli.changelog_title": "Changelog (micro-models-agent@{version}):",
682
- "cli.changelog_not_found": "Changelog not found for this installation.",
683
- "cli.changelog_range": "Changes since {from}:",
684
- "tools.enable_no_tags": "enable_tools requires at least one tag in the \"tags\" array.",
685
- "tools.enable_no_executor": "Tool executor is not available cannot enumerate enabled tools.",
686
- "tools.enable_already_active": "Tool tags already active: {tags}.",
687
- "tools.enable_added": "Enabled tool tags: {tags}. Available tools now: {tools}",
688
- "tools.hidden_header": "Additional tools (enable on demand via enable_tools or route to subagent tool_tags):",
689
- "tool.friendly.enable_tools": "Enable tools",
690
- "tool.friendly.set_thinking": "Set reasoning level",
691
- "tool.thinking_set": "Reasoning level: {level} ({reason})",
692
- "tool.thinking_set_clamped": "Reasoning level: {level} (clamped from request, {reason})",
693
- "tool.thinking_cooldown": "Reasoning override deferred ({remaining} iterations until available). Current: {current}",
694
- "tool.thinking_invalid_level": "Invalid reasoning level: {level}. Use: none, low, high, max",
695
- "reasoning.probe_failed": "Reasoning effort mechanism not supported by this backend. Dynamic control disabled.",
696
- "reasoning.mode_set": "Reasoning mode: {mode}",
697
- "reasoning.current": "Reasoning: {level} ({mode})",
698
- "reasoning.invalid_mode": "Invalid reasoning mode: {mode}. Use: auto, default, none, low, medium, high, max",
699
- "cli.provider_base_hint": "Base URL set to: {baseUrl}",
700
- "cli.add_provider": "Add a provider to the config",
701
- "cli.provider_no_url": "No base URL for provider \"{name}\". Pass --url.",
702
- "cli.provider_added": "Provider added: {name}",
703
- "cli.provider_switch_hint": "Switch to it with: mma provider use <name>",
704
- "repl.cost": "Total cost: {cost}",
705
- "repl.cost_breakdown": "By provider: {breakdown}",
706
- "repl.tokens": "Tokens used: {tokens}",
707
- "repl.ctrl_c_interrupt": "\n[Ctrl+C] Stopping agent... (press again to force)",
708
- "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.",
709
- "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.",
710
- "exec.test_runner_pass": "[test-runner] {framework}: all {passed} test(s) passing.",
711
- "plan.subtasks_done": "All sub-tasks done call plan update step={stepId} status=done to complete this step.",
712
- "plan.no_subtasks": "(no sub-tasks)",
713
- "plan.step_label": "Step {stepId}: {description}",
714
- "exec.hint_deps": "Check if a lock file exists (package-lock.json, poetry.lock). If missing, run the install command first.",
715
- "exec.hint_test": "Make sure the source files exist and have real code before running tests.",
716
- "exec.hint_build": "Check that all dependencies are installed and source files are not empty.",
717
- "exec.hint_deploy": "Verify credentials and network access before deploying.",
718
- "exec.hint_repetitive": "You are calling the same tool repeatedly with the same arguments. Try a different approach.",
719
- "exec.hint_consecutive": "Multiple different tools are failing. Check if the environment is set up correctly.",
720
- "exec.hint_read_only": "You have made many read-only tool calls (read_file/glob/grep/browser) without writing anything. Stop exploring — make the edit/write the task needs, or use the plan tool to decide next steps.",
721
- "moe.replan_started": "🔄 Re-plan {cycle}/{max}: executing updated plan...",
722
- "moe.executing": "⚙️ Executing {count} subtasks (cycle {cycle})...",
723
- "moe.execution_complete": "Execution complete: {succeeded}/{total} succeeded",
724
- "moe.cycles_exhausted": "Max re-plan cycles ({max}) reached returning partial results",
725
- "moe.partial_result": "Partial result",
726
- "moe.scope_approved": "🔓 Scope expanded for \"{subtask}\": {files}",
727
- "moe.scope_rejected": " Scope request rejected for \"{subtask}\"",
728
- "prompt.overflow.compressing": "System prompt overflow: compressing {count} block(s) before the first runthis may take a while on a local model.",
729
- "prompt.overflow.summarizing": "System prompt overflow: summarizing \"{label}\" ({original} tok {budget} tok budget) with the model…",
730
- "prompt.overflow.truncating": "System prompt overflow: truncating \"{label}\" ({original} tok) — summarization unavailable.",
731
- "prompt.overflow.summarize_failed": "System prompt overflow: summarization failed for \"{label}\": {error} — falling back to truncation.",
732
- "prompt.overflow.exceeded": "Prompt overflow: \"{label}\" ({original} tok) exceeded the system-prompt budget ({budget} tok) {mode} to {resolved} tok. To fit fully, {hint}.",
733
- "prompt.overflow.failed": "Prompt overflow resolution failed: {error} — oversized blocks will be dropped.",
734
- "prompt.overflow.startup": "Startup check: {block} ({original} tok) exceeds the system-prompt budget ({budget} tok) — it will be summarized/truncated before the first run. To include it fully, {hint}.",
735
- "tool.session_info.no_active": "No active session",
736
- "tool.session_info.result": "Session: \"{name}\" ({id})\nModel: {model}\nProvider: {provider}\nContext window: {contextWindow} tokens\nMessages: {messages}\nCreated: {createdAt}\nUpdated: {updatedAt}",
737
- "tool.session_info.context": "Context used: {used} / {budget} tokens ({percent}%)",
738
- "tool.friendly.session_info": "Session info",
739
- "cli.map.description": "Work with the project index / map",
740
- "cli.map.action": "Action: summary (default), refresh, find",
741
- "cli.map.query": "Search query for the find action",
742
- "repl.map": "Show the project map / index (summary, refresh, find)",
743
- "repl.map_usage": "Usage: /map [summary|refresh|find <query>]",
744
- "map.refreshed": "Project map refreshed",
745
- "map.find_usage": "Usage: map find <query>"
746
- }
1
+ {
2
+ "file.created": "Created {path}",
3
+ "file.deleted": "Deleted {path}",
4
+ "file.updated": "Updated {path}",
5
+ "file.written": "Written {path}",
6
+ "file.syntax_error": "Syntax error in {path}:\n{error}\n\nFile was NOT written. Fix the syntax error and try again.",
7
+ "file.notfound": "File not found: {path}\nThis does NOT mean the project is missing — the path may be wrong. Run list_dir on the working directory first; create files only after confirming what exists.",
8
+ "file.dir_notfound": "Directory not found: {path}",
9
+ "file.path_not_allowed": "Path not allowed: {path}",
10
+ "file.path_not_allowed_short": "Path not allowed",
11
+ "file.is_directory": "Is a directory, use rmdir: {path}",
12
+ "file.replaced_in": "Replaced in {path}",
13
+ "file.string_not_found": "String not found in file:\n{str}\n\nUse read_file on {path} to see the current content before editing — the target may differ (whitespace, line endings) or was already replaced.",
14
+ "file.moved": "Moved {from} → {to}",
15
+ "file.not_found_short": "Not found: {path}",
16
+ "file.notfound_resolved": "File not found: {path} (resolved to {resolved})\nThe path was joined onto the working directory because it does not exist as given. Run list_dir to find the correct path.",
17
+ "file.empty": "(empty)",
18
+ "file.no_matches": "No matches",
19
+ "file.truncated": "\n... (truncated)",
20
+ "file.read_header": "── {path} ({ext}, {total} lines, lines {from}-{to})",
21
+ "file.read_range": "lines {from}-{to} of {total}",
22
+ "file.read_truncated": "\n\n[Truncated: {remaining} more lines. Use read_file with offset={next} to continue]",
23
+ "file.empty_page": "(empty page)",
24
+ "error.timeout": "Request timed out",
25
+ "error.unknown": "An unknown error occurred",
26
+ "error.notfound": "Not found: {path}",
27
+ "error.prefix": "Error: ",
28
+ "error.command_error": "Command error: {message}",
29
+ "error.llm": "LLM error: {message}",
30
+ "error.response_blocked": "Response blocked: {reason}",
31
+ "error.max_iters": "Max iterations ({max}) reached",
32
+ "error.empty_response": "Model returned an empty response after retries",
33
+ "error.audit_failed": "Task could not be verified as complete: {summary}",
34
+ "error.grep_failed": "Grep failed: {message}",
35
+ "error.search_failed": "Search failed: {message}",
36
+ "error.fetch_failed": "Fetch failed: {message}",
37
+ "error.fetch_url_failed": "Failed to fetch {url}: {message}",
38
+ "error.http": "HTTP {status}: {statusText}",
39
+ "error.llm_api": "LLM API error {status} ({statusText}): {errorText}",
40
+ "error.llm_retries": "LLM request failed after retries",
41
+ "error.llm_429": "Rate limit exceeded (HTTP 429) for {model} on {baseUrl}. The provider is throttling requests — free models are especially strict. Get an API key or switch to a paid/faster model: {baseUrl}",
42
+ "error.no_response_body": "No response body stream",
43
+ "error.llm_stream_idle": "LLM stream stalled — no data for {timeout}ms. If the provider buffers streaming (e.g. LM Studio) or generates very long tool calls, raise \"retry.noDataTimeoutMs\" in ~/.mma/config.json (restart required)",
44
+ "error.llm_stream_idle_toolcall": "LLM stream stalled after a tool_call started — no data for {timeout}ms. The provider most likely buffers SSE instead of streaming tool-call argument deltas (seen with LM Studio). Raise \"retry.noDataTimeoutMs\" in ~/.mma/config.json (restart required)",
45
+ "error.llm_truncated": "Response hit the completion token limit ({tokens}) and was cut off before any content arrived. Split the task into smaller outputs or raise \"maxCompletionTokens\" in the config",
46
+ "error.llm_truncated_toolcall": "Response hit the completion token limit ({tokens}) in the middle of a tool_call — its arguments were cut off. Write the file in smaller chunks (several write_file/edit_file calls) or raise \"maxCompletionTokens\" in the config",
47
+ "error.llm_provider_stream_error": "Provider returned an error mid-stream: {error}",
48
+ "error.llm_timeout": "LLM request timed out ({timeout}ms)",
49
+ "env.runtime_node": "Running under Node (v{version}) — clipboard image paste, subagent performance and LSP spawn on Windows degrade. Install Bun (https://bun.sh) for full features.",
50
+ "env.runtime_old": "Runtime version {version} is below the required engines {engine}.",
51
+ "env.tool_missing": "Tool not found on PATH: {tool}",
52
+ "env.playwright_missing": "Playwright package is not installed — the browser tool will fail. Install with: bun add playwright",
53
+ "env.playwright_browsers_missing": "Playwright browsers not downloaded ({dir}). The browser tool will fail. Install with: bunx playwright install chromium",
54
+ "env.crash_stderr": "MMA crashed ({type}): {message} — crash report written to ~/.mma/logs/crash.jsonl",
55
+ "env.model_autoload_failed": "Model auto-load failed: {error}. Continuing with manual load.",
56
+ "env.model_loaded": "Model {model} loaded in {seconds}s",
57
+ "env.reasoning_probe": "Reasoning probe: strategy={strategy} → {result}",
58
+ "env.reasoning_respected": "mechanism respected",
59
+ "env.reasoning_ignored": "mechanism IGNORED",
60
+ "env.indexing": "Indexing project files…",
61
+ "env.indexed": "Indexed {files} file(s) for the project map",
62
+ "env.indexing_failed": "Project indexing failed: {error}",
63
+ "env.index_skip_unreadable": "indexer: skipping unreadable entry \"{path}\"",
64
+ "env.killed_processes": "Killed {count} background process(es) on shutdown",
65
+ "session.started": "Session started: {id}",
66
+ "session.ended": "Session ended: {id}",
67
+ "session.not_found": "Session not found: {id}",
68
+ "session.no_active": "No active session",
69
+ "session.deleted": "Session deleted: {id}",
70
+ "session.renamed": "Session renamed to: {name}",
71
+ "session.created": "Created session: {name}",
72
+ "session.resumed": "Resumed session: {name}",
73
+ "session.chat_cleared": "Chat cleared. Start typing to begin.",
74
+ "session.chat_loaded": "Chat history loaded. Pick up where you left off.",
75
+ "session.chat_history": "Chat history:",
76
+ "session.user_label": "User",
77
+ "session.assistant_label": "Assistant",
78
+ "session.no_history": "Chat history is empty",
79
+ "session.no_sessions": "No sessions found",
80
+ "session.no_sessions_hint": "No sessions found. Create one with /new <name>",
81
+ "session.available": "Available sessions:",
82
+ "session.no_match": "No session matching \"{query}\"",
83
+ "session.default_name": "Session {date}",
84
+ "session.info_full": "[Session: \"{name}\" ({id}) | model: {model} | context: {contextWindow} tokens]",
85
+ "session.col_active": "",
86
+ "session.col_id": "ID",
87
+ "session.col_name": "Name",
88
+ "session.col_updated": "Updated",
89
+ "session.col_msgs": "Msgs",
90
+ "tool.executed": "Executed {name}",
91
+ "tool.failed": "Tool {name} failed: {error}",
92
+ "tool.unknown": "Unknown tool: {name}",
93
+ "tool.blocked": "Blocked by plugin: {plugin}",
94
+ "tool.blocked_reason": "Blocked by plugin: {plugin}. Reason: {reason}",
95
+ "tool.using": "[{label}]",
96
+ "tool.friendly.write_file": "Writing file",
97
+ "tool.friendly.read_file": "Reading file",
98
+ "tool.friendly.edit_file": "Editing file",
99
+ "tool.friendly.create_dir": "Creating directory",
100
+ "tool.friendly.delete_file": "Deleting file",
101
+ "tool.friendly.move_file": "Moving file",
102
+ "tool.friendly.list_dir": "Listing files",
103
+ "tool.friendly.file_info": "File info",
104
+ "tool.friendly.glob": "Searching files",
105
+ "tool.friendly.grep": "Searching content",
106
+ "tool.friendly.bash": "Running command",
107
+ "bash.echo_write_blocked": "Writing files via echo/printf is unreliable in Windows cmd.exe (quotes and multi-line break). Use the write_file tool instead (target: {path}).",
108
+ "tool.friendly.load_skill": "Loading skill",
109
+ "tool.friendly.plan": "Planning",
110
+ "tool.friendly.todo": "Updating tasks",
111
+ "tool.friendly.verify": "Verifying",
112
+ "tool.friendly.web_search": "Web search",
113
+ "tool.friendly.web_fetch": "Fetching page",
114
+ "tool.friendly.web_browse": "Browsing page",
115
+ "tool.friendly.download_file": "Downloading file",
116
+ "tool.friendly.chunk_query": "Querying chunks",
117
+ "tool.web_fetch_result": "Fetched page: {url} — {chars} chars, {lines} lines{truncated}",
118
+ "tool.web_browse_result": "Browsed page: {url} — {chars} chars, {lines} lines{truncated}",
119
+ "tool.web_search_result": "Search results for \"{query}\" — {count} results",
120
+ "tool.downloaded": "Downloaded {url} → {path} ({size} bytes, {type})",
121
+ "tool.download_too_large": "Download blocked: file exceeds the {max} bytes limit",
122
+ "tool.friendly.browser": "Browser",
123
+ "tool.friendly.subagent": "Sub-agent task",
124
+ "tool.friendly.question": "Question to user",
125
+ "tool.friendly.approve": "Approval request",
126
+ "tool.friendly.search_history": "Searching history",
127
+ "tool.friendly.pipeline_run": "Running pipeline",
128
+ "tool.friendly.mcp_call": "MCP call",
129
+ "tool.friendly.lsp_check": "Checking code",
130
+ "tool.truncated": "[Truncated: {tokens} tokens removed]",
131
+ "tool.subagent_queued": "Sub-agent task queued: {task}",
132
+ "tool.subagent_artifact": "Sub-agent completed. Full result saved to artifact: {path}\nIterations: {iterations}\nSummary:\n{summary}",
133
+ "tool.pipeline_started": "Pipeline \"{name}\" execution started. Pipeline engine is a stub — run dispatched.",
134
+ "tool.mcp_call": "MCP call: {server}/{tool} with {args}",
135
+ "tool.action_required": "Action is required.",
136
+ "tool.approve_prompt": "Approve? {action}",
137
+ "tool.approve_yes": "Yes",
138
+ "tool.approve_yes_desc": "Approve the action",
139
+ "tool.approve_no": "No",
140
+ "tool.approve_no_desc": "Reject the action",
141
+ "tool.approved": "Approved",
142
+ "tool.rejected": "Rejected by user",
143
+ "tool.user_input.custom_option": "Type your own answer",
144
+ "tool.user_input.choice_single": "Your choice (1-{max}): ",
145
+ "tool.user_input.choice_multiple": "Your choice (comma-separated, e.g. 1,3): ",
146
+ "tool.user_input.invalid": "Invalid choice, try again.",
147
+ "tool.user_input.custom_prompt": "Your answer: ",
148
+ "tool.question.progress": "Question {current}/{total}",
149
+ "tool.question.no_questions": "No questions provided",
150
+ "tool.question.unanswered": "Unanswered",
151
+ "tool.question.answered": "User has answered your questions: {formatted}. You can now continue with the user's answers in mind.",
152
+ "tool.name_or_task": "Provide either \"name\" or \"task\" parameter",
153
+ "tool.chunk_query_no_query": "chunk_query: a query string is required.",
154
+ "tool.chunk_query_no_input": "chunk_query: provide input_path or text.",
155
+ "tool.invalid_params": "Invalid parameters",
156
+ "tool.skill_budget": "Skill \"{name}\" loaded ({tokens} tokens, {remaining} remaining in skills budget). Skill content is now in system prompt — no need to reload after context compaction.",
157
+ "tool.skill_available_hint": "Available skills",
158
+ "tool.no_results": "No results found for \"{query}\"",
159
+ "tool.search_results": "Search results for \"{query}\":\n{results}",
160
+ "tool.web_search_disabled": "Web search is disabled (webSearch.enabled: false). Use file/system tools only.",
161
+ "tool.history_results": "History results for \"{query}\":\n{results}",
162
+ "tool.no_history": "No history entries matching \"{query}\"",
163
+ "tool.no_sessions_dir": "No sessions directory found at {dir}",
164
+ "tool.history_error": "Error searching history: {error}",
165
+ "tool.memory_error": "Memory error: {error}",
166
+ "tool.screenshot_unavailable": "[Screenshot captured — image not available for text-only model]",
167
+ "tool.timeout": "Tool {name} timed out after {seconds} seconds",
168
+ "tool.aborted": "Tool {name} was interrupted by user",
169
+ "tool.interactive_disabled": "Interactive tool is disabled in exit-on-complete mode. Proceed without asking the user.",
170
+ "proc.started": "Started background process {id} (PID {pid}).\nCommand: {command}",
171
+ "proc.promoted_hint": "Command still running after {ms} ms — moved to the background",
172
+ "proc.manage_hint": "Check output: process_log id={id}. Stop it: process_kill id={id}. List all: process_list.",
173
+ "proc.output_preview": "First output:\n{lines}",
174
+ "proc.none": "No background processes running.",
175
+ "proc.not_found": "Process not found: {id}",
176
+ "proc.missing_id": "Provide the process id: process_kill id=proc_xxx (the id is returned by bash when a command goes to the background, or by process_list).",
177
+ "proc.missing_id_list": "No background processes are currently running.",
178
+ "proc.killed": "Process {id} (PID {pid}) killed.",
179
+ "proc.kill_failed": "Failed to kill process {id}",
180
+ "proc.list_header": "Background processes",
181
+ "proc.log_header": "Process {id} ({status}) output:",
182
+ "proc.log_empty": "(no output yet)",
183
+ "proc.hint": "Manage them with {list}, {log}, {kill}.",
184
+ "proc.status_running": "running",
185
+ "proc.status_exited": "exited",
186
+ "proc.status_killed": "killed",
187
+ "tool.friendly.process_list": "Listing background processes",
188
+ "tool.friendly.process_log": "Process output",
189
+ "tool.friendly.process_kill": "Stopping process",
190
+ "plan.no_steps": "No plan steps specified. Provide concrete steps with files and commands.",
191
+ "plan.created": "Plan created: {title} ({steps} steps)",
192
+ "plan.coverage_warning": "Plan may be missing required files from the task: {missing}. Add steps covering them.",
193
+ "plan.step_done": "Step {n}/{total}: {description} ✓",
194
+ "plan.complete": "Task complete: {summary}",
195
+ "plan.title_steps": "Plan \"{title}\" created with {count} steps",
196
+ "plan.step_marked": "Step {step} marked as {status}",
197
+ "plan.aborted": "Plan aborted",
198
+ "plan.completed_archived": "Plan {id} is complete ({done}/{total} steps) — archived. You may create a new plan for new work (plan create), or reply with your final answer.",
199
+ "plan.unknown_action": "Unknown plan action: {action}",
200
+ "plan.updated": "Plan updated: {title} ({steps} steps)",
201
+ "plan.acknowledged": "Plan {action}: acknowledged",
202
+ "plan.step_status": "Step {step}: {status}",
203
+ "plan.no_active": "No active plan",
204
+ "plan.step_not_found": "Step not found",
205
+ "plan.step_already_done": "Step {step} is already done — nothing to do. Plan progress:",
206
+ "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.",
207
+ "plan.deliverables_missing": "Cannot mark step {step} done: the files it names do not exist yet: {files}. Create these files first (or mark the step status=skipped if they are not actually needed).",
208
+ "plan.kinds_mismatch": "kinds array length must match steps",
209
+ "plan.kinds_invalid": "Invalid step kind(s): {kinds}. Use \"create\" or \"delete\".",
210
+ "plan.kinds_not_array": "kinds must be an array of \"create\" or \"delete\"",
211
+ "plan.deliverables_remain": "Cannot mark step {step} done: the files it names still exist: {files}. This step is kind=delete — delete these files first (or set status=skipped if they should stay).",
212
+ "plan.typecheck_failed": "Cannot mark step {step} done: the last check still reports a compile error:\n{error}\nFix the error and re-edit the file (a clean write clears the failure), or mark the step status=skipped if it is not needed.",
213
+ "plan.show_header": "Plan status:",
214
+ "plan.show_empty": "(plan has no steps)",
215
+ "plan.list_header": "Plans:",
216
+ "plan.list_empty": "No plans",
217
+ "plan.switch_no_id": "Provide a plan id to switch to",
218
+ "plan.not_found": "Plan not found: {id}",
219
+ "plan.switched": "Switched to plan {id}: {title}",
220
+ "plan.replanned": "Plan re-planned: {kept} completed steps kept, {steps} new steps added",
221
+ "plan.replan_no_steps": "Provide new steps for re-planning",
222
+ "plan.active_in_progress": "Cannot create a new plan: active plan {id} already has progress ({done}/{total} done, current: step {current}). Resume it — use \"plan show\" to view, then continue working. To replace it, call \"plan abort\" first, then \"plan create\" again.",
223
+ "plan.id_ignored": "note: plan ids are auto-generated; use \"plan switch\" to activate an existing plan by id.",
224
+ "plan.existing_fresh": "note: the previous active plan had no progress and was preserved as a draft.",
225
+ "plan.already_active": "Plan {id} is already active — nothing to switch.",
226
+ "plan.already_archived": "Plan {id} is already archived — nothing to abort.",
227
+ "plan.aborted_id": "Plan {id} aborted and archived.",
228
+ "plan.delete_no_id": "Provide a plan id to delete (plan delete id=plan_xxx).",
229
+ "plan.deleted": "Plan {id} deleted permanently.",
230
+ "plan.purged": "Deleted {count} plan(s). Plan storage is empty.",
231
+ "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.",
232
+ "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.",
233
+ "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.",
234
+ "plan.list_legend": "[*] active · [ ] draft · [-] archived",
235
+ "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.",
236
+ "todo.added": "Added {count} todo(s): {items}",
237
+ "todo.marked_done": "Marked {count} item(s) as done",
238
+ "todo.no_active": "No active todos",
239
+ "todo.no_items": "No todo items specified — provide items to mark done",
240
+ "todo.subtask_not_found": "No matching sub-task(s) found for: {items}",
241
+ "todo.unknown_action": "Unknown todo action: {action}",
242
+ "todo.acknowledged": "Todo acknowledged",
243
+ "verify.passed": "Verification passed",
244
+ "verify.failed": "Verification failed: {details}",
245
+ "verify.file_exists": "File exists: {path}",
246
+ "verify.file_not_found": "File not found: {path}",
247
+ "verify.script_passed": "Script '{script}' passed",
248
+ "verify.script_failed": "Script '{script}' failed: {message}",
249
+ "verify.syntax_error": "Syntax error in: {path}",
250
+ "verify.file_still_exists": "File should be deleted but still exists: {path}",
251
+ "verify.no_files": "Step {step} has no named files to verify — run a real check instead (bash: bun run build / bun test / lsp_check) and confirm the result.",
252
+ "lsp.unavailable": "static checks are unavailable (server not found). Verify via the project's own build/test instead.",
253
+ "lsp.check_disabled": "LSP checks are disabled in the config.",
254
+ "lsp.check_no_path": "Provide a path (file or directory) to check.",
255
+ "lsp.check_notfound": "Path not found: {path}",
256
+ "lsp.check_unsupported": "No LSP server configured for: {path}",
257
+ "lsp.check_clean": "No errors or warnings detected ({count} file(s) checked).",
258
+ "lsp.checked_files": "Checked {count} file(s):",
259
+ "lsp.startup_header": "[Existing project errors (baseline, checked at session start) — informational. Do NOT fix them unless the current request is about these errors; otherwise ignore them and work only on what the user asked.]:",
260
+ "cli.description": "Micro Models Agent — AI coding agent for small models",
261
+ "cli.init": "Run interactive setup wizard",
262
+ "cli.config_saved": "Configuration saved to ~/.mma/config.json",
263
+ "cli.manage_config": "Manage configuration",
264
+ "cli.config_key": "Config key (e.g., model, provider.baseUrl)",
265
+ "cli.set_value": "Set a config value",
266
+ "cli.set_done": "Set {key}={value}",
267
+ "cli.show_config": "Show current config",
268
+ "cli.migrate_config": "Migrate legacy config.json to domain format",
269
+ "cli.manage_models": "Manage models",
270
+ "cli.list_models": "List available models",
271
+ "cli.current_model": "Current model:",
272
+ "cli.model_hint": "(Use /model use <name> to change)",
273
+ "cli.model_fetch_failed": "Failed to fetch models: {error}",
274
+ "cli.available_models": "Available models:",
275
+ "cli.cert_label": "supported — certified on this provider",
276
+ "cli.cert_stale_label": "certified on an older MMA version — recommended",
277
+ "cli.no_models_found": "No models found from provider",
278
+ "cli.fetching_models": "Fetching model list...",
279
+ "cli.manage_context": "Manage context window",
280
+ "cli.invalid_context_size": "Invalid context size. Must be a number >= 1024",
281
+ "cli.context_set": "Context window set to: {size} tokens",
282
+ "cli.context_budget_header": "Context budget (window {window} tokens):",
283
+ "cli.context_system_line": " system prompt: {tokens} tokens ({percent}%)",
284
+ "cli.context_reserve_line": " response reserve: {tokens} tokens ({percent}%)",
285
+ "cli.context_history_line": " history: {tokens} tokens ({percent}%)",
286
+ "cli.context_system_fraction": "System-prompt share of the context window (0.05–0.9)",
287
+ "cli.context_reserve_fraction": "Response-reserve share of the context window (0.05–0.9)",
288
+ "cli.context_fraction_set": "{key} share set to {value}",
289
+ "cli.context_invalid_fraction": "Invalid share. Use a number between 0.05 and 0.9 (system + reserve must stay below 0.95).",
290
+ "repl.reload": "Reload agent with current config",
291
+ "repl.reload_usage": "Usage: /reload",
292
+ "repl.reloading": "Reloading agent...",
293
+ "repl.reloaded": "Agent reloaded",
294
+ "cli.set_model": "Set default model",
295
+ "cli.model_set": "Model set to: {name}",
296
+ "cli.certify": "Run certification suite for a model",
297
+ "cli.cert_provider_url": "Provider base URL to certify against (default: current config)",
298
+ "cli.cert_provider_key": "Provider API key (optional)",
299
+ "cli.cert_context_window": "Context window size in tokens",
300
+ "cli.cert_tags": "Comma-separated scenario tags (core, security, image, network, browser, shell, research)",
301
+ "cli.cert_scenarios": "Comma-separated scenario ids to (re-)run (e.g. 3.5-data-pipeline); other results are preserved",
302
+ "cli.cert_scenarios_unknown": "Unknown scenario(s): {ids}. Available: {available}",
303
+ "cli.cert_partial_merge": "Preserved {kept} result(s) from the previous certification",
304
+ "cli.cert_reps": "Default repetitions per scenario (overridden by scenario)",
305
+ "cli.cert_timeout": "Per-rep timeout in ms (default 300000; overridden by scenario)",
306
+ "cli.cert_force": "Re-run an existing certification",
307
+ "cli.cert_clean": "Remove sandbox directories after a successful run",
308
+ "cli.cert_security_required": "Security is disabled. Enable it first (e.g. `mma security set-policy balanced`) to run the security suite.",
309
+ "cli.cert_no_scenarios": "No scenarios match tags: {tags}",
310
+ "cli.cert_exists": "A certification for {model} already exists on this provider.",
311
+ "cli.cert_exists_hint": "Use --force to re-run.",
312
+ "cli.cert_started": "Certifying {model} on {provider}...",
313
+ "cli.cert_done": "Certification complete: {passed} pass, {failed} fail, {skipped} skipped ({total} total)",
314
+ "cli.cert_rep_pass": "pass",
315
+ "cli.cert_rep_fail": "fail",
316
+ "cli.cert_status": "Show certification status for a model",
317
+ "cli.cert_list": "List all certifications",
318
+ "cli.cert_uncertify": "Remove a certification",
319
+ "cli.cert_not_found": "No certification found for {model}",
320
+ "cli.cert_uncertified": "Certification removed for {model}",
321
+ "cli.cert_empty": "No certifications yet. Run `mma model certify <model>` first.",
322
+ "cli.cert_provider_col": "provider",
323
+ "cli.cert_suite_col": "suite",
324
+ "cli.cert_date_col": "date",
325
+ "cli.cert_version_col": "MMA version",
326
+ "cli.cert_stale_hint": "Run `mma model certify --force` to refresh.",
327
+ "cli.cert_fixture_missing": "Fixture missing for {id}: {path}",
328
+ "cli.cert_marks_hint": "Markers: certified on this provider, ○ certified on an older MMA version, · not certified",
329
+ "cli.manage_providers": "Manage providers",
330
+ "cli.provider_check": "Probe configured providers (free listModels call)",
331
+ "repl.provider_down": "[WARN] Provider \"{name}\" is unreachable: {error}",
332
+ "cli.list_providers": "List providers",
333
+ "cli.current_provider": "Current provider:",
334
+ "cli.base_url": "Base URL:",
335
+ "cli.set_provider": "Set active provider",
336
+ "cli.provider_set": "Provider set to: {name}",
337
+ "cli.manage_sessions": "Manage sessions",
338
+ "cli.list_sessions": "List all sessions",
339
+ "cli.show_details": "Show session details",
340
+ "cli.delete_session": "Delete a session",
341
+ "cli.first_run": "First run detected. Running setup wizard...",
342
+ "cli.unknown_cmd": "Unknown command: {name}.",
343
+ "cli.unknown_command": "Unknown command \"{input}\". Did you mean \"{suggestion}\"?",
344
+ "cli.help_hint": "Type /help for available commands.",
345
+ "cli.available_cmds": "\nAvailable commands:",
346
+ "cli.no_output": "The agent finished but produced no output. The task may be incomplete.",
347
+ "cli.no_agents_md": "Disable loading AGENTS.md files into system prompt",
348
+ "cli.dir": "Working directory for the agent (defaults to current directory)",
349
+ "cli.exit_on_complete": "Exit immediately when the task is done; interactive tools (question/approve) fail fast instead of blocking on stdin",
350
+ "cli.reasoning_level": "Set reasoning effort level (auto|none|low|medium|high|max)",
351
+ "cli.json": "Output the result as JSON (single-run mode)",
352
+ "cli.security.description": "Manage security settings",
353
+ "cli.security.status": "Show current security configuration",
354
+ "cli.security.policies": "List available security policies",
355
+ "cli.security.set_policy": "Apply a security policy preset",
356
+ "cli.security.preset": "Policy preset (strict, balanced, permissive)",
357
+ "cli.security.invalid_preset": "Invalid preset. Available: {presets}",
358
+ "cli.security.policy_applied": "Security policy applied: {name}",
359
+ "cli.security.policy_description": "Description: {description}",
360
+ "cli.security.enable_encryption": "Enable session file encryption",
361
+ "cli.security.disable_encryption": "Disable session file encryption",
362
+ "cli.security.encryption_enabled": "Session file encryption enabled",
363
+ "cli.security.encryption_disabled": "Session file encryption disabled",
364
+ "cli.security.enable_audit": "Enable audit notifications",
365
+ "cli.security.disable_audit": "Disable audit notifications",
366
+ "cli.security.audit_enabled": "Audit notifications enabled",
367
+ "cli.security.audit_disabled": "Audit notifications disabled",
368
+ "cli.security.audit_stats": "Show audit notification statistics",
369
+ "cli.security.audit_stats_title": "Audit Notification Statistics",
370
+ "cli.security.total_notifications": "Total notifications",
371
+ "cli.security.by_severity": "By severity",
372
+ "cli.security.by_type": "By type",
373
+ "cli.security.low": "Low",
374
+ "cli.security.medium": "Medium",
375
+ "cli.security.high": "High",
376
+ "cli.security.critical": "Critical",
377
+ "cli.security.current_policy": "Current Security Configuration",
378
+ "cli.security.bash_enabled": "Bash command validation",
379
+ "cli.security.path_validation": "Path access validation",
380
+ "cli.security.network_validation": "Network request validation",
381
+ "cli.security.content_scanning": "Content scanning",
382
+ "cli.security.max_recursion": "Max recursion depth",
383
+ "cli.security.max_file_ops": "Max file operations",
384
+ "cli.security.rate_limit": "Rate limit",
385
+ "cli.security.session_encryption": "Session encryption",
386
+ "cli.security.audit_notifier": "Audit notifications",
387
+ "cli.security.available_policies": "Available Security Policies",
388
+ "cli.security.recommended_for": "Recommended for",
389
+ "cli.yes": "Yes",
390
+ "cli.no": "No",
391
+ "cli.plugins.description": "Manage plugins",
392
+ "cli.plugins.list": "List loaded plugins (name, version, source)",
393
+ "cli.plugins.all": "Include builtin plugins",
394
+ "cli.plugins.only_external": "(builtin plugins omitted — use --all to show them)",
395
+ "cli.plugins.none": "No plugins loaded",
396
+ "cli.plugins.header": "Plugins: {count} loaded (MMA v{mma})",
397
+ "cli.plugins.builtin_mark": "",
398
+ "repl.help": "Show available commands",
399
+ "repl.help_usage": "Usage: /help",
400
+ "repl.exit": "Exit the REPL",
401
+ "repl.exit_usage": "Usage: /exit",
402
+ "repl.clear": "Clear the screen",
403
+ "repl.clear_usage": "Usage: /clear",
404
+ "repl.run": "Run a prompt through the agent",
405
+ "repl.run_usage": "Usage: /run <prompt>",
406
+ "repl.config": "Show current configuration",
407
+ "repl.config_usage": "Usage: /config",
408
+ "repl.reasoning": "Toggle showing model reasoning/thinking",
409
+ "repl.reasoning_usage": "Usage: /reasoning [auto|none|low|medium|high|max]",
410
+ "repl.reasoning_level_set": "Reasoning level set to: {level}",
411
+ "repl.reasoning_invalid_level": "Invalid level '{level}'. Valid: {valid}",
412
+ "repl.status": "Show agent status",
413
+ "repl.status_usage": "Usage: /status",
414
+ "repl.plugins": "List loaded plugins",
415
+ "repl.plugins_usage": "Usage: /plugins [--all]",
416
+ "repl.sessions": "List all sessions (* active)",
417
+ "repl.sessions_usage": "Usage: /sessions",
418
+ "repl.new": "Create a new session",
419
+ "repl.new_usage": "Usage: /new [name]",
420
+ "repl.resume": "Switch to a session by id or name prefix",
421
+ "repl.resume_usage": "Usage: /resume <id|name>",
422
+ "repl.rename": "Rename the current session",
423
+ "repl.rename_usage": "Usage: /rename <new-name>",
424
+ "repl.delete": "Delete a session by id",
425
+ "repl.delete_usage": "Usage: /delete <session-id>",
426
+ "repl.skill": "Manage skills (list, loaded, load, unload, search)",
427
+ "repl.no_skills": "No skills available",
428
+ "repl.available_skills": "Available skills:",
429
+ "repl.no_loaded": "No skills loaded",
430
+ "repl.loaded_skills": "Loaded skills:",
431
+ "repl.budget": "Budget: {used} / {total} tokens ({remaining} remaining)",
432
+ "repl.skill_load_usage": "Usage: /skill load <name>",
433
+ "repl.skill_unload_usage": "Usage: /skill unload <name>",
434
+ "repl.skill_unloaded": "Skill \"{name}\" unloaded",
435
+ "repl.skill_not_loaded": "Skill \"{name}\" is not loaded",
436
+ "repl.skill_search_usage": "Usage: /skill search <query>",
437
+ "repl.no_skill_match": "No skills match \"{query}\"",
438
+ "repl.skills_matching": "Skills matching \"{query}\":",
439
+ "repl.skill_unknown_sub": "Unknown skill subcommand: {subcmd}",
440
+ "repl.skill_usage": "Usage: /skill [list|loaded|load|unload|search]",
441
+ "repl.agent": "Agent: ",
442
+ "repl.you": "You: ",
443
+ "repl.interrupt": "Interrupted (Esc)",
444
+ "repl.title": "MMA REPL v{version}",
445
+ "repl.model": "Model:",
446
+ "repl.provider": "Provider:",
447
+ "repl.context": "Context:",
448
+ "repl.sysprompt_label": "System prompt:",
449
+ "repl.sysprompt_size": "{used} / {budget} tokens",
450
+ "repl.sysprompt_desc": "Show system prompt",
451
+ "repl.sysprompt_tokens": "System prompt ({count} tokens):",
452
+ "repl.excluded_blocks": "\nExcluded blocks: {count}",
453
+ "repl.context_usage": "Usage: /context [<size> | system <fraction> | reserve <fraction>] (min 1024; fractions 0.05–0.9)",
454
+ "repl.msgs": "msgs",
455
+ "repl.max_iters": "Max iters:",
456
+ "repl.stuck_thresh": "Stuck thresh:",
457
+ "repl.reasoning_label": "Reasoning:",
458
+ "repl.log_level": "Log level:",
459
+ "repl.locale": "Locale:",
460
+ "repl.session_label": "Session:",
461
+ "repl.skills_label": "Skills:",
462
+ "repl.plugins_label": "Plugins:",
463
+ "repl.mcp_label": "MCP:",
464
+ "repl.lsp_label": "LSP:",
465
+ "repl.lsp_timeout": "timeout",
466
+ "repl.lsp_failed": "did not start",
467
+ "repl.lsp_unknown": "unknown",
468
+ "repl.lsp": "LSP server management (status, restart, check)",
469
+ "repl.lsp_usage": "Usage: /lsp [status|restart|check <path>]",
470
+ "repl.lsp_not_available": "LSP module not available",
471
+ "repl.lsp_status_header": "LSP Status:",
472
+ "repl.lsp_enabled": "Enabled:",
473
+ "repl.lsp_disabled_servers": "Disabled servers:",
474
+ "repl.lsp_failure_counts": "Failure counts:",
475
+ "repl.lsp_all_ok": "All servers operational",
476
+ "repl.lsp_restarting": "Resetting LSP server state...",
477
+ "repl.lsp_restarted": "LSP servers reset. Failed servers will be retried on next use.",
478
+ "repl.lsp_check_usage": "Usage: /lsp check <file-or-directory>",
479
+ "repl.lsp_checking": "Running LSP check on {path}...",
480
+ "repl.lsp_check_error": "LSP check failed: {error}",
481
+ "repl.work_dir": "Dir:",
482
+ "repl.agents_label": "Instructions:",
483
+ "repl.not_found": "not found",
484
+ "repl.disabled": "disabled (--no-agents-md)",
485
+ "repl.context_probe_small": "Context probe: model \"{model}\" is loaded with {actual} tokens, configured {configured} — overflow risk",
486
+ "repl.context_probe_big": "Context probe: model \"{model}\" supports {actual} tokens — consider \"mma context {actual}\"",
487
+ "repl.show": "show",
488
+ "repl.hide": "hide",
489
+ "repl.resume_hint": "Use /resume <id> or /resume <name> to switch between sessions",
490
+ "repl.reasoning_status": "Reasoning: {status}",
491
+ "repl.wizard": "Run setup wizard",
492
+ "repl.wizard_usage": "Usage: /wizard",
493
+ "repl.wizard_running": "Running setup wizard... (current config will be overwritten)",
494
+ "repl.provider_list": "List configured providers or hot-swap the active one",
495
+ "repl.provider_current": "Current provider",
496
+ "repl.provider_set": "Provider set to: {name}",
497
+ "repl.provider_usage": "/provider list - show entries (* = active, prio = fallback order) | /provider use <name> - switch without restart",
498
+ "repl.model_list": "List models of the active provider or switch the model",
499
+ "repl.model_current": "Current model",
500
+ "repl.model_set": "Model set to: {name}",
501
+ "repl.model_usage": "/model list - fetch models from the active provider | /model use <name> - switch model",
502
+ "repl.group.general": "General",
503
+ "repl.group.agent": "Agent",
504
+ "repl.group.session": "Sessions",
505
+ "repl.group.skill": "Skills",
506
+ "setup.title": "\n MMA Setup Wizard v2\n",
507
+ "setup.select_provider": "\n Select provider type:",
508
+ "setup.select_provider_num": "\n Select provider (1-{max})",
509
+ "setup.scanning": " Scanning local LLM servers...",
510
+ "setup.found_servers": " Found {count} server(s):",
511
+ "setup.no_servers": " No local servers found. Enter URL manually.",
512
+ "setup.api_base": " API Base URL",
513
+ "setup.provider_type": " Provider type",
514
+ "setup.api_key": " API Key (press Enter to skip)",
515
+ "setup.fetching_models": " Fetching model list...",
516
+ "setup.available_models": " Available models:",
517
+ "setup.select_model": " Select model (1-{max})",
518
+ "setup.model_name": " Model name",
519
+ "setup.testing": "\n Testing chat with model \"{model}\"...",
520
+ "setup.ok": " OK connection successful",
521
+ "setup.warning": " WARNING: could not connect — check your API endpoint and key",
522
+ "setup.agent_settings": "\n --- Agent settings ---",
523
+ "setup.context_window": " Context window (tokens)",
524
+ "setup.max_iters": " Max tool iterations",
525
+ "setup.language": "\n --- Language ---",
526
+ "setup.ui_lang": " UI language (en/ru)",
527
+ "setup.complete": "\n Setup complete!\n",
528
+ "setup.select_server": "\n Select server (1-{max})",
529
+ "setup.custom_url": "Custom URL",
530
+ "setup.scanning_spinner": "Scanning local LLM servers…",
531
+ "setup.fetching_spinner": "Fetching model list…",
532
+ "setup.testing_spinner": "Testing chat with \"{model}\"…",
533
+ "setup.summary_setting": "Setting",
534
+ "setup.summary_value": "Value",
535
+ "setup.security_header": "\n --- Security ---",
536
+ "setup.security_status_off": " Security: OFF (default all commands allowed)",
537
+ "setup.security_status_on": " Security: ON (balanced policy by default)",
538
+ "setup.security_configure": " Configure security? (y/N)",
539
+ "setup.security_bash_block": " Block dangerous commands (rm, sudo, ssh, etc.)? (y/N)",
540
+ "setup.security_flags_block": " Block dangerous flags (--force, -rf, etc.)? (y/N)",
541
+ "setup.security_paths_deny": " Allow access to .git/, .env, node_modules/? (y/N)",
542
+ "skill.already_loaded": "Skill \"{name}\" is already loaded",
543
+ "skill.not_found": "Skill \"{name}\" not found in any source directory",
544
+ "skill.no_match": "No skills match for: {task}",
545
+ "skill.too_large": "Skill \"{name}\" is too large ({tokens} tokens). Budget: {budget} tokens. Continue the task without this skill.",
546
+ "skill.exceeds_budget": "Skill \"{name}\" ({tokens} tokens) exceeds remaining budget ({remaining} tokens). Unload other skills first.",
547
+ "skill.loaded": "Skill \"{name}\" loaded ({tokens} tokens, {remaining} remaining)",
548
+ "skill.auto_loaded": "[Auto-loaded skill: {name}]",
549
+ "skill.prompt_hint": "Do NOT load skills automatically. Only load a skill when the user explicitly asks for it (e.g. 'use skill X' or 'load the Y skill'). Skills are listed below for reference only — do not guess which skill to use based on the task description.",
550
+ "skill.prompt_fallback": "If load_skill fails because a skill is too large, continue the task without it — do not stop.",
551
+ "skill.loaded_content": "[Skill loaded: {name}]\n{content}\n\nUse this knowledge to answer the user's question.",
552
+ "exec.stuck": "No progress on step {stepId} ({description}) for {iterations} iterations.",
553
+ "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.",
554
+ "exec.tool_errors": "Tool {tool} failed {count} times. Consider using a different tool.",
555
+ "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.",
556
+ "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.",
557
+ "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.",
558
+ "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",
559
+ "exec.read_only_loop": "No write/exec for {count} tool calls the agent is only reading/exploring.",
560
+ "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.",
561
+ "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.",
562
+ "exec.plan_blocked": "{max} consecutive calls outside the current step. Finish step {step} before proceedingother steps should wait until this one is complete.",
563
+ "exec.off_track": "Step {stepId} \"{description}\" but you are using {tool} on a different path. Return to the current step.",
564
+ "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\".]",
565
+ "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.]",
566
+ "exec.step_gate_empty": "[ Step {step}: files exist but appear empty: {files}. Add real code to these files before advancing to the next step.]",
567
+ "exec.step_gate_ok": "[✓] Step {step} completed and verified. MOVING to step {nextStep}: \"{nextDesc}\". Work ONLY on this step.",
568
+ "exec.step_gate_last": "[✓] Step {step} completedthat was the final step. Verify everything together and provide the final answer.]",
569
+ "exec.audit_pass": "[✓] Task complete: {done}/{total} steps done, {files} files verified",
570
+ "exec.audit_pending": "[] Task incomplete: {done}/{total} steps done — remaining steps are not marked done",
571
+ "exec.audit_fail": "[✗] Task incomplete: {done}/{total} steps done, {files} files missing",
572
+ "exec.audit_leftovers": "[✗] Task incomplete: {done}/{total} steps done, {files} files from delete-steps still exist",
573
+ "exec.audit_fail_tests": "[✗] Task incomplete: {done}/{total} steps done, tests FAILING: {failed} failed / {passed} passed{detail}",
574
+ "exec.audit_fail_typecheck": "[✗] Task incomplete: {done}/{total} steps done, {missing} files missing, typecheck error: {typeError}",
575
+ "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.",
576
+ "exec.mass_edit_warning": "⚠️ Plan affects {count} filesreview the full list before proceeding.",
577
+ "exec.escalation": "\n\n⚠️ Agent stuck on step {stepId} ({description}). Escalating to user please provide guidance.",
578
+ "exec.hints": "\n[Hints]\n{hints}",
579
+ "exec.file_rewrite_warning": "⚠️ File {file} has been rewritten {count} times. Consider a different approach — the current fix strategy is not working.",
580
+ "exec.forbidden_cmd": "STOP using \"{cmd}\" via the bash tool — it is not a native Windows cmd.exe command and has failed repeatedly this session. Use the dedicated tool instead: grep → the grep tool, ls/dir → list_dir, find → glob, rm → delete_file, sed → edit_file, touch → write_file, which → `where`, cp/mv → move_file, diff → read_file. Do NOT call bash for this purpose again.",
581
+ "exec.error_search_results": "The error \"{sig}\" has occurred {count} times. Web search found:\n{results}\nApply a matching solution from these results. If none is relevant — do NOT repeat the same approach; change strategy or honestly report being stuck.",
582
+ "exec.error_search_failed": "Web search returned nothing for \"{query}\".",
583
+ "exec.error_search_no_query": "Error output is not meaningful skipping the web search.",
584
+ "exec.npm_exec_hint": "\"could not determine executable to run\" — no \"bin\" for that package/script. Use \"npm run <script>\" (script must exist in package.json) or \"bunx <pkg>\" for a package that declares a bin.",
585
+ "exec.hidden_tool_hint": "\"{tool}\" is not a shell command — it is an MMA tool that is currently hidden. Call the enable_tools tool with tags [\"shell\"] to unlock it; it becomes available on the next iteration.",
586
+ "exec.task_reminder": "Task: {task}. Continue making progress do not repeat failed actions.",
587
+ "hall.max_retries_exhausted": "Model returned empty or insufficient responses after multiple retries",
588
+ "hall.short_response": "Response too short or empty",
589
+ "hall.repetitive": "Response too repetitive ({pct}% overlap)",
590
+ "hall.uncertainty": "Uncertainty markers: {markers}",
591
+ "hall.unknown_paths": "Mentioned file paths not found in known files: {paths}",
592
+ "hall.contradiction_llm": "Contradicts an earlier decision{reason}",
593
+ "hall.uncertainty_prefix": "\n\n[⚠️ Uncertainty] ",
594
+ "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.",
595
+ "browser.unknown_action": "Unknown action: {action}",
596
+ "browser.error": "Browser error: {message}",
597
+ "browser.no_page": "No page open. Use action \"open\" first.",
598
+ "browser.url_required": "URL is required",
599
+ "browser.create_page_failed": "Failed to create page",
600
+ "browser.nav_failed": "Navigation failed: {message}",
601
+ "browser.invalid_target": "Invalid target. Provide element number from snapshot.",
602
+ "browser.click_failed": "Click failed: {message}. Check element number.",
603
+ "browser.invalid_target_short": "Invalid target.",
604
+ "browser.text_required": "Text is required.",
605
+ "browser.type_failed": "Type failed: {message}",
606
+ "browser.direction_invalid": "Direction must be: up, down, top, bottom",
607
+ "browser.scroll_failed": "Scroll failed: {message}",
608
+ "browser.closed": "Browser closed.",
609
+ "browser.no_page_short": "No page",
610
+ "browser.no_elements": "(no interactive elements on page)",
611
+ "browser.more_elements": "... and more elements not shown. Use scroll or search to find others.",
612
+ "browser.content_header": "Content:",
613
+ "browser.console_header": "Console:",
614
+ "browser.network_errors_header": "Network errors:",
615
+ "browser.truncated": "... (truncated)",
616
+ "pipeline.invalid": "Invalid pipeline: name and steps required",
617
+ "pipeline.step_missing_fields": "Step missing required fields (id, agent, prompt): {step}",
618
+ "pipeline.circular": "Circular dependency: {stepId}",
619
+ "plugin.loaded": "Loaded plugin: {name}",
620
+ "plugin.skipped": "Skipped incompatible plugin: {entry} ({message})",
621
+ "plugin.incompatible": "Skipped plugin {name}: requires MMA v{min}, current is v{current}",
622
+ "plugin.dedup_older": "Plugin {name} v{version} skipped: a newer version is already loaded",
623
+ "migration.detected": "[MMA] Detected old config. {summary}",
624
+ "migration.summary": "[MMA] {summary}",
625
+ "migration.config_bak": "- config → config.json.bak",
626
+ "migration.dir_bak": "- .mma/ → .mma.bak/ ({count} files)",
627
+ "migration.migrated": "Migrated:",
628
+ "migration.not_needed": "No migration needed",
629
+ "ui.error_prefix": "Error: ",
630
+ "ui.success_prefix": " ",
631
+ "ui.warning_prefix": " ",
632
+ "ui.thinking": "Thinking…",
633
+ "ui.tool_running": "{tool}…",
634
+ "ui.step_context": "step {id}: {desc}",
635
+ "indexer.map_header": "Project map",
636
+ "indexer.top_directories": "Top directories",
637
+ "indexer.files": "Files",
638
+ "indexer.empty": "No indexed files",
639
+ "indexer.and_more": "... and {count} more files",
640
+ "indexer.project_map_desc": "Get a map of the project: summary of files, languages, and exports. Use action 'find' to search files by path or exported name, 'refresh' to rebuild the index.",
641
+ "indexer.project_map_action_desc": "Action: summary, refresh, or find",
642
+ "indexer.project_map_query_desc": "Search query for the find action (matches file path or exported names)",
643
+ "indexer.summary": "Project map: {summary}",
644
+ "indexer.refreshed": "Project map refreshed: {summary}",
645
+ "indexer.not_indexed": "Project has not been indexed yet",
646
+ "indexer.find_results": "Found {count} matching files:\n{results}",
647
+ "indexer.no_matches": "No matching files for \"{query}\"",
648
+ "indexer.duplicates": "Duplicate basenames (verify which file is the real source): {names}",
649
+ "indexer.stack_deps": "deps",
650
+ "indexer.stack_dev": "dev",
651
+ "indexer.stack_scripts": "scripts",
652
+ "tool.friendly.project_map": "Project map",
653
+ "config.decryption_warning": "Warning: Failed to decrypt config: {error}",
654
+ "config.encryption_warning": "Warning: Failed to encrypt config: {error}",
655
+ "config.migrate_start": "Migrating config to domain format...",
656
+ "config.migrate_done": "Migration complete. Created {count} domain files. Legacy saved as config.json.bak.",
657
+ "config.migrate_no_legacy": "No legacy config.json found. Already using domain format.",
658
+ "config.migrate_error": "Migration failed: {error}",
659
+ "config.legacy_hint": "Config: using legacy config.json. Run \"mma config migrate\" to switch to domain format.",
660
+ "config.parse_failed": "Warning: failed to parse {path} — falling back to defaults. Fix or delete the file to restore your settings.",
661
+ "image.source_required": "Image source is required. Provide a file path, URL, or \"clipboard\".",
662
+ "image.clipboard_empty": "Clipboard does not contain an image. Copy an image first (e.g. screenshot with Win+Shift+S).",
663
+ "image.not_found": "Image file not found: {path}",
664
+ "image.no_context": "No context manager available. Image can only be attached during an active session.",
665
+ "image.attached": "Image attached from {source} ({size}). It will be included in the next message.",
666
+ "image.error": "Failed to load image: {message}",
667
+ "tool.friendly.attach_image": "Attach image",
668
+ "repl.image": "Attach image",
669
+ "repl.image_usage": "/image <path|url|clipboard> — attach an image to the next message",
670
+ "tool.friendly.remember": "Remember",
671
+ "tool.friendly.recall": "Recall",
672
+ "tool.remember.preference": "Remembered: {key} = {value}",
673
+ "tool.remember.entry": "Remembered: {category} — \"{entry}\"",
674
+ "tool.remember.key_required": "Key is required for preferences",
675
+ "tool.remember.entry_required": "Entry text is required",
676
+ "tool.recall.empty": "Nothing found for \"{query}\"",
677
+ "tool.recall.no_memory": "Memory is empty",
678
+ "tool.recall.search_results": "{category} results:\n{results}",
679
+ "ctx.compactions": "compactions: {count}",
680
+ "ctx.quality": "quality: {percent}%",
681
+ "ctx.delta_pos": "ctx +{tokens}",
682
+ "ctx.delta_neg": "ctx -{tokens} ",
683
+ "ctx.delta_zero": "ctx +0",
684
+ "updater.check_error": "[updater] update check failed: {error}",
685
+ "updater.available": "[updater] Update available: {current} {latest}. Run `npm install -g micro-models-agent` to upgrade.",
686
+ "updater.installing": "[updater] Installing {latest} globally (current: {current})…",
687
+ "updater.installed": "[updater] Installed {latest}. Restart MMA to use it (was {current}).\n{changelog}",
688
+ "updater.install_failed": "[updater] Failed to install {latest}: {error}. Update manually with `npm install -g micro-models-agent`.",
689
+ "cli.changelog_title": "Changelog (micro-models-agent@{version}):",
690
+ "cli.changelog_not_found": "Changelog not found for this installation.",
691
+ "cli.changelog_range": "Changes since {from}:",
692
+ "tools.enable_no_tags": "enable_tools requires at least one tag in the \"tags\" array.",
693
+ "tools.enable_no_executor": "Tool executor is not available cannot enumerate enabled tools.",
694
+ "tools.enable_already_active": "Tool tags already active: {tags}.",
695
+ "tools.enable_added": "Enabled tool tags: {tags}. Available tools now: {tools}",
696
+ "tools.hidden_header": "Additional tools (enable on demand via enable_tools or route to subagent tool_tags):",
697
+ "tool.friendly.enable_tools": "Enable tools",
698
+ "tool.friendly.set_thinking": "Set reasoning level",
699
+ "tool.thinking_set": "Reasoning level: {level} ({reason})",
700
+ "tool.thinking_set_clamped": "Reasoning level: {level} (clamped from request, {reason})",
701
+ "tool.thinking_cooldown": "Reasoning override deferred ({remaining} iterations until available). Current: {current}",
702
+ "tool.thinking_invalid_level": "Invalid reasoning level: {level}. Use: none, low, high, max",
703
+ "reasoning.probe_failed": "Reasoning effort mechanism not supported by this backend. Dynamic control disabled.",
704
+ "reasoning.mode_set": "Reasoning mode: {mode}",
705
+ "reasoning.current": "Reasoning: {level} ({mode})",
706
+ "reasoning.invalid_mode": "Invalid reasoning mode: {mode}. Use: auto, default, none, low, medium, high, max",
707
+ "cli.provider_base_hint": "Base URL set to: {baseUrl}",
708
+ "cli.add_provider": "Add a provider to the config",
709
+ "cli.provider_no_url": "No base URL for provider \"{name}\". Pass --url.",
710
+ "cli.provider_added": "Provider added: {name}",
711
+ "cli.provider_switch_hint": "Switch to it with: mma provider use <name>",
712
+ "repl.cost": "Total cost: {cost}",
713
+ "repl.cost_breakdown": "By provider: {breakdown}",
714
+ "repl.tokens": "Tokens used: {tokens}",
715
+ "repl.ctrl_c_interrupt": "\n[Ctrl+C] Stopping agent... (press again to force)",
716
+ "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.",
717
+ "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.",
718
+ "exec.test_runner_pass": "[test-runner] {framework}: all {passed} test(s) passing.",
719
+ "plan.subtasks_done": "All sub-tasks done call plan update step={stepId} status=done to complete this step.",
720
+ "plan.no_subtasks": "(no sub-tasks)",
721
+ "plan.step_label": "Step {stepId}: {description}",
722
+ "exec.hint_deps": "Check if a lock file exists (package-lock.json, poetry.lock). If missing, run the install command first.",
723
+ "exec.hint_test": "Make sure the source files exist and have real code before running tests.",
724
+ "exec.hint_build": "Check that all dependencies are installed and source files are not empty.",
725
+ "exec.hint_deploy": "Verify credentials and network access before deploying.",
726
+ "exec.hint_repetitive": "You are calling the same tool repeatedly with the same arguments. Try a different approach.",
727
+ "exec.hint_consecutive": "Multiple different tools are failing. Check if the environment is set up correctly.",
728
+ "exec.hint_read_only": "You have made many read-only tool calls (read_file/glob/grep/browser) without writing anything. Stop exploring make the edit/write the task needs, or use the plan tool to decide next steps.",
729
+ "moe.replan_started": "🔄 Re-plan {cycle}/{max}: executing updated plan...",
730
+ "moe.executing": "⚙️ Executing {count} subtasks (cycle {cycle})...",
731
+ "moe.execution_complete": "Execution complete: {succeeded}/{total} succeeded",
732
+ "moe.cycles_exhausted": "Max re-plan cycles ({max}) reachedreturning partial results",
733
+ "moe.partial_result": "Partial result",
734
+ "moe.scope_approved": "🔓 Scope expanded for \"{subtask}\": {files}",
735
+ "moe.scope_rejected": " Scope request rejected for \"{subtask}\"",
736
+ "prompt.overflow.compressing": "System prompt overflow: compressing {count} block(s) before the first run this may take a while on a local model.",
737
+ "prompt.overflow.summarizing": "System prompt overflow: summarizing \"{label}\" ({original} tok → {budget} tok budget) with the model…",
738
+ "prompt.overflow.truncating": "System prompt overflow: truncating \"{label}\" ({original} tok) — summarization unavailable.",
739
+ "prompt.overflow.summarize_failed": "System prompt overflow: summarization failed for \"{label}\": {error} — falling back to truncation.",
740
+ "prompt.overflow.hint_needed": "the prompt needs ~{needed} system tokens (current budget: {window} × {fraction} = {budget})",
741
+ "prompt.overflow.hint_window": "raise contextWindow to at least {required} (standard size {recommended}) — {how}",
742
+ "prompt.overflow.hint_fraction": "or keep the window and raise contextBudget.systemPrompt to ~{fraction} (run: mma context --system {fraction})",
743
+ "prompt.overflow.exceeded": "Prompt overflow: \"{label}\" ({original} tok) exceeded the system-prompt budget ({budget} tok) — {mode} to {resolved} tok. To fit fully, {hint}.",
744
+ "prompt.overflow.failed": "Prompt overflow resolution failed: {error} — oversized blocks will be dropped.",
745
+ "prompt.overflow.startup": "Startup check: {block} ({original} tok) exceeds the system-prompt budget ({budget} tok) — it will be summarized/truncated before the first run. To include it fully, {hint}.",
746
+ "tool.session_info.no_active": "No active session",
747
+ "tool.session_info.result": "Session: \"{name}\" ({id})\nModel: {model}\nProvider: {provider}\nContext window: {contextWindow} tokens\nMessages: {messages}\nCreated: {createdAt}\nUpdated: {updatedAt}",
748
+ "tool.session_info.context": "Context used: {used} / {budget} tokens ({percent}%)",
749
+ "tool.friendly.session_info": "Session info",
750
+ "cli.map.description": "Work with the project index / map",
751
+ "cli.map.action": "Action: summary (default), refresh, find",
752
+ "cli.map.query": "Search query for the find action",
753
+ "repl.map": "Show the project map / index (summary, refresh, find)",
754
+ "repl.map_usage": "Usage: /map [summary|refresh|find <query>]",
755
+ "map.refreshed": "Project map refreshed",
756
+ "map.find_usage": "Usage: map find <query>"
757
+ }