micro-models-agent 2.11.0 → 2.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (347) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/assets/js/tabs.js +22 -3
  3. package/dist/cli/cache-line.js +1 -0
  4. package/dist/cli/command-suggest.js +5 -4
  5. package/dist/cli/commands.js +231 -122
  6. package/dist/cli/completer.js +132 -31
  7. package/dist/cli/index.js +1 -0
  8. package/dist/cli/json-payload.js +4 -4
  9. package/dist/cli/main.js +166 -61
  10. package/dist/cli/onboarding-commands.js +126 -0
  11. package/dist/cli/plugin-commands.js +2 -1
  12. package/dist/cli/relaunch.js +16 -13
  13. package/dist/cli/repl-commands-lsp.js +75 -0
  14. package/dist/cli/repl-commands-skills.js +105 -0
  15. package/dist/cli/repl-commands.js +589 -266
  16. package/dist/cli/repl.js +436 -177
  17. package/dist/cli/run-result.js +5 -6
  18. package/dist/cli/security-commands.js +37 -28
  19. package/dist/cli/setup-order.js +4 -55
  20. package/dist/cli/setup-prompt.js +3 -2
  21. package/dist/cli/setup.js +27 -107
  22. package/dist/cli/web-command.js +98 -0
  23. package/dist/config/budget.js +5 -5
  24. package/dist/config/config.js +103 -96
  25. package/dist/config/defaults.js +38 -8
  26. package/dist/config/domains.js +24 -27
  27. package/dist/config/env.js +46 -0
  28. package/dist/config/experts.js +2 -0
  29. package/dist/config/index.js +1 -0
  30. package/dist/config/paths.js +56 -0
  31. package/dist/config/redact.js +44 -0
  32. package/dist/config/registry-extra.js +334 -0
  33. package/dist/config/registry.js +584 -0
  34. package/dist/config/security.js +35 -36
  35. package/dist/config/timeouts.js +74 -0
  36. package/dist/config/utils.js +16 -15
  37. package/dist/core/agent/artifact-progress.js +59 -0
  38. package/dist/core/agent/artifact-resolve.js +79 -0
  39. package/dist/core/agent/audit-gate.js +7 -3
  40. package/dist/core/agent/compaction.js +2 -2
  41. package/dist/core/agent/constants.js +33 -4
  42. package/dist/core/agent/context-log.js +454 -0
  43. package/dist/core/agent/context-renderer.js +5 -0
  44. package/dist/core/agent/critic-gate.js +132 -0
  45. package/dist/core/agent/hallucination-gate.js +148 -38
  46. package/dist/core/agent/loop-state.js +15 -0
  47. package/dist/core/agent/prefix-monitor.js +1 -1
  48. package/dist/core/agent/reasoning-resolver.js +10 -1
  49. package/dist/core/agent/token-tracker.js +7 -4
  50. package/dist/core/agent/tool-batch.js +93 -18
  51. package/dist/core/agent/tool-images.js +18 -0
  52. package/dist/core/agent/tool-output.js +65 -11
  53. package/dist/core/agent/tool-pairing.js +60 -0
  54. package/dist/core/agent-moe.js +25 -24
  55. package/dist/core/agent.js +429 -108
  56. package/dist/core/bootstrap/agent-phase.js +66 -0
  57. package/dist/core/bootstrap/config-phase.js +86 -0
  58. package/dist/core/bootstrap/modules-phase.js +269 -0
  59. package/dist/core/bootstrap/provider-phase.js +183 -0
  60. package/dist/core/bootstrap/session-phase.js +204 -0
  61. package/dist/core/bootstrap/state.js +94 -0
  62. package/dist/core/bootstrap/workspace-phase.js +115 -0
  63. package/dist/core/bootstrap.js +92 -660
  64. package/dist/core/crash-handler.js +17 -7
  65. package/dist/core/environment.js +37 -12
  66. package/dist/core/host-plan.js +43 -0
  67. package/dist/core/host.js +23 -0
  68. package/dist/core/index.js +1 -0
  69. package/dist/core/prompt-builder.js +17 -1
  70. package/dist/core/prompt-overflow.js +42 -43
  71. package/dist/core/session-logger.js +122 -30
  72. package/dist/core/system-prompt.js +117 -0
  73. package/dist/core/version.js +6 -4
  74. package/dist/core/web-host.js +34 -0
  75. package/dist/core/workspace.js +19 -15
  76. package/dist/i18n/index.js +37 -3
  77. package/dist/index.js +7 -3
  78. package/dist/llm/image-utils.js +55 -64
  79. package/dist/llm/llm-errors.js +9 -0
  80. package/dist/llm/model-loader.js +10 -32
  81. package/dist/llm/models-dev.js +121 -0
  82. package/dist/llm/openai-compat.js +146 -73
  83. package/dist/llm/orchestrator.js +33 -11
  84. package/dist/llm/provider-budget.js +2 -2
  85. package/dist/llm/provider-context.js +233 -0
  86. package/dist/llm/provider.js +1 -1
  87. package/dist/llm/response.js +5 -0
  88. package/dist/llm/token-counter.js +27 -11
  89. package/dist/logger/app-logger.js +48 -22
  90. package/dist/logger/file-log.js +28 -19
  91. package/dist/logger/index.js +1 -0
  92. package/dist/main.js +273 -47
  93. package/dist/migration/backup.js +14 -3
  94. package/dist/migration/detect.js +12 -3
  95. package/dist/migration/index.js +1 -0
  96. package/dist/modules/artifacts/store.js +9 -8
  97. package/dist/modules/browser/actions.js +6 -0
  98. package/dist/modules/browser/bridge-client.js +14 -12
  99. package/dist/modules/browser/bridge-path.js +4 -4
  100. package/dist/modules/browser/console-buffer.js +37 -0
  101. package/dist/modules/browser/cookie-store.js +5 -0
  102. package/dist/modules/browser/driver-types.js +1 -0
  103. package/dist/modules/browser/driver.js +19 -11
  104. package/dist/modules/browser/index.js +3 -1
  105. package/dist/modules/browser/module.js +2 -1
  106. package/dist/modules/browser/session.js +10 -30
  107. package/dist/modules/browser/snapshot.js +19 -13
  108. package/dist/modules/browser/types.js +1 -0
  109. package/dist/modules/certification/cli.js +28 -20
  110. package/dist/modules/certification/fact-checker.js +9 -1
  111. package/dist/modules/certification/loader.js +9 -2
  112. package/dist/modules/certification/manifest.js +83 -21
  113. package/dist/modules/certification/runner.js +23 -13
  114. package/dist/modules/certification/scenarios.js +20 -20
  115. package/dist/modules/certification/syntax-scenarios.js +1 -2
  116. package/dist/modules/context/chunk-query.js +11 -9
  117. package/dist/modules/context/fact-extractor.js +37 -39
  118. package/dist/modules/context/index.js +1 -0
  119. package/dist/modules/context/manager.js +106 -80
  120. package/dist/modules/critic/client.js +176 -0
  121. package/dist/modules/critic/evidence.js +81 -0
  122. package/dist/modules/critic/provider.js +45 -0
  123. package/dist/modules/critic/tools.js +78 -0
  124. package/dist/modules/critic/types.js +1 -0
  125. package/dist/modules/execution/audit-runners.js +28 -34
  126. package/dist/modules/execution/auditor.js +53 -49
  127. package/dist/modules/execution/execution-plugin.js +142 -102
  128. package/dist/modules/execution/index.js +1 -1
  129. package/dist/modules/execution/input-from.js +37 -13
  130. package/dist/modules/execution/module.js +368 -191
  131. package/dist/modules/execution/moe-executor.js +53 -26
  132. package/dist/modules/execution/plan-actions.js +320 -202
  133. package/dist/modules/execution/plan-checks.js +35 -0
  134. package/dist/modules/execution/plan-coverage.js +36 -33
  135. package/dist/modules/execution/plan-steps.js +11 -3
  136. package/dist/modules/execution/plan-store.js +83 -17
  137. package/dist/modules/execution/plan-tool.js +89 -35
  138. package/dist/modules/execution/plan-validator.js +30 -10
  139. package/dist/modules/execution/planner.js +22 -13
  140. package/dist/modules/execution/stuck-detector.js +196 -93
  141. package/dist/modules/execution/tracker.js +22 -8
  142. package/dist/modules/execution/verifier.js +69 -48
  143. package/dist/modules/execution/windows-commands.js +12 -12
  144. package/dist/modules/hallucination/artifact-claim.js +93 -0
  145. package/dist/modules/hallucination/confidence.js +13 -11
  146. package/dist/modules/hallucination/consistency.js +10 -2
  147. package/dist/modules/hallucination/detector.js +10 -5
  148. package/dist/modules/hallucination/factual.js +43 -26
  149. package/dist/modules/hallucination/index.js +1 -0
  150. package/dist/modules/hallucination/js-identifiers.js +44 -45
  151. package/dist/modules/hallucination/llm-judge.js +17 -12
  152. package/dist/modules/hallucination/success-claim.js +59 -0
  153. package/dist/modules/indexer/cache.js +52 -4
  154. package/dist/modules/indexer/index.js +1 -0
  155. package/dist/modules/indexer/map-command.js +2 -4
  156. package/dist/modules/indexer/map-select.js +16 -16
  157. package/dist/modules/indexer/module.js +47 -12
  158. package/dist/modules/indexer/project-profile.js +8 -7
  159. package/dist/modules/indexer/symbols.js +15 -15
  160. package/dist/modules/indexer/walker.js +159 -29
  161. package/dist/modules/lsp/check-tool.js +7 -5
  162. package/dist/modules/lsp/client.js +39 -39
  163. package/dist/modules/lsp/command.js +17 -24
  164. package/dist/modules/lsp/config.js +12 -11
  165. package/dist/modules/lsp/index.js +1 -0
  166. package/dist/modules/lsp/module.js +48 -46
  167. package/dist/modules/lsp/probe.js +13 -14
  168. package/dist/modules/lsp/project-root.js +14 -17
  169. package/dist/modules/lsp/startup-check.js +18 -16
  170. package/dist/modules/mcp/client.js +59 -62
  171. package/dist/modules/mcp/index.js +1 -0
  172. package/dist/modules/mcp/module.js +66 -37
  173. package/dist/modules/mcp/registry.js +5 -0
  174. package/dist/modules/memory/index.js +1 -0
  175. package/dist/modules/memory/module.js +12 -8
  176. package/dist/modules/memory/search.js +4 -1
  177. package/dist/modules/memory/store.js +40 -2
  178. package/dist/modules/onboarding/init.js +47 -0
  179. package/dist/modules/onboarding/meet.js +30 -0
  180. package/dist/modules/onboarding/mode.js +30 -0
  181. package/dist/modules/onboarding/prompts.js +43 -0
  182. package/dist/modules/pipelines/engine.js +10 -0
  183. package/dist/modules/pipelines/index.js +1 -0
  184. package/dist/modules/pipelines/parser.js +4 -1
  185. package/dist/modules/pipelines/template.js +4 -0
  186. package/dist/modules/plugins/builtin/lint-on-write.js +80 -67
  187. package/dist/modules/plugins/builtin/notify.js +2 -0
  188. package/dist/modules/plugins/index.js +1 -0
  189. package/dist/modules/plugins/loader.js +18 -3
  190. package/dist/modules/plugins/manager.js +37 -17
  191. package/dist/modules/pricing/index.js +10 -11
  192. package/dist/modules/pricing/prices.js +12 -12
  193. package/dist/modules/processes/index.js +1 -0
  194. package/dist/modules/processes/kill-tree.js +27 -31
  195. package/dist/modules/processes/registry.js +44 -25
  196. package/dist/modules/processes/runner.js +4 -4
  197. package/dist/modules/providers/capabilities.js +28 -0
  198. package/dist/modules/providers/create.js +3 -4
  199. package/dist/modules/providers/factory.js +7 -7
  200. package/dist/modules/providers/fallback.js +12 -12
  201. package/dist/modules/providers/health.js +4 -4
  202. package/dist/modules/providers/manager.js +50 -19
  203. package/dist/modules/providers/naming.js +15 -0
  204. package/dist/modules/providers/preflight.js +71 -0
  205. package/dist/modules/providers/presets.js +39 -8
  206. package/dist/modules/providers/registry.js +7 -2
  207. package/dist/modules/reasoning/policy.js +8 -6
  208. package/dist/modules/reasoning/probe.js +30 -25
  209. package/dist/modules/security/audit-log.js +19 -36
  210. package/dist/modules/security/audit-notifier.js +35 -75
  211. package/dist/modules/security/command-validator.js +99 -51
  212. package/dist/modules/security/content-scanner.js +8 -8
  213. package/dist/modules/security/data-sanitizer.js +9 -16
  214. package/dist/modules/security/encryption.js +32 -52
  215. package/dist/modules/security/index.js +2 -1
  216. package/dist/modules/security/network-validator.js +120 -43
  217. package/dist/modules/security/path-validator.js +61 -46
  218. package/dist/modules/security/protected-paths.js +73 -0
  219. package/dist/modules/security/rate-limiter.js +17 -49
  220. package/dist/modules/security/security-policies.js +25 -57
  221. package/dist/modules/security/session-encryption.js +32 -71
  222. package/dist/modules/security/session-isolation.js +15 -28
  223. package/dist/modules/session/auto-name.js +63 -0
  224. package/dist/modules/session/export.js +98 -0
  225. package/dist/modules/session/index.js +1 -0
  226. package/dist/modules/session/manager.js +79 -28
  227. package/dist/modules/session/module.js +4 -3
  228. package/dist/modules/session/store.js +57 -20
  229. package/dist/modules/setup/answers.js +35 -0
  230. package/dist/modules/setup/apply.js +79 -0
  231. package/dist/modules/setup/discovery.js +72 -0
  232. package/dist/modules/skills/index.js +1 -0
  233. package/dist/modules/skills/loader.js +9 -1
  234. package/dist/modules/skills/module.js +11 -0
  235. package/dist/modules/updater/changelog-reader.js +15 -16
  236. package/dist/modules/updater/checker.js +9 -4
  237. package/dist/modules/updater/dev-detect.js +7 -6
  238. package/dist/modules/updater/index.js +1 -0
  239. package/dist/modules/updater/module.js +17 -15
  240. package/dist/modules/user-profile/compressor.js +2 -0
  241. package/dist/modules/user-profile/index.js +1 -0
  242. package/dist/modules/user-profile/profile.js +10 -1
  243. package/dist/modules/webui/answer-api.js +29 -0
  244. package/dist/modules/webui/assets.js +50 -0
  245. package/dist/modules/webui/body.js +21 -0
  246. package/dist/modules/webui/commands-settings.js +209 -0
  247. package/dist/modules/webui/commands-shared.js +60 -0
  248. package/dist/modules/webui/commands.js +174 -0
  249. package/dist/modules/webui/config-api.js +134 -0
  250. package/dist/modules/webui/file-api.js +202 -0
  251. package/dist/modules/webui/forward.js +159 -0
  252. package/dist/modules/webui/history-api.js +112 -0
  253. package/dist/modules/webui/host-state.js +60 -0
  254. package/dist/modules/webui/i18n-api.js +9 -0
  255. package/dist/modules/webui/limits.js +6 -0
  256. package/dist/modules/webui/log-forward.js +20 -0
  257. package/dist/modules/webui/memory-commands.js +64 -0
  258. package/dist/modules/webui/model-cache.js +18 -0
  259. package/dist/modules/webui/module.js +148 -0
  260. package/dist/modules/webui/persist.js +24 -0
  261. package/dist/modules/webui/prompt-io.js +97 -0
  262. package/dist/modules/webui/providers-api.js +337 -0
  263. package/dist/modules/webui/providers-view.js +56 -0
  264. package/dist/modules/webui/reasoning-view.js +15 -0
  265. package/dist/modules/webui/run-agent.js +81 -0
  266. package/dist/modules/webui/server.js +284 -0
  267. package/dist/modules/webui/sessions-api.js +178 -0
  268. package/dist/modules/webui/settings-api.js +561 -0
  269. package/dist/modules/webui/setup-api.js +201 -0
  270. package/dist/modules/webui/state.js +74 -0
  271. package/dist/modules/webui/util.js +261 -0
  272. package/dist/output/bus.js +7 -2
  273. package/dist/output/channel.js +80 -28
  274. package/dist/output/format.js +2 -1
  275. package/dist/output/index.js +1 -0
  276. package/dist/output/json-sink.js +5 -3
  277. package/dist/output/machine.js +4 -3
  278. package/dist/output/session-sink.js +4 -4
  279. package/dist/tools/approve.js +4 -0
  280. package/dist/tools/attach-image.js +5 -4
  281. package/dist/tools/auto-fixer.js +26 -44
  282. package/dist/tools/auto-tags.js +83 -0
  283. package/dist/tools/bash.js +193 -116
  284. package/dist/tools/browser.js +76 -31
  285. package/dist/tools/chunk-query.js +14 -6
  286. package/dist/tools/create-dir.js +9 -5
  287. package/dist/tools/delete-file.js +9 -5
  288. package/dist/tools/download-file.js +32 -7
  289. package/dist/tools/edit-file.js +52 -14
  290. package/dist/tools/enable-tools.js +6 -6
  291. package/dist/tools/executor.js +132 -27
  292. package/dist/tools/file-info.js +3 -1
  293. package/dist/tools/filter-tools.js +3 -3
  294. package/dist/tools/glob-tool.js +4 -1
  295. package/dist/tools/grep-tool.js +13 -10
  296. package/dist/tools/hidden-tools-block.js +6 -6
  297. package/dist/tools/index.js +16 -8
  298. package/dist/tools/list-dir.js +4 -2
  299. package/dist/tools/load-skill.js +7 -0
  300. package/dist/tools/mcp-call.js +15 -4
  301. package/dist/tools/meet-done.js +14 -0
  302. package/dist/tools/move-file.js +14 -7
  303. package/dist/tools/path-utils.js +29 -29
  304. package/dist/tools/pipeline-run.js +29 -7
  305. package/dist/tools/preview.js +1 -1
  306. package/dist/tools/process-ids.js +31 -0
  307. package/dist/tools/process-kill.js +9 -16
  308. package/dist/tools/process-list.js +1 -0
  309. package/dist/tools/process-log.js +11 -16
  310. package/dist/tools/process-wait.js +63 -0
  311. package/dist/tools/prompt-io.js +4 -3
  312. package/dist/tools/question.js +172 -25
  313. package/dist/tools/read-file.js +55 -34
  314. package/dist/tools/recall.js +14 -8
  315. package/dist/tools/registry.js +6 -5
  316. package/dist/tools/remember.js +8 -4
  317. package/dist/tools/scope-request.js +11 -6
  318. package/dist/tools/search-history.js +5 -2
  319. package/dist/tools/session-info.js +2 -0
  320. package/dist/tools/set-thinking.js +8 -4
  321. package/dist/tools/subagent.js +59 -39
  322. package/dist/tools/syntax-validator.js +292 -90
  323. package/dist/tools/user-input.js +22 -18
  324. package/dist/tools/web-browse.js +9 -3
  325. package/dist/tools/web-fetch.js +12 -23
  326. package/dist/tools/web-search.js +7 -5
  327. package/dist/tools/write-file.js +45 -15
  328. package/dist/ui/action-log.js +13 -0
  329. package/dist/ui/box.js +4 -3
  330. package/dist/ui/colors.js +2 -0
  331. package/dist/ui/diff.js +6 -5
  332. package/dist/ui/index.js +1 -0
  333. package/dist/ui/line-editor.js +230 -122
  334. package/dist/ui/line-math.js +10 -2
  335. package/dist/ui/md-formatter.js +57 -37
  336. package/dist/ui/output.js +8 -3
  337. package/dist/ui/plan-view.js +21 -10
  338. package/dist/ui/renderer.js +393 -67
  339. package/dist/ui/spinner.js +16 -5
  340. package/dist/ui/table.js +15 -17
  341. package/dist/ui/theme.js +143 -0
  342. package/dist/utils/child-run.js +20 -0
  343. package/dist/utils/error.js +1 -1
  344. package/dist/utils/index.js +2 -0
  345. package/dist/utils/retry.js +2 -2
  346. package/dist/utils/truncate.js +1 -1
  347. package/package.json +1 -1
