micro-models-agent 2.10.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 (359) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/dist/assets/app.js +22 -4
  3. package/dist/assets/index.html +29 -0
  4. package/dist/assets/js/dom.js +2 -1
  5. package/dist/assets/js/feed.js +38 -26
  6. package/dist/assets/js/format.js +1 -1
  7. package/dist/assets/js/rail.js +114 -0
  8. package/dist/assets/js/settings-controls.js +2 -2
  9. package/dist/assets/js/settings.js +246 -51
  10. package/dist/assets/js/store.js +3 -0
  11. package/dist/assets/js/tabs.js +104 -2
  12. package/dist/assets/styles.css +215 -66
  13. package/dist/cli/cache-line.js +1 -0
  14. package/dist/cli/command-suggest.js +5 -4
  15. package/dist/cli/commands.js +231 -122
  16. package/dist/cli/completer.js +132 -31
  17. package/dist/cli/index.js +1 -0
  18. package/dist/cli/json-payload.js +4 -4
  19. package/dist/cli/main.js +166 -61
  20. package/dist/cli/onboarding-commands.js +126 -0
  21. package/dist/cli/plugin-commands.js +2 -1
  22. package/dist/cli/relaunch.js +16 -13
  23. package/dist/cli/repl-commands-lsp.js +75 -0
  24. package/dist/cli/repl-commands-skills.js +105 -0
  25. package/dist/cli/repl-commands.js +589 -266
  26. package/dist/cli/repl.js +436 -177
  27. package/dist/cli/run-result.js +5 -6
  28. package/dist/cli/security-commands.js +37 -28
  29. package/dist/cli/setup-order.js +4 -55
  30. package/dist/cli/setup-prompt.js +3 -2
  31. package/dist/cli/setup.js +27 -107
  32. package/dist/cli/web-command.js +98 -0
  33. package/dist/config/budget.js +5 -5
  34. package/dist/config/config.js +103 -96
  35. package/dist/config/defaults.js +38 -8
  36. package/dist/config/domains.js +24 -27
  37. package/dist/config/env.js +46 -0
  38. package/dist/config/experts.js +2 -0
  39. package/dist/config/index.js +1 -0
  40. package/dist/config/paths.js +56 -0
  41. package/dist/config/redact.js +44 -0
  42. package/dist/config/registry-extra.js +334 -0
  43. package/dist/config/registry.js +584 -0
  44. package/dist/config/security.js +35 -36
  45. package/dist/config/timeouts.js +74 -0
  46. package/dist/config/utils.js +16 -15
  47. package/dist/core/agent/artifact-progress.js +59 -0
  48. package/dist/core/agent/artifact-resolve.js +79 -0
  49. package/dist/core/agent/audit-gate.js +7 -3
  50. package/dist/core/agent/compaction.js +2 -2
  51. package/dist/core/agent/constants.js +33 -4
  52. package/dist/core/agent/context-log.js +454 -0
  53. package/dist/core/agent/context-renderer.js +5 -0
  54. package/dist/core/agent/critic-gate.js +132 -0
  55. package/dist/core/agent/hallucination-gate.js +148 -38
  56. package/dist/core/agent/loop-state.js +15 -0
  57. package/dist/core/agent/prefix-monitor.js +1 -1
  58. package/dist/core/agent/reasoning-resolver.js +10 -1
  59. package/dist/core/agent/token-tracker.js +7 -4
  60. package/dist/core/agent/tool-batch.js +93 -18
  61. package/dist/core/agent/tool-images.js +18 -0
  62. package/dist/core/agent/tool-output.js +65 -11
  63. package/dist/core/agent/tool-pairing.js +60 -0
  64. package/dist/core/agent-moe.js +25 -24
  65. package/dist/core/agent.js +429 -108
  66. package/dist/core/bootstrap/agent-phase.js +66 -0
  67. package/dist/core/bootstrap/config-phase.js +86 -0
  68. package/dist/core/bootstrap/modules-phase.js +269 -0
  69. package/dist/core/bootstrap/provider-phase.js +183 -0
  70. package/dist/core/bootstrap/session-phase.js +204 -0
  71. package/dist/core/bootstrap/state.js +94 -0
  72. package/dist/core/bootstrap/workspace-phase.js +115 -0
  73. package/dist/core/bootstrap.js +92 -660
  74. package/dist/core/crash-handler.js +17 -7
  75. package/dist/core/environment.js +37 -12
  76. package/dist/core/host-plan.js +43 -0
  77. package/dist/core/host.js +23 -0
  78. package/dist/core/index.js +1 -0
  79. package/dist/core/prompt-builder.js +17 -1
  80. package/dist/core/prompt-overflow.js +42 -43
  81. package/dist/core/session-logger.js +122 -30
  82. package/dist/core/system-prompt.js +117 -0
  83. package/dist/core/version.js +6 -4
  84. package/dist/core/web-host.js +34 -0
  85. package/dist/core/workspace.js +19 -15
  86. package/dist/i18n/en.json +106 -21
  87. package/dist/i18n/index.js +37 -3
  88. package/dist/i18n/ru.json +109 -21
  89. package/dist/index.js +7 -3
  90. package/dist/llm/image-utils.js +55 -64
  91. package/dist/llm/llm-errors.js +9 -0
  92. package/dist/llm/model-loader.js +10 -32
  93. package/dist/llm/models-dev.js +121 -0
  94. package/dist/llm/openai-compat.js +146 -73
  95. package/dist/llm/orchestrator.js +33 -11
  96. package/dist/llm/provider-budget.js +2 -2
  97. package/dist/llm/provider-context.js +233 -0
  98. package/dist/llm/provider.js +1 -1
  99. package/dist/llm/response.js +5 -0
  100. package/dist/llm/token-counter.js +27 -11
  101. package/dist/logger/app-logger.js +48 -22
  102. package/dist/logger/file-log.js +28 -19
  103. package/dist/logger/index.js +1 -0
  104. package/dist/main.js +24285 -22447
  105. package/dist/migration/backup.js +14 -3
  106. package/dist/migration/detect.js +12 -3
  107. package/dist/migration/index.js +1 -0
  108. package/dist/modules/artifacts/store.js +9 -8
  109. package/dist/modules/browser/actions.js +6 -0
  110. package/dist/modules/browser/bridge-client.js +14 -12
  111. package/dist/modules/browser/bridge-path.js +4 -4
  112. package/dist/modules/browser/console-buffer.js +37 -0
  113. package/dist/modules/browser/cookie-store.js +5 -0
  114. package/dist/modules/browser/driver-types.js +1 -0
  115. package/dist/modules/browser/driver.js +19 -11
  116. package/dist/modules/browser/index.js +3 -1
  117. package/dist/modules/browser/module.js +2 -1
  118. package/dist/modules/browser/session.js +10 -30
  119. package/dist/modules/browser/snapshot.js +19 -13
  120. package/dist/modules/browser/types.js +1 -0
  121. package/dist/modules/certification/cli.js +28 -20
  122. package/dist/modules/certification/fact-checker.js +9 -1
  123. package/dist/modules/certification/loader.js +9 -2
  124. package/dist/modules/certification/manifest.js +83 -21
  125. package/dist/modules/certification/runner.js +23 -13
  126. package/dist/modules/certification/scenarios.js +20 -20
  127. package/dist/modules/certification/syntax-scenarios.js +1 -2
  128. package/dist/modules/context/chunk-query.js +11 -9
  129. package/dist/modules/context/fact-extractor.js +37 -39
  130. package/dist/modules/context/index.js +1 -0
  131. package/dist/modules/context/manager.js +106 -80
  132. package/dist/modules/critic/client.js +176 -0
  133. package/dist/modules/critic/evidence.js +81 -0
  134. package/dist/modules/critic/provider.js +45 -0
  135. package/dist/modules/critic/tools.js +78 -0
  136. package/dist/modules/critic/types.js +1 -0
  137. package/dist/modules/execution/audit-runners.js +28 -34
  138. package/dist/modules/execution/auditor.js +53 -49
  139. package/dist/modules/execution/execution-plugin.js +142 -102
  140. package/dist/modules/execution/index.js +1 -1
  141. package/dist/modules/execution/input-from.js +37 -13
  142. package/dist/modules/execution/module.js +368 -191
  143. package/dist/modules/execution/moe-executor.js +53 -26
  144. package/dist/modules/execution/plan-actions.js +320 -202
  145. package/dist/modules/execution/plan-checks.js +35 -0
  146. package/dist/modules/execution/plan-coverage.js +36 -33
  147. package/dist/modules/execution/plan-steps.js +11 -3
  148. package/dist/modules/execution/plan-store.js +83 -17
  149. package/dist/modules/execution/plan-tool.js +89 -35
  150. package/dist/modules/execution/plan-validator.js +30 -10
  151. package/dist/modules/execution/planner.js +22 -13
  152. package/dist/modules/execution/stuck-detector.js +196 -93
  153. package/dist/modules/execution/tracker.js +22 -8
  154. package/dist/modules/execution/verifier.js +69 -48
  155. package/dist/modules/execution/windows-commands.js +12 -12
  156. package/dist/modules/hallucination/artifact-claim.js +93 -0
  157. package/dist/modules/hallucination/confidence.js +13 -11
  158. package/dist/modules/hallucination/consistency.js +10 -2
  159. package/dist/modules/hallucination/detector.js +10 -5
  160. package/dist/modules/hallucination/factual.js +43 -26
  161. package/dist/modules/hallucination/index.js +1 -0
  162. package/dist/modules/hallucination/js-identifiers.js +44 -45
  163. package/dist/modules/hallucination/llm-judge.js +17 -12
  164. package/dist/modules/hallucination/success-claim.js +59 -0
  165. package/dist/modules/indexer/cache.js +52 -4
  166. package/dist/modules/indexer/index.js +1 -0
  167. package/dist/modules/indexer/map-command.js +2 -4
  168. package/dist/modules/indexer/map-select.js +16 -16
  169. package/dist/modules/indexer/module.js +47 -12
  170. package/dist/modules/indexer/project-profile.js +8 -7
  171. package/dist/modules/indexer/symbols.js +15 -15
  172. package/dist/modules/indexer/walker.js +159 -29
  173. package/dist/modules/lsp/check-tool.js +7 -5
  174. package/dist/modules/lsp/client.js +39 -39
  175. package/dist/modules/lsp/command.js +17 -24
  176. package/dist/modules/lsp/config.js +12 -11
  177. package/dist/modules/lsp/index.js +1 -0
  178. package/dist/modules/lsp/module.js +48 -46
  179. package/dist/modules/lsp/probe.js +13 -14
  180. package/dist/modules/lsp/project-root.js +14 -17
  181. package/dist/modules/lsp/startup-check.js +18 -16
  182. package/dist/modules/mcp/client.js +59 -62
  183. package/dist/modules/mcp/index.js +1 -0
  184. package/dist/modules/mcp/module.js +66 -37
  185. package/dist/modules/mcp/registry.js +5 -0
  186. package/dist/modules/memory/index.js +1 -0
  187. package/dist/modules/memory/module.js +12 -8
  188. package/dist/modules/memory/search.js +4 -1
  189. package/dist/modules/memory/store.js +40 -2
  190. package/dist/modules/onboarding/init.js +47 -0
  191. package/dist/modules/onboarding/meet.js +30 -0
  192. package/dist/modules/onboarding/mode.js +30 -0
  193. package/dist/modules/onboarding/prompts.js +43 -0
  194. package/dist/modules/pipelines/engine.js +10 -0
  195. package/dist/modules/pipelines/index.js +1 -0
  196. package/dist/modules/pipelines/parser.js +4 -1
  197. package/dist/modules/pipelines/template.js +4 -0
  198. package/dist/modules/plugins/builtin/lint-on-write.js +80 -67
  199. package/dist/modules/plugins/builtin/notify.js +2 -0
  200. package/dist/modules/plugins/index.js +1 -0
  201. package/dist/modules/plugins/loader.js +18 -3
  202. package/dist/modules/plugins/manager.js +37 -17
  203. package/dist/modules/pricing/index.js +10 -11
  204. package/dist/modules/pricing/prices.js +12 -12
  205. package/dist/modules/processes/index.js +1 -0
  206. package/dist/modules/processes/kill-tree.js +27 -31
  207. package/dist/modules/processes/registry.js +44 -25
  208. package/dist/modules/processes/runner.js +4 -4
  209. package/dist/modules/providers/capabilities.js +28 -0
  210. package/dist/modules/providers/create.js +3 -4
  211. package/dist/modules/providers/factory.js +7 -7
  212. package/dist/modules/providers/fallback.js +12 -12
  213. package/dist/modules/providers/health.js +4 -4
  214. package/dist/modules/providers/manager.js +50 -19
  215. package/dist/modules/providers/naming.js +15 -0
  216. package/dist/modules/providers/preflight.js +71 -0
  217. package/dist/modules/providers/presets.js +39 -8
  218. package/dist/modules/providers/registry.js +7 -2
  219. package/dist/modules/reasoning/policy.js +8 -6
  220. package/dist/modules/reasoning/probe.js +30 -25
  221. package/dist/modules/security/audit-log.js +19 -36
  222. package/dist/modules/security/audit-notifier.js +35 -75
  223. package/dist/modules/security/command-validator.js +99 -51
  224. package/dist/modules/security/content-scanner.js +8 -8
  225. package/dist/modules/security/data-sanitizer.js +9 -16
  226. package/dist/modules/security/encryption.js +32 -52
  227. package/dist/modules/security/index.js +2 -1
  228. package/dist/modules/security/network-validator.js +120 -43
  229. package/dist/modules/security/path-validator.js +61 -46
  230. package/dist/modules/security/protected-paths.js +73 -0
  231. package/dist/modules/security/rate-limiter.js +17 -49
  232. package/dist/modules/security/security-policies.js +25 -57
  233. package/dist/modules/security/session-encryption.js +32 -71
  234. package/dist/modules/security/session-isolation.js +15 -28
  235. package/dist/modules/session/auto-name.js +63 -0
  236. package/dist/modules/session/export.js +98 -0
  237. package/dist/modules/session/index.js +1 -0
  238. package/dist/modules/session/manager.js +79 -28
  239. package/dist/modules/session/module.js +4 -3
  240. package/dist/modules/session/store.js +57 -20
  241. package/dist/modules/setup/answers.js +35 -0
  242. package/dist/modules/setup/apply.js +79 -0
  243. package/dist/modules/setup/discovery.js +72 -0
  244. package/dist/modules/skills/index.js +1 -0
  245. package/dist/modules/skills/loader.js +9 -1
  246. package/dist/modules/skills/module.js +11 -0
  247. package/dist/modules/updater/changelog-reader.js +15 -16
  248. package/dist/modules/updater/checker.js +9 -4
  249. package/dist/modules/updater/dev-detect.js +7 -6
  250. package/dist/modules/updater/index.js +1 -0
  251. package/dist/modules/updater/module.js +17 -15
  252. package/dist/modules/user-profile/compressor.js +2 -0
  253. package/dist/modules/user-profile/index.js +1 -0
  254. package/dist/modules/user-profile/profile.js +10 -1
  255. package/dist/modules/webui/answer-api.js +29 -0
  256. package/dist/modules/webui/assets.js +50 -0
  257. package/dist/modules/webui/body.js +21 -0
  258. package/dist/modules/webui/commands-settings.js +209 -0
  259. package/dist/modules/webui/commands-shared.js +60 -0
  260. package/dist/modules/webui/commands.js +174 -0
  261. package/dist/modules/webui/config-api.js +134 -0
  262. package/dist/modules/webui/file-api.js +202 -0
  263. package/dist/modules/webui/forward.js +159 -0
  264. package/dist/modules/webui/history-api.js +112 -0
  265. package/dist/modules/webui/host-state.js +60 -0
  266. package/dist/modules/webui/i18n-api.js +9 -0
  267. package/dist/modules/webui/limits.js +6 -0
  268. package/dist/modules/webui/log-forward.js +20 -0
  269. package/dist/modules/webui/memory-commands.js +64 -0
  270. package/dist/modules/webui/model-cache.js +18 -0
  271. package/dist/modules/webui/module.js +148 -0
  272. package/dist/modules/webui/persist.js +24 -0
  273. package/dist/modules/webui/prompt-io.js +97 -0
  274. package/dist/modules/webui/providers-api.js +337 -0
  275. package/dist/modules/webui/providers-view.js +56 -0
  276. package/dist/modules/webui/reasoning-view.js +15 -0
  277. package/dist/modules/webui/run-agent.js +81 -0
  278. package/dist/modules/webui/server.js +284 -0
  279. package/dist/modules/webui/sessions-api.js +178 -0
  280. package/dist/modules/webui/settings-api.js +561 -0
  281. package/dist/modules/webui/setup-api.js +201 -0
  282. package/dist/modules/webui/state.js +74 -0
  283. package/dist/modules/webui/util.js +261 -0
  284. package/dist/output/bus.js +7 -2
  285. package/dist/output/channel.js +80 -28
  286. package/dist/output/format.js +2 -1
  287. package/dist/output/index.js +1 -0
  288. package/dist/output/json-sink.js +5 -3
  289. package/dist/output/machine.js +4 -3
  290. package/dist/output/session-sink.js +4 -4
  291. package/dist/tools/approve.js +4 -0
  292. package/dist/tools/attach-image.js +5 -4
  293. package/dist/tools/auto-fixer.js +26 -44
  294. package/dist/tools/auto-tags.js +83 -0
  295. package/dist/tools/bash.js +193 -116
  296. package/dist/tools/browser.js +76 -31
  297. package/dist/tools/chunk-query.js +14 -6
  298. package/dist/tools/create-dir.js +9 -5
  299. package/dist/tools/delete-file.js +9 -5
  300. package/dist/tools/download-file.js +32 -7
  301. package/dist/tools/edit-file.js +52 -14
  302. package/dist/tools/enable-tools.js +6 -6
  303. package/dist/tools/executor.js +132 -27
  304. package/dist/tools/file-info.js +3 -1
  305. package/dist/tools/filter-tools.js +3 -3
  306. package/dist/tools/glob-tool.js +4 -1
  307. package/dist/tools/grep-tool.js +13 -10
  308. package/dist/tools/hidden-tools-block.js +6 -6
  309. package/dist/tools/index.js +16 -8
  310. package/dist/tools/list-dir.js +4 -2
  311. package/dist/tools/load-skill.js +7 -0
  312. package/dist/tools/mcp-call.js +15 -4
  313. package/dist/tools/meet-done.js +14 -0
  314. package/dist/tools/move-file.js +14 -7
  315. package/dist/tools/path-utils.js +29 -29
  316. package/dist/tools/pipeline-run.js +29 -7
  317. package/dist/tools/preview.js +1 -1
  318. package/dist/tools/process-ids.js +31 -0
  319. package/dist/tools/process-kill.js +9 -16
  320. package/dist/tools/process-list.js +1 -0
  321. package/dist/tools/process-log.js +11 -16
  322. package/dist/tools/process-wait.js +63 -0
  323. package/dist/tools/prompt-io.js +4 -3
  324. package/dist/tools/question.js +172 -25
  325. package/dist/tools/read-file.js +55 -34
  326. package/dist/tools/recall.js +14 -8
  327. package/dist/tools/registry.js +6 -5
  328. package/dist/tools/remember.js +8 -4
  329. package/dist/tools/scope-request.js +11 -6
  330. package/dist/tools/search-history.js +5 -2
  331. package/dist/tools/session-info.js +2 -0
  332. package/dist/tools/set-thinking.js +8 -4
  333. package/dist/tools/subagent.js +59 -39
  334. package/dist/tools/syntax-validator.js +292 -90
  335. package/dist/tools/user-input.js +22 -18
  336. package/dist/tools/web-browse.js +9 -3
  337. package/dist/tools/web-fetch.js +12 -23
  338. package/dist/tools/web-search.js +7 -5
  339. package/dist/tools/write-file.js +45 -15
  340. package/dist/ui/action-log.js +13 -0
  341. package/dist/ui/box.js +4 -3
  342. package/dist/ui/colors.js +2 -0
  343. package/dist/ui/diff.js +6 -5
  344. package/dist/ui/index.js +1 -0
  345. package/dist/ui/line-editor.js +230 -122
  346. package/dist/ui/line-math.js +10 -2
  347. package/dist/ui/md-formatter.js +57 -37
  348. package/dist/ui/output.js +8 -3
  349. package/dist/ui/plan-view.js +21 -10
  350. package/dist/ui/renderer.js +393 -67
  351. package/dist/ui/spinner.js +16 -5
  352. package/dist/ui/table.js +15 -17
  353. package/dist/ui/theme.js +143 -0
  354. package/dist/utils/child-run.js +20 -0
  355. package/dist/utils/error.js +1 -1
  356. package/dist/utils/index.js +2 -0
  357. package/dist/utils/retry.js +2 -2
  358. package/dist/utils/truncate.js +1 -1
  359. package/package.json +1 -1
