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
@@ -0,0 +1,204 @@
1
+ /**
2
+ * Фаза 4 bootstrap: сессии, context-лог, менеджер контекста и ToolContext.
3
+ *
4
+ * Порядок 1:1 с исходником: SessionStore/SessionManager (+ привязка ленивого
5
+ * session id фазы провайдера, autoSave) → запись context-probe в сессию фоном
6
+ * → ContextLogger (opt-in) → TokenCounter/activeToolTags/ContextManager →
7
+ * общий бокс живого конфига → ToolContext с живыми геттерами (config,
8
+ * sessionId, sessionContext, sessionManager, capabilities) → ToolExecutor →
9
+ * HallucinationDetector.
10
+ *
11
+ * Shared mutable state вынесен вместе с фазой: `configRef` (живой бокс
12
+ * конфига) и сам `toolCtx` возвращаются наружу следующим фазам.
13
+ */
14
+ import { join } from "path";
15
+ import { ContextManager } from "../../modules/context/manager";
16
+ import { TokenCounter } from "../../llm/token-counter";
17
+ import { ToolExecutor } from "../../tools/executor";
18
+ import { HallucinationDetector } from "../../modules/hallucination/detector";
19
+ import { SessionStore, SessionManager } from "../../modules/session/index";
20
+ import { BUILTIN_PROVIDERS } from "../../modules/providers/presets";
21
+ import { resolveModelCapabilities } from "../../modules/providers/capabilities";
22
+ import { ContextLogger } from "../agent/context-log";
23
+ import { t } from "../../i18n/index";
24
+ import { errMsg } from "../../utils";
25
+ /**
26
+ * Поднимает сессии, контекст и общий ToolContext.
27
+ * @param input связный вход фазы (см. SessionPhaseInput).
28
+ * @returns менеджер сессий, контекст, toolCtx и исполнители.
29
+ */
30
+ export async function setupSessionPhase(input) {
31
+ const { config, logger, dir, baseDir, exitOnComplete, contextLogFlag, contextProbePromise, capabilitiesRef, llmProvider, bindSessionManager, toolRegistry, pluginManager, } = input;
32
+ const sessionDir = join(dir, "sessions");
33
+ const sessionStore = new SessionStore(sessionDir, config.security?.sessionEncryption);
34
+ sessionStore.init();
35
+ // Архивируем сессии старше 30 дней (gzip истории + метка rotated). Был мёртвый
36
+ // код — не вызывался, старые сессии не сжимались. Отложено, чтобы синхронное
37
+ // сжатие старт не тормозило; сбои не фатальны.
38
+ setTimeout(() => {
39
+ try {
40
+ sessionStore.rotateOldSessions();
41
+ }
42
+ catch (err) {
43
+ logger.warn(`session rotation failed: ${String(err)}`);
44
+ }
45
+ }, 0);
46
+ const sessionManager = new SessionManager(sessionStore, {
47
+ model: config.model,
48
+ contextWindow: config.contextWindow,
49
+ projectDir: baseDir,
50
+ maxSessions: config.session.maxSessions,
51
+ isolation: config.sessionIsolation,
52
+ });
53
+ bindSessionManager(() => sessionManager);
54
+ if (config.session.autoSave && !sessionManager.getActive()) {
55
+ sessionManager.create();
56
+ }
57
+ // Context-пробу — в сессию сразу по резолву, в ОБОИХ режимах (интерактив и
58
+ // one-shot). Раньше писал только REPL, и one-shot терял расхождение
59
+ // загруженного vs настроенного контекста целиком (наблюдалось: LM Studio
60
+ // держит 86016 при contextWindow 32768 — молча).
61
+ void contextProbePromise
62
+ .then((probe) => {
63
+ if (!probe)
64
+ return;
65
+ try {
66
+ sessionManager.appendLog({
67
+ ts: new Date().toISOString(),
68
+ type: "context_probe",
69
+ content: `model=${probe.model} actual=${probe.actual} configured=${config.contextWindow}`,
70
+ });
71
+ }
72
+ catch {
73
+ // best-effort
74
+ }
75
+ })
76
+ .catch(() => { });
77
+ // Git-style лог контекста (opt-in через --context-log / конфиг / env). Рядом
78
+ // с файлами сессии, чтобы путешествовал с ней. Best-effort: лог не должен
79
+ // ломать прогон никогда.
80
+ const contextLogEnabled = contextLogFlag === true || config.contextLog?.enabled === true;
81
+ let contextLogger;
82
+ if (contextLogEnabled) {
83
+ const activeMeta = sessionManager.getActiveMeta();
84
+ if (activeMeta) {
85
+ try {
86
+ contextLogger = new ContextLogger({
87
+ path: join(sessionStore.getSessionDir(activeMeta.id), "context.diff"),
88
+ sessionId: activeMeta.id,
89
+ model: config.model,
90
+ contextWindow: config.contextWindow,
91
+ redact: config.contextLog?.redact !== false,
92
+ });
93
+ }
94
+ catch (err) {
95
+ logger.warn(t("error.context_log_init", { error: errMsg(err) }));
96
+ contextLogger = undefined;
97
+ }
98
+ }
99
+ }
100
+ const tokenCounter = new TokenCounter(config.model);
101
+ // Мутабельный набор активных тегов тулов — общий у цикла агента и тула
102
+ // `enable_tools`. Цикл перечитывает его каждую итерацию для пересборки
103
+ // видимого модели набора; enable_tools дотолкивает теги внутрь. При выключенном
104
+ // on-demand набор пуст — легаси «все тулы» (getAllForLLM на пустых отдаёт всё).
105
+ const enableOnDemand = config.tools?.enableOnDemand !== false;
106
+ const activeToolTags = enableOnDemand
107
+ ? config.tools?.defaultTags
108
+ ? [...config.tools.defaultTags]
109
+ : []
110
+ : [];
111
+ const contextManager = new ContextManager(config.contextWindow, config.contextBudget, tokenCounter);
112
+ // Общий бокс ЖИВОГО конфига. `Agent.reconfigure` меняет и deps.config, и
113
+ // этот бокс, чтобы захватившие ссылку при bootstrap — toolCtx.config,
114
+ // валидаторы, правила тулов — видели ТЕКУЩИЕ настройки после /model use или
115
+ // визарда. Фиксация значения раз означала: тулы весь сеанс enforced
116
+ // до-reconfigure security/maxTool.
117
+ const configRef = { current: config };
118
+ const toolCtx = {
119
+ baseDir,
120
+ logger,
121
+ exitOnComplete,
122
+ contextManager,
123
+ activeToolTags,
124
+ recursionDepth: 0,
125
+ fileOperationsCount: 0,
126
+ sessionHistory: {
127
+ append: async (type, content) => {
128
+ const meta = sessionManager.getActiveMeta();
129
+ if (!meta)
130
+ return;
131
+ sessionManager.appendMessage({
132
+ role: "tool",
133
+ content: typeof content === "string" ? content : JSON.stringify(content),
134
+ name: type,
135
+ timestamp: new Date().toISOString(),
136
+ });
137
+ },
138
+ },
139
+ sessionLog: {
140
+ plan: (event, detail, iteration) => {
141
+ sessionManager.appendLog({
142
+ ts: new Date().toISOString(),
143
+ type: "plan",
144
+ tool: event,
145
+ content: detail,
146
+ ...(iteration !== undefined ? { iteration } : {}),
147
+ });
148
+ },
149
+ },
150
+ };
151
+ // `config` — ЖИВОЙ геттер поверх общего configRef: тулы и валидаторы видят
152
+ // ТЕКУЩИЕ настройки после reconfigure.
153
+ Object.defineProperty(toolCtx, "config", {
154
+ get: () => configRef.current,
155
+ configurable: true,
156
+ });
157
+ // `sessionId`/`sessionContext` — ЖИВЫЕ геттеры поверх менеджера сессий, а не
158
+ // снимок при bootstrap. Снимок пинил сессию старта, и после REPL /new или
159
+ // /resume записи audit.jsonl новой сессии тегировались id ПРЕДЫДУЩЕЙ
160
+ // (наблюдалось: записи ses_msyghz8w с id ses_msyg892p_78kqhc), а sessionHistory
161
+ // читал живую мету. Теперь потребители ctx.sessionId — аудит, реестр
162
+ // процессов, счётчики файлов — всегда видят реально активную сессию.
163
+ Object.defineProperty(toolCtx, "sessionId", {
164
+ get: () => sessionManager.getActiveMeta()?.id,
165
+ configurable: true,
166
+ });
167
+ Object.defineProperty(toolCtx, "sessionContext", {
168
+ get: () => sessionManager.getSessionContext() ?? undefined,
169
+ configurable: true,
170
+ });
171
+ Object.defineProperty(toolCtx, "sessionManager", {
172
+ get: () => sessionManager,
173
+ configurable: true,
174
+ });
175
+ // Возможности активной модели — LIVE: пресет провайдера + native-probe +
176
+ // конфиг-оверрайд пересчитываются при каждом обращении тула, поэтому
177
+ // инструменты (browser и т.п.) видят актуальный vision/tools после
178
+ // смены модели или /provider use.
179
+ Object.defineProperty(toolCtx, "capabilities", {
180
+ get: () => {
181
+ const cfg = configRef.current;
182
+ const spec = BUILTIN_PROVIDERS.find((p) => p.type === cfg.provider.type);
183
+ return resolveModelCapabilities(spec?.capabilities, capabilitiesRef.probe, cfg.modelCapabilities?.[cfg.model]);
184
+ },
185
+ configurable: true,
186
+ });
187
+ const toolExecutor = new ToolExecutor(toolRegistry, toolCtx, pluginManager);
188
+ toolCtx.llmProvider = llmProvider;
189
+ toolCtx.toolExecutor = toolExecutor;
190
+ const hallucinationDetector = new HallucinationDetector(baseDir, llmProvider, {
191
+ judgeEnabled: config.hallucination?.judge?.enabled ?? false,
192
+ });
193
+ return {
194
+ sessionManager,
195
+ sessionStore,
196
+ contextLogger,
197
+ contextManager,
198
+ configRef,
199
+ activeToolTags,
200
+ toolCtx,
201
+ toolExecutor,
202
+ hallucinationDetector,
203
+ };
204
+ }
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Общее состояние и мелкие хелперы фаз bootstrap.
3
+ *
4
+ * Здесь живёт то, что нужно нескольким фазам сразу: флаг one-shot режима,
5
+ * регистрация встроенных плагинов, таймаут-обёртка, нормализация уровня
6
+ * лога и загрузка AGENTS.md-блоков. Своей логики фаза не несёт — только
7
+ * разделяемые примитивы, чтобы фазы не дублировали их друг у друга.
8
+ */
9
+ import { estimateTokens } from "../../llm/token-counter";
10
+ import { existsSync, readFileSync } from "fs";
11
+ import { join } from "path";
12
+ import { projectMmaDir } from "../../config/paths";
13
+ /**
14
+ * One-shot CLI-подкоманды (`session show`, `usage`, `config` …) рисуют итог и
15
+ * выходят. Фоновый стартовый health-check спавнит дочерний процесс (LSP/tsc),
16
+ * который `process.exit` не пожинает — на Windows сирота держит stdout-пайп, и
17
+ * пайп команды (`mma session show <id> | cat`) виснет. Подкоманды агента не
18
+ * гоняют, поэтому чек там пропускается.
19
+ */
20
+ let oneShotMode = false;
21
+ /**
22
+ * Включает one-shot режим (пропуск фонового health-check для подкоманд).
23
+ * @param value true — подкоманда без агента.
24
+ */
25
+ export function setOneShotMode(value) {
26
+ oneShotMode = value;
27
+ }
28
+ /**
29
+ * Проверяет one-shot режим (нужен фазе модулей для пропуска health-check).
30
+ * @returns true — фоновый стартовый чек пропускается.
31
+ */
32
+ export function isOneShotMode() {
33
+ return oneShotMode;
34
+ }
35
+ /** Регистрация встроенного плагина модуля: пометка + регистрация. */
36
+ export function registerBuiltinPlugin(pm, plugin) {
37
+ if (!plugin)
38
+ return;
39
+ plugin.isBuiltin = true;
40
+ pm.register(plugin);
41
+ }
42
+ /** Отклоняет `promise` через `ms`; таймер победителя снимается. */
43
+ export function withTimeout(promise, ms) {
44
+ return new Promise((resolve, reject) => {
45
+ const timer = setTimeout(() => reject(new Error(`timeout after ${ms}ms`)), ms);
46
+ promise.then((v) => {
47
+ clearTimeout(timer);
48
+ resolve(v);
49
+ }, (e) => {
50
+ clearTimeout(timer);
51
+ reject(e);
52
+ });
53
+ });
54
+ }
55
+ const VALID_LOG_LEVELS = ["debug", "info", "warn", "error"];
56
+ /** Нормализует строку из конфига в LogLevel (без `as any`); неизвестное → info. */
57
+ export function normalizeLogLevel(value) {
58
+ return value && VALID_LOG_LEVELS.includes(value) ? value : "info";
59
+ }
60
+ /** Кандидаты AGENTS.md по приоритету: проект, проектный `.mma`, глобальный. */
61
+ export function agentsMdPaths(baseDir, configDir) {
62
+ return [
63
+ join(baseDir, "AGENTS.md"),
64
+ join(projectMmaDir(baseDir), "AGENTS.md"),
65
+ join(configDir, "AGENTS.md"),
66
+ ];
67
+ }
68
+ /**
69
+ * Грузит AGENTS.md из каталога проекта и конфиг-каталога (по приоритету).
70
+ * Каждый найденный непустой файл — prompt-блок высокого приоритета.
71
+ * @param baseDir workspace; @param dir каталог конфига; @param skip пропустить загрузку.
72
+ * @returns блоки инструкций для системного промпта.
73
+ */
74
+ export function loadAgentsMdBlocks(baseDir, dir, skip) {
75
+ if (skip)
76
+ return [];
77
+ const blocks = [];
78
+ const candidates = agentsMdPaths(baseDir, dir);
79
+ for (const p of candidates) {
80
+ if (existsSync(p)) {
81
+ const content = readFileSync(p, "utf-8").trim();
82
+ if (content) {
83
+ blocks.push({
84
+ content,
85
+ priority: "high",
86
+ essential: false,
87
+ estimatedTokens: estimateTokens(content),
88
+ kind: "instructions",
89
+ });
90
+ }
91
+ }
92
+ }
93
+ return blocks;
94
+ }
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Фаза 3 bootstrap: workspace, окружение, индекс проекта, скиллы и тулы.
3
+ *
4
+ * Порядок 1:1 с исходником: резолв baseDir (громкий фол на несуществующем
5
+ * `-d`) → отчёт окружения → построение индекса проекта → загрузка скиллов →
6
+ * реестр тулов → менеджер плагинов → системный systemInfo-блок.
7
+ */
8
+ import { join, resolve } from "path";
9
+ import { statSync } from "fs";
10
+ import { buildSystemInfo } from "../system-prompt";
11
+ import { collectEnvironment, logEnvironment } from "../environment";
12
+ import { IndexerModule } from "../../modules/indexer/index";
13
+ import { SkillsLoader, SkillsModule } from "../../modules/skills/index";
14
+ import { ToolRegistry, registerAllTools } from "../../tools/index";
15
+ import { PluginManager } from "../../modules/plugins/manager";
16
+ import { estimateTokens } from "../../llm/token-counter";
17
+ import { t } from "../../i18n/index";
18
+ import { homedir } from "os";
19
+ import { projectMmaDir } from "../../config/paths";
20
+ /**
21
+ * Резолвит workspace агента. Несуществующий `-d` (классика: шелл режет по
22
+ * пробелам, висячий бэкслэш экранирует кавычку) должен упасть ГРОМКО здесь —
23
+ * иначе агент молча работает не в том каталоге и уверяет, что всё хорошо.
24
+ */
25
+ export function resolveBaseDir(projectDir) {
26
+ if (!projectDir)
27
+ return process.cwd();
28
+ const abs = resolve(projectDir);
29
+ let isDir = false;
30
+ try {
31
+ isDir = statSync(abs).isDirectory();
32
+ }
33
+ catch {
34
+ isDir = false;
35
+ }
36
+ if (!isDir) {
37
+ throw new Error(`workspace directory does not exist: ${abs} (received ${JSON.stringify(projectDir)} — ` +
38
+ `if the path contains spaces, quote it without a trailing backslash)`);
39
+ }
40
+ return abs;
41
+ }
42
+ /**
43
+ * Готовит workspace, окружение, индекс, скиллы и реестр тулов.
44
+ * @param config живой конфиг; @param logger настроенный логгер;
45
+ * @param dir каталог конфига; @param projectDir запрошенный workspace (опционально);
46
+ * @param profile загруженный профиль пользователя (из фазы провайдера).
47
+ * @returns каталог, отчёт окружения, индекс, скиллы, реестр, system-блок.
48
+ */
49
+ export async function setupWorkspacePhase(config, logger, dir, projectDir, profile) {
50
+ const baseDir = resolveBaseDir(projectDir);
51
+ // Кросс-девайс диагностика: полный отчёт окружения (ОС, рантайм, engines,
52
+ // PATH-тулы, провайдер/ретраи, playwright) на каждый старт.
53
+ const envReport = collectEnvironment({
54
+ configDir: dir,
55
+ baseDir,
56
+ config,
57
+ scanTools: process.env.NODE_ENV !== "test",
58
+ });
59
+ logEnvironment(envReport, logger);
60
+ for (const warning of envReport.warnings) {
61
+ logger.warn(warning);
62
+ }
63
+ const projectMapCacheDir = projectMmaDir(baseDir);
64
+ const indexerModule = new IndexerModule({
65
+ baseDir,
66
+ cacheDir: projectMapCacheDir,
67
+ });
68
+ try {
69
+ // Строим (или грузим из кэша) индекс проекта. На большом workspace первый
70
+ // обход подвисает старт без вывода — анонсируем оба конца, чтобы тишина
71
+ // была объяснена.
72
+ logger.info(t("env.indexing"));
73
+ const index = await indexerModule.buildIndex();
74
+ if (index) {
75
+ logger.info(t("env.indexed", { files: String(index.files.length) }));
76
+ }
77
+ else {
78
+ logger.warn(t("env.indexing_failed", { error: "no index produced" }));
79
+ }
80
+ }
81
+ catch (err) {
82
+ const msg = err instanceof Error ? err.message : String(err);
83
+ logger.warn(t("env.indexing_failed", { error: msg }));
84
+ }
85
+ const skillsLoader = new SkillsLoader();
86
+ const builtinDir = join(import.meta.dirname, "skills", "builtin");
87
+ const globalDir = join(homedir(), ".agents", "skills");
88
+ const projectSkillsDir = join(projectMmaDir(baseDir), "skills");
89
+ const availableSkills = skillsLoader.loadFromAllSources(builtinDir, globalDir, projectSkillsDir);
90
+ const skillsBudget = Math.floor(config.contextWindow * config.skills.budget);
91
+ const skillsModule = new SkillsModule(availableSkills, skillsBudget);
92
+ const toolRegistry = new ToolRegistry();
93
+ registerAllTools(toolRegistry, skillsModule, {
94
+ enableOnDemand: config.tools?.enableOnDemand,
95
+ });
96
+ const pluginManager = new PluginManager();
97
+ // SystemInfo собирается здесь из готового профиля (в исходнике — сразу
98
+ // после создания pluginManager; сайд-эффектов чтения профиля тут уже нет).
99
+ const systemInfoContent = buildSystemInfo(config, baseDir, profile.compress());
100
+ const systemInfoPrompt = {
101
+ content: systemInfoContent,
102
+ priority: "critical",
103
+ essential: true,
104
+ estimatedTokens: estimateTokens(systemInfoContent),
105
+ };
106
+ return {
107
+ baseDir,
108
+ envReport,
109
+ indexerModule,
110
+ skillsModule,
111
+ toolRegistry,
112
+ pluginManager,
113
+ systemInfoPrompt,
114
+ };
115
+ }