micro-models-agent 2.16.0 → 2.17.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (427) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/assets/app.js +1 -314
  3. package/dist/assets/hljs.js +5 -1244
  4. package/dist/assets/index.html +11 -0
  5. package/dist/assets/js/api.js +1 -28
  6. package/dist/assets/js/core/menus.js +1 -0
  7. package/dist/assets/js/core/store/feed.js +1 -0
  8. package/dist/assets/js/core/store/index.js +1 -0
  9. package/dist/assets/js/core/store/session.js +1 -0
  10. package/dist/assets/js/core/store/settings.js +1 -0
  11. package/dist/assets/js/core/store/tabs.js +1 -0
  12. package/dist/assets/js/dialog.js +1 -105
  13. package/dist/assets/js/dom.js +1 -178
  14. package/dist/assets/js/feed/core.js +1 -0
  15. package/dist/assets/js/feed/history.js +1 -0
  16. package/dist/assets/js/feed/plan.js +1 -0
  17. package/dist/assets/js/feed/question.js +3 -0
  18. package/dist/assets/js/feed/sidebar.js +1 -0
  19. package/dist/assets/js/feed/stream.js +1 -0
  20. package/dist/assets/js/feed/turn.js +5 -0
  21. package/dist/assets/js/feed.js +1 -1211
  22. package/dist/assets/js/format.js +2 -122
  23. package/dist/assets/js/i18n.js +1 -46
  24. package/dist/assets/js/rail.js +1 -114
  25. package/dist/assets/js/session/cmdk.js +1 -0
  26. package/dist/assets/js/session/composer.js +1 -0
  27. package/dist/assets/js/session/sessions-menu.js +1 -0
  28. package/dist/assets/js/session/tabs.js +1 -0
  29. package/dist/assets/js/settings/controls.js +1 -0
  30. package/dist/assets/js/settings/editors.js +1 -0
  31. package/dist/assets/js/settings/form.js +1 -0
  32. package/dist/assets/js/settings/modal.js +1 -0
  33. package/dist/assets/js/settings/panels.js +1 -0
  34. package/dist/assets/js/settings/providers.js +1 -0
  35. package/dist/assets/js/settings/search.js +1 -0
  36. package/dist/assets/js/settings/subdialog.js +1 -0
  37. package/dist/assets/js/settings/write.js +1 -0
  38. package/dist/assets/js/settings.js +1 -1914
  39. package/dist/assets/js/sidebar/core.js +1 -0
  40. package/dist/assets/js/sidebar/lsp.js +2 -0
  41. package/dist/assets/js/sidebar/map.js +1 -0
  42. package/dist/assets/js/sidebar/state.js +1 -0
  43. package/dist/assets/js/sidebar/trace.js +5 -0
  44. package/dist/assets/js/sidebar.js +1 -705
  45. package/dist/assets/js/store.js +1 -82
  46. package/dist/assets/js/subdialog.js +1 -0
  47. package/dist/assets/md.js +1 -277
  48. package/dist/assets/setup.js +3 -816
  49. package/dist/assets/smd.js +29 -1665
  50. package/dist/assets/styles.css +1 -1592
  51. package/dist/certification/certifications.json +1 -494
  52. package/dist/i18n/en.json +1 -1851
  53. package/dist/i18n/ru.json +1 -1854
  54. package/dist/main.js +815 -55797
  55. package/dist/modules/browser/bridge-server.mjs +2 -252
  56. package/package.json +10 -5
  57. package/dist/assets/js/settings-controls.js +0 -452
  58. package/dist/assets/js/tabs.js +0 -867
  59. package/dist/cli/cache-line.js +0 -31
  60. package/dist/cli/command-suggest.js +0 -39
  61. package/dist/cli/commands.js +0 -781
  62. package/dist/cli/completer.js +0 -268
  63. package/dist/cli/index.js +0 -3
  64. package/dist/cli/json-payload.js +0 -32
  65. package/dist/cli/main.js +0 -346
  66. package/dist/cli/onboarding-commands.js +0 -126
  67. package/dist/cli/plugin-commands.js +0 -38
  68. package/dist/cli/relaunch.js +0 -40
  69. package/dist/cli/repl-commands-lsp.js +0 -75
  70. package/dist/cli/repl-commands-skills.js +0 -105
  71. package/dist/cli/repl-commands.js +0 -1218
  72. package/dist/cli/repl.js +0 -1238
  73. package/dist/cli/run-result.js +0 -38
  74. package/dist/cli/security-commands.js +0 -177
  75. package/dist/cli/setup-order.js +0 -6
  76. package/dist/cli/setup-prompt.js +0 -50
  77. package/dist/cli/setup.js +0 -161
  78. package/dist/cli/web-command.js +0 -98
  79. package/dist/config/budget.js +0 -48
  80. package/dist/config/config.js +0 -345
  81. package/dist/config/defaults.js +0 -197
  82. package/dist/config/domains.js +0 -135
  83. package/dist/config/env.js +0 -46
  84. package/dist/config/experts.js +0 -17
  85. package/dist/config/index.js +0 -5
  86. package/dist/config/paths.js +0 -56
  87. package/dist/config/redact.js +0 -44
  88. package/dist/config/registry-extra.js +0 -334
  89. package/dist/config/registry.js +0 -584
  90. package/dist/config/security.js +0 -212
  91. package/dist/config/timeouts.js +0 -74
  92. package/dist/config/types.js +0 -1
  93. package/dist/config/utils.js +0 -57
  94. package/dist/core/agent/artifact-progress.js +0 -59
  95. package/dist/core/agent/artifact-resolve.js +0 -79
  96. package/dist/core/agent/audit-gate.js +0 -53
  97. package/dist/core/agent/compaction.js +0 -89
  98. package/dist/core/agent/constants.js +0 -90
  99. package/dist/core/agent/context-log.js +0 -454
  100. package/dist/core/agent/context-renderer.js +0 -45
  101. package/dist/core/agent/critic-gate.js +0 -132
  102. package/dist/core/agent/hallucination-gate.js +0 -197
  103. package/dist/core/agent/loop-state.js +0 -68
  104. package/dist/core/agent/prefix-monitor.js +0 -101
  105. package/dist/core/agent/reasoning-resolver.js +0 -65
  106. package/dist/core/agent/token-tracker.js +0 -99
  107. package/dist/core/agent/tool-batch.js +0 -312
  108. package/dist/core/agent/tool-images.js +0 -18
  109. package/dist/core/agent/tool-output.js +0 -116
  110. package/dist/core/agent/tool-pairing.js +0 -60
  111. package/dist/core/agent-moe.js +0 -248
  112. package/dist/core/agent.js +0 -1299
  113. package/dist/core/bootstrap/agent-phase.js +0 -66
  114. package/dist/core/bootstrap/config-phase.js +0 -86
  115. package/dist/core/bootstrap/modules-phase.js +0 -269
  116. package/dist/core/bootstrap/provider-phase.js +0 -183
  117. package/dist/core/bootstrap/session-phase.js +0 -204
  118. package/dist/core/bootstrap/state.js +0 -94
  119. package/dist/core/bootstrap/workspace-phase.js +0 -115
  120. package/dist/core/bootstrap.js +0 -112
  121. package/dist/core/crash-handler.js +0 -62
  122. package/dist/core/environment.js +0 -224
  123. package/dist/core/host-plan.js +0 -43
  124. package/dist/core/host.js +0 -23
  125. package/dist/core/index.js +0 -3
  126. package/dist/core/prompt-builder.js +0 -95
  127. package/dist/core/prompt-overflow.js +0 -306
  128. package/dist/core/session-logger.js +0 -375
  129. package/dist/core/system-prompt.js +0 -117
  130. package/dist/core/types.js +0 -1
  131. package/dist/core/version.js +0 -28
  132. package/dist/core/web-host.js +0 -34
  133. package/dist/core/workspace.js +0 -80
  134. package/dist/i18n/index.js +0 -80
  135. package/dist/index.js +0 -30
  136. package/dist/llm/cache-usage.js +0 -76
  137. package/dist/llm/image-utils.js +0 -138
  138. package/dist/llm/index.js +0 -4
  139. package/dist/llm/llm-errors.js +0 -50
  140. package/dist/llm/model-loader.js +0 -86
  141. package/dist/llm/models-dev.js +0 -121
  142. package/dist/llm/openai-compat.js +0 -756
  143. package/dist/llm/orchestrator.js +0 -294
  144. package/dist/llm/provider-budget.js +0 -68
  145. package/dist/llm/provider-context.js +0 -233
  146. package/dist/llm/provider.js +0 -9
  147. package/dist/llm/response.js +0 -44
  148. package/dist/llm/stream-state.js +0 -26
  149. package/dist/llm/token-counter.js +0 -83
  150. package/dist/llm/types.js +0 -1
  151. package/dist/logger/app-logger.js +0 -212
  152. package/dist/logger/file-log.js +0 -160
  153. package/dist/logger/index.js +0 -2
  154. package/dist/migration/backup.js +0 -56
  155. package/dist/migration/detect.js +0 -61
  156. package/dist/migration/index.js +0 -3
  157. package/dist/modules/artifacts/store.js +0 -62
  158. package/dist/modules/browser/actions.js +0 -79
  159. package/dist/modules/browser/bridge-client.js +0 -203
  160. package/dist/modules/browser/bridge-path.js +0 -10
  161. package/dist/modules/browser/console-buffer.js +0 -37
  162. package/dist/modules/browser/cookie-store.js +0 -29
  163. package/dist/modules/browser/driver-types.js +0 -1
  164. package/dist/modules/browser/driver.js +0 -186
  165. package/dist/modules/browser/index.js +0 -9
  166. package/dist/modules/browser/module.js +0 -30
  167. package/dist/modules/browser/session.js +0 -322
  168. package/dist/modules/browser/snapshot.js +0 -154
  169. package/dist/modules/browser/types.js +0 -13
  170. package/dist/modules/certification/cli.js +0 -264
  171. package/dist/modules/certification/fact-checker.js +0 -90
  172. package/dist/modules/certification/loader.js +0 -127
  173. package/dist/modules/certification/manifest.js +0 -231
  174. package/dist/modules/certification/runner.js +0 -233
  175. package/dist/modules/certification/scenarios.js +0 -586
  176. package/dist/modules/certification/syntax-scenarios.js +0 -50
  177. package/dist/modules/certification/types.js +0 -1
  178. package/dist/modules/context/chunk-query.js +0 -122
  179. package/dist/modules/context/fact-extractor.js +0 -170
  180. package/dist/modules/context/history.js +0 -15
  181. package/dist/modules/context/index.js +0 -2
  182. package/dist/modules/context/manager.js +0 -482
  183. package/dist/modules/critic/client.js +0 -176
  184. package/dist/modules/critic/evidence.js +0 -81
  185. package/dist/modules/critic/provider.js +0 -45
  186. package/dist/modules/critic/tools.js +0 -78
  187. package/dist/modules/critic/types.js +0 -1
  188. package/dist/modules/execution/audit-runners.js +0 -206
  189. package/dist/modules/execution/auditor.js +0 -222
  190. package/dist/modules/execution/execution-plugin.js +0 -478
  191. package/dist/modules/execution/index.js +0 -8
  192. package/dist/modules/execution/input-from.js +0 -70
  193. package/dist/modules/execution/module.js +0 -891
  194. package/dist/modules/execution/moe-executor.js +0 -443
  195. package/dist/modules/execution/plan-actions.js +0 -642
  196. package/dist/modules/execution/plan-checks.js +0 -35
  197. package/dist/modules/execution/plan-coverage.js +0 -71
  198. package/dist/modules/execution/plan-persister.js +0 -46
  199. package/dist/modules/execution/plan-steps.js +0 -31
  200. package/dist/modules/execution/plan-store.js +0 -274
  201. package/dist/modules/execution/plan-tool.js +0 -249
  202. package/dist/modules/execution/plan-validator.js +0 -197
  203. package/dist/modules/execution/planner.js +0 -103
  204. package/dist/modules/execution/stuck-detector.js +0 -834
  205. package/dist/modules/execution/tracker.js +0 -92
  206. package/dist/modules/execution/transient-error.js +0 -30
  207. package/dist/modules/execution/types.js +0 -1
  208. package/dist/modules/execution/verifier.js +0 -343
  209. package/dist/modules/execution/windows-commands.js +0 -52
  210. package/dist/modules/hallucination/artifact-claim.js +0 -93
  211. package/dist/modules/hallucination/confidence.js +0 -81
  212. package/dist/modules/hallucination/consistency.js +0 -37
  213. package/dist/modules/hallucination/detector.js +0 -57
  214. package/dist/modules/hallucination/factual.js +0 -205
  215. package/dist/modules/hallucination/index.js +0 -6
  216. package/dist/modules/hallucination/js-identifiers.js +0 -261
  217. package/dist/modules/hallucination/llm-judge.js +0 -116
  218. package/dist/modules/hallucination/success-claim.js +0 -59
  219. package/dist/modules/index.js +0 -5
  220. package/dist/modules/indexer/cache.js +0 -88
  221. package/dist/modules/indexer/index.js +0 -4
  222. package/dist/modules/indexer/map-command.js +0 -33
  223. package/dist/modules/indexer/map-select.js +0 -87
  224. package/dist/modules/indexer/module.js +0 -293
  225. package/dist/modules/indexer/project-profile.js +0 -184
  226. package/dist/modules/indexer/symbols.js +0 -189
  227. package/dist/modules/indexer/walker.js +0 -285
  228. package/dist/modules/lsp/check-tool.js +0 -61
  229. package/dist/modules/lsp/client.js +0 -406
  230. package/dist/modules/lsp/command.js +0 -53
  231. package/dist/modules/lsp/config.js +0 -189
  232. package/dist/modules/lsp/index.js +0 -4
  233. package/dist/modules/lsp/module.js +0 -295
  234. package/dist/modules/lsp/probe.js +0 -86
  235. package/dist/modules/lsp/project-root.js +0 -69
  236. package/dist/modules/lsp/startup-check.js +0 -154
  237. package/dist/modules/lsp/types.js +0 -1
  238. package/dist/modules/mcp/client.js +0 -445
  239. package/dist/modules/mcp/index.js +0 -4
  240. package/dist/modules/mcp/module.js +0 -295
  241. package/dist/modules/mcp/registry.js +0 -20
  242. package/dist/modules/memory/index.js +0 -2
  243. package/dist/modules/memory/module.js +0 -101
  244. package/dist/modules/memory/search.js +0 -45
  245. package/dist/modules/memory/store.js +0 -107
  246. package/dist/modules/onboarding/init.js +0 -47
  247. package/dist/modules/onboarding/meet.js +0 -30
  248. package/dist/modules/onboarding/mode.js +0 -30
  249. package/dist/modules/onboarding/prompts.js +0 -43
  250. package/dist/modules/pipelines/engine.js +0 -70
  251. package/dist/modules/pipelines/index.js +0 -4
  252. package/dist/modules/pipelines/parser.js +0 -59
  253. package/dist/modules/pipelines/template.js +0 -18
  254. package/dist/modules/plugins/builtin/lint-on-write.js +0 -377
  255. package/dist/modules/plugins/builtin/notify.js +0 -11
  256. package/dist/modules/plugins/index.js +0 -2
  257. package/dist/modules/plugins/loader.js +0 -85
  258. package/dist/modules/plugins/manager.js +0 -244
  259. package/dist/modules/plugins/types.js +0 -1
  260. package/dist/modules/pricing/index.js +0 -70
  261. package/dist/modules/pricing/prices.js +0 -147
  262. package/dist/modules/processes/detect.js +0 -34
  263. package/dist/modules/processes/index.js +0 -4
  264. package/dist/modules/processes/kill-tree.js +0 -52
  265. package/dist/modules/processes/registry.js +0 -294
  266. package/dist/modules/processes/runner.js +0 -23
  267. package/dist/modules/providers/cache.js +0 -23
  268. package/dist/modules/providers/capabilities.js +0 -28
  269. package/dist/modules/providers/create.js +0 -21
  270. package/dist/modules/providers/factory.js +0 -28
  271. package/dist/modules/providers/fallback.js +0 -81
  272. package/dist/modules/providers/health.js +0 -47
  273. package/dist/modules/providers/index.js +0 -6
  274. package/dist/modules/providers/manager.js +0 -207
  275. package/dist/modules/providers/naming.js +0 -15
  276. package/dist/modules/providers/preflight.js +0 -71
  277. package/dist/modules/providers/presets.js +0 -232
  278. package/dist/modules/providers/registry.js +0 -27
  279. package/dist/modules/providers/types.js +0 -1
  280. package/dist/modules/reasoning/policy.js +0 -42
  281. package/dist/modules/reasoning/probe.js +0 -116
  282. package/dist/modules/registry.js +0 -48
  283. package/dist/modules/security/audit-log.js +0 -119
  284. package/dist/modules/security/audit-notifier.js +0 -267
  285. package/dist/modules/security/command-validator.js +0 -272
  286. package/dist/modules/security/content-scanner.js +0 -53
  287. package/dist/modules/security/data-sanitizer.js +0 -82
  288. package/dist/modules/security/encryption.js +0 -216
  289. package/dist/modules/security/index.js +0 -15
  290. package/dist/modules/security/network-validator.js +0 -236
  291. package/dist/modules/security/path-validator.js +0 -261
  292. package/dist/modules/security/protected-paths.js +0 -73
  293. package/dist/modules/security/rate-limiter.js +0 -98
  294. package/dist/modules/security/security-policies.js +0 -499
  295. package/dist/modules/security/session-encryption.js +0 -182
  296. package/dist/modules/security/session-isolation.js +0 -75
  297. package/dist/modules/session/auto-name.js +0 -63
  298. package/dist/modules/session/export.js +0 -98
  299. package/dist/modules/session/index.js +0 -4
  300. package/dist/modules/session/manager.js +0 -234
  301. package/dist/modules/session/module.js +0 -33
  302. package/dist/modules/session/store.js +0 -295
  303. package/dist/modules/session/types.js +0 -1
  304. package/dist/modules/setup/answers.js +0 -35
  305. package/dist/modules/setup/apply.js +0 -79
  306. package/dist/modules/setup/discovery.js +0 -72
  307. package/dist/modules/skills/index.js +0 -3
  308. package/dist/modules/skills/loader.js +0 -86
  309. package/dist/modules/skills/matcher.js +0 -27
  310. package/dist/modules/skills/module.js +0 -141
  311. package/dist/modules/types.js +0 -1
  312. package/dist/modules/updater/changelog-reader.js +0 -93
  313. package/dist/modules/updater/checker.js +0 -101
  314. package/dist/modules/updater/dev-detect.js +0 -18
  315. package/dist/modules/updater/index.js +0 -4
  316. package/dist/modules/updater/module.js +0 -129
  317. package/dist/modules/user-profile/compressor.js +0 -18
  318. package/dist/modules/user-profile/index.js +0 -2
  319. package/dist/modules/user-profile/profile.js +0 -77
  320. package/dist/modules/webui/answer-api.js +0 -29
  321. package/dist/modules/webui/assets.js +0 -50
  322. package/dist/modules/webui/body.js +0 -21
  323. package/dist/modules/webui/commands-settings.js +0 -209
  324. package/dist/modules/webui/commands-shared.js +0 -60
  325. package/dist/modules/webui/commands.js +0 -174
  326. package/dist/modules/webui/config-api.js +0 -134
  327. package/dist/modules/webui/file-api.js +0 -202
  328. package/dist/modules/webui/forward.js +0 -159
  329. package/dist/modules/webui/history-api.js +0 -112
  330. package/dist/modules/webui/host-state.js +0 -60
  331. package/dist/modules/webui/i18n-api.js +0 -9
  332. package/dist/modules/webui/limits.js +0 -6
  333. package/dist/modules/webui/log-forward.js +0 -20
  334. package/dist/modules/webui/memory-commands.js +0 -64
  335. package/dist/modules/webui/model-cache.js +0 -18
  336. package/dist/modules/webui/module.js +0 -148
  337. package/dist/modules/webui/persist.js +0 -24
  338. package/dist/modules/webui/prompt-io.js +0 -97
  339. package/dist/modules/webui/providers-api.js +0 -337
  340. package/dist/modules/webui/providers-view.js +0 -56
  341. package/dist/modules/webui/reasoning-view.js +0 -15
  342. package/dist/modules/webui/run-agent.js +0 -81
  343. package/dist/modules/webui/server.js +0 -284
  344. package/dist/modules/webui/sessions-api.js +0 -178
  345. package/dist/modules/webui/settings-api.js +0 -561
  346. package/dist/modules/webui/setup-api.js +0 -201
  347. package/dist/modules/webui/state.js +0 -74
  348. package/dist/modules/webui/util.js +0 -261
  349. package/dist/output/bus.js +0 -37
  350. package/dist/output/channel.js +0 -285
  351. package/dist/output/format.js +0 -15
  352. package/dist/output/index.js +0 -8
  353. package/dist/output/json-sink.js +0 -24
  354. package/dist/output/machine.js +0 -9
  355. package/dist/output/session-sink.js +0 -27
  356. package/dist/output/types.js +0 -1
  357. package/dist/tools/approve.js +0 -41
  358. package/dist/tools/attach-image.js +0 -102
  359. package/dist/tools/auto-fixer.js +0 -180
  360. package/dist/tools/auto-tags.js +0 -83
  361. package/dist/tools/bash.js +0 -649
  362. package/dist/tools/browser.js +0 -160
  363. package/dist/tools/chunk-query.js +0 -112
  364. package/dist/tools/create-dir.js +0 -60
  365. package/dist/tools/delete-file.js +0 -67
  366. package/dist/tools/download-file.js +0 -142
  367. package/dist/tools/edit-file.js +0 -136
  368. package/dist/tools/enable-tools.js +0 -59
  369. package/dist/tools/executor.js +0 -304
  370. package/dist/tools/file-info.js +0 -49
  371. package/dist/tools/filter-tools.js +0 -17
  372. package/dist/tools/glob-tool.js +0 -37
  373. package/dist/tools/grep-tool.js +0 -142
  374. package/dist/tools/hidden-tools-block.js +0 -37
  375. package/dist/tools/index.js +0 -88
  376. package/dist/tools/list-dir.js +0 -53
  377. package/dist/tools/load-skill.js +0 -51
  378. package/dist/tools/mcp-call.js +0 -80
  379. package/dist/tools/meet-done.js +0 -14
  380. package/dist/tools/move-file.js +0 -94
  381. package/dist/tools/path-utils.js +0 -108
  382. package/dist/tools/pipeline-run.js +0 -167
  383. package/dist/tools/preview.js +0 -2
  384. package/dist/tools/process-ids.js +0 -31
  385. package/dist/tools/process-kill.js +0 -33
  386. package/dist/tools/process-list.js +0 -38
  387. package/dist/tools/process-log.js +0 -49
  388. package/dist/tools/process-wait.js +0 -63
  389. package/dist/tools/prompt-io.js +0 -29
  390. package/dist/tools/question.js +0 -288
  391. package/dist/tools/read-file.js +0 -200
  392. package/dist/tools/recall.js +0 -124
  393. package/dist/tools/registry.js +0 -48
  394. package/dist/tools/remember.js +0 -72
  395. package/dist/tools/scope-check.js +0 -32
  396. package/dist/tools/scope-request.js +0 -96
  397. package/dist/tools/search-history.js +0 -88
  398. package/dist/tools/session-info.js +0 -46
  399. package/dist/tools/set-thinking.js +0 -75
  400. package/dist/tools/subagent.js +0 -257
  401. package/dist/tools/syntax-validator.js +0 -379
  402. package/dist/tools/types.js +0 -1
  403. package/dist/tools/user-input.js +0 -134
  404. package/dist/tools/web-browse.js +0 -93
  405. package/dist/tools/web-fetch.js +0 -108
  406. package/dist/tools/web-search.js +0 -107
  407. package/dist/tools/write-file.js +0 -128
  408. package/dist/ui/action-log.js +0 -13
  409. package/dist/ui/box.js +0 -78
  410. package/dist/ui/colors.js +0 -6
  411. package/dist/ui/diff.js +0 -189
  412. package/dist/ui/index.js +0 -7
  413. package/dist/ui/line-editor.js +0 -1083
  414. package/dist/ui/line-math.js +0 -98
  415. package/dist/ui/md-formatter.js +0 -322
  416. package/dist/ui/output.js +0 -19
  417. package/dist/ui/plan-view.js +0 -109
  418. package/dist/ui/renderer.js +0 -589
  419. package/dist/ui/spinner.js +0 -91
  420. package/dist/ui/table.js +0 -142
  421. package/dist/ui/theme.js +0 -143
  422. package/dist/utils/child-run.js +0 -20
  423. package/dist/utils/error.js +0 -4
  424. package/dist/utils/index.js +0 -6
  425. package/dist/utils/retry.js +0 -17
  426. package/dist/utils/sleep.js +0 -23
  427. package/dist/utils/truncate.js +0 -9
@@ -1,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
- }