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,14 @@
1
+ // Аудит-лог: запись действий агента в audit.jsonl (глобально или в каталог сессии).
1
2
  import { existsSync, mkdirSync, appendFileSync } from "fs";
2
- import { resolve, join } from "path";
3
- import { homedir } from "os";
4
3
  import { globalAuditNotifier } from "./audit-notifier";
5
- let _globalAuditDir = resolve(homedir(), ".mma", "logs");
4
+ import { auditLogFile, globalLogsDir } from "../../config/paths";
5
+ let _globalAuditDir = globalLogsDir();
6
6
  let _sessionAuditDir = null;
7
7
  function getAuditDir() {
8
8
  return _sessionAuditDir ?? _globalAuditDir;
9
9
  }
10
10
  /**
11
- * Set the session directory for audit logs. When set, all audit entries
12
- * are written to the session-specific directory instead of the global one.
11
+ * Назначить каталог аудита для сессии: записи идут туда вместо глобального.
13
12
  */
14
13
  export function setAuditSessionDir(dir) {
15
14
  _sessionAuditDir = dir;
@@ -17,15 +16,11 @@ export function setAuditSessionDir(dir) {
17
16
  mkdirSync(dir, { recursive: true, mode: 0o700 });
18
17
  }
19
18
  }
20
- /**
21
- * Clear the session directory — fall back to global audit dir.
22
- */
19
+ /** Сбросить каталог сессии — возврат к глобальному каталогу аудита. */
23
20
  export function clearAuditSessionDir() {
24
21
  _sessionAuditDir = null;
25
22
  }
