micro-models-agent 1.1.0 → 1.5.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 +110 -0
- package/dist/i18n/en.json +33 -1
- package/dist/i18n/ru.json +33 -1
- package/dist/main.js +2021 -708
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,116 @@ 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.5.0] - 2026-09-21
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- **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.
|
|
12
|
+
- **UI theme module** (`src/ui/theme.ts`): single source for chat glyphs (`◇ ✓ ✗ ⚠ ✦ ? ↵ ↳ │ ▰▱ ⟡ ⟳`), semantic marks and the `Verbosity` type.
|
|
13
|
+
- **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`.
|
|
14
|
+
- **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.
|
|
15
|
+
- **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.
|
|
16
|
+
- **`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.
|
|
17
|
+
- **Spinner elapsed time** (`src/ui/spinner.ts`): the busy line shows `· Ns` once a tool runs longer than 3 seconds.
|
|
18
|
+
- **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.
|
|
19
|
+
- **Plan checklist restyle** (`src/ui/plan-view.ts`): `◇ title ▰▱ 1/3` header and `✓ / ◇ / ○ / ✗` step marks, dropping the raw plan id and `[x]` brackets.
|
|
20
|
+
- **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.
|
|
21
|
+
- **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.
|
|
22
|
+
- **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.
|
|
23
|
+
|
|
24
|
+
### Fixed
|
|
25
|
+
|
|
26
|
+
- **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.
|
|
27
|
+
- **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.
|
|
28
|
+
- **Durations over a second** (`src/ui/theme.ts`): rendered as `1.4s` instead of `1400ms`.
|
|
29
|
+
|
|
30
|
+
### Changed
|
|
31
|
+
|
|
32
|
+
- **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.
|
|
33
|
+
- **One action glyph** (`Renderer.toolMarker`): every tool uses `◇` instead of per-category arrows/asterisks.
|
|
34
|
+
- **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.
|
|
35
|
+
- **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.
|
|
36
|
+
- **Thinking header and run footer**: `✦ thinking` instead of `→ Thought:`, `⟡ model · provider · ms` instead of `▣`.
|
|
37
|
+
- **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.
|
|
38
|
+
|
|
39
|
+
## [1.4.0] - 2026-09-21
|
|
40
|
+
|
|
41
|
+
### Added
|
|
42
|
+
|
|
43
|
+
- **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.
|
|
44
|
+
- **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).
|
|
45
|
+
|
|
46
|
+
### Fixed
|
|
47
|
+
|
|
48
|
+
- **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`.
|
|
49
|
+
- **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`).
|
|
50
|
+
- **Certification harness hardening** (`src/modules/certification/`, found by running the full suite on `qwen/qwen3.5-9b`):
|
|
51
|
+
- `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`).
|
|
52
|
+
- `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.
|
|
53
|
+
- `outputContains` is case-insensitive, so security scenarios match the uppercase `[SECURITY BLOCKED]` harness marker deterministically rather than depending on the model echoing lowercase "security".
|
|
54
|
+
- 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).
|
|
55
|
+
|
|
56
|
+
## [1.3.1] - 2026-09-21
|
|
57
|
+
|
|
58
|
+
### Added
|
|
59
|
+
|
|
60
|
+
- **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.
|
|
61
|
+
|
|
62
|
+
### Fixed
|
|
63
|
+
|
|
64
|
+
- **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`.
|
|
65
|
+
- **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.
|
|
66
|
+
- **`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.
|
|
67
|
+
- **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.
|
|
68
|
+
- **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.
|
|
69
|
+
- **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`).
|
|
70
|
+
- **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.
|
|
71
|
+
- **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.
|
|
72
|
+
- **`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.
|
|
73
|
+
- **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.
|
|
74
|
+
- **Migration backup skip is logged** (`src/migration/backup.ts`): a pre-existing `.bak` directory is reported at debug level instead of being skipped silently.
|
|
75
|
+
- **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.
|
|
76
|
+
- **`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.
|
|
77
|
+
- **Nested markdown emphasis** (`src/ui/md-formatter.ts`): `***bold italic***` renders as bold+italic without leaving a stray asterisk.
|
|
78
|
+
|
|
79
|
+
### Changed
|
|
80
|
+
|
|
81
|
+
- **MoE messages localized** (`src/core/agent-moe.ts`, i18n `moe.*` en+ru): planning/fallback/auto-fix/no-orchestrator/plan-failed strings go through `t()`.
|
|
82
|
+
- **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.
|
|
83
|
+
- **Provider cache** (`src/modules/providers/manager.ts`): `setModel()` clears the build cache so providers for old models do not accumulate.
|
|
84
|
+
- **Input-from budget** (`src/modules/execution/input-from.ts`): aggregate cap (`maxChars * 4`) with an `omitted` marker; `as any` narrowing removed.
|
|
85
|
+
- **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`.
|
|
86
|
+
- **SIGINT force-exit** (`src/cli/repl.ts`): grace period 2s → 5s with a localized notice.
|
|
87
|
+
- **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.
|
|
88
|
+
- **Type cleanup** (`src/tools/*`): removed redundant `(ctx as any).fileOperationsCount` casts in 5 files.
|
|
89
|
+
- **Abortable retry sleep** (`src/modules/execution/moe-executor.ts`): retry `sleep` honors the abort signal; stuck detector receives the real attempt number.
|
|
90
|
+
|
|
91
|
+
## [1.3.0] - 2026-09-19
|
|
92
|
+
|
|
93
|
+
### Added
|
|
94
|
+
|
|
95
|
+
- **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.
|
|
96
|
+
- **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>"`.
|
|
97
|
+
- **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.
|
|
98
|
+
- **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.
|
|
99
|
+
- **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`.
|
|
100
|
+
|
|
101
|
+
### Changed
|
|
102
|
+
|
|
103
|
+
- **`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`.
|
|
104
|
+
- **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.
|
|
105
|
+
- **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.
|
|
106
|
+
|
|
107
|
+
### Fixed
|
|
108
|
+
|
|
109
|
+
- **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).
|
|
110
|
+
|
|
111
|
+
## [1.2.0] - 2026-09-19
|
|
112
|
+
|
|
113
|
+
### Added
|
|
114
|
+
|
|
115
|
+
- **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.
|
|
116
|
+
|
|
7
117
|
## [1.1.0] - 2026-09-19
|
|
8
118
|
|
|
9
119
|
### 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",
|
|
@@ -351,6 +359,8 @@
|
|
|
351
359
|
"cli.exit_on_complete": "Exit immediately when the task is done; interactive tools (question/approve) fail fast instead of blocking on stdin",
|
|
352
360
|
"cli.reasoning_level": "Set reasoning effort level (auto|none|low|medium|high|max)",
|
|
353
361
|
"cli.json": "Output the result as JSON (single-run mode)",
|
|
362
|
+
"cli.context_log": "Write the full LLM context to <session>/context.diff as a git-style diff (first snapshot full, then +/- changes)",
|
|
363
|
+
"cli.verbose": "Show full chat detail (tool bodies, lists); default is quiet",
|
|
354
364
|
"cli.security.description": "Manage security settings",
|
|
355
365
|
"cli.security.status": "Show current security configuration",
|
|
356
366
|
"cli.security.policies": "List available security policies",
|
|
@@ -411,6 +421,11 @@
|
|
|
411
421
|
"repl.reasoning_usage": "Usage: /reasoning [auto|none|low|medium|high|max]",
|
|
412
422
|
"repl.reasoning_level_set": "Reasoning level set to: {level}",
|
|
413
423
|
"repl.reasoning_invalid_level": "Invalid level '{level}'. Valid: {valid}",
|
|
424
|
+
"repl.verbose": "Chat verbosity: quiet, normal, or verbose",
|
|
425
|
+
"repl.verbose_usage": "Usage: /verbose [quiet|normal|verbose]",
|
|
426
|
+
"repl.verbose_set": "Chat verbosity: {level}",
|
|
427
|
+
"repl.verbose_invalid_level": "Invalid level '{level}'. Valid: {valid}",
|
|
428
|
+
"repl.last_action_none": "No recent action to show.",
|
|
414
429
|
"repl.status": "Show agent status",
|
|
415
430
|
"repl.status_usage": "Usage: /status",
|
|
416
431
|
"repl.plugins": "List loaded plugins",
|
|
@@ -580,6 +595,9 @@
|
|
|
580
595
|
"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
596
|
"exec.mass_edit_warning": "⚠️ Plan affects {count} files — review the full list before proceeding.",
|
|
582
597
|
"exec.escalation": "\n\n⚠️ Agent stuck on step {stepId} ({description}). Escalating to user — please provide guidance.",
|
|
598
|
+
"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.",
|
|
599
|
+
"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.",
|
|
600
|
+
"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
601
|
"exec.hints": "\n[Hints]\n{hints}",
|
|
584
602
|
"exec.file_rewrite_warning": "⚠️ File {file} has been rewritten {count} times. Consider a different approach — the current fix strategy is not working.",
|
|
585
603
|
"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 +650,18 @@
|
|
|
632
650
|
"migration.dir_bak": "- .mma/ → .mma.bak/ ({count} files)",
|
|
633
651
|
"migration.migrated": "Migrated:",
|
|
634
652
|
"migration.not_needed": "No migration needed",
|
|
635
|
-
"ui.error_prefix": "
|
|
653
|
+
"ui.error_prefix": "✗ ",
|
|
636
654
|
"ui.success_prefix": "✓ ",
|
|
637
655
|
"ui.warning_prefix": "⚠ ",
|
|
638
656
|
"ui.thinking": "Thinking…",
|
|
657
|
+
"ui.thinking_label": "thinking",
|
|
658
|
+
"ui.thinking_label_1": "thinking",
|
|
659
|
+
"ui.thinking_label_2": "working it out",
|
|
660
|
+
"ui.thinking_label_3": "considering",
|
|
661
|
+
"ui.action_fallback": "Action",
|
|
662
|
+
"ui.actions_summary": "{count} actions",
|
|
663
|
+
"ui.plan_update": "step {step} → {status}",
|
|
664
|
+
"ui.todo_action": "{action} · {count}",
|
|
639
665
|
"ui.tool_running": "{tool}…",
|
|
640
666
|
"ui.step_context": "step {id}: {desc}",
|
|
641
667
|
"indexer.map_header": "Project map",
|
|
@@ -738,6 +764,7 @@
|
|
|
738
764
|
"cli.usage_account": "Account: {credits} purchased · {used} used",
|
|
739
765
|
"cli.usage_empty": "No balance information returned.",
|
|
740
766
|
"repl.ctrl_c_interrupt": "\n[Ctrl+C] Stopping agent... (press again to force)",
|
|
767
|
+
"repl.force_exit": "\nForcing exit — background cleanup may be incomplete.",
|
|
741
768
|
"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
769
|
"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
770
|
"exec.test_runner_pass": "[test-runner] {framework}: all {passed} test(s) passing.",
|
|
@@ -756,6 +783,11 @@
|
|
|
756
783
|
"moe.execution_complete": "Execution complete: {succeeded}/{total} succeeded",
|
|
757
784
|
"moe.cycles_exhausted": "Max re-plan cycles ({max}) reached — returning partial results",
|
|
758
785
|
"moe.partial_result": "Partial result",
|
|
786
|
+
"moe.planning": "🤖 Planning with MoE mode...\n",
|
|
787
|
+
"moe.plan_fallback": "⚠️ Plan validation failed. Falling back to single-agent mode.\n",
|
|
788
|
+
"moe.plan_autofixed": "🔧 Auto-fixed {count} plan issues.\n",
|
|
789
|
+
"moe.plan_failed": "MoE plan failed: {error} — falling back to single-agent",
|
|
790
|
+
"moe.no_orchestrator": "MoE enabled but no orchestrator model configured — falling back to single-agent. Set orchestrator.model to activate MoE.",
|
|
759
791
|
"moe.scope_approved": "🔓 Scope expanded for \"{subtask}\": {files}",
|
|
760
792
|
"moe.scope_rejected": "⛔ Scope request rejected for \"{subtask}\"",
|
|
761
793
|
"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": "Запись файла",
|
|
@@ -345,6 +353,8 @@
|
|
|
345
353
|
"cli.exit_on_complete": "Завершить сразу после выполнения задачи; интерактивные тулзы (question/approve) не блокируют stdin, а возвращают ошибку",
|
|
346
354
|
"cli.reasoning_level": "Установить уровень рассуждений (auto|none|low|medium|high|max)",
|
|
347
355
|
"cli.json": "Вывести результат в формате JSON (режим однократного запуска)",
|
|
356
|
+
"cli.context_log": "Писать весь контекст LLM в <session>/context.diff в git-подобном diff-формате (первый снимок — полный, далее изменения +/-)",
|
|
357
|
+
"cli.verbose": "Показывать полный вывод чата (тела тулов, списки); по умолчанию — кратко",
|
|
348
358
|
"cli.security.description": "Управление настройками безопасности",
|
|
349
359
|
"cli.security.status": "Показать текущую конфигурацию безопасности",
|
|
350
360
|
"cli.security.policies": "Список доступных политик безопасности",
|
|
@@ -405,6 +415,11 @@
|
|
|
405
415
|
"repl.reasoning_usage": "Использование: /reasoning [auto|none|low|medium|high|max]",
|
|
406
416
|
"repl.reasoning_level_set": "Уровень рассуждений установлен: {level}",
|
|
407
417
|
"repl.reasoning_invalid_level": "Неверный уровень '{level}'. Допустимые: {valid}",
|
|
418
|
+
"repl.verbose": "Подробность вывода: quiet, normal или verbose",
|
|
419
|
+
"repl.verbose_usage": "Использование: /verbose [quiet|normal|verbose]",
|
|
420
|
+
"repl.verbose_set": "Подробность вывода: {level}",
|
|
421
|
+
"repl.verbose_invalid_level": "Неверный уровень '{level}'. Допустимые: {valid}",
|
|
422
|
+
"repl.last_action_none": "Нет недавнего действия для показа.",
|
|
408
423
|
"repl.status": "Показать статус агента",
|
|
409
424
|
"repl.status_usage": "Использование: /status",
|
|
410
425
|
"repl.plugins": "Список загруженных плагинов",
|
|
@@ -578,6 +593,9 @@
|
|
|
578
593
|
"exec.audit_incomplete": "❗ Финальная проверка не пройдена: {summary}. Задача НЕ завершена. Незакрытые шаги: {steps}. Устрани одним путём: (a) если результат шага уже существует на диске — закрой шаг (plan update step=N status=done); (b) если шаг больше не нужен — status=skipped; (c) если план разошёлся с реальностью (другие имена файлов, сменился подход) — сделай re-plan. Не повторяй plan update без изменений.",
|
|
579
594
|
"exec.mass_edit_warning": "⚠️ План затрагивает {count} файлов — проверьте полный список перед продолжением.",
|
|
580
595
|
"exec.escalation": "\n\n⚠️ Агент застрял на шаге {stepId} ({description}). Эскалация к пользователю — пожалуйста, подскажите как действовать.",
|
|
596
|
+
"exec.escalation_directive": "Ты застрял уже несколько попыток. Перестань повторять одно и то же и выбери ОДНО: (1) смени подход принципиально, (2) найди точный текст ошибки через web_search (или инструмент поиска ошибок), (3) задай пользователю короткий уточняющий вопрос, (4) если шаг невыполним — plan update step=<n> status=skipped с заметкой (или re-plan). Кратко объясни выбор.",
|
|
597
|
+
"exec.test_churn_nudge": "Ты несколько раз подряд правил тест/спек-файл \"{file}\" и не изменил ни строчки production-кода. Если тесты падают — исправляй КОД ПОД ТЕСТОМ (а не тест), если только сам тест не ошибочен — тогда объясни, почему. Если задумано test-first, теперь напиши реализацию.",
|
|
598
|
+
"exec.script_workaround_nudge": "Ограничение безопасности уже заблокировало одну из твоих команд. Написание shell-скрипта (.bat/.cmd/.sh/.ps1), чтобы выполнить её иначе, НЕ снимает ограничение и обычно просто падает. Вместо этого: используй write_file для вывода в файл, запускай по одной простой команде за вызов, передавай \"workdir\" вместо \"cd\" или спроси пользователя.",
|
|
581
599
|
"exec.hints": "\n[Подсказки]\n{hints}",
|
|
582
600
|
"exec.file_rewrite_warning": "⚠️ Файл {file} был перезаписан {count} раз. Попробуйте другой подход — текущая стратегия исправлений не работает.",
|
|
583
601
|
"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 +648,18 @@
|
|
|
630
648
|
"migration.dir_bak": "- .mma/ → .mma.bak/ ({count} файлов)",
|
|
631
649
|
"migration.migrated": "Мигрировано:",
|
|
632
650
|
"migration.not_needed": "Миграция не требуется",
|
|
633
|
-
"ui.error_prefix": "
|
|
651
|
+
"ui.error_prefix": "✗ ",
|
|
634
652
|
"ui.success_prefix": "✓ ",
|
|
635
653
|
"ui.warning_prefix": "⚠ ",
|
|
636
654
|
"ui.thinking": "Думаю…",
|
|
655
|
+
"ui.thinking_label": "размышляю",
|
|
656
|
+
"ui.thinking_label_1": "размышляю",
|
|
657
|
+
"ui.thinking_label_2": "обдумываю",
|
|
658
|
+
"ui.thinking_label_3": "прикидываю",
|
|
659
|
+
"ui.action_fallback": "Действие",
|
|
660
|
+
"ui.actions_summary": "{count} действий",
|
|
661
|
+
"ui.plan_update": "шаг {step} → {status}",
|
|
662
|
+
"ui.todo_action": "{action} · {count}",
|
|
637
663
|
"ui.tool_running": "{tool}…",
|
|
638
664
|
"ui.step_context": "шаг {id}: {desc}",
|
|
639
665
|
"indexer.map_header": "Карта проекта",
|
|
@@ -738,6 +764,7 @@
|
|
|
738
764
|
"cli.usage_account": "Аккаунт: куплено {credits} · израсходовано {used}",
|
|
739
765
|
"cli.usage_empty": "Провайдер не вернул данных о балансе.",
|
|
740
766
|
"repl.ctrl_c_interrupt": "\n[Ctrl+C] Остановка агента... (ещё раз — принудительно)",
|
|
767
|
+
"repl.force_exit": "\nПринудительный выход — фоновая очистка может быть неполной.",
|
|
741
768
|
"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
769
|
"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
770
|
"exec.test_runner_pass": "[test-runner] {framework}: all {passed} test(s) passing.",
|
|
@@ -756,6 +783,11 @@
|
|
|
756
783
|
"moe.execution_complete": "Выполнение завершено: {succeeded}/{total} успешно",
|
|
757
784
|
"moe.cycles_exhausted": "Достигнут лимит re-plan циклов ({max}) — возвращаю частичные результаты",
|
|
758
785
|
"moe.partial_result": "Частичный результат",
|
|
786
|
+
"moe.planning": "🤖 Планирую в режиме MoE...\n",
|
|
787
|
+
"moe.plan_fallback": "⚠️ Валидация плана не прошла. Возврат к одиночному режиму.\n",
|
|
788
|
+
"moe.plan_autofixed": "🔧 Автоисправлено проблем плана: {count}.\n",
|
|
789
|
+
"moe.plan_failed": "План MoE не построен: {error} — возврат к одиночному режиму",
|
|
790
|
+
"moe.no_orchestrator": "MoE включён, но orchestrator.model не задан — возврат к одиночному режиму. Укажите orchestrator.model для активации MoE.",
|
|
759
791
|
"moe.scope_approved": "🔓 Scope расширен для \"{subtask}\": {files}",
|
|
760
792
|
"moe.scope_rejected": "⛔ Запрос scope отклонён для \"{subtask}\"",
|
|
761
793
|
"prompt.overflow.compressing": "Переполнение системного промпта: сжимаю {count} блок(ов) перед первым запуском — на локальной модели это может занять время.",
|