micro-models-agent 0.18.1 → 0.18.3

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/bin/mma.mjs CHANGED
@@ -1,8 +1,8 @@
1
- #!/usr/bin/env node
2
- import { fileURLToPath, pathToFileURL } from "node:url";
3
- import { dirname, join } from "node:path";
4
-
5
- const __dirname = dirname(fileURLToPath(import.meta.url));
6
- const main = join(__dirname, "..", "dist", "main.js");
7
-
8
- await import(pathToFileURL(main).href);
1
+ #!/usr/bin/env node
2
+ import { fileURLToPath, pathToFileURL } from "node:url";
3
+ import { dirname, join } from "node:path";
4
+
5
+ const __dirname = dirname(fileURLToPath(import.meta.url));
6
+ const main = join(__dirname, "..", "dist", "main.js");
7
+
8
+ await import(pathToFileURL(main).href);
@@ -3,10 +3,27 @@ import { bootstrap } from "../core/bootstrap";
3
3
  import { saveConfig } from "../config/config";
4
4
  import { runSetup } from "./setup";
5
5
  import { t } from "../i18n/index";
6
- import { join } from "path";
6
+ import { join, dirname } from "path";
7
7
  import { homedir } from "os";
8
+ import { existsSync, readFileSync } from "fs";
8
9
  import { createSecurityCommand } from "./security-commands";
