micro-models-agent 0.60.0 → 0.60.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.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,12 @@ 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
+ ## [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
+
7
13
  ## [0.60.0] - 2026-09-15
8
14
 
9
15
  ### Added
package/dist/i18n/en.json CHANGED
@@ -52,6 +52,16 @@
52
52
  "env.playwright_missing": "Playwright package is not installed — the browser tool will fail. Install with: bun add playwright",
53
53
  "env.playwright_browsers_missing": "Playwright browsers not downloaded ({dir}). The browser tool will fail. Install with: bunx playwright install chromium",
54
54
  "env.crash_stderr": "MMA crashed ({type}): {message} — crash report written to ~/.mma/logs/crash.jsonl",
55
+ "env.model_autoload_failed": "Model auto-load failed: {error}. Continuing with manual load.",
56
+ "env.model_loaded": "Model {model} loaded in {seconds}s",
57
+ "env.reasoning_probe": "Reasoning probe: strategy={strategy} → {result}",
58
+ "env.reasoning_respected": "mechanism respected",
59
+ "env.reasoning_ignored": "mechanism IGNORED",
60
+ "env.indexing": "Indexing project files…",
61
+ "env.indexed": "Indexed {files} file(s) for the project map",
62
+ "env.indexing_failed": "Project indexing failed: {error}",
63
+ "env.index_skip_unreadable": "indexer: skipping unreadable entry \"{path}\"",
64
+ "env.killed_processes": "Killed {count} background process(es) on shutdown",
55
65
  "session.started": "Session started: {id}",
56
66
  "session.ended": "Session ended: {id}",
57
67
  "session.not_found": "Session not found: {id}",
@@ -715,6 +725,10 @@
715
725
  "moe.partial_result": "Partial result",
716
726
  "moe.scope_approved": "🔓 Scope expanded for \"{subtask}\": {files}",
717
727
  "moe.scope_rejected": "⛔ Scope request rejected for \"{subtask}\"",
728
+ "prompt.overflow.compressing": "System prompt overflow: compressing {count} block(s) before the first run — this may take a while on a local model.",
729
+ "prompt.overflow.summarizing": "System prompt overflow: summarizing \"{label}\" ({original} tok → {budget} tok budget) with the model…",
730
+ "prompt.overflow.truncating": "System prompt overflow: truncating \"{label}\" ({original} tok) — summarization unavailable.",
731
+ "prompt.overflow.summarize_failed": "System prompt overflow: summarization failed for \"{label}\": {error} — falling back to truncation.",
718
732
  "prompt.overflow.exceeded": "Prompt overflow: \"{label}\" ({original} tok) exceeded the system-prompt budget ({budget} tok) — {mode} to {resolved} tok. To fit fully, {hint}.",
719
733
  "prompt.overflow.failed": "Prompt overflow resolution failed: {error} — oversized blocks will be dropped.",
720
734
  "prompt.overflow.startup": "Startup check: {block} ({original} tok) exceeds the system-prompt budget ({budget} tok) — it will be summarized/truncated before the first run. To include it fully, {hint}.",
package/dist/i18n/ru.json CHANGED
@@ -51,6 +51,16 @@
51
51
  "env.playwright_missing": "Пакет Playwright не установлен — браузерный инструмент не будет работать. Установите: bun add playwright",
52
52
  "env.playwright_browsers_missing": "Браузеры Playwright не скачаны ({dir}). Браузерный инструмент не будет работать. Установите: bunx playwright install chromium",
53
53
  "env.crash_stderr": "MMA упал ({type}): {message} — отчёт о падении записан в ~/.mma/logs/crash.jsonl",
