micro-models-agent 2.16.0 → 2.17.1

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 (427) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/assets/app.js +1 -314
  3. package/dist/assets/hljs.js +5 -1244
  4. package/dist/assets/index.html +11 -0
  5. package/dist/assets/js/api.js +1 -28
  6. package/dist/assets/js/core/menus.js +1 -0
  7. package/dist/assets/js/core/store/feed.js +1 -0
  8. package/dist/assets/js/core/store/index.js +1 -0
  9. package/dist/assets/js/core/store/session.js +1 -0
  10. package/dist/assets/js/core/store/settings.js +1 -0
  11. package/dist/assets/js/core/store/tabs.js +1 -0
  12. package/dist/assets/js/dialog.js +1 -105
  13. package/dist/assets/js/dom.js +1 -178
  14. package/dist/assets/js/feed/core.js +1 -0
  15. package/dist/assets/js/feed/history.js +1 -0
  16. package/dist/assets/js/feed/plan.js +1 -0
  17. package/dist/assets/js/feed/question.js +3 -0
  18. package/dist/assets/js/feed/sidebar.js +1 -0
  19. package/dist/assets/js/feed/stream.js +1 -0
  20. package/dist/assets/js/feed/turn.js +5 -0
  21. package/dist/assets/js/feed.js +1 -1211
  22. package/dist/assets/js/format.js +2 -122
  23. package/dist/assets/js/i18n.js +1 -46
  24. package/dist/assets/js/rail.js +1 -114
  25. package/dist/assets/js/session/cmdk.js +1 -0
  26. package/dist/assets/js/session/composer.js +1 -0
  27. package/dist/assets/js/session/sessions-menu.js +1 -0
  28. package/dist/assets/js/session/tabs.js +1 -0
  29. package/dist/assets/js/settings/controls.js +1 -0
  30. package/dist/assets/js/settings/editors.js +1 -0
  31. package/dist/assets/js/settings/form.js +1 -0
  32. package/dist/assets/js/settings/modal.js +1 -0
  33. package/dist/assets/js/settings/panels.js +1 -0
  34. package/dist/assets/js/settings/providers.js +1 -0
  35. package/dist/assets/js/settings/search.js +1 -0
  36. package/dist/assets/js/settings/subdialog.js +1 -0
  37. package/dist/assets/js/settings/write.js +1 -0
  38. package/dist/assets/js/settings.js +1 -1914
  39. package/dist/assets/js/sidebar/core.js +1 -0
  40. package/dist/assets/js/sidebar/lsp.js +2 -0
  41. package/dist/assets/js/sidebar/map.js +1 -0
  42. package/dist/assets/js/sidebar/state.js +1 -0
  43. package/dist/assets/js/sidebar/trace.js +5 -0
  44. package/dist/assets/js/sidebar.js +1 -705
  45. package/dist/assets/js/store.js +1 -82
  46. package/dist/assets/js/subdialog.js +1 -0
  47. package/dist/assets/md.js +1 -277
  48. package/dist/assets/setup.js +3 -816
  49. package/dist/assets/smd.js +29 -1665
  50. package/dist/assets/styles.css +1 -1592
  51. package/dist/certification/certifications.json +1 -494
  52. package/dist/i18n/en.json +1 -1851
  53. package/dist/i18n/ru.json +1 -1854
  54. package/dist/main.js +815 -55797
  55. package/dist/modules/browser/bridge-server.mjs +2 -252
  56. package/package.json +10 -5
  57. package/dist/assets/js/settings-controls.js +0 -452
  58. package/dist/assets/js/tabs.js +0 -867
  59. package/dist/cli/cache-line.js +0 -31
  60. package/dist/cli/command-suggest.js +0 -39
  61. package/dist/cli/commands.js +0 -781
  62. package/dist/cli/completer.js +0 -268
  63. package/dist/cli/index.js +0 -3
  64. package/dist/cli/json-payload.js +0 -32
  65. package/dist/cli/main.js +0 -346
  66. package/dist/cli/onboarding-commands.js +0 -126
  67. package/dist/cli/plugin-commands.js +0 -38
  68. package/dist/cli/relaunch.js +0 -40
  69. package/dist/cli/repl-commands-lsp.js +0 -75
  70. package/dist/cli/repl-commands-skills.js +0 -105
  71. package/dist/cli/repl-commands.js +0 -1218
  72. package/dist/cli/repl.js +0 -1238
  73. package/dist/cli/run-result.js +0 -38
  74. package/dist/cli/security-commands.js +0 -177
  75. package/dist/cli/setup-order.js +0 -6
  76. package/dist/cli/setup-prompt.js +0 -50
  77. package/dist/cli/setup.js +0 -161
  78. package/dist/cli/web-command.js +0 -98
  79. package/dist/config/budget.js +0 -48
  80. package/dist/config/config.js +0 -345
  81. package/dist/config/defaults.js +0 -197
  82. package/dist/config/domains.js +0 -135
  83. package/dist/config/env.js +0 -46
  84. package/dist/config/experts.js +0 -17
  85. package/dist/config/index.js +0 -5
  86. package/dist/config/paths.js +0 -56
  87. package/dist/config/redact.js +0 -44
  88. package/dist/config/registry-extra.js +0 -334
  89. package/dist/config/registry.js +0 -584
  90. package/dist/config/security.js +0 -212
  91. package/dist/config/timeouts.js +0 -74
  92. package/dist/config/types.js +0 -1
  93. package/dist/config/utils.js +0 -57
  94. package/dist/core/agent/artifact-progress.js +0 -59
  95. package/dist/core/agent/artifact-resolve.js +0 -79
  96. package/dist/core/agent/audit-gate.js +0 -53
  97. package/dist/core/agent/compaction.js +0 -89
  98. package/dist/core/agent/constants.js +0 -90
  99. package/dist/core/agent/context-log.js +0 -454
  100. package/dist/core/agent/context-renderer.js +0 -45
  101. package/dist/core/agent/critic-gate.js +0 -132
  102. package/dist/core/agent/hallucination-gate.js +0 -197
  103. package/dist/core/agent/loop-state.js +0 -68
  104. package/dist/core/agent/prefix-monitor.js +0 -101
  105. package/dist/core/agent/reasoning-resolver.js +0 -65
  106. package/dist/core/agent/token-tracker.js +0 -99
  107. package/dist/core/agent/tool-batch.js +0 -312
  108. package/dist/core/agent/tool-images.js +0 -18
  109. package/dist/core/agent/tool-output.js +0 -116
  110. package/dist/core/agent/tool-pairing.js +0 -60
  111. package/dist/core/agent-moe.js +0 -248
  112. package/dist/core/agent.js +0 -1299
  113. package/dist/core/bootstrap/agent-phase.js +0 -66
  114. package/dist/core/bootstrap/config-phase.js +0 -86
  115. package/dist/core/bootstrap/modules-phase.js +0 -269
  116. package/dist/core/bootstrap/provider-phase.js +0 -183
  117. package/dist/core/bootstrap/session-phase.js +0 -204
  118. package/dist/core/bootstrap/state.js +0 -94
  119. package/dist/core/bootstrap/workspace-phase.js +0 -115
  120. package/dist/core/bootstrap.js +0 -112
  121. package/dist/core/crash-handler.js +0 -62
  122. package/dist/core/environment.js +0 -224
  123. package/dist/core/host-plan.js +0 -43
  124. package/dist/core/host.js +0 -23
  125. package/dist/core/index.js +0 -3
  126. package/dist/core/prompt-builder.js +0 -95
  127. package/dist/core/prompt-overflow.js +0 -306
  128. package/dist/core/session-logger.js +0 -375
  129. package/dist/core/system-prompt.js +0 -117
  130. package/dist/core/types.js +0 -1
  131. package/dist/core/version.js +0 -28
  132. package/dist/core/web-host.js +0 -34
  133. package/dist/core/workspace.js +0 -80
  134. package/dist/i18n/index.js +0 -80
  135. package/dist/index.js +0 -30
  136. package/dist/llm/cache-usage.js +0 -76
  137. package/dist/llm/image-utils.js +0 -138
  138. package/dist/llm/index.js +0 -4
  139. package/dist/llm/llm-errors.js +0 -50
  140. package/dist/llm/model-loader.js +0 -86
  141. package/dist/llm/models-dev.js +0 -121
  142. package/dist/llm/openai-compat.js +0 -756
  143. package/dist/llm/orchestrator.js +0 -294
  144. package/dist/llm/provider-budget.js +0 -68
  145. package/dist/llm/provider-context.js +0 -233
  146. package/dist/llm/provider.js +0 -9
  147. package/dist/llm/response.js +0 -44
  148. package/dist/llm/stream-state.js +0 -26
  149. package/dist/llm/token-counter.js +0 -83
  150. package/dist/llm/types.js +0 -1
  151. package/dist/logger/app-logger.js +0 -212
  152. package/dist/logger/file-log.js +0 -160
  153. package/dist/logger/index.js +0 -2
  154. package/dist/migration/backup.js +0 -56
  155. package/dist/migration/detect.js +0 -61
  156. package/dist/migration/index.js +0 -3
  157. package/dist/modules/artifacts/store.js +0 -62
  158. package/dist/modules/browser/actions.js +0 -79
  159. package/dist/modules/browser/bridge-client.js +0 -203
  160. package/dist/modules/browser/bridge-path.js +0 -10
  161. package/dist/modules/browser/console-buffer.js +0 -37
  162. package/dist/modules/browser/cookie-store.js +0 -29
  163. package/dist/modules/browser/driver-types.js +0 -1
  164. package/dist/modules/browser/driver.js +0 -186
  165. package/dist/modules/browser/index.js +0 -9
  166. package/dist/modules/browser/module.js +0 -30
  167. package/dist/modules/browser/session.js +0 -322
  168. package/dist/modules/browser/snapshot.js +0 -154
  169. package/dist/modules/browser/types.js +0 -13
  170. package/dist/modules/certification/cli.js +0 -264
  171. package/dist/modules/certification/fact-checker.js +0 -90
  172. package/dist/modules/certification/loader.js +0 -127
  173. package/dist/modules/certification/manifest.js +0 -231
  174. package/dist/modules/certification/runner.js +0 -233
  175. package/dist/modules/certification/scenarios.js +0 -586
  176. package/dist/modules/certification/syntax-scenarios.js +0 -50
  177. package/dist/modules/certification/types.js +0 -1
  178. package/dist/modules/context/chunk-query.js +0 -122
  179. package/dist/modules/context/fact-extractor.js +0 -170
  180. package/dist/modules/context/history.js +0 -15
  181. package/dist/modules/context/index.js +0 -2
  182. package/dist/modules/context/manager.js +0 -482
  183. package/dist/modules/critic/client.js +0 -176
  184. package/dist/modules/critic/evidence.js +0 -81
  185. package/dist/modules/critic/provider.js +0 -45
  186. package/dist/modules/critic/tools.js +0 -78
  187. package/dist/modules/critic/types.js +0 -1
  188. package/dist/modules/execution/audit-runners.js +0 -206
  189. package/dist/modules/execution/auditor.js +0 -222
  190. package/dist/modules/execution/execution-plugin.js +0 -478
  191. package/dist/modules/execution/index.js +0 -8
  192. package/dist/modules/execution/input-from.js +0 -70
  193. package/dist/modules/execution/module.js +0 -891
  194. package/dist/modules/execution/moe-executor.js +0 -443
  195. package/dist/modules/execution/plan-actions.js +0 -642
  196. package/dist/modules/execution/plan-checks.js +0 -35
  197. package/dist/modules/execution/plan-coverage.js +0 -71
  198. package/dist/modules/execution/plan-persister.js +0 -46
  199. package/dist/modules/execution/plan-steps.js +0 -31
  200. package/dist/modules/execution/plan-store.js +0 -274
  201. package/dist/modules/execution/plan-tool.js +0 -249
  202. package/dist/modules/execution/plan-validator.js +0 -197
  203. package/dist/modules/execution/planner.js +0 -103
  204. package/dist/modules/execution/stuck-detector.js +0 -834
  205. package/dist/modules/execution/tracker.js +0 -92
  206. package/dist/modules/execution/transient-error.js +0 -30
  207. package/dist/modules/execution/types.js +0 -1
  208. package/dist/modules/execution/verifier.js +0 -343
  209. package/dist/modules/execution/windows-commands.js +0 -52
  210. package/dist/modules/hallucination/artifact-claim.js +0 -93
  211. package/dist/modules/hallucination/confidence.js +0 -81
  212. package/dist/modules/hallucination/consistency.js +0 -37
  213. package/dist/modules/hallucination/detector.js +0 -57
  214. package/dist/modules/hallucination/factual.js +0 -205
  215. package/dist/modules/hallucination/index.js +0 -6
  216. package/dist/modules/hallucination/js-identifiers.js +0 -261
  217. package/dist/modules/hallucination/llm-judge.js +0 -116
  218. package/dist/modules/hallucination/success-claim.js +0 -59
  219. package/dist/modules/index.js +0 -5
  220. package/dist/modules/indexer/cache.js +0 -88
  221. package/dist/modules/indexer/index.js +0 -4
  222. package/dist/modules/indexer/map-command.js +0 -33
  223. package/dist/modules/indexer/map-select.js +0 -87
  224. package/dist/modules/indexer/module.js +0 -293
  225. package/dist/modules/indexer/project-profile.js +0 -184
  226. package/dist/modules/indexer/symbols.js +0 -189
  227. package/dist/modules/indexer/walker.js +0 -285
  228. package/dist/modules/lsp/check-tool.js +0 -61
  229. package/dist/modules/lsp/client.js +0 -406
  230. package/dist/modules/lsp/command.js +0 -53
  231. package/dist/modules/lsp/config.js +0 -189
  232. package/dist/modules/lsp/index.js +0 -4
  233. package/dist/modules/lsp/module.js +0 -295
  234. package/dist/modules/lsp/probe.js +0 -86
  235. package/dist/modules/lsp/project-root.js +0 -69
  236. package/dist/modules/lsp/startup-check.js +0 -154
  237. package/dist/modules/lsp/types.js +0 -1
  238. package/dist/modules/mcp/client.js +0 -445
  239. package/dist/modules/mcp/index.js +0 -4
  240. package/dist/modules/mcp/module.js +0 -295
  241. package/dist/modules/mcp/registry.js +0 -20
  242. package/dist/modules/memory/index.js +0 -2
  243. package/dist/modules/memory/module.js +0 -101
  244. package/dist/modules/memory/search.js +0 -45
  245. package/dist/modules/memory/store.js +0 -107
  246. package/dist/modules/onboarding/init.js +0 -47
  247. package/dist/modules/onboarding/meet.js +0 -30
  248. package/dist/modules/onboarding/mode.js +0 -30
  249. package/dist/modules/onboarding/prompts.js +0 -43
  250. package/dist/modules/pipelines/engine.js +0 -70
  251. package/dist/modules/pipelines/index.js +0 -4
  252. package/dist/modules/pipelines/parser.js +0 -59
  253. package/dist/modules/pipelines/template.js +0 -18
  254. package/dist/modules/plugins/builtin/lint-on-write.js +0 -377
  255. package/dist/modules/plugins/builtin/notify.js +0 -11
  256. package/dist/modules/plugins/index.js +0 -2
  257. package/dist/modules/plugins/loader.js +0 -85
  258. package/dist/modules/plugins/manager.js +0 -244
  259. package/dist/modules/plugins/types.js +0 -1
  260. package/dist/modules/pricing/index.js +0 -70
  261. package/dist/modules/pricing/prices.js +0 -147
  262. package/dist/modules/processes/detect.js +0 -34
  263. package/dist/modules/processes/index.js +0 -4
  264. package/dist/modules/processes/kill-tree.js +0 -52
  265. package/dist/modules/processes/registry.js +0 -294
  266. package/dist/modules/processes/runner.js +0 -23
  267. package/dist/modules/providers/cache.js +0 -23
  268. package/dist/modules/providers/capabilities.js +0 -28
  269. package/dist/modules/providers/create.js +0 -21
  270. package/dist/modules/providers/factory.js +0 -28
  271. package/dist/modules/providers/fallback.js +0 -81
  272. package/dist/modules/providers/health.js +0 -47
  273. package/dist/modules/providers/index.js +0 -6
  274. package/dist/modules/providers/manager.js +0 -207
  275. package/dist/modules/providers/naming.js +0 -15
  276. package/dist/modules/providers/preflight.js +0 -71
  277. package/dist/modules/providers/presets.js +0 -232
  278. package/dist/modules/providers/registry.js +0 -27
  279. package/dist/modules/providers/types.js +0 -1
  280. package/dist/modules/reasoning/policy.js +0 -42
  281. package/dist/modules/reasoning/probe.js +0 -116
  282. package/dist/modules/registry.js +0 -48
  283. package/dist/modules/security/audit-log.js +0 -119
  284. package/dist/modules/security/audit-notifier.js +0 -267
  285. package/dist/modules/security/command-validator.js +0 -272
  286. package/dist/modules/security/content-scanner.js +0 -53
  287. package/dist/modules/security/data-sanitizer.js +0 -82
  288. package/dist/modules/security/encryption.js +0 -216
  289. package/dist/modules/security/index.js +0 -15
  290. package/dist/modules/security/network-validator.js +0 -236
  291. package/dist/modules/security/path-validator.js +0 -261
  292. package/dist/modules/security/protected-paths.js +0 -73
  293. package/dist/modules/security/rate-limiter.js +0 -98
  294. package/dist/modules/security/security-policies.js +0 -499
  295. package/dist/modules/security/session-encryption.js +0 -182
  296. package/dist/modules/security/session-isolation.js +0 -75
  297. package/dist/modules/session/auto-name.js +0 -63
  298. package/dist/modules/session/export.js +0 -98
  299. package/dist/modules/session/index.js +0 -4
  300. package/dist/modules/session/manager.js +0 -234
  301. package/dist/modules/session/module.js +0 -33
  302. package/dist/modules/session/store.js +0 -295
  303. package/dist/modules/session/types.js +0 -1
  304. package/dist/modules/setup/answers.js +0 -35
  305. package/dist/modules/setup/apply.js +0 -79
  306. package/dist/modules/setup/discovery.js +0 -72
  307. package/dist/modules/skills/index.js +0 -3
  308. package/dist/modules/skills/loader.js +0 -86
  309. package/dist/modules/skills/matcher.js +0 -27
  310. package/dist/modules/skills/module.js +0 -141
  311. package/dist/modules/types.js +0 -1
  312. package/dist/modules/updater/changelog-reader.js +0 -93
  313. package/dist/modules/updater/checker.js +0 -101
  314. package/dist/modules/updater/dev-detect.js +0 -18
  315. package/dist/modules/updater/index.js +0 -4
  316. package/dist/modules/updater/module.js +0 -129
  317. package/dist/modules/user-profile/compressor.js +0 -18
  318. package/dist/modules/user-profile/index.js +0 -2
  319. package/dist/modules/user-profile/profile.js +0 -77
  320. package/dist/modules/webui/answer-api.js +0 -29
  321. package/dist/modules/webui/assets.js +0 -50
  322. package/dist/modules/webui/body.js +0 -21
  323. package/dist/modules/webui/commands-settings.js +0 -209
  324. package/dist/modules/webui/commands-shared.js +0 -60
  325. package/dist/modules/webui/commands.js +0 -174
  326. package/dist/modules/webui/config-api.js +0 -134
  327. package/dist/modules/webui/file-api.js +0 -202
  328. package/dist/modules/webui/forward.js +0 -159
  329. package/dist/modules/webui/history-api.js +0 -112
  330. package/dist/modules/webui/host-state.js +0 -60
  331. package/dist/modules/webui/i18n-api.js +0 -9
  332. package/dist/modules/webui/limits.js +0 -6
  333. package/dist/modules/webui/log-forward.js +0 -20
  334. package/dist/modules/webui/memory-commands.js +0 -64
  335. package/dist/modules/webui/model-cache.js +0 -18
  336. package/dist/modules/webui/module.js +0 -148
  337. package/dist/modules/webui/persist.js +0 -24
  338. package/dist/modules/webui/prompt-io.js +0 -97
  339. package/dist/modules/webui/providers-api.js +0 -337
  340. package/dist/modules/webui/providers-view.js +0 -56
  341. package/dist/modules/webui/reasoning-view.js +0 -15
  342. package/dist/modules/webui/run-agent.js +0 -81
  343. package/dist/modules/webui/server.js +0 -284
  344. package/dist/modules/webui/sessions-api.js +0 -178
  345. package/dist/modules/webui/settings-api.js +0 -561
  346. package/dist/modules/webui/setup-api.js +0 -201
  347. package/dist/modules/webui/state.js +0 -74
  348. package/dist/modules/webui/util.js +0 -261
  349. package/dist/output/bus.js +0 -37
  350. package/dist/output/channel.js +0 -285
  351. package/dist/output/format.js +0 -15
  352. package/dist/output/index.js +0 -8
  353. package/dist/output/json-sink.js +0 -24
  354. package/dist/output/machine.js +0 -9
  355. package/dist/output/session-sink.js +0 -27
  356. package/dist/output/types.js +0 -1
  357. package/dist/tools/approve.js +0 -41
  358. package/dist/tools/attach-image.js +0 -102
  359. package/dist/tools/auto-fixer.js +0 -180
  360. package/dist/tools/auto-tags.js +0 -83
  361. package/dist/tools/bash.js +0 -649
  362. package/dist/tools/browser.js +0 -160
  363. package/dist/tools/chunk-query.js +0 -112
  364. package/dist/tools/create-dir.js +0 -60
  365. package/dist/tools/delete-file.js +0 -67
  366. package/dist/tools/download-file.js +0 -142
  367. package/dist/tools/edit-file.js +0 -136
  368. package/dist/tools/enable-tools.js +0 -59
  369. package/dist/tools/executor.js +0 -304
  370. package/dist/tools/file-info.js +0 -49
  371. package/dist/tools/filter-tools.js +0 -17
  372. package/dist/tools/glob-tool.js +0 -37
  373. package/dist/tools/grep-tool.js +0 -142
  374. package/dist/tools/hidden-tools-block.js +0 -37
  375. package/dist/tools/index.js +0 -88
  376. package/dist/tools/list-dir.js +0 -53
  377. package/dist/tools/load-skill.js +0 -51
  378. package/dist/tools/mcp-call.js +0 -80
  379. package/dist/tools/meet-done.js +0 -14
  380. package/dist/tools/move-file.js +0 -94
  381. package/dist/tools/path-utils.js +0 -108
  382. package/dist/tools/pipeline-run.js +0 -167
  383. package/dist/tools/preview.js +0 -2
  384. package/dist/tools/process-ids.js +0 -31
  385. package/dist/tools/process-kill.js +0 -33
  386. package/dist/tools/process-list.js +0 -38
  387. package/dist/tools/process-log.js +0 -49
  388. package/dist/tools/process-wait.js +0 -63
  389. package/dist/tools/prompt-io.js +0 -29
  390. package/dist/tools/question.js +0 -288
  391. package/dist/tools/read-file.js +0 -200
  392. package/dist/tools/recall.js +0 -124
  393. package/dist/tools/registry.js +0 -48
  394. package/dist/tools/remember.js +0 -72
  395. package/dist/tools/scope-check.js +0 -32
  396. package/dist/tools/scope-request.js +0 -96
  397. package/dist/tools/search-history.js +0 -88
  398. package/dist/tools/session-info.js +0 -46
  399. package/dist/tools/set-thinking.js +0 -75
  400. package/dist/tools/subagent.js +0 -257
  401. package/dist/tools/syntax-validator.js +0 -379
  402. package/dist/tools/types.js +0 -1
  403. package/dist/tools/user-input.js +0 -134
  404. package/dist/tools/web-browse.js +0 -93
  405. package/dist/tools/web-fetch.js +0 -108
  406. package/dist/tools/web-search.js +0 -107
  407. package/dist/tools/write-file.js +0 -128
  408. package/dist/ui/action-log.js +0 -13
  409. package/dist/ui/box.js +0 -78
  410. package/dist/ui/colors.js +0 -6
  411. package/dist/ui/diff.js +0 -189
  412. package/dist/ui/index.js +0 -7
  413. package/dist/ui/line-editor.js +0 -1083
  414. package/dist/ui/line-math.js +0 -98
  415. package/dist/ui/md-formatter.js +0 -322
  416. package/dist/ui/output.js +0 -19
  417. package/dist/ui/plan-view.js +0 -109
  418. package/dist/ui/renderer.js +0 -589
  419. package/dist/ui/spinner.js +0 -91
  420. package/dist/ui/table.js +0 -142
  421. package/dist/ui/theme.js +0 -143
  422. package/dist/utils/child-run.js +0 -20
  423. package/dist/utils/error.js +0 -4
  424. package/dist/utils/index.js +0 -6
  425. package/dist/utils/retry.js +0 -17
  426. package/dist/utils/sleep.js +0 -23
  427. package/dist/utils/truncate.js +0 -9
