micro-models-agent 2.16.1 → 2.17.2

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 (428) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/README.md +8 -3
  3. package/dist/assets/app.js +1 -314
  4. package/dist/assets/hljs.js +5 -1244
  5. package/dist/assets/index.html +11 -0
  6. package/dist/assets/js/api.js +1 -28
  7. package/dist/assets/js/core/menus.js +1 -0
  8. package/dist/assets/js/core/store/feed.js +1 -0
  9. package/dist/assets/js/core/store/index.js +1 -0
  10. package/dist/assets/js/core/store/session.js +1 -0
  11. package/dist/assets/js/core/store/settings.js +1 -0
  12. package/dist/assets/js/core/store/tabs.js +1 -0
  13. package/dist/assets/js/dialog.js +1 -105
  14. package/dist/assets/js/dom.js +1 -178
  15. package/dist/assets/js/feed/core.js +1 -0
  16. package/dist/assets/js/feed/history.js +1 -0
  17. package/dist/assets/js/feed/plan.js +1 -0
  18. package/dist/assets/js/feed/question.js +3 -0
  19. package/dist/assets/js/feed/sidebar.js +1 -0
  20. package/dist/assets/js/feed/stream.js +1 -0
  21. package/dist/assets/js/feed/turn.js +5 -0
  22. package/dist/assets/js/feed.js +1 -1250
  23. package/dist/assets/js/format.js +2 -122
  24. package/dist/assets/js/i18n.js +1 -46
  25. package/dist/assets/js/rail.js +1 -114
  26. package/dist/assets/js/session/cmdk.js +1 -0
  27. package/dist/assets/js/session/composer.js +1 -0
  28. package/dist/assets/js/session/sessions-menu.js +1 -0
  29. package/dist/assets/js/session/tabs.js +1 -0
  30. package/dist/assets/js/settings/controls.js +1 -0
  31. package/dist/assets/js/settings/editors.js +1 -0
  32. package/dist/assets/js/settings/form.js +1 -0
  33. package/dist/assets/js/settings/modal.js +1 -0
  34. package/dist/assets/js/settings/panels.js +1 -0
  35. package/dist/assets/js/settings/providers.js +1 -0
  36. package/dist/assets/js/settings/search.js +1 -0
  37. package/dist/assets/js/settings/subdialog.js +1 -0
  38. package/dist/assets/js/settings/write.js +1 -0
  39. package/dist/assets/js/settings.js +1 -1914
  40. package/dist/assets/js/sidebar/core.js +1 -0
  41. package/dist/assets/js/sidebar/lsp.js +2 -0
  42. package/dist/assets/js/sidebar/map.js +1 -0
  43. package/dist/assets/js/sidebar/state.js +1 -0
  44. package/dist/assets/js/sidebar/trace.js +5 -0
  45. package/dist/assets/js/sidebar.js +1 -705
  46. package/dist/assets/js/store.js +1 -82
  47. package/dist/assets/js/subdialog.js +1 -0
  48. package/dist/assets/md.js +1 -291
  49. package/dist/assets/setup.js +3 -816
  50. package/dist/assets/smd.js +29 -1665
  51. package/dist/assets/styles.css +1 -1598
  52. package/dist/certification/certifications.json +1 -494
  53. package/dist/i18n/en.json +1 -1851
  54. package/dist/i18n/ru.json +1 -1854
  55. package/dist/main.js +815 -55797
  56. package/dist/modules/browser/bridge-server.mjs +2 -252
  57. package/package.json +10 -5
  58. package/dist/assets/js/settings-controls.js +0 -452
  59. package/dist/assets/js/tabs.js +0 -867
  60. package/dist/cli/cache-line.js +0 -31
  61. package/dist/cli/command-suggest.js +0 -39
  62. package/dist/cli/commands.js +0 -781
  63. package/dist/cli/completer.js +0 -268
  64. package/dist/cli/index.js +0 -3
  65. package/dist/cli/json-payload.js +0 -32
  66. package/dist/cli/main.js +0 -346
  67. package/dist/cli/onboarding-commands.js +0 -126
  68. package/dist/cli/plugin-commands.js +0 -38
  69. package/dist/cli/relaunch.js +0 -40
  70. package/dist/cli/repl-commands-lsp.js +0 -75
  71. package/dist/cli/repl-commands-skills.js +0 -105
  72. package/dist/cli/repl-commands.js +0 -1218
  73. package/dist/cli/repl.js +0 -1238
  74. package/dist/cli/run-result.js +0 -38
  75. package/dist/cli/security-commands.js +0 -177
  76. package/dist/cli/setup-order.js +0 -6
  77. package/dist/cli/setup-prompt.js +0 -50
  78. package/dist/cli/setup.js +0 -161
  79. package/dist/cli/web-command.js +0 -98
  80. package/dist/config/budget.js +0 -48
  81. package/dist/config/config.js +0 -345
  82. package/dist/config/defaults.js +0 -197
  83. package/dist/config/domains.js +0 -135
  84. package/dist/config/env.js +0 -46
  85. package/dist/config/experts.js +0 -17
  86. package/dist/config/index.js +0 -5
  87. package/dist/config/paths.js +0 -56
  88. package/dist/config/redact.js +0 -44
  89. package/dist/config/registry-extra.js +0 -334
  90. package/dist/config/registry.js +0 -584
  91. package/dist/config/security.js +0 -212
  92. package/dist/config/timeouts.js +0 -74
  93. package/dist/config/types.js +0 -1
  94. package/dist/config/utils.js +0 -57
  95. package/dist/core/agent/artifact-progress.js +0 -59
  96. package/dist/core/agent/artifact-resolve.js +0 -79
  97. package/dist/core/agent/audit-gate.js +0 -53
  98. package/dist/core/agent/compaction.js +0 -89
  99. package/dist/core/agent/constants.js +0 -90
  100. package/dist/core/agent/context-log.js +0 -454
  101. package/dist/core/agent/context-renderer.js +0 -45
  102. package/dist/core/agent/critic-gate.js +0 -132
  103. package/dist/core/agent/hallucination-gate.js +0 -197
  104. package/dist/core/agent/loop-state.js +0 -68
  105. package/dist/core/agent/prefix-monitor.js +0 -101
  106. package/dist/core/agent/reasoning-resolver.js +0 -65
  107. package/dist/core/agent/token-tracker.js +0 -99
  108. package/dist/core/agent/tool-batch.js +0 -312
  109. package/dist/core/agent/tool-images.js +0 -18
  110. package/dist/core/agent/tool-output.js +0 -116
  111. package/dist/core/agent/tool-pairing.js +0 -60
  112. package/dist/core/agent-moe.js +0 -248
  113. package/dist/core/agent.js +0 -1299
  114. package/dist/core/bootstrap/agent-phase.js +0 -66
  115. package/dist/core/bootstrap/config-phase.js +0 -86
  116. package/dist/core/bootstrap/modules-phase.js +0 -269
  117. package/dist/core/bootstrap/provider-phase.js +0 -183
  118. package/dist/core/bootstrap/session-phase.js +0 -204
  119. package/dist/core/bootstrap/state.js +0 -94
  120. package/dist/core/bootstrap/workspace-phase.js +0 -115
  121. package/dist/core/bootstrap.js +0 -112
  122. package/dist/core/crash-handler.js +0 -62
  123. package/dist/core/environment.js +0 -224
  124. package/dist/core/host-plan.js +0 -43
  125. package/dist/core/host.js +0 -23
  126. package/dist/core/index.js +0 -3
  127. package/dist/core/prompt-builder.js +0 -95
  128. package/dist/core/prompt-overflow.js +0 -306
  129. package/dist/core/session-logger.js +0 -375
  130. package/dist/core/system-prompt.js +0 -117
  131. package/dist/core/types.js +0 -1
  132. package/dist/core/version.js +0 -28
  133. package/dist/core/web-host.js +0 -34
  134. package/dist/core/workspace.js +0 -80
  135. package/dist/i18n/index.js +0 -80
  136. package/dist/index.js +0 -30
  137. package/dist/llm/cache-usage.js +0 -76
  138. package/dist/llm/image-utils.js +0 -138
  139. package/dist/llm/index.js +0 -4
  140. package/dist/llm/llm-errors.js +0 -50
  141. package/dist/llm/model-loader.js +0 -86
  142. package/dist/llm/models-dev.js +0 -121
  143. package/dist/llm/openai-compat.js +0 -756
  144. package/dist/llm/orchestrator.js +0 -294
  145. package/dist/llm/provider-budget.js +0 -68
  146. package/dist/llm/provider-context.js +0 -233
  147. package/dist/llm/provider.js +0 -9
  148. package/dist/llm/response.js +0 -44
  149. package/dist/llm/stream-state.js +0 -26
  150. package/dist/llm/token-counter.js +0 -83
  151. package/dist/llm/types.js +0 -1
  152. package/dist/logger/app-logger.js +0 -212
  153. package/dist/logger/file-log.js +0 -160
  154. package/dist/logger/index.js +0 -2
  155. package/dist/migration/backup.js +0 -56
  156. package/dist/migration/detect.js +0 -61
  157. package/dist/migration/index.js +0 -3
  158. package/dist/modules/artifacts/store.js +0 -62
  159. package/dist/modules/browser/actions.js +0 -79
  160. package/dist/modules/browser/bridge-client.js +0 -203
  161. package/dist/modules/browser/bridge-path.js +0 -10
  162. package/dist/modules/browser/console-buffer.js +0 -37
  163. package/dist/modules/browser/cookie-store.js +0 -29
  164. package/dist/modules/browser/driver-types.js +0 -1
  165. package/dist/modules/browser/driver.js +0 -186
  166. package/dist/modules/browser/index.js +0 -9
  167. package/dist/modules/browser/module.js +0 -30
  168. package/dist/modules/browser/session.js +0 -322
  169. package/dist/modules/browser/snapshot.js +0 -154
  170. package/dist/modules/browser/types.js +0 -13
  171. package/dist/modules/certification/cli.js +0 -264
  172. package/dist/modules/certification/fact-checker.js +0 -90
  173. package/dist/modules/certification/loader.js +0 -127
  174. package/dist/modules/certification/manifest.js +0 -231
  175. package/dist/modules/certification/runner.js +0 -233
  176. package/dist/modules/certification/scenarios.js +0 -586
  177. package/dist/modules/certification/syntax-scenarios.js +0 -50
  178. package/dist/modules/certification/types.js +0 -1
  179. package/dist/modules/context/chunk-query.js +0 -122
  180. package/dist/modules/context/fact-extractor.js +0 -170
  181. package/dist/modules/context/history.js +0 -15
  182. package/dist/modules/context/index.js +0 -2
  183. package/dist/modules/context/manager.js +0 -482
  184. package/dist/modules/critic/client.js +0 -176
  185. package/dist/modules/critic/evidence.js +0 -81
  186. package/dist/modules/critic/provider.js +0 -45
  187. package/dist/modules/critic/tools.js +0 -78
  188. package/dist/modules/critic/types.js +0 -1
  189. package/dist/modules/execution/audit-runners.js +0 -206
  190. package/dist/modules/execution/auditor.js +0 -222
  191. package/dist/modules/execution/execution-plugin.js +0 -478
  192. package/dist/modules/execution/index.js +0 -8
  193. package/dist/modules/execution/input-from.js +0 -70
  194. package/dist/modules/execution/module.js +0 -891
  195. package/dist/modules/execution/moe-executor.js +0 -443
  196. package/dist/modules/execution/plan-actions.js +0 -642
  197. package/dist/modules/execution/plan-checks.js +0 -35
  198. package/dist/modules/execution/plan-coverage.js +0 -71
  199. package/dist/modules/execution/plan-persister.js +0 -46
  200. package/dist/modules/execution/plan-steps.js +0 -31
  201. package/dist/modules/execution/plan-store.js +0 -274
  202. package/dist/modules/execution/plan-tool.js +0 -249
  203. package/dist/modules/execution/plan-validator.js +0 -197
  204. package/dist/modules/execution/planner.js +0 -103
  205. package/dist/modules/execution/stuck-detector.js +0 -834
  206. package/dist/modules/execution/tracker.js +0 -92
  207. package/dist/modules/execution/transient-error.js +0 -30
  208. package/dist/modules/execution/types.js +0 -1
  209. package/dist/modules/execution/verifier.js +0 -343
  210. package/dist/modules/execution/windows-commands.js +0 -52
  211. package/dist/modules/hallucination/artifact-claim.js +0 -93
  212. package/dist/modules/hallucination/confidence.js +0 -81
  213. package/dist/modules/hallucination/consistency.js +0 -37
  214. package/dist/modules/hallucination/detector.js +0 -57
  215. package/dist/modules/hallucination/factual.js +0 -205
  216. package/dist/modules/hallucination/index.js +0 -6
  217. package/dist/modules/hallucination/js-identifiers.js +0 -261
  218. package/dist/modules/hallucination/llm-judge.js +0 -116
  219. package/dist/modules/hallucination/success-claim.js +0 -59
  220. package/dist/modules/index.js +0 -5
  221. package/dist/modules/indexer/cache.js +0 -88
  222. package/dist/modules/indexer/index.js +0 -4
  223. package/dist/modules/indexer/map-command.js +0 -33
  224. package/dist/modules/indexer/map-select.js +0 -87
  225. package/dist/modules/indexer/module.js +0 -293
  226. package/dist/modules/indexer/project-profile.js +0 -184
  227. package/dist/modules/indexer/symbols.js +0 -189
  228. package/dist/modules/indexer/walker.js +0 -285
  229. package/dist/modules/lsp/check-tool.js +0 -61
  230. package/dist/modules/lsp/client.js +0 -406
  231. package/dist/modules/lsp/command.js +0 -53
  232. package/dist/modules/lsp/config.js +0 -189
  233. package/dist/modules/lsp/index.js +0 -4
  234. package/dist/modules/lsp/module.js +0 -295
  235. package/dist/modules/lsp/probe.js +0 -86
  236. package/dist/modules/lsp/project-root.js +0 -69
  237. package/dist/modules/lsp/startup-check.js +0 -154
  238. package/dist/modules/lsp/types.js +0 -1
  239. package/dist/modules/mcp/client.js +0 -445
  240. package/dist/modules/mcp/index.js +0 -4
  241. package/dist/modules/mcp/module.js +0 -295
  242. package/dist/modules/mcp/registry.js +0 -20
  243. package/dist/modules/memory/index.js +0 -2
  244. package/dist/modules/memory/module.js +0 -101
  245. package/dist/modules/memory/search.js +0 -45
  246. package/dist/modules/memory/store.js +0 -107
  247. package/dist/modules/onboarding/init.js +0 -47
  248. package/dist/modules/onboarding/meet.js +0 -30
  249. package/dist/modules/onboarding/mode.js +0 -30
  250. package/dist/modules/onboarding/prompts.js +0 -43
  251. package/dist/modules/pipelines/engine.js +0 -70
  252. package/dist/modules/pipelines/index.js +0 -4
  253. package/dist/modules/pipelines/parser.js +0 -59
  254. package/dist/modules/pipelines/template.js +0 -18
  255. package/dist/modules/plugins/builtin/lint-on-write.js +0 -377
  256. package/dist/modules/plugins/builtin/notify.js +0 -11
  257. package/dist/modules/plugins/index.js +0 -2
  258. package/dist/modules/plugins/loader.js +0 -85
  259. package/dist/modules/plugins/manager.js +0 -244
  260. package/dist/modules/plugins/types.js +0 -1
  261. package/dist/modules/pricing/index.js +0 -70
  262. package/dist/modules/pricing/prices.js +0 -147
  263. package/dist/modules/processes/detect.js +0 -34
  264. package/dist/modules/processes/index.js +0 -4
  265. package/dist/modules/processes/kill-tree.js +0 -52
  266. package/dist/modules/processes/registry.js +0 -294
  267. package/dist/modules/processes/runner.js +0 -23
  268. package/dist/modules/providers/cache.js +0 -23
  269. package/dist/modules/providers/capabilities.js +0 -28
  270. package/dist/modules/providers/create.js +0 -21
  271. package/dist/modules/providers/factory.js +0 -28
  272. package/dist/modules/providers/fallback.js +0 -81
  273. package/dist/modules/providers/health.js +0 -47
  274. package/dist/modules/providers/index.js +0 -6
  275. package/dist/modules/providers/manager.js +0 -207
  276. package/dist/modules/providers/naming.js +0 -15
  277. package/dist/modules/providers/preflight.js +0 -71
  278. package/dist/modules/providers/presets.js +0 -232
  279. package/dist/modules/providers/registry.js +0 -27
  280. package/dist/modules/providers/types.js +0 -1
  281. package/dist/modules/reasoning/policy.js +0 -42
  282. package/dist/modules/reasoning/probe.js +0 -116
  283. package/dist/modules/registry.js +0 -48
  284. package/dist/modules/security/audit-log.js +0 -119
  285. package/dist/modules/security/audit-notifier.js +0 -267
  286. package/dist/modules/security/command-validator.js +0 -272
  287. package/dist/modules/security/content-scanner.js +0 -53
  288. package/dist/modules/security/data-sanitizer.js +0 -82
  289. package/dist/modules/security/encryption.js +0 -216
  290. package/dist/modules/security/index.js +0 -15
  291. package/dist/modules/security/network-validator.js +0 -236
  292. package/dist/modules/security/path-validator.js +0 -261
  293. package/dist/modules/security/protected-paths.js +0 -73
  294. package/dist/modules/security/rate-limiter.js +0 -98
  295. package/dist/modules/security/security-policies.js +0 -499
  296. package/dist/modules/security/session-encryption.js +0 -182
  297. package/dist/modules/security/session-isolation.js +0 -75
  298. package/dist/modules/session/auto-name.js +0 -63
  299. package/dist/modules/session/export.js +0 -98
  300. package/dist/modules/session/index.js +0 -4
  301. package/dist/modules/session/manager.js +0 -234
  302. package/dist/modules/session/module.js +0 -33
  303. package/dist/modules/session/store.js +0 -295
  304. package/dist/modules/session/types.js +0 -1
  305. package/dist/modules/setup/answers.js +0 -35
  306. package/dist/modules/setup/apply.js +0 -79
  307. package/dist/modules/setup/discovery.js +0 -72
  308. package/dist/modules/skills/index.js +0 -3
  309. package/dist/modules/skills/loader.js +0 -86
  310. package/dist/modules/skills/matcher.js +0 -27
  311. package/dist/modules/skills/module.js +0 -141
  312. package/dist/modules/types.js +0 -1
  313. package/dist/modules/updater/changelog-reader.js +0 -93
  314. package/dist/modules/updater/checker.js +0 -101
  315. package/dist/modules/updater/dev-detect.js +0 -18
  316. package/dist/modules/updater/index.js +0 -4
  317. package/dist/modules/updater/module.js +0 -129
  318. package/dist/modules/user-profile/compressor.js +0 -18
  319. package/dist/modules/user-profile/index.js +0 -2
  320. package/dist/modules/user-profile/profile.js +0 -77
  321. package/dist/modules/webui/answer-api.js +0 -29
  322. package/dist/modules/webui/assets.js +0 -50
  323. package/dist/modules/webui/body.js +0 -21
  324. package/dist/modules/webui/commands-settings.js +0 -209
  325. package/dist/modules/webui/commands-shared.js +0 -60
  326. package/dist/modules/webui/commands.js +0 -174
  327. package/dist/modules/webui/config-api.js +0 -134
  328. package/dist/modules/webui/file-api.js +0 -202
  329. package/dist/modules/webui/forward.js +0 -159
  330. package/dist/modules/webui/history-api.js +0 -112
  331. package/dist/modules/webui/host-state.js +0 -60
  332. package/dist/modules/webui/i18n-api.js +0 -9
  333. package/dist/modules/webui/limits.js +0 -6
  334. package/dist/modules/webui/log-forward.js +0 -20
  335. package/dist/modules/webui/memory-commands.js +0 -64
  336. package/dist/modules/webui/model-cache.js +0 -18
  337. package/dist/modules/webui/module.js +0 -148
  338. package/dist/modules/webui/persist.js +0 -24
  339. package/dist/modules/webui/prompt-io.js +0 -97
  340. package/dist/modules/webui/providers-api.js +0 -337
  341. package/dist/modules/webui/providers-view.js +0 -56
  342. package/dist/modules/webui/reasoning-view.js +0 -15
  343. package/dist/modules/webui/run-agent.js +0 -81
  344. package/dist/modules/webui/server.js +0 -284
  345. package/dist/modules/webui/sessions-api.js +0 -178
  346. package/dist/modules/webui/settings-api.js +0 -561
  347. package/dist/modules/webui/setup-api.js +0 -201
  348. package/dist/modules/webui/state.js +0 -74
  349. package/dist/modules/webui/util.js +0 -261
  350. package/dist/output/bus.js +0 -37
  351. package/dist/output/channel.js +0 -285
  352. package/dist/output/format.js +0 -15
  353. package/dist/output/index.js +0 -8
  354. package/dist/output/json-sink.js +0 -24
  355. package/dist/output/machine.js +0 -9
  356. package/dist/output/session-sink.js +0 -27
  357. package/dist/output/types.js +0 -1
  358. package/dist/tools/approve.js +0 -41
  359. package/dist/tools/attach-image.js +0 -102
  360. package/dist/tools/auto-fixer.js +0 -180
  361. package/dist/tools/auto-tags.js +0 -83
  362. package/dist/tools/bash.js +0 -649
  363. package/dist/tools/browser.js +0 -160
  364. package/dist/tools/chunk-query.js +0 -112
  365. package/dist/tools/create-dir.js +0 -60
  366. package/dist/tools/delete-file.js +0 -67
  367. package/dist/tools/download-file.js +0 -142
  368. package/dist/tools/edit-file.js +0 -136
  369. package/dist/tools/enable-tools.js +0 -59
  370. package/dist/tools/executor.js +0 -304
  371. package/dist/tools/file-info.js +0 -49
  372. package/dist/tools/filter-tools.js +0 -17
  373. package/dist/tools/glob-tool.js +0 -37
  374. package/dist/tools/grep-tool.js +0 -142
  375. package/dist/tools/hidden-tools-block.js +0 -37
  376. package/dist/tools/index.js +0 -88
  377. package/dist/tools/list-dir.js +0 -53
  378. package/dist/tools/load-skill.js +0 -51
  379. package/dist/tools/mcp-call.js +0 -80
  380. package/dist/tools/meet-done.js +0 -14
  381. package/dist/tools/move-file.js +0 -94
  382. package/dist/tools/path-utils.js +0 -108
  383. package/dist/tools/pipeline-run.js +0 -167
  384. package/dist/tools/preview.js +0 -2
  385. package/dist/tools/process-ids.js +0 -31
  386. package/dist/tools/process-kill.js +0 -33
  387. package/dist/tools/process-list.js +0 -38
  388. package/dist/tools/process-log.js +0 -49
  389. package/dist/tools/process-wait.js +0 -63
  390. package/dist/tools/prompt-io.js +0 -29
  391. package/dist/tools/question.js +0 -288
  392. package/dist/tools/read-file.js +0 -200
  393. package/dist/tools/recall.js +0 -124
  394. package/dist/tools/registry.js +0 -48
  395. package/dist/tools/remember.js +0 -72
  396. package/dist/tools/scope-check.js +0 -32
  397. package/dist/tools/scope-request.js +0 -96
  398. package/dist/tools/search-history.js +0 -88
  399. package/dist/tools/session-info.js +0 -46
  400. package/dist/tools/set-thinking.js +0 -75
  401. package/dist/tools/subagent.js +0 -257
  402. package/dist/tools/syntax-validator.js +0 -379
  403. package/dist/tools/types.js +0 -1
  404. package/dist/tools/user-input.js +0 -134
  405. package/dist/tools/web-browse.js +0 -93
  406. package/dist/tools/web-fetch.js +0 -108
  407. package/dist/tools/web-search.js +0 -107
  408. package/dist/tools/write-file.js +0 -128
  409. package/dist/ui/action-log.js +0 -13
  410. package/dist/ui/box.js +0 -78
  411. package/dist/ui/colors.js +0 -6
  412. package/dist/ui/diff.js +0 -189
  413. package/dist/ui/index.js +0 -7
  414. package/dist/ui/line-editor.js +0 -1083
  415. package/dist/ui/line-math.js +0 -98
  416. package/dist/ui/md-formatter.js +0 -322
  417. package/dist/ui/output.js +0 -19
  418. package/dist/ui/plan-view.js +0 -109
  419. package/dist/ui/renderer.js +0 -589
  420. package/dist/ui/spinner.js +0 -91
  421. package/dist/ui/table.js +0 -142
  422. package/dist/ui/theme.js +0 -143
  423. package/dist/utils/child-run.js +0 -20
  424. package/dist/utils/error.js +0 -4
  425. package/dist/utils/index.js +0 -6
  426. package/dist/utils/retry.js +0 -17
  427. package/dist/utils/sleep.js +0 -23
  428. package/dist/utils/truncate.js +0 -9