54
+ "env.model_autoload_failed": "Не удалось автоматически загрузить модель: {error}. Продолжаю с ручной загрузкой.",
55
+ "env.model_loaded": "Модель {model} загружена за {seconds}с",
56
+ "env.reasoning_probe": "Проверка reasoning: стратегия={strategy} → {result}",
57
+ "env.reasoning_respected": "механизм соблюдается",
58
+ "env.reasoning_ignored": "механизм ИГНОРИРУЕТСЯ",
59
+ "env.indexing": "Индексация файлов проекта…",
60
+ "env.indexed": "Проиндексировано файлов: {files} (карта проекта)",
61
+ "env.indexing_failed": "Ошибка индексации проекта: {error}",
62
+ "env.index_skip_unreadable": "индексатор: пропускаю недоступный файл \"{path}\"",
63
+ "env.killed_processes": "Остановлено фоновых процессов при завершении: {count}",
54
64
  "session.started": "Сессия начата: {id}",
55
65
  "session.ended": "Сессия завершена: {id}",
56
66
  "session.not_found": "Сессия не найдена: {id}",
@@ -715,6 +725,10 @@
715
725
  "moe.partial_result": "Частичный результат",
716
726
  "moe.scope_approved": "🔓 Scope расширен для \"{subtask}\": {files}",
717
727
  "moe.scope_rejected": "⛔ Запрос scope отклонён для \"{subtask}\"",
728
+ "prompt.overflow.compressing": "Переполнение системного промпта: сжимаю {count} блок(ов) перед первым запуском — на локальной модели это может занять время.",
729
+ "prompt.overflow.summarizing": "Переполнение системного промпта: суммаризирую \"{label}\" ({original} токенов → бюджет {budget} токенов) моделью…",
730
+ "prompt.overflow.truncating": "Переполнение системного промпта: обрезаю \"{label}\" ({original} токенов) — суммаризация недоступна.",
731
+ "prompt.overflow.summarize_failed": "Переполнение системного промпта: не удалось суммаризировать \"{label}\": {error} — перехожу к обрезке.",
718
732
  "prompt.overflow.exceeded": "Промпт переполнен: \"{label}\" ({original} токенов) превысил бюджет системного промпта ({budget} токенов) — {mode} до {resolved} токенов. Чтобы включить полностью, {hint}.",
719
733
  "prompt.overflow.failed": "Не удалось разрешить переполнение промпта: {error} — слишком большие блоки будут отброшены.",
720
734
  "prompt.overflow.startup": "Проверка при старте: {block} ({original} токенов) превышает бюджет системного промпта ({budget} токенов) — будет суммаризован/обрезан перед первым запуском. Чтобы включить полностью, {hint}.",
package/dist/main.js CHANGED
@@ -2492,6 +2492,16 @@ The path was joined onto the working directory because it does not exist as give
2492
2492
  "env.playwright_missing": "Playwright package is not installed — the browser tool will fail. Install with: bun add playwright",
2493
2493
  "env.playwright_browsers_missing": "Playwright browsers not downloaded ({dir}). The browser tool will fail. Install with: bunx playwright install chromium",
2494
2494
  "env.crash_stderr": "MMA crashed ({type}): {message} — crash report written to ~/.mma/logs/crash.jsonl",
2495
+ "env.model_autoload_failed": "Model auto-load failed: {error}. Continuing with manual load.",
2496
+ "env.model_loaded": "Model {model} loaded in {seconds}s",
2497
+ "env.reasoning_probe": "Reasoning probe: strategy={strategy} → {result}",
2498
+ "env.reasoning_respected": "mechanism respected",
2499
+ "env.reasoning_ignored": "mechanism IGNORED",
2500
+ "env.indexing": "Indexing project files…",
2501
+ "env.indexed": "Indexed {files} file(s) for the project map",
2502
+ "env.indexing_failed": "Project indexing failed: {error}",
2503
+ "env.index_skip_unreadable": 'indexer: skipping unreadable entry "{path}"',
2504
+ "env.killed_processes": "Killed {count} background process(es) on shutdown",
2495
2505
  "session.started": "Session started: {id}",
2496
2506
  "session.ended": "Session ended: {id}",
2497
2507
  "session.not_found": "Session not found: {id}",
@@ -3192,6 +3202,10 @@ Apply a matching solution from these results. If none is relevant — do NOT rep
3192
3202
  "moe.partial_result": "Partial result",