9
- import { version } from "../../package.json";
10
+ import { fileURLToPath } from "url";
11
+ function readVersion() {
12
+ const here = dirname(fileURLToPath(import.meta.url));
13
+ const candidates = [
14
+ join(here, "..", "..", "package.json"),
15
+ join(here, "..", "package.json"),
16
+ ];
17
+ for (const p of candidates) {
18
+ if (existsSync(p)) {
19
+ const raw = JSON.parse(readFileSync(p, "utf8"));
20
+ if (raw.version)
21
+ return raw.version;
22
+ }
23
+ }
24
+ return "0.0.0";
25
+ }
26
+ const version = readVersion();
10
27
  export function createProgram() {
11
28
  const program = new Command()
12
29
  .name("mma")
package/dist/cli/repl.js CHANGED
@@ -1,8 +1,9 @@
1
1
  import * as readline from "readline";
2
2
  import { pc } from "../ui/colors";
3
3
  import { existsSync, readFileSync, writeFileSync } from "fs";
4
- import { join } from "path";
4
+ import { join, dirname } from "path";
5
5
  import { homedir } from "os";
6
+ import { fileURLToPath } from "url";
6
7
  import { Completer, SlashCommandProvider, SessionNameProvider, SubcommandProvider, SkillNameProvider, } from "./completer";
7
8
  import { Renderer } from "../ui/renderer";
8
9
  import { box } from "../ui/box";
@@ -11,6 +12,22 @@ import { t } from "../i18n/index";
11
12
  import { runSetup } from "./setup";
12
13
  import { saveConfig } from "../config/config";
13
14
  import { getMessageText } from "../llm/provider";
15
+ function readVersion() {
16
+ const here = dirname(fileURLToPath(import.meta.url));
17
+ const candidates = [
18
+ join(here, "..", "..", "package.json"),
19
+ join(here, "..", "package.json"),
20
+ ];
21
+ for (const p of candidates) {
22
+ if (existsSync(p)) {
23
+ const raw = JSON.parse(readFileSync(p, "utf8"));
24
+ if (raw.version)
25
+ return raw.version;
26
+ }
27
+ }
28
+ return "0.0.0";
29
+ }
30
+ const version = readVersion();
14
31
  const COMMAND_GROUPS = {
15
32
  help: "general",
16
33
  exit: "general",
@@ -172,7 +189,8 @@ export class Repl {
172
189
  dataUrl = result.dataUrl;
173
190
  label = "clipboard";
174
191
  }
175
- else if (source.startsWith("http://") || source.startsWith("https://")) {
192
+ else if (source.startsWith("http://") ||
193
+ source.startsWith("https://")) {
176
194
  const result = await loadUrlAsDataUrl(source);
177
195
  dataUrl = result.dataUrl;
178
196
  label = source;
@@ -813,7 +831,9 @@ export class Repl {
813
831
  this.pendingClipboardImage = null;
814
832
  }
815
833
  process.stdout.write("\n" + pc.green(t("repl.agent")));
816
- const renderer = new Renderer({ spinner: this.config.ui?.spinner ?? true });
834
+ const renderer = new Renderer({
835
+ spinner: this.config.ui?.spinner ?? true,
836
+ });
817
837
  const result = await this.agent.run(input, (c) => renderer.text(c), (m) => renderer.meta(m), (ev) => {
818
838
  if (ev.type === "start") {
819
839
  renderer.toolStart(ev.tool, ev.args);
@@ -972,7 +992,10 @@ export class Repl {
972
992
  row(t("repl.session_label"), `${pc.cyan(meta.name)} ${pc.dim(`(${meta.id.slice(0, 12)})`)} — ${meta.messageCount} msgs ${pc.dim(sessionPath)}`);
973
993
  }
974
994
  const headerWidth = Math.max(50, Math.min(96, process.stdout.columns || 96));
975
- for (const line of box(info, { title: t("repl.title"), width: headerWidth })) {
995
+ for (const line of box(info, {
996
+ title: t("repl.title", { version }),
997
+ width: headerWidth,
998
+ })) {
976
999
  console.log(line);
977
1000
  }
978
1001
  console.log();
@@ -305,7 +305,9 @@ export class Agent {
305
305
  consecutiveToolFailures = 0;
306
306
  }
307
307
  if (consecutiveToolFailures >= MAX_CONSECUTIVE_TOOL_FAILURES) {
308
- const recoveryMsg = t("exec.consecutive_failures_recovery", { count: consecutiveToolFailures });
308
+ const recoveryMsg = t("exec.consecutive_failures_recovery", {
309
+ count: consecutiveToolFailures,
310
+ });
309
311
  logger.warn(`Consecutive tool failures: ${consecutiveToolFailures}`);
310
312
  const taskSnippet = input.length > 200 ? input.slice(0, 200) + "..." : input;
311
313
  const taskReminder = t("exec.task_reminder", { task: taskSnippet });
@@ -318,6 +320,14 @@ export class Agent {
318
320
  role: "user",
319
321
  content: `<system-summary>${summaries.join("\n")}</system-summary>`,
320
322
  });
323
+ const ctxTokens = contextManager.getEstimatedTokens();
324
+ const ctxBudget = contextManager.getBudget();
325
+ const ctxPct = Math.min(100, Math.round((ctxTokens / ctxBudget.history) * 100));
326
+ const barLen = 10;
327
+ const filled = Math.round((ctxPct / 100) * barLen);
328
+ const ctxBar = pc.green("█".repeat(filled)) + pc.dim("░".repeat(barLen - filled));
329
+ const pctColor = ctxPct >= 75 ? pc.yellow : pc.dim;
330
+ onMeta?.(`\n ${ctxBar} ${pctColor(`${ctxPct}%`)} ${pc.dim(`ctx: ${ctxTokens}/${ctxBudget.history}`)}\n`);
321
331
  continue;
322
332
  }
323
333
  const hallucinationResult = hallucinationDetector.validate(textContent);
package/dist/i18n/en.json CHANGED
@@ -290,7 +290,7 @@
290
290
  "repl.skill_unknown_sub": "Unknown skill subcommand: {subcmd}",
291
291
  "repl.skill_usage": "Usage: /skill [list|loaded|load|unload|search]",
292
292
  "repl.agent": "Agent: ",
293
- "repl.title": "MMA REPL v2",
293
+ "repl.title": "MMA REPL v{version}",
294
294
  "repl.model": "Model:",
295
295
  "repl.provider": "Provider:",
296
296
  "repl.context": "Context:",
package/dist/i18n/ru.json CHANGED
@@ -286,7 +286,7 @@
286
286
  "repl.skill_unknown_sub": "Неизвестная подкоманда скилла: {subcmd}",
287
287
  "repl.skill_usage": "Использование: /skill [list|loaded|load|unload|search]",
288
288
  "repl.agent": "Агент: ",
289
- "repl.title": "MMA REPL v2",
289
+ "repl.title": "MMA REPL v{version}",
290
290
  "repl.model": "Модель:",
291
291
  "repl.provider": "Провайдер:",
292
292
  "repl.context": "Контекст:",