micro-models-agent 0.43.3 → 0.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/README.md +312 -312
  2. package/bin/mma.mjs +41 -41
  3. package/dist/main.js +333 -66
  4. package/dist/skills/builtin/git.md +36 -36
  5. package/dist/skills/builtin/typescript.md +35 -35
  6. package/package.json +1 -1
  7. package/dist/cli/commands.js +0 -333
  8. package/dist/cli/completer.js +0 -168
  9. package/dist/cli/index.js +0 -2
  10. package/dist/cli/main.js +0 -140
  11. package/dist/cli/repl-commands.js +0 -633
  12. package/dist/cli/repl.js +0 -486
  13. package/dist/cli/security-commands.js +0 -166
  14. package/dist/cli/setup.js +0 -249
  15. package/dist/config/config.js +0 -202
  16. package/dist/config/defaults.js +0 -100
  17. package/dist/config/experts.js +0 -15
  18. package/dist/config/index.js +0 -3
  19. package/dist/config/security.js +0 -200
  20. package/dist/config/types.js +0 -1
  21. package/dist/core/agent-moe.js +0 -110
  22. package/dist/core/agent.js +0 -695
  23. package/dist/core/bootstrap.js +0 -337
  24. package/dist/core/index.js +0 -2
  25. package/dist/core/prompt-builder.js +0 -55
  26. package/dist/core/session-logger.js +0 -155
  27. package/dist/core/types.js +0 -1
  28. package/dist/core/workspace.js +0 -76
  29. package/dist/i18n/en.json +0 -525
  30. package/dist/i18n/index.js +0 -46
  31. package/dist/i18n/ru.json +0 -525
  32. package/dist/index.js +0 -22
  33. package/dist/llm/image-utils.js +0 -144
  34. package/dist/llm/index.js +0 -4
  35. package/dist/llm/model-loader.js +0 -78
  36. package/dist/llm/openai-compat.js +0 -353
  37. package/dist/llm/orchestrator.js +0 -194
  38. package/dist/llm/provider.js +0 -10
  39. package/dist/llm/response.js +0 -39
  40. package/dist/llm/token-counter.js +0 -39
  41. package/dist/llm/types.js +0 -1
  42. package/dist/logger/app-logger.js +0 -143
  43. package/dist/logger/file-log.js +0 -151
  44. package/dist/logger/index.js +0 -1
  45. package/dist/migration/backup.js +0 -45
  46. package/dist/migration/detect.js +0 -50
  47. package/dist/migration/index.js +0 -2
  48. package/dist/modules/browser/actions.js +0 -46
  49. package/dist/modules/browser/cookie-store.js +0 -24
  50. package/dist/modules/browser/index.js +0 -5
  51. package/dist/modules/browser/module.js +0 -28
  52. package/dist/modules/browser/session.js +0 -335
  53. package/dist/modules/browser/snapshot.js +0 -114
  54. package/dist/modules/browser/types.js +0 -9
  55. package/dist/modules/certification/cli.js +0 -176
  56. package/dist/modules/certification/fact-checker.js +0 -84
  57. package/dist/modules/certification/loader.js +0 -111
  58. package/dist/modules/certification/manifest.js +0 -50
  59. package/dist/modules/certification/runner.js +0 -162
  60. package/dist/modules/certification/scenarios.js +0 -124
  61. package/dist/modules/certification/types.js +0 -1
  62. package/dist/modules/context/index.js +0 -1
  63. package/dist/modules/context/manager.js +0 -349
  64. package/dist/modules/execution/auditor.js +0 -66
  65. package/dist/modules/execution/index.js +0 -8
  66. package/dist/modules/execution/module.js +0 -779
  67. package/dist/modules/execution/moe-executor.js +0 -266
  68. package/dist/modules/execution/plan-coverage.js +0 -68
  69. package/dist/modules/execution/plan-persister.js +0 -46
  70. package/dist/modules/execution/plan-store.js +0 -159
  71. package/dist/modules/execution/plan-validator.js +0 -153
  72. package/dist/modules/execution/planner.js +0 -85
  73. package/dist/modules/execution/stuck-detector.js +0 -347
  74. package/dist/modules/execution/tracker.js +0 -67
  75. package/dist/modules/execution/types.js +0 -1
  76. package/dist/modules/execution/verifier.js +0 -178
  77. package/dist/modules/hallucination/confidence.js +0 -59
  78. package/dist/modules/hallucination/consistency.js +0 -26
  79. package/dist/modules/hallucination/detector.js +0 -46
  80. package/dist/modules/hallucination/factual.js +0 -190
  81. package/dist/modules/hallucination/index.js +0 -5
  82. package/dist/modules/hallucination/js-identifiers.js +0 -72
  83. package/dist/modules/hallucination/llm-judge.js +0 -103
  84. package/dist/modules/index.js +0 -5
  85. package/dist/modules/indexer/cache.js +0 -38
  86. package/dist/modules/indexer/index.js +0 -3
  87. package/dist/modules/indexer/module.js +0 -192
  88. package/dist/modules/indexer/walker.js +0 -101
  89. package/dist/modules/lsp/client.js +0 -235
  90. package/dist/modules/lsp/config.js +0 -81
  91. package/dist/modules/lsp/index.js +0 -3
  92. package/dist/modules/lsp/module.js +0 -68
  93. package/dist/modules/lsp/types.js +0 -1
  94. package/dist/modules/mcp/client.js +0 -399
  95. package/dist/modules/mcp/index.js +0 -3
  96. package/dist/modules/mcp/module.js +0 -146
  97. package/dist/modules/mcp/registry.js +0 -15
  98. package/dist/modules/memory/index.js +0 -1
  99. package/dist/modules/memory/module.js +0 -48
  100. package/dist/modules/memory/search.js +0 -40
  101. package/dist/modules/memory/store.js +0 -69
  102. package/dist/modules/pipelines/engine.js +0 -60
  103. package/dist/modules/pipelines/index.js +0 -3
  104. package/dist/modules/pipelines/parser.js +0 -53
  105. package/dist/modules/pipelines/template.js +0 -14
  106. package/dist/modules/plugins/builtin/lint-on-write.js +0 -226
  107. package/dist/modules/plugins/builtin/notify.js +0 -8
  108. package/dist/modules/plugins/index.js +0 -1
  109. package/dist/modules/plugins/loader.js +0 -28
  110. package/dist/modules/plugins/manager.js +0 -161
  111. package/dist/modules/plugins/types.js +0 -1
  112. package/dist/modules/processes/index.js +0 -2
  113. package/dist/modules/processes/registry.js +0 -238
  114. package/dist/modules/processes/runner.js +0 -23
  115. package/dist/modules/registry.js +0 -45
  116. package/dist/modules/security/audit-log.js +0 -136
  117. package/dist/modules/security/audit-notifier.js +0 -292
  118. package/dist/modules/security/command-validator.js +0 -211
  119. package/dist/modules/security/content-scanner.js +0 -53
  120. package/dist/modules/security/data-sanitizer.js +0 -97
  121. package/dist/modules/security/encryption.js +0 -240
  122. package/dist/modules/security/index.js +0 -14
  123. package/dist/modules/security/network-validator.js +0 -79
  124. package/dist/modules/security/path-validator.js +0 -209
  125. package/dist/modules/security/rate-limiter.js +0 -119
  126. package/dist/modules/security/security-policies.js +0 -547
  127. package/dist/modules/security/session-encryption.js +0 -210
  128. package/dist/modules/security/session-isolation.js +0 -95
  129. package/dist/modules/session/index.js +0 -3
  130. package/dist/modules/session/manager.js +0 -172
  131. package/dist/modules/session/module.js +0 -24
  132. package/dist/modules/session/store.js +0 -228
  133. package/dist/modules/session/types.js +0 -1
  134. package/dist/modules/skills/index.js +0 -2
  135. package/dist/modules/skills/loader.js +0 -72
  136. package/dist/modules/skills/module.js +0 -130
  137. package/dist/modules/types.js +0 -1
  138. package/dist/modules/updater/checker.js +0 -32
  139. package/dist/modules/updater/index.js +0 -1
  140. package/dist/modules/user-profile/compressor.js +0 -16
  141. package/dist/modules/user-profile/index.js +0 -1
  142. package/dist/modules/user-profile/profile.js +0 -68
  143. package/dist/tools/approve.js +0 -32
  144. package/dist/tools/attach-image.js +0 -89
  145. package/dist/tools/bash.js +0 -337
  146. package/dist/tools/browser.js +0 -97
  147. package/dist/tools/create-dir.js +0 -55
  148. package/dist/tools/delete-file.js +0 -62
  149. package/dist/tools/edit-file.js +0 -79
  150. package/dist/tools/executor.js +0 -145
  151. package/dist/tools/file-info.js +0 -45
  152. package/dist/tools/filter-tools.js +0 -10
  153. package/dist/tools/glob-tool.js +0 -26
  154. package/dist/tools/grep-tool.js +0 -86
  155. package/dist/tools/index.js +0 -67
  156. package/dist/tools/list-dir.js +0 -47
  157. package/dist/tools/load-skill.js +0 -44
  158. package/dist/tools/mcp-call.js +0 -68
  159. package/dist/tools/move-file.js +0 -85
  160. package/dist/tools/path-utils.js +0 -51
  161. package/dist/tools/pipeline-run.js +0 -144
  162. package/dist/tools/preview.js +0 -2
  163. package/dist/tools/process-kill.js +0 -29
  164. package/dist/tools/process-list.js +0 -38
  165. package/dist/tools/process-log.js +0 -41
  166. package/dist/tools/question.js +0 -142
  167. package/dist/tools/read-file.js +0 -83
  168. package/dist/tools/recall.js +0 -110
  169. package/dist/tools/registry.js +0 -36
  170. package/dist/tools/remember.js +0 -67
  171. package/dist/tools/scope-check.js +0 -30
  172. package/dist/tools/search-history.js +0 -84
  173. package/dist/tools/subagent.js +0 -151
  174. package/dist/tools/types.js +0 -1
  175. package/dist/tools/user-input.js +0 -123
  176. package/dist/tools/web-browse.js +0 -86
  177. package/dist/tools/web-fetch.js +0 -98
  178. package/dist/tools/web-search.js +0 -78
  179. package/dist/tools/write-file.js +0 -83
  180. package/dist/ui/box.js +0 -81
  181. package/dist/ui/colors.js +0 -4
  182. package/dist/ui/diff.js +0 -178
  183. package/dist/ui/index.js +0 -6
  184. package/dist/ui/md-formatter.js +0 -212
  185. package/dist/ui/output.js +0 -13
  186. package/dist/ui/renderer.js +0 -204
  187. package/dist/ui/spinner.js +0 -70
  188. package/dist/ui/table.js +0 -144
