micro-models-agent 1.1.0 → 1.6.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.
- package/CHANGELOG.md +128 -0
- package/dist/i18n/en.json +36 -3
- package/dist/i18n/ru.json +36 -3
- package/dist/main.js +2376 -872
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,134 @@ All notable changes to Micro Models Agent (MMA) will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/), and this project adheres to [Semantic Versioning](https://semver.org/).
|
|
6
6
|
|
|
7
|
+
## [1.6.0] - 2026-09-22
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- **Tab completion descriptions & navigation** (`src/cli/completer.ts`, `src/ui/line-editor.ts`): completions carry descriptions, file-path completion is registered in the REPL, arrow keys/Tab cycle candidates, Esc restores.
|
|
12
|
+
- **`redactConfigSecrets`** (`src/config/redact.ts`): deep secret redaction for config display.
|
|
13
|
+
|
|
14
|
+
### Fixed
|
|
15
|
+
|
|
16
|
+
- **Security-paths wizard answer** (`src/cli/setup.ts`, `src/cli/setup-order.ts`): the question was inverted and a no-op; reworded to restrict semantics and `security.paths.enabled` is now applied.
|
|
17
|
+
- **First-run wizard suppression** (`src/config/config.ts`, `src/cli/main.ts`): `loadConfig` no longer persists default config on first load; one-shot runs warn instead of silently using defaults.
|
|
18
|
+
- **`/wizard` dropped security answers and ignored `provider.entries[]`** (`src/cli/repl-commands.ts`, `src/cli/setup-order.ts`): applies answers centrally and updates the active entry.
|
|
19
|
+
- **`mma config show` leaked secrets** (`src/cli/commands.ts`): secrets redacted by default, `--show-secrets` opts out.
|
|
20
|
+
|
|
21
|
+
### Changed
|
|
22
|
+
|
|
23
|
+
- **Chat UI: tool-label accent & separators** (`src/ui/theme.ts`, `src/ui/renderer.ts`, `docs/design/ui/STYLE.md`): the action glyph and the localized tool label now share the category color (`toolAccent`), and a dim `·` separates a status label from its content (reasoning label from reasoning text, tool label from arguments) — the rotating status verb no longer blurs into the model's own words. `Ctrl+O` reprint follows the same accent.
|
|
24
|
+
|
|
25
|
+
## [1.5.0] - 2026-09-21
|
|
26
|
+
|
|
27
|
+
### Added
|
|
28
|
+
|
|
29
|
+
- **Canonical chat UI style** (`docs/design/ui/STYLE.md`, mockup `docs/design/ui/mockup-chat-en-ru.html`, linked from AGENTS.md as the single correct style): no boxed panels, one shared glyph set, semantic color roles, quiet-by-default with detail on demand.
|
|
30
|
+
- **UI theme module** (`src/ui/theme.ts`): single source for chat glyphs (`◇ ✓ ✗ ⚠ ✦ ? ↵ ↳ │ ▰▱ ⟡ ⟳`), semantic marks and the `Verbosity` type.
|
|
31
|
+
- **Chat verbosity levels** (`ui.verbosity`: `quiet | normal | verbose`, default `quiet`): quiet folds each action into a single `◇ label ✓ ms` line, hides tool bodies and only surfaces the first line of a failed action. New `/verbose [level]` REPL command and `--verbose` plumbing; legacy `ui.verbose` still maps to `verbose`.
|
|
32
|
+
- **Read-only run summaries** (`src/ui/renderer.ts`): in quiet mode a consecutive run of read-only tools (`read_file`, `grep`, `glob`, web, …) collapses into one `│ N actions ✓ · ms · /verbose` line; mutating/executing tools stay visible.
|
|
33
|
+
- **Calm security/protected-path failures** (`src/core/agent/tool-output.ts`, `src/core/agent/tool-batch.ts`, `src/modules/security/protected-paths.ts`): `toolFailureSummary` maps `[SECURITY BLOCKED]` / `[PROTECTED PATH]` refusals to short localized warnings (`⚠`) instead of red walls; raw markers never reach the chat.
|
|
34
|
+
- **`Ctrl+O` action reprint** (`src/ui/action-log.ts`, `src/cli/repl.ts`): the last action's label, args, status and full body are kept and reprinted on demand, so quiet mode stays quiet without losing detail.
|
|
35
|
+
- **Spinner elapsed time** (`src/ui/spinner.ts`): the busy line shows `· Ns` once a tool runs longer than 3 seconds.
|
|
36
|
+
- **Status voice** (`src/ui/renderer.ts`): thinking phases rotate a few short human labels (`thinking` / `working it out` / `considering`, localized) instead of repeating one word.
|
|
37
|
+
- **Plan checklist restyle** (`src/ui/plan-view.ts`): `◇ title ▰▱ 1/3` header and `✓ / ◇ / ○ / ✗` step marks, dropping the raw plan id and `[x]` brackets.
|
|
38
|
+
- **Category-colored action glyph** (`src/ui/theme.ts`): the single `◇` mark is colored by tool category — recon cyan, mutate magenta, execute blue, meta dim. Per-tool emoji icons are no longer rendered.
|
|
39
|
+
- **Human tool arguments** (`src/ui/renderer.ts`): raw JSON is replaced by short phrases — `plan update` → `step 2 → done`, `browser scroll down`, `move_file` → `a → b`, `mcp_call` → `server/tool`, `remember`, `enable_tools`, `glob`/`grep`/`subagent`/`set_thinking`/`verify`/`process_log` and more.
|
|
40
|
+
- **Quiet hides structured info logs** (`src/output/channel.ts`): `info`-level log events (`[INFO] [mma] …`) are dropped from the terminal in quiet mode; warn/error and `writeLine` blocks are unaffected.
|
|
41
|
+
|
|
42
|
+
### Fixed
|
|
43
|
+
|
|
44
|
+
- **Closing code fence without a trailing newline** (`src/ui/md-formatter.ts`): a final ```` ``` ```` at end of stream was rendered as code content; it now closes the block.
|
|
45
|
+
- **Thought duration inside the answer** (`src/ui/renderer.ts`): the thinking block is closed when the final answer or the next tool starts, so `N.Ns` never lands inside the response text.
|
|
46
|
+
- **Durations over a second** (`src/ui/theme.ts`): rendered as `1.4s` instead of `1400ms`.
|
|
47
|
+
|
|
48
|
+
### Changed
|
|
49
|
+
|
|
50
|
+
- **Tool output never shows system names** (`src/ui/renderer.ts`): tool identifiers (`read_file`, `bash`, …) are lookup keys only — the chat renders the localized `tool.friendly.*` label, with a generic localized fallback when a translation is missing.
|
|
51
|
+
- **One action glyph** (`Renderer.toolMarker`): every tool uses `◇` instead of per-category arrows/asterisks.
|
|
52
|
+
- **Calm errors** (`src/ui/renderer.ts`, `src/ui/md-formatter.ts`): `✗` for real failures, `⚠` for soft blocks; `ui.error_prefix` is now `✗ ` in both locales.
|
|
53
|
+
- **No box-drawing grids** (`src/ui/md-formatter.ts`, `src/ui/table.ts`): code blocks use a dim language label plus a `│` gutter; markdown tables render as a bold header + dim rule + aligned columns.
|
|
54
|
+
- **Thinking header and run footer**: `✦ thinking` instead of `→ Thought:`, `⟡ model · provider · ms` instead of `▣`.
|
|
55
|
+
- **Answer has no marker prefix** (`src/ui/renderer.ts`): the final answer starts on a fresh line instead of `- …`, so a response that opens with a code block is not mangled.
|
|
56
|
+
|
|
57
|
+
## [1.4.0] - 2026-09-21
|
|
58
|
+
|
|
59
|
+
### Added
|
|
60
|
+
|
|
61
|
+
- **Protected-path confirmation guard** (`src/modules/security/protected-paths.ts`): file-mutating tools (`write_file`, `edit_file`, `delete_file`, `move_file`, `create_dir`) now refuse paths under VCS internals (`.git/`, `.hg/`, `.svn/`) and secret/env files (`.env*`, `*.key`, `*.pem`, `*.p12`, `*.pfx`, `*.crt`, `*.secret`, `*.token`, `.npmrc`, `.netrc`, `.git-credentials`, `.gitconfig`) with a directive to ask the user for explicit confirmation. The guard is **always on** (independent of `security.paths.enabled`) and never hard-blocks — the user can still approve. Verified live on `qwen/qwen3.5-9b`: the model recognized the rule from the prompt, refused, and asked the user.
|
|
62
|
+
- **System-prompt `PROTECTED PATHS` rule** (`src/core/bootstrap.ts`): the model is told up front not to modify VCS/secret/env paths without explicit user confirmation, and to stop and ask if a tool reports one (no `bash` workarounds).
|
|
63
|
+
|
|
64
|
+
### Fixed
|
|
65
|
+
|
|
66
|
+
- **Provenance after transparent provider failover** (`src/core/agent.ts`, `src/core/agent/token-tracker.ts`, `src/core/bootstrap.ts`): after `FallbackProvider` switched to another entry, the footer, cost attribution and `llm_usage` still reported the original provider. `callerProvenance()` now reads the live active entry (`getProviderName`), and `TokenTracker.logUsage` passes `provider`/`model` into `llm_usage`. Verified live: `provider failover: dead -> live` → footer `· live`, `llm_usage.provider=live`.
|
|
67
|
+
- **Session encryption config was ignored** (`src/core/bootstrap.ts`): `SessionStore` was constructed without `config.security.sessionEncryption`, so enabling `security.sessionEncryption` silently left `session.jsonl`/`history.jsonl` in plaintext. The config is now passed through; verified live (files written as `salt:iv:authTag:data`).
|
|
68
|
+
- **Certification harness hardening** (`src/modules/certification/`, found by running the full suite on `qwen/qwen3.5-9b`):
|
|
69
|
+
- `syncGlobalManifest` no longer downgrades a fresher local certification with an older bundled manifest — it overwrites a key only when the bundled entry is genuinely newer (`manifest.ts`).
|
|
70
|
+
- `readMergedManifest` now picks the **newer** entry (by `mmaVersion`, then `certifiedAt`) instead of always letting a stale legacy project manifest shadow the global one, so `model cert-status`/`cert-list` show the real result.
|
|
71
|
+
- `outputContains` is case-insensitive, so security scenarios match the uppercase `[SECURITY BLOCKED]` harness marker deterministically rather than depending on the model echoing lowercase "security".
|
|
72
|
+
- MoE scenarios state "working directory root (no subdirectories)"; the security scenarios explicitly instruct the model to attempt the blocked command (a small model otherwise refused and never exercised the block).
|
|
73
|
+
|
|
74
|
+
## [1.3.1] - 2026-09-21
|
|
75
|
+
|
|
76
|
+
### Added
|
|
77
|
+
|
|
78
|
+
- **Code style guide** (`docs/agents/code-style.md`, AGENTS.md/architecture rules #18): formatting, ban on `as any`/`as unknown as X` (except annotated test seams), `import type`, explicit export return types, abortable waits, no silent `catch`, Russian comments, and a phased tsconfig-strictness ladder.
|
|
79
|
+
|
|
80
|
+
### Fixed
|
|
81
|
+
|
|
82
|
+
- **False-positive repeated-tool hard stop** (`src/core/agent.ts`): under `--exit-on-complete` an identical repeated tool call was stopped after two repeats even when it was a legitimate request ("run `echo tick` four times"), ending the run with an empty answer. The hard stop now applies only to loop-prone status tools (`session_info`/`process_list`/`process_log`/`file_info`/`project_map`); side-effecting tools (e.g. `bash`) stay nudge-only. Verified live on `qwen/qwen3.5-9b`.
|
|
83
|
+
- **False hallucination warning for filenames with spaces** (`src/modules/hallucination/factual.ts`): `отчёт 1.txt` was tokenized as `1.txt` and flagged as a missing file. `bareNameExists` now also matches a known/indexed name ending in `" <token>"`. Verified live.
|
|
84
|
+
- **`tool_call` args JSON sanitization** (`src/core/session-logger.ts`): `logToolCall` no longer loses the whole entry when the data sanitizer corrupts the arg JSON (e.g. `password=secret"` loses a closing quote) — falls back to a raw string and warns.
|
|
85
|
+
- **Invalid tool-call arguments** (`src/core/agent.ts`): a malformed `tool_call.arguments` JSON no longer silently becomes `{}`; it is logged (`tool_args_parse_error`) and a `system-summary` tells the model to re-issue the call with valid JSON.
|
|
86
|
+
- **MoE plan mutation** (`src/modules/execution/moe-executor.ts`): `resolveScopeAndRetry` expands scope on a local copy, so the original plan stays intact for verification/re-plan.
|
|
87
|
+
- **Browser session race in MoE** (`src/tools/browser.ts`): concurrent waves are serialized via a promise chain instead of clobbering the shared Playwright session; `closeBrowserSession` waits for the in-flight action; missing cookie dir is created; close failures are logged. Screenshot vision detection broadened (`modelSupportsVision`).
|
|
88
|
+
- **Security-block nudge scope** (`src/core/agent/tool-batch.ts`): `sawSecurityBlock` is reset per tool batch, so a stale block cannot trigger the wrapper-script nudge much later.
|
|
89
|
+
- **Per-tool cost** (`src/core/agent/tool-batch.ts`): the tool-end event now reports the delta (`total_after - total_before`) instead of the cumulative session cost.
|
|
90
|
+
- **`edit_file` argument guard** (`src/tools/edit-file.ts`): non-string `old`/`new` are rejected with a clear error instead of being coerced to `"null"`/`"[object Object]"`; unreadable files return a localized message.
|
|
91
|
+
- **Bash failure counters scoped to the session** (`src/tools/bash.ts`): the module-level `FAILING_FIRST_WORDS` map is reset when the session id changes, so failures from a previous session do not trigger a bogus hard-stop later.
|
|
92
|
+
- **Migration backup skip is logged** (`src/migration/backup.ts`): a pre-existing `.bak` directory is reported at debug level instead of being skipped silently.
|
|
93
|
+
- **File I/O error handling** (`src/tools/write-file.ts`, `src/tools/read-file.ts`): `writeFileSync`/`readFileSync` failures (ENOSPC/EPERM, file vanished between `existsSync` and read) now return a localized message with the path and reason instead of throwing a bare Node error; numeric `offset`/`limit` are validated instead of cast.
|
|
94
|
+
- **`listModels` typed parsing** (`src/llm/openai-compat.ts`): provider responses are parsed via a narrowing helper (no `as any`), tolerating both `{data:[…]}` and bare arrays.
|
|
95
|
+
- **Nested markdown emphasis** (`src/ui/md-formatter.ts`): `***bold italic***` renders as bold+italic without leaving a stray asterisk.
|
|
96
|
+
|
|
97
|
+
### Changed
|
|
98
|
+
|
|
99
|
+
- **MoE messages localized** (`src/core/agent-moe.ts`, i18n `moe.*` en+ru): planning/fallback/auto-fix/no-orchestrator/plan-failed strings go through `t()`.
|
|
100
|
+
- **MoE typing** (`src/core/agent-moe.ts`, `src/llm/types.ts`): `verifyAndMerge` is typed as `OrchestratorResult`/`VerifyInput`, `getUsageByTag` is part of `MoEExecutorLike` (no duck-typed cast), orchestrator override is properly optional.
|
|
101
|
+
- **Provider cache** (`src/modules/providers/manager.ts`): `setModel()` clears the build cache so providers for old models do not accumulate.
|
|
102
|
+
- **Input-from budget** (`src/modules/execution/input-from.ts`): aggregate cap (`maxChars * 4`) with an `omitted` marker; `as any` narrowing removed.
|
|
103
|
+
- **Observability** (`src/core/bootstrap.ts`, `src/core/agent.ts`): ContextLogger init failure and `getProviderFor` build failure are logged with i18n keys; log level is validated (`normalizeLogLevel`) instead of `as any`.
|
|
104
|
+
- **SIGINT force-exit** (`src/cli/repl.ts`): grace period 2s → 5s with a localized notice.
|
|
105
|
+
- **i18n diagnostics** (`src/i18n/index.ts`, `src/core/bootstrap.ts`): a missing key is reported via an optional debug reporter (`setMissingKeyReporter`, wired to `logger.debug`); `loadLocale` cast removed.
|
|
106
|
+
- **Type cleanup** (`src/tools/*`): removed redundant `(ctx as any).fileOperationsCount` casts in 5 files.
|
|
107
|
+
- **Abortable retry sleep** (`src/modules/execution/moe-executor.ts`): retry `sleep` honors the abort signal; stuck detector receives the real attempt number.
|
|
108
|
+
|
|
109
|
+
## [1.3.0] - 2026-09-19
|
|
110
|
+
|
|
111
|
+
### Added
|
|
112
|
+
|
|
113
|
+
- **Budget-driven compaction floor** (`contextBudget.compactionMinLoad`, default 0.5, `src/modules/context/manager.ts`): the 15-iteration interval no longer triggers a compaction on its own — it now requires the history to be at least `compactionMinLoad` full. Previously compaction fired at ~40% of the budget and discarded 33-44 useful turns mid-task (observed in a real run), derailing the agent. Token-pressure compaction (`compactionThreshold`) is unchanged.
|
|
114
|
+
- **Context probe persistence in every mode** (`src/core/bootstrap.ts`, `src/cli/main.ts`): the loaded-vs-configured context probe is now written to the session (`context_probe`) and surfaced in one-shot runs too. Previously only the REPL recorded/rendered it, so a mismatch (LM Studio loaded 86016 while `contextWindow` was 32768) was silent in `mma "<prompt>"`.
|
|
115
|
+
- **Artifact churn detector** (`src/core/agent/artifact-progress.ts`): nudges the model once when it repeatedly rewrites a test/spec file without changing production code. Path classification is cross-language (`*.test.*`, `*_test.*`, `test_*`, `*Test.java`, `tests/`, `specs/`, …), with no framework/task specifics.
|
|
116
|
+
- **Stuck escalation reaches the model** (`src/modules/execution/execution-plugin.ts`): after the escalation threshold, a generic directive (change approach / search the exact error / ask the user / re-plan or skip) is injected as a `system-summary`, not only shown in the UI.
|
|
117
|
+
- **Wrapper-script guard** (`src/core/agent/tool-batch.ts`, `src/tools/bash.ts`): after a `[SECURITY BLOCKED]` result, writing a `.bat/.cmd/.sh/.ps1` wrapper triggers a one-time nudge; the security block hint now points to tools (write_file, workdir, separate calls) instead of only `workdir`.
|
|
118
|
+
|
|
119
|
+
### Changed
|
|
120
|
+
|
|
121
|
+
- **`plan update` no longer rewrites the plan's steps** (`src/modules/execution/plan-actions.ts`): a bulk `steps[]`/`title` rewrite via `update` is rejected in all cases (previously only when the plan had progress). Use `re-plan` (keeps completed steps) or `create`.
|
|
122
|
+
- **Tool-arg summaries omit long values** (`src/core/agent/tool-output.ts`): `summarizeToolArgs` collapses long string values (`content`/`new_string`/…) to `…(N chars)` instead of echoing the body into the `<system-summary>` envelope.
|
|
123
|
+
- **Artifact-requirement prompt rule** (`src/core/bootstrap.ts`): explicit generic line — a requested document/artifact (spec, design, README, plan file, script) must be created as a real file, and libraries not agreed/listed must not be added.
|
|
124
|
+
|
|
125
|
+
### Fixed
|
|
126
|
+
|
|
127
|
+
- **Non-streaming fallback on buffered-SSE stall** (`src/llm/openai-compat.ts`): a stream that stalls after tool-call deltas started (LM Studio buffers large tool-call SSE) is retried non-streaming once instead of failing the whole run. Reasoning from the fallback is dropped (already streamed).
|
|
128
|
+
|
|
129
|
+
## [1.2.0] - 2026-09-19
|
|
130
|
+
|
|
131
|
+
### Added
|
|
132
|
+
|
|
133
|
+
- **Git-style context log** (`--context-log`, `src/core/agent/context-log.ts`, config `contextLog`, env `MMA_CONTEXT_LOG`): writes the full LLM context (system prompt + tool definitions + message history) to `<session>/context.diff`. Snapshot 0 is the complete context (every line `+`, like a new git file); each later snapshot is a plain unified line diff (`-` removed, `+` added) against the previous iteration. Sections are `[SYSTEM]`, `[TOOLS]`, `[HISTORY]`. Secrets are redacted via a dedicated, conservative pattern set (`redactContextSecrets`; `contextLog.redact`, default on) that targets recognizable tokens (sk-, ghp_, AKIA, JWT, Bearer, `api_key=`/`token=`/`password=`) and leaves ordinary context text (skill names, `pass "background: true"`, etc.) intact. The file is append-only: a second run adds a `run <pid> · <timestamp>` separator and restarts with a full snapshot while snapshot numbering continues. Model **reasoning/text/tool calls** are not part of the outgoing context and are recorded as separate `[OUTPUT]` annotations (`▍`), never diffed. Hooked in `Agent.executeSingleAgentLoop` next to the prefix monitor; no-op when disabled.
|
|
134
|
+
|
|
7
135
|
## [1.1.0] - 2026-09-19
|
|
8
136
|
|
|
9
137
|
### Added
|
package/dist/i18n/en.json
CHANGED
|
@@ -11,6 +11,10 @@
|
|
|
11
11
|
"file.is_directory": "Is a directory, use rmdir: {path}",
|
|
12
12
|
"file.replaced_in": "Replaced in {path}",
|
|
13
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.edit_args_invalid": "edit_file requires string \"old\" and \"new\" arguments. Received: old={oldType}, new={newType}.",
|
|
15
|
+
"file.read_failed": "Could not read {path}: {error}",
|
|
16
|
+
"file.write_failed": "Could not write {path}: {error}",
|
|
17
|
+
"file.protected_path_ask": "Protected path \"{path}\" (matches {pattern}). Do NOT modify it. Ask the user for explicit confirmation before proceeding and wait for their answer — do not retry around this.",
|
|
14
18
|
"file.moved": "Moved {from} → {to}",
|
|
15
19
|
"file.not_found_short": "Not found: {path}",
|
|
16
20
|
"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.",
|
|
@@ -47,6 +51,8 @@
|
|
|
47
51
|
"error.llm_output_truncated": "The response hit the completion token limit ({tokens}) and was cut off — this answer is incomplete. Raise \"maxCompletionTokens\" in the config to allow longer replies",
|
|
48
52
|
"error.llm_provider_stream_error": "Provider returned an error mid-stream: {error}",
|
|
49
53
|
"error.llm_timeout": "LLM request timed out ({timeout}ms)",
|
|
54
|
+
"error.context_log_init": "Context log is enabled but could not be initialized: {error}. No context diff will be written.",
|
|
55
|
+
"error.provider_build": "Could not build provider \"{name}\": {error}",
|
|
50
56
|
"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.",
|
|
51
57
|
"env.runtime_old": "Runtime version {version} is below the required engines {engine}.",
|
|
52
58
|
"env.tool_missing": "Tool not found on PATH: {tool}",
|
|
@@ -92,6 +98,8 @@
|
|
|
92
98
|
"tool.failed": "Tool {name} failed: {error}",
|
|
93
99
|
"tool.unknown": "Unknown tool: {name}",
|
|
94
100
|
"tool.blocked": "Blocked by plugin: {plugin}",
|
|
101
|
+
"tool.ui.security_blocked": "Blocked by security policy",
|
|
102
|
+
"tool.ui.protected_path": "Protected path — confirmation needed",
|
|
95
103
|
"tool.blocked_reason": "Blocked by plugin: {plugin}. Reason: {reason}",
|
|
96
104
|
"tool.using": "[{label}]",
|
|
97
105
|
"tool.friendly.write_file": "Writing file",
|
|
@@ -265,7 +273,7 @@
|
|
|
265
273
|
"cli.config_key": "Config key (e.g., model, provider.baseUrl)",
|
|
266
274
|
"cli.set_value": "Set a config value",
|
|
267
275
|
"cli.set_done": "Set {key}={value}",
|
|
268
|
-
"cli.show_config": "Show
|
|
276
|
+
"cli.show_config": "Show the effective configuration (secrets redacted; use --show-secrets to reveal)",
|
|
269
277
|
"cli.migrate_config": "Migrate legacy config.json to domain format",
|
|
270
278
|
"cli.manage_models": "Manage models",
|
|
271
279
|
"cli.list_models": "List available models",
|
|
@@ -340,6 +348,7 @@
|
|
|
340
348
|
"cli.show_details": "Show session details",
|
|
341
349
|
"cli.delete_session": "Delete a session",
|
|
342
350
|
"cli.first_run": "First run detected. Running setup wizard...",
|
|
351
|
+
"cli.first_run_oneshot": "No configuration found — running with defaults. Run `mma` (no arguments) once to set up the wizard.",
|
|
343
352
|
"cli.setup_saved_restart": "Settings saved. Restarting with the new configuration...",
|
|
344
353
|
"cli.unknown_cmd": "Unknown command: {name}.",
|
|
345
354
|
"cli.unknown_command": "Unknown command \"{input}\". Did you mean \"{suggestion}\"?",
|
|
@@ -351,6 +360,8 @@
|
|
|
351
360
|
"cli.exit_on_complete": "Exit immediately when the task is done; interactive tools (question/approve) fail fast instead of blocking on stdin",
|
|
352
361
|
"cli.reasoning_level": "Set reasoning effort level (auto|none|low|medium|high|max)",
|
|
353
362
|
"cli.json": "Output the result as JSON (single-run mode)",
|
|
363
|
+
"cli.context_log": "Write the full LLM context to <session>/context.diff as a git-style diff (first snapshot full, then +/- changes)",
|
|
364
|
+
"cli.verbose": "Show full chat detail (tool bodies, lists); default is quiet",
|
|
354
365
|
"cli.security.description": "Manage security settings",
|
|
355
366
|
"cli.security.status": "Show current security configuration",
|
|
356
367
|
"cli.security.policies": "List available security policies",
|
|
@@ -411,6 +422,11 @@
|
|
|
411
422
|
"repl.reasoning_usage": "Usage: /reasoning [auto|none|low|medium|high|max]",
|
|
412
423
|
"repl.reasoning_level_set": "Reasoning level set to: {level}",
|
|
413
424
|
"repl.reasoning_invalid_level": "Invalid level '{level}'. Valid: {valid}",
|
|
425
|
+
"repl.verbose": "Chat verbosity: quiet, normal, or verbose",
|
|
426
|
+
"repl.verbose_usage": "Usage: /verbose [quiet|normal|verbose]",
|
|
427
|
+
"repl.verbose_set": "Chat verbosity: {level}",
|
|
428
|
+
"repl.verbose_invalid_level": "Invalid level '{level}'. Valid: {valid}",
|
|
429
|
+
"repl.last_action_none": "No recent action to show.",
|
|
414
430
|
"repl.status": "Show agent status",
|
|
415
431
|
"repl.status_usage": "Usage: /status",
|
|
416
432
|
"repl.plugins": "List loaded plugins",
|
|
@@ -543,7 +559,7 @@
|
|
|
543
559
|
"setup.security_configure": " Configure security? (y/N)",
|
|
544
560
|
"setup.security_bash_block": " Block dangerous commands (rm, sudo, ssh, etc.)? (y/N)",
|
|
545
561
|
"setup.security_flags_block": " Block dangerous flags (--force, -rf, etc.)? (y/N)",
|
|
546
|
-
"setup.
|
|
562
|
+
"setup.security_paths_restrict": " Restrict access to .git/, .env, node_modules/? (Y/n)",
|
|
547
563
|
"skill.already_loaded": "Skill \"{name}\" is already loaded",
|
|
548
564
|
"skill.not_found": "Skill \"{name}\" not found in any source directory",
|
|
549
565
|
"skill.no_match": "No skills match for: {task}",
|
|
@@ -580,6 +596,9 @@
|
|
|
580
596
|
"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.",
|
|
581
597
|
"exec.mass_edit_warning": "⚠️ Plan affects {count} files — review the full list before proceeding.",
|
|
582
598
|
"exec.escalation": "\n\n⚠️ Agent stuck on step {stepId} ({description}). Escalating to user — please provide guidance.",
|
|
599
|
+
"exec.escalation_directive": "You have been stuck for several attempts. Stop repeating the same action and pick ONE of these: (1) switch to a fundamentally different approach, (2) search the exact error text with web_search (or the error-search tool), (3) ask the user a short clarifying question, or (4) if the step cannot be completed, use plan update step=<n> status=skipped with a note (or re-plan). Explain your choice briefly.",
|
|
600
|
+
"exec.test_churn_nudge": "You have edited the test/spec file \"{file}\" several times in a row without changing any production code. If the tests fail, fix the PRODUCTION code under test (not the test) unless the test itself is genuinely wrong — and if so, explain why. If you intended test-first, now write the implementation.",
|
|
601
|
+
"exec.script_workaround_nudge": "A security restriction already blocked one of your commands. Writing a shell script (.bat/.cmd/.sh/.ps1) to run it another way does NOT lift the restriction and usually just fails. Instead: use write_file for file output, run one plain command per call, pass \"workdir\" instead of \"cd\", or ask the user.",
|
|
583
602
|
"exec.hints": "\n[Hints]\n{hints}",
|
|
584
603
|
"exec.file_rewrite_warning": "⚠️ File {file} has been rewritten {count} times. Consider a different approach — the current fix strategy is not working.",
|
|
585
604
|
"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.",
|
|
@@ -632,10 +651,18 @@
|
|
|
632
651
|
"migration.dir_bak": "- .mma/ → .mma.bak/ ({count} files)",
|
|
633
652
|
"migration.migrated": "Migrated:",
|
|
634
653
|
"migration.not_needed": "No migration needed",
|
|
635
|
-
"ui.error_prefix": "
|
|
654
|
+
"ui.error_prefix": "✗ ",
|
|
636
655
|
"ui.success_prefix": "✓ ",
|
|
637
656
|
"ui.warning_prefix": "⚠ ",
|
|
638
657
|
"ui.thinking": "Thinking…",
|
|
658
|
+
"ui.thinking_label": "thinking",
|
|
659
|
+
"ui.thinking_label_1": "thinking",
|
|
660
|
+
"ui.thinking_label_2": "working it out",
|
|
661
|
+
"ui.thinking_label_3": "considering",
|
|
662
|
+
"ui.action_fallback": "Action",
|
|
663
|
+
"ui.actions_summary": "{count} actions",
|
|
664
|
+
"ui.plan_update": "step {step} → {status}",
|
|
665
|
+
"ui.todo_action": "{action} · {count}",
|
|
639
666
|
"ui.tool_running": "{tool}…",
|
|
640
667
|
"ui.step_context": "step {id}: {desc}",
|
|
641
668
|
"indexer.map_header": "Project map",
|
|
@@ -738,6 +765,7 @@
|
|
|
738
765
|
"cli.usage_account": "Account: {credits} purchased · {used} used",
|
|
739
766
|
"cli.usage_empty": "No balance information returned.",
|
|
740
767
|
"repl.ctrl_c_interrupt": "\n[Ctrl+C] Stopping agent... (press again to force)",
|
|
768
|
+
"repl.force_exit": "\nForcing exit — background cleanup may be incomplete.",
|
|
741
769
|
"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.",
|
|
742
770
|
"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.",
|
|
743
771
|
"exec.test_runner_pass": "[test-runner] {framework}: all {passed} test(s) passing.",
|
|
@@ -756,6 +784,11 @@
|
|
|
756
784
|
"moe.execution_complete": "Execution complete: {succeeded}/{total} succeeded",
|
|
757
785
|
"moe.cycles_exhausted": "Max re-plan cycles ({max}) reached — returning partial results",
|
|
758
786
|
"moe.partial_result": "Partial result",
|
|
787
|
+
"moe.planning": "🤖 Planning with MoE mode...\n",
|
|
788
|
+
"moe.plan_fallback": "⚠️ Plan validation failed. Falling back to single-agent mode.\n",
|
|
789
|
+
"moe.plan_autofixed": "🔧 Auto-fixed {count} plan issues.\n",
|
|
790
|
+
"moe.plan_failed": "MoE plan failed: {error} — falling back to single-agent",
|
|
791
|
+
"moe.no_orchestrator": "MoE enabled but no orchestrator model configured — falling back to single-agent. Set orchestrator.model to activate MoE.",
|
|
759
792
|
"moe.scope_approved": "🔓 Scope expanded for \"{subtask}\": {files}",
|
|
760
793
|
"moe.scope_rejected": "⛔ Scope request rejected for \"{subtask}\"",
|
|
761
794
|
"prompt.overflow.compressing": "System prompt overflow: compressing {count} block(s) before the first run — this may take a while on a local model.",
|
package/dist/i18n/ru.json
CHANGED
|
@@ -11,6 +11,10 @@
|
|
|
11
11
|
"file.is_directory": "Это каталог, используйте rmdir: {path}",
|
|
12
12
|
"file.replaced_in": "Заменено в {path}",
|
|
13
13
|
"file.string_not_found": "Строка не найдена в файле:\n{str}\n\nИспользуй read_file для {path}, чтобы увидеть текущее содержимое файла перед редактированием — искомая строка может отличаться (пробелы, переводы строк) или уже была заменена.",
|
|
14
|
+
"file.edit_args_invalid": "edit_file требует строковые аргументы \"old\" и \"new\". Получено: old={oldType}, new={newType}.",
|
|
15
|
+
"file.read_failed": "Не удалось прочитать {path}: {error}",
|
|
16
|
+
"file.write_failed": "Не удалось записать {path}: {error}",
|
|
17
|
+
"file.protected_path_ask": "Защищённый путь \"{path}\" (совпадает с {pattern}). НЕ изменяй его. Спроси у пользователя явного подтверждения и дождись ответа — не обходи это ограничение.",
|
|
14
18
|
"file.moved": "Перемещён {from} → {to}",
|
|
15
19
|
"file.not_found_short": "Не найдено: {path}",
|
|
16
20
|
"file.empty": "(пусто)",
|
|
@@ -46,6 +50,8 @@
|
|
|
46
50
|
"error.llm_output_truncated": "Ответ упёрся в лимит токенов генерации ({tokens}) и был обрезан — этот ответ неполный. Увеличьте \"maxCompletionTokens\" в конфиге, чтобы разрешить длинные ответы",
|
|
47
51
|
"error.llm_provider_stream_error": "Провайдер вернул ошибку посреди стрима: {error}",
|
|
48
52
|
"error.llm_timeout": "Время запроса LLM истекло ({timeout}мс)",
|
|
53
|
+
"error.context_log_init": "Context log включён, но не удалось инициализировать: {error}. Diff контекста писаться не будет.",
|
|
54
|
+
"error.provider_build": "Не удалось собрать провайдера \"{name}\": {error}",
|
|
49
55
|
"env.runtime_node": "Запущено под Node (v{version}) — вставка изображений из буфера и LSP на Windows работают урезанно. Установите Bun (https://bun.sh) для полного функционала.",
|
|
50
56
|
"env.runtime_old": "Версия рантайма {version} ниже требуемой engines {engine}.",
|
|
51
57
|
"env.tool_missing": "Инструмент не найден в PATH: {tool}",
|
|
@@ -91,6 +97,8 @@
|
|
|
91
97
|
"tool.failed": "Инструмент {name} упал: {error}",
|
|
92
98
|
"tool.unknown": "Неизвестный инструмент: {name}",
|
|
93
99
|
"tool.blocked": "Заблокировано плагином: {plugin}",
|
|
100
|
+
"tool.ui.security_blocked": "Заблокировано политикой безопасности",
|
|
101
|
+
"tool.ui.protected_path": "Защищённый путь — нужно подтверждение",
|
|
94
102
|
"tool.blocked_reason": "Заблокировано плагином: {plugin}. Причина: {reason}",
|
|
95
103
|
"tool.using": "[{label}]",
|
|
96
104
|
"tool.friendly.write_file": "Запись файла",
|
|
@@ -263,7 +271,7 @@
|
|
|
263
271
|
"cli.config_key": "Ключ конфига (напр., model, provider.baseUrl)",
|
|
264
272
|
"cli.set_value": "Установить значение",
|
|
265
273
|
"cli.set_done": "Установлено {key}={value}",
|
|
266
|
-
"cli.show_config": "Показать
|
|
274
|
+
"cli.show_config": "Показать действующую конфигурацию (секреты скрыты; используйте --show-secrets)",
|
|
267
275
|
"cli.migrate_config": "Мигрировать legacy config.json в domain-формат",
|
|
268
276
|
"cli.manage_models": "Управление моделями",
|
|
269
277
|
"cli.list_models": "Список доступных моделей",
|
|
@@ -334,6 +342,7 @@
|
|
|
334
342
|
"cli.show_details": "Показать детали сессии",
|
|
335
343
|
"cli.delete_session": "Удалить сессию",
|
|
336
344
|
"cli.first_run": "Первый запуск. Запускаем мастер настройки...",
|
|
345
|
+
"cli.first_run_oneshot": "Конфигурация не найдена — запуск с настройками по умолчанию. Запустите `mma` без аргументов один раз для настройки.",
|
|
337
346
|
"cli.setup_saved_restart": "Настройки сохранены. Перезапуск с новой конфигурацией...",
|
|
338
347
|
"cli.unknown_cmd": "Неизвестная команда: {name}.",
|
|
339
348
|
"cli.unknown_command": "Неизвестная команда \"{input}\". Возможно, вы имели в виду \"{suggestion}\"?",
|
|
@@ -345,6 +354,8 @@
|
|
|
345
354
|
"cli.exit_on_complete": "Завершить сразу после выполнения задачи; интерактивные тулзы (question/approve) не блокируют stdin, а возвращают ошибку",
|
|
346
355
|
"cli.reasoning_level": "Установить уровень рассуждений (auto|none|low|medium|high|max)",
|
|
347
356
|
"cli.json": "Вывести результат в формате JSON (режим однократного запуска)",
|
|
357
|
+
"cli.context_log": "Писать весь контекст LLM в <session>/context.diff в git-подобном diff-формате (первый снимок — полный, далее изменения +/-)",
|
|
358
|
+
"cli.verbose": "Показывать полный вывод чата (тела тулов, списки); по умолчанию — кратко",
|
|
348
359
|
"cli.security.description": "Управление настройками безопасности",
|
|
349
360
|
"cli.security.status": "Показать текущую конфигурацию безопасности",
|
|
350
361
|
"cli.security.policies": "Список доступных политик безопасности",
|
|
@@ -405,6 +416,11 @@
|
|
|
405
416
|
"repl.reasoning_usage": "Использование: /reasoning [auto|none|low|medium|high|max]",
|
|
406
417
|
"repl.reasoning_level_set": "Уровень рассуждений установлен: {level}",
|
|
407
418
|
"repl.reasoning_invalid_level": "Неверный уровень '{level}'. Допустимые: {valid}",
|
|
419
|
+
"repl.verbose": "Подробность вывода: quiet, normal или verbose",
|
|
420
|
+
"repl.verbose_usage": "Использование: /verbose [quiet|normal|verbose]",
|
|
421
|
+
"repl.verbose_set": "Подробность вывода: {level}",
|
|
422
|
+
"repl.verbose_invalid_level": "Неверный уровень '{level}'. Допустимые: {valid}",
|
|
423
|
+
"repl.last_action_none": "Нет недавнего действия для показа.",
|
|
408
424
|
"repl.status": "Показать статус агента",
|
|
409
425
|
"repl.status_usage": "Использование: /status",
|
|
410
426
|
"repl.plugins": "Список загруженных плагинов",
|
|
@@ -541,7 +557,7 @@
|
|
|
541
557
|
"setup.security_configure": " Настроить безопасность? (y/N)",
|
|
542
558
|
"setup.security_bash_block": " Блокировать опасные команды (rm, sudo, ssh и т.д.)? (y/N)",
|
|
543
559
|
"setup.security_flags_block": " Блокировать опасные флаги (--force, -rf и т.д.)? (y/N)",
|
|
544
|
-
"setup.
|
|
560
|
+
"setup.security_paths_restrict": " Ограничить доступ к .git/, .env, node_modules/? (Y/n)",
|
|
545
561
|
"skill.already_loaded": "Скилл \"{name}\" уже загружен",
|
|
546
562
|
"skill.not_found": "Скилл \"{name}\" не найден ни в одном каталоге",
|
|
547
563
|
"skill.no_match": "Нет скиллов подходящих для: {task}",
|
|
@@ -578,6 +594,9 @@
|
|
|
578
594
|
"exec.audit_incomplete": "❗ Финальная проверка не пройдена: {summary}. Задача НЕ завершена. Незакрытые шаги: {steps}. Устрани одним путём: (a) если результат шага уже существует на диске — закрой шаг (plan update step=N status=done); (b) если шаг больше не нужен — status=skipped; (c) если план разошёлся с реальностью (другие имена файлов, сменился подход) — сделай re-plan. Не повторяй plan update без изменений.",
|
|
579
595
|
"exec.mass_edit_warning": "⚠️ План затрагивает {count} файлов — проверьте полный список перед продолжением.",
|
|
580
596
|
"exec.escalation": "\n\n⚠️ Агент застрял на шаге {stepId} ({description}). Эскалация к пользователю — пожалуйста, подскажите как действовать.",
|
|
597
|
+
"exec.escalation_directive": "Ты застрял уже несколько попыток. Перестань повторять одно и то же и выбери ОДНО: (1) смени подход принципиально, (2) найди точный текст ошибки через web_search (или инструмент поиска ошибок), (3) задай пользователю короткий уточняющий вопрос, (4) если шаг невыполним — plan update step=<n> status=skipped с заметкой (или re-plan). Кратко объясни выбор.",
|
|
598
|
+
"exec.test_churn_nudge": "Ты несколько раз подряд правил тест/спек-файл \"{file}\" и не изменил ни строчки production-кода. Если тесты падают — исправляй КОД ПОД ТЕСТОМ (а не тест), если только сам тест не ошибочен — тогда объясни, почему. Если задумано test-first, теперь напиши реализацию.",
|
|
599
|
+
"exec.script_workaround_nudge": "Ограничение безопасности уже заблокировало одну из твоих команд. Написание shell-скрипта (.bat/.cmd/.sh/.ps1), чтобы выполнить её иначе, НЕ снимает ограничение и обычно просто падает. Вместо этого: используй write_file для вывода в файл, запускай по одной простой команде за вызов, передавай \"workdir\" вместо \"cd\" или спроси пользователя.",
|
|
581
600
|
"exec.hints": "\n[Подсказки]\n{hints}",
|
|
582
601
|
"exec.file_rewrite_warning": "⚠️ Файл {file} был перезаписан {count} раз. Попробуйте другой подход — текущая стратегия исправлений не работает.",
|
|
583
602
|
"exec.forbidden_cmd": "ПРЕКРАТИ использовать \"{cmd}\" через bash — это не команда Windows cmd.exe, и она уже неоднократно падала в этой сессии. Используй предназначенный тул: grep → тул grep, ls/dir → list_dir, find → glob, rm → delete_file, sed → edit_file, touch → write_file, which → `where`, cp/mv → move_file, diff → read_file. Больше не вызывай bash для этого.",
|
|
@@ -630,10 +649,18 @@
|
|
|
630
649
|
"migration.dir_bak": "- .mma/ → .mma.bak/ ({count} файлов)",
|
|
631
650
|
"migration.migrated": "Мигрировано:",
|
|
632
651
|
"migration.not_needed": "Миграция не требуется",
|
|
633
|
-
"ui.error_prefix": "
|
|
652
|
+
"ui.error_prefix": "✗ ",
|
|
634
653
|
"ui.success_prefix": "✓ ",
|
|
635
654
|
"ui.warning_prefix": "⚠ ",
|
|
636
655
|
"ui.thinking": "Думаю…",
|
|
656
|
+
"ui.thinking_label": "размышляю",
|
|
657
|
+
"ui.thinking_label_1": "размышляю",
|
|
658
|
+
"ui.thinking_label_2": "обдумываю",
|
|
659
|
+
"ui.thinking_label_3": "прикидываю",
|
|
660
|
+
"ui.action_fallback": "Действие",
|
|
661
|
+
"ui.actions_summary": "{count} действий",
|
|
662
|
+
"ui.plan_update": "шаг {step} → {status}",
|
|
663
|
+
"ui.todo_action": "{action} · {count}",
|
|
637
664
|
"ui.tool_running": "{tool}…",
|
|
638
665
|
"ui.step_context": "шаг {id}: {desc}",
|
|
639
666
|
"indexer.map_header": "Карта проекта",
|
|
@@ -738,6 +765,7 @@
|
|
|
738
765
|
"cli.usage_account": "Аккаунт: куплено {credits} · израсходовано {used}",
|
|
739
766
|
"cli.usage_empty": "Провайдер не вернул данных о балансе.",
|
|
740
767
|
"repl.ctrl_c_interrupt": "\n[Ctrl+C] Остановка агента... (ещё раз — принудительно)",
|
|
768
|
+
"repl.force_exit": "\nПринудительный выход — фоновая очистка может быть неполной.",
|
|
741
769
|
"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.",
|
|
742
770
|
"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.",
|
|
743
771
|
"exec.test_runner_pass": "[test-runner] {framework}: all {passed} test(s) passing.",
|
|
@@ -756,6 +784,11 @@
|
|
|
756
784
|
"moe.execution_complete": "Выполнение завершено: {succeeded}/{total} успешно",
|
|
757
785
|
"moe.cycles_exhausted": "Достигнут лимит re-plan циклов ({max}) — возвращаю частичные результаты",
|
|
758
786
|
"moe.partial_result": "Частичный результат",
|
|
787
|
+
"moe.planning": "🤖 Планирую в режиме MoE...\n",
|
|
788
|
+
"moe.plan_fallback": "⚠️ Валидация плана не прошла. Возврат к одиночному режиму.\n",
|
|
789
|
+
"moe.plan_autofixed": "🔧 Автоисправлено проблем плана: {count}.\n",
|
|
790
|
+
"moe.plan_failed": "План MoE не построен: {error} — возврат к одиночному режиму",
|
|
791
|
+
"moe.no_orchestrator": "MoE включён, но orchestrator.model не задан — возврат к одиночному режиму. Укажите orchestrator.model для активации MoE.",
|
|
759
792
|
"moe.scope_approved": "🔓 Scope расширен для \"{subtask}\": {files}",
|
|
760
793
|
"moe.scope_rejected": "⛔ Запрос scope отклонён для \"{subtask}\"",
|
|
761
794
|
"prompt.overflow.compressing": "Переполнение системного промпта: сжимаю {count} блок(ов) перед первым запуском — на локальной модели это может занять время.",
|