@@ -1,7 +1,9 @@
1
+ /** Тул поиска по истории сессий (JSONL всех сессий, cap результатов). */
1
2
  import * as fs from "fs";
2
3
  import { join } from "path";
3
- import { homedir } from "os";
4
4
  import { t } from "../i18n/index";
5
+ import { globalSessionsDir } from "../config/paths";
6
+ /** Ищет запрос в одном history.jsonl, складывает ужатые JSON-записи. */
5
7
  function searchFile(filePath, query, maxResults, results) {
6
8
  if (!fs.existsSync(filePath))
7
9
  return;
@@ -20,6 +22,7 @@ function searchFile(filePath, query, maxResults, results) {
20
22
  break;
21
23
  }
22
24
  }
25
+ /** Ищет по прошлым взаимодействиям всех сессий. Параметры: query, maxResults, sessionId. */
23
26
  export const searchHistoryTool = {
24
27
  name: "search_history",
25
28
  icon: "🕵️",
@@ -44,7 +47,7 @@ export const searchHistoryTool = {
44
47
  const query = String(args.query || "").toLowerCase();
45
48
  const maxResults = Number(args.maxResults) || 5;
46
49
  const sessionId = args.sessionId ? String(args.sessionId) : null;
47
- const sessionDir = join(homedir(), ".mma", "sessions");
50
+ const sessionDir = globalSessionsDir();
48
51
  const results = [];
49
52
  try {
50
53
  if (!fs.existsSync(sessionDir)) {
@@ -1,4 +1,6 @@
1
+ /** Тул метаданных текущей сессии (id, модель, бюджет контекста; alwaysOn). */
1
2
  import { t } from "../i18n/index";
3
+ /** Показывает сессию и загрузку контекстного бюджета. Без активной — пометка. */
2
4
  export const sessionInfoTool = {
3
5
  name: "session_info",
4
6
  icon: "ℹ️",
@@ -1,6 +1,11 @@
1
- // src/tools/set-thinking.ts
1
+ /** Тул ручной установки reasoning-уровня (транзиентный, с кулдауном). */
2
2
  import { t } from "../i18n/index";
3
+ /** Допустимые уровни reasoning. */
3
4
  const VALID_LEVELS = ["default", "none", "low", "medium", "high", "max"];
5
+ /**
6
+ * Фабрика тула set_thinking (уровень на следующий LLM-вызов; штатно рулит
7
+ * харнесс). Возврат: определение тула.
8
+ */
4
9
  export function createSetThinkingTool(state, config, getCurrentIteration) {
5
10
  return {
6
11
  name: "set_thinking",
@@ -32,7 +37,7 @@ export function createSetThinkingTool(state, config, getCurrentIteration) {
32
37
  output: t("tool.thinking_invalid_level", { level: requested }),
33
38
  };
34
39
  }
35
- // Cooldown check
40
+ // Проверка кулдауна.
36
41
  const currentIter = getCurrentIteration();
37
42
  const elapsed = currentIter - state.overrideIteration;
38
43
  if (elapsed > 0 && elapsed < config.overrideCooldown) {
@@ -44,7 +49,7 @@ export function createSetThinkingTool(state, config, getCurrentIteration) {
44
49
  }),
45
50
  };
46
51
  }
47
- // Clamp to configured bounds
52
+ // Кламп в настроенные границы.
48
53
  let level = requested;
49
54
  const levelOrder = ["none", "low", "medium", "high", "max"];
50
55
  const minIdx = levelOrder.indexOf(config.min);
@@ -59,7 +64,6 @@ export function createSetThinkingTool(state, config, getCurrentIteration) {
59
64
  level = config.max;
60
65
  clamped = true;
61
66
  }
62
- // Apply
63
67
  state.level = level;
64
68
  state.overrideIteration = currentIter;
65
69
  const msg = clamped
@@ -1,3 +1,4 @@
1
+ /** Тул изолированного субагента (свой контекст, скоуп, теги тулов, MoE-off). */
1
2
  import { t } from "../i18n/index";
2
3
  import { Agent } from "../core/agent";
3
4
  import { ContextManager } from "../modules/context/manager";
@@ -7,7 +8,7 @@ import { logSecurityBlock } from "../modules/security/audit-log";
7
8
  import { getSessionSecurityConfig } from "../modules/security/session-isolation";
8
9
  import { ArtifactStore } from "../modules/artifacts/store";
9
10
  import { ScopeDenialCollector, formatScopeRequest } from "./scope-request";
10
- /** Fixed system prompt (KV-cache friendly when stableSystemPrompt is on). */
11
+ /** Фиксированный системный промпт (KV-cache дружит при stableSystemPrompt). */
11
12
  export const SUBAGENT_SYSTEM_PROMPT_TEMPLATE = `You are a sub-agent working on a specific task. You have your own context window and tool set.
12
13
 
13
14
  Workflow rules:
@@ -15,11 +16,13 @@ Workflow rules:
15
16
  - For large outputs, write the result to a file with write_file instead of reproducing it in your answer.
16
17
  - If the task is big and decomposable, delegate parts to the subagent tool instead of doing everything in one context.
17
18
  - When you finish, return a concise final answer; do not repeat file contents verbatim if you already wrote them to disk.`;
19
+ /** Собирает системный промпт субагента (стабильный или с контекстом). */
18
20
  function buildSubagentSystemPrompt(context, stable) {
19
21
  if (stable)
20
22
  return SUBAGENT_SYSTEM_PROMPT_TEMPLATE;
21
23
  return `You are a sub-agent working on a specific task. ${context ? `Context: ${context}` : ""}`;
22
24
  }
25
+ /** Спавнит изолированного субагента. Параметры: task, scope-файлы, tool_tags, result_mode. */
23
26
  export const subagentTool = {
24
27
  name: "subagent",
25
28
  icon: "🤖",
@@ -82,14 +85,14 @@ export const subagentTool = {
82
85
  if (!task) {
83
86
  return { success: false, output: t("tool.name_or_task") };
84
87
  }
85
- // Get session-specific security config
88
+ // Сессионный security-конфиг.
86
89
  const securityConfig = ctx.sessionContext
87
90
  ? getSessionSecurityConfig(ctx.config, ctx.sessionContext)
88
91
  : ctx.config.security;
89
- // Security check: limit recursion depth. Read the depth from the SHARED
90
- // executor ctx (which nested sub-agents actually see) — `ctx.recursionDepth`
91
- // was captured once at bootstrap and never incremented, so the guard never
92
- // fired and a sub-agent could spawn sub-agents unbounded.
92
+ // Лимит глубины рекурсии. Глубину читаем из SHARED-контекста исполнителя
93
+ // (его видят вложенные субагенты) — `ctx.recursionDepth` снапшотился раз при
94
+ // bootstrap и не инкрементился, поэтому гард не срабатывал и субагент мог
95
+ // спавнить субагентов безгранично.
93
96
  const executor = ctx.toolExecutor;
94
97
  const parentDepth = executor?.getRecursionDepth?.() ?? (ctx.recursionDepth ?? 0);
95
98
  const maxDepth = securityConfig?.maxRecursionDepth ?? 3;
@@ -111,14 +114,14 @@ export const subagentTool = {
111
114
  if (!ctx.llmProvider || !ctx.toolExecutor) {
112
115
  return {
113
116
  success: false,
114
- output: "Sub-agent cannot run: missing llmProvider or toolExecutor in context",
117
+ output: t("tool.subagent_cannot_run"),
115
118
  };
116
119
  }
117
- // Defensive guard: if the caller requested specific tool tags but none of the
118
- // registered tools match, the sub-agent would have zero tools and would
119
- // hallucinate instead of acting. Warn the caller so it can correct the tags.
120
- // Uses getByTags (not getAllForLLM) because alwaysOn tools always match the
121
- // latter — the guard must test real tag coverage, not schema presence.
120
+ // Оборонительный гард: запрошенные tool_tags ни с чем не мэтчатся — у
121
+ // субагента ноль тулов, и он галлюцинирует вместо действий. Предупредить
122
+ // вызывающего для коррекции тегов. Проверка через getByTags (не
123
+ // getAllForLLM): alwaysOn мэтчатся всегда — гард меряет реальное покрытие,
124
+ // а не присутствие в схеме.
122
125
  if (toolTags && toolTags.length > 0) {
123
126
  const matched = ctx.toolExecutor.getRegistry().getByTags(toolTags);
124
127
  if (matched.length === 0) {
@@ -128,24 +131,34 @@ export const subagentTool = {
128
131
  };
129
132
  }
130
133
  }
134
+ // Сейв/рестор shared-скоупа исполнителя, чтобы субагент не мутировал скоуп
135
+ // родителя навсегда. Текущий скоуп — из shared-исполнителя, не `ctx.scope`:
136
+ // MoE зовёт тул с ad-hoc контекстом без scope — снапшот `ctx.scope` ресторил
137
+ // бы "unrestricted" и сносил изоляцию всей волне.
138
+ const parentScope = executor?.getScope?.() ?? ctx.scope;
139
+ const appliedScope = scope || { allowed_files: [], read_only_files: [] };
140
+ // Compare-and-restore: параллельная MoE-волна могла тем временем поставить
141
+ // свой скоуп — чужого свежего владельца не затирать.
142
+ const restoreScope = () => {
143
+ if (ctx.toolExecutor?.getScope?.() === appliedScope) {
144
+ ctx.toolExecutor.setScope(parentScope);
145
+ }
146
+ };
131
147
  try {
132
148
  const subContextManager = new ContextManager(ctx.config.contextWindow, ctx.config.contextBudget);
133
149
  const subPluginManager = new PluginManager();
134
- // Deterministic scope-denial tracking: when the child's file tools are
135
- // blocked by the scope guard, the denial is surfaced as a machine-readable
136
- // <scope-request> block in the result (see MoE executor / Router).
150
+ // Детерминированный трекинг scope-отказов: блокировки файловых тулов
151
+ // ребёнка скоуп-гардом всплывают машиночитаемым блоком <scope-request>
152
+ // в результате (см. MoE executor / Router).
137
153
  const scopeCollector = new ScopeDenialCollector();
138
154
  subPluginManager.register(scopeCollector.plugin, "builtin");
139
155
  const hallucinationDetector = new HallucinationDetector(ctx.baseDir, ctx.llmProvider);
140
- // Save/restore the shared executor scope so the sub-agent doesn't
141
- // permanently mutate the parent's scope.
142
- const parentScope = ctx.scope;
143
- ctx.toolExecutor.setScope(scope || { allowed_files: [], read_only_files: [] });
144
- // Register cleanup so the executor restores scope on timeout/abort
145
- // even when the agent's `finally` block never runs (abandoned promise).
146
- ctx.cleanup = () => ctx.toolExecutor?.setScope(parentScope);
147
- // Increment recursion depth on the shared executor ctx so NESTED
148
- // sub-agents see the deeper level (and the guard above can fire).
156
+ ctx.toolExecutor.setScope(appliedScope);
157
+ // Cleanup на исполнителе — рестор скоупа при таймауте/аборте, даже если
158
+ // `finally` агента не отработал (брошенный промис).
159
+ ctx.cleanup = restoreScope;
160
+ // Глубину — на shared-контекст исполнителя, чтобы ВЛОЖЕННЫЕ субагенты
161
+ // видели уровень глубже (и гард выше мог сработать).
149
162
  ctx.recursionDepth = currentDepth + 1;
150
163
  executor?.setRecursionDepth?.(currentDepth + 1);
151
164
  const systemPrompt = {
@@ -154,12 +167,11 @@ export const subagentTool = {
154
167
  essential: true,
155
168
  estimatedTokens: 150,
156
169
  };
157
- // MoE is a TOP-LEVEL orchestration mode: a sub-agent spawned by the
158
- // subagent tool must always run the plain single-agent loop. Sharing the
159
- // parent's config here made every MoE sub-agent re-enter runWithMoE —
160
- // planning its own subtasks and spawning nested sub-agents recursively
161
- // (bounded only by maxRecursionDepth), which hung execution for many
162
- // minutes with zero progress events.
170
+ // MoE — TOP-LEVEL режим оркестрации: субагент от тула subagent всегда идёт
171
+ // plain single-agent циклом. Шаринг родительского конфига заставлял каждого
172
+ // MoE-субагента реентерить runWithMoE — планировать свои сабтаски и рекурсивно
173
+ // спавнить вложенных субагентов (лимит — лишь maxRecursionDepth), что вешало
174
+ // исполнение на минуты без прогресс-событий.
163
175
  const subConfig = { ...ctx.config, moe: { ...ctx.config.moe, enabled: false } };
164
176
  const subDeps = {
165
177
  config: subConfig,
@@ -186,7 +198,10 @@ export const subagentTool = {
186
198
  }
187
199
  : undefined;
188
200
  if (!result.success) {
189
- let output = `Sub-agent failed: ${result.error}\nPartial output: ${result.text}`;
201
+ let output = t("tool.subagent_failed", {
202
+ error: String(result.error),
203
+ text: result.text,
204
+ });
190
205
  const scopeReq = scopeCollector.toScopeRequest();
191
206
  if (scopeReq)
192
207
  output += `\n${formatScopeRequest(scopeReq)}`;
@@ -209,29 +224,34 @@ export const subagentTool = {
209
224
  iterations: String(result.iterationCount),
210
225
  summary,
211
226
  }),
212
- // Structured path so callers (MoE executor) don't parse the
213
- // localized `output` string.
227
+ // Структурированный путь, чтобы вызывающие (MoE executor) не парсили
228
+ // локализованную строку `output`.
214
229
  artifactPath: abs,
215
230
  usage: pickUsage(),
216
231
  };
217
232
  }
218
233
  return {
219
234
  success: true,
220
- output: `Sub-agent completed:\n${result.text}\n\nIterations: ${result.iterationCount}`,
235
+ output: t("tool.subagent_completed", {
236
+ text: result.text,
237
+ iterations: String(result.iterationCount),
238
+ }),
221
239
  usage: pickUsage(),
222
240
  };
223
241
  }
224
242
  finally {
225
- // Restore the parent's exact scope: undefined means "no restrictions"
226
- // and must not become an empty scope (which denies everything).
227
- ctx.toolExecutor.setScope(parentScope);
228
- ctx.cleanup = undefined;
243
+ // Рестор точного скоупа родителя (compare-and-restore — свежий скоуп
244
+ // параллельного сиблинга не затирать). undefined — "без ограничений",
245
+ // пустым скоупом (запрет всего) становиться не должен.
246
+ restoreScope();
247
+ if (ctx.cleanup === restoreScope)
248
+ ctx.cleanup = undefined;
229
249
  ctx.recursionDepth = currentDepth;
230
250
  executor?.setRecursionDepth?.(currentDepth);
231
251
  }
232
252
  }
233
253
  catch (e) {
234
- return { success: false, output: `Sub-agent error: ${e.message}` };
254
+ return { success: false, output: t("tool.subagent_error", { error: e.message }) };
235
255
  }
236
256
  },
237
257
  };