package/dist/i18n/en.json DELETED
@@ -1,525 +0,0 @@
1
- {
2
- "file.created": "Created {path}",
3
- "file.deleted": "Deleted {path}",
4
- "file.updated": "Updated {path}",
5
- "file.written": "Written {path}",
6
- "file.notfound": "File not found: {path}",
7
- "file.dir_notfound": "Directory not found: {path}",
8
- "file.path_not_allowed": "Path not allowed: {path}",
9
- "file.path_not_allowed_short": "Path not allowed",
10
- "file.is_directory": "Is a directory, use rmdir: {path}",
11
- "file.replaced_in": "Replaced in {path}",
12
- "file.string_not_found": "String not found in file:\n{str}",
13
- "file.moved": "Moved {from} \u2192 {to}",
14
- "file.not_found_short": "Not found: {path}",
15
- "file.notfound_resolved": "File not found: {path} (resolved to {resolved})",
16
- "file.empty": "(empty)",
17
- "file.no_matches": "No matches",
18
- "file.truncated": "\n... (truncated)",
19
- "file.read_header": "── {path} ({ext}, {total} lines, lines {from}-{to})",
20
- "file.read_truncated": "\n\n[Truncated: {remaining} more lines. Use read_file with offset={next} to continue]",
21
- "file.empty_page": "(empty page)",
22
- "error.timeout": "Request timed out",
23
- "error.unknown": "An unknown error occurred",
24
- "error.notfound": "Not found: {path}",
25
- "error.prefix": "Error: ",
26
- "error.command_error": "Command error: {message}",
27
- "error.llm": "LLM error: {message}",
28
- "error.response_blocked": "Response blocked: {reason}",
29
- "error.max_iters": "Max iterations ({max}) reached",
30
- "error.empty_response": "Model returned an empty response after retries",
31
- "error.grep_failed": "Grep failed: {message}",
32
- "error.search_failed": "Search failed: {message}",
33
- "error.fetch_failed": "Fetch failed: {message}",
34
- "error.fetch_url_failed": "Failed to fetch {url}: {message}",
35
- "error.http": "HTTP {status}: {statusText}",
36
- "error.llm_api": "LLM API error {status} ({statusText}): {errorText}",
37
- "error.llm_retries": "LLM request failed after retries",
38
- "error.no_response_body": "No response body stream",
39
- "session.started": "Session started: {id}",
40
- "session.ended": "Session ended: {id}",
41
- "session.not_found": "Session not found: {id}",
42
- "session.no_active": "No active session",
43
- "session.deleted": "Session deleted: {id}",
44
- "session.renamed": "Session renamed to: {name}",
45
- "session.created": "Created session: {name}",
46
- "session.resumed": "Resumed session: {name}",
47
- "session.chat_cleared": "Chat cleared. Start typing to begin.",
48
- "session.chat_loaded": "Chat history loaded. Pick up where you left off.",
49
- "session.chat_history": "Chat history:",
50
- "session.user_label": "User",
51
- "session.assistant_label": "Assistant",
52
- "session.no_history": "Chat history is empty",
53
- "session.no_sessions": "No sessions found",
54
- "session.no_sessions_hint": "No sessions found. Create one with /new <name>",
55
- "session.available": "Available sessions:",
56
- "session.no_match": "No session matching \"{query}\"",
57
- "session.default_name": "Session {date}",
58
- "session.info": "[Session: \"{name}\" ({id}) \u2014 {count} messages so far]",
59
- "session.col_active": "",
60
- "session.col_id": "ID",
61
- "session.col_name": "Name",
62
- "session.col_updated": "Updated",
63
- "session.col_msgs": "Msgs",
64
- "tool.executed": "Executed {name}",
65
- "tool.failed": "Tool {name} failed: {error}",
66
- "tool.unknown": "Unknown tool: {name}",
67
- "tool.blocked": "Blocked by plugin: {plugin}",
68
- "tool.blocked_reason": "Blocked by plugin: {plugin}. Reason: {reason}",
69
- "tool.using": "[{label}]",
70
- "tool.friendly.write_file": "Writing file",
71
- "tool.friendly.read_file": "Reading file",
72
- "tool.friendly.edit_file": "Editing file",
73
- "tool.friendly.create_dir": "Creating directory",
74
- "tool.friendly.delete_file": "Deleting file",
75
- "tool.friendly.move_file": "Moving file",
76
- "tool.friendly.list_dir": "Listing files",
77
- "tool.friendly.file_info": "File info",
78
- "tool.friendly.glob": "Searching files",
79
- "tool.friendly.grep": "Searching content",
80
- "tool.friendly.bash": "Running command",
81
- "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}).",
82
- "tool.friendly.load_skill": "Loading skill",
83
- "tool.friendly.plan": "Planning",
84
- "tool.friendly.todo": "Updating tasks",
85
- "tool.friendly.verify": "Verifying",
86
- "tool.friendly.web_search": "Web search",
87
- "tool.friendly.web_fetch": "Fetching page",
88
- "tool.friendly.web_browse": "Browsing page",
89
- "tool.web_fetch_result": "Fetched page: {url} — {chars} chars, {lines} lines{truncated}",
90
- "tool.web_browse_result": "Browsed page: {url} — {chars} chars, {lines} lines{truncated}",
91
- "tool.web_search_result": "Search results for \"{query}\" — {count} results",
92
- "tool.friendly.browser": "Browser",
93
- "tool.friendly.subagent": "Sub-agent task",
94
- "tool.friendly.question": "Question to user",
95
- "tool.friendly.approve": "Approval request",
96
- "tool.friendly.search_history": "Searching history",
97
- "tool.friendly.pipeline_run": "Running pipeline",
98
- "tool.friendly.mcp_call": "MCP call",
99
- "tool.truncated": "[Truncated: {tokens} tokens removed]",
100
- "tool.subagent_queued": "Sub-agent task queued: {task}",
101
- "tool.pipeline_started": "Pipeline \"{name}\" execution started. Pipeline engine is a stub \u2014 run dispatched.",
102
- "tool.mcp_call": "MCP call: {server}/{tool} with {args}",
103
- "tool.action_required": "Action is required.",
104
- "tool.approve_prompt": "Approve? {action}",
105
- "tool.approve_yes": "Yes",
106
- "tool.approve_yes_desc": "Approve the action",
107
- "tool.approve_no": "No",
108
- "tool.approve_no_desc": "Reject the action",
109
- "tool.approved": "Approved",
110
- "tool.rejected": "Rejected by user",
111
- "tool.user_input.custom_option": "Type your own answer",
112
- "tool.user_input.choice_single": "Your choice (1-{max}): ",
113
- "tool.user_input.choice_multiple": "Your choice (comma-separated, e.g. 1,3): ",
114
- "tool.user_input.invalid": "Invalid choice, try again.",
115
- "tool.user_input.custom_prompt": "Your answer: ",
116
- "tool.question.progress": "Question {current}/{total}",
117
- "tool.question.no_questions": "No questions provided",
118
- "tool.question.unanswered": "Unanswered",
119
- "tool.question.answered": "User has answered your questions: {formatted}. You can now continue with the user's answers in mind.",
120
- "tool.name_or_task": "Provide either \"name\" or \"task\" parameter",
121
- "tool.invalid_params": "Invalid parameters",
122
- "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.",
123
- "tool.skill_available_hint": "Available skills",
124
- "tool.no_results": "No results found for \"{query}\"",
125
- "tool.search_results": "Search results for \"{query}\":\n{results}",
126
- "tool.history_results": "History results for \"{query}\":\n{results}",
127
- "tool.no_history": "No history entries matching \"{query}\"",
128
- "tool.no_sessions_dir": "No sessions directory found at {dir}",
129
- "tool.history_error": "Error searching history: {error}",
130
- "tool.memory_error": "Memory error: {error}",
131
- "tool.screenshot_unavailable": "[Screenshot captured \u2014 image not available for text-only model]",
132
- "tool.timeout": "Tool {name} timed out after {seconds} seconds",
133
- "tool.aborted": "Tool {name} was interrupted by user",
134
- "tool.interactive_disabled": "Interactive tool is disabled in exit-on-complete mode. Proceed without asking the user.",
135
- "proc.started": "Started background process {id} (PID {pid}).\nCommand: {command}",
136
- "proc.promoted_hint": "Command still running after {ms} ms — moved to the background",
137
- "proc.manage_hint": "Check output: process_log id={id}. Stop it: process_kill id={id}. List all: process_list.",
138
- "proc.none": "No background processes running.",
139
- "proc.not_found": "Process not found: {id}",
140
- "proc.killed": "Process {id} (PID {pid}) killed.",
141
- "proc.kill_failed": "Failed to kill process {id}",
142
- "proc.list_header": "Background processes",
143
- "proc.log_header": "Process {id} ({status}) output:",
144
- "proc.log_empty": "(no output yet)",
145
- "proc.hint": "Manage them with {list}, {log}, {kill}.",
146
- "proc.status_running": "running",
147
- "proc.status_exited": "exited",
148
- "proc.status_killed": "killed",
149
- "tool.friendly.process_list": "Listing background processes",
150
- "tool.friendly.process_log": "Process output",
151
- "tool.friendly.process_kill": "Stopping process",
152
- "plan.no_steps": "No plan steps specified. Provide concrete steps with files and commands.",
153
- "plan.created": "Plan created: {title} ({steps} steps)",
154
- "plan.coverage_warning": "Plan may be missing required files from the task: {missing}. Add steps covering them.",
155
- "plan.step_done": "Step {n}/{total}: {description} \u2713",
156
- "plan.complete": "Task complete: {summary}",
157
- "plan.title_steps": "Plan \"{title}\" created with {count} steps",
158
- "plan.step_marked": "Step {step} marked as {status}",
159
- "plan.aborted": "Plan aborted",
160
- "plan.unknown_action": "Unknown plan action: {action}",
161
- "plan.updated": "Plan updated: {title} ({steps} steps)",
162
- "plan.acknowledged": "Plan {action}: acknowledged",
163
- "plan.step_status": "Step {step}: {status}",
164
- "plan.no_active": "No active plan",
165
- "plan.step_not_found": "Step not found",
166
- "plan.show_header": "Plan status:",
167
- "plan.show_empty": "(plan has no steps)",
168
- "plan.list_header": "Plans:",
169
- "plan.list_empty": "No plans",
170
- "plan.switch_no_id": "Provide a plan id to switch to",
171
- "plan.not_found": "Plan not found: {id}",
172
- "plan.switched": "Switched to plan {id}: {title}",
173
- "plan.replanned": "Plan re-planned: {kept} completed steps kept, {steps} new steps added",
174
- "plan.replan_no_steps": "Provide new steps for re-planning",
175
- "todo.added": "Added {count} todo(s): {items}",
176
- "todo.marked_done": "Marked {count} item(s) as done",
177
- "todo.no_active": "No active todos",
178
- "todo.unknown_action": "Unknown todo action: {action}",
179
- "todo.acknowledged": "Todo acknowledged",
180
- "verify.passed": "Verification passed",
181
- "verify.failed": "Verification failed: {details}",
182
- "verify.file_exists": "File exists: {path}",
183
- "verify.file_not_found": "File not found: {path}",
184
- "verify.script_passed": "Script '{script}' passed",
185
- "verify.script_failed": "Script '{script}' failed: {message}",
186
- "verify.syntax_error": "Syntax error in: {path}",
187
- "cli.description": "Micro Models Agent \u2014 AI coding agent for small models",
188
- "cli.init": "Run interactive setup wizard",
189
- "cli.config_saved": "Configuration saved to ~/.mma/config.json",
190
- "cli.manage_config": "Manage configuration",
191
- "cli.config_key": "Config key (e.g., model, provider.baseUrl)",
192
- "cli.set_value": "Set a config value",
193
- "cli.set_done": "Set {key}={value}",
194
- "cli.show_config": "Show current config",
195
- "cli.manage_models": "Manage models",
196
- "cli.list_models": "List available models",
197
- "cli.current_model": "Current model:",
198
- "cli.model_hint": "(Use /model use <name> to change)",
199
- "cli.model_fetch_failed": "Failed to fetch models: {error}",
200
- "cli.available_models": "Available models:",
201
- "cli.no_models_found": "No models found from provider",
202
- "cli.fetching_models": "Fetching model list...",
203
- "cli.manage_context": "Manage context window",
204
- "cli.invalid_context_size": "Invalid context size. Must be a number >= 1024",
205
- "cli.context_set": "Context window set to: {size} tokens",
206
- "repl.reload": "Reload agent with current config",
207
- "repl.reload_usage": "Usage: /reload",
208
- "repl.reloading": "Reloading agent...",
209
- "repl.reloaded": "Agent reloaded",
210
- "cli.set_model": "Set default model",
211
- "cli.model_set": "Model set to: {name}",
212
- "cli.certify": "Run certification suite for a model",
213
- "cli.cert_provider_url": "Provider base URL to certify against (default: current config)",
214
- "cli.cert_provider_key": "Provider API key (optional)",
215
- "cli.cert_context_window": "Context window size in tokens",
216
- "cli.cert_tags": "Comma-separated scenario tags (core, security, image, network, browser)",
217
- "cli.cert_reps": "Default repetitions per scenario (overridden by scenario)",
218
- "cli.cert_force": "Re-run an existing certification",
219
- "cli.cert_clean": "Remove sandbox directories after a successful run",
220
- "cli.cert_security_required": "Security is disabled. Enable it first (e.g. `mma security set-policy balanced`) to run the security suite.",
221
- "cli.cert_no_scenarios": "No scenarios match tags: {tags}",
222
- "cli.cert_exists": "A certification for {model} already exists on this provider.",
223
- "cli.cert_exists_hint": "Use --force to re-run.",
224
- "cli.cert_started": "Certifying {model} on {provider}...",
225
- "cli.cert_done": "Certification complete: {passed} pass, {failed} fail, {skipped} skipped ({total} total)",
226
- "cli.cert_rep_pass": "pass",
227
- "cli.cert_rep_fail": "fail",
228
- "cli.cert_status": "Show certification status for a model",
229
- "cli.cert_list": "List all certifications",
230
- "cli.cert_uncertify": "Remove a certification",
231
- "cli.cert_not_found": "No certification found for {model}",
232
- "cli.cert_uncertified": "Certification removed for {model}",
233
- "cli.cert_empty": "No certifications yet. Run `mma model certify <model>` first.",
234
- "cli.cert_provider_col": "provider",
235
- "cli.cert_suite_col": "suite",
236
- "cli.cert_date_col": "date",
237
- "cli.cert_version_col": "MMA version",
238
- "cli.cert_stale_hint": "Run `mma model certify --force` to refresh.",
239
- "cli.cert_fixture_missing": "Fixture missing for {id}: {path}",
240
- "cli.cert_marks_hint": "Markers: ✔ certified on this provider, ○ certified on an older MMA version, · not certified",
241
- "cli.manage_providers": "Manage providers",
242
- "cli.list_providers": "List providers",
243
- "cli.current_provider": "Current provider:",
244
- "cli.base_url": "Base URL:",
245
- "cli.set_provider": "Set active provider",
246
- "cli.provider_set": "Provider set to: {name}",
247
- "cli.manage_sessions": "Manage sessions",
248
- "cli.list_sessions": "List all sessions",
249
- "cli.show_details": "Show session details",
250
- "cli.delete_session": "Delete a session",
251
- "cli.first_run": "First run detected. Running setup wizard...",
252
- "cli.unknown_cmd": "Unknown command: {name}.",
253
- "cli.help_hint": "Type /help for available commands.",
254
- "cli.available_cmds": "\nAvailable commands:",
255
- "cli.no_output": "The agent finished but produced no output. The task may be incomplete.",
256
- "cli.no_agents_md": "Disable loading AGENTS.md files into system prompt",
257
- "cli.dir": "Working directory for the agent (defaults to current directory)",
258
- "cli.exit_on_complete": "Exit immediately when the task is done; interactive tools (question/approve) fail fast instead of blocking on stdin",
259
- "cli.json": "Output the result as JSON (single-run mode)",
260
- "cli.security.description": "Manage security settings",
261
- "cli.security.status": "Show current security configuration",
262
- "cli.security.policies": "List available security policies",
263
- "cli.security.set_policy": "Apply a security policy preset",
264
- "cli.security.preset": "Policy preset (strict, balanced, permissive)",
265
- "cli.security.invalid_preset": "Invalid preset. Available: {presets}",
266
- "cli.security.policy_applied": "Security policy applied: {name}",
267
- "cli.security.policy_description": "Description: {description}",
268
- "cli.security.enable_encryption": "Enable session file encryption",
269
- "cli.security.disable_encryption": "Disable session file encryption",
270
- "cli.security.encryption_enabled": "Session file encryption enabled",
271
- "cli.security.encryption_disabled": "Session file encryption disabled",
272
- "cli.security.enable_audit": "Enable audit notifications",
273
- "cli.security.disable_audit": "Disable audit notifications",
274
- "cli.security.audit_enabled": "Audit notifications enabled",
275
- "cli.security.audit_disabled": "Audit notifications disabled",
276
- "cli.security.audit_stats": "Show audit notification statistics",
277
- "cli.security.audit_stats_title": "Audit Notification Statistics",
278
- "cli.security.total_notifications": "Total notifications",
279
- "cli.security.by_severity": "By severity",
280
- "cli.security.by_type": "By type",
281
- "cli.security.low": "Low",
282
- "cli.security.medium": "Medium",
283
- "cli.security.high": "High",
284
- "cli.security.critical": "Critical",
285
- "cli.security.current_policy": "Current Security Configuration",
286
- "cli.security.bash_enabled": "Bash command validation",
287
- "cli.security.path_validation": "Path access validation",
288
- "cli.security.network_validation": "Network request validation",
289
- "cli.security.content_scanning": "Content scanning",
290
- "cli.security.max_recursion": "Max recursion depth",
291
- "cli.security.max_file_ops": "Max file operations",
292
- "cli.security.rate_limit": "Rate limit",
293
- "cli.security.session_encryption": "Session encryption",
294
- "cli.security.audit_notifier": "Audit notifications",
295
- "cli.security.available_policies": "Available Security Policies",
296
- "cli.security.recommended_for": "Recommended for",
297
- "cli.yes": "Yes",
298
- "cli.no": "No",
299
- "repl.help": "Show available commands",
300
- "repl.help_usage": "Usage: /help",
301
- "repl.exit": "Exit the REPL",
302
- "repl.exit_usage": "Usage: /exit",
303
- "repl.clear": "Clear the screen",
304
- "repl.clear_usage": "Usage: /clear",
305
- "repl.run": "Run a prompt through the agent",
306
- "repl.run_usage": "Usage: /run <prompt>",
307
- "repl.config": "Show current configuration",
308
- "repl.config_usage": "Usage: /config",
309
- "repl.reasoning": "Toggle showing model reasoning/thinking",
310
- "repl.reasoning_usage": "Usage: /reasoning",
311
- "repl.status": "Show agent status",
312
- "repl.status_usage": "Usage: /status",
313
- "repl.sessions": "List all sessions (* active)",
314
- "repl.sessions_usage": "Usage: /sessions",
315
- "repl.new": "Create a new session",
316
- "repl.new_usage": "Usage: /new [name]",
317
- "repl.resume": "Switch to a session by id or name prefix",
318
- "repl.resume_usage": "Usage: /resume <id|name>",
319
- "repl.rename": "Rename the current session",
320
- "repl.rename_usage": "Usage: /rename <new-name>",
321
- "repl.delete": "Delete a session by id",
322
- "repl.delete_usage": "Usage: /delete <session-id>",
323
- "repl.skill": "Manage skills (list, loaded, load, unload, search)",
324
- "repl.no_skills": "No skills available",
325
- "repl.available_skills": "Available skills:",
326
- "repl.no_loaded": "No skills loaded",
327
- "repl.loaded_skills": "Loaded skills:",
328
- "repl.budget": "Budget: {used} / {total} tokens ({remaining} remaining)",
329
- "repl.skill_load_usage": "Usage: /skill load <name>",
330
- "repl.skill_unload_usage": "Usage: /skill unload <name>",
331
- "repl.skill_unloaded": "Skill \"{name}\" unloaded",
332
- "repl.skill_not_loaded": "Skill \"{name}\" is not loaded",
333
- "repl.skill_search_usage": "Usage: /skill search <query>",
334
- "repl.no_skill_match": "No skills match \"{query}\"",
335
- "repl.skills_matching": "Skills matching \"{query}\":",
336
- "repl.skill_unknown_sub": "Unknown skill subcommand: {subcmd}",
337
- "repl.skill_usage": "Usage: /skill [list|loaded|load|unload|search]",
338
- "repl.agent": "Agent: ",
339
- "repl.interrupt": "Interrupted (Esc)",
340
- "repl.title": "MMA REPL v{version}",
341
- "repl.model": "Model:",
342
- "repl.provider": "Provider:",
343
- "repl.context": "Context:",
344
- "repl.sysprompt_label": "System prompt:",
345
- "repl.sysprompt_size": "{used} / {budget} tokens",
346
- "repl.sysprompt_desc": "Show system prompt",
347
- "repl.max_iters": "Max iters:",
348
- "repl.stuck_thresh": "Stuck thresh:",
349
- "repl.reasoning_label": "Reasoning:",
350
- "repl.log_level": "Log level:",
351
- "repl.locale": "Locale:",
352
- "repl.session_label": "Session:",
353
- "repl.skills_label": "Skills:",
354
- "repl.plugins_label": "Plugins:",
355
- "repl.mcp_label": "MCP:",
356
- "repl.work_dir": "Dir:",
357
- "repl.agents_label": "Instructions:",
358
- "repl.not_found": "not found",
359
- "repl.disabled": "disabled (--no-agents-md)",
360
- "repl.show": "show",
361
- "repl.hide": "hide",
362
- "repl.resume_hint": "Use /resume <id> or /resume <name> to switch between sessions",
363
- "repl.reasoning_status": "Reasoning: {status}",
364
- "repl.wizard": "Run setup wizard",
365
- "repl.wizard_usage": "Usage: /wizard",
366
- "repl.wizard_running": "Running setup wizard... (current config will be overwritten)",
367
- "repl.provider_list": "Show/set provider",
368
- "repl.provider_current": "Current provider",
369
- "repl.provider_set": "Provider set to: {name}",
370
- "repl.provider_usage": "Usage: /provider list | /provider use <type>",
371
- "repl.model_list": "Show/set model",
372
- "repl.model_current": "Current model",
373
- "repl.model_set": "Model set to: {name}",
374
- "repl.model_usage": "Usage: /model list | /model use <name>",
375
- "repl.group.general": "General",
376
- "repl.group.agent": "Agent",
377
- "repl.group.session": "Sessions",
378
- "repl.group.skill": "Skills",
379
- "setup.title": "\n MMA Setup Wizard v2\n",
380
- "setup.select_provider": "\n Select provider type:",
381
- "setup.select_provider_num": "\n Select provider (1-{max})",
382
- "setup.scanning": " Scanning local LLM servers...",
383
- "setup.found_servers": " Found {count} server(s):",
384
- "setup.no_servers": " No local servers found. Enter URL manually.",
385
- "setup.api_base": " API Base URL",
386
- "setup.provider_type": " Provider type",
387
- "setup.api_key": " API Key (press Enter to skip)",
388
- "setup.fetching_models": " Fetching model list...",
389
- "setup.available_models": " Available models:",
390
- "setup.select_model": " Select model (1-{max})",
391
- "setup.model_name": " Model name",
392
- "setup.testing": "\n Testing chat with model \"{model}\"...",
393
- "setup.ok": " OK \u2014 connection successful",
394
- "setup.warning": " WARNING: could not connect \u2014 check your API endpoint and key",
395
- "setup.agent_settings": "\n --- Agent settings ---",
396
- "setup.context_window": " Context window (tokens)",
397
- "setup.max_iters": " Max tool iterations",
398
- "setup.language": "\n --- Language ---",
399
- "setup.ui_lang": " UI language (en/ru)",
400
- "setup.complete": "\n Setup complete!\n",
401
- "setup.select_server": "\n Select server (1-{max})",
402
- "setup.custom_url": "Custom URL",
403
- "setup.scanning_spinner": "Scanning local LLM servers…",
404
- "setup.fetching_spinner": "Fetching model list…",
405
- "setup.testing_spinner": "Testing chat with \"{model}\"…",
406
- "setup.summary_setting": "Setting",
407
- "setup.summary_value": "Value",
408
- "setup.security_header": "\n --- Security ---",
409
- "setup.security_status_off": " Security: OFF (default — all commands allowed)",
410
- "setup.security_configure": " Configure security? (y/N)",
411
- "setup.security_bash_block": " Block dangerous commands (rm, sudo, ssh, etc.)? (y/N)",
412
- "setup.security_flags_block": " Block dangerous flags (--force, -rf, etc.)? (y/N)",
413
- "setup.security_paths_deny": " Allow access to .git/, .env, node_modules/? (y/N)",
414
- "skill.already_loaded": "Skill \"{name}\" is already loaded",
415
- "skill.not_found": "Skill \"{name}\" not found in any source directory",
416
- "skill.no_match": "No skills match for: {task}",
417
- "skill.too_large": "Skill \"{name}\" is too large ({tokens} tokens). Budget: {budget} tokens. Continue the task without this skill.",
418
- "skill.exceeds_budget": "Skill \"{name}\" ({tokens} tokens) exceeds remaining budget ({remaining} tokens). Unload other skills first.",
419
- "skill.loaded": "Skill \"{name}\" loaded ({tokens} tokens, {remaining} remaining)",
420
- "skill.auto_loaded": "[Auto-loaded skill: {name}]",
421
- "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.",
422
- "skill.prompt_fallback": "If load_skill fails because a skill is too large, continue the task without it — do not stop.",
423
- "skill.loaded_content": "[Skill loaded: {name}]\n{content}\n\nUse this knowledge to answer the user's question.",
424
- "exec.stuck": "No progress on step {stepId} ({description}) for {iterations} iterations.",
425
- "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.",
426
- "exec.tool_errors": "Tool {tool} failed {count} times. Consider using a different tool.",
427
- "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.",
428
- "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.",
429
- "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.",
430
- "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.",
431
- "exec.plan_blocked": "{max} consecutive calls outside the current step. Finish step {step} before proceeding — other steps should wait until this one is complete.",
432
- "exec.off_track": "Step {stepId} — \"{description}\" — but you are using {tool} on a different path. Return to the current step.",
433
- "exec.step_gate_deps": "[\u26a0 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\".]",
434
- "exec.step_gate_deps_force": "[\u26a0 Step {step}: dependencies still not installed (no lock file) \u2014 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.]",
435
- "exec.step_gate_empty": "[\u26a0 Step {step}: files exist but appear empty: {files}. Add real code to these files before advancing to the next step.]",
436
- "exec.step_gate_ok": "[\u2713] Step {step} completed and verified. MOVING to step {nextStep}: \"{nextDesc}\". Work ONLY on this step.",
437
- "exec.step_gate_last": "[\u2713] Step {step} completed — that was the final step. Verify everything together and provide the final answer.]",
438
- "exec.audit_pass": "[\u2713] Task complete: {done}/{total} steps done, {files} files verified",
439
- "exec.audit_fail": "[\u2717] Task incomplete: {done}/{total} steps done, {files} files missing",
440
- "exec.audit_fail_typecheck": "[\u2717] Task incomplete: {done}/{total} steps done, {missing} files missing, typecheck error: {typeError}",
441
- "exec.audit_incomplete": "[\u26a0 Final audit incomplete: {summary}. Task is NOT finished \u2014 continue working. Remaining steps: {steps}]",
442
- "exec.mass_edit_warning": "\u26a0\ufe0f Plan affects {count} files \u2014 review the full list before proceeding.",
443
- "exec.escalation": "\n\n\u26a0\ufe0f Agent stuck on step {stepId} ({description}). Escalating to user \u2014 please provide guidance.",
444
- "exec.hints": "\n[Hints]\n{hints}",
445
- "exec.file_rewrite_warning": "\u26a0\ufe0f File {file} has been rewritten {count} times. Consider a different approach \u2014 the current fix strategy is not working.",
446
- "hall.max_retries_exhausted": "Model returned empty or insufficient responses after multiple retries",
447
- "hall.short_response": "Response too short or empty",
448
- "hall.repetitive": "Response too repetitive ({pct}% overlap)",
449
- "hall.uncertainty": "Uncertainty markers: {markers}",
450
- "hall.unknown_paths": "Mentioned file paths not found in known files: {paths}",
451
- "hall.contradiction_llm": "Contradicts an earlier decision{reason}",
452
- "hall.uncertainty_prefix": "\n\n[\u26a0\ufe0f Uncertainty] ",
453
- "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.",
454
- "browser.unknown_action": "Unknown action: {action}",
455
- "browser.error": "Browser error: {message}",
456
- "browser.no_page": "No page open. Use action \"open\" first.",
457
- "browser.url_required": "URL is required",
458
- "browser.create_page_failed": "Failed to create page",
459
- "browser.nav_failed": "Navigation failed: {message}",
460
- "browser.invalid_target": "Invalid target. Provide element number from snapshot.",
461
- "browser.click_failed": "Click failed: {message}. Check element number.",
462
- "browser.invalid_target_short": "Invalid target.",
463
- "browser.text_required": "Text is required.",
464
- "browser.type_failed": "Type failed: {message}",
465
- "browser.direction_invalid": "Direction must be: up, down, top, bottom",
466
- "browser.scroll_failed": "Scroll failed: {message}",
467
- "browser.closed": "Browser closed.",
468
- "browser.no_page_short": "No page",
469
- "browser.no_elements": "(no interactive elements on page)",
470
- "browser.more_elements": "... and more elements not shown. Use scroll or search to find others.",
471
- "pipeline.invalid": "Invalid pipeline: name and steps required",
472
- "pipeline.step_missing_fields": "Step missing required fields (id, agent, prompt): {step}",
473
- "pipeline.circular": "Circular dependency: {stepId}",
474
- "plugin.loaded": "Loaded plugin: {name}",
475
- "plugin.skipped": "Skipped incompatible plugin: {entry} ({message})",
476
- "migration.detected": "[MMA] Detected old config. {summary}",
477
- "migration.summary": "[MMA] {summary}",
478
- "migration.config_bak": "- config \u2192 config.json.bak",
479
- "migration.dir_bak": "- .mma/ \u2192 .mma.bak/ ({count} files)",
480
- "migration.migrated": "Migrated:",
481
- "migration.not_needed": "No migration needed",
482
- "ui.error_prefix": "Error: ",
483
- "ui.success_prefix": "\u2713 ",
484
- "ui.warning_prefix": "\u26a0 ",
485
- "ui.thinking": "Thinking…",
486
- "indexer.map_header": "Project map",
487
- "indexer.top_directories": "Top directories",
488
- "indexer.files": "Files",
489
- "indexer.empty": "No indexed files",
490
- "indexer.and_more": "... and {count} more files",
491
- "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.",
492
- "indexer.project_map_action_desc": "Action: summary, refresh, or find",
493
- "indexer.project_map_query_desc": "Search query for the find action (matches file path or exported names)",
494
- "indexer.summary": "Project map: {summary}",
495
- "indexer.refreshed": "Project map refreshed: {summary}",
496
- "indexer.not_indexed": "Project has not been indexed yet",
497
- "indexer.find_results": "Found {count} matching files:\n{results}",
498
- "indexer.no_matches": "No matching files for \"{query}\"",
499
- "tool.friendly.project_map": "Project map",
500
- "config.decryption_warning": "Warning: Failed to decrypt config: {error}",
501
- "config.encryption_warning": "Warning: Failed to encrypt config: {error}",
502
- "image.source_required": "Image source is required. Provide a file path, URL, or \"clipboard\".",
503
- "image.clipboard_empty": "Clipboard does not contain an image. Copy an image first (e.g. screenshot with Win+Shift+S).",
504
- "image.not_found": "Image file not found: {path}",
505
- "image.no_context": "No context manager available. Image can only be attached during an active session.",
506
- "image.attached": "Image attached from {source} ({size}). It will be included in the next message.",
507
- "image.error": "Failed to load image: {message}",
508
- "tool.friendly.attach_image": "Attach image",
509
- "repl.image": "Attach image",
510
- "repl.image_usage": "/image <path|url|clipboard> — attach an image to the next message",
511
- "tool.friendly.remember": "Remember",
512
- "tool.friendly.recall": "Recall",
513
- "tool.remember.preference": "Remembered: {key} = {value}",
514
- "tool.remember.entry": "Remembered: {category} — \"{entry}\"",
515
- "tool.remember.key_required": "Key is required for preferences",
516
- "tool.remember.entry_required": "Entry text is required",
517
- "tool.recall.empty": "Nothing found for \"{query}\"",
518
- "tool.recall.no_memory": "Memory is empty",
519
- "tool.recall.search_results": "{category} results:\n{results}",
520
- "ctx.compactions": "compactions: {count}",
521
- "ctx.quality": "quality: {percent}%",
522
- "ctx.delta_pos": "ctx +{tokens}",
523
- "ctx.delta_neg": "ctx -{tokens} ↓",
524
- "ctx.delta_zero": "ctx ±0"
525
- }
@@ -1,46 +0,0 @@
1
- import en from "./en.json";
2
- import ru from "./ru.json";
3
- const locales = { en, ru };
4
- let currentLocale = "en";
5
- function flatten(obj, prefix = "") {
6
- let result = {};
7
- for (const [key, val] of Object.entries(obj)) {
8
- const fullKey = prefix ? `${prefix}.${key}` : key;
9
- if (typeof val === "string") {
10
- result[fullKey] = val;
11
- }
12
- else if (typeof val === "object" && val !== null) {
13
- result = {
14
- ...result,
15
- ...flatten(val, fullKey),
16
- };
17
- }
18
- }
19
- return result;
20
- }
21
- const flat = {};
22
- for (const [name, dict] of Object.entries(locales)) {
23
- flat[name] = flatten(dict);
24
- }
25
- export function setLocale(locale) {
26
- if (flat[locale]) {
27
- currentLocale = locale;
28
- }
29
- }
30
- export function loadLocale(name, dict) {
31
- locales[name] = dict;
32
- flat[name] = flatten(dict);
33
- }
34
- export function t(key, params) {
35
- const localeDict = flat[currentLocale];
36
- const enDict = flat["en"];
37
- let template = localeDict?.[key] ?? enDict?.[key] ?? key;
38
- if (!template)
39
- return key;
40
- if (params) {
41
- for (const [k, v] of Object.entries(params)) {
42
- template = template.replaceAll(`{${k}}`, String(v));
43
- }
44
- }
45
- return template;
46
- }