3193
3203
  "moe.scope_approved": '🔓 Scope expanded for "{subtask}": {files}',
3194
3204
  "moe.scope_rejected": '⛔ Scope request rejected for "{subtask}"',
3205
+ "prompt.overflow.compressing": "System prompt overflow: compressing {count} block(s) before the first run — this may take a while on a local model.",
3206
+ "prompt.overflow.summarizing": 'System prompt overflow: summarizing "{label}" ({original} tok → {budget} tok budget) with the model…',
3207
+ "prompt.overflow.truncating": 'System prompt overflow: truncating "{label}" ({original} tok) — summarization unavailable.',
3208
+ "prompt.overflow.summarize_failed": 'System prompt overflow: summarization failed for "{label}": {error} — falling back to truncation.',
3195
3209
  "prompt.overflow.exceeded": 'Prompt overflow: "{label}" ({original} tok) exceeded the system-prompt budget ({budget} tok) — {mode} to {resolved} tok. To fit fully, {hint}.',
3196
3210
  "prompt.overflow.failed": "Prompt overflow resolution failed: {error} — oversized blocks will be dropped.",
3197
3211
  "prompt.overflow.startup": "Startup check: {block} ({original} tok) exceeds the system-prompt budget ({budget} tok) — it will be summarized/truncated before the first run. To include it fully, {hint}.",
