micro-models-agent 0.60.1 → 0.61.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (233) hide show
  1. package/CHANGELOG.md +601 -584
  2. package/README.md +358 -358
  3. package/dist/certification/certifications.json +493 -493
  4. package/dist/cli/commands.js +447 -0
  5. package/dist/cli/completer.js +167 -0
  6. package/dist/cli/index.js +2 -0
  7. package/dist/cli/main.js +153 -0
  8. package/dist/cli/plugin-commands.js +36 -0
  9. package/dist/cli/repl-commands.js +761 -0
  10. package/dist/cli/repl.js +702 -0
  11. package/dist/cli/run-result.js +33 -0
  12. package/dist/cli/security-commands.js +164 -0
  13. package/dist/cli/setup.js +237 -0
  14. package/dist/config/config.js +276 -0
  15. package/dist/config/defaults.js +141 -0
  16. package/dist/config/domains.js +179 -0
  17. package/dist/config/experts.js +15 -0
  18. package/dist/config/index.js +4 -0
  19. package/dist/config/security.js +213 -0
  20. package/dist/config/types.js +1 -0
  21. package/dist/core/agent-moe.js +102 -0
  22. package/dist/core/agent.js +1018 -0
  23. package/dist/core/bootstrap.js +481 -0
  24. package/dist/core/crash-handler.js +51 -0
  25. package/dist/core/environment.js +199 -0
  26. package/dist/core/index.js +2 -0
  27. package/dist/core/prompt-builder.js +76 -0
  28. package/dist/core/session-logger.js +251 -0
  29. package/dist/core/types.js +1 -0
  30. package/dist/core/version.js +26 -0
  31. package/dist/core/workspace.js +76 -0
  32. package/dist/i18n/en.json +757 -746
  33. package/dist/i18n/index.js +46 -0
  34. package/dist/i18n/ru.json +757 -746
  35. package/dist/index.js +22 -0
  36. package/dist/llm/image-utils.js +143 -0
  37. package/dist/llm/index.js +4 -0
  38. package/dist/llm/model-loader.js +78 -0
  39. package/dist/llm/openai-compat.js +497 -0
  40. package/dist/llm/orchestrator.js +200 -0
  41. package/dist/llm/provider.js +10 -0
  42. package/dist/llm/response.js +39 -0
  43. package/dist/llm/token-counter.js +39 -0
  44. package/dist/llm/types.js +1 -0
  45. package/dist/logger/app-logger.js +189 -0
  46. package/dist/logger/file-log.js +151 -0
  47. package/dist/logger/index.js +1 -0
  48. package/dist/main.js +503 -340
  49. package/dist/migration/backup.js +45 -0
  50. package/dist/migration/detect.js +50 -0
  51. package/dist/migration/index.js +2 -0
  52. package/dist/modules/artifacts/store.js +61 -0
  53. package/dist/modules/browser/actions.js +76 -0
  54. package/dist/modules/browser/bridge-client.js +199 -0
  55. package/dist/modules/browser/bridge-path.js +10 -0
  56. package/dist/modules/browser/bridge-server.mjs +219 -219
  57. package/dist/modules/browser/cookie-store.js +24 -0
  58. package/dist/modules/browser/driver.js +136 -0
  59. package/dist/modules/browser/index.js +7 -0
  60. package/dist/modules/browser/module.js +29 -0
  61. package/dist/modules/browser/session.js +342 -0
  62. package/dist/modules/browser/snapshot.js +148 -0
  63. package/dist/modules/browser/types.js +12 -0
  64. package/dist/modules/certification/cli.js +213 -0
  65. package/dist/modules/certification/fact-checker.js +82 -0
  66. package/dist/modules/certification/loader.js +106 -0
  67. package/dist/modules/certification/manifest.js +58 -0
  68. package/dist/modules/certification/runner.js +245 -0
  69. package/dist/modules/certification/scenarios.js +407 -0
  70. package/dist/modules/certification/types.js +1 -0
  71. package/dist/modules/context/chunk-query.js +100 -0
  72. package/dist/modules/context/fact-extractor.js +168 -0
  73. package/dist/modules/context/history.js +15 -0
  74. package/dist/modules/context/index.js +1 -0
  75. package/dist/modules/context/manager.js +440 -0
  76. package/dist/modules/execution/audit-runners.js +206 -0
  77. package/dist/modules/execution/auditor.js +218 -0
  78. package/dist/modules/execution/execution-plugin.js +431 -0
  79. package/dist/modules/execution/index.js +8 -0
  80. package/dist/modules/execution/module.js +625 -0
  81. package/dist/modules/execution/moe-executor.js +304 -0
  82. package/dist/modules/execution/plan-coverage.js +68 -0
  83. package/dist/modules/execution/plan-persister.js +46 -0
  84. package/dist/modules/execution/plan-store.js +196 -0
  85. package/dist/modules/execution/plan-tool.js +677 -0
  86. package/dist/modules/execution/plan-validator.js +153 -0
  87. package/dist/modules/execution/planner.js +94 -0
  88. package/dist/modules/execution/stuck-detector.js +746 -0
  89. package/dist/modules/execution/tracker.js +69 -0
  90. package/dist/modules/execution/types.js +1 -0
  91. package/dist/modules/execution/verifier.js +235 -0
  92. package/dist/modules/execution/windows-commands.js +41 -0
  93. package/dist/modules/hallucination/confidence.js +66 -0
  94. package/dist/modules/hallucination/consistency.js +26 -0
  95. package/dist/modules/hallucination/detector.js +47 -0
  96. package/dist/modules/hallucination/factual.js +169 -0
  97. package/dist/modules/hallucination/index.js +5 -0
  98. package/dist/modules/hallucination/js-identifiers.js +262 -0
  99. package/dist/modules/hallucination/llm-judge.js +101 -0
  100. package/dist/modules/index.js +5 -0
  101. package/dist/modules/indexer/cache.js +40 -0
  102. package/dist/modules/indexer/index.js +3 -0
  103. package/dist/modules/indexer/module.js +246 -0
  104. package/dist/modules/indexer/project-profile.js +183 -0
  105. package/dist/modules/indexer/walker.js +101 -0
  106. package/dist/modules/lsp/check-tool.js +58 -0
  107. package/dist/modules/lsp/client.js +389 -0
  108. package/dist/modules/lsp/command.js +60 -0
  109. package/dist/modules/lsp/config.js +135 -0
  110. package/dist/modules/lsp/index.js +3 -0
  111. package/dist/modules/lsp/module.js +260 -0
  112. package/dist/modules/lsp/probe.js +86 -0
  113. package/dist/modules/lsp/project-root.js +32 -0
  114. package/dist/modules/lsp/startup-check.js +144 -0
  115. package/dist/modules/lsp/types.js +1 -0
  116. package/dist/modules/mcp/client.js +399 -0
  117. package/dist/modules/mcp/index.js +3 -0
  118. package/dist/modules/mcp/module.js +142 -0
  119. package/dist/modules/mcp/registry.js +15 -0
  120. package/dist/modules/memory/index.js +1 -0
  121. package/dist/modules/memory/module.js +96 -0
  122. package/dist/modules/memory/search.js +42 -0
  123. package/dist/modules/memory/store.js +69 -0
  124. package/dist/modules/pipelines/engine.js +60 -0
  125. package/dist/modules/pipelines/index.js +3 -0
  126. package/dist/modules/pipelines/parser.js +56 -0
  127. package/dist/modules/pipelines/template.js +14 -0
  128. package/dist/modules/plugins/builtin/lint-on-write.js +334 -0
  129. package/dist/modules/plugins/builtin/notify.js +9 -0
  130. package/dist/modules/plugins/index.js +1 -0
  131. package/dist/modules/plugins/loader.js +70 -0
  132. package/dist/modules/plugins/manager.js +261 -0
  133. package/dist/modules/plugins/types.js +1 -0
  134. package/dist/modules/pricing/index.js +61 -0
  135. package/dist/modules/pricing/prices.js +129 -0
  136. package/dist/modules/processes/detect.js +34 -0
  137. package/dist/modules/processes/index.js +2 -0
  138. package/dist/modules/processes/registry.js +327 -0
  139. package/dist/modules/processes/runner.js +23 -0
  140. package/dist/modules/providers/create.js +22 -0
  141. package/dist/modules/providers/fallback.js +79 -0
  142. package/dist/modules/providers/health.js +46 -0
  143. package/dist/modules/providers/index.js +5 -0
  144. package/dist/modules/providers/manager.js +161 -0
  145. package/dist/modules/providers/presets.js +128 -0
  146. package/dist/modules/providers/registry.js +22 -0
  147. package/dist/modules/providers/types.js +1 -0
  148. package/dist/modules/registry.js +48 -0
  149. package/dist/modules/security/audit-log.js +136 -0
  150. package/dist/modules/security/audit-notifier.js +292 -0
  151. package/dist/modules/security/command-validator.js +219 -0
  152. package/dist/modules/security/content-scanner.js +53 -0
  153. package/dist/modules/security/data-sanitizer.js +89 -0
  154. package/dist/modules/security/encryption.js +242 -0
  155. package/dist/modules/security/index.js +14 -0
  156. package/dist/modules/security/network-validator.js +88 -0
  157. package/dist/modules/security/path-validator.js +203 -0
  158. package/dist/modules/security/rate-limiter.js +119 -0
  159. package/dist/modules/security/security-policies.js +531 -0
  160. package/dist/modules/security/session-encryption.js +210 -0
  161. package/dist/modules/security/session-isolation.js +95 -0
  162. package/dist/modules/session/index.js +3 -0
  163. package/dist/modules/session/manager.js +172 -0
  164. package/dist/modules/session/module.js +24 -0
  165. package/dist/modules/session/store.js +222 -0
  166. package/dist/modules/session/types.js +1 -0
  167. package/dist/modules/skills/index.js +2 -0
  168. package/dist/modules/skills/loader.js +72 -0
  169. package/dist/modules/skills/matcher.js +27 -0
  170. package/dist/modules/skills/module.js +129 -0
  171. package/dist/modules/types.js +1 -0
  172. package/dist/modules/updater/checker.js +96 -0
  173. package/dist/modules/updater/index.js +2 -0
  174. package/dist/modules/updater/module.js +116 -0
  175. package/dist/modules/user-profile/compressor.js +16 -0
  176. package/dist/modules/user-profile/index.js +1 -0
  177. package/dist/modules/user-profile/profile.js +68 -0
  178. package/dist/skills/builtin/git.md +36 -36
  179. package/dist/skills/builtin/typescript.md +35 -35
  180. package/dist/tools/approve.js +33 -0
  181. package/dist/tools/attach-image.js +101 -0
  182. package/dist/tools/bash.js +519 -0
  183. package/dist/tools/browser.js +115 -0
  184. package/dist/tools/chunk-query.js +100 -0
  185. package/dist/tools/create-dir.js +56 -0
  186. package/dist/tools/delete-file.js +63 -0
  187. package/dist/tools/download-file.js +117 -0
  188. package/dist/tools/edit-file.js +80 -0
  189. package/dist/tools/enable-tools.js +59 -0
  190. package/dist/tools/executor.js +154 -0
  191. package/dist/tools/file-info.js +47 -0
  192. package/dist/tools/filter-tools.js +17 -0
  193. package/dist/tools/glob-tool.js +27 -0
  194. package/dist/tools/grep-tool.js +125 -0
  195. package/dist/tools/hidden-tools-block.js +37 -0
  196. package/dist/tools/index.js +78 -0
  197. package/dist/tools/list-dir.js +49 -0
  198. package/dist/tools/load-skill.js +43 -0
  199. package/dist/tools/mcp-call.js +69 -0
  200. package/dist/tools/move-file.js +86 -0
  201. package/dist/tools/path-utils.js +101 -0
  202. package/dist/tools/pipeline-run.js +145 -0
  203. package/dist/tools/preview.js +2 -0
  204. package/dist/tools/process-kill.js +40 -0
  205. package/dist/tools/process-list.js +37 -0
  206. package/dist/tools/process-log.js +54 -0
  207. package/dist/tools/question.js +141 -0
  208. package/dist/tools/read-file.js +179 -0
  209. package/dist/tools/recall.js +118 -0
  210. package/dist/tools/registry.js +47 -0
  211. package/dist/tools/remember.js +68 -0
  212. package/dist/tools/scope-check.js +32 -0
  213. package/dist/tools/search-history.js +85 -0
  214. package/dist/tools/subagent.js +196 -0
  215. package/dist/tools/types.js +1 -0
  216. package/dist/tools/user-input.js +123 -0
  217. package/dist/tools/web-browse.js +87 -0
  218. package/dist/tools/web-fetch.js +119 -0
  219. package/dist/tools/web-search.js +105 -0
  220. package/dist/tools/write-file.js +82 -0
  221. package/dist/ui/box.js +77 -0
  222. package/dist/ui/colors.js +4 -0
  223. package/dist/ui/diff.js +178 -0
  224. package/dist/ui/index.js +6 -0
  225. package/dist/ui/line-editor.js +822 -0
  226. package/dist/ui/line-math.js +73 -0
  227. package/dist/ui/md-formatter.js +212 -0
  228. package/dist/ui/output.js +13 -0
  229. package/dist/ui/plan-view.js +103 -0
  230. package/dist/ui/renderer.js +259 -0
  231. package/dist/ui/spinner.js +70 -0
  232. package/dist/ui/table.js +144 -0
  233. package/package.json +51 -51