@@ -1,201 +0,0 @@
1
- import { getFlatDicts, setLocale } from "../../i18n";
2
- import { applyAnswersToConfig } from "../setup/apply";
3
- import { SETUP_LANGUAGES } from "../setup/answers";
4
- import { fetchProviderModels, scanLocalServers, testProviderChat, } from "../setup/discovery";
5
- import { broadcast } from "./state";
6
- import { readBody, readBodyError, sendJson } from "./util";
7
- import { readJsonBody } from "./body";
8
- import { persistAndReconfigure } from "./persist";
9
- function str(rec, key) {
10
- const v = rec[key];
11
- return typeof v === "string" ? v.trim() : "";
12
- }
13
- /** Положительный int, числовая строка принимается; `null` — мусор. */
14
- function positiveInt(rec, key) {
15
- const v = rec[key];
16
- const n = typeof v === "number" ? v : typeof v === "string" ? Number(v) : NaN;
17
- return Number.isInteger(n) && n > 0 ? n : null;
18
- }
19
- /** Валидирует тело `POST /api/setup`; `null` — реджект с 400. */
20
- export function parseSetupAnswers(rec) {
21
- const provider = str(rec, "provider");
22
- const apiBase = str(rec, "apiBase");
23
- const model = str(rec, "model");
24
- if (!provider || !apiBase || !model)
25
- return null;
26
- const contextWindow = positiveInt(rec, "contextWindow");
27
- const maxToolIterations = positiveInt(rec, "maxToolIterations");
28
- if (contextWindow === null || maxToolIterations === null)
29
- return null;
30
- const locale = str(rec, "locale");
31
- if (!SETUP_LANGUAGES.some((l) => l.value === locale))
32
- return null;
33
- const flags = ["securityBashBlock", "securityFlagsBlock", "securityPathsRestrict"];
34
- for (const key of flags) {
35
- if (typeof rec[key] !== "boolean")
36
- return null;
37
- }
38
- const apiKey = typeof rec.apiKey === "string" && rec.apiKey.trim() ? rec.apiKey.trim() : "not-needed";
39
- return {
40
- provider,
41
- apiBase,
42
- apiKey,
43
- model,
44
- contextWindow,
45
- maxToolIterations,
46
- locale,
47
- securityBashBlock: rec.securityBashBlock,
48
- securityFlagsBlock: rec.securityFlagsBlock,
49
- securityPathsRestrict: rec.securityPathsRestrict,
50
- };
51
- }
52
- /** `GET /api/setup` — нужен ли сетап, плюс статика визарда. */
53
- export function handleSetupGet(res, s) {
54
- sendJson(res, 200, {
55
- required: s.setupRequired,
56
- languages: s.setup?.languages ?? [],
57
- providers: s.setup?.providers ?? [],
58
- defaults: s.setup?.defaults ?? { contextWindow: 0, maxToolIterations: 0 },
59
- });
60
- }
61
- /** `POST /api/setup/scan` — проб известных локальных OpenAI-совместимых серверов. */
62
- export function handleSetupScan(req, res, s) {
63
- readBody(req, s.maxBodyBytes)
64
- .then(async () => {
65
- const servers = await scanLocalServers();
66
- sendJson(res, 200, { servers });
67
- })
68
- .catch((err) => {
69
- readBodyError(req, res, err);
70
- });
71
- }
72
- /** `POST /api/setup/models {baseUrl, apiKey}` — id моделей провайдера. */
73
- export function handleSetupModels(req, res, s) {
74
- readJsonBody(req, s.maxBodyBytes)
75
- .then(async (rec) => {
76
- if (!rec) {
77
- sendJson(res, 400, { ok: false, error: "invalid JSON" });
78
- return;
79
- }
80
- const baseUrl = str(rec, "baseUrl");
81
- if (!baseUrl) {
82
- sendJson(res, 400, { ok: false, error: "invalid-base-url" });
83
- return;
84
- }
85
- const models = await fetchProviderModels(baseUrl, str(rec, "apiKey"));
86
- sendJson(res, 200, { models });
87
- })
88
- .catch((err) => {
89
- readBodyError(req, res, err);
90
- });
91
- }
92
- /** `POST /api/setup/test {baseUrl, apiKey, model}` — дешёвый чат-проб. */
93
- export function handleSetupTest(req, res, s) {
94
- readJsonBody(req, s.maxBodyBytes)
95
- .then(async (rec) => {
96
- if (!rec) {
97
- sendJson(res, 400, { ok: false, error: "invalid JSON" });
98
- return;
99
- }
100
- const baseUrl = str(rec, "baseUrl");
101
- const model = str(rec, "model");
102
- if (!baseUrl || !model) {
103
- sendJson(res, 400, { ok: false, error: "invalid-test-request" });
104
- return;
105
- }
106
- const ok = await testProviderChat(baseUrl, str(rec, "apiKey"), model);
107
- sendJson(res, 200, { ok });
108
- })
109
- .catch((err) => {
110
- readBodyError(req, res, err);
111
- });
112
- }
113
- /**
114
- * `POST /api/setup/locale {locale}` — переключает локаль i18n процесса, чтобы
115
- * следующие шаги визарда локализовались. Не персистится (финал `POST /api/setup`
116
- * пишет выбранную локаль в конфиг).
117
- */
118
- export function handleSetupLocale(req, res, s) {
119
- readJsonBody(req, s.maxBodyBytes)
120
- .then((rec) => {
121
- if (!rec) {
122
- sendJson(res, 400, { ok: false, error: "invalid JSON" });
123
- return;
124
- }
125
- const locale = str(rec, "locale");
126
- if (!SETUP_LANGUAGES.some((l) => l.value === locale)) {
127
- sendJson(res, 400, { ok: false, error: "unsupported-locale" });
128
- return;
129
- }
130
- setLocale(locale);
131
- sendJson(res, 200, { ok: true, locale, dicts: getFlatDicts() });
132
- })
133
- .catch((err) => {
134
- readBodyError(req, res, err);
135
- });
136
- }
137
- /** `POST /api/setup` — валидация, применение, персист, reconfigure, снятие гейта. */
138
- export function handleSetupPost(req, res, s) {
139
- if (!s.config) {
140
- sendJson(res, 503, { error: "config_unavailable" });
141
- return;
142
- }
143
- if (!s.setupRequired) {
144
- sendJson(res, 409, { error: "already_configured" });
145
- return;
146
- }
147
- const config = s.config;
148
- readJsonBody(req, s.maxBodyBytes)
149
- .then(async (rec) => {
150
- if (!rec) {
151
- sendJson(res, 400, { ok: false, error: "invalid JSON" });
152
- return;
153
- }
154
- const answers = parseSetupAnswers(rec);
155
- if (!answers) {
156
- sendJson(res, 400, { ok: false, error: "invalid-answers" });
157
- return;
158
- }
159
- applyAnswersToConfig(config, answers);
160
- setLocale(config.locale);
161
- const { persisted, warning } = await persistAndReconfigure(s, config);
162
- s.setupRequired = false;
163
- broadcast({ type: "setup_done", ts: Date.now() }, s);
164
- const body = { ok: true, persisted };
165
- if (warning)
166
- body.warning = warning;
167
- sendJson(res, 200, body);
168
- })
169
- .catch((err) => {
170
- readBodyError(req, res, err);
171
- });
172
- }
173
- /** Диспатч `/api/setup*`; возвращает, обработан ли запрос. */
174
- export function handleSetupApi(req, res, reqUrl, s) {
175
- const p = reqUrl.pathname;
176
- if (p === "/api/setup" && req.method === "GET") {
177
- handleSetupGet(res, s);
178
- return true;
179
- }
180
- if (p === "/api/setup" && req.method === "POST") {
181
- handleSetupPost(req, res, s);
182
- return true;
183
- }
184
- if (p === "/api/setup/scan" && req.method === "POST") {
185
- handleSetupScan(req, res, s);
186
- return true;
187
- }
188
- if (p === "/api/setup/models" && req.method === "POST") {
189
- handleSetupModels(req, res, s);
190
- return true;
191
- }
192
- if (p === "/api/setup/test" && req.method === "POST") {
193
- handleSetupTest(req, res, s);
194
- return true;
195
- }
196
- if (p === "/api/setup/locale" && req.method === "POST") {
197
- handleSetupLocale(req, res, s);
198
- return true;
199
- }
200
- return false;
201
- }
@@ -1,74 +0,0 @@
1
- import { MAX_BODY_BYTES } from "./limits";
2
- import { readEnv } from "../../config/env";
3
- /** Только положительный int; мусор даёт фолбэк 5. */
4
- export function parseMaxClients(raw) {
5
- const n = Number(raw);
6
- return Number.isInteger(n) && n > 0 ? n : 5;
7
- }
8
- /** Свежее состояние с env-дефолтами (хост, токен, капы). */
9
- export function createWebUiState() {
10
- return {
11
- server: null,
12
- starting: null,
13
- url: "",
14
- host: readEnv("WEBUI_HOST") || "127.0.0.1",
15
- token: readEnv("WEBUI_TOKEN") || null,
16
- clients: new Set(),
17
- bridge: null,
18
- busy: false,
19
- agentRunning: false,
20
- turnToken: null,
21
- lastPostTs: 0,
22
- minPostIntervalMs: 500,
23
- historyTail: 200,
24
- maxBodyBytes: MAX_BODY_BYTES,
25
- maxClients: parseMaxClients(readEnv("WEBUI_MAX_CLIENTS")),
26
- pendingQuestions: new Map(),
27
- setupRequired: false,
28
- };
29
- }
30
- /** Шлёт событие всем SSE-клиентам (с backpressure-дропом зависших). */
31
- export function broadcast(ev, s) {
32
- // Штампуем активную сессию на каждое событие, чтобы клиент клал стрим
33
- // в правильную вкладку. Событие вправе переопределить явно.
34
- const data = s.activeSessionId ? { sessionId: s.activeSessionId, ...ev } : ev;
35
- const payload = `event: ${ev.type}\ndata: ${JSON.stringify(data)}\n\n`;
36
- for (const client of s.clients) {
37
- // Backpressure: `false` — буфер сокета полон (медленный/виснущий читатель).
38
- // Дропаем клиента, а не копим события безгранично.
39
- try {
40
- if (!client.write(payload)) {
41
- s.clients.delete(client);
42
- client.end();
43
- }
44
- }
45
- catch {
46
- s.clients.delete(client);
47
- }
48
- }
49
- }
50
- /**
51
- * Атомарно резервирует single-flight слот, возвращает токен владения.
52
- *
53
- * Звать СИНХРОННО в том же тике, что пречек busy: любой `await` между чеком
54
- * и резервом даст двум конкурентным сабмитам оба выиграть. Токен явно фиксирует
55
- * владельца сброса — поздний колбэк провала прошлого хода чужой резерв не снесёт.
56
- */
57
- export function reserveBusy(s) {
58
- const token = {};
59
- s.turnToken = token;
60
- s.busy = true;
61
- return token;
62
- }
63
- /**
64
- * Отпускает слот, только если `token` всё ещё владеет им. Возвращает, был ли
65
- * вызывающий владельцем (чтобы скипнуть дублирующий бродкаст `state`, когда
66
- * форвардерный `turn_end` флаг уже сбросил).
67
- */
68
- export function releaseBusy(s, token) {
69
- if (s.turnToken !== token)
70
- return false;
71
- s.turnToken = null;
72
- s.busy = false;
73
- return true;
74
- }
@@ -1,261 +0,0 @@
1
- // Транспортные хелперы сервера `mma web` (auth, тела, JSON, single-flight сабмита).
2
- /**
3
- * Вынесены из `server.ts`, чтобы каждый файл был сильно меньше бюджета 300 строк
4
- * (правило #1). Чистая обвязка запрос/ответ — без переходов состояния приложения.
5
- */
6
- import { exec } from "node:child_process";
7
- import { timingSafeEqual } from "node:crypto";
8
- import { errMsg } from "../../utils/error";
9
- import { redactContextSecrets } from "../../core/agent/context-log";
10
- import { broadcast, releaseBusy, reserveBusy } from "./state";
11
- import { MAX_BODY_BYTES } from "./limits";
12
- import { readEnv } from "../../config/env";
13
- export { MAX_BODY_BYTES } from "./limits";
14
- /** Жёсткий кап текста одного сообщения, независимый от капа тела транспорта. */
15
- export const MAX_MESSAGE_CHARS = 32 * 1024;
16
- /** Максимум картинок на сообщение (по дизайну ≤3). */
17
- export const MAX_IMAGES = 3;
18
- /** Максимум размера одного `data:image/...` URL (по дизайну ~6MB). */
19
- export const MAX_IMAGE_DATA_URL_BYTES = 6 * 1024 * 1024;
20
- /** Бросается из readBody при превышении капа (маппится в HTTP 413). */
21
- export class BodyTooLargeError extends Error {
22
- constructor() {
23
- super("body too large");
24
- this.name = "BodyTooLargeError";
25
- }
26
- }
27
- /** True для loopback-хостов. */
28
- export function isLoopback(host) {
29
- return host === "127.0.0.1" || host === "localhost" || host === "::1";
30
- }
31
- /** Сравнение строк за константное время; разные длины коротко замыкаются (timingSafeEqual бросает). */
32
- function safeEqual(a, b) {
33
- const ab = Buffer.from(a);
34
- const bb = Buffer.from(b);
35
- if (ab.length !== bb.length)
36
- return false;
37
- return timingSafeEqual(ab, bb);
38
- }
39
- /** Имя HttpOnly-куки, несущей веб-токен для GET-навигаций. */
40
- const AUTH_COOKIE = "mma_web_auth";
41
- /** Читает значение куки из сырого заголовка `Cookie:`; битые кодировки дают null. */
42
- function cookieValue(header, name) {
43
- if (!header)
44
- return null;
45
- for (const part of header.split(";")) {
46
- const eq = part.indexOf("=");
47
- if (eq === -1)
48
- continue;
49
- if (part.slice(0, eq).trim() === name) {
50
- const raw = part.slice(eq + 1).trim();
51
- try {
52
- return decodeURIComponent(raw);
53
- }
54
- catch {
55
- return null;
56
- }
57
- }
58
- }
59
- return null;
60
- }
61
- /** Токен-auth HTTP-поверхностей (заголовок `x-mma-token`, `?token=` или кука); без токена — разрешено. */
62
- export function checkAuth(req, reqUrl, s) {
63
- if (!s.token)
64
- return true;
65
- const header = req.headers["x-mma-token"];
66
- if (typeof header === "string" && safeEqual(header, s.token))
67
- return true;
68
- const query = reqUrl.searchParams.get("token");
69
- if (query !== null && safeEqual(query, s.token))
70
- return true;
71
- const cookie = cookieValue(req.headers.cookie, AUTH_COOKIE);
72
- return cookie !== null && safeEqual(cookie, s.token);
73
- }
74
- /**
75
- * Выдаёт браузеру same-site куку с токеном, чтобы plain-навигация
76
- * `<a target="_blank" href="/api/file?...">` (не умеющая ставить заголовок
77
- * `x-mma-token`) всё равно аутентифицировалась. `SameSite=Strict` — кросс-сайт
78
- * запрос её никогда не несёт, так что CSRF-поверхности не добавляется.
79
- */
80
- export function setAuthCookie(res, s) {
81
- if (!s.token)
82
- return;
83
- res.setHeader("Set-Cookie", `${AUTH_COOKIE}=${encodeURIComponent(s.token)}; Path=/; HttpOnly; SameSite=Strict`);
84
- }
85
- /** Отклоняет кросс-доменные записи из браузера (CSRF-закалка). */
86
- export function sameOrigin(req, reqUrl) {
87
- const origin = req.headers.origin;
88
- if (!origin)
89
- return true; // curl / same-origin GET
90
- try {
91
- return new URL(String(origin)).host === reqUrl.host;
92
- }
93
- catch {
94
- return false;
95
- }
96
- }
97
- /** Отправляет JSON-ответ со статусом. */
98
- export function sendJson(res, status, body) {
99
- res.writeHead(status, { "Content-Type": "application/json; charset=utf-8" });
100
- res.end(JSON.stringify(body));
101
- }
102
- /**
103
- * Буферизует тело запроса до `cap`. На переполнении реджектит `BodyTooLargeError`
104
- * БЕЗ убийства сокета: вызывающий владеет ответом 413 и рвёт запрос только
105
- * после флаша ответа — иначе клиент получит socket error вместо 413.
106
- */
107
- export function readBody(req, cap = MAX_BODY_BYTES) {
108
- return new Promise((resolve, reject) => {
109
- let size = 0;
110
- let settled = false;
111
- const chunks = [];
112
- req.on("data", (chunk) => {
113
- if (settled)
114
- return;
115
- size += chunk.length;
116
- if (size > cap) {
117
- settled = true;
118
- reject(new BodyTooLargeError());
119
- return;
120
- }
121
- chunks.push(chunk);
122
- });
123
- req.on("end", () => {
124
- if (!settled)
125
- resolve(Buffer.concat(chunks).toString("utf8"));
126
- });
127
- req.on("error", (err) => {
128
- if (!settled) {
129
- settled = true;
130
- reject(err);
131
- }
132
- });
133
- });
134
- }
135
- /** Достаёт `{ text, images }` из распарсенного тела; битый JSON и пусто — разные ошибки. */
136
- export function parseMessageBody(raw) {
137
- let parsed;
138
- try {
139
- parsed = JSON.parse(raw);
140
- }
141
- catch {
142
- return { error: "invalid JSON" };
143
- }
144
- const rec = typeof parsed === "object" && parsed !== null ? parsed : {};
145
- const text = (typeof rec.text === "string" ? rec.text : "").slice(0, MAX_MESSAGE_CHARS);
146
- const rawImages = Array.isArray(rec.images) ? rec.images : [];
147
- if (rawImages.length > MAX_IMAGES)
148
- return { error: "too many images" };
149
- const images = [];
150
- for (const img of rawImages) {
151
- if (typeof img !== "string" || !img.startsWith("data:image/")) {
152
- return { error: "invalid image" };
153
- }
154
- if (Buffer.byteLength(img, "utf8") > MAX_IMAGE_DATA_URL_BYTES) {
155
- return { error: "image too large" };
156
- }
157
- images.push(img);
158
- }
159
- if (text.trim().length === 0 && images.length === 0)
160
- return { error: "empty" };
161
- return { text, images };
162
- }
163
- /**
164
- * Вычищает credentials из текста ошибки перед укладкой в SSE-пейлоад.
165
- * Переиспользует `redactContextSecrets` (точечная редактура) — общий
166
- * `sanitizeLogMessage` покалечил бы обычный текст, а веб-UI показывает их людям.
167
- */
168
- export function scrubError(err) {
169
- return redactContextSecrets(errMsg(err));
170
- }
171
- /** Маппит провал чтения тела в ответ; переполненные получают flush-safe 413. */
172
- export function readBodyError(req, res, err) {
173
- if (err instanceof BodyTooLargeError) {
174
- res.writeHead(413, { "Content-Type": "application/json; charset=utf-8" });
175
- // Уничтожаем запрос только после флаша 413; убийство раньше —
176
- // и клиент видит socket error вместо статуса.
177
- res.end(JSON.stringify({ error: "body too large" }), () => req.destroy());
178
- return;
179
- }
180
- sendJson(res, 400, { error: "bad request" });
181
- }
182
- /**
183
- * `POST /api/message`: резервирует single-flight слот и отдаёт хосту.
184
- *
185
- * Инвариант single-flight: пречек busy и {@link reserveBusy} — в ОДИН
186
- * синхронный тик (без `await` между), иначе два конкурентных POST оба пройдут.
187
- * `bridge.isBusy()` следит за реально бегущим ходом (`agentRunning`) отдельно
188
- * от UI-резервации (`s.busy`) — поэтому сабмит владельца сбрасывает собственный
189
- * `isBusy()`-гард хоста. Форвардерный `turn_end` — единственный сброс для
190
- * стартовавшего хода; `releaseBusy` покрывает сабмит, так и не стартовавший.
191
- */
192
- export function handleMessagePost(req, res, s) {
193
- if (s.setupRequired) {
194
- sendJson(res, 409, { error: "setup_required" });
195
- return;
196
- }
197
- if (!s.bridge) {
198
- sendJson(res, 503, { error: "no_bridge" });
199
- return;
200
- }
201
- if (s.busy || s.bridge.isBusy()) {
202
- sendJson(res, 409, { error: "busy" });
203
- return;
204
- }
205
- if (s.minPostIntervalMs > 0 && Date.now() - s.lastPostTs < s.minPostIntervalMs) {
206
- sendJson(res, 429, { error: "rate_limited" });
207
- return;
208
- }
209
- const bridge = s.bridge;
210
- const token = reserveBusy(s);
211
- broadcast({ type: "state", ts: Date.now(), busy: true }, s);
212
- readBody(req, s.maxBodyBytes)
213
- .then((raw) => {
214
- const body = parseMessageBody(raw);
215
- if ("error" in body) {
216
- if (releaseBusy(s, token)) {
217
- broadcast({ type: "state", ts: Date.now(), busy: false }, s);
218
- }
219
- sendJson(res, 400, { error: body.error });
220
- return;
221
- }
222
- s.lastPostTs = Date.now();
223
- const run = Promise.resolve(bridge.submit(body.text, { images: body.images }));
224
- run.catch((err) => {
225
- // Единственный владелец ошибки: для любого реально стартовавшего хода
226
- // форвардер эмитит `turn_end {success:false}` и первым чистит резерв,
227
- // так что `releaseBusy` здесь вернёт false и второй `error` слать НЕЛЬЗЯ
228
- // (браузер показал бы две строки). `error` репортит только сабмит,
229
- // зареджекченный до начала хода (резерв ещё наш).
230
- if (releaseBusy(s, token)) {
231
- broadcast({ type: "error", ts: Date.now(), error: scrubError(err) }, s);
232
- broadcast({ type: "state", ts: Date.now(), busy: false }, s);
233
- }
234
- });
235
- sendJson(res, 202, { ok: true });
236
- })
237
- .catch((err) => {
238
- if (releaseBusy(s, token)) {
239
- broadcast({ type: "state", ts: Date.now(), busy: false }, s);
240
- }
241
- readBodyError(req, res, err);
242
- });
243
- }
244
- /** Best-effort открытие UI в браузере по умолчанию (MMA_WEBUI_OPEN=0 отключает). */
245
- export function tryOpenBrowser(url) {
246
- if (readEnv("WEBUI_OPEN") === "0")
247
- return;
248
- try {
249
- const platform = process.platform;
250
- const cmd = platform === "win32"
251
- ? `start "" "${url}"`
252
- : platform === "darwin"
253
- ? `open "${url}"`
254
- : `xdg-open "${url}"`;
255
- const child = exec(cmd, { windowsHide: true });
256
- child.unref?.();
257
- }
258
- catch {
259
- /* best-effort — открытие браузера не должно ломать старт */
260
- }
261
- }
@@ -1,37 +0,0 @@
1
- /** Шина событий вывода. Упавший подписчик шину не роняет. */
2
- export class OutputBus {
3
- seq = 0;
4
- subs = new Set();
5
- /** Подписка; возвращает отписку. */
6
- subscribe(fn) {
7
- this.subs.add(fn);
8
- return () => this.subs.delete(fn);
9
- }
10
- /** Эмит события; проставляет id/ts и возвращает полное событие. */
11
- emit(ev) {
12
- const full = { ...ev, id: ++this.seq, ts: Date.now() };
13
- for (const fn of [...this.subs]) {
14
- try {
15
- fn(full);
16
- }
17
- catch {
18
- /* a subscriber must not break the bus */
19
- }
20
- }
21
- return full;
22
- }
23
- /** Короткий эмит log-события. */
24
- log(level, source, text, data) {
25
- return this.emit({ level, source, kind: "log", text, data });
26
- }
27
- /**
28
- * Хук изоляции тестов: сбрасывает подписчиков и счётчик id.
29
- * В прод-коде не вызывать.
30
- */
31
- reset() {
32
- this.subs.clear();
33
- this.seq = 0;
34
- }
35
- }
36
- /** Шина по умолчанию для всего приложения. */
37
- export const defaultOutputBus = new OutputBus();