@@ -3282,6 +3296,16 @@ var init_ru = __esm(() => {
3282
3296
  "env.playwright_missing": "Пакет Playwright не установлен — браузерный инструмент не будет работать. Установите: bun add playwright",
3283
3297
  "env.playwright_browsers_missing": "Браузеры Playwright не скачаны ({dir}). Браузерный инструмент не будет работать. Установите: bunx playwright install chromium",
3284
3298
  "env.crash_stderr": "MMA упал ({type}): {message} — отчёт о падении записан в ~/.mma/logs/crash.jsonl",
3299
+ "env.model_autoload_failed": "Не удалось автоматически загрузить модель: {error}. Продолжаю с ручной загрузкой.",
3300
+ "env.model_loaded": "Модель {model} загружена за {seconds}с",
3301
+ "env.reasoning_probe": "Проверка reasoning: стратегия={strategy} → {result}",
3302
+ "env.reasoning_respected": "механизм соблюдается",
3303
+ "env.reasoning_ignored": "механизм ИГНОРИРУЕТСЯ",
3304
+ "env.indexing": "Индексация файлов проекта…",
3305
+ "env.indexed": "Проиндексировано файлов: {files} (карта проекта)",
3306
+ "env.indexing_failed": "Ошибка индексации проекта: {error}",
3307
+ "env.index_skip_unreadable": 'индексатор: пропускаю недоступный файл "{path}"',
3308
+ "env.killed_processes": "Остановлено фоновых процессов при завершении: {count}",
3285
3309
  "session.started": "Сессия начата: {id}",
3286
3310
  "session.ended": "Сессия завершена: {id}",
3287
3311
  "session.not_found": "Сессия не найдена: {id}",
@@ -3984,6 +4008,10 @@ var init_ru = __esm(() => {
3984
4008
  "moe.partial_result": "Частичный результат",
3985
4009
  "moe.scope_approved": '🔓 Scope расширен для "{subtask}": {files}',
3986
4010
  "moe.scope_rejected": '⛔ Запрос scope отклонён для "{subtask}"',
4011
+ "prompt.overflow.compressing": "Переполнение системного промпта: сжимаю {count} блок(ов) перед первым запуском — на локальной модели это может занять время.",
4012
+ "prompt.overflow.summarizing": 'Переполнение системного промпта: суммаризирую "{label}" ({original} токенов → бюджет {budget} токенов) моделью…',
4013
+ "prompt.overflow.truncating": 'Переполнение системного промпта: обрезаю "{label}" ({original} токенов) — суммаризация недоступна.',
4014
+ "prompt.overflow.summarize_failed": 'Переполнение системного промпта: не удалось суммаризировать "{label}": {error} — перехожу к обрезке.',
3987
4015
  "prompt.overflow.exceeded": 'Промпт переполнен: "{label}" ({original} токенов) превысил бюджет системного промпта ({budget} токенов) — {mode} до {resolved} токенов. Чтобы включить полностью, {hint}.',
3988
4016
  "prompt.overflow.failed": "Не удалось разрешить переполнение промпта: {error} — слишком большие блоки будут отброшены.",
3989
4017
  "prompt.overflow.startup": "Проверка при старте: {block} ({original} токенов) превышает бюджет системного промпта ({budget} токенов) — будет суммаризован/обрезан перед первым запуском. Чтобы включить полностью, {hint}.",
@@ -14629,6 +14657,9 @@ async function resolvePromptOverflow(opts) {
14629
14657
  const warnings = [];
14630
14658
  let used = includedTokens;
14631
14659
  let unresolved = [];
14660
+ if (sorted.length > 0) {
14661
+ logger?.warn(t("prompt.overflow.compressing", { count: String(sorted.length) }));
14662
+ }
14632
14663
  for (const block of sorted) {
14633
14664
  const kind = block.kind;
14634
14665
  const maxTokens = systemBudget - used - HINT_BLOCK_TOKENS;
@@ -14646,6 +14677,11 @@ async function resolvePromptOverflow(opts) {
14646
14677
  logger?.debug(`Prompt overflow: cache hit for ${kind} (${key}, ${mode})`);
14647
14678
  } else if (provider) {
14648
14679
  const targetChars = Math.floor(maxTokens * (CHARS_PER_TOKEN - 1));
14680
+ logger?.warn(t("prompt.overflow.summarizing", {
14681
+ label: blockLabel2(block.content),
14682
+ original: String(block.estimatedTokens),
14683
+ budget: String(maxTokens)
14684
+ }));
14649
14685
  try {
14650
14686
  const prompt = [
14651
14687
  `Summarize the following ${KIND_LABEL[kind]} document.`,
@@ -14675,12 +14711,19 @@ async function resolvePromptOverflow(opts) {
14675
14711
  `), maxTokens);
14676
14712
  }
14677
14713
  } catch (err) {
14678
- logger?.warn(`Prompt overflow: summarization failed for ${kind}: ${err?.message ?? err}`);
14714
+ logger?.warn(t("prompt.overflow.summarize_failed", {
14715
+ label: blockLabel2(block.content),
14716
+ error: String(err?.message ?? err)
14717
+ }));
14679
14718
  text = "";
14680
14719
  }
14681
14720
  }
14682
14721
  if (!text) {
14683
14722
  mode = "truncate";
14723
+ logger?.warn(t("prompt.overflow.truncating", {
14724
+ label: blockLabel2(block.content),
14725
+ original: String(block.estimatedTokens)
14726
+ }));
14684
14727
  text = truncateToTokens(block.content, maxTokens);
14685
14728
  }
14686
14729
  if (estimateTokens(text) > maxTokens) {
@@ -14745,6 +14788,7 @@ var HINT_BLOCK_TOKENS = 60, CHARS_PER_TOKEN = 4, KIND_ORDER, KIND_LABEL, KIND_SO
14745
14788
  var init_prompt_overflow = __esm(() => {
14746
14789
  init_prompt_builder();
14747
14790
  init_token_counter();
14791
+ init_i18n();
14748
14792
  KIND_ORDER = ["instructions", "project-map"];
14749
14793
  KIND_LABEL = {
14750
14794
  instructions: "project instructions (AGENTS.md)",
@@ -15483,7 +15527,7 @@ class Agent {
15483
15527
  contextManager.onCompact = null;
15484
15528
  const killed = processRegistry.killAll();
15485
15529
  if (killed > 0) {
15486
- logger.info(`Killed ${killed} background process(es) on shutdown`);
15530
+ logger.info(t("env.killed_processes", { count: String(killed) }));
15487
15531
  }
15488
15532
  pluginManager.runOnSessionEnd({
15489
15533
  logger,
@@ -24926,7 +24970,7 @@ class Indexer {
24926
24970
  }
24927
24971
  }
24928
24972
  } catch (e) {
24929
- logger2.warn(`indexer: skipping unreadable entry "${relPath}"`, { error: String(e) });
24973
+ logger2.warn(t("env.index_skip_unreadable", { path: relPath }), { error: String(e) });
24930
24974
  continue;
24931
24975
  }
24932
24976
  }
@@ -24947,6 +24991,7 @@ var logger2, IGNORE_DIRS;
24947
24991
  var init_walker = __esm(() => {
24948
24992
  init_app_logger();
24949
24993
  init_symbols();
24994
+ init_i18n();
24950
24995
  logger2 = new Logger("warn", "indexer");
24951
24996
  IGNORE_DIRS = new Set([
24952
24997
  ".git",
@@ -26524,11 +26569,11 @@ async function bootstrap(configDir, projectDir, noAgentsMd, exitOnComplete, reas
26524
26569
  autoLoad: config.modelLoad.autoLoad
26525
26570
  });
26526
26571
  if (!loadResult.success) {
26527
- logger4.warn(`Model auto-load failed: ${loadResult.error}. Continuing with manual load.`);
26572
+ logger4.warn(t("env.model_autoload_failed", { error: String(loadResult.error ?? "") }));
26528
26573
  } else if (loadResult.alreadyLoaded) {
26529
26574
  logger4.debug(`Model ${config.model} already loaded`);
26530
26575
  } else {
26531
- logger4.info(`Model ${config.model} loaded in ${loadResult.loadTime}s`);
26576
+ logger4.info(t("env.model_loaded", { model: config.model, seconds: String(loadResult.loadTime) }));
26532
26577
  }
26533
26578
  }
26534
26579
  const contextProbePromise = (async () => {
@@ -26564,7 +26609,10 @@ async function bootstrap(configDir, projectDir, noAgentsMd, exitOnComplete, reas
26564
26609
  const passed = cached !== undefined ? cached : await probeReasoningSupport2(llmProvider, reasoningStrategy);
26565
26610
  if (cached === undefined && passed !== null)
26566
26611
  setCachedProbeResult2(cacheK, passed);
26567
- logger4.info(`Reasoning probe: strategy=${reasoningStrategy} → ${passed === true ? "mechanism respected" : "mechanism IGNORED"}`);
26612
+ logger4.info(t("env.reasoning_probe", {
26613
+ strategy: reasoningStrategy,
26614
+ result: passed === true ? t("env.reasoning_respected") : t("env.reasoning_ignored")
26615
+ }));
26568
26616
  return passed === true;
26569
26617
  } catch {
26570
26618
  return false;
@@ -26588,9 +26636,15 @@ async function bootstrap(configDir, projectDir, noAgentsMd, exitOnComplete, reas
26588
26636
  cacheDir: projectMapCacheDir
26589
26637
  });
26590
26638
  try {
26591
- await indexerModule.buildIndex();
26639
+ logger4.info(t("env.indexing"));
26640
+ const index = await indexerModule.buildIndex();
26641
+ if (index) {
26642
+ logger4.info(t("env.indexed", { files: String(index.files.length) }));
26643
+ } else {
26644
+ logger4.warn(t("env.indexing_failed", { error: "no index produced" }));
26645
+ }
26592
26646
  } catch (err) {
26593
- logger4.warn(`Project indexing failed: ${err.message}`);
26647
+ logger4.warn(t("env.indexing_failed", { error: String(err?.message ?? err) }));
26594
26648
  }
26595
26649
  const skillsLoader = new SkillsLoader;
26596
26650
  const builtinDir = join46(import.meta.dirname, "skills", "builtin");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "micro-models-agent",
3
- "version": "0.60.0",
3
+ "version": "0.60.1",
4
4
  "description": "Micro Models Agent (MMA) — LLM agent harness for small models (Qwen3.5-9B, 32K-64K context)",
5
5
  "type": "module",
6
6
  "bin": {