26
- /**
27
- * Set the global audit log directory (used when no session dir is active).
28
- */
23
+ /** Назначить глобальный каталог аудита (когда каталог сессии не активен). */
29
24
  export function setGlobalAuditDir(dir) {
30
25
  _globalAuditDir = dir;
31
26
  if (!existsSync(dir)) {
@@ -33,7 +28,8 @@ export function setGlobalAuditDir(dir) {
33
28
  }
34
29
  }
35
30
  /**
36
- * Write an audit log entry
31
+ * Записать запись аудита в audit.jsonl и уведомить notifier.
32
+ * Ошибки записи/уведомления глушатся — аудит не должен ронять агента.
37
33
  */
38
34
  export function logAudit(entry) {
39
35
  const dir = getAuditDir();
@@ -42,23 +38,20 @@ export function logAudit(entry) {
42
38
  }
43
39
  try {
44
40
  const logEntry = JSON.stringify(entry);
45
- appendFileSync(join(dir, "audit.jsonl"), logEntry + "\n", "utf8");
41
+ appendFileSync(auditLogFile(dir), `${logEntry}\n`, "utf8");
46
42
  }
47
43
  catch {
48
- // Silently fail if we can't write to audit log
49
- // This shouldn't break the agent
44
+ // молча: невозможность записи не должна ломать агента
50
45
  }
51
- // Notify audit notifier if enabled
46
+ // Уведомить нотификатор аудита, если включён
52
47
  try {
53
48
  globalAuditNotifier.notify(entry);
54
49
  }
55
50
  catch {
56
- // Silently fail if notification fails
51
+ // молча: падение нотификации не должно ломать агента
57
52
  }
58
53
  }
59
- /**
60
- * Log a tool call
61
- */
54
+ /** Залогировать вызов тула. */
62
55
  export function logToolCall(sessionId, tool, success, details) {
63
56
  logAudit({
64
57
  timestamp: new Date().toISOString(),
@@ -69,9 +62,7 @@ export function logToolCall(sessionId, tool, success, details) {
69
62
  details,
70
63
  });
71
64
  }
72
- /**
73
- * Log a file write operation
74
- */
65
+ /** Залогировать запись файла. */
75
66
  export function logFileWrite(sessionId, path, success, details) {
76
67
  logAudit({
77
68
  timestamp: new Date().toISOString(),
@@ -82,9 +73,7 @@ export function logFileWrite(sessionId, path, success, details) {
82
73
  details,
83
74
  });
84
75
  }
85
- /**
86
- * Log a file delete operation
87
- */
76
+ /** Залогировать удаление файла. */
88
77
  export function logFileDelete(sessionId, path, success, details) {
89
78
  logAudit({
90
79
  timestamp: new Date().toISOString(),
@@ -95,9 +84,7 @@ export function logFileDelete(sessionId, path, success, details) {
95
84
  details,
96
85
  });
97
86
  }
98
- /**
99
- * Log a bash command execution
100
- */
87
+ /** Залогировать выполнение bash-команды. */
101
88
  export function logBashCommand(sessionId, command, success, details) {
102
89
  logAudit({
103
90
  timestamp: new Date().toISOString(),
@@ -108,9 +95,7 @@ export function logBashCommand(sessionId, command, success, details) {
108
95
  details,
109
96
  });
110
97
  }
111
- /**
112
- * Log a network request
113
- */
98
+ /** Залогировать сетевой запрос. */
114
99
  export function logNetworkRequest(sessionId, url, success, details) {
115
100
  logAudit({
116
101
  timestamp: new Date().toISOString(),
@@ -121,10 +106,8 @@ export function logNetworkRequest(sessionId, url, success, details) {
121
106
  details,
122
107
  });
123
108
  }
124
- /**
125
- * Log a security block event
126
- */
127
- export function logSecurityBlock(sessionId, action, reason, details) {
109
+ /** Залогировать срабатывание security-блока. */
110
+ export function logSecurityBlock(sessionId, _action, reason, details) {
128
111
  logAudit({
129
112
  timestamp: new Date().toISOString(),
130
113
  sessionId,
@@ -1,23 +1,19 @@
1
+ // Нотификации о security-событиях: файл + webhook с ретраями и очередью.
1
2
  import { writeFileSync, appendFileSync, existsSync, mkdirSync } from "fs";
2
3
  import { join, dirname } from "path";
3
- import { homedir } from "os";
4
4
  import { backoffDelay } from "../../utils/retry";
5
5
  import { defaultOutputBus } from "../../output";
6
- /**
7
- * Severity weights for comparison
8
- */
6
+ /** Веса severity для сравнения. */
9
7
  const SEVERITY_WEIGHTS = {
10
8
  low: 1,
11
9
  medium: 2,
12
10
  high: 3,
13
11
  critical: 4,
14
12
  };
15
- /**
16
- * Default audit notifier configuration
17
- */
13
+ /** Дефолтный конфиг нотификатора (выключен). */
18
14
  export const DEFAULT_AUDIT_NOTIFIER_CONFIG = {
19
15
  enabled: false,
20
- filePath: join(homedir(), ".mma", "logs", "audit-notifications.jsonl"),
16
+ filePath: join(globalLogsDir(), "audit-notifications.jsonl"),
21
17
  webhookTimeout: 5000,
22
18
  minSeverity: "medium",
23
19
  eventTypes: [
@@ -30,9 +26,7 @@ export const DEFAULT_AUDIT_NOTIFIER_CONFIG = {
30
26
  ],
31
27
  maxRetries: 3,
32
28
  };
33
- /**
34
- * Audit notifier for sending notifications about security events
35
- */
29
+ /** Нотификатор security-событий: файл + webhook с ретраями. */
36
30
  export class AuditNotifier {
37
31
  config;
38
32
  retryQueue = [];
@@ -41,60 +35,44 @@ export class AuditNotifier {
41
35
  this.config = { ...DEFAULT_AUDIT_NOTIFIER_CONFIG, ...config };
42
36
  this.ensureLogDirectory();
43
37
  }
44
- /**
45
- * Check if notifier is enabled
46
- */
38
+ /** Включён ли нотификатор. */
47
39
  isEnabled() {
48
40
  return this.config.enabled;
49
41
  }
50
- /**
51
- * Enable the notifier
52
- */
42
+ /** Включить нотификатор. */
53
43
  enable() {
54
44
  this.config.enabled = true;
55
45
  }
56
- /**
57
- * Disable the notifier
58
- */
46
+ /** Выключить нотификатор. */
59
47
  disable() {
60
48
  this.config.enabled = false;
61
49
  }
62
- /**
63
- * Update configuration
64
- */
50
+ /** Обновить конфиг. */
65
51
  updateConfig(config) {
66
52
  this.config = { ...this.config, ...config };
67
53
  this.ensureLogDirectory();
68
54
  }
69
- /**
70
- * Ensure the log directory exists
71
- */
55
+ /** Гарантировать каталог лога. */
72
56
  ensureLogDirectory() {
73
57
  if (this.config.filePath) {
74
58
  const dir = dirname(this.config.filePath);
75
59
  mkdirSync(dir, { recursive: true });
76
60
  }
77
61
  }
78
- /**
79
- * Check if an event type should be notified
80
- */
62
+ /** Подпадает ли тип события под нотификацию. */
81
63
  shouldNotify(eventType) {
82
64
  if (!this.config.enabled)
83
65
  return false;
84
66
  return this.config.eventTypes?.includes(eventType) ?? false;
85
67
  }
86
- /**
87
- * Check if a severity level should be notified
88
- */
68
+ /** Дотягивает ли severity до порога. */
89
69
  shouldNotifySeverity(severity) {
90
70
  const minSeverity = this.config.minSeverity ?? "medium";
91
71
  const minWeight = SEVERITY_WEIGHTS[minSeverity];
92
72
  const eventWeight = SEVERITY_WEIGHTS[severity];
93
73
  return eventWeight >= minWeight;
94
74
  }
95
- /**
96
- * Send a notification for an audit event
97
- */
75
+ /** Нотифицировать аудит-событие: файл + webhook, падение — в retry-очередь. */
98
76
  async notify(entry) {
99
77
  if (!this.config.enabled)
100
78
  return null;
@@ -112,9 +90,9 @@ export class AuditNotifier {
112
90
  details: entry.details ? { details: entry.details } : undefined,
113
91
  sessionId: entry.sessionId,
114
92
  };
115
- // Write to file
93
+ // Пишем в файл
116
94
  this.writeToFile(notification);
117
- // Send to webhook if configured
95
+ // Шлём в webhook, если задан
118
96
  if (this.config.webhookUrl) {
119
97
  try {
120
98
  await this.sendToWebhook(notification);
@@ -126,9 +104,7 @@ export class AuditNotifier {
126
104
  }
127
105
  return notification;
128
106
  }
129
- /**
130
- * Map audit log entry action to notification event type
131
- */
107
+ /** Маппинг action записи аудита в тип события нотификации. */
132
108
  mapEventType(action) {
133
109
  const typeMap = {
134
110
  tool_call: "tool_call",
@@ -140,11 +116,9 @@ export class AuditNotifier {
140
116
  };
141
117
  return typeMap[action] || null;
142
118
  }
143
- /**
144
- * Determine severity from audit log entry
145
- */
119
+ /** Severity из записи аудита (по типу action). */
146
120
  determineSeverity(entry) {
147
- // Default severity based on action type
121
+ // Дефолтная severity по типу action
148
122
  const typeSeverity = {
149
123
  security_block: "high",
150
124
  bash_command: "high",
@@ -157,23 +131,22 @@ export class AuditNotifier {
157
131
  };
158
132
  return typeSeverity[entry.action] || "low";
159
133
  }
160
- /**
161
- * Write notification to file
162
- */
134
+ /** Записать нотификацию в файл. */
163
135
  writeToFile(notification) {
164
136
  if (!this.config.filePath)
165
137
  return;
166
138
  try {
167
139
  const line = JSON.stringify(notification);
168
- appendFileSync(this.config.filePath, line + "\n", "utf8");
140
+ appendFileSync(this.config.filePath, `${line}\n`, "utf8");
169
141
  }
170
142
  catch (error) {
171
143
  defaultOutputBus.log("error", "audit", `[AuditNotifier] Failed to write to file: ${error instanceof Error ? error.message : String(error)}`, { persist: true });
172
144
  }
173
145
  }
174
146
  /**
175
- * Send notification to webhook. Throws on failure — retry policy is the
176
- * caller's decision (notify() queues; processRetryQueue() counts attempts).
147
+ * Отправить нотификацию в webhook. Падение бросает исключение — политику
148
+ * ретраев решает вызывающий (notify() кладёт в очередь, processRetryQueue()
149
+ * считает попытки).
177
150
  */
178
151
  async sendToWebhook(notification) {
179
152
  if (!this.config.webhookUrl)
@@ -195,18 +168,14 @@ export class AuditNotifier {
195
168
  clearTimeout(timeoutId);
196
169
  }
197
170
  }
198
- /**
199
- * Add notification to retry queue
200
- */
171
+ /** Положить нотификацию в retry-очередь. */
201
172
  addToRetryQueue(notification) {
202
173
  this.retryQueue.push({ entry: notification, retries: 0 });
203
174
  if (!this.isProcessing) {
204
175
  this.processRetryQueue();
205
176
  }
206
177
  }
207
- /**
208
- * Process the retry queue
209
- */
178
+ /** Разобрать retry-очередь (бэкофф, лимит попыток). */
210
179
  async processRetryQueue() {
211
180
  if (this.retryQueue.length === 0 || this.isProcessing)
212
181
  return;
@@ -224,11 +193,11 @@ export class AuditNotifier {
224
193
  this.retryQueue.shift();
225
194
  }
226
195
  catch (error) {
227
- // sendToWebhook no longer queues copies itself — the retry counter
228
- // actually increments and maxRetries is reachable.
196
+ // sendToWebhook сам в очередь не кладёт — счётчик ретраев реально
197
+ // растёт, и maxRetries достижим.
229
198
  item.retries++;
230
199
  defaultOutputBus.log("warn", "audit", `[AuditNotifier] Webhook retry ${item.retries} failed: ${error instanceof Error ? error.message : String(error)}`, { persist: true });
231
- // Exponential backoff before the next attempt on the same head item.
200
+ // Экспоненциальный бэкофф перед следующей попыткой того же head-элемента.
232
201
  const delay = backoffDelay(item.retries, 1000);
233
202
  await new Promise((resolve) => setTimeout(resolve, delay));
234
203
  }
@@ -238,9 +207,7 @@ export class AuditNotifier {
238
207
  this.isProcessing = false;
239
208
  }
240
209
  }
241
- /**
242
- * Read notifications from file
243
- */
210
+ /** Прочитать нотификации из файла (последние N). */
244
211
  readNotifications(limit = 100) {
245
212
  if (!this.config.filePath || !existsSync(this.config.filePath)) {
246
213
  return [];
@@ -255,18 +222,14 @@ export class AuditNotifier {
255
222
  return [];
256
223
  }
257
224
  }
258
- /**
259
- * Clear all notifications
260
- */
225
+ /** Очистить нотификации (файл + очередь). */
261
226
  clearNotifications() {
262
227
  if (this.config.filePath) {
263
228
  writeFileSync(this.config.filePath, "", "utf8");
264
229
  }
265
230
  this.retryQueue = [];
266
231
  }
267
- /**
268
- * Get notification statistics
269
- */
232
+ /** Статистика нотификаций: всего, по severity, по типам. */
270
233
  getStats() {
271
234
  const notifications = this.readNotifications();
272
235
  const bySeverity = { low: 0, medium: 0, high: 0, critical: 0 };
@@ -293,15 +256,12 @@ export class AuditNotifier {
293
256
  };
294
257
  }
295
258
  }
296
- /**
297
- * Global audit notifier instance
298
- */
259
+ /** Глобальный инстанс нотификатора аудита. */
299
260
  export const globalAuditNotifier = new AuditNotifier();
300
- /**
301
- * Create an audit notifier with custom configuration
302
- */
261
+ /** Создать нотификатор аудита с кастомным конфигом. */
303
262
  export function createAuditNotifier(config) {
304
263
  return new AuditNotifier(config);
305
264
  }
306
- // Import readFileSync for readNotifications
265
+ // Импорт readFileSync для readNotifications
307
266
  import { readFileSync } from "fs";
267
+ import { globalLogsDir } from "../../config/paths";