@@ -1,66 +0,0 @@
1
- /**
2
- * Фаза 6 bootstrap: сборка Agent.
3
- *
4
- * Порядок 1:1 с исходником: AgentDeps (статика + динамические блоки + ленивый
5
- * health-check + пробы) → `new Agent` → поздний резолв context-probe
6
- * (reconfigure под окно провайдера) → регистрация тула set_thinking.
7
- */
8
- import { Agent } from "../agent";
9
- import { applyProbedContext } from "./provider-phase";
10
- /**
11
- * Собирает AgentDeps, создаёт агента, применяет позднюю пробу и
12
- * регистрирует set_thinking.
13
- * @param input все собранные частями прошлых фаз.
14
- * @param toolRegistry реестр для регистрации set_thinking.
15
- * @returns готовый агент.
16
- */
17
- export async function assembleAgent(input, toolRegistry) {
18
- const { config, configRef, llmProvider, providerManager, toolExecutor, pluginManager, contextManager, hallucinationDetector, logger, baseDir, configDir, activeToolTags, promptBlocks, envReport, getDynamicPromptBlocks, lazyPromptBlocks, sessionManager, memoryStore, moduleRegistry, exitOnComplete, contextLogger, reasoningProbePromise, reasoningStrategy, execModule, toolCtx, contextProbePromise, } = input;
19
- const agentDeps = {
20
- config,
21
- configRef,
22
- llmProvider,
23
- getProviderName: () => providerManager.activeName,
24
- toolExecutor,
25
- pluginManager,
26
- contextManager,
27
- hallucinationDetector,
28
- logger,
29
- baseDir,
30
- configDir,
31
- toolTags: activeToolTags,
32
- promptBlocks,
33
- envReport,
34
- getDynamicPromptBlocks,
35
- finalAudit: () => execModule.runFinalAudit(),
36
- lazyPromptBlocks,
37
- sessionManager,
38
- memoryStore,
39
- moduleRegistry,
40
- exitOnComplete,
41
- contextLogger,
42
- reasoningProbe: () => reasoningProbePromise,
43
- reasoningStrategy,
44
- planSummary: () => execModule.getPlanSummary(),
45
- toolCtx,
46
- };
47
- const agent = new Agent(agentDeps);
48
- // Поздний резолв пробы: окно могло попасть в `config` после сборки
49
- // ContextManager/провайдера — один reconfigure, чтобы бюджеты и провайдер
50
- // его реально использовали. No-op, если проба села рано (то же значение)
51
- // или ход уже был.
52
- void contextProbePromise
53
- .then((probe) => {
54
- if (!probe)
55
- return;
56
- return applyProbedContext(agent, config, probe, logger);
57
- })
58
- .catch(() => { });
59
- // Тул set_thinking (нужен общее reasoning-состояние агента)
60
- if (config.reasoning) {
61
- const { createSetThinkingTool } = await import("../../tools/set-thinking");
62
- const setThinkingTool = createSetThinkingTool(agent.reasoningState, config.reasoning, () => agent.currentIteration);
63
- toolRegistry.register(setThinkingTool);
64
- }
65
- return agent;
66
- }
@@ -1,86 +0,0 @@
1
- /**
2
- * Фаза 1 bootstrap: пути, конфиг, локаль, логгер.
3
- *
4
- * Порядок сайд-эффектов 1:1 с исходным `bootstrap()`: резолв каталога →
5
- * `loadConfig` → `setLocale` → CLI-override reasoning → audit-нотифаер →
6
- * создание `Logger` (+ отложенное логирование ошибки нотифаера) → синк
7
- * бандл-манифеста сертификаций (best-effort, молча).
8
- */
9
- import { join } from "path";
10
- import { loadConfig } from "../../config/config";
11
- import { Logger } from "../../logger/app-logger";
12
- import { setLocale, setMissingKeyReporter } from "../../i18n/index";
13
- import { globalMmaDir } from "../../config/paths";
14
- import { errMsg } from "../../utils";
15
- import { normalizeLogLevel } from "./state";
16
- /**
17
- * CLI --reasoning переопределяет конфигурационный режим
18
- * (приоритет: CLI > config > default). "auto" пропускается — полагаемся
19
- * на конфиг. Строка CLI приводится к типизированному ReasoningLevel.
20
- */
21
- export function applyReasoningCliOverride(config, reasoningLevel) {
22
- if (!reasoningLevel || reasoningLevel === "auto")
23
- return;
24
- if (!config.reasoning) {
25
- config.reasoning = {
26
- mode: reasoningLevel,
27
- min: "low",
28
- max: "high",
29
- overrideCooldown: 3,
30
- };
31
- }
32
- else {
33
- config.reasoning.mode = reasoningLevel;
34
- }
35
- }
36
- /**
37
- * Грузит конфиг и готовит логгер.
38
- * @param configDir каталог конфига (опционально); @param projectDir workspace (опционально);
39
- * @param reasoningLevel CLI-override reasoning (опционально).
40
- * @returns каталог, конфиг, флаг легаси и логгер.
41
- */
42
- export async function initConfigPhase(configDir, projectDir, reasoningLevel) {
43
- const dir = configDir || globalMmaDir();
44
- const projectConfigPath = projectDir ? join(projectDir, ".mmrc") : join(process.cwd(), ".mmrc");
45
- const { config, legacyDetected } = loadConfig({ configDir: dir, projectConfigPath });
46
- setLocale(config.locale);
47
- // CLI --reasoning перебивает режим конфига (приоритет: CLI > config > default)
48
- applyReasoningCliOverride(config, reasoningLevel);
49
- // Глобальный audit-нотифаер — по конфигу
50
- let auditNotifyError;
51
- try {
52
- const { globalAuditNotifier } = await import("../../modules/security/audit-notifier");
53
- if (config.security?.auditNotifier) {
54
- globalAuditNotifier.updateConfig(config.security.auditNotifier);
55
- }
56
- }
57
- catch (err) {
58
- // Logger ещё не создан — запомним и залогируем после его инициализации.
59
- auditNotifyError = errMsg(err);
60
- }
61
- const logger = new Logger(normalizeLogLevel(config.logLevel));
62
- logger.setLogDir(join(dir, "logs"));
63
- // Диагностика опечаток в ключах i18n — видна только на debug-уровне.
64
- setMissingKeyReporter((key) => logger.debug(`Missing i18n key: ${key}`));
65
- if (auditNotifyError) {
66
- logger.debug(`Audit notifier config skipped: ${auditNotifyError}`);
67
- }
68
- logger.debug("MMA bootstrap", {
69
- version: config.version,
70
- model: config.model,
71
- });
72
- // Синхронизируем бандл-манифест версии пакета в ~/.mma/certifications.json
73
- // (бандл-записи затирают свои ключи при апдейте; пользовательские сохраняются).
74
- // Best-effort, молча.
75
- try {
76
- const { syncGlobalManifest } = await import("../../modules/certification/manifest");
77
- const syncResult = syncGlobalManifest();
78
- if (syncResult.synced) {
79
- logger.debug("Certification manifest synced from package");
80
- }
81
- }
82
- catch {
83
- // Метки сертификации косметические — старт не блокируем никогда.
84
- }
85
- return { dir, projectConfigPath, config, legacyDetected, logger };
86
- }
@@ -1,269 +0,0 @@
1
- /**
2
- * Фаза 5 bootstrap: модули, плагины, промпт-блоки.
3
- *
4
- * Порядок 1:1 с исходником: ExecutionModule (+ restorePlan, детектор) →
5
- * SessionModule → IndexerModule в реестр → MCP (init с таймаутом 10s) →
6
- * Memory → Browser (опционально) → LSP → фоновый стартовый health-check →
7
- * сбор tool definitions модулей → builtin-плагины в менеджер → внешние
8
- * плагины (global + project) → onCompact/setPlanSummaryProvider → AGENTS.md
9
- * блоки + статичные промпт-блоки → стартовый dry-run переполнения (варнинг).
10
- */
11
- import { join } from "path";
12
- import { buildHiddenToolsBlock } from "../../tools/hidden-tools-block";
13
- import { ModuleRegistry } from "../../modules/registry";
14
- import { PluginLoader } from "../../modules/plugins/loader";
15
- import { plugin as lintOnWritePlugin } from "../../modules/plugins/builtin/lint-on-write";
16
- import { plugin as notifyPlugin } from "../../modules/plugins/builtin/notify";
17
- import { ExecutionModule } from "../../modules/execution/module";
18
- import { SessionModule } from "../../modules/session/index";
19
- import { BrowserModule } from "../../modules/browser/index";
20
- import { LspModule, FileOnlyLogger, DEFAULT_LSP_CONFIG } from "../../modules/lsp/index";
21
- import { runStartupHealthCheck } from "../../modules/lsp/startup-check";
22
- import { MCPModule } from "../../modules/mcp/index";
23
- import { MemoryModule } from "../../modules/memory/module";
24
- import { MemoryStore } from "../../modules/memory/store";
25
- import { t } from "../../i18n/index";
26
- import { estimateTokens } from "../../llm/token-counter";
27
- import { readMmaVersion } from "../version";
28
- import { dryRunOverflow, overflowHint } from "../prompt-overflow";
29
- import { isOneShotMode, loadAgentsMdBlocks, registerBuiltinPlugin, withTimeout } from "./state";
30
- import { globalPluginsDir as resolveGlobalPluginsDir, projectMmaDir } from "../../config/paths";
31
- /**
32
- * Регистрирует модули, грузит плагины и собирает промпт-блоки.
33
- * Тонкий оркестратор: вся пошаговая логика — в приватных хелперах ниже,
34
- * порядок сайд-эффектов 1:1 с исходной монолитной версией.
35
- * @param input связный вход фазы (см. ModulesPhaseInput в state.ts).
36
- * @returns реестр модулей, exec-модуль и блоки системного промпта.
37
- */
38
- export async function setupModulesPhase(input) {
39
- const moduleRegistry = new ModuleRegistry();
40
- const core = await registerCoreModules(input, moduleRegistry);
41
- const startupCheckPromise = startLanguageModules(input, moduleRegistry);
42
- registerModuleToolsAndPlugins(input, moduleRegistry, core);
43
- const promptBlocks = buildStaticPromptBlocks(input, moduleRegistry, core);
44
- dryRunStartupOverflow(input, promptBlocks);
45
- // План-блок удалён: мутирует каждую итерацию (статусы шагов), инвалидируя
46
- // локальный KV-кеш. Статус плана теперь инжектится в <system-summary>
47
- // после каждого пакета тулов.
48
- const getDynamicPromptBlocks = () => collectDynamicPromptBlocks(input, core.sessionModule);
49
- const lazyPromptBlocks = makeLazyPromptBlocks(startupCheckPromise);
50
- return {
51
- moduleRegistry,
52
- execModule: core.execModule,
53
- sessionModule: core.sessionModule,
54
- mcpModule: core.mcpModule,
55
- memoryStore: core.memoryStore,
56
- promptBlocks,
57
- lazyPromptBlocks,
58
- getDynamicPromptBlocks,
59
- };
60
- }
61
- /** Exec + Session + Indexer + MCP (init с таймаутом) + Memory. */
62
- async function registerCoreModules(input, moduleRegistry) {
63
- const { config, logger, dir, baseDir, hallucinationDetector } = input;
64
- const execModule = new ExecutionModule(baseDir, config.stuckThreshold, config.errorWebSearch?.threshold ?? 5);
65
- // План следует за сессией: restorePlan поднимает legacy-глобальный план,
66
- // switchSession усыновляет его в слот стартовой сессии (или грузит её свой).
67
- // REPL рисует чеклист только на plan/todo-событиях — без спроса не печатаем.
68
- execModule.restorePlan();
69
- try {
70
- execModule.switchSession(input.sessionManager.getActive());
71
- }
72
- catch {
73
- // fail-open: без сессии трекер остаётся как поднял restorePlan
74
- }
75
- moduleRegistry.register(execModule);
76
- execModule.setHallucinationDetector(hallucinationDetector);
77
- const sessionModule = new SessionModule(input.sessionManager);
78
- moduleRegistry.register(sessionModule);
79
- moduleRegistry.register(input.indexerModule);
80
- const mcpModule = new MCPModule(config);
81
- try {
82
- // Ограничиваем init MCP, чтобы один медленный/висящий сервер не стопил boot
83
- // навсегда (B5): на таймауте — лог-и-дальше, MCP-тулы появятся поздно или
84
- // не появятся, вместо stall'а старта.
85
- await withTimeout(mcpModule.initialize(), 10_000);
86
- }
87
- catch (err) {
88
- logger.warn(`MCP init failed or timed out (${err instanceof Error ? err.message.slice(0, 120) : String(err)}) — continuing without MCP tools.`);
89
- }
90
- moduleRegistry.register(mcpModule);
91
- // Общий глобальный стор памяти — один инстанс у модуля памяти и цикла,
92
- // поэтому UI (`mma web` `/memory`) читают/пишут живые данные.
93
- const memoryStore = new MemoryStore(join(dir, "memory"));
94
- const memoryModule = new MemoryModule(memoryStore);
95
- moduleRegistry.register(memoryModule);
96
- return { execModule, sessionModule, mcpModule, memoryStore };
97
- }
98
- /**
99
- * Языковые модули: Browser (опционально) + LSP + фоновый стартовый health-check.
100
- * @returns промис стартовой проверки (без await — резолвится к первому вводу).
101
- */
102
- function startLanguageModules(input, moduleRegistry) {
103
- const { config, logger, baseDir, exitOnComplete, pluginManager } = input;
104
- if (config.browser.enabled) {
105
- const browserModule = new BrowserModule();
106
- moduleRegistry.register(browserModule);
107
- registerBuiltinPlugin(pluginManager, browserModule.getPlugin());
108
- }
109
- const lspLogger = new FileOnlyLogger(logger);
110
- const lspModule = new LspModule(config.lsp, undefined, lspLogger);
111
- moduleRegistry.register(lspModule);
112
- registerBuiltinPlugin(pluginManager, lspModule.getPlugin());
113
- // Стартовый health-check: сканируем проект на существующие ошибки, чтобы модель
114
- // знала baseline до работы. Пропуск для one-shot и тестов. Старт фоном (без
115
- // await), чтобы баннер REPL не ждал `npx tsc` по проекту; Agent дожидается
116
- // через `lazyPromptBlocks` перед первым LLM-вызовом (к вводу пользователя
117
- // в интерактиве уже резолвнут).
118
- return !isOneShotMode() && !exitOnComplete && process.env.NODE_ENV !== "test"
119
- ? runStartupHealthCheck(config.lsp ?? DEFAULT_LSP_CONFIG, baseDir, { logger: lspLogger })
120
- : Promise.resolve(null);
121
- }
122
- /** Тулы модулей в реестр + builtin/external плагины в менеджер. */
123
- function registerModuleToolsAndPlugins(input, moduleRegistry, core) {
124
- const { logger, baseDir, toolRegistry, pluginManager, skillsModule, indexerModule } = input;
125
- const moduleTools = moduleRegistry.collectToolDefinitions();
126
- for (const tool of moduleTools) {
127
- toolRegistry.register(tool);
128
- }
129
- registerBuiltinPlugin(pluginManager, core.execModule.getPlugin());
130
- registerBuiltinPlugin(pluginManager, core.sessionModule.getPlugin());
131
- registerBuiltinPlugin(pluginManager, skillsModule.getPlugin());
132
- registerBuiltinPlugin(pluginManager, indexerModule.getPlugin());
133
- registerBuiltinPlugin(pluginManager, core.mcpModule.getPlugin());
134
- pluginManager.register(lintOnWritePlugin);
135
- pluginManager.register(notifyPlugin);
136
- const pluginLoader = new PluginLoader();
137
- const globalPluginsDir = resolveGlobalPluginsDir();
138
- const projectPluginsDir = join(projectMmaDir(baseDir), "plugins");
139
- const mmaVersion = readMmaVersion();
140
- pluginLoader.loadFromDir(globalPluginsDir, pluginManager, logger, {
141
- source: "global",
142
- mmaVersion,
143
- });
144
- pluginLoader.loadFromDir(projectPluginsDir, pluginManager, logger, {
145
- source: "project",
146
- mmaVersion,
147
- });
148
- }
149
- /**
150
- * Статичные промпт-блоки: systemInfo + реестреые + AGENTS.md + plan-напоминание.
151
- * Заодно вешает onCompact и провайдер сводки плана (состояние — в замыканиях
152
- * менеджера контекста, порядок 1:1 с исходником).
153
- */
154
- function buildStaticPromptBlocks(input, moduleRegistry, core) {
155
- const { config, baseDir, dir, noAgentsMd, sessionManager, contextManager, systemInfoPrompt } = input;
156
- contextManager.onCompact = (summary) => {
157
- const meta = sessionManager.getActiveMeta();
158
- if (!meta || !config.session.autoSave)
159
- return;
160
- sessionManager.appendMessage({
161
- role: summary.role,
162
- content: summary.content,
163
- name: summary.name,
164
- timestamp: new Date().toISOString(),
165
- });
166
- };
167
- // Активный план (id, прогресс, текущий шаг) — в сводку компакции, чтобы 9B
168
- // модель не пересоздавала план с нуля сразу после неё (наблюдалось:
169
- // ses_msvuao0h — plan_e07pb2 (1/6) выкинут ради свежего plan_xzq9xe той же
170
- // итерацией, где старый план ещё был виден).
171
- contextManager.setPlanSummaryProvider(() => core.execModule.getPlanSummary());
172
- const agentsMdBlocks = loadAgentsMdBlocks(baseDir, dir, noAgentsMd === true);
173
- return [
174
- systemInfoPrompt,
175
- ...moduleRegistry.collectPromptBlocks(["indexer", "session"]),
176
- ...agentsMdBlocks,
177
- // Статичное напоминание о плане: всегда в наличии, чтобы модель проверяла
178
- // активный план до создания нового (даже на первой итерации, до появления
179
- // <system-summary>).
180
- {
181
- content: "[Plan Reminder] An active plan may exist for this session. Before creating a new plan, check with `plan show`. If a plan is active, continue it — do NOT create a new plan.",
182
- priority: "high",
183
- essential: false,
184
- estimatedTokens: 50,
185
- },
186
- ];
187
- }
188
- /**
189
- * Стартовый dry-run переполнения (баннер, A3): тот же набор блоков, что возьмёт
190
- * первая сборка Agent (статика + скиллы + карта + скрытые тулы), наружу —
191
- * невместившиеся instructions/project-map. Agent сожмёт их перед первым
192
- * LLM-вызовом; варнинг говорит ПОЛЬЗОВАТЕЛЮ почему и как вернуть полный текст.
193
- */
194
- function dryRunStartupOverflow(input, promptBlocks) {
195
- const { config, logger, dir, toolRegistry, activeToolTags, skillsModule, indexerModule } = input;
196
- const dynamicBlocks = [];
197
- const skillsBlock = skillsModule.getSystemPromptBlock();
198
- if (skillsBlock)
199
- dynamicBlocks.push(skillsBlock);
200
- const mapBlock = indexerModule.getSystemPromptBlock();
201
- if (mapBlock)
202
- dynamicBlocks.push(mapBlock);
203
- const hiddenToolsBlock = buildHiddenToolsBlock(toolRegistry.getAll(), activeToolTags);
204
- if (hiddenToolsBlock) {
205
- dynamicBlocks.push({
206
- content: hiddenToolsBlock,
207
- priority: "low",
208
- essential: false,
209
- estimatedTokens: estimateTokens(hiddenToolsBlock),
210
- });
211
- }
212
- const systemBudget = Math.floor(config.contextWindow * config.contextBudget.systemPrompt);
213
- const dry = dryRunOverflow([...promptBlocks, ...dynamicBlocks], systemBudget);
214
- if (dry.overflow.length === 0)
215
- return;
216
- const overflowTokens = dry.overflow.reduce((s, b) => s + b.estimatedTokens, 0);
217
- const needed = dry.includedTokens + overflowTokens;
218
- const hint = overflowHint(config, dir, needed);
219
- for (const b of dry.overflow) {
220
- logger.warn(t("prompt.overflow.startup", {
221
- block: b.kind === "instructions" ? "AGENTS.md" : "project map",
222
- original: String(b.estimatedTokens),
223
- needed: String(needed),
224
- budget: String(systemBudget),
225
- hint,
226
- }));
227
- }
228
- }
229
- /**
230
- * Динамические блоки (skills/сессия/карта/скрытые тулы) — собираются свежими
231
- * при каждом вызове. Мета сессии — здесь, а не при bootstrap: сессия создаётся
232
- * при bootstrap с messageCount 0, и статичный сбор всегда давал бы null.
233
- * Контент стабилен на сессию (без per-turn полей) ради prefix KV-кеша.
234
- */
235
- function collectDynamicPromptBlocks(input, sessionModule) {
236
- const { toolRegistry, activeToolTags, toolCtx, skillsModule, indexerModule } = input;
237
- const blocks = [];
238
- const skillsBlock = skillsModule.getSystemPromptBlock();
239
- if (skillsBlock)
240
- blocks.push(skillsBlock);
241
- const sessionBlock = sessionModule.getSystemPromptBlock();
242
- if (sessionBlock)
243
- blocks.push(sessionBlock);
244
- const mapBlock = indexerModule.getSystemPromptBlock();
245
- if (mapBlock)
246
- blocks.push(mapBlock);
247
- const hiddenToolsBlock = toolCtx.toolAllowlist
248
- ? null
249
- : buildHiddenToolsBlock(toolRegistry.getAll(), activeToolTags);
250
- if (hiddenToolsBlock) {
251
- blocks.push({
252
- content: hiddenToolsBlock,
253
- priority: "low",
254
- essential: false,
255
- estimatedTokens: estimateTokens(hiddenToolsBlock),
256
- });
257
- }
258
- return blocks;
259
- }
260
- /** Ленивые блоки: фоновая стартовая проверка, мемоизированная первым вызовом. */
261
- function makeLazyPromptBlocks(startupCheckPromise) {
262
- let startupCheckBlock = null;
263
- return async () => {
264
- if (startupCheckBlock)
265
- return [startupCheckBlock];
266
- startupCheckBlock = (await startupCheckPromise) ?? null;
267
- return startupCheckBlock ? [startupCheckBlock] : [];
268
- };
269
- }
@@ -1,183 +0,0 @@
1
- /**
2
- * Фаза 2 bootstrap: провайдер, автозагрузка модели, пробы.
3
- *
4
- * Порядок 1:1 с исходником: эндпоинт активной записи → автозагрузка модели
5
- * → фоновая context-probe → профиль пользователя → сборка провайдера через
6
- * общую фабрику (с ленивым session id) → reasoning-стратегия + фоновая
7
- * reasoning-probe. Тяжёлые пробы — фоном, старт не блокируют.
8
- */
9
- import { ModelLoader, probeModel, probeProviderContext } from "../../llm/model-loader";
10
- import { join as joinDir } from "path";
11
- import { buildActiveProvider } from "../../modules/providers/factory";
12
- import { activeProviderEndpoint, reasoningStrategyForProvider } from "../../modules/providers/manager";
13
- import { UserProfile } from "../../modules/user-profile/profile";
14
- import { t } from "../../i18n/index";
15
- /**
16
- * Позднее применение резолвнутой context-probe. Проба приземляется фоном ПОСЛЕ
17
- * сборки ContextManager/провайдера под стартовое окно — одна запись значения в
18
- * `config` оставит бюджеты протухшими, поэтому нужен reconfigure (ресайз +
19
- * пересборка провайдера).
20
- *
21
- * Пропуск, когда применять нечего (`config` больше не несёт значение пробы —
22
- * совпало сразу или переопределено вручную) или ход уже был (ресайз посреди
23
- * истории ломает бюджеты). Не бросает никогда.
24
- */
25
- export async function applyProbedContext(agent, config, probe, logger) {
26
- if (config.contextWindow !== probe.actual)
27
- return false;
28
- if (agent.currentIteration !== 0) {
29
- logger.logSilent("debug", `Context probe: keeping startup contextWindow ${config.contextWindow} — a turn already ran`);
30
- return false;
31
- }
32
- try {
33
- await agent.reconfigure(config);
34
- logger.logSilent("info", `Context probe: applied provider context ${probe.actual} tokens (model "${probe.model}")`);
35
- return true;
36
- }
37
- catch {
38
- return false;
39
- }
40
- }
41
- /**
42
- * Собирает провайдер и запускает фоновые пробы.
43
- * @param config живой конфиг; @param logger настроенный логгер; @param dir каталог конфига (для профиля).
44
- * @returns эндпоинт, пробы, профиль, менеджер, провайдер и биндер сессий.
45
- */
46
- export async function setupProviderPhase(config, logger, dir) {
47
- // Эндпоинт для пробы/автозагрузки: АКТИВНАЯ запись, не легаси-плоские поля
48
- // (они зеркалят активное на момент последней записи и протухают после
49
- // `/provider use` — наблюдалось: плоский localhost:1234 при активной записи
50
- // opencode-go, и Zen вообще не опрашивался).
51
- const probeEndpoint = activeProviderEndpoint(config.provider);
52
- if (config.modelLoad.autoLoad) {
53
- const modelLoader = new ModelLoader(probeEndpoint.baseUrl, logger);
54
- const loadResult = await modelLoader.ensureModelLoaded({
55
- model: config.model,
56
- contextLength: config.contextWindow,
57
- flashAttention: config.modelLoad.flashAttention,
58
- offloadKvCacheToGpu: config.modelLoad.offloadKvCacheToGpu,
59
- autoLoad: config.modelLoad.autoLoad,
60
- });
61
- if (!loadResult.success) {
62
- logger.warn(t("env.model_autoload_failed", { error: String(loadResult.error ?? "") }));
63
- }
64
- else if (loadResult.alreadyLoaded) {
65
- logger.debug(`Model ${config.model} already loaded`);
66
- }
67
- else {
68
- logger.info(t("env.model_loaded", { model: config.model, seconds: String(loadResult.loadTime) }));
69
- }
70
- }
71
- // Context-проба (фоном): спрашиваем АКТИВНЫЙ провайдер о длине контекста,
72
- // что РЕАЛЬНО отдаётся модели (загруженный инстанс, не максимум карточки),
73
- // и берём как эффективный contextWindow — провайдер бьёт конфиг. Баннер не
74
- // блокирует никогда; null = окно никто не сообщил (голый OpenAI-compat
75
- // `/models`, офлайн, транзиентка) — храним настроенный (fail-open). Ручной
76
- // `mma context <N>` / `/config contextWindow <N>` после — действует до конца сессии.
77
- // Живой источник возможностей модели для тулов (browser vision и т.п.).
78
- // Пресет и конфиг-оверрайд известны сразу, native-probe уточняет их
79
- // асинхронно и записывает сюда, не блокируя старт. Геттер на toolCtx
80
- // резолвит итог при каждом обращении, поэтому смена модели/провайдера
81
- // через reconfigure видна тулам без пересборки контекста.
82
- const capabilitiesRef = {};
83
- // Значение на старте. Проба резолвится фоном — если пользователь успел
84
- // сменить contextWindow раньше (веб-UI до приземления пробы), побеждает его
85
- // явный выбор, а итог пробы только логируется.
86
- const probeConfiguredAtStart = config.contextWindow;
87
- const contextProbePromise = (async () => {
88
- try {
89
- const lmProbe = await probeModel(probeEndpoint.baseUrl, config.model);
90
- if (lmProbe?.capabilities)
91
- capabilitiesRef.probe = lmProbe.capabilities;
92
- const lmContext = lmProbe ? { model: lmProbe.model, actual: lmProbe.contextLength } : null;
93
- const detected = lmContext ??
94
- (await probeProviderContext(probeEndpoint.baseUrl, config.model, {
95
- apiKey: probeEndpoint.apiKey,
96
- providerType: probeEndpoint.type,
97
- }));
98
- if (!detected)
99
- return null;
100
- if (detected.actual === config.contextWindow) {
101
- logger.logSilent("debug", `Context probe: configured contextWindow matches provider context (${detected.actual})`);
102
- }
103
- else if (config.contextWindow !== probeConfiguredAtStart) {
104
- logger.logSilent("debug", `Context probe: model "${detected.model}" serves ${detected.actual} tokens, keeping the explicit contextWindow ${config.contextWindow}`);
105
- }
106
- else {
107
- logger.logSilent("info", `Context probe: auto-set contextWindow from provider — model "${detected.model}" serves ${detected.actual} tokens (configured was ${config.contextWindow}).`);
108
- config.contextWindow = detected.actual;
109
- }
110
- return detected;
111
- }
112
- catch {
113
- return null;
114
- }
115
- })();
116
- // Профиль пользователя — грузим здесь же, как в исходнике (до сборки
117
- // провайдера): load/collect/save без логгера, порядок важен для
118
- // systemInfo-блока фазы workspace (профиль передаётся дальше).
119
- const profile = new UserProfile(joinDir(dir));
120
- profile.load() || profile.collect();
121
- profile.save();
122
- // Мультипровайдерный менеджер (Phase 2) + опциональная прозрачная failover-
123
- // обёртка (Phase 4.2). Строится через общую фабрику, чтобы hot-swap через
124
- // Agent.setProvider получал ТО ЖЕ fallback-поведение, что старт, а не голый
125
- // менеджер, молча роняющий failover (B4).
126
- //
127
- // Session id резолвится лениво: менеджер сессий создаётся ниже, а провайдеры
128
- // должны читать ТЕКУЩУЮ сессию в момент запроса (hot-swap, смена сессии).
129
- // OpenCode Go режектит запросы без `x-opencode-session`.
130
- let sessionSource;
131
- const getSessionId = () => sessionSource?.()?.getActiveMeta()?.id;
132
- const builtProvider = buildActiveProvider(config, logger, { getSessionId });
133
- const providerManager = builtProvider.manager;
134
- const llmProvider = builtProvider.provider;
135
- // Стратегия reasoning АКТИВНОЙ записи (легаси-плоское `type` протухает после
136
- // `/provider use` и давало чужую стратегию — напр. prompt-tag при opencode-go).
137
- const reasoningStrategy = reasoningStrategyForProvider(config.provider);
138
- // Reasoning-проба — ФОНОМ (B2). Раньше блокировала bootstrap лишним LLM
139
- // round-trip на каждый запуск; теперь агент потребляет её лениво перед первым
140
- // LLM-вызовом (тот же паттерн, что стартовый health-check), а до резолва
141
- // механизм считается НЕ прошедшим. 24h TTL диск-кэша в probe.ts и так
142
- // бережёт стабильный бэкенд от перепроверок.
143
- let reasoningProbePromise = Promise.resolve(false);
144
- if (config.reasoning && config.reasoning.mode !== "none" && reasoningStrategy !== "none") {
145
- reasoningProbePromise = (async () => {
146
- try {
147
- const { probeReasoningSupport, getCachedProbeResult, setCachedProbeResult } = await import("../../modules/reasoning/probe");
148
- const cacheK = `${probeEndpoint.baseUrl ?? ""}|${config.model}`;
149
- const cached = getCachedProbeResult(cacheK);
150
- const passed = cached !== undefined
151
- ? cached
152
- : await probeReasoningSupport(llmProvider, reasoningStrategy);
153
- // Кэшируем только определённый итог — транзиентная ошибка пробы (null)
154
- // НЕ должна пинить «reasoning не поддерживается» на 24h TTL.
155
- if (cached === undefined && passed !== null)
156
- setCachedProbeResult(cacheK, passed);
157
- logger.logSilent("info", t("env.reasoning_probe", {
158
- strategy: reasoningStrategy,
159
- result: passed === true ? t("env.reasoning_respected") : t("env.reasoning_ignored"),
160
- }));
161
- // null (транзиентка) — фолбэк «не пройдено» на эту сессию.
162
- return passed === true;
163
- }
164
- catch {
165
- return false;
166
- }
167
- })();
168
- }
169
- return {
170
- probeEndpoint,
171
- profile,
172
- capabilitiesRef,
173
- probeConfiguredAtStart,
174
- contextProbePromise,
175
- providerManager,
176
- llmProvider,
177
- reasoningStrategy,
178
- reasoningProbePromise,
179
- bindSessionManager: (getManager) => {
180
- sessionSource = getManager;
181
- },
182
- };
183
- }