micro-models-agent 0.63.3 → 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.
Files changed (185) hide show
  1. package/CHANGELOG.md +258 -1
  2. package/dist/cli/cache-line.js +30 -0
  3. package/dist/cli/command-suggest.js +38 -0
  4. package/dist/cli/commands.js +285 -60
  5. package/dist/cli/completer.js +16 -16
  6. package/dist/cli/json-payload.js +32 -0
  7. package/dist/cli/main.js +165 -77
  8. package/dist/cli/plugin-commands.js +5 -4
  9. package/dist/cli/relaunch.js +37 -0
  10. package/dist/cli/repl-commands.js +441 -307
  11. package/dist/cli/repl.js +360 -83
  12. package/dist/cli/run-result.js +12 -6
  13. package/dist/cli/security-commands.js +64 -60
  14. package/dist/cli/setup-order.js +57 -0
  15. package/dist/cli/setup-prompt.js +49 -0
  16. package/dist/cli/setup.js +52 -48
  17. package/dist/config/budget.js +48 -0
  18. package/dist/config/config.js +132 -70
  19. package/dist/config/defaults.js +37 -11
  20. package/dist/config/domains.js +9 -50
  21. package/dist/config/utils.js +56 -0
  22. package/dist/core/agent/audit-gate.js +49 -0
  23. package/dist/core/agent/compaction.js +89 -0
  24. package/dist/core/agent/constants.js +61 -0
  25. package/dist/core/agent/context-renderer.js +40 -0
  26. package/dist/core/agent/hallucination-gate.js +87 -0
  27. package/dist/core/agent/loop-state.js +53 -0
  28. package/dist/core/agent/prefix-monitor.js +101 -0
  29. package/dist/core/agent/reasoning-resolver.js +56 -0
  30. package/dist/core/agent/token-tracker.js +96 -0
  31. package/dist/core/agent/tool-batch.js +237 -0
  32. package/dist/core/agent/tool-output.js +62 -0
  33. package/dist/core/agent-moe.js +214 -69
  34. package/dist/core/agent.js +506 -546
  35. package/dist/core/bootstrap.js +297 -98
  36. package/dist/core/crash-handler.js +2 -1
  37. package/dist/core/prompt-builder.js +3 -0
  38. package/dist/core/prompt-overflow.js +307 -0
  39. package/dist/core/session-logger.js +34 -2
  40. package/dist/i18n/en.json +40 -5
  41. package/dist/i18n/ru.json +40 -5
  42. package/dist/index.js +5 -1
  43. package/dist/llm/cache-usage.js +76 -0
  44. package/dist/llm/image-utils.js +20 -16
  45. package/dist/llm/llm-errors.js +41 -0
  46. package/dist/llm/model-loader.js +30 -0
  47. package/dist/llm/openai-compat.js +287 -101
  48. package/dist/llm/orchestrator.js +140 -68
  49. package/dist/llm/provider-budget.js +68 -0
  50. package/dist/llm/provider.js +0 -1
  51. package/dist/llm/stream-state.js +26 -0
  52. package/dist/llm/token-counter.js +28 -0
  53. package/dist/logger/app-logger.js +12 -15
  54. package/dist/main.js +3311 -1192
  55. package/dist/migration/detect.js +3 -1
  56. package/dist/modules/browser/actions.js +0 -3
  57. package/dist/modules/browser/bridge-client.js +2 -0
  58. package/dist/modules/browser/driver.js +46 -4
  59. package/dist/modules/certification/cli.js +85 -42
  60. package/dist/modules/certification/loader.js +15 -1
  61. package/dist/modules/certification/manifest.js +126 -15
  62. package/dist/modules/certification/runner.js +4 -26
  63. package/dist/modules/certification/scenarios.js +184 -5
  64. package/dist/modules/certification/syntax-scenarios.js +51 -0
  65. package/dist/modules/context/chunk-query.js +25 -5
  66. package/dist/modules/context/fact-extractor.js +6 -2
  67. package/dist/modules/context/manager.js +23 -7
  68. package/dist/modules/execution/audit-runners.js +7 -1
  69. package/dist/modules/execution/auditor.js +3 -3
  70. package/dist/modules/execution/execution-plugin.js +22 -15
  71. package/dist/modules/execution/input-from.js +46 -0
  72. package/dist/modules/execution/module.js +107 -18
  73. package/dist/modules/execution/moe-executor.js +166 -54
  74. package/dist/modules/execution/plan-actions.js +524 -0
  75. package/dist/modules/execution/plan-steps.js +23 -0
  76. package/dist/modules/execution/plan-store.js +15 -3
  77. package/dist/modules/execution/plan-tool.js +6 -488
  78. package/dist/modules/execution/plan-validator.js +24 -0
  79. package/dist/modules/execution/stuck-detector.js +3 -18
  80. package/dist/modules/execution/tracker.js +14 -5
  81. package/dist/modules/execution/transient-error.js +30 -0
  82. package/dist/modules/execution/verifier.js +94 -7
  83. package/dist/modules/execution/windows-commands.js +11 -0
  84. package/dist/modules/hallucination/confidence.js +36 -23
  85. package/dist/modules/hallucination/consistency.js +3 -0
  86. package/dist/modules/hallucination/detector.js +8 -3
  87. package/dist/modules/hallucination/factual.js +26 -7
  88. package/dist/modules/hallucination/llm-judge.js +12 -2
  89. package/dist/modules/indexer/map-command.js +35 -0
  90. package/dist/modules/indexer/map-select.js +87 -0
  91. package/dist/modules/indexer/module.js +34 -22
  92. package/dist/modules/indexer/symbols.js +189 -0
  93. package/dist/modules/indexer/walker.js +96 -42
  94. package/dist/modules/lsp/check-tool.js +2 -1
  95. package/dist/modules/lsp/client.js +49 -32
  96. package/dist/modules/lsp/config.js +55 -2
  97. package/dist/modules/lsp/module.js +38 -5
  98. package/dist/modules/lsp/probe.js +4 -3
  99. package/dist/modules/lsp/project-root.js +41 -1
  100. package/dist/modules/lsp/startup-check.js +12 -4
  101. package/dist/modules/mcp/client.js +153 -104
  102. package/dist/modules/mcp/module.js +165 -41
  103. package/dist/modules/memory/module.js +4 -3
  104. package/dist/modules/plugins/builtin/lint-on-write.js +36 -6
  105. package/dist/modules/plugins/manager.js +47 -84
  106. package/dist/modules/pricing/index.js +17 -7
  107. package/dist/modules/pricing/prices.js +30 -12
  108. package/dist/modules/processes/index.js +1 -0
  109. package/dist/modules/processes/kill-tree.js +56 -0
  110. package/dist/modules/processes/registry.js +2 -54
  111. package/dist/modules/providers/cache.js +23 -0
  112. package/dist/modules/providers/factory.js +28 -0
  113. package/dist/modules/providers/fallback.js +7 -5
  114. package/dist/modules/providers/health.js +2 -1
  115. package/dist/modules/providers/index.js +1 -0
  116. package/dist/modules/providers/manager.js +17 -2
  117. package/dist/modules/providers/presets.js +79 -6
  118. package/dist/modules/reasoning/policy.js +40 -0
  119. package/dist/modules/reasoning/probe.js +111 -0
  120. package/dist/modules/security/audit-notifier.js +42 -27
  121. package/dist/modules/security/command-validator.js +25 -20
  122. package/dist/modules/security/encryption.js +6 -12
  123. package/dist/modules/security/network-validator.js +76 -5
  124. package/dist/modules/security/path-validator.js +77 -34
  125. package/dist/modules/security/rate-limiter.js +11 -0
  126. package/dist/modules/security/security-policies.js +1 -1
  127. package/dist/modules/security/session-encryption.js +13 -2
  128. package/dist/modules/security/session-isolation.js +2 -9
  129. package/dist/modules/session/manager.js +11 -0
  130. package/dist/modules/session/module.js +11 -3
  131. package/dist/modules/session/store.js +41 -5
  132. package/dist/modules/skills/loader.js +7 -1
  133. package/dist/modules/skills/module.js +2 -1
  134. package/dist/modules/updater/changelog-reader.js +94 -0
  135. package/dist/modules/updater/dev-detect.js +17 -0
  136. package/dist/modules/updater/index.js +1 -0
  137. package/dist/modules/updater/module.js +14 -3
  138. package/dist/output/bus.js +32 -0
  139. package/dist/output/channel.js +233 -0
  140. package/dist/output/format.js +14 -0
  141. package/dist/output/index.js +7 -0
  142. package/dist/output/json-sink.js +22 -0
  143. package/dist/output/machine.js +8 -0
  144. package/dist/output/session-sink.js +27 -0
  145. package/dist/output/types.js +1 -0
  146. package/dist/tools/approve.js +6 -2
  147. package/dist/tools/attach-image.js +11 -11
  148. package/dist/tools/auto-fixer.js +198 -0
  149. package/dist/tools/bash.js +142 -89
  150. package/dist/tools/chunk-query.js +10 -6
  151. package/dist/tools/download-file.js +1 -1
  152. package/dist/tools/edit-file.js +20 -2
  153. package/dist/tools/executor.js +54 -9
  154. package/dist/tools/glob-tool.js +7 -0
  155. package/dist/tools/grep-tool.js +15 -1
  156. package/dist/tools/index.js +3 -1
  157. package/dist/tools/list-dir.js +3 -1
  158. package/dist/tools/load-skill.js +2 -1
  159. package/dist/tools/mcp-call.js +1 -1
  160. package/dist/tools/move-file.js +5 -4
  161. package/dist/tools/path-utils.js +7 -0
  162. package/dist/tools/pipeline-run.js +1 -1
  163. package/dist/tools/prompt-io.js +28 -0
  164. package/dist/tools/question.js +12 -12
  165. package/dist/tools/scope-request.js +91 -0
  166. package/dist/tools/session-info.js +44 -0
  167. package/dist/tools/set-thinking.js +71 -0
  168. package/dist/tools/subagent.js +50 -9
  169. package/dist/tools/syntax-validator.js +177 -0
  170. package/dist/tools/user-input.js +16 -9
  171. package/dist/tools/write-file.js +17 -1
  172. package/dist/ui/diff.js +10 -0
  173. package/dist/ui/line-editor.js +179 -26
  174. package/dist/ui/line-math.js +20 -3
  175. package/dist/ui/md-formatter.js +100 -10
  176. package/dist/ui/output.js +5 -4
  177. package/dist/ui/plan-view.js +2 -7
  178. package/dist/ui/renderer.js +89 -85
  179. package/dist/ui/spinner.js +14 -4
  180. package/dist/utils/error.js +4 -0
  181. package/dist/utils/index.js +4 -0
  182. package/dist/utils/retry.js +17 -0
  183. package/dist/utils/sleep.js +23 -0
  184. package/dist/utils/truncate.js +9 -0
  185. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -4,44 +4,208 @@ 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
