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 +6 -0
- package/dist/i18n/en.json +14 -0
- package/dist/i18n/ru.json +14 -0
- package/dist/main.js +62 -8
- package/package.json +1 -1
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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");
|