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,117 +0,0 @@
1
- /**
2
- * Рендерит системный промпт (чистая функция).
3
- * @param config конфиг приложения; @param baseDir workspace;
4
- * @param profileCompressed сжатый профиль окружения.
5
- * @returns текст системного сообщения для модели.
6
- */
7
- export function buildSystemInfo(config, baseDir, profileCompressed) {
8
- const now = new Date().toISOString().replace("T", " ").slice(0, 19);
9
- const isWin = profileCompressed.toLowerCase().includes("win32");
10
- const lines = [
11
- `You are MMA v2, an AI agent for small models (${config.model}). Date: ${now}.`,
12
- `Workspace: ${baseDir}. ${profileCompressed}.`,
13
- `Reply in the user's language. Explain briefly if not obvious.`,
14
- ``,
15
- `TOOLS: file ops (read/write/edit/delete), search (glob/grep), shell (bash), web, subagents, browser, MCP.`,
16
- `On tool failure: analyze, fix the call, retry up to 2x with different approaches, then ask the user.`,
17
- ``,
18
- `SCOPE — do ONLY what the user explicitly asked: no extra features, files, refactors, or fixes beyond the request.`,
19
- `Read-only requests ("расскажи", "покажи", "объясни", "check") mean READ-ONLY: inspect and answer, never modify anything.`,
20
- `Ambiguous task (unclear what/where/which) or target not found — STOP and ask via the "question" tool, do not guess.`,
21
- `A "not found" tool result means the PATH was wrong, not that the project is missing: list_dir the workspace first,`,
22
- `then the parent of a user-named path. NEVER scaffold a new project for questions about an existing one.`,
23
- ``,
24
- `ARTIFACTS: CREATE a file ONLY when the user explicitly asks for a file — "write/save to file", "create a file/document",`,
25
- `or a filename/path with an extension.`,
26
- `Bare "recommendation", "summary", "report", "result" mean ANSWER IN CHAT, never files.`,
27
- `Use the requested format and stack; never add unagreed libraries.`,
28
- `If a needed choice is unspecified, ask or search first.`,
29
- ``,
30
- `MEMORY: the current user message outranks stored memory/preferences.`,
31
- `Never "correct" an explicit value from stored facts.`,
32
- `Never ask what memory already answers (the "question" tool checks memory itself); "remember" only on explicit request.`,
33
- `MEMORY PRIVACY: never copy stored personal facts (birthday, height, name, contacts) into workspace files unless asked.`,
34
- ``,
35
- `PROTECTED PATHS: never touch VCS internals (.git/, .hg/, .svn/) or secrets (.env*, *.key, *.pem, *.p12, *.pfx, *.crt,`,
36
- `*.secret, *.token, .npmrc, .netrc, .git-credentials, .gitconfig) without explicit confirmation via the "approve" tool.`,
37
- `Do not retry around a refusal or work around it with bash.`,
38
- ``,
39
- `WORK RULES: 1) install deps BEFORE source (verify lockfile; no uninstalled imports); 2) framework init BEFORE app code;`,
40
- `3) plan sequentially, verify each step's deliverables exist with real content; 4) verify on disk + command output;`,
41
- `5) no premature work (no files/imports for future steps); 6) stuck after 2+ failures: STOP, change approach, ask.`,
42
- ``,
43
- `SESSION START (first turn with a workspace task): 1) inspect — list_dir the workspace, note package.json/tests/config;`,
44
- `2) baseline for CODE tasks only — run project checks (bun test / tsc --noEmit),`,
45
- `report pass/fail BEFORE changing code;`,
46
- `3) trivial chat/questions skip the baseline. Then proceed with the user's task.`,
47
- ``,
48
- `FORBIDDEN:`,
49
- `- Marking done without proof (no clean check output) — see VERIFY.`,
50
- `- Creating files the user didn't ask for — see ARTIFACTS.`,
51
- `- Retrying the same failing command a 3rd time — change approach or ask.`,
52
- `- Claiming "fixed" from a fresh port/server while the user's endpoint still fails.`,
53
- ``,
54
- `DONE CONDITIONS — finished only when ALL hold: all plan steps are marked done;`,
55
- `requested files/artifacts exist with real content; each runnable verification reports clean.`,
56
- `Then reply with a short summary of what changed (files created/edited).`,
57
- `STOP AND ASK THE USER WHEN: the task is ambiguous (multiple approaches, unclear what/where);`,
58
- `you could not find what the user asked about after listing the parent directory;`,
59
- `finishing would delete/overwrite important files;`,
60
- `or you are stuck after 2+ different approaches.`,
61
- `Ask via the "question" tool (one short question, options when known) and wait.`,
62
- `Plain text only when interactive tools are unavailable.`,
63
- ];
64
- if (isWin) {
65
- lines.push(`Windows (PowerShell): use list_dir/read_file/delete_file/create_dir tools instead of dir/type/del/mkdir.`, `No PowerShell cmdlets (Get-Content, Select-Object, Write-Output), no head/tail/grep/cat.`, `Forward slashes in paths. CWD: ${baseDir}`);
66
- }
67
- // MMA — Bun-only проект (скрипты package.json, Bun API в коде): модель
68
- // должна предпочитать bun, а не node/tsx/ts-node, для запуска TypeScript
69
- // (наблюдалось: модель жгла 10+ итераций на установку tsx вместо `bun file.ts`).
70
- lines.push(`Runtime: Bun is available — run TypeScript directly with "bun <file.ts>", tests with "bun test" (no tsx/ts-node needed).`, `Bash: pass "workdir", never "cd dir && cmd". One command per call.`, `Long-running: "background: true", else auto-backgrounded — check with process_log.`, ``, `VERIFY EVERY WRITE: after write_file/edit_file with NO [LSP errors], [LSP warnings], [Syntax check failed],`, `or [Project typecheck failed] in the result — call "lsp_check" on that file BEFORE marking the step done.`, `Never assume, prove.`, `PLAN QUALITY: each step = CONCRETE deliverables (exact paths, packages, commands).`, `No vague steps. 5-8 steps, init → verify.`, `Each step needs a 1:1 verification contract in "checks":`, `"file-exists:<path>", "command:<exact command>", or "manual:<what>".`, `For "check/fix errors" tasks each verification step names the exact proving command`, `("bun run build", "bun test", "lsp_check").`, `A step is done only after its check reports clean — then "plan_step step=N status=done".`);
71
- if (config.autoPlan) {
72
- lines.push(`PLAN (MANDATORY): file creation, package installs, or multi-action tasks MUST create a "plan" BEFORE starting.`);
73
- }
74
- // Баг в терминах runtime-поведения (что происходит при запуске) доказывается
75
- // только ВОСПРОИЗВЕДЕНИЕМ — запуском app/build/browser и сверкой с реальным
76
- // выводом. Модель решает сама, когда это применимо (без классификации по
77
- // ключевым словам). Протухшие dev-серверы держат СТАРЫЙ пайплайн в памяти и
78
- // продолжают кидать исходную ошибку (наблюдалось: старый vite на 5173–5176
79
- // сыпал postcss после фикса на диске, а свежий на 5177 был чист) — фикс
80
- // реален, только когда чист сервер ПОЛЬЗОВАТЕЛЯ.
81
- lines.push(`Runtime verification: when a bug is described in terms of runtime behavior`, `(what happens when the app runs), reproduce it —`, `run the app / build / browser tool — confirm the fix against actual runtime output`, `before calling "plan_step step=N status=done".`, `Check existing servers first (process_list/process_log): a stale dev server`, `runs the old pipeline and keeps failing after the fix.`, `Restart/kill it (process_kill) and verify the exact endpoint/port reported —`, `a fresh port does NOT prove the user's error is gone.`);
82
- // Правила безопасности: при включённой защите модель должна знать ограничения
83
- // заранее — заблокированный вызов стоит итерацию, а этот блок ~100 токенов
84
- // один раз. Компактно и с cap, чтобы длинный blacklist не рвал бюджет.
85
- const sec = config.security;
86
- if (sec?.enabled) {
87
- const secLines = [
88
- `SECURITY RESTRICTIONS (enforced — blocked calls return "[SECURITY BLOCKED]", do not retry them):`,
89
- ];
90
- if (sec.bash?.enabled && sec.bash.blacklist.length > 0) {
91
- const cmds = sec.bash.blacklist.slice(0, 15).join(", ");
92
- secLines.push(`Forbidden bash commands: ${cmds}${sec.bash.blacklist.length > 15 ? ", …" : ""}.`);
93
- if (sec.bash.whitelist.length > 0) {
94
- secLines.push(`Only whitelisted bash commands are allowed: ${sec.bash.whitelist.slice(0, 15).join(", ")}.`);
95
- }
96
- if (sec.bash.blockDangerousFlags) {
97
- secLines.push(`Pipes/redirects/chaining (| > >> ; &&) in bash are blocked — one plain command per call.`);
98
- }
99
- }
100
- if (sec.paths?.enabled && sec.paths.denied.length > 0) {
101
- const paths = sec.paths.denied.slice(0, 10).join(", ");
102
- secLines.push(`Denied paths (read/write): ${paths}${sec.paths.denied.length > 10 ? ", …" : ""}.`);
103
- }
104
- if (sec.network?.enabled && sec.network.deniedDomains.length > 0) {
105
- const domains = sec.network.deniedDomains.slice(0, 10).join(", ");
106
- secLines.push(`Denied network domains: ${domains}${sec.network.deniedDomains.length > 10 ? ", …" : ""}.`);
107
- }
108
- if (secLines.length > 1) {
109
- lines.push(...secLines);
110
- }
111
- }
112
- const hasMCP = config.mcpServers && Object.values(config.mcpServers).some((s) => s.enabled !== false);
113
- if (hasMCP) {
114
- lines.push(`MCP servers are available — use the named MCP tools (prefixed mcp__) to query external services.`);
115
- }
116
- return lines.join("\n");
117
- }
@@ -1 +0,0 @@
1
- export {};
@@ -1,28 +0,0 @@
1
- /** Версия MMA: читается из package.json в рантайме. */
2
- import { existsSync, readFileSync } from "fs";
3
- import { join, dirname } from "path";
4
- import { fileURLToPath } from "url";
5
- /**
6
- * Читает версию MMA из package.json в рантайме (не статическим импортом —
7
- * бандлеры инлайнят устаревшее значение на этапе сборки, см. правило №12).
8
- * @returns версия из package.json либо "0.0.0", если файл не найден/бит.
9
- */
10
- export function readMmaVersion() {
11
- const here = dirname(fileURLToPath(import.meta.url));
12
- const candidates = [join(here, "..", "..", "package.json"), join(here, "..", "package.json")];
13
- for (const p of candidates) {
14
- if (existsSync(p)) {
15
- try {
16
- const raw = JSON.parse(readFileSync(p, "utf8"));
17
- if (raw.version)
18
- return raw.version;
19
- }
20
- catch {
21
- // Битый package.json — пробуем следующий кандидат
22
- }
23
- }
24
- }
25
- return "0.0.0";
26
- }
27
- /** Устаревший алиас — используй readMmaVersion(). */
28
- export const readVersion = readMmaVersion;
@@ -1,34 +0,0 @@
1
- import { defaultOutputBus } from "../output/bus";
2
- /** Реализация хоста для `mma web` — без TTY, без LineEditor. */
3
- export class WebHost {
4
- deps;
5
- constructor(deps) {
6
- this.deps = deps;
7
- }
8
- isBusy() {
9
- return this.deps.isBusy();
10
- }
11
- async submit(text, o) {
12
- if (this.deps.isBusy())
13
- throw new Error("agent is busy");
14
- for (const url of o?.images ?? [])
15
- this.deps.addPendingImage?.(url);
16
- return this.deps.runAgent(text);
17
- }
18
- interrupt() {
19
- if (this.deps.isBusy())
20
- this.deps.interrupt();
21
- }
22
- subscribeOutput(fn) {
23
- return defaultOutputBus.subscribe(fn);
24
- }
25
- async executeCommand(line) {
26
- const trimmed = line.trim();
27
- if (!trimmed.startsWith("/"))
28
- return;
29
- await this.deps.executeCommand(trimmed);
30
- }
31
- getState() {
32
- return this.deps.getState();
33
- }
34
- }
@@ -1,80 +0,0 @@
1
- /** Резолвинг путей workspace: поиск корня проекта по манифестам. */
2
- import { existsSync, readdirSync } from "fs";
3
- import { resolve, isAbsolute, join } from "path";
4
- /** Файлы/каталоги — маркеры корня проекта. */
5
- const PROJECT_MANIFESTS = [
6
- "package.json",
7
- "bun.lockb",
8
- "bun.lock",
9
- "yarn.lock",
10
- "pnpm-lock.yaml",
11
- "go.mod",
12
- "Cargo.toml",
13
- "pyproject.toml",
14
- "requirements.txt",
15
- "Gemfile",
16
- "composer.json",
17
- ];
18
- /** Подкаталоги, никогда не кандидаты в корень проекта. */
19
- const SKIP_DIRS = new Set(["node_modules", "dist", ".git", ".hg", ".svn"]);
20
- const subdirCache = new Map();
21
- function scanSubdirs(baseDir) {
22
- const cached = subdirCache.get(baseDir);
23
- if (cached)
24
- return cached;
25
- let dirs = [];
26
- try {
27
- dirs = readdirSync(baseDir, { withFileTypes: true })
28
- .filter((e) => e.isDirectory() && !e.name.startsWith("."))
29
- .map((e) => e.name)
30
- .filter((name) => !SKIP_DIRS.has(name));
31
- }
32
- catch {
33
- dirs = [];
34
- }
35
- if (dirs.length > 0)
36
- subdirCache.set(baseDir, dirs);
37
- return dirs;
38
- }
39
- /**
40
- * Есть ли в каталоге манифест проекта.
41
- * @param dir каталог для проверки.
42
- * @returns true, если найден известный манифест.
43
- */
44
- export function hasProjectManifest(dir) {
45
- return PROJECT_MANIFESTS.some((m) => existsSync(join(dir, m)));
46
- }
47
- /**
48
- * Резолвит путь внутри workspace. Терпит запуск из родителя, когда проект
49
- * лежит в одном подкаталоге (baseDir=<repo>, проект=<repo>/app). Порядок:
50
- * 1. абсолютный путь как есть;
51
- * 2. baseDir/<p> — проект прямо в baseDir;
52
- * 3. <subdir>/<p> по подкаталогам (приоритет — с манифестом).
53
- * Фолбэк — baseDir/<p>, чтобы вызывающий через existsSync() корректно
54
- * определил отсутствие пути.
55
- * @param baseDir корень workspace; @param p относительный/абсолютный путь.
56
- */
57
- export function resolveProjectPath(baseDir, p) {
58
- const abs = isAbsolute(p) ? p : resolve(baseDir, p);
59
- if (existsSync(abs))
60
- return abs;
61
- // Сам baseDir — корень проекта: подкаталоги не сканируем, иначе
62
- // зацепим файлы посторонних вложенных пакетов.
63
- if (hasProjectManifest(baseDir))
64
- return abs;
65
- let fallback = abs;
66
- for (const name of scanSubdirs(baseDir)) {
67
- const candidate = resolve(baseDir, name, p);
68
- if (existsSync(candidate)) {
69
- if (hasProjectManifest(join(baseDir, name)))
70
- return candidate;
71
- if (fallback === abs)
72
- fallback = candidate;
73
- }
74
- }
75
- return fallback;
76
- }
77
- /** Сбрасывает кэш подкаталогов (нужен тестам). */
78
- export function clearWorkspaceCache() {
79
- subdirCache.clear();
80
- }
@@ -1,80 +0,0 @@
1
- // i18n: плоские словари en/ru, t(key, params) с фолбэком на английский.
2
- import en from "./en.json";
3
- import ru from "./ru.json";
4
- const locales = { en, ru };
5
- let currentLocale = "en";
6
- function flatten(obj, prefix = "") {
7
- let result = {};
8
- for (const [key, val] of Object.entries(obj)) {
9
- const fullKey = prefix ? `${prefix}.${key}` : key;
10
- if (typeof val === "string") {
11
- result[fullKey] = val;
12
- }
13
- else if (typeof val === "object" && val !== null) {
14
- result = {
15
- ...result,
16
- ...flatten(val, fullKey),
17
- };
18
- }
19
- }
20
- return result;
21
- }
22
- const flat = {};
23
- for (const [name, dict] of Object.entries(locales)) {
24
- flat[name] = flatten(dict);
25
- }
26
- /**
27
- * Переключает текущую локаль. Неизвестное имя игнорируется.
28
- * @param locale имя локали ("en" | "ru").
29
- */
30
- export function setLocale(locale) {
31
- if (flat[locale]) {
32
- currentLocale = locale;
33
- }
34
- }
35
- /**
36
- * Плоские словари по именам локалей. Нужны веб-API, чтобы отдать все переводы
37
- * в браузер для локализации его интерфейса. Только чтение — не мутировать.
38
- */
39
- export function getFlatDicts() {
40
- return flat;
41
- }
42
- /**
43
- * Подменяет/добавляет словарь локали в рантайме (плагины, тесты).
44
- * @param name имя локали; @param dict вложенный словарь переводов.
45
- */
46
- export function loadLocale(name, dict) {
47
- locales[name] = dict;
48
- flat[name] = flatten(dict);
49
- }
50
- /**
51
- * Ставит обработчик отсутствующих ключей (debug-диагностика). Подключается
52
- * из bootstrap на logger.debug, чтобы не тянуть логер в i18n (циклы).
53
- */
54
- let missingKeyReporter;
55
- export function setMissingKeyReporter(reporter) {
56
- missingKeyReporter = reporter;
57
- }
58
- /**
59
- * Переводит ключ с подстановкой `{params}`. Нет ключа — вернёт сам ключ.
60
- * @param key точечный ключ; @param params значения подстановок.
61
- */
62
- export function t(key, params) {
63
- const localeDict = flat[currentLocale];
64
- const enDict = flat.en;
65
- const template = localeDict?.[key] ?? enDict?.[key];
66
- if (template === undefined) {
67
- missingKeyReporter?.(key);
68
- return key;
69
- }
70
- if (!template)
71
- return key;
72
- if (params) {
73
- let result = template;
74
- for (const [k, v] of Object.entries(params)) {
75
- result = result.replaceAll(`{${k}}`, String(v));
76
- }
77
- return result;
78
- }
79
- return template;
80
- }
package/dist/index.js DELETED
@@ -1,30 +0,0 @@
1
- /**
2
- * Публичные экспорты пакета и библиотечный хелпер миграции конфига.
3
- */
4
- export { DEFAULTS, loadConfig } from "./config/index";
5
- export { Logger } from "./logger/index";
6
- export { PromptBuilder } from "./core/index";
7
- export { OpenAICompatProvider, TokenCounter, parseChunks, OrchestratorClient } from "./llm/index";
8
- export { ToolRegistry, ToolExecutor, readFileTool, writeFileTool, editFileTool, globTool, grepTool, listDirTool, createDirTool, deleteFileTool, moveFileTool, fileInfoTool, bashTool, subagentTool, webSearchTool, webFetchTool, webBrowseTool, createLoadSkillTool, pipelineRunTool, mcpCallTool, searchHistoryTool, registerAllTools, } from "./tools/index";
9
- export { MigrationDetector, BackupManager } from "./migration/index";
10
- import { MigrationDetector } from "./migration/detect";
11
- import { BackupManager } from "./migration/backup";
12
- import { t } from "./i18n/index";
13
- import { defaultOutputBus, getDefaultChannel } from "./output";
14
- import { homedir } from "os";
15
- import { join } from "path";
16
- import { MMA_DIR_NAME } from "./config/paths";
17
- export function checkMigration(configDir) {
18
- const dir = configDir || join(homedir(), MMA_DIR_NAME);
19
- const detector = new MigrationDetector(dir);
20
- if (detector.needsMigration()) {
21
- // Терминальный подписчик должен существовать до отправки в шину: у
22
- // библиотечных потребителей нет другого eager-создания канала.
23
- getDefaultChannel();
24
- const backup = new BackupManager(dir);
25
- backup.backupConfig();
26
- backup.backupAll();
27
- const summary = backup.getBackupSummary();
28
- defaultOutputBus.log("info", "mma", t("migration.summary", { summary }));
29
- }
30
- }
@@ -1,76 +0,0 @@
1
- /** Безопасно приводит значение к конечному числу; иначе undefined. */
2
- function num(value) {
3
- return typeof value === "number" && Number.isFinite(value) ? value : undefined;
4
- }
5
- /** Объект ли это (для защиты от null/строк в ответе). */
6
- function isRecord(value) {
7
- return typeof value === "object" && value !== null;
8
- }
9
- /**
10
- * Разбирает usage-объект провайдера в нормализованный `CacheUsage` согласно
11
- * формату отчёта. Возвращает undefined, когда провайдер не сообщает о кеше —
12
- * вызывающий не должен выдавать отсутствие данных за «cache miss».
13
- *
14
- * `estimatedPromptTokens` нужен только для формата `ollama`, который не
15
- * отдаёт cache-полей: кешированное вычисляется как разница оценки и
16
- * `prompt_eval_count`.
17
- */
18
- export function parseCacheUsage(usage, format, estimatedPromptTokens) {
19
- if (!isRecord(usage))
20
- return undefined;
21
- switch (format) {
22
- case "openai": {
23
- const details = usage.prompt_tokens_details;
24
- if (!isRecord(details))
25
- return undefined;
26
- const cached = num(details.cached_tokens);
27
- if (cached === undefined)
28
- return undefined;
29
- const prompt = num(usage.prompt_tokens) ?? cached;
30
- const write = num(details.cache_write_tokens) ?? 0;
31
- return {
32
- cachedTokens: cached,
33
- cacheWriteTokens: write,
34
- uncachedTokens: Math.max(0, prompt - cached),
35
- source: "api",
36
- };
37
- }
38
- case "deepseek": {
39
- const hit = num(usage.prompt_cache_hit_tokens);
40
- const miss = num(usage.prompt_cache_miss_tokens);
41
- if (hit === undefined && miss === undefined)
42
- return undefined;
43
- return {
44
- cachedTokens: hit ?? 0,
45
- cacheWriteTokens: 0,
46
- uncachedTokens: miss ?? 0,
47
- source: "api",
48
- };
49
- }
50
- case "anthropic": {
51
- const read = num(usage.cache_read_input_tokens);
52
- const creation = num(usage.cache_creation_input_tokens);
53
- if (read === undefined && creation === undefined)
54
- return undefined;
55
- return {
56
- cachedTokens: read ?? 0,
57
- cacheWriteTokens: creation ?? 0,
58
- uncachedTokens: num(usage.input_tokens) ?? 0,
59
- source: "api",
60
- };
61
- }
62
- case "ollama": {
63
- const evaluated = num(usage.prompt_eval_count);
64
- if (evaluated === undefined || estimatedPromptTokens === undefined)
65
- return undefined;
66
- return {
67
- cachedTokens: Math.max(0, estimatedPromptTokens - evaluated),
68
- cacheWriteTokens: 0,
69
- uncachedTokens: evaluated,
70
- source: "derived",
71
- };
72
- }
73
- default:
74
- return undefined;
75
- }
76
- }
@@ -1,138 +0,0 @@
1
- /** Картинки: MIME, буфер обмена, загрузка файла/URL в data URL. */
2
- import { readFileSync } from "fs";
3
- import { extname } from "path";
4
- const MIME_MAP = {
5
- ".png": "image/png",
6
- ".jpg": "image/jpeg",
7
- ".jpeg": "image/jpeg",
8
- ".gif": "image/gif",
9
- ".webp": "image/webp",
10
- ".bmp": "image/bmp",
11
- ".svg": "image/svg+xml",
12
- };
13
- /**
14
- * Определяет MIME-тип по расширению файла.
15
- * @param filePath путь к файлу; @returns MIME-тип (дефолт image/png).
16
- */
17
- export function detectMime(filePath) {
18
- const ext = extname(filePath).toLowerCase();
19
- return MIME_MAP[ext] ?? "image/png";
20
- }
21
- /** Конструктор Bun.Image под Bun, иначе undefined. */
22
- function getBunImage() {
23
- return globalThis.Bun?.Image;
24
- }
25
- /** Ужимает буфер в JPEG data URL через Bun.Image; null, если недоступно/упало. */
26
- async function resizeToJpegDataUrl(buf) {
27
- const Image = getBunImage();
28
- if (!Image)
29
- return null;
30
- try {
31
- const img = new Image(buf);
32
- const { width } = await img.metadata();
33
- const targetWidth = Math.min(800, width || 800);
34
- return await img.resize(targetWidth, 800, { fit: "inside" }).jpeg({ quality: 60 }).dataurl();
35
- }
36
- catch {
37
- return null;
38
- }
39
- }
40
- /**
41
- * Читает картинку из буфера обмена через Bun.Image (macOS/Windows).
42
- * На Linux — платформенные команды. Null, если картинки нет.
43
- * @returns буфер PNG/JPEG либо null.
44
- */
45
- export async function readClipboardImage() {
46
- // Bun.Image.fromClipboard() работает на macOS и Windows
47
- const Image = getBunImage();
48
- if (Image) {
49
- try {
50
- const img = Image.fromClipboard();
51
- if (img) {
52
- const buf = await img.resize(800, 800, { fit: "inside" }).jpeg({ quality: 60 }).buffer();
53
- return Buffer.from(buf);
54
- }
55
- }
56
- catch {
57
- // Bun.Image.fromClipboard() упал — идём в платформенный фолбэк
58
- }
59
- }
60
- // Linux-фолбэк: xclip/wl-paste → временный файл → чтение
61
- return readClipboardFallback();
62
- }
63
- async function readClipboardFallback() {
64
- const { platform } = await import("os");
65
- const { execSync } = await import("child_process");
66
- const { readFileSync, unlinkSync } = await import("fs");
67
- const { join } = await import("path");
68
- if (platform() !== "linux")
69
- return null; // macOS/Windows use Bun.Image
70
- const tmpPath = join(process.env.TEMP || process.env.TMP || "/tmp", `mma-clip-${Date.now()}.png`);
71
- // Сначала Wayland (wl-paste), затем X11 (xclip)
72
- const commands = [
73
- `wl-paste --type image/png > "${tmpPath}" 2>/dev/null`,
74
- `xclip -selection clipboard -t image/png -o > "${tmpPath}" 2>/dev/null`,
75
- ];
76
- for (const cmd of commands) {
77
- try {
78
- execSync(cmd, { timeout: 5000 });
79
- const buf = readFileSync(tmpPath);
80
- unlinkSync(tmpPath);
81
- if (buf.length > 0)
82
- return buf;
83
- }
84
- catch {
85
- // пробуем следующую команду
86
- }
87
- }
88
- try {
89
- unlinkSync(tmpPath);
90
- }
91
- catch {
92
- // Best-effort чистка времянки — зависший файл не должен маскировать null.
93
- }
94
- return null;
95
- }
96
- /**
97
- * Грузит картинку из файла, ужимает через Bun.Image, отдаёт JPEG data URL.
98
- * Цель: ~800px по ширине, JPEG 60 — обычно 5–15KB (~2–4K токенов).
99
- */
100
- export async function loadFileAsDataUrl(filePath) {
101
- const buf = readFileSync(filePath);
102
- // Bun.Image, если есть — ресайз + конвертация в JPEG
103
- const resized = await resizeToJpegDataUrl(buf);
104
- if (resized)
105
- return { dataUrl: resized };
106
- // Фолбэк: сырой base64 (без ресайза)
107
- const b64 = buf.toString("base64");
108
- const ext = filePath.split(".").pop()?.toLowerCase();
109
- const mime = ext === "jpg" || ext === "jpeg" ? "image/jpeg" : ext === "webp" ? "image/webp" : "image/png";
110
- return { dataUrl: `data:${mime};base64,${b64}` };
111
- }
112
- /**
113
- * Грузит картинку по URL, ужимает, отдаёт JPEG data URL.
114
- * @param url URL картинки; @returns data URL.
115
- */
116
- export async function loadUrlAsDataUrl(url) {
117
- const resp = await fetch(url);
118
- if (!resp.ok) {
119
- throw new Error(`Failed to fetch image: ${resp.status} ${resp.statusText}`);
120
- }
121
- const buf = Buffer.from(await resp.arrayBuffer());
122
- const resized = await resizeToJpegDataUrl(buf);
123
- if (resized)
124
- return { dataUrl: resized };
125
- const b64 = buf.toString("base64");
126
- return { dataUrl: `data:image/png;base64,${b64}` };
127
- }
128
- /**
129
- * Превращает буфер обмена (уже ужатый readClipboardImage) в data URL.
130
- * Нужен обработчику Ctrl+V.
131
- */
132
- export async function bufferToDataUrl(buf) {
133
- const resized = await resizeToJpegDataUrl(buf);
134
- if (resized)
135
- return { dataUrl: resized };
136
- const b64 = buf.toString("base64");
137
- return { dataUrl: `data:image/png;base64,${b64}` };
138
- }
package/dist/llm/index.js DELETED
@@ -1,4 +0,0 @@
1
- export { OpenAICompatProvider } from "./openai-compat";
2
- export { TokenCounter } from "./token-counter";
3
- export { parseChunks } from "./response";
4
- export { OrchestratorClient } from "./orchestrator";
@@ -1,50 +0,0 @@
1
- /** Типизированные ошибки LLM-транспорта (terminal/recoverable/status). */
2
- /**
3
- * Типизированные ошибки LLM-транспорта.
4
- *
5
- * Раньше свойства `recoverableLlm` / `llmTerminal` / `llmStatus` навешивались
6
- * на обычные Error через `(err as any).xxx = ...` в 8 местах openai-compat.ts
7
- * и читались структурно в agent.ts и providers/fallback.ts — утка вместо
8
- * типа. Здесь — единый класс с явными флагами.
9
- *
10
- * Семантика флагов:
11
- * - `terminal`: поток уже не может продолжать (ответ доставлен, соединение
12
- * сломано, запрос доретриен) — на уровне стрима ретраить НЕЛЬЗЯ;
13
- * - `recoverable`: причину стоит вернуть модели через агентный цикл
14
- * (например, токен-лимит на середине tool_call) вместо смерти сессии;
15
- * - `llmStatus`: HTTP-статус для решения о failover между провайдерами.
16
- *
17
- * Ошибка может нести одновременно terminal + recoverable (обрезанный
18
- * tool_call: стрим не ретраим, но модель просим адаптироваться).
19
- */
20
- export class LlmError extends Error {
21
- /** Поток не может продолжать — на уровне стрима не ретраить. */
22
- terminal;
23
- /** Причину вернуть модели через агентный цикл. */
24
- recoverable;
25
- /** HTTP-статус (для failover), если известен. */
26
- llmStatus;
27
- constructor(message, options = {}) {
28
- super(message);
29
- this.name = "LlmError";
30
- this.terminal = options.terminal ?? false;
31
- this.recoverable = options.recoverable ?? false;
32
- this.llmStatus = options.llmStatus;
33
- }
34
- /**
35
- * Помечает ошибку терминальной (стрим не ретраится).
36
- * @returns this для чейнинга.
37
- */
38
- markTerminal() {
39
- this.terminal = true;
40
- return this;
41
- }
42
- /**
43
- * Помечает ошибку восстановимой (причину вернуть модели через цикл).
44
- * @returns this для чейнинга.
45
- */
46
- markRecoverable() {
47
- this.recoverable = true;
48
- return this;
49
- }
50
- }