+
117
+ ## [1.1.0] - 2026-09-19
118
+
119
+ ### Added
120
+
121
+ - **Reasoning mode in the REPL prompt** (`src/cli/repl.ts`, i18n `repl.you_reasoning`/`repl.you_reasoning_cont`, en+ru): the input prompt now shows the active reasoning state - `You [auto]:` under the auto policy, `You [auto→high]:` when a level override is in effect, and the effective level (`You [high]:`) in a fixed mode. The label is rebuilt after every slash command and after a run, so a `set_thinking` override and `/reasoning <level>` are reflected immediately.
122
+
123
+ ### Fixed
124
+
125
+ - **`/reasoning <level>` had no effect in auto mode** (`src/core/agent/reasoning-resolver.ts`, `src/core/agent.ts`, `src/tools/set-thinking.ts`): the chosen level was stored in `reasoningState.level` but never consulted while `reasoning.mode` was `auto`, so the policy always won. It is now a **persistent manual override** (`ReasoningState.manual`) that takes priority over the auto policy and is cleared by `/reasoning auto`; `set_thinking` keeps its transient cooldown behavior.
126
+
127
+ ## [1.0.1] - 2026-09-18
128
+
129
+ ### Fixed
130
+
131
+ - **Garbled streamed output** (`src/ui/md-formatter.ts`): the live partial line was streamed raw and then overwritten with the formatted line using a cursor rewind equal to the **last chunk's** length (and, on completion, it re-formatted only the tail). Any line delivered in multiple chunks — i.e. every real answer — left the raw prefix on screen and mixed it with the formatted text (missing/swapped Cyrillic characters, leaked `▍` markers, broken tables; observed in `ses_mu6w6jmk`). The stream now tracks the **cumulative** displayed line, rewinds the full display width, and opts in to partial streaming only for rich terminals (`reservedCols` keeps the `- ` prefix from wrapping). A partial that would exceed the terminal width now freezes instead of wrapping, where a relative cursor move is meaningless.
132
+ - **REPL banner directory** (`src/cli/repl.ts`): `Директория` showed `process.cwd()`, which `bun run` sets to the package root — so `mma -d <dir>` reported the wrong folder. It now shows the agent workspace (`baseDir`).
133
+ - **Misleading prompt-overflow warning** (`src/core/bootstrap.ts`, `src/core/agent.ts`, i18n en+ru): the per-block startup/summary warning compared a single block's size against the whole system-prompt budget and claimed e.g. "AGENTS.md (3232 tok) exceeds the budget (3276 tok)" when the block fits and only the aggregate does not. Both messages now state the total requirement (`~N tok`) alongside the block that gets compressed.
134
+ - **Interactive-command hint** (`src/tools/bash.ts`): a command that aborts waiting on stdin without a TTY (`Operation cancelled`, `stdin is not a TTY` — e.g. a bare `bun create`) now returns a non-interactive remedy instead of letting the model retry it unchanged.
135
+ - **Infinite status-tool loop** (`src/core/agent.ts`): identical `session_info`/`process_list`/`process_log`/`file_info`/`project_map` calls are nudged and then hard-stopped in interactive runs. Mutating tools stay nudge-only, so a legitimate edit/build/read cycle is not cut short.
136
+ - **Removed the "short/empty response" uncertainty warning** (`src/modules/hallucination/confidence.ts`): a short but valid reply (greeting, terse acknowledgement, one-line confirmation) was flagged as uncertain even though the warning neither retried nor blocked anything. Real truncation is already caught by the provider's `finish_reason: "length"` and emptiness by the empty-response retry, so the check only produced false positives on legitimate answers.
137
+ - **First-run input freeze + wizard corruption** (`src/cli/relaunch.ts`, `src/cli/main.ts`, `src/ui/line-editor.ts`): the wizard and the REPL must not share a process. On Bun/Windows the raw-mode `LineEditor` only receives keypresses when it is the first stdin consumer, and reusing one editor across `wizard → bootstrap → REPL` leaked prompt/frame state. First run now collects settings with the cooked-mode `SetupPrompt` (no raw-mode/readline), persists them, and **re-execs the CLI in a fresh process** (`spawnSync`, inherited stdio, `MMA_POST_SETUP=1` guard) — the new process sees the config, skips the wizard, and creates its editor first thing. Separately, the DSR cursor query is now **opt-in on Windows** (`MMA_DSR=1`; default on elsewhere) because ConPTY could mis-decode the `ESC[row;colR` reply as typed input (every wizard prompt answered "R"); it is also never sent while a `question()` is pending.
138
+
139
+ ## [1.0.0] - 2026-09-18
140
+
141
+ ### Added
142
+
143
+ - **Unified output bus**: new `src/output/` layer — `OutputEvent`/`OutputBus` (`types.ts`, `bus.ts`) with monotonic ids, one-to-many fan-out and per-subscriber exception isolation. Producers emit events instead of writing to the terminal directly.
144
+ - **Single terminal writer**: `OutputChannel` (`channel.ts`) owns `process.stdout`/`stderr` and coordinates with the REPL prompt. Four ownership modes — `idle` (prompt owns the screen; `log`/`block` go through `printAbove`), `streaming` (direct passthrough; a partial line is closed before any `log`), `modal` (events queued FIFO, flushed on `endModal`), `quiet` (human output dropped for `--json`). One singleton per process (`getDefaultChannel()`); `clearScreen()` clears via the prompt sink, and synchronous bursts are batched into a single `printAbove` + frame render.
145
+ - **Prompt-aware line editor**: `LineEditor.printAbove()` prints a block above the input frame and redraws it; `suspendFrame()`/`resumeFrame()` hand the terminal to the agent during streaming; `setInputEnabled(false)` swallows printable keys while keeping Ctrl+C. The DSR cursor anchor is re-enabled with a 150 ms timeout fallback and `MMA_DSR=0` opt-out (ConPTY can buffer DSR replies).
146
+ - **Machine-readable sinks**: JSON (`json-sink.ts`) and session (`session-sink.ts`) subscribers on the bus; `--json` results now include a `diagnostics` array of warn/error events. `writeMachineJson()` (`machine.ts`) is the one sanctioned raw-stdout JSON contract.
147
+ - **Plugin output surface**: `HostBridge.subscribeOutput()` (`src/modules/types.ts`) lets plugins (web-ui, trace-server) observe log/probe/banner events and re-broadcast them.
148
+
149
+ ### Changed
150
+
151
+ - **All output routes through the bus**: `Logger`, `Renderer`, `Spinner`, REPL, CLI subcommands, setup wizard, certification, security commands and the MCP client now emit to `OutputBus`/`OutputChannel` instead of writing directly. The REPL drives terminal ownership explicitly (`beginStreaming`/`endStreaming`, `suspendFrame`/`resumeFrame`).
152
+ - **Background probes log silently**: the startup context/reasoning probes (`src/core/bootstrap.ts`) write to `app.jsonl` via `logger.logSilent` and no longer interleave with the wizard or prompt.
153
+ - **Setup wizard runs before bootstrap**: first-run orchestration (`src/cli/setup-order.ts`) runs `setup` → `applyAnswers` → `bootstrap`, so no background probe starts while the wizard owns the terminal.
154
+ - **Interactive tools use `PromptIO`**: `question`/`approve` read through an injected `PromptIO` (`src/tools/prompt-io.ts`) instead of opening a competing readline interface.
155
+ - **Root logger lines gain a `[mma]` source tag**: the default logger emits with `source: "mma"`, so root log lines are now `[INFO] [mma] <ISO> — <text>` (previously `[INFO] <ISO> — <text>`). Subsystem loggers keep their own prefix and are unchanged.
156
+
157
+ ### Removed
158
+
159
+ - **Direct `console.*` / `process.*.write` in `src/`**: forbidden by the new guard test (`tests/output/no-direct-console.test.ts`), with a tiny allowlist — `crash-handler` (must survive a broken output layer), `output/machine.ts` (JSON contract), `browser/bridge-server.mjs` (child-process JSON-RPC pipe) and the non-TTY REPL `printAbove` fallback.
160
+ - **Unused Logger color helpers** (`LEVEL_COLORS`/`isColorEnabled`) — colors moved to `formatEventLine` (`src/output/format.ts`).
161
+ - **Dead `PluginOutputBridge`** — superseded by `HostBridge.subscribeOutput`.
162
+
7
163
  ## [0.63.3] - 2026-09-17