@@ -1,15 +1,16 @@
1
+ // Спиннер прогресса: одна перезаписываемая строка в stderr (только TTY).
1
2
  import { pc } from "./colors";
2
3
  import stringWidth from "string-width";
3
4
  import { getTerminalWidth } from "./table";
4
5
  const FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
6
+ /** Поддерживается ли спиннер на потоке (TTY и не CI). */
5
7
  export function isSpinnerSupported(stream) {
6
8
  const s = stream ?? process.stderr;
7
9
  return Boolean(s.isTTY) && !process.env.CI;
8
10
  }
9
11
  /**
10
- * Zero-dependency ANSI spinner. Writes to stderr using a single
11
- * overwritten line (`\r` + text + clear-to-end). Disabled automatically
12
- * when the target stream is not a TTY.
12
+ * ANSI-спиннер без зависимостей. Пишет в stderr одной перезаписываемой строкой
13
+ * (`\r` + текст + чистка до конца). На не-TTY автоматически выключен.
13
14
  */
14
15
  export class Spinner {
15
16
  timer = null;
@@ -20,6 +21,7 @@ export class Spinner {
20
21
  stream;
21
22
  intervalMs;
22
23
  width;
24
+ startedAt = 0;
23
25
  constructor(opts = {}) {
24
26
  this.channel = opts.channel;
25
27
  this.stream = process.stderr;
@@ -27,23 +29,28 @@ export class Spinner {
27
29
  this.intervalMs = opts.intervalMs ?? 80;
28
30
  this.width = opts.width ?? getTerminalWidth();
29
31
  }
32
+ /** Крутится ли сейчас. */
30
33
  get running() {
31
34
  return this.timer !== null;
32
35
  }
36
+ /** Старт с сообщением (перезапускает, если уже крутится). */
33
37
  start(message) {
34
38
  if (!this.enabled)
35
39
  return;
36
40
  this.stop();
37
41
  this.message = this.truncate(message);
38
42
  this.frame = 0;
43
+ this.startedAt = Date.now();
39
44
  this.timer = setInterval(() => this.tick(), this.intervalMs);
40
45
  this.tick();
41
46
  }
47
+ /** Смена сообщения на лету. */
42
48
  setMessage(message) {
43
49
  this.message = this.truncate(message);
44
50
  if (this.timer)
45
51
  this.tick();
46
52
  }
53
+ /** Стоп со стиранием строки. */
47
54
  stop() {
48
55
  if (this.timer) {
49
56
  clearInterval(this.timer);
@@ -64,14 +71,18 @@ export class Spinner {
64
71
  break;
65
72
  acc += ch;
66
73
  }
67
- return acc + "…";
74
+ return `${acc}…`;
68
75
  }
69
76
  tick() {
70
77
  if (!this.timer)
71
78
  return;
72
79
  const frame = FRAMES[this.frame % FRAMES.length];
73
80
  this.frame++;
74
- const text = "\r" + pc.cyan(frame) + " " + this.message + "\x1b[K";
81
+ // Секунды показываем, лишь когда ожидание заметно: тихий хинт, что тул
82
+ // ещё работает, а не быстрый вывод.
83
+ const elapsed = Date.now() - this.startedAt;
84
+ const suffix = elapsed >= 3000 ? pc.dim(` · ${Math.floor(elapsed / 1000)}s`) : "";
85
+ const text = `\r${pc.cyan(frame)} ${this.message}${suffix}\x1b[K`;
75
86
  if (this.channel)
76
87
  this.channel.writeOverlay(text);
77
88
  else
package/dist/ui/table.js CHANGED
@@ -1,3 +1,4 @@
1
+ // Таблицы чата: парсинг markdown-строк, выравнивание колонок (без рамок, см. STYLE.md).
1
2
  import stringWidth from "string-width";
2
3
  import { pc } from "./colors";
3
4
  const ELLIPSIS = "…";
@@ -23,7 +24,7 @@ function truncate(text, width) {
23
24
  }
24
25
  return acc + ELLIPSIS;
25
26
  }
26
- /** Split a markdown table row `| a | b |` into cells. */
27
+ /** Режет строку `| a | b |` на ячейки. */
27
28
  export function splitRow(line) {
28
29
  const trimmed = line.trim();
29
30
  let body = trimmed;
@@ -33,7 +34,7 @@ export function splitRow(line) {
33
34
  body = body.slice(0, -1);
34
35
  return body.split("|").map((c) => c.trim());
35
36
  }
36
- /** Detect a markdown table separator row like `|---|---|` / `:---:` / `---:`. */
37
+ /** Детект строки-разделителя вида `|---|---|` / `:---:` / `---:`. */
37
38
  export function isSeparatorRow(line) {
38
39
  const trimmed = line.trim();
39
40
  if (!trimmed.includes("-"))
@@ -43,7 +44,7 @@ export function isSeparatorRow(line) {
43
44
  return false;
44
45
  return cells.every((c) => /^:?-{3,}:?$/.test(c));
45
46
  }
46
- /** Alignments encoded by a separator row, keyed by column index. */
47
+ /** Выравнивания из строки-разделителя, по индексу колонки. */
47
48
  export function parseAlignments(separator) {
48
49
  const out = {};
49
50
  splitRow(separator).forEach((cell, i) => {
@@ -57,8 +58,8 @@ export function parseAlignments(separator) {
57
58
  return out;
58
59
  }
59
60
  /**
60
- * Render a markdown table block into aligned box-drawing lines.
61
- * `tableLines` must include the header row and (optionally) the separator row.
61
+ * Рендерит markdown-блок таблицы в выровненные строки без рамок.
62
+ * `tableLines` включает строку шапки и опц. строку-разделитель.
62
63
  */
63
64
  export function formatTable(tableLines, opts = {}) {
64
65
  const align = opts.align ?? {};
@@ -85,9 +86,9 @@ export function formatTable(tableLines, opts = {}) {
85
86
  widths.push(w);
86
87
  }
87
88
  const maxWidth = opts.maxWidth ?? getTerminalWidth();
89
+ const GAP = " ";
88
90
  const contentWidth = widths.reduce((a, b) => a + b, 0);
89
- const borderWidth = columnCount * 3 + 1;
90
- const totalWidth = contentWidth + borderWidth;
91
+ const totalWidth = contentWidth + GAP.length * Math.max(0, columnCount - 1);
91
92
  if (totalWidth > maxWidth) {
92
93
  const over = totalWidth - maxWidth;
93
94
  let remaining = over;
@@ -106,33 +107,30 @@ export function formatTable(tableLines, opts = {}) {
106
107
  for (let c = 0; c < columnCount; c++) {
107
108
  const raw = row[c] ?? "";
108
109
  const cell = truncate(raw, widths[c]);
109
- const a = isHeader && align[c] === undefined ? "center" : (align[c] ?? "left");
110
+ const a = isHeader && align[c] === undefined ? "left" : (align[c] ?? "left");
110
111
  cells.push(pad(cell, widths[c], a));
111
112
  }
112
- const content = cells.map((c) => pc.dim("│ ") + c).join("") + pc.dim("│");
113
+ const content = cells.join(GAP);
113
114
  return isHeader ? pc.bold(content) : content;
114
115
  };
115
- const border = (l, m, r) => {
116
- const seg = widths.map((w) => "─".repeat(w + 2)).join(m);
117
- return pc.dim(l + seg + r);
118
- };
116
+ // Без box-рамок: жирная шапка, dim-линейка, выровненные колонки.
119
117
  const out = [];
120
- out.push(border("┌", "┬", "┐"));
121
118
  out.push(renderRow(headerRow, true));
122
- out.push(border("├", "┼", "┤"));
119
+ const ruleWidth = widths.reduce((a, b) => a + b, 0) + GAP.length * Math.max(0, columnCount - 1);
120
+ out.push(pc.dim("─".repeat(Math.max(3, Math.min(ruleWidth, maxWidth - 1)))));
123
121
  for (const row of dataRows) {
124
122
  out.push(renderRow(row, false));
125
123
  }
126
- out.push(border("└", "┴", "┘"));
127
124
  return out;
128
125
  }
126
+ /** Ширина терминала; вне TTY — 80. */
129
127
  export function getTerminalWidth() {
130
128
  if (process.stdout.isTTY && process.stdout.columns) {
131
129
  return process.stdout.columns;
132
130
  }
133
131
  return 80;
134
132
  }
135
- /** Build pipe lines from structured data and render them as a table. */
133
+ /** Строит pipe-строки из структурных данных и рендерит таблицей. */
136
134
  export function renderTable(headers, rows, opts = {}) {
137
135
  const lines = [];
138
136
  lines.push(`| ${headers.join(" | ")} |`);
@@ -0,0 +1,143 @@
1
+ // Тема чата: глифы, болтливость, акцентные цвета категорий тулов (см. STYLE.md).
2
+ import { pc } from "./colors";
3
+ /**
4
+ * Канонические глифы чата — единственный источник правды.
5
+ * См. `docs/design/ui/STYLE.md`. Свои маркеры по модулям не выдумывать.
6
+ */
7
+ export const glyph = {
8
+ /** Действие (дальше — локализованный ярлык тула). */
9
+ action: "◇",
10
+ success: "✓",
11
+ failure: "✗",
12
+ warning: "⚠",
13
+ /** Рассуждение / обдумывание. */
14
+ thinking: "✦",
15
+ question: "?",
16
+ /** Эхо ввода пользователя в транскрипте. */
17
+ user: "↵",
18
+ /** Деталь или хинт восстановления. */
19
+ detail: "↳",
20
+ /** Продолжение сгруппированного прогона. */
21
+ group: "│",
22
+ /** Строка сводных метрик. */
23
+ metric: "⟡",
24
+ /** Компакция / обновление. */
25
+ compact: "⟳",
26
+ };
27
+ /** Тайпгард болтливости. */
28
+ export function isVerbosity(value) {
29
+ return value === "quiet" || value === "normal" || value === "verbose";
30
+ }
31
+ /**
32
+ * Резолвит итоговую болтливость из конфига. Явный `verbosity` побеждает;
33
+ * иначе legacy-bool `verbose` маппится в `verbose`/`quiet`.
34
+ */
35
+ export function resolveVerbosity(ui) {
36
+ if (ui?.verbosity)
37
+ return ui.verbosity;
38
+ return ui?.verbose ? "verbose" : "quiet";
39
+ }
40
+ /** Акцентная метка действия (cyan). */
41
+ export function actionMark() {
42
+ return pc.cyan(glyph.action);
43
+ }
44
+ const CATEGORY_TOOLS = {
45
+ recon: new Set([
46
+ "read_file",
47
+ "list_dir",
48
+ "glob",
49
+ "grep",
50
+ "file_info",
51
+ "project_map",
52
+ "chunk_query",
53
+ "web_search",
54
+ "web_fetch",
55
+ "web_browse",
56
+ "search_history",
57
+ "recall",
58
+ "session_info",
59
+ "process_list",
60
+ "process_log",
61
+ "process_wait",
62
+ ]),
63
+ mutate: new Set([
64
+ "write_file",
65
+ "edit_file",
66
+ "create_dir",
67
+ "delete_file",
68
+ "move_file",
69
+ "attach_image",
70
+ ]),
71
+ execute: new Set([
72
+ "bash",
73
+ "process_kill",
74
+ "pipeline_run",
75
+ "browser",
76
+ "download_file",
77
+ "subagent",
78
+ "mcp_call",
79
+ ]),
80
+ meta: new Set([
81
+ "plan",
82
+ "plan_step",
83
+ "todo",
84
+ "verify",
85
+ "lsp_check",
86
+ "enable_tools",
87
+ "set_thinking",
88
+ "load_skill",
89
+ "remember",
90
+ ]),
91
+ };
92
+ /** Категория тула по имени. Неизвестные — meta. */
93
+ export function toolCategory(tool) {
94
+ for (const [category, tools] of Object.entries(CATEGORY_TOOLS)) {
95
+ if (tools.has(tool))
96
+ return category;
97
+ }
98
+ return "meta";
99
+ }
100
+ /**
101
+ * Акцентный цвет категории тула. Один цвет красит И глиф действия, И
102
+ * локализованный ярлык — они читаются как единое целое
103
+ * (см. `docs/design/ui/STYLE.md`). Цвета не пересекаются с семантическими
104
+ * success/warning/error, чтобы цветной ярлык не читался как исход.
105
+ */
106
+ export function toolAccent(tool) {
107
+ switch (toolCategory(tool)) {
108
+ case "recon":
109
+ return pc.cyan;
110
+ case "mutate":
111
+ return pc.magenta;
112
+ case "execute":
113
+ return pc.blue;
114
+ default:
115
+ return pc.dim;
116
+ }
117
+ }
118
+ /** Метка действия в цвете категории тула. */
119
+ export function actionMarkFor(tool) {
120
+ return toolAccent(tool)(glyph.action);
121
+ }
122
+ /** Зелёная метка успеха. */
123
+ export function successMark() {
124
+ return pc.green(glyph.success);
125
+ }
126
+ /** Красная метка провала — только реальные сбои, не мягкие гарды. */
127
+ export function failureMark() {
128
+ return pc.red(glyph.failure);
129
+ }
130
+ /** Жёлтая метка предупреждения — мягкие блоки, защищённые пути, нефатальное. */
131
+ export function warningMark() {
132
+ return pc.yellow(glyph.warning);
133
+ }
134
+ /** Dim-метка детали/хинта. */
135
+ export function detailMark() {
136
+ return pc.dim(glyph.detail);
137
+ }
138
+ /** Человеческая длительность: `ms` до секунды, `s` выше (как в мокапе). */
139
+ export function formatDuration(ms) {
140
+ if (ms < 1000)
141
+ return `${ms}ms`;
142
+ return `${(ms / 1000).toFixed(1)}s`;
143
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Общий финал ожидания child-процесса: закрывает дублированный `close`-хендлер
3
+ * в verifier / syntax-validator / lint-on-write (один клон на троих по fallow).
4
+ */
5
+ /**
6
+ * Резолвит промис раннера на `code === 0`, иначе реджектит обогащённой
7
+ * ошибкой (сообщение + `stdout`/`stderr`/`status` полями). Поведение 1:1
8
+ * с инлайн-версиями: текст сообщения формирует вызывающий.
9
+ */
10
+ export function settleChildClose(code, stdout, stderr, message, resolve, reject) {
11
+ if (code === 0) {
12
+ resolve({ stdout, stderr });
13
+ return;
14
+ }
15
+ const err = new Error(message);
16
+ err.stdout = stdout;
17
+ err.stderr = stderr;
18
+ err.status = code;
19
+ reject(err);
20
+ }
@@ -1,4 +1,4 @@
1
- /** Extract a human-readable message from an unknown thrown value. */
1
+ /** Извлекает читаемое сообщение из брошенного значения любого типа. */
2
2
  export function errMsg(e) {
3
3
  return e instanceof Error ? e.message : String(e);
4
4
  }
@@ -1,4 +1,6 @@
1
+ // Общие утилиты без зависимостей: сон, обрезка строк, бэкофф, ошибки, child-процессы.
1
2
  export { sleep } from "./sleep";
2
3
  export { truncate } from "./truncate";
3
4
  export { backoffDelay } from "./retry";
4
5
  export { errMsg } from "./error";
6
+ export { settleChildClose } from "./child-run";
@@ -11,7 +11,7 @@
11
11
  */
12
12
  export function backoffDelay(attempt, baseDelay, maxDelay, jitterFactor = 0) {
13
13
  const base = maxDelay !== undefined
14
- ? Math.min(baseDelay * Math.pow(2, attempt), maxDelay)
15
- : baseDelay * Math.pow(2, attempt);
14
+ ? Math.min(baseDelay * 2 ** attempt, maxDelay)
15
+ : baseDelay * 2 ** attempt;
16
16
  return base + Math.random() * baseDelay * jitterFactor;
17
17
  }
@@ -5,5 +5,5 @@
5
5
  export function truncate(s, max) {
6
6
  if (s.length <= max)
7
7
  return s;
8
- return s.slice(0, max - 3) + "...";
8
+ return `${s.slice(0, max - 3)}...`;
9
9
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "micro-models-agent",
3
- "version": "2.11.0",
3
+ "version": "2.12.0",
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": {