package/CHANGELOG.md CHANGED
@@ -1,584 +1,601 @@
1
- # Changelog
2
-
3
- All notable changes to Micro Models Agent (MMA) will be documented in this file.
4
-
5
- The format is based on [Keep a Changelog](https://keepachangelog.com/), and this project adheres to [Semantic Versioning](https://semver.org/).
6
-
7
- ## [0.60.1] - 2026-09-15
8
-
9
- ### Fixed
10
- - **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.
11
- - **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.
12
-
13
- ## [0.60.0] - 2026-09-15
14
-
15
- ### Added
16
- - **`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".
17
- - **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.
18
- - **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`).
19
- - **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.
20
-
21
- ### Fixed
22
- - **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.
23
- - **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.
24
- - **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.
25
- - **Indexer swallowed virtualenvs and other vendor trees**: `IGNORE_DIRS` was Node-centric (`node_modules`, `dist`, `build`, `.mma`, `coverage`), so a Python `venv/` (thousands of dependency files) was indexed and could crowd the map out. The list now covers Python (`venv`, `.venv`, `env`, `virtualenv`, `__pycache__`, `.pytest_cache`, `.mypy_cache`, `.ruff_cache`, `.tox`, `site-packages`), Rust (`target`), Go/PHP/Ruby (`vendor`, `.bundle`), JVM (`.gradle`, `out`), .NET (`obj`), Apple (`pods`, `deriveddata`), VCS/IDE (`.hg`, `.svn`, `.idea`, `.vscode`) plus the original Node entries. Matching is case-insensitive and the watcher now matches whole path **segments** instead of substrings, so short names (`env`, `out`, `obj`) cannot black out `environment.ts` or `about/`.
26
-
27
- ## [0.59.0] - 2026-09-05
28
-
29
- ### Added
30
- - **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
31
- - **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
32
- - **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
33
- - **Config**: `instructions.summarize` (default `true`) to disable LLM summarization (truncation fallback only)
34
-
35
- ## [0.58.2] - 2026-09-01
36
-
37
- ### Fixed
38
- - **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.
39
-
40
- ## [0.58.1] - 2026-09-01
41
-
42
- ### Fixed
43
- - **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).
44
-
45
- ## [0.58.0] - 2026-08-31
46
-
47
- ### Added
48
- - **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`)
49
- - **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)
50
- - **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
51
- - **MoE selective re-plan**: `executePlan(plan, {skipIds, carriedResults})` — already-succeeded subtasks are carried over across re-plan cycles, only failed/new subtasks re-execute
52
- - **MoE observability**: `moe_plan` / `moe_subtask` / `moe_replan` / `moe_verify` events written to `session.jsonl` (visible in `mma session show`); token usage aggregated per `expert_tag` (`MoEExecutor.getUsageByTag`); sub-agents receive the real session id instead of the hardcoded `"moe"`
53
- - **MoE cert scenarios**: `5.2-moe-parallel-waves` and `5.3-moe-read-after-write` (tag `moe`, timeoutMs 600_000)
54
- - **ToolResult.usage**: sub-agent token usage propagated to the MoE executor for cost attribution
55
-
56
- ### Changed
57
- - **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`
58
-
59
- ### Fixed
60
- - **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).
61
- - **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.
62
- - **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).
63
- - **Repeated tool calls**: identical `(tool, args)` repeat now injects a nudge into context in ALL modes — previously the nudge was gated behind `--exit-on-complete`, so interactive runs silently burned iterations re-running the same command (observed: duplicate `node sum.js` verification back-to-back).
64
- - **Perfectionism cycle**: repeated mutations of the SAME target (same file via `edit_file`/`write_file`, same bash command, same `plan`/`todo` action) with varying arguments now inject a finalize-nudge after 5 occurrences — the consecutive-duplicate guard cannot see this pattern (args differ each time; observed: 20+ polish iterations after the task was already complete, then 10+ bookkeeping churn iterations after an audit rejection). The nudge lands AFTER tool results, so `assistant(tool_calls) → tool(results) → user(nudge)` pairing stays valid.
65
- - **Audit gate friction (evidence-based auto-close)**: pending plan steps whose every file-like token resolves to an existing file are auto-closed by the final audit with a note small models routinely finish the work but forget `plan update` bookkeeping, and the gate then rejected correct answers burning all retry budget. Steps without file tokens or with missing files stay pending (honest).
66
- - **Audit rejection guidance**: the audit gate's `<system-summary>` now names the resolution paths (mark done / skipped / re-plan) in en+ru instead of a bare "continue working" model plan-drift after a rejection (wrong file names, changed approach) is common for 9B and the old message did not point at the fix.
67
- - **LSP false positives without type env**: `lsp_check` suppresses module-resolution diagnostics when the project root has no `tsconfig.json`/`jsconfig.json`/`node_modules` and reports an inconclusive note instead — phantom `Cannot find module 'fs'` / `Cannot find name '__dirname'` errors made the model abandon a working `.ts` approach for `.js` and spiral into plan drift.
68
- - **Windows Unix-command hints**: `bash` hint list and the module-side forbidden set now cover `sed`/`awk`/`uniq`/`xargs`/`cut`/`tr`/`basename`/`dirname`/`export`/`source`/`sleep`/`env` (both lists kept consistent) the 9B model keeps reaching for Unix tools in cmd.exe.
69
- - **Tool visibility narrowing**: `chunk_query`, `download_file`, `mcp_call`, `pipeline_run` no longer visible by default they moved behind `enable_tools` (`research`/`shell` tags); the default visible set drops from 23 to 19 schemas, cutting tool tokens on every turn.
70
- - **Tests**: replaced process-global `vi.mock` with DI seams (`AgentDeps.runWithMoEOverride`, `ToolContext.agentFactory`) — Bun module mocks leak across test files in the same worker; full suite is now green by default (1803 pass / 0 fail).
71
- - **Docs**: AGENTS.md / testing.md warn that `mma` resolves the globally installed package (stale `dist/`) when run outside the repo root, silently ignoring `src/` changes; always run from the repo root with `-d <sandbox>` and verify the version in the `Environment:` line.
72
-
73
- ## [0.57.2] - 2026-08-30
74
-
75
- ### Changed
76
- - **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.
77
- - **Provenance**: provider entry resolution uses active entry label, not bare `provider.type`
78
- - **Reasoning signals**: `consecutiveToolSuccesses` and `isRepetitive` now feed real values to the reasoning policy (were hardcoded)
79
- - **Token estimation**: tool-def token estimate in agent loop uses `estimateTokens()` instead of flat `/4`
80
- - **Agent split**: `agent.ts` 1550→950 lines; 10 extracted modules (`loop-state`, `compaction`, `tool-batch`, `hallucination-gate`, `audit-gate`, `reasoning-resolver`, `token-tracker`, `context-renderer`, `tool-output`, `constants`)
81
- - **Plan-tool**: `plan-tool.ts` 741232 lines; per-action handlers in `plan-actions.ts`
82
- - **CLI**: `createProgram` 513→thin orchestrator; `registerMmaCommands` 470→8 lines (5 per-domain registers)
83
- - **Bash handler**: `bash.ts` 236→~100 lines (`resolveBashSecurityConfig`, `decorateCommandOutput`)
84
- - **Orchestrator**: reuse `parseChunks` instead of hand-rolled `any[]` aggregation; `createPlan` uses own `parseJSON`; constructor deduplicated via `createProviderInstance`
85
- - **Shared utils**: `src/utils/` with `errMsg()`, `sleep()`, `truncate()`, `backoffDelay()`
86
- - **errMsg**: replaces 23 occurrences of `e instanceof Error ? e.message : String(e)` across 12 files
87
-
88
- ### Fixed
89
- - **chunk_query**: one failing chunk no longer kills the entire query; per-chunk `catch` → `[FAILED]`
90
- - **chunk_query**: synthesis prompt capped at 20K chars with `[TRUNCATED]` marker
91
- - **chunk_query**: `AbortSignal` propagated to `chatText` for cancellation support
92
- - **Executor**: `failFast` cleanup guard prevents nested scope clobbering
93
- - **probe.ts**: transient errors (network/auth) no longer cached as "reasoning not supported" for 24h; returns `null` caller skips cache
94
- - **LSP**: startup timeout unified on `DEFAULT_TIMEOUT` (15000) instead of conflicting hardcoded 10000
95
- - **Browser**: `BridgeResponse.data` typed (was `any`)
96
- - **Agent**: `Agent.runTool()` public API replaces `(ctx.agent as any).deps` reach-in; `/reload` no longer mutates readonly context
97
- - **LSP /lsp check**: fixed latent bug where `.execute()` was called with `.executeByName` signature
98
-
99
- ### Added
100
- - **Plan Reminder**: static `[Plan Reminder]` block in system prompt (never mutates)
101
- - **Documentation**: reentrancy warning on `executeByName()`, `PlanResult` JSDoc
102
- - **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`
103
- - **probe.ts**: `null` return for transient errors; bootstrap skips cache on `null`
104
- - **Execution-plugin**: `resetStepFlags`/`resetPlanState` helpers (dedup 3 inline reset blocks)
105
- - **Security-policies**: `comparePolicies` typed (`keyof SecurityConfig` replaces `as any`)
106
-
107
- ### Removed
108
- - **Browser**: dead `buildWaitScript` export (never imported)
109
-
110
- ## [0.57.1] - 2026-08-28
111
-
112
- ### Fixed
113
- - **Publish**: republish after version bump
114
-
115
- ## [0.57.0] - 2026-08-28
116
-
117
- ### Changed
118
- - **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.
119
- - **Updater**: `checkOnStart` and `autoInstall` disabled by default. Reduced `waitForIdle` timeout from 130s to 10s.
120
- - **Config**: `updater.checkOnStart` default changed from `true` to `false`
121
-
122
- ### Added
123
- - **MCP**: HTTP request timeouts (10s) on `connectSSE`, `listToolsHTTP`, `callToolHTTP`
124
- - **MCP**: `failedServers` tracking — servers that fail discovery are not retried
125
- - **MCP**: placeholder `connect` tool for not-yet-discovered servers (LLM can trigger lazy discovery)
126
- - **Reasoning**: persistent disk cache (`~/.mma/reasoning-cache.json`) with 24h TTL — avoids re-probing LLM on every restart
127
-
128
- ## [0.56.5] - 2026-08-27
129
-
130
- ### Fixed
131
- - **Hallucination**: `FactualCheck` now receives deleted files from `ConsistencyCheck` — no longer false-positives on files that were intentionally deleted in the same session
132
-
133
- ## [0.56.4] - 2026-08-27
134
-
135
- ### Fixed
136
- - **Tools**: `list_dir` now filters `.mma/`, `node_modules/`, `.git/`, `dist/`, `build/`, `coverage/` from directory listings (consistent with indexer)
137
- - **Hallucination**: `dotfileVariants` now tries dot-prefixing each directory component, not just basename (fixes false positive on `.mma/index-cache.json` `mma/index-cache.json`)
138
-
139
- ## [0.56.1] - 2026-08-27
140
-
141
- ### Added
142
- - **CLI**: `mma changelog` command show latest changelog entry or diff between versions (`--from <version>`)
143
- - **Updater**: show changelog after auto-update install (`updater.installed` message includes new version's changelog)
144
- - **Docs**: `CHANGELOG.md` included in npm package (visible via `npm info micro-models-agent`)
145
- - **Docs**: rule to maintain changelog in `AGENTS.md`
146
-
147
- ## [0.56.0] - 2026-08-27
148
-
149
- ### Added
150
- - **MoE**: live re-plan loop in `runWithMoE` — orchestrator re-plans on structural failures
151
- - **MoE**: scope expansion protocol (`scope_request`) for cross-expert file access
152
- - **MoE**: Esc/interrupt support in the MoE execution path
153
- - **MoE**: `input_from` cross-expert data flow for subtask dependencies
154
- - **LSP**: Angular language server support (`@angular/language-server` for `.html` in Angular workspaces)
155
- - **Tools**: syntax pre-validation and auto-fix for `write_file`/`edit_file`
156
-
157
- ### Fixed
158
- - **Security**: SSRF via IPv6-mapped IPv4 and raw numeric hostnames
159
- - **Security**: command-validator blacklist bypasses (shell expansions, encoded chars)
160
- - **Security**: audit webhook retry queue drained forever (infinite loop + duplicate notifications)
161
- - **Core**: dangling `tool_calls` on interrupt synthesized tool messages keep assistant/tool pairing
162
- - **Core**: live reasoning policy + `set_thinking` override integration
163
- - **Core**: deep-clone config defaults to prevent cross-session mutation
164
- - **Config**: preserve `provider.fallback` on hot-swap
165
- - **Tools**: path/scope escape holes in filesystem and read tools closed
166
- - **Tools**: clear timeout timer & abort listener after race settles; log discarded losers
167
- - **MCP**: stdio timer leaks + null deref after disconnect; added initialize handshake
168
- - **LSP**: spawn servers detached on POSIX so `killTree` reaches the whole chain
169
- - **Browser**: bridge leaked Chromium on SIGTERM and parent death
170
- - **UI**: diff LCS memory cap; one bad encrypted line no longer kills session history
171
- - **CLI**: `/config migrate` was unreachable
172
- - **MoE**: locale-independent artifact path + no retry on user abort
173
-
174
- ## [0.55.1] - 2026-08-25
175
-
176
- ### Fixed
177
- - **LLM**: NDJSON-tolerant stream parser for Ollama backends
178
- - **LLM**: mid-stream provider errors surfaced (Ollama generation failures)
179
- - **LLM**: `delta.reasoning` alias for thinking models
180
- - **LLM**: wire-level debug logging for diagnostics
181
-
182
- ## [0.55.0] - 2026-08-25
183
-
184
- ### Added
185
- - **Certification**: targeted re-run (`--scenarios <ids>`) with result merging
186
- - **Certification**: per-rep timeout (`--timeout <ms>` + per-scenario `timeoutMs`)
187
- - **Certification**: audit-gate bypass fix for `--exit-on-complete`
188
-
189
- ### Fixed
190
- - **Certification**: stale-label wording (removed impossible user instruction)
191
- - **Dependencies**: typescript pinned to ^5.9 (TS7 preview breaks `@types/node`)
192
-
193
- ## [0.54.0] - 2026-08-24
194
-
195
- ### Added
196
- - **Certification**: global manifest shipped with package updates (`~/.mma/certifications.json`)
197
- - **Certification**: bundled manifest + startup sync from package
198
-
199
- ### Fixed
200
- - **Certification**: marks only showed when running from repo root
201
-
202
- ## [0.53.0] - 2026-08-24
203
-
204
- ### Added
205
- - **Certification**: qwen3.5-9b certified 20/20
206
- - **Config**: `provider.maxCompletionTokens` option
207
- - **Certification**: label text in `mma model list` and REPL `/model`
208
-
209
- ### Fixed
210
- - **Certification**: reasoning-heavy models truncated tool_call arguments at default 4096 cap
211
- - **Certification**: scenario 3.5 prompt disambiguation
212
-
213
- ## [0.52.0] - 2026-08-23
214
-
215
- ### Added
216
- - **Execution**: `FS_MUTATING_TOOLS` — plan auto-advance after bash/download/subagent/mcp/pipeline/browser tools
217
- - **Config**: `provider.maxCompletionTokens` plumbing through ProviderManager agent
218
-
219
- ### Fixed
220
- - **Execution**: small models create files via bash instead of `write_file`, stalling plans
221
- - **Execution**: `maxCompletionTokens` was never read from config
222
-
223
- ## [0.51.0] - 2026-08-23
224
-
225
- ### Added
226
- - **Plugin**: `HostBridge` interface for bidirectional agent communication
227
- - **Plugin**: `onTurnEnd(ctx, TurnSummary)` hook dispatched once per completed run
228
- - **Plugin**: `web-ui` example plugin — browser-based chat with SSE streaming
229
- - **CLI**: REPL bridge wiring for web-ui submit/interrupt
230
-
231
- ### Fixed
232
- - **REPL**: `/config migrate` unreachable
233
-
234
- ## [0.50.3] - 2026-08-22
235
-
236
- ### Fixed
237
- - **UI**: REPL line editor scroll-proof rendering (absolute anchoring via DSR query)
238
-
239
- ## [0.50.2] - 2026-08-22
240
-
241
- ### Fixed
242
- - **LLM**: idle stream timeout increased 60s → 180s (LM Studio buffering)
243
- - **LLM**: stall diagnosis with dedicated message for SSE buffering
244
- - **LLM**: truncation no longer masquerades as empty response
245
- - **LLM**: recoverable LLM errors fed back into context instead of dying
246
- - **Execution**: bash flailing detector (≥4 failed bash attempts in last 6)
247
-
248
- ## [0.50.1] - 2026-08-21
249
-
250
- ### Fixed
251
- - **Security**: no longer silently overrides explicit user opt-out
252
- - **Lint**: skips missing lint binary (was appending error to every write)
253
- - **Stuck**: anti-spam for stuck-warnings (dedup via key, decay per-tool counters)
254
- - **Plan**: unified progress counting (done+skipped as settled)
255
- - **Plan**: bulk `steps[]` rewrite guarded on progressed plans
256
- - **Plan**: archived plans answer read-only
257
- - **Process**: usage hints for `process_kill`/`process_log` without id
258
-
259
- ## [0.50.0] - 2026-08-21
260
-
261
- ### Added
262
- - **Provider**: health probe (`probeProviders()` + `mma provider check`)
263
- - **Provider**: code-only capability routing (`ProviderManager.pickFor()`)
264
- - **Provider**: per-entry isolation + priority fallback order
265
- - **Pricing**: per-provider cost attribution + breakdown
266
-
267
- ### Fixed
268
- - **Provider**: transparent failover on 429/5xx/network errors
269
-
270
- ## [0.49.0] - 2026-08-20
271
-
272
- ### Fixed
273
- - **REPL**: stale-plan leaks plan state no longer persists across sessions
274
- - **REPL**: plan checklist prints only on plan/todo tool-end events
275
- - **Plan**: `PlanStore` is single source of truth for UI consumers
276
-
277
- ## [0.48.3] - 2026-08-20
278
-
279
- ### Fixed
280
- - **Hallucination**: dotfile false-positive (`.prettierrc.json` extracted as `prettierrc.json`)
281
-
282
- ## [0.48.2] - 2026-08-20
283
-
284
- ### Fixed
285
- - **REPL**: stale plan printed on first agent run of a session
286
-
287
- ## [0.47.0] - 2026-08-19
288
-
289
- ### Added
290
- - **Session**: startup diagnostics logging (environment, LSP probe, baseline typecheck)
291
- - **Session**: `logBaselineTypecheck()` for post-mortem visibility
292
-
293
- ## [0.46.1] - 2026-08-19
294
-
295
- ### Fixed
296
- - **LLM**: connection-break hardening (stream-level retry, no-data timeout, `[DONE]` tracking)
297
- - **LLM**: non-streaming timeout (was missing, could hang forever)
298
- - **Config**: `retry.maxStreamRetries`, `retry.noDataTimeoutMs` options
299
-
300
- ## [0.46.0] - 2026-08-19
301
-
302
- ### Added
303
- - **Provider**: multi-provider + hot-swap + per-message provenance
304
- - **Provider**: `ProviderManager` with entry-based config
305
- - **CLI**: `mma provider add/list/use`
306
- - **REPL**: `/provider list/use`
307
-
308
- ### Fixed
309
- - **Path**: `safeResolvePath` POSIX bug (absolute paths re-resolved against baseDir)
310
-
311
- ## [0.45.0] - 2026-08-18
312
-
313
- ### Added
314
- - **Provider**: provider module Phase 1 (registry, presets, `createProvider()`)
315
- - **Provider**: `openrouter` preset
316
- - **Setup**: wizard menu built from `BUILTIN_PROVIDERS`
317
-
318
- ## [0.44.0] - 2026-08-18
319
-
320
- ### Added
321
- - **Plugins**: folder plugins (subdirectory with entry file)
322
- - **Plugin**: `trace-server` split into folder plugin
323
-
324
- ### Fixed
325
- - **Plugin**: template-literal page inlining broke `\n` in JS strings
326
-
327
- ## [0.43.2] - 2026-08-17
328
-
329
- ### Fixed
330
- - **Execution**: plan done-gate on known compile failures (typecheck gate)
331
- - **Bootstrap**: live getters for `sessionId`/`sessionContext` after session switch
332
- - **Edit**: `edit_file` "String not found" hint to `read_file` first
333
-
334
- ## [0.43.1] - 2026-08-17
335
-
336
- ### Fixed
337
- - **Agent**: session-interrupt no longer renders tool results after "Session ended"
338
- - **Executor**: `onAfterTool` plugins skipped when signal is aborted
339
- - **Lint**: abortable syntax checks on Esc
340
-
341
- ## [0.43.0] - 2026-08-17
342
-
343
- ### Added
344
- - **Plan**: `plan delete <id>` + `plan purge` actions
345
- - **Plan**: `abort` honors `id` parameter
346
- - **Plan**: `replan` renumbers ids for kept steps
347
- - **Audit**: `resolveTestCommand` picks the project's real test runner
348
-
349
- ### Fixed
350
- - **Plan**: `switch` to already-active plan is a no-op
351
- - **Plan**: final audit runs for a completed plan
352
- - **Plan**: evidence-based plan nudge (replaces iteration counter)
353
- - **Plan**: `checkPlanAlignment` scans path arguments only
354
- - **Plan**: `isDepsStep` requires a package-manager verb
355
- - **Plan**: auto-advance resolves nested files
356
-
357
- ## [0.42.0] - 2026-08-16
358
-
359
- ### Added
360
- - **Execution**: automatic error web search (≥5 same-error repeats → web search → inject results)
361
- - **Config**: `errorWebSearch` section
362
-
363
- ### Fixed
364
- - **Execution**: `onAfterTool` double-counted typecheck + failure errors
365
-
366
- ## [0.41.1] - 2026-08-16
367
-
368
- ### Fixed
369
- - **LSP**: `typescript@5` pin + `--yes` for npx
370
- - **LSP**: sequential probing (waves) to avoid npx cache lock contention
371
- - **LSP**: stale config normalization
372
- - **LSP**: Windows process leak in `shutdown()`
373
- - **REPL**: non-blocking LSP banner
374
- - **Bootstrap**: lazy startup health check
375
-
376
- ## [0.41.0] - 2026-08-15
377
-
378
- ### Added
379
- - **REPL**: live plan checklist with progress bar
380
- - **UI**: tool-to-step binding (`← step N` suffix in tool headers)
381
- - **UI**: background command output preview
382
-
383
- ## [0.40.1] - 2026-08-15
384
-
385
- ### Fixed
386
- - **LSP**: broken package names (`vscode-html-languageserver` `vscode-langservers-extracted`)
387
-
388
- ## [0.40.0] - 2026-08-15
389
-
390
- ### Added
391
- - **Tools**: tool-set narrowing (on-demand enable via `enable_tools`)
392
- - **Config**: `tools.defaultTags` + `tools.enableOnDemand`
393
- - **Tools**: `alwaysOn` flag for structural tools
394
-
395
- ## [0.39.1] - 2026-08-14
396
-
397
- ### Fixed
398
- - **Plugins**: dedup by version, compatibility gate, source tracking
399
- - **CLI**: `mma plugins list` command
400
-
401
- ## [0.38.0] - 2026-08-14
402
-
403
- ### Added
404
- - **LSP**: `lsp_check` tool for on-demand diagnostics
405
- - **Plan**: `plan create` guard (blocks when active plan has progress)
406
-
407
- ### Fixed
408
- - **Context**: compaction summary carries plan + read state
409
- - **Browser**: bridge path resolution in bundled dist
410
-
411
- ## [0.37.0] - 2026-08-13
412
-
413
- ### Added
414
- - **Plugins**: folder plugin support in `PluginLoader`
415
-
416
- ### Fixed
417
- - **Plugin**: template-literal page inlining broke `\n` in JS
418
-
419
- ## [0.36.3] - 2026-08-13
420
-
421
- ### Fixed
422
- - **UI**: REPL paste fix (batch single-render, CRLF collapse)
423
-
424
- ## [0.36.2] - 2026-08-13
425
-
426
- ### Fixed
427
- - **Updater**: silent logger, one-shot `process.exit()` killed background install, semver-aware check
428
-
429
- ## [0.36.1] - 2026-08-13
430
-
431
- ### Fixed
432
- - **Audit**: nested-file resolution, non-zero test run blocks
433
- - **Browser**: bridge diagnostics + one-shot restart
434
- - **LSP**: per-server disable + initialize retry + CSS timeout
435
- - **Bash**: npm exec hint
436
-
437
- ## [0.36.0] - 2026-08-12
438
-
439
- ### Added
440
- - **Plan**: model-declared `kind: "create"|"delete"` for steps
441
- - **Execution**: `FS_MUTATING_TOOLS` for plan auto-advance
442
- - **Config**: `provider.maxCompletionTokens` option
443
-
444
- ### Fixed
445
- - **Context**: compaction preserves session `mission`
446
- - **Context**: deleted files leave compaction `[Files:]` list
447
- - **Audit**: final audit runs real `tsc --noEmit --skipLibCheck`
448
- - **Bash**: repeated forbidden Windows commands hard-stopped after 2 failures
449
-
450
- ## [0.35.5] - 2026-08-12
451
-
452
- ### Fixed
453
- - **Execution**: plan-alignment phantom paths (domains/extensions treated as files)
454
- - **Execution**: hint/recovery dedup in `StuckDetector`
455
-
456
- ## [0.35.3] - 2026-08-11
457
-
458
- ### Fixed
459
- - **LSP**: workspace root resolved from edited file's project
460
- - **Audit**: skipped steps treated as terminal
461
- - **Bash**: Windows hint keys on original command word
462
- - **Tools**: boundedOutput tools never budget-truncated
463
-
464
- ## [0.35.0] - 2026-08-11
465
-
466
- ### Added
467
- - **Tools**: `download_file` tool for binary file downloads
468
-
469
- ## [0.34.0] - 2026-08-10
470
-
471
- ### Added
472
- - **Indexer**: project profile (`[Stack: ...]` summary from manifest)
473
- - **Indexer**: dynamic map refresh inside sessions
474
-
475
- ## [0.33.3] - 2026-08-10
476
-
477
- ### Fixed
478
- - **Audit**: nested-file resolution (basename + path-suffix match)
479
- - **Plan**: `plan show` honors `id` parameter
480
- - **Context**: compaction interval reset per user turn
481
- - **Context**: `extractFacts` captures `edit_file` paths + Windows drive-letter paths
482
- - **Execution**: stuck detector read-only loop detection
483
- - **Read**: default limit 15 → 300 lines
484
- - **LSP**: `spawn` on Windows (`.cmd` shim resolution)
485
- - **Todo**: `todo add` tracks subtasks, `todo done` marks individual sub-task
486
- - **Memory**: learns repeated per-tool failures (≥3×)
487
- - **Context**: compaction preserves user's task
488
-
489
- ## [0.33.2] - 2026-08-09
490
-
491
- ### Fixed
492
- - **UI**: REPL conversation layout (user/agent message dividers)
493
- - **Tools**: `isFilePathLike` uses allow-list of file extensions
494
-
495
- ## [0.33.1] - 2026-08-09
496
-
497
- ### Fixed
498
- - **UI**: REPL line editor redraw fix (no duplicated multi-line input)
499
- - **Tools**: `web_fetch`/`web_browse` description clarifications
500
-
501
- ## [0.33.0] - 2026-08-09
502
-
503
- ### Added
504
- - **RLM**: pass-by-reference sub-agent results (`ArtifactStore`)
505
- - **RLM**: chunked parallel queries (`chunk_query` tool)
506
- - **Config**: `subagent.resultMode`, `maxSummaryChars`, `artifactsDir`, `stableSystemPrompt`
507
-
508
- ## [0.32.0] - 2026-08-08
509
-
510
- ### Added
511
- - **Browser**: driver abstraction (`PlaywrightDriver` + `BridgeDriver`)
512
- - **Browser**: Node bridge for Bun compatibility
513
- - **Config**: `browser.maxConsoleLineChars`
514
-
515
- ## [0.31.0] - 2026-08-08
516
-
517
- ### Added
518
- - **Security**: session file encryption (AES-256-GCM)
519
- - **Security**: audit notifications (file + webhook)
520
- - **Security**: security policies (strict/balanced/permissive)
521
- - **CLI**: `mma security` commands
522
-
523
- ## [0.30.0] - 2026-08-07
524
-
525
- ### Added
526
- - **Execution**: final audit gate (runs `bun test` for verification steps)
527
- - **Execution**: `detectTestResults()` auto-verification in bash
528
-
529
- ### Fixed
530
- - **Execution**: empty-CLI entry-point hint
531
- - **Bash**: Windows anti-patterns documentation
532
-
533
- ## [0.29.0] - 2026-08-07
534
-
535
- ### Added
536
- - **Bash**: smart UTF-8/OEM line decoding (fixes Cyrillic on Windows)
537
- - **Bash**: behavior-based background detection
538
- - **Bash**: stuck-detector bash awareness
539
-
540
- ## [0.28.0] - 2026-08-06
541
-
542
- ### Fixed
543
- - **Agent**: double-Esc interrupt fix (Bun readline keypress collapsing)
544
- - **Agent**: abortable in-flight LLM requests on interrupt
545
- - **UI**: clipboard paste hint
546
-
547
- ## [0.27.0] - 2026-08-06
548
-
549
- ### Fixed
550
- - **Security**: Windows hardening
551
- - **Hallucination**: fixes
552
-
553
- ## [0.26.0] - 2026-08-05
554
-
555
- ### Added
556
- - **UI**: opencode-style inline tool headers (`ui.toolStyle`)
557
- - **UI**: model commentary next to tool calls (`ui.toolComments`)
558
- - **UI**: diffs without background color
559
-
560
- ## [0.25.0] - 2026-08-05
561
-
562
- ### Added
563
- - **LSP**: LSP module (typescript, CSS, HTML, JSON, Python, Rust, Go)
564
- - **Execution**: audit gate language-agnostic
565
- - **Bash**: Windows command hints
566
-
567
- ## [0.24.0] - 2026-08-04
568
-
569
- ### Added
570
- - **Context**: quality formula upgrade (token load + compaction loss + error density + freshness)
571
- - **Read**: display mode (show only header in REPL, full content to LLM)
572
-
573
- ## [0.23.0] - 2026-08-04
574
-
575
- ### Added
576
- - **Certification**: model certification module (`mma model certify`)
577
- - **CLI**: cert checkmarks in model lists
578
-
579
- ## [0.22.0] - 2026-08-03
580
-
581
- ### Added
582
- - **Security**: `enabled` flag (disabled by default)
583
- - **CLI**: init/first-run apply wizard security answers
584
- - **Prompt**: system prompt & recovery messages cleanup
1
+ # Changelog
2
+
3
+ All notable changes to Micro Models Agent (MMA) will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this project adheres to [Semantic Versioning](https://semver.org/).
6
+
7
+ ## [0.61.1] - 2026-09-16
8
+
9
+ ### Fixed
10
+ - **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.
11
+ - **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.
12
+
13
+ ## [0.61.0] - 2026-09-15
14
+
15
+ ### Added
16
+ - **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.
17
+
18
+ ### Changed
19
+ - **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>`).
20
+
21
+ ### Fixed
22
+ - **`mma context` ignored `MMA_CONFIG_DIR`**: it saved to a hardcoded `~/.mma/config.json`; it now writes to the config dir resolved by bootstrap.
23
+
24
+ ## [0.60.1] - 2026-09-15
25
+
26
+ ### Fixed
27
+ - **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.
28
+ - **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.
29
+
30
+ ## [0.60.0] - 2026-09-15
31
+
32
+ ### Added
33
+ - **`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".
34
+ - **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.
35
+ - **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`).
36
+ - **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.
37
+
38
+ ### Fixed
39
+ - **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.
40
+ - **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.
41
+ - **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.
42
+ - **Indexer swallowed virtualenvs and other vendor trees**: `IGNORE_DIRS` was Node-centric (`node_modules`, `dist`, `build`, `.mma`, `coverage`), so a Python `venv/` (thousands of dependency files) was indexed and could crowd the map out. The list now covers Python (`venv`, `.venv`, `env`, `virtualenv`, `__pycache__`, `.pytest_cache`, `.mypy_cache`, `.ruff_cache`, `.tox`, `site-packages`), Rust (`target`), Go/PHP/Ruby (`vendor`, `.bundle`), JVM (`.gradle`, `out`), .NET (`obj`), Apple (`pods`, `deriveddata`), VCS/IDE (`.hg`, `.svn`, `.idea`, `.vscode`) plus the original Node entries. Matching is case-insensitive and the watcher now matches whole path **segments** instead of substrings, so short names (`env`, `out`, `obj`) cannot black out `environment.ts` or `about/`.
43
+
44
+ ## [0.59.0] - 2026-09-05
45
+
46
+ ### Added
47
+ - **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
48
+ - **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
49
+ - **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
50
+ - **Config**: `instructions.summarize` (default `true`) to disable LLM summarization (truncation fallback only)
51
+
52
+ ## [0.58.2] - 2026-09-01
53
+
54
+ ### Fixed
55
+ - **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.
56
+
57
+ ## [0.58.1] - 2026-09-01
58
+
59
+ ### Fixed
60
+ - **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).
61
+
62
+ ## [0.58.0] - 2026-08-31
63
+
64
+ ### Added
65
+ - **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`)
66
+ - **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)
67
+ - **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
68
+ - **MoE selective re-plan**: `executePlan(plan, {skipIds, carriedResults})` already-succeeded subtasks are carried over across re-plan cycles, only failed/new subtasks re-execute
69
+ - **MoE observability**: `moe_plan` / `moe_subtask` / `moe_replan` / `moe_verify` events written to `session.jsonl` (visible in `mma session show`); token usage aggregated per `expert_tag` (`MoEExecutor.getUsageByTag`); sub-agents receive the real session id instead of the hardcoded `"moe"`
70
+ - **MoE cert scenarios**: `5.2-moe-parallel-waves` and `5.3-moe-read-after-write` (tag `moe`, timeoutMs 600_000)
71
+ - **ToolResult.usage**: sub-agent token usage propagated to the MoE executor for cost attribution
72
+
73
+ ### Changed
74
+ - **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`
75
+
76
+ ### Fixed
77
+ - **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).
78
+ - **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.
79
+ - **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).
80
+ - **Repeated tool calls**: identical `(tool, args)` repeat now injects a nudge into context in ALL modes — previously the nudge was gated behind `--exit-on-complete`, so interactive runs silently burned iterations re-running the same command (observed: duplicate `node sum.js` verification back-to-back).
81
+ - **Perfectionism cycle**: repeated mutations of the SAME target (same file via `edit_file`/`write_file`, same bash command, same `plan`/`todo` action) with varying arguments now inject a finalize-nudge after 5 occurrences — the consecutive-duplicate guard cannot see this pattern (args differ each time; observed: 20+ polish iterations after the task was already complete, then 10+ bookkeeping churn iterations after an audit rejection). The nudge lands AFTER tool results, so `assistant(tool_calls)tool(results) user(nudge)` pairing stays valid.
82
+ - **Audit gate friction (evidence-based auto-close)**: pending plan steps whose every file-like token resolves to an existing file are auto-closed by the final audit with a note — small models routinely finish the work but forget `plan update` bookkeeping, and the gate then rejected correct answers burning all retry budget. Steps without file tokens or with missing files stay pending (honest).
83
+ - **Audit rejection guidance**: the audit gate's `<system-summary>` now names the resolution paths (mark done / skipped / re-plan) in en+ru instead of a bare "continue working" — model plan-drift after a rejection (wrong file names, changed approach) is common for 9B and the old message did not point at the fix.
84
+ - **LSP false positives without type env**: `lsp_check` suppresses module-resolution diagnostics when the project root has no `tsconfig.json`/`jsconfig.json`/`node_modules` and reports an inconclusive note instead phantom `Cannot find module 'fs'` / `Cannot find name '__dirname'` errors made the model abandon a working `.ts` approach for `.js` and spiral into plan drift.
85
+ - **Windows Unix-command hints**: `bash` hint list and the module-side forbidden set now cover `sed`/`awk`/`uniq`/`xargs`/`cut`/`tr`/`basename`/`dirname`/`export`/`source`/`sleep`/`env` (both lists kept consistent) — the 9B model keeps reaching for Unix tools in cmd.exe.
86
+ - **Tool visibility narrowing**: `chunk_query`, `download_file`, `mcp_call`, `pipeline_run` no longer visible by default — they moved behind `enable_tools` (`research`/`shell` tags); the default visible set drops from 23 to 19 schemas, cutting tool tokens on every turn.
87
+ - **Tests**: replaced process-global `vi.mock` with DI seams (`AgentDeps.runWithMoEOverride`, `ToolContext.agentFactory`) — Bun module mocks leak across test files in the same worker; full suite is now green by default (1803 pass / 0 fail).
88
+ - **Docs**: AGENTS.md / testing.md — warn that `mma` resolves the globally installed package (stale `dist/`) when run outside the repo root, silently ignoring `src/` changes; always run from the repo root with `-d <sandbox>` and verify the version in the `Environment:` line.
89
+
90
+ ## [0.57.2] - 2026-08-30
91
+
92
+ ### Changed
93
+ - **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.
94
+ - **Provenance**: provider entry resolution uses active entry label, not bare `provider.type`
95
+ - **Reasoning signals**: `consecutiveToolSuccesses` and `isRepetitive` now feed real values to the reasoning policy (were hardcoded)
96
+ - **Token estimation**: tool-def token estimate in agent loop uses `estimateTokens()` instead of flat `/4`
97
+ - **Agent split**: `agent.ts` 1550→950 lines; 10 extracted modules (`loop-state`, `compaction`, `tool-batch`, `hallucination-gate`, `audit-gate`, `reasoning-resolver`, `token-tracker`, `context-renderer`, `tool-output`, `constants`)
98
+ - **Plan-tool**: `plan-tool.ts` 741→232 lines; per-action handlers in `plan-actions.ts`
99
+ - **CLI**: `createProgram` 513→thin orchestrator; `registerMmaCommands` 470→8 lines (5 per-domain registers)
100
+ - **Bash handler**: `bash.ts` 236→~100 lines (`resolveBashSecurityConfig`, `decorateCommandOutput`)
101
+ - **Orchestrator**: reuse `parseChunks` instead of hand-rolled `any[]` aggregation; `createPlan` uses own `parseJSON`; constructor deduplicated via `createProviderInstance`
102
+ - **Shared utils**: `src/utils/` with `errMsg()`, `sleep()`, `truncate()`, `backoffDelay()`
103
+ - **errMsg**: replaces 23 occurrences of `e instanceof Error ? e.message : String(e)` across 12 files
104
+
105
+ ### Fixed
106
+ - **chunk_query**: one failing chunk no longer kills the entire query; per-chunk `catch` → `[FAILED]`
107
+ - **chunk_query**: synthesis prompt capped at 20K chars with `[TRUNCATED]` marker
108
+ - **chunk_query**: `AbortSignal` propagated to `chatText` for cancellation support
109
+ - **Executor**: `failFast` cleanup guard prevents nested scope clobbering
110
+ - **probe.ts**: transient errors (network/auth) no longer cached as "reasoning not supported" for 24h; returns `null` → caller skips cache
111
+ - **LSP**: startup timeout unified on `DEFAULT_TIMEOUT` (15000) instead of conflicting hardcoded 10000
112
+ - **Browser**: `BridgeResponse.data` typed (was `any`)
113
+ - **Agent**: `Agent.runTool()` public API replaces `(ctx.agent as any).deps` reach-in; `/reload` no longer mutates readonly context
114
+ - **LSP /lsp check**: fixed latent bug where `.execute()` was called with `.executeByName` signature
115
+
116
+ ### Added
117
+ - **Plan Reminder**: static `[Plan Reminder]` block in system prompt (never mutates)
118
+ - **Documentation**: reentrancy warning on `executeByName()`, `PlanResult` JSDoc
119
+ - **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`
120
+ - **probe.ts**: `null` return for transient errors; bootstrap skips cache on `null`
121
+ - **Execution-plugin**: `resetStepFlags`/`resetPlanState` helpers (dedup 3 inline reset blocks)
122
+ - **Security-policies**: `comparePolicies` typed (`keyof SecurityConfig` replaces `as any`)
123
+
124
+ ### Removed
125
+ - **Browser**: dead `buildWaitScript` export (never imported)
126
+
127
+ ## [0.57.1] - 2026-08-28
128
+
129
+ ### Fixed
130
+ - **Publish**: republish after version bump
131
+
132
+ ## [0.57.0] - 2026-08-28
133
+
134
+ ### Changed
135
+ - **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.
136
+ - **Updater**: `checkOnStart` and `autoInstall` disabled by default. Reduced `waitForIdle` timeout from 130s to 10s.
137
+ - **Config**: `updater.checkOnStart` default changed from `true` to `false`
138
+
139
+ ### Added
140
+ - **MCP**: HTTP request timeouts (10s) on `connectSSE`, `listToolsHTTP`, `callToolHTTP`
141
+ - **MCP**: `failedServers` tracking — servers that fail discovery are not retried
142
+ - **MCP**: placeholder `connect` tool for not-yet-discovered servers (LLM can trigger lazy discovery)
143
+ - **Reasoning**: persistent disk cache (`~/.mma/reasoning-cache.json`) with 24h TTL avoids re-probing LLM on every restart
144
+
145
+ ## [0.56.5] - 2026-08-27
146
+
147
+ ### Fixed
148
+ - **Hallucination**: `FactualCheck` now receives deleted files from `ConsistencyCheck` — no longer false-positives on files that were intentionally deleted in the same session
149
+
150
+ ## [0.56.4] - 2026-08-27
151
+
152
+ ### Fixed
153
+ - **Tools**: `list_dir` now filters `.mma/`, `node_modules/`, `.git/`, `dist/`, `build/`, `coverage/` from directory listings (consistent with indexer)
154
+ - **Hallucination**: `dotfileVariants` now tries dot-prefixing each directory component, not just basename (fixes false positive on `.mma/index-cache.json` `mma/index-cache.json`)
155
+
156
+ ## [0.56.1] - 2026-08-27
157
+
158
+ ### Added
159
+ - **CLI**: `mma changelog` command show latest changelog entry or diff between versions (`--from <version>`)
160
+ - **Updater**: show changelog after auto-update install (`updater.installed` message includes new version's changelog)
161
+ - **Docs**: `CHANGELOG.md` included in npm package (visible via `npm info micro-models-agent`)
162
+ - **Docs**: rule to maintain changelog in `AGENTS.md`
163
+
164
+ ## [0.56.0] - 2026-08-27
165
+
166
+ ### Added
167
+ - **MoE**: live re-plan loop in `runWithMoE` orchestrator re-plans on structural failures
168
+ - **MoE**: scope expansion protocol (`scope_request`) for cross-expert file access
169
+ - **MoE**: Esc/interrupt support in the MoE execution path
170
+ - **MoE**: `input_from` cross-expert data flow for subtask dependencies
171
+ - **LSP**: Angular language server support (`@angular/language-server` for `.html` in Angular workspaces)
172
+ - **Tools**: syntax pre-validation and auto-fix for `write_file`/`edit_file`
173
+
174
+ ### Fixed
175
+ - **Security**: SSRF via IPv6-mapped IPv4 and raw numeric hostnames
176
+ - **Security**: command-validator blacklist bypasses (shell expansions, encoded chars)
177
+ - **Security**: audit webhook retry queue drained forever (infinite loop + duplicate notifications)
178
+ - **Core**: dangling `tool_calls` on interrupt synthesized tool messages keep assistant/tool pairing
179
+ - **Core**: live reasoning policy + `set_thinking` override integration
180
+ - **Core**: deep-clone config defaults to prevent cross-session mutation
181
+ - **Config**: preserve `provider.fallback` on hot-swap
182
+ - **Tools**: path/scope escape holes in filesystem and read tools closed
183
+ - **Tools**: clear timeout timer & abort listener after race settles; log discarded losers
184
+ - **MCP**: stdio timer leaks + null deref after disconnect; added initialize handshake
185
+ - **LSP**: spawn servers detached on POSIX so `killTree` reaches the whole chain
186
+ - **Browser**: bridge leaked Chromium on SIGTERM and parent death
187
+ - **UI**: diff LCS memory cap; one bad encrypted line no longer kills session history
188
+ - **CLI**: `/config migrate` was unreachable
189
+ - **MoE**: locale-independent artifact path + no retry on user abort
190
+
191
+ ## [0.55.1] - 2026-08-25
192
+
193
+ ### Fixed
194
+ - **LLM**: NDJSON-tolerant stream parser for Ollama backends
195
+ - **LLM**: mid-stream provider errors surfaced (Ollama generation failures)
196
+ - **LLM**: `delta.reasoning` alias for thinking models
197
+ - **LLM**: wire-level debug logging for diagnostics
198
+
199
+ ## [0.55.0] - 2026-08-25
200
+
201
+ ### Added
202
+ - **Certification**: targeted re-run (`--scenarios <ids>`) with result merging
203
+ - **Certification**: per-rep timeout (`--timeout <ms>` + per-scenario `timeoutMs`)
204
+ - **Certification**: audit-gate bypass fix for `--exit-on-complete`
205
+
206
+ ### Fixed
207
+ - **Certification**: stale-label wording (removed impossible user instruction)
208
+ - **Dependencies**: typescript pinned to ^5.9 (TS7 preview breaks `@types/node`)
209
+
210
+ ## [0.54.0] - 2026-08-24
211
+
212
+ ### Added
213
+ - **Certification**: global manifest shipped with package updates (`~/.mma/certifications.json`)
214
+ - **Certification**: bundled manifest + startup sync from package
215
+
216
+ ### Fixed
217
+ - **Certification**: marks only showed when running from repo root
218
+
219
+ ## [0.53.0] - 2026-08-24
220
+
221
+ ### Added
222
+ - **Certification**: qwen3.5-9b certified 20/20
223
+ - **Config**: `provider.maxCompletionTokens` option
224
+ - **Certification**: label text in `mma model list` and REPL `/model`
225
+
226
+ ### Fixed
227
+ - **Certification**: reasoning-heavy models truncated tool_call arguments at default 4096 cap
228
+ - **Certification**: scenario 3.5 prompt disambiguation
229
+
230
+ ## [0.52.0] - 2026-08-23
231
+
232
+ ### Added
233
+ - **Execution**: `FS_MUTATING_TOOLS` — plan auto-advance after bash/download/subagent/mcp/pipeline/browser tools
234
+ - **Config**: `provider.maxCompletionTokens` plumbing through ProviderManager → agent
235
+
236
+ ### Fixed
237
+ - **Execution**: small models create files via bash instead of `write_file`, stalling plans
238
+ - **Execution**: `maxCompletionTokens` was never read from config
239
+
240
+ ## [0.51.0] - 2026-08-23
241
+
242
+ ### Added
243
+ - **Plugin**: `HostBridge` interface for bidirectional agent communication
244
+ - **Plugin**: `onTurnEnd(ctx, TurnSummary)` hook dispatched once per completed run
245
+ - **Plugin**: `web-ui` example plugin browser-based chat with SSE streaming
246
+ - **CLI**: REPL bridge wiring for web-ui submit/interrupt
247
+
248
+ ### Fixed
249
+ - **REPL**: `/config migrate` unreachable
250
+
251
+ ## [0.50.3] - 2026-08-22
252
+
253
+ ### Fixed
254
+ - **UI**: REPL line editor scroll-proof rendering (absolute anchoring via DSR query)
255
+
256
+ ## [0.50.2] - 2026-08-22
257
+
258
+ ### Fixed
259
+ - **LLM**: idle stream timeout increased 60s → 180s (LM Studio buffering)
260
+ - **LLM**: stall diagnosis with dedicated message for SSE buffering
261
+ - **LLM**: truncation no longer masquerades as empty response
262
+ - **LLM**: recoverable LLM errors fed back into context instead of dying
263
+ - **Execution**: bash flailing detector (≥4 failed bash attempts in last 6)
264
+
265
+ ## [0.50.1] - 2026-08-21
266
+
267
+ ### Fixed
268
+ - **Security**: no longer silently overrides explicit user opt-out
269
+ - **Lint**: skips missing lint binary (was appending error to every write)
270
+ - **Stuck**: anti-spam for stuck-warnings (dedup via key, decay per-tool counters)
271
+ - **Plan**: unified progress counting (done+skipped as settled)
272
+ - **Plan**: bulk `steps[]` rewrite guarded on progressed plans
273
+ - **Plan**: archived plans answer read-only
274
+ - **Process**: usage hints for `process_kill`/`process_log` without id
275
+
276
+ ## [0.50.0] - 2026-08-21
277
+
278
+ ### Added
279
+ - **Provider**: health probe (`probeProviders()` + `mma provider check`)
280
+ - **Provider**: code-only capability routing (`ProviderManager.pickFor()`)
281
+ - **Provider**: per-entry isolation + priority fallback order
282
+ - **Pricing**: per-provider cost attribution + breakdown
283
+
284
+ ### Fixed
285
+ - **Provider**: transparent failover on 429/5xx/network errors
286
+
287
+ ## [0.49.0] - 2026-08-20
288
+
289
+ ### Fixed
290
+ - **REPL**: stale-plan leaks plan state no longer persists across sessions
291
+ - **REPL**: plan checklist prints only on plan/todo tool-end events
292
+ - **Plan**: `PlanStore` is single source of truth for UI consumers
293
+
294
+ ## [0.48.3] - 2026-08-20
295
+
296
+ ### Fixed
297
+ - **Hallucination**: dotfile false-positive (`.prettierrc.json` extracted as `prettierrc.json`)
298
+
299
+ ## [0.48.2] - 2026-08-20
300
+
301
+ ### Fixed
302
+ - **REPL**: stale plan printed on first agent run of a session
303
+
304
+ ## [0.47.0] - 2026-08-19
305
+
306
+ ### Added
307
+ - **Session**: startup diagnostics logging (environment, LSP probe, baseline typecheck)
308
+ - **Session**: `logBaselineTypecheck()` for post-mortem visibility
309
+
310
+ ## [0.46.1] - 2026-08-19
311
+
312
+ ### Fixed
313
+ - **LLM**: connection-break hardening (stream-level retry, no-data timeout, `[DONE]` tracking)
314
+ - **LLM**: non-streaming timeout (was missing, could hang forever)
315
+ - **Config**: `retry.maxStreamRetries`, `retry.noDataTimeoutMs` options
316
+
317
+ ## [0.46.0] - 2026-08-19
318
+
319
+ ### Added
320
+ - **Provider**: multi-provider + hot-swap + per-message provenance
321
+ - **Provider**: `ProviderManager` with entry-based config
322
+ - **CLI**: `mma provider add/list/use`
323
+ - **REPL**: `/provider list/use`
324
+
325
+ ### Fixed
326
+ - **Path**: `safeResolvePath` POSIX bug (absolute paths re-resolved against baseDir)
327
+
328
+ ## [0.45.0] - 2026-08-18
329
+
330
+ ### Added
331
+ - **Provider**: provider module Phase 1 (registry, presets, `createProvider()`)
332
+ - **Provider**: `openrouter` preset
333
+ - **Setup**: wizard menu built from `BUILTIN_PROVIDERS`
334
+
335
+ ## [0.44.0] - 2026-08-18
336
+
337
+ ### Added
338
+ - **Plugins**: folder plugins (subdirectory with entry file)
339
+ - **Plugin**: `trace-server` split into folder plugin
340
+
341
+ ### Fixed
342
+ - **Plugin**: template-literal page inlining broke `\n` in JS strings
343
+
344
+ ## [0.43.2] - 2026-08-17
345
+
346
+ ### Fixed
347
+ - **Execution**: plan done-gate on known compile failures (typecheck gate)
348
+ - **Bootstrap**: live getters for `sessionId`/`sessionContext` after session switch
349
+ - **Edit**: `edit_file` "String not found" hint to `read_file` first
350
+
351
+ ## [0.43.1] - 2026-08-17
352
+
353
+ ### Fixed
354
+ - **Agent**: session-interrupt no longer renders tool results after "Session ended"
355
+ - **Executor**: `onAfterTool` plugins skipped when signal is aborted
356
+ - **Lint**: abortable syntax checks on Esc
357
+
358
+ ## [0.43.0] - 2026-08-17
359
+
360
+ ### Added
361
+ - **Plan**: `plan delete <id>` + `plan purge` actions
362
+ - **Plan**: `abort` honors `id` parameter
363
+ - **Plan**: `replan` renumbers ids for kept steps
364
+ - **Audit**: `resolveTestCommand` picks the project's real test runner
365
+
366
+ ### Fixed
367
+ - **Plan**: `switch` to already-active plan is a no-op
368
+ - **Plan**: final audit runs for a completed plan
369
+ - **Plan**: evidence-based plan nudge (replaces iteration counter)
370
+ - **Plan**: `checkPlanAlignment` scans path arguments only
371
+ - **Plan**: `isDepsStep` requires a package-manager verb
372
+ - **Plan**: auto-advance resolves nested files
373
+
374
+ ## [0.42.0] - 2026-08-16
375
+
376
+ ### Added
377
+ - **Execution**: automatic error web search (≥5 same-error repeats → web search → inject results)
378
+ - **Config**: `errorWebSearch` section
379
+
380
+ ### Fixed
381
+ - **Execution**: `onAfterTool` double-counted typecheck + failure errors
382
+
383
+ ## [0.41.1] - 2026-08-16
384
+
385
+ ### Fixed
386
+ - **LSP**: `typescript@5` pin + `--yes` for npx
387
+ - **LSP**: sequential probing (waves) to avoid npx cache lock contention
388
+ - **LSP**: stale config normalization
389
+ - **LSP**: Windows process leak in `shutdown()`
390
+ - **REPL**: non-blocking LSP banner
391
+ - **Bootstrap**: lazy startup health check
392
+
393
+ ## [0.41.0] - 2026-08-15
394
+
395
+ ### Added
396
+ - **REPL**: live plan checklist with progress bar
397
+ - **UI**: tool-to-step binding (`← step N` suffix in tool headers)
398
+ - **UI**: background command output preview
399
+
400
+ ## [0.40.1] - 2026-08-15
401
+
402
+ ### Fixed
403
+ - **LSP**: broken package names (`vscode-html-languageserver` → `vscode-langservers-extracted`)
404
+
405
+ ## [0.40.0] - 2026-08-15
406
+
407
+ ### Added
408
+ - **Tools**: tool-set narrowing (on-demand enable via `enable_tools`)
409
+ - **Config**: `tools.defaultTags` + `tools.enableOnDemand`
410
+ - **Tools**: `alwaysOn` flag for structural tools
411
+
412
+ ## [0.39.1] - 2026-08-14
413
+
414
+ ### Fixed
415
+ - **Plugins**: dedup by version, compatibility gate, source tracking
416
+ - **CLI**: `mma plugins list` command
417
+
418
+ ## [0.38.0] - 2026-08-14
419
+
420
+ ### Added
421
+ - **LSP**: `lsp_check` tool for on-demand diagnostics
422
+ - **Plan**: `plan create` guard (blocks when active plan has progress)
423
+
424
+ ### Fixed
425
+ - **Context**: compaction summary carries plan + read state
426
+ - **Browser**: bridge path resolution in bundled dist
427
+
428
+ ## [0.37.0] - 2026-08-13
429
+
430
+ ### Added
431
+ - **Plugins**: folder plugin support in `PluginLoader`
432
+
433
+ ### Fixed
434
+ - **Plugin**: template-literal page inlining broke `\n` in JS
435
+
436
+ ## [0.36.3] - 2026-08-13
437
+
438
+ ### Fixed
439
+ - **UI**: REPL paste fix (batch single-render, CRLF collapse)
440
+
441
+ ## [0.36.2] - 2026-08-13
442
+
443
+ ### Fixed
444
+ - **Updater**: silent logger, one-shot `process.exit()` killed background install, semver-aware check
445
+
446
+ ## [0.36.1] - 2026-08-13
447
+
448
+ ### Fixed
449
+ - **Audit**: nested-file resolution, non-zero test run blocks
450
+ - **Browser**: bridge diagnostics + one-shot restart
451
+ - **LSP**: per-server disable + initialize retry + CSS timeout
452
+ - **Bash**: npm exec hint
453
+
454
+ ## [0.36.0] - 2026-08-12
455
+
456
+ ### Added
457
+ - **Plan**: model-declared `kind: "create"|"delete"` for steps
458
+ - **Execution**: `FS_MUTATING_TOOLS` for plan auto-advance
459
+ - **Config**: `provider.maxCompletionTokens` option
460
+
461
+ ### Fixed
462
+ - **Context**: compaction preserves session `mission`
463
+ - **Context**: deleted files leave compaction `[Files:]` list
464
+ - **Audit**: final audit runs real `tsc --noEmit --skipLibCheck`
465
+ - **Bash**: repeated forbidden Windows commands hard-stopped after 2 failures
466
+
467
+ ## [0.35.5] - 2026-08-12
468
+
469
+ ### Fixed
470
+ - **Execution**: plan-alignment phantom paths (domains/extensions treated as files)
471
+ - **Execution**: hint/recovery dedup in `StuckDetector`
472
+
473
+ ## [0.35.3] - 2026-08-11
474
+
475
+ ### Fixed
476
+ - **LSP**: workspace root resolved from edited file's project
477
+ - **Audit**: skipped steps treated as terminal
478
+ - **Bash**: Windows hint keys on original command word
479
+ - **Tools**: boundedOutput tools never budget-truncated
480
+
481
+ ## [0.35.0] - 2026-08-11
482
+
483
+ ### Added
484
+ - **Tools**: `download_file` tool for binary file downloads
485
+
486
+ ## [0.34.0] - 2026-08-10
487
+
488
+ ### Added
489
+ - **Indexer**: project profile (`[Stack: ...]` summary from manifest)
490
+ - **Indexer**: dynamic map refresh inside sessions
491
+
492
+ ## [0.33.3] - 2026-08-10
493
+
494
+ ### Fixed
495
+ - **Audit**: nested-file resolution (basename + path-suffix match)
496
+ - **Plan**: `plan show` honors `id` parameter
497
+ - **Context**: compaction interval reset per user turn
498
+ - **Context**: `extractFacts` captures `edit_file` paths + Windows drive-letter paths
499
+ - **Execution**: stuck detector read-only loop detection
500
+ - **Read**: default limit 15 → 300 lines
501
+ - **LSP**: `spawn` on Windows (`.cmd` shim resolution)
502
+ - **Todo**: `todo add` tracks subtasks, `todo done` marks individual sub-task
503
+ - **Memory**: learns repeated per-tool failures (≥3×)
504
+ - **Context**: compaction preserves user's task
505
+
506
+ ## [0.33.2] - 2026-08-09
507
+
508
+ ### Fixed
509
+ - **UI**: REPL conversation layout (user/agent message dividers)
510
+ - **Tools**: `isFilePathLike` uses allow-list of file extensions
511
+
512
+ ## [0.33.1] - 2026-08-09
513
+
514
+ ### Fixed
515
+ - **UI**: REPL line editor redraw fix (no duplicated multi-line input)
516
+ - **Tools**: `web_fetch`/`web_browse` description clarifications
517
+
518
+ ## [0.33.0] - 2026-08-09
519
+
520
+ ### Added
521
+ - **RLM**: pass-by-reference sub-agent results (`ArtifactStore`)
522
+ - **RLM**: chunked parallel queries (`chunk_query` tool)
523
+ - **Config**: `subagent.resultMode`, `maxSummaryChars`, `artifactsDir`, `stableSystemPrompt`
524
+
525
+ ## [0.32.0] - 2026-08-08
526
+
527
+ ### Added
528
+ - **Browser**: driver abstraction (`PlaywrightDriver` + `BridgeDriver`)
529
+ - **Browser**: Node bridge for Bun compatibility
530
+ - **Config**: `browser.maxConsoleLineChars`
531
+
532
+ ## [0.31.0] - 2026-08-08
533
+
534
+ ### Added
535
+ - **Security**: session file encryption (AES-256-GCM)
536
+ - **Security**: audit notifications (file + webhook)
537
+ - **Security**: security policies (strict/balanced/permissive)
538
+ - **CLI**: `mma security` commands
539
+
540
+ ## [0.30.0] - 2026-08-07
541
+
542
+ ### Added
543
+ - **Execution**: final audit gate (runs `bun test` for verification steps)
544
+ - **Execution**: `detectTestResults()` auto-verification in bash
545
+
546
+ ### Fixed
547
+ - **Execution**: empty-CLI entry-point hint
548
+ - **Bash**: Windows anti-patterns documentation
549
+
550
+ ## [0.29.0] - 2026-08-07
551
+
552
+ ### Added
553
+ - **Bash**: smart UTF-8/OEM line decoding (fixes Cyrillic on Windows)
554
+ - **Bash**: behavior-based background detection
555
+ - **Bash**: stuck-detector bash awareness
556
+
557
+ ## [0.28.0] - 2026-08-06
558
+
559
+ ### Fixed
560
+ - **Agent**: double-Esc interrupt fix (Bun readline keypress collapsing)
561
+ - **Agent**: abortable in-flight LLM requests on interrupt
562
+ - **UI**: clipboard paste hint
563
+
564
+ ## [0.27.0] - 2026-08-06
565
+
566
+ ### Fixed
567
+ - **Security**: Windows hardening
568
+ - **Hallucination**: fixes
569
+
570
+ ## [0.26.0] - 2026-08-05
571
+
572
+ ### Added
573
+ - **UI**: opencode-style inline tool headers (`ui.toolStyle`)
574
+ - **UI**: model commentary next to tool calls (`ui.toolComments`)
575
+ - **UI**: diffs without background color
576
+
577
+ ## [0.25.0] - 2026-08-05
578
+
579
+ ### Added
580
+ - **LSP**: LSP module (typescript, CSS, HTML, JSON, Python, Rust, Go)
581
+ - **Execution**: audit gate language-agnostic
582
+ - **Bash**: Windows command hints
583
+
584
+ ## [0.24.0] - 2026-08-04
585
+
586
+ ### Added
587
+ - **Context**: quality formula upgrade (token load + compaction loss + error density + freshness)
588
+ - **Read**: display mode (show only header in REPL, full content to LLM)
589
+
590
+ ## [0.23.0] - 2026-08-04
591
+
592
+ ### Added
593
+ - **Certification**: model certification module (`mma model certify`)
594
+ - **CLI**: cert checkmarks in model lists
595
+
596
+ ## [0.22.0] - 2026-08-03
597
+
598
+ ### Added
599
+ - **Security**: `enabled` flag (disabled by default)
600
+ - **CLI**: init/first-run apply wizard security answers
601
+ - **Prompt**: system prompt & recovery messages cleanup