8
164
 
9
165
  ### Fixed
166
+
10
167
  - **Plan-alignment false positives hard-blocked legitimate writes**: `checkPlanAlignment` (`src/modules/execution/module.ts`) could accumulate 3 "outside the current step" warnings and block a tool call the agent needed for the current step (observed in `ses_mu5wed4r`: the current step's own `src/main.ts` was blocked). Causes fixed:
11
- - **Path separators were not normalized** (root cause): model tool calls pass absolute Windows paths (`C:\…\src\main.ts`) while plan steps name files relatively (`src/main.ts`); the raw substring comparison never intersected backslash vs forward slash, so *every* write was treated as off-path. Both sides now go through `planPathToken` (forward slashes + lowercase) before matching.
168
+ - **Path separators were not normalized** (root cause): model tool calls pass absolute Windows paths (`C:\…\src\main.ts`) while plan steps name files relatively (`src/main.ts`); the raw substring comparison never intersected backslash vs forward slash, so _every_ write was treated as off-path. Both sides now go through `planPathToken` (forward slashes + lowercase) before matching.
12
169
  - The completed-step rewrite exemption compared paths one-directionally (`finishedPaths.some((s) => s.includes(p))`), so a done step naming `main.ts` did not exempt a rewrite of `src/main.ts` — the overlap check is now bidirectional, mirroring the current-step comparison.
13
170
  - Read-only diagnostic/structural tools were not exempt: `lsp_check` (mandated by the system prompt after every write) and `project_map` now join the allow-list (`PLAN_ALIGNMENT_EXEMPT_TOOLS`), alongside the other filesystem-reads, web/memory/session reads, process introspection and interactive prompts. Only file-mutating tools are pinned to the current step's file tokens.
14
171
  - **Plugin-blocked calls were treated as real tool failures**: a guard refusal (`onBeforeTool` → `false`/string) is now flagged `blocked` on `ToolResult` and propagated to the context message (`src/tools/executor.ts`, `src/core/agent/tool-batch.ts`, `src/modules/context/manager.ts`). Blocked calls no longer feed the compaction "Already tried & failed — do NOT repeat" memory, the per-tool repeated-failure rule, or the consecutive-failure recovery counter — so a transient guard (or a guard bug) cannot convince the agent to never retry a correct action.
15
172
 
16
173
  ### Added
174
+
17
175
  - **Browser launch overrides**: `MMA_BROWSER_EXECUTABLE` (absolute path) and `MMA_BROWSER_CHANNEL` (`chrome`/`msedge`/`chromium`) let the browser tool use an installed system browser instead of Playwright's pinned Chromium. When the bundled revision is missing (offline / blocked CDN) it now falls back to `chrome`, then `msedge`, automatically (`src/modules/browser/driver.ts`, `bridge-server.mjs`).
18
176
 
19
177
  ## [0.63.2] - 2026-09-17
20
178
 
21
179
  ### Fixed
180
+
22
181
  - **Long answers were silently cut by the completion cap**: `max_tokens` (default 4096) is sent on every request; when the model hit it while already streaming text, `finish_reason: "length"` was ignored and the truncated text was accepted as the final answer. The provider now emits a non-fatal `warning` chunk (`src/llm/openai-compat.ts`, streaming and non-streaming paths) that the agent renders in the chat — the answer still arrives, but the user sees it was cut off. Tool-call/empty-response truncation keeps the existing recoverable-error path.
23
182
  - **Resumed sessions lost their history**: `saveAssistantMessage` and `logToolResult` (`src/core/session-logger.ts`) persisted only the first 500 chars of each assistant/tool message, so `/resume` seeded the model with truncated context. Full content is stored now; the context budget still trims what actually goes to the LLM.
24
183
 
25
184
  ## [0.63.1] - 2026-09-17
26
185
 
27
186
  ### Added
187
+
28
188
  - **`ui.verbose`**: opt-in chatty mode for internal orchestration status. MoE planning / re-plan / execution / scope one-liners (`src/core/agent-moe.ts`) are now behind this flag (default `false`) instead of always being written to the chat.
29
189
 
30
190
  ### Changed
191
+
31
192
  - **Failed tool output is no longer echoed verbatim**: the chat used to print the full model-facing `result.output` of any tool without a `display` — including `Hint:` / recovery directives / "Do NOT …" instructions written for the agent. Only the first non-empty line (the gist of the error) is shown now, in red (`compactToolError`, `src/core/agent/tool-output.ts`).
32
193
  - **Live busy spinners for tool runs**: the renderer animates while `read_file` / `write_file` / `edit_file` / `bash` / … execute and restarts the spinner on every LLM "thinking" phase. Previously the spinner stopped at the first tool call and the rest of the run looked frozen. Interactive tools (`question`, `approve`) never spin; dead `BUSY_TOOLS` set removed.
33
194
 
34
195
  ## [0.63.0] - 2026-09-17
35
196
 
36
197
  ### Added
198
+
37
199
  - **REPL `/provider add`**: add a provider without leaving the agent. Mirrors `mma provider add` — `/provider add <name> [--url <url>] [--key <key>] [--priority <n>] [--context-window <n>] [--rpm <n>] [--parallel <n>]`. Seeds the legacy provider into `provider.entries` on first use, saves the config and hot-reloads the agent; switch with `/provider use <name>`. `/provider` autocompletion now includes `add`; i18n `repl.provider_add_missing_value`, `repl.provider_switch_hint` (en+ru).
38
200
 
39
201
  ### Changed
202
+
40
203
  - **Subcommand dispatch via handler maps** (new architecture rule #17): `/provider`, `/model` and `/skill` (`src/cli/repl-commands.ts`) and `SkillNameProvider.complete` (`src/cli/completer.ts`) now resolve subcommands through a `Record<string, handler>` map instead of `if (subcmd === …)` chains.
41
204
 
42
205
  ## [0.62.0] - 2026-09-17
43
206
 
44
207
  ### Added
208
+
45
209
  - **Prompt-cache awareness (cloud + local)**: every provider declares its cache behavior via a new `CacheCapability` (`ProviderCapabilities.cache`, overridable per entry with `provider.entries[].cache`). The OpenAI-compatible provider now sends the right request hints per backend — `cache_prompt` (llama.cpp), `prompt_cache_key` (OpenAI), `session_id` (OpenRouter sticky routing) — while `x-opencode-session` is gated by `sessionHeader` (legacy behavior preserved when no capability is set). `parseCacheUsage` (`src/llm/cache-usage.ts`) normalizes response formats (OpenAI/LM Studio/llama.cpp/vLLM/OpenRouter/Zen/Go, DeepSeek, Anthropic, Ollama) into `Chunk.usage.cache`.
46
210
  - **Cache metrics & savings**: `ModelPrice.cachedInput`/`cacheWrite`, `calculateCostDetailed` and `CostTracker.saved` bill cached reads at the cached rate and report the savings; builtin cached-read prices for MiniMax/GLM. A client-side prefix monitor (`src/core/agent/prefix-monitor.ts`) classifies why a cacheable prefix broke (`system`/`tools`/`history`/`volatile`) even when the provider reports nothing.
47
211
  - **Cache display**: a single footer line (`Cache: 87% hit · saved $0.42`, or `Prefix stable: 93% · broke: tool set`) in the REPL, single-run result and `--json` (`cache`); `mma session show <id>` aggregates `llm_usage` into token totals and cache hit rate.
@@ -49,10 +213,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this
49
213
  - **`mma usage`**: shows the active provider's balance/usage. OpenRouter is supported (`GET /key` for per-key usage/limit, plus `GET /credits` for account balance when a management key is configured); other providers report that they do not expose an API balance (OpenCode Zen/Go show it in the web dashboard).
50
214
 
51
215
  ### Changed
216
+
52
217
  - **Code comments are Russian** (new architecture rule #15).
53
218
  - **Cross-platform rule** (new architecture rule #16): processes/paths/shell/FS code must work on Windows, macOS and Linux (no `mklink`, no `npx` for local tools, quote paths, skip-not-fail tests when an OS lacks a primitive).
54
219
 
55
220
  ### Fixed
221
+
56
222
  - **One-shot subcommands hung when piped**: `mma session show <id> | cat` never exited because `bootstrap()` fired the background startup health check, which spawns an LSP/npx child that `process.exit` does not reap — the orphan kept the stdout pipe open. Subcommands never run an agent, so `setOneShotMode` now skips that check (detected in `main.ts` before `program.parse`). The recursive `postAction → process.exit(0)` hook (nested subcommands previously never fired it) is kept, and the startup check's `npx tsc` fallback now uses the local tsc.
57
223
  - **Prefix-cache line false alarm**: the footer treated the first iteration (`cause: unknown`, ratio 0) and normal history appends (`cause: none`) as a broken prefix. It now shows `Prefix stable …` only for a real break (`system`/`tools`/`history`/`volatile`) and surfaces the most recent such break even if later iterations are stable again.
58
224
  - **TypeScript checks were slow and unreliable**: syntax/type checks shelled out to `npx tsc`, which on Windows takes 5–13s (and tries the network without a local `typescript`), tripping test timeouts and stalling writes. New `resolveTscCommand` (`src/modules/lsp/project-root.ts`) runs the nearest local `tsc` via the current runtime (`process.execPath`), used by `verifier.ts`, `lint-on-write.ts` and `audit-runners.ts`; when no local tsc exists the check is skipped fast instead of hanging. The nested-project verifier test now links TypeScript with a cross-platform `symlinkSync(..., "junction")` instead of Windows-only `mklink`, and `bash.test.ts` resets the leaked grace window between tests.
@@ -60,35 +226,42 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this
60
226
  ## [0.61.1] - 2026-09-16
61
227
 
62
228
  ### Fixed
229
+
63
230
  - **OpenCode Go rejected every request**: `/chat/completions` returned `400 MissingSessionID` because the OpenAI-compatible provider sent no `x-opencode-session` header. The provider now sends the live session id (threaded through `ProviderOptions` → `ProviderManager` → `Agent`/`bootstrap`, plus the MoE orchestrator) and a `micro-models-agent/<version>` User-Agent on every chat and `listModels` request.
64
231
  - **Dev runs self-updated the global install**: running from TypeScript sources (`bun run mma`, `bun --watch src/cli/main.ts`) read the checkout's `package.json` version and `npm install -g`'d the published one over the user's install. The background updater is now skipped when the entry is a TS source; real installs (`dist/main.js` via `bin/mma.mjs`) still update.
65
232
 
66
233
  ## [0.61.0] - 2026-09-15
67
234
 
68
235
  ### Added
236
+
69
237
  - **Budget share controls**: `mma context --system <f>` / `--reserve <f>` and REPL `/context system <f>` / `reserve <f>` set `contextBudget.systemPrompt` / `responseReserve` (validated 0.05–0.9, system + reserve < 0.95). `mma context` and `/context` with no argument now print the budget breakdown (system / reserve / history in tokens and %). `mma config set contextBudget.systemPrompt <f>` keeps working.
70
238
 
71
239
  ### Changed
240
+
72
241
  - **Overflow fix advice**: the "system prompt exceeds budget" warning no longer only snaps to a coarse standard context size — a 32K project was jumping straight to `131072`, which looked arbitrary and was often unusable on a local model. The hint (`prompt.overflow.hint_*`, en+ru) now states the raw requirement (`needs ~N system tokens; current budget: W × f = B`) and both levers: raise `contextWindow` to the exact minimum (with the standard size) **or** keep the window and raise `contextBudget.systemPrompt` to the required share (`mma context --system <f>`).
73
242
 
74
243
  ### Fixed
244
+
75
245
  - **`mma context` ignored `MMA_CONFIG_DIR`**: it saved to a hardcoded `~/.mma/config.json`; it now writes to the config dir resolved by bootstrap.
76
246
 
77
247
  ## [0.60.1] - 2026-09-15
78
248
 
79
249
  ### Fixed
250
+
80
251
  - **Silent prompt-overflow summarization**: the startup dry-run warns that AGENTS.md / the project map "will be summarized before the first run", but the actual summarization ran with no notice — the first prompt appeared to hang while a local model rewrote a large AGENTS.md. `resolvePromptOverflow` now emits (en+ru, `prompt.overflow.*`): a "compressing N block(s)…" line before it starts, a per-block "summarizing \"label\" (N → M tok)…" line before the model call, a "truncating …" line on the fallback, and a failure line before falling back to truncation.
81
252
  - **Hardcoded English startup logs**: model auto-load success/failure, reasoning probe result, project indexing start/finish/failure, unreadable index entries and background-processes-killed-on-shutdown were untranslated; they now use `env.*` keys (en+ru). Project indexing now announces start and completion (`Indexed N file(s)`), so a slow first walk no longer pauses startup silently.
82
253
 
83
254
  ## [0.60.0] - 2026-09-15
84
255
 
85
256
  ### Added
257
+
86
258
  - **`session_info` tool** (`src/tools/session-info.ts`, `alwaysOn`): the model can now answer questions about the session it is running in — id, name, model, provider, context window, message count, timestamps and **live context usage** (`tokens / history budget (percent)` from `ContextManager.getSnapshot()`). Reads live metadata through a new `sessionManager` getter on `ToolContext` (like `sessionId`/`sessionContext`), so a REPL `/new` or `/resume` is reflected immediately. Previously the model reported having "no access to session metadata".
87
259
  - **Session prompt block** (`session.info_full`, en+ru): the system prompt carries a compact `[Session: "name" (id) | model: … | context: … tokens]` line so session identity is available passively as well.
88
260
  - **Project-map command**: `mma map [summary|refresh|find <query>]` (CLI) and `/map [summary|refresh|find <query>]` (REPL) let the user inspect the index directly — `summary` prints the exact text injected into the system prompt, `refresh` re-indexes, `find` searches by path or exported symbol. Shared implementation in `src/modules/indexer/map-command.ts` (also used by the `project_map` tool for `find`).
89
261
  - **Multi-language index**: symbol extraction was TS/JS-only and the extension whitelist stopped at 10 types. New `src/modules/indexer/symbols.ts` is a data-driven registry — adding a language is one rule plus extensions. It now indexes and extracts symbols for TypeScript/JavaScript, Python, Rust, Go, Java, Kotlin, C#, Ruby, PHP, Swift, Scala, C/C++, Shell and Lua (plus data formats: JSON, Markdown, YAML, TOML, XML, HTML/CSS); symbols are deduped and capped at 40 per file. `map-select.ts` now reuses `isCodeLanguage()` instead of its own list.
90
262
 
91
263
  ### Fixed
264
+
92
265
  - **Session metadata never reached the model**: `SessionModule.getSystemPromptBlock()` was collected once during bootstrap, but the session is created during that same bootstrap with `messageCount === 0`, so the block was always `null`. It is now collected through `getDynamicPromptBlocks`; content is deliberately limited to stable per-session fields (no message count) so the system prompt does not mutate every turn and the prefix KV-cache survives.
93
266
  - **Prompt-overflow messages not localized**: the overflow warnings emitted by `agent.ts` and the startup check in `bootstrap.ts` were hardcoded English; they now use `t("prompt.overflow.*")` and respect the configured locale (en+ru). The model-facing hint block stays English by design.
94
267
  - **Project map showed no source files**: the map listed the first 100 files in `readdir` walk order, which on a real workspace can be entirely docs/config/tests — on this repo the first 100 walked files contained **zero** `src/` entries, so the model had no idea about the project's code structure. New `selectMapFiles` (`src/modules/indexer/map-select.ts`) ranks source above tests above docs/config, puts the densest source directory first (no directory names hardcoded), drops lockfile noise, and sorts deterministically (KV-cache); the listing is capped at 80 files. The index still contains every file, so `project_map find` is unaffected.
@@ -97,6 +270,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this
97
270
  ## [0.59.0] - 2026-09-05
98
271
 
99
272
  ### Added
273
+
100
274
  - **Instructions overflow handling**: AGENTS.md and the project map that exceed the system-prompt budget are no longer silently dropped — they are summarized by the LLM into the remaining budget (disk-cached in `<project>/.mma/cache/prompt-summaries`, invalidated by file edits/budget changes) or truncated with a marker; a small essential hint block tells the model what was compressed and to `read_file` the full source
101
275
  - **Startup overflow warning**: bootstrap dry-runs the system budget with the real block set and warns the user when instructions/project map will not fit, with a concrete fix — `mma context <N>` for a global `contextWindow`, or an edit of `provider.entries[].contextWindow` in `config/provider.json` when the active entry overrides it
102
276
  - **Context probe**: at startup MMA asks LM Studio's native API for the context length the model is actually loaded with and compares it with the configured `contextWindow` — warning on overflow risk (no auto-clamp, user decides), info suggestion when the model supports more; result logged as a `context_probe` session entry
@@ -105,16 +279,19 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this
105
279
  ## [0.58.2] - 2026-09-01
106
280
 
107
281
  ### Fixed
282
+
108
283
  - **Stale i18n in published package**: `build:copy-assets` did not refresh `dist/i18n/en.json`/`ru.json`, so the 0.58.1 release shipped the old startup-check wording in the standalone JSON files (only `dist/main.js` had the fix). The copy step now ships the current dictionaries.
109
284
 
110
285
  ## [0.58.1] - 2026-09-01
111
286
 
112
287
  ### Fixed
288
+
113
289
  - **Startup check overreach**: the `lsp.startup_header` prompt block instructed the model to "fix these before continuing", overriding `SCOPE DISCIPLINE` — the 9B model started fixing pre-existing project errors the user never asked about (and skipped clarifying questions). The block is now informational (baseline only): errors are listed but the model is told to ignore them unless the current request is about them (en+ru).
114
290
 
115
291
  ## [0.58.0] - 2026-08-31
116
292
 
117
293
  ### Added
294
+
118
295
  - **MoE experts**: dynamic expert registry — `config.experts` (with optional `ExpertConfig.description`) is rendered into the MoE planner prompt instead of a hardcoded code/research/browser/vision list (fallback: `tool_tags`)
119
296
  - **MoE orchestrator provider**: `OrchestratorClient` builds its provider through `ProviderManager` — per-entry `contextWindow`/`retry`/`rateLimits` and failover entries are honored; `orchestrator.contextWindow` is the global fallback (legacy `{type,baseUrl,apiKey}` configs keep working)
120
297
  - **MoE success criteria**: machine-readable `success_criteria` (`file-exists:<path>`, `substring-in-file:<path>:<text>`, `command-exit-0:<cmd>`) verified by `StepVerifier.verifySubtaskCriteria` before merge; LLM-only criteria surface as warnings in the Router context
@@ -124,9 +301,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this
124
301
  - **ToolResult.usage**: sub-agent token usage propagated to the MoE executor for cost attribution
125
302
 
126
303
  ### Changed
304
+
127
305
  - **Reasoning policy baseline**: configurable via `reasoning.baseline` (default `medium`) — the auto policy's quiet-iteration level is no longer hardcoded, so trivial Q&A turns can start at `low`
128
306
 
129
307
  ### Fixed
308
+
130
309
  - **MoE hang**: sub-agents spawned by the `subagent` tool re-entered `runWithMoE` when the parent config had `moe.enabled=true` — each MoE sub-agent planned its own subtasks and spawned nested sub-agents recursively (bounded only by `maxRecursionDepth`), hanging execution for many minutes with zero progress events. Sub-agents now always run the plain single-agent loop (`moe` is a top-level orchestration mode only).
131
310
  - **MoE fallback visibility**: missing `orchestrator.model` with `moe.enabled=true` now logs a WARN with a fix hint instead of a debug-only message that made silent fallback to single-agent invisible.
132
311
  - **CLI one-shot commands hang**: `config`, `session`, `model`, `provider`, `context`, `security`, `plugins`, `changelog` printed their result but never exited — bootstrap leaves open handles (reasoning-probe fetch, indexer) and only the prompt/REPL paths called `process.exit`. Subcommand roots now exit via a `postAction` hook (verified: `session list` 2.7s / exit 0, chained `config set` persists correctly).
@@ -143,6 +322,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this
143
322
  ## [0.57.2] - 2026-08-30
144
323
 
145
324
  ### Changed
325
+
146
326
  - **KV-cache**: plan block removed from system prompt; plan status now injected into `<system-summary>` envelope after every tool batch. System prompt is immutable per session — local backends retain prefix cache.
147
327
  - **Provenance**: provider entry resolution uses active entry label, not bare `provider.type`
148
328
  - **Reasoning signals**: `consecutiveToolSuccesses` and `isRepetitive` now feed real values to the reasoning policy (were hardcoded)
@@ -156,6 +336,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this
156
336
  - **errMsg**: replaces 23 occurrences of `e instanceof Error ? e.message : String(e)` across 12 files
157
337
 
158
338
  ### Fixed
339
+
159
340
  - **chunk_query**: one failing chunk no longer kills the entire query; per-chunk `catch` → `[FAILED]`
160
341
  - **chunk_query**: synthesis prompt capped at 20K chars with `[TRUNCATED]` marker
161
342
  - **chunk_query**: `AbortSignal` propagated to `chatText` for cancellation support
@@ -167,6 +348,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this
167
348
  - **LSP /lsp check**: fixed latent bug where `.execute()` was called with `.executeByName` signature
168
349
 
169
350
  ### Added
351
+
170
352
  - **Plan Reminder**: static `[Plan Reminder]` block in system prompt (never mutates)
171
353
  - **Documentation**: reentrancy warning on `executeByName()`, `PlanResult` JSDoc
172
354
  - **Tests**: `probe.test.ts` (6 cases), `command-suggest.test.ts`, `providers-factory.test.ts`, `subagent-tool.test.ts`, `agent-moe-write.test.ts`, `chunk-query.test.ts`
@@ -175,21 +357,25 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this
175
357
  - **Security-policies**: `comparePolicies` typed (`keyof SecurityConfig` replaces `as any`)
176
358
 
177
359
  ### Removed
360
+
178
361
  - **Browser**: dead `buildWaitScript` export (never imported)
179
362
 
180
363
  ## [0.57.1] - 2026-08-28
181
364
 
182
365
  ### Fixed
366
+
183
367
  - **Publish**: republish after version bump
184
368
 
185
369
  ## [0.57.0] - 2026-08-28
186
370
 
187
371
  ### Changed
372
+
188
373
  - **MCP**: lazy connect — server connections deferred to first tool call. Startup no longer blocks on unreachable MCP servers (e.g. context7 offline). Discovery runs in background with 5s timeout.
189
374
  - **Updater**: `checkOnStart` and `autoInstall` disabled by default. Reduced `waitForIdle` timeout from 130s to 10s.
190
375
  - **Config**: `updater.checkOnStart` default changed from `true` to `false`
191
376
 
192
377
  ### Added
378
+
193
379
  - **MCP**: HTTP request timeouts (10s) on `connectSSE`, `listToolsHTTP`, `callToolHTTP`
194
380
  - **MCP**: `failedServers` tracking — servers that fail discovery are not retried
195
381
  - **MCP**: placeholder `connect` tool for not-yet-discovered servers (LLM can trigger lazy discovery)
@@ -198,17 +384,20 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this
198
384
  ## [0.56.5] - 2026-08-27
199
385
 
200
386
  ### Fixed
387
+
201
388
  - **Hallucination**: `FactualCheck` now receives deleted files from `ConsistencyCheck` — no longer false-positives on files that were intentionally deleted in the same session
202
389
 
203
390
  ## [0.56.4] - 2026-08-27
204
391
 
205
392
  ### Fixed
393
+
206
394
  - **Tools**: `list_dir` now filters `.mma/`, `node_modules/`, `.git/`, `dist/`, `build/`, `coverage/` from directory listings (consistent with indexer)
207
395
  - **Hallucination**: `dotfileVariants` now tries dot-prefixing each directory component, not just basename (fixes false positive on `.mma/index-cache.json` → `mma/index-cache.json`)
208
396
 
209
397
  ## [0.56.1] - 2026-08-27
210
398
 
211
399
  ### Added
400
+
212
401
  - **CLI**: `mma changelog` command — show latest changelog entry or diff between versions (`--from <version>`)
213
402
  - **Updater**: show changelog after auto-update install (`updater.installed` message includes new version's changelog)
214
403
  - **Docs**: `CHANGELOG.md` included in npm package (visible via `npm info micro-models-agent`)
@@ -217,6 +406,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this
217
406
  ## [0.56.0] - 2026-08-27
218
407
 
219
408
  ### Added
409
+
220
410
  - **MoE**: live re-plan loop in `runWithMoE` — orchestrator re-plans on structural failures
221
411
  - **MoE**: scope expansion protocol (`scope_request`) for cross-expert file access
222
412
  - **MoE**: Esc/interrupt support in the MoE execution path
@@ -225,6 +415,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this
225
415
  - **Tools**: syntax pre-validation and auto-fix for `write_file`/`edit_file`
226
416
 
227
417
  ### Fixed
418
+
228
419
  - **Security**: SSRF via IPv6-mapped IPv4 and raw numeric hostnames
229
420
  - **Security**: command-validator blacklist bypasses (shell expansions, encoded chars)
230
421
  - **Security**: audit webhook retry queue drained forever (infinite loop + duplicate notifications)
@@ -244,6 +435,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this
244
435
  ## [0.55.1] - 2026-08-25
245
436
 
246
437
  ### Fixed
438
+
247
439
  - **LLM**: NDJSON-tolerant stream parser for Ollama backends
248
440
  - **LLM**: mid-stream provider errors surfaced (Ollama generation failures)
249
441
  - **LLM**: `delta.reasoning` alias for thinking models
@@ -252,63 +444,75 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this
252
444
  ## [0.55.0] - 2026-08-25
253
445
 
254
446
  ### Added
447
+
255
448
  - **Certification**: targeted re-run (`--scenarios <ids>`) with result merging
256
449
  - **Certification**: per-rep timeout (`--timeout <ms>` + per-scenario `timeoutMs`)
257
450
  - **Certification**: audit-gate bypass fix for `--exit-on-complete`
258
451
 
259
452
  ### Fixed
453
+
260
454
  - **Certification**: stale-label wording (removed impossible user instruction)
261
455
  - **Dependencies**: typescript pinned to ^5.9 (TS7 preview breaks `@types/node`)
262
456
 
263
457
  ## [0.54.0] - 2026-08-24
264
458
 
265
459
  ### Added
460
+
266
461
  - **Certification**: global manifest shipped with package updates (`~/.mma/certifications.json`)
267
462
  - **Certification**: bundled manifest + startup sync from package
268
463
 
269
464
  ### Fixed
465
+
270
466
  - **Certification**: marks only showed when running from repo root
271
467
 
272
468
  ## [0.53.0] - 2026-08-24
273
469
 
274
470
  ### Added
471
+
275
472
  - **Certification**: qwen3.5-9b certified 20/20
276
473
  - **Config**: `provider.maxCompletionTokens` option
277
474
  - **Certification**: label text in `mma model list` and REPL `/model`
278
475
 
279
476
  ### Fixed
477
+
280
478
  - **Certification**: reasoning-heavy models truncated tool_call arguments at default 4096 cap
281
479
  - **Certification**: scenario 3.5 prompt disambiguation
282
480
 
283
481
  ## [0.52.0] - 2026-08-23
284
482
 
285
483
  ### Added
484
+
286
485
  - **Execution**: `FS_MUTATING_TOOLS` — plan auto-advance after bash/download/subagent/mcp/pipeline/browser tools
287
486
  - **Config**: `provider.maxCompletionTokens` plumbing through ProviderManager → agent
288
487
 
289
488
  ### Fixed
489
+
290
490
  - **Execution**: small models create files via bash instead of `write_file`, stalling plans
291
491
  - **Execution**: `maxCompletionTokens` was never read from config
292
492
 
293
493
  ## [0.51.0] - 2026-08-23
294
494
 
295
495
  ### Added
496
+
296
497
  - **Plugin**: `HostBridge` interface for bidirectional agent communication
297
498
  - **Plugin**: `onTurnEnd(ctx, TurnSummary)` hook — dispatched once per completed run
298
499
  - **Plugin**: `web-ui` example plugin — browser-based chat with SSE streaming
299
500
  - **CLI**: REPL bridge wiring for web-ui submit/interrupt
300
501
 
301
502
  ### Fixed
503
+
302
504
  - **REPL**: `/config migrate` unreachable
303
505
 
304
506
  ## [0.50.3] - 2026-08-22
305
507
 
306
508
  ### Fixed
509
+
307
510
  - **UI**: REPL line editor scroll-proof rendering (absolute anchoring via DSR query)
308
511
 
309
512
  ## [0.50.2] - 2026-08-22
310
513
 
311
514
  ### Fixed
515
+
312
516
  - **LLM**: idle stream timeout increased 60s → 180s (LM Studio buffering)
313
517
  - **LLM**: stall diagnosis with dedicated message for SSE buffering
314
518
  - **LLM**: truncation no longer masquerades as empty response
@@ -318,6 +522,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this
318
522
  ## [0.50.1] - 2026-08-21
319
523
 
320
524
  ### Fixed
525
+
321
526
  - **Security**: no longer silently overrides explicit user opt-out
322
527
  - **Lint**: skips missing lint binary (was appending error to every write)
323
528
  - **Stuck**: anti-spam for stuck-warnings (dedup via key, decay per-tool counters)
@@ -329,17 +534,20 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this
329
534
  ## [0.50.0] - 2026-08-21
330
535
 
331
536
  ### Added
537
+
332
538
  - **Provider**: health probe (`probeProviders()` + `mma provider check`)
333
539
  - **Provider**: code-only capability routing (`ProviderManager.pickFor()`)
334
540
  - **Provider**: per-entry isolation + priority fallback order
335
541
  - **Pricing**: per-provider cost attribution + breakdown
336
542
 
337
543
  ### Fixed
544
+
338
545
  - **Provider**: transparent failover on 429/5xx/network errors
339
546
 
340
547
  ## [0.49.0] - 2026-08-20
341
548
 
342
549
  ### Fixed
550
+
343
551
  - **REPL**: stale-plan leaks — plan state no longer persists across sessions
344
552
  - **REPL**: plan checklist prints only on plan/todo tool-end events
345
553
  - **Plan**: `PlanStore` is single source of truth for UI consumers
@@ -347,22 +555,26 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this
347
555
  ## [0.48.3] - 2026-08-20
348
556
 
349
557
  ### Fixed
558
+
350
559
  - **Hallucination**: dotfile false-positive (`.prettierrc.json` extracted as `prettierrc.json`)
351
560
 
352
561
  ## [0.48.2] - 2026-08-20
353
562
 
354
563
  ### Fixed
564
+
355
565
  - **REPL**: stale plan printed on first agent run of a session
356
566
 
357
567
  ## [0.47.0] - 2026-08-19
358
568
 
359
569
  ### Added
570
+
360
571
  - **Session**: startup diagnostics logging (environment, LSP probe, baseline typecheck)
361
572
  - **Session**: `logBaselineTypecheck()` for post-mortem visibility
362
573
 
363
574
  ## [0.46.1] - 2026-08-19
364
575
 
365
576
  ### Fixed
577
+
366
578
  - **LLM**: connection-break hardening (stream-level retry, no-data timeout, `[DONE]` tracking)
367
579
  - **LLM**: non-streaming timeout (was missing, could hang forever)
368
580
  - **Config**: `retry.maxStreamRetries`, `retry.noDataTimeoutMs` options
@@ -370,17 +582,20 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this
370
582
  ## [0.46.0] - 2026-08-19
371
583
 
372
584
  ### Added
585
+
373
586
  - **Provider**: multi-provider + hot-swap + per-message provenance
374
587
  - **Provider**: `ProviderManager` with entry-based config
375
588
  - **CLI**: `mma provider add/list/use`
376
589
  - **REPL**: `/provider list/use`
377
590
 
378
591
  ### Fixed
592
+
379
593
  - **Path**: `safeResolvePath` POSIX bug (absolute paths re-resolved against baseDir)
380
594
 
381
595
  ## [0.45.0] - 2026-08-18
382
596
 
383
597
  ### Added
598
+
384
599
  - **Provider**: provider module Phase 1 (registry, presets, `createProvider()`)
385
600
  - **Provider**: `openrouter` preset
386
601
  - **Setup**: wizard menu built from `BUILTIN_PROVIDERS`
@@ -388,15 +603,18 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this
388
603
  ## [0.44.0] - 2026-08-18
389
604
 
390
605
  ### Added
606
+
391
607
  - **Plugins**: folder plugins (subdirectory with entry file)
392
608
  - **Plugin**: `trace-server` split into folder plugin
393
609
 
394
610
  ### Fixed
611
+
395
612
  - **Plugin**: template-literal page inlining broke `\n` in JS strings
396
613
 
397
614
  ## [0.43.2] - 2026-08-17
398
615
 
399
616
  ### Fixed
617
+
400
618
  - **Execution**: plan done-gate on known compile failures (typecheck gate)
401
619
  - **Bootstrap**: live getters for `sessionId`/`sessionContext` after session switch
402
620
  - **Edit**: `edit_file` "String not found" hint to `read_file` first
@@ -404,6 +622,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this
404
622
  ## [0.43.1] - 2026-08-17
405
623
 
406
624
  ### Fixed
625
+
407
626
  - **Agent**: session-interrupt no longer renders tool results after "Session ended"
408
627
  - **Executor**: `onAfterTool` plugins skipped when signal is aborted
409
628
  - **Lint**: abortable syntax checks on Esc
@@ -411,12 +630,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this
411
630
  ## [0.43.0] - 2026-08-17
412
631
 
413
632
  ### Added
633
+
414
634
  - **Plan**: `plan delete <id>` + `plan purge` actions
415
635
  - **Plan**: `abort` honors `id` parameter
416
636
  - **Plan**: `replan` renumbers ids for kept steps
417
637
  - **Audit**: `resolveTestCommand` picks the project's real test runner
418
638
 
419
639
  ### Fixed
640
+
420
641
  - **Plan**: `switch` to already-active plan is a no-op
421
642
  - **Plan**: final audit runs for a completed plan
422
643
  - **Plan**: evidence-based plan nudge (replaces iteration counter)
@@ -427,15 +648,18 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this
427
648
  ## [0.42.0] - 2026-08-16
428
649
 
429
650
  ### Added
651
+
430
652
  - **Execution**: automatic error web search (≥5 same-error repeats → web search → inject results)
431
653
  - **Config**: `errorWebSearch` section
432
654
 
433
655
  ### Fixed
656
+
434
657
  - **Execution**: `onAfterTool` double-counted typecheck + failure errors
435
658
 
436
659
  ## [0.41.1] - 2026-08-16
437
660
 
438
661
  ### Fixed
662
+
439
663
  - **LSP**: `typescript@5` pin + `--yes` for npx
440
664
  - **LSP**: sequential probing (waves) to avoid npx cache lock contention
441
665
  - **LSP**: stale config normalization
@@ -446,6 +670,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this
446
670
  ## [0.41.0] - 2026-08-15
447
671
 
448
672
  ### Added
673
+
449
674
  - **REPL**: live plan checklist with progress bar
450
675
  - **UI**: tool-to-step binding (`← step N` suffix in tool headers)
451
676
  - **UI**: background command output preview
@@ -453,11 +678,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this
453
678
  ## [0.40.1] - 2026-08-15
454
679
 
455
680
  ### Fixed
681
+
456
682
  - **LSP**: broken package names (`vscode-html-languageserver` → `vscode-langservers-extracted`)
457
683
 
458
684
  ## [0.40.0] - 2026-08-15
459
685
 
460
686
  ### Added
687
+
461
688
  - **Tools**: tool-set narrowing (on-demand enable via `enable_tools`)
462
689
  - **Config**: `tools.defaultTags` + `tools.enableOnDemand`
463
690
  - **Tools**: `alwaysOn` flag for structural tools
@@ -465,40 +692,48 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this
465
692
  ## [0.39.1] - 2026-08-14
466
693
 
467
694
  ### Fixed
695
+
468
696
  - **Plugins**: dedup by version, compatibility gate, source tracking
469
697
  - **CLI**: `mma plugins list` command
470
698
 
471
699
  ## [0.38.0] - 2026-08-14
472
700
 
473
701
  ### Added
702
+
474
703
  - **LSP**: `lsp_check` tool for on-demand diagnostics
475
704
  - **Plan**: `plan create` guard (blocks when active plan has progress)
476
705
 
477
706
  ### Fixed
707
+
478
708
  - **Context**: compaction summary carries plan + read state
479
709
  - **Browser**: bridge path resolution in bundled dist
480
710
 
481
711
  ## [0.37.0] - 2026-08-13
482
712
 
483
713
  ### Added
714
+
484
715
  - **Plugins**: folder plugin support in `PluginLoader`
485
716
 
486
717
  ### Fixed
718
+
487
719
  - **Plugin**: template-literal page inlining broke `\n` in JS
488
720
 
489
721
  ## [0.36.3] - 2026-08-13
490
722
 
491
723
  ### Fixed
724
+
492
725
  - **UI**: REPL paste fix (batch single-render, CRLF collapse)
493
726
 
494
727
  ## [0.36.2] - 2026-08-13
495
728
 
496
729
  ### Fixed
730
+
497
731
  - **Updater**: silent logger, one-shot `process.exit()` killed background install, semver-aware check
498
732
 
499
733
  ## [0.36.1] - 2026-08-13
500
734
 
501
735
  ### Fixed
736
+
502
737
  - **Audit**: nested-file resolution, non-zero test run blocks
503
738
  - **Browser**: bridge diagnostics + one-shot restart
504
739
  - **LSP**: per-server disable + initialize retry + CSS timeout
@@ -507,11 +742,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this
507
742
  ## [0.36.0] - 2026-08-12
508
743
 
509
744
  ### Added
745
+
510
746
  - **Plan**: model-declared `kind: "create"|"delete"` for steps
511
747
  - **Execution**: `FS_MUTATING_TOOLS` for plan auto-advance
512
748
  - **Config**: `provider.maxCompletionTokens` option
513
749
 
514
750
  ### Fixed
751
+
515
752
  - **Context**: compaction preserves session `mission`
516
753
  - **Context**: deleted files leave compaction `[Files:]` list
517
754
  - **Audit**: final audit runs real `tsc --noEmit --skipLibCheck`
@@ -520,12 +757,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this
520
757
  ## [0.35.5] - 2026-08-12
521
758
 
522
759
  ### Fixed
760
+
523
761
  - **Execution**: plan-alignment phantom paths (domains/extensions treated as files)
524
762
  - **Execution**: hint/recovery dedup in `StuckDetector`
525
763
 
526
764
  ## [0.35.3] - 2026-08-11
527
765
 
528
766
  ### Fixed
767
+
529
768
  - **LSP**: workspace root resolved from edited file's project
530
769
  - **Audit**: skipped steps treated as terminal
531
770
  - **Bash**: Windows hint keys on original command word
@@ -534,17 +773,20 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this
534
773
  ## [0.35.0] - 2026-08-11
535
774
 
536
775
  ### Added
776
+
537
777
  - **Tools**: `download_file` tool for binary file downloads
538
778
 
539
779
  ## [0.34.0] - 2026-08-10
540
780
 
541
781
  ### Added
782
+
542
783
  - **Indexer**: project profile (`[Stack: ...]` summary from manifest)
543
784
  - **Indexer**: dynamic map refresh inside sessions
544
785
 
545
786
  ## [0.33.3] - 2026-08-10
546
787
 
547
788
  ### Fixed
789
+
548
790
  - **Audit**: nested-file resolution (basename + path-suffix match)
549
791
  - **Plan**: `plan show` honors `id` parameter
550
792
  - **Context**: compaction interval reset per user turn
@@ -559,18 +801,21 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this
559
801
  ## [0.33.2] - 2026-08-09
560
802
 
561
803
  ### Fixed
804
+
562
805
  - **UI**: REPL conversation layout (user/agent message dividers)
563
806
  - **Tools**: `isFilePathLike` uses allow-list of file extensions
564
807
 
565
808
  ## [0.33.1] - 2026-08-09
566
809
 
567
810
  ### Fixed
811
+
568
812
  - **UI**: REPL line editor redraw fix (no duplicated multi-line input)
569
813
  - **Tools**: `web_fetch`/`web_browse` description clarifications
570
814
 
571
815
  ## [0.33.0] - 2026-08-09
572
816
 
573
817
  ### Added
818
+
574
819
  - **RLM**: pass-by-reference sub-agent results (`ArtifactStore`)
575
820
  - **RLM**: chunked parallel queries (`chunk_query` tool)
576
821
  - **Config**: `subagent.resultMode`, `maxSummaryChars`, `artifactsDir`, `stableSystemPrompt`
@@ -578,6 +823,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this
578
823
  ## [0.32.0] - 2026-08-08
579
824
 
580
825
  ### Added
826
+
581
827
  - **Browser**: driver abstraction (`PlaywrightDriver` + `BridgeDriver`)
582
828
  - **Browser**: Node bridge for Bun compatibility
583
829
  - **Config**: `browser.maxConsoleLineChars`
@@ -585,6 +831,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this
585
831
  ## [0.31.0] - 2026-08-08
586
832
 
587
833
  ### Added
834
+
588
835
  - **Security**: session file encryption (AES-256-GCM)
589
836
  - **Security**: audit notifications (file + webhook)
590
837
  - **Security**: security policies (strict/balanced/permissive)
@@ -593,16 +840,19 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this
593
840
  ## [0.30.0] - 2026-08-07
594
841
 
595
842
  ### Added
843
+
596
844
  - **Execution**: final audit gate (runs `bun test` for verification steps)
597
845
  - **Execution**: `detectTestResults()` auto-verification in bash
598
846
 
599
847
  ### Fixed
848
+
600
849
  - **Execution**: empty-CLI entry-point hint
601
850
  - **Bash**: Windows anti-patterns documentation
602
851
 
603
852
  ## [0.29.0] - 2026-08-07
604
853
 
605
854
  ### Added
855
+
606
856
  - **Bash**: smart UTF-8/OEM line decoding (fixes Cyrillic on Windows)
607
857
  - **Bash**: behavior-based background detection
608
858
  - **Bash**: stuck-detector bash awareness
@@ -610,6 +860,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this
610
860
  ## [0.28.0] - 2026-08-06
611
861
 
612
862
  ### Fixed
863
+
613
864
  - **Agent**: double-Esc interrupt fix (Bun readline keypress collapsing)
614
865
  - **Agent**: abortable in-flight LLM requests on interrupt
615
866
  - **UI**: clipboard paste hint
@@ -617,12 +868,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this
617
868
  ## [0.27.0] - 2026-08-06
618
869
 
619
870
  ### Fixed
871
+
620
872
  - **Security**: Windows hardening
621
873
  - **Hallucination**: fixes
622
874
 
623
875
  ## [0.26.0] - 2026-08-05
624
876
 
625
877
  ### Added
878
+
626
879
  - **UI**: opencode-style inline tool headers (`ui.toolStyle`)
627
880
  - **UI**: model commentary next to tool calls (`ui.toolComments`)
628
881
  - **UI**: diffs without background color
@@ -630,6 +883,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this
630
883
  ## [0.25.0] - 2026-08-05
631
884
 
632
885
  ### Added
886
+
633
887
  - **LSP**: LSP module (typescript, CSS, HTML, JSON, Python, Rust, Go)
634
888
  - **Execution**: audit gate language-agnostic
635
889
  - **Bash**: Windows command hints
@@ -637,18 +891,21 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this
637
891
  ## [0.24.0] - 2026-08-04
638
892
 
639
893
  ### Added
894
+
640
895
  - **Context**: quality formula upgrade (token load + compaction loss + error density + freshness)
641
896
  - **Read**: display mode (show only header in REPL, full content to LLM)
642
897
 
643
898
  ## [0.23.0] - 2026-08-04
644
899
 
645
900
  ### Added
901
+
646
902
  - **Certification**: model certification module (`mma model certify`)
647
903
  - **CLI**: cert checkmarks in model lists
648
904
 
649
905
  ## [0.22.0] - 2026-08-03
650
906
 
651
907
  ### Added
908
+
652
909
  - **Security**: `enabled` flag (disabled by default)
653
910
  - **CLI**: init/first-run apply wizard security answers
654
911
  - **Prompt**: system prompt & recovery messages cleanup