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,90 +0,0 @@
1
- /**
2
- * Константы агентного цикла. Вынесены из agent.ts: без магических чисел,
3
- * переиспользуются extracted-модулями, каждая константа несёт JSDoc-обоснование.
4
- */
5
- /** Макс. доля бюджета истории под результат одного тула (по токенам). */
6
- export const TOOL_RESULT_MAX_TOKENS_RATIO = 0.3;
7
- /** Абсолютный потолок результата тула в символах. */
8
- export const TOOL_RESULT_ABSOLUTE_MAX_CHARS = 15000;
9
- /**
10
- * Порог качества контекста, ниже которого включается принудительная
11
- * компакция. См. FORCED_COMPACTION_COOLDOWN — без cooldown низкое
12
- * качество ретриггерит компакцию на каждой итерации.
13
- */
14
- export const QUALITY_TRIGGER_THRESHOLD = 40;
15
- /**
16
- * Макс. символов аргументов тула в <system-summary>. Не допускает
17
- * дублирования `content` из write_file поверх role:"tool" сообщения,
18
- * которое уже несёт результат.
19
- */
20
- export const TOOL_ARGS_SUMMARY_MAX_CHARS = 240;
21
- /**
22
- * Макс. длина одного строкового значения аргумента в <system-summary>.
23
- * Более длинные значения (content/new_string/text) заменяются на `…(N chars)`:
24
- * их полный текст уже присутствует в assistant-сообщении с tool_calls и в
25
- * role:"tool" результате, поэтому дублировать тело в сводке не нужно.
26
- */
27
- export const TOOL_ARG_VALUE_MAX_CHARS = 48;
28
- /**
29
- * Мин. число итераций между принудительными компакциями по качеству.
30
- * Без него компакция не может восстановить качество и выжигает весь
31
- * бюджет на компактирование (наблюдалось: 56 компакций за ~28 минут).
32
- */
33
- export const FORCED_COMPACTION_COOLDOWN = 3;
34
- /** Макс. повторов при восстановимой ошибке LLM (например, токен-лимит). */
35
- export const MAX_LLM_ERROR_RETRIES = 2;
36
- /** Макс. повторов при вердикте халлюцинации "retry". */
37
- export const MAX_HALLUCINATION_RETRIES = 3;
38
- /**
39
- * Макс. перепроверок заявления об успехе против свежих результатов тулов
40
- * (success-claim check). Одна попытка: либо модель сверяется и правит
41
- * формулировку, либо ответ принимается как есть (fail-open, не блок).
42
- */
43
- export const MAX_CLAIM_CHECK_RETRIES = 1;
44
- /** Порог подряд идущих неудач тулов до сообщения о восстановлении. */
45
- export const MAX_CONSECUTIVE_TOOL_FAILURES = 5;
46
- /**
47
- * Порог подряд идущих ПОЛНОСТЬЮ провальных пакетов тулов (каждый вызов —
48
- * неудача или tool-level блок вроде `[SECURITY BLOCKED]`) до honest-stop
49
- * директивы. Ниже, чем MAX_CONSECUTIVE_TOOL_FAILURES: смешанные пакеты
50
- * (успех + неудача) и успехи сбрасывают счётчик, поэтому срабатывание
51
- * означает именно топтание без прогресса (наблюдалось: qwen3.5-9b перебирал
52
- * python/python3/bun/pip/npx после двух блоков, не останавливаясь).
53
- * Plugin-level блоки (`result.blocked`, guard-rails) в счётчик не входят —
54
- * см. контракт ToolResult.blocked.
55
- */
56
- export const MAX_CONSECUTIVE_FAILED_BATCHES = 4;
57
- /**
58
- * Жёсткая остановка retry-петли: столько полностью провальных пакетов подряд
59
- * (директива honest-stop уже проигнорирована) — цикл прерывается с честной
60
- * ошибкой вместо сжигания контекста. Зазор +2 к директиве даёт модели шанс
61
- * остановиться самой или предложить честный ответ.
62
- */
63
- export const HARD_STOP_FAILED_BATCHES = 6;
64
- /**
65
- * Мин. общих (не подряд идущих) неудач тула до записи правила в память.
66
- * Фиксирует системные проблемы (ENOENT у LSP, сломанный конфиг), которые
67
- * не всплывают по пути "5 подряд неудач".
68
- */
69
- export const MIN_REPEATED_TOOL_FAILURES = 3;
70
- /** Макс. повторов финального аудита. */
71
- export const MAX_AUDIT_RETRIES = 3;
72
- /** Макс. повторов пустого ответа. */
73
- export const MAX_EMPTY_RESPONSE_RETRIES = 2;
74
- /** Макс. повторных одинаковых тулов в режиме exit-on-complete. */
75
- export const MAX_REPEATED_TOOL_CALLS = 2;
76
- /**
77
- * Макс. повторных одинаковых тулов в интерактивном режиме до жёсткой
78
- * остановки. Выше, чем в exit-on-complete: сначала модель получает nudge
79
- * (по одному разу на каждый повтор), и только потом цикл обрывается —
80
- * без этого модель, игнорирующая подсказки, бесконечно повторяет один
81
- * и тот же вызов (наблюдалось: session_info подряд после завершения задачи).
82
- */
83
- export const MAX_REPEATED_TOOL_CALLS_INTERACTIVE = 5;
84
- /**
85
- * Порог цикла «перфекционизм»: столько правок одного файла (или запусков
86
- * одной команды) за прогон, после которых цикл подталкивает модель закрыть
87
- * задачу. Наблюдение ses_mthn3c2a: задача готова на итерации 13, модель ещё
88
- * 20+ итераций микроредактировала один файл (edit → build → read → edit…).
89
- */
90
- export const MUTATION_CYCLE_NUDGE_THRESHOLD = 5;
@@ -1,454 +0,0 @@
1
- /** Git-подобный лог контекста LLM: snapshot'ы и diff между итерациями. */
2
- /**
3
- * Запись всего контекста, уходящего в LLM, в git-подобный diff-файл.
4
- *
5
- * Формат: snapshot 0 — полный контекст (каждая строка с "+", как новый файл в
6
- * git); каждый следующий snapshot — построчный diff относительно предыдущего
7
- * ("-" удалено, "+" добавлено). Секции канонического текста: [SYSTEM],
8
- * [TOOLS], [HISTORY].
9
- *
10
- * Reasoning модели НЕ входит в контекст, отправляемый в LLM, поэтому он пишется
11
- * отдельной аннотацией [OUTPUT] и в diff не участвует.
12
- *
13
- * Секреты редактируются общим sanitizeLogMessage (если redact=true).
14
- */
15
- import { appendFileSync, existsSync, mkdirSync, readFileSync } from "fs";
16
- import { dirname } from "path";
17
- /**
18
- * Точечная редакция секретов для context-log.
19
- *
20
- * НЕ используем общий sanitizeLogMessage: его generic-паттерн (любая строка
21
- * 30+ символов) и слишком широкий `pass` вырезают обычный текст контекста —
22
- * имена скилов, "pass a file", `pass "background: true"` — что делает
23
- * отладочный лог бесполезным. Здесь только безошибочно опознаваемые секреты.
24
- */
25
- const SECRET_PATTERNS = [
26
- [/\bsk-[A-Za-z0-9_-]{16,}\b/g, "sk-[REDACTED]"],
27
- [/\bctx7sk-[A-Za-z0-9_-]{10,}\b/g, "ctx7sk-[REDACTED]"],
28
- [/\bghp_[A-Za-z0-9]{20,}\b/g, "ghp_[REDACTED]"],
29
- [/\bgithub_pat_[A-Za-z0-9_]{20,}\b/g, "github_pat_[REDACTED]"],
30
- [/\bAKIA[0-9A-Z]{16}\b/g, "AKIA[REDACTED]"],
31
- [/\bxox[baprs]-[A-Za-z0-9-]{10,}\b/g, "xox[REDACTED]"],
32
- [/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{5,}\b/g, "[JWT REDACTED]"],
33
- [/\b(Bearer)\s+[A-Za-z0-9._~+/-]{20,}=*/gi, "$1 [REDACTED]"],
34
- [
35
- /\b(api[_-]?key|access[_-]?token|auth[_-]?token|secret[_-]?key|private[_-]?key)\b(["']?\s*[=:]\s*["']?)([A-Za-z0-9_\-./+]{16,})/gi,
36
- "$1$2[REDACTED]",
37
- ],
38
- [/\b(password|passwd)\b(["']?\s*[=:]\s*["']?)([^\s"'&]{8,})/gi, "$1$2[REDACTED]"],
39
- ];
40
- /** Заменяет только безошибочно опознаваемые секреты, не трогая обычный текст. */
41
- export function redactContextSecrets(text) {
42
- let out = text;
43
- for (const [pattern, replacement] of SECRET_PATTERNS) {
44
- out = out.replace(pattern, replacement);
45
- }
46
- return out;
47
- }
48
- /** Версия протокола заголовка — растёт при несовместимом изменении формата. */
49
- export const CONTEXT_LOG_FORMAT = 1;
50
- const BAR = "═".repeat(78);
51
- const SEP = "─".repeat(78);
52
- const CONTEXT_LINES = 3;
53
- // Ограничение на размер LCS-матрицы. При большем «середине» diff деградирует
54
- // до полной замены, чтобы не аллоцировать сотни МБ.
55
- const MAX_LCS_CELLS = 4_000_000;
56
- function safeJson(value) {
57
- if (value === undefined)
58
- return "";
59
- if (typeof value === "string")
60
- return value;
61
- try {
62
- return JSON.stringify(value);
63
- }
64
- catch {
65
- return String(value);
66
- }
67
- }
68
- function contentLines(content) {
69
- if (content == null)
70
- return [""];
71
- if (typeof content === "string")
72
- return content.length > 0 ? content.split("\n") : [""];
73
- if (Array.isArray(content)) {
74
- const lines = [];
75
- for (const part of content) {
76
- if (part && typeof part === "object") {
77
- const p = part;
78
- if (p.type === "text" && typeof p.text === "string") {
79
- lines.push(...(p.text.length > 0 ? p.text.split("\n") : [""]));
80
- }
81
- else if (p.type === "image_url") {
82
- lines.push("[image]");
83
- }
84
- else {
85
- lines.push(safeJson(part));
86
- }
87
- }
88
- else {
89
- lines.push(String(part));
90
- }
91
- }
92
- return lines.length > 0 ? lines : [""];
93
- }
94
- return [String(content)];
95
- }
96
- /**
97
- * Каноническое многострочное представление отправляемого контекста.
98
- * Порядок фиксирован: system → tools → history. Стабильный формат — залог
99
- * осмысленного diff между итерациями.
100
- */
101
- export function serializeContextForLog(messages, tools) {
102
- const out = [];
103
- const system = [];
104
- const rest = [];
105
- for (const m of messages)
106
- (m.role === "system" ? system : rest).push(m);
107
- out.push("[SYSTEM]");
108
- if (system.length === 0) {
109
- out.push("(none)");
110
- }
111
- else {
112
- for (const m of system)
113
- out.push(...contentLines(m.content));
114
- }
115
- out.push("");
116
- out.push("[TOOLS]");
117
- if (tools.length === 0) {
118
- out.push("(none)");
119
- }
120
- else {
121
- for (const tool of tools) {
122
- out.push(`${tool.name} | ${tool.description} | ${safeJson(tool.parameters)}`);
123
- }
124
- }
125
- out.push("");
126
- out.push("[HISTORY]");
127
- if (rest.length === 0) {
128
- out.push("(empty)");
129
- }
130
- else {
131
- for (const m of rest) {
132
- const head = [`role=${m.role}`];
133
- if (m.tool_call_id)
134
- head.push(`id=${m.tool_call_id}`);
135
- if (m.name)
136
- head.push(`name=${m.name}`);
137
- if (m.success !== undefined)
138
- head.push(`success=${m.success}`);
139
- out.push(head.join(" "));
140
- if (Array.isArray(m.tool_calls)) {
141
- for (const tc of m.tool_calls) {
142
- const name = tc.function?.name ?? "?";
143
- const args = tc.function?.arguments;
144
- out.push(` → ${name} ${typeof args === "string" ? args : safeJson(args)}`);
145
- }
146
- }
147
- out.push(...contentLines(m.content));
148
- out.push("");
149
- }
150
- }
151
- return out.join("\n");
152
- }
153
- function commonPrefixLen(a, b) {
154
- const max = Math.min(a.length, b.length);
155
- let i = 0;
156
- while (i < max && a[i] === b[i])
157
- i++;
158
- return i;
159
- }
160
- function commonSuffixLen(a, b, prefix) {
161
- const max = Math.min(a.length - prefix, b.length - prefix);
162
- let i = 0;
163
- while (i < max && a[a.length - 1 - i] === b[b.length - 1 - i])
164
- i++;
165
- return i;
166
- }
167
- /** LCS-дифф для средней части (уже без общего префикса/суффикса). */
168
- function lcsOps(a, b) {
169
- const n = a.length;
170
- const m = b.length;
171
- if (n === 0 && m === 0)
172
- return [];
173
- if (n === 0)
174
- return b.map((line) => ({ type: "+", line }));
175
- if (m === 0)
176
- return a.map((line) => ({ type: "-", line }));
177
- if (n * m > MAX_LCS_CELLS) {
178
- const ops = [];
179
- for (const line of a)
180
- ops.push({ type: "-", line });
181
- for (const line of b)
182
- ops.push({ type: "+", line });
183
- return ops;
184
- }
185
- const width = m + 1;
186
- const dp = new Uint32Array((n + 1) * width);
187
- for (let i = n - 1; i >= 0; i--) {
188
- for (let j = m - 1; j >= 0; j--) {
189
- dp[i * width + j] =
190
- a[i] === b[j]
191
- ? dp[(i + 1) * width + (j + 1)] + 1
192
- : Math.max(dp[(i + 1) * width + j], dp[i * width + (j + 1)]);
193
- }
194
- }
195
- const ops = [];
196
- let i = 0;
197
- let j = 0;
198
- while (i < n && j < m) {
199
- if (a[i] === b[j]) {
200
- ops.push({ type: " ", line: a[i] });
201
- i++;
202
- j++;
203
- }
204
- else if (dp[(i + 1) * width + j] >= dp[i * width + (j + 1)]) {
205
- ops.push({ type: "-", line: a[i] });
206
- i++;
207
- }
208
- else {
209
- ops.push({ type: "+", line: b[j] });
210
- j++;
211
- }
212
- }
213
- while (i < n)
214
- ops.push({ type: "-", line: a[i++] });
215
- while (j < m)
216
- ops.push({ type: "+", line: b[j++] });
217
- return ops;
218
- }
219
- function renderHunks(ops, context) {
220
- const changed = [];
221
- for (let i = 0; i < ops.length; i++) {
222
- if (ops[i].type !== " ")
223
- changed.push(i);
224
- }
225
- if (changed.length === 0)
226
- return [];
227
- // Номера строк до/после для каждого op.
228
- const oldNum = new Array(ops.length);
229
- const newNum = new Array(ops.length);
230
- let o = 1;
231
- let nw = 1;
232
- for (let i = 0; i < ops.length; i++) {
233
- oldNum[i] = o;
234
- newNum[i] = nw;
235
- if (ops[i].type === " ") {
236
- o++;
237
- nw++;
238
- }
239
- else if (ops[i].type === "-") {
240
- o++;
241
- }
242
- else {
243
- nw++;
244
- }
245
- }
246
- const groups = [];
247
- let start = changed[0];
248
- let end = changed[0];
249
- for (let k = 1; k < changed.length; k++) {
250
- if (changed[k] - end <= context * 2) {
251
- end = changed[k];
252
- }
253
- else {
254
- groups.push([start, end]);
255
- start = changed[k];
256
- end = changed[k];
257
- }
258
- }
259
- groups.push([start, end]);
260
- const hunks = [];
261
- for (const [s, e] of groups) {
262
- const from = Math.max(0, s - context);
263
- const to = Math.min(ops.length - 1, e + context);
264
- let oldCount = 0;
265
- let newCount = 0;
266
- const body = [];
267
- for (let i = from; i <= to; i++) {
268
- const op = ops[i];
269
- if (op.type !== "+")
270
- oldCount++;
271
- if (op.type !== "-")
272
- newCount++;
273
- body.push(`${op.type}${op.line}`);
274
- }
275
- hunks.push(`@@ -${oldNum[from]},${oldCount} +${newNum[from]},${newCount} @@`);
276
- hunks.push(...body);
277
- }
278
- return hunks;
279
- }
280
- /**
281
- * Плоский unified diff без ANSI и truncation.
282
- * `prev`/`next` — многострочный текст. Возвращает "" при отсутствии изменений.
283
- */
284
- export function unifiedDiff(prev, next, context = CONTEXT_LINES, fromLabel = "a", toLabel = "b") {
285
- if (prev === next)
286
- return "";
287
- const a = prev.split("\n");
288
- const b = next.split("\n");
289
- const prefix = commonPrefixLen(a, b);
290
- const suffix = commonSuffixLen(a, b, prefix);
291
- const midA = a.slice(prefix, a.length - suffix);
292
- const midB = b.slice(prefix, b.length - suffix);
293
- const midOps = lcsOps(midA, midB);
294
- const ops = [];
295
- for (let i = 0; i < prefix; i++)
296
- ops.push({ type: " ", line: a[i] });
297
- ops.push(...midOps);
298
- for (let i = suffix; i > 0; i--)
299
- ops.push({ type: " ", line: a[a.length - i] });
300
- const hunks = renderHunks(ops, context);
301
- if (hunks.length === 0)
302
- return "";
303
- return [`--- ${fromLabel}`, `+++ ${toLabel}`, ...hunks].join("\n");
304
- }
305
- /**
306
- * Пишет git-подобный лог контекста в append-only файл.
307
- */
308
- export class ContextLogger {
309
- path;
310
- sessionId;
311
- model;
312
- contextWindow;
313
- runId;
314
- redact;
315
- now;
316
- prev = null;
317
- snapshotIndex = 0;
318
- headerWritten = false;
319
- outputIndex = 0;
320
- constructor(opts) {
321
- this.path = opts.path;
322
- this.sessionId = opts.sessionId;
323
- this.model = opts.model;
324
- this.contextWindow = opts.contextWindow;
325
- this.runId = opts.runId ?? process.pid;
326
- this.redact = opts.redact !== false;
327
- this.now = opts.now ?? (() => new Date());
328
- }
329
- get filePath() {
330
- return this.path;
331
- }
332
- ensureHeader() {
333
- if (this.headerWritten)
334
- return;
335
- this.headerWritten = true;
336
- try {
337
- mkdirSync(dirname(this.path), { recursive: true });
338
- }
339
- catch {
340
- // best-effort: appendFileSync ниже сообщит об ошибке
341
- }
342
- const exists = existsSync(this.path);
343
- let existing = "";
344
- if (exists) {
345
- try {
346
- existing = readFileSync(this.path, "utf8");
347
- }
348
- catch {
349
- existing = "";
350
- }
351
- }
352
- // Продолжаем нумерацию snapshot'ов, если файл уже есть.
353
- const matches = existing.match(/### snapshot (\d+)/g);
354
- if (matches && matches.length > 0) {
355
- const last = matches[matches.length - 1].match(/### snapshot (\d+)/);
356
- if (last)
357
- this.snapshotIndex = Number(last[1]) + 1;
358
- }
359
- if (existing.trim().length > 0) {
360
- const runHeader = [
361
- "",
362
- BAR,
363
- `===== run ${this.runId} · ${this.now().toISOString()} · session ${this.sessionId} =====`,
364
- SEP,
365
- "",
366
- ].join("\n");
367
- this.append(runHeader);
368
- }
369
- else {
370
- const header = [
371
- BAR,
372
- "mma context log",
373
- `session: ${this.sessionId} model: ${this.model} contextWindow: ${this.contextWindow}`,
374
- `run ${this.runId} · started ${this.now().toISOString()}`,
375
- "format: snapshot 0 = full context (all lines \"+\"); later snapshots are line diffs",
376
- " (- removed, + added). [OUTPUT] = model output, NOT part of the LLM context.",
377
- `secrets: ${this.redact ? "redacted" : "RAW"}`,
378
- BAR,
379
- "",
380
- ].join("\n");
381
- this.append(header);
382
- }
383
- }
384
- append(text) {
385
- try {
386
- appendFileSync(this.path, text.endsWith("\n") ? text : `${text}\n`, "utf8");
387
- }
388
- catch {
389
- // Логирование контекста не должно ронять агент.
390
- }
391
- }
392
- sanitize(text) {
393
- return this.redact ? redactContextSecrets(text) : text;
394
- }
395
- /** Записывает снимок отправляемого контекста (diff к предыдущему). */
396
- record(messages, tools, meta) {
397
- this.ensureHeader();
398
- const text = this.sanitize(serializeContextForLog(messages, tools));
399
- const idx = this.snapshotIndex;
400
- const header = `### snapshot ${idx} · run ${this.runId} · iteration ${meta.iteration} · ${meta.ts} · ` +
401
- `${meta.totalTokens}/${meta.contextWindow} tok ` +
402
- `(system ${meta.systemTokens} · tools ${meta.toolTokens} · history ${meta.historyTokens})`;
403
- let block;
404
- if (this.prev === null) {
405
- const lines = text.split("\n");
406
- const body = lines.map((l) => `+${l}`).join("\n");
407
- block = `${header}\n--- /dev/null\n+++ b/context@${idx}\n@@ -0,0 +1,${lines.length} @@\n${body}`;
408
- }
409
- else {
410
- const diff = unifiedDiff(this.prev, text, CONTEXT_LINES, `context@${idx - 1}`, `context@${idx}`);
411
- block = diff ? `${header}\n${diff}` : `${header}\n(context unchanged)`;
412
- }
413
- this.prev = text;
414
- this.snapshotIndex++;
415
- this.append(`\n${block}\n`);
416
- }
417
- /**
418
- * Аннотация вывода модели. Reasoning/текст/tool_calls НЕ входят в контекст
419
- * LLM для следующего запроса — поэтому это не diff, а плоская запись.
420
- */
421
- recordOutput(out) {
422
- const hasReasoning = !!out.reasoning?.trim();
423
- const hasText = !!out.text?.trim();
424
- const hasCalls = !!out.toolCalls && out.toolCalls.length > 0;
425
- if (!hasReasoning && !hasText && !hasCalls)
426
- return;
427
- this.ensureHeader();
428
- this.outputIndex++;
429
- const lines = [
430
- "",
431
- `[OUTPUT #${this.outputIndex} ← result of iteration ${out.iteration}, NOT part of the LLM context]`,
432
- ];
433
- if (hasReasoning) {
434
- lines.push("▍reasoning:");
435
- for (const line of this.sanitize(out.reasoning).split("\n"))
436
- lines.push(`▍ ${line}`);
437
- }
438
- if (hasText) {
439
- lines.push("▍assistant text:");
440
- for (const line of this.sanitize(out.text).split("\n"))
441
- lines.push(`▍ ${line}`);
442
- }
443
- if (hasCalls) {
444
- lines.push("▍tool_calls:");
445
- for (const call of out.toolCalls) {
446
- lines.push(`▍ ${call.name} ${this.sanitize(safeJson(call.arguments))}`);
447
- }
448
- }
449
- this.append(lines.join("\n"));
450
- }
451
- /** Append-only логгер — закрывать нечего. Оставлено для симметрии API. */
452
- close() {
453
- }
454
- }
@@ -1,45 +0,0 @@
1
- /** Рендер UI-индикаторов контекста (stats-бар, уведомление о компакции). */
2
- import { pc } from "../../ui/colors";
3
- /**
4
- * Рендер UI-индикаторов контекста (stats-бар и уведомление о компакции).
5
- *
6
- * Вынесен из agent.ts, где рендеринг жил прямо в бизнес-логике цикла.
7
- * `lastCompactionShown` хранится внутри и переживает несколько запусков
8
- * цикла (как исходное поле Agent) — экземпляр должен быть полем класса,
9
- * а не создаваться заново на каждый ход.
10
- */
11
- export class ContextRenderer {
12
- lastCompactionShown = 0;
13
- /**
14
- * Рисует индикаторы контекста (stats либо уведомление о компакции).
15
- * @param ui UI-конфиг; @param contextManager менеджер контекста; @param onMeta sink мета-вывода.
16
- */
17
- render(ui, contextManager, onMeta) {
18
- if (ui?.showContextStats) {
19
- this.renderStats(contextManager, onMeta);
20
- }
21
- else if (ui?.showCompaction) {
22
- this.renderCompaction(contextManager, onMeta);
23
- }
24
- }
25
- renderStats(contextManager, onMeta) {
26
- const ctxTokens = contextManager.getEstimatedTokens();
27
- const ctxBudget = contextManager.getBudget();
28
- const ctxPct = Math.min(100, Math.round((ctxTokens / ctxBudget.history) * 100));
29
- const barLen = 10;
30
- const filled = Math.round((ctxPct / 100) * barLen);
31
- const ctxBar = pc.green("█".repeat(filled)) + pc.dim("░".repeat(barLen - filled));
32
- const pctColor = ctxPct >= 75 ? pc.yellow : pc.dim;
33
- const compCount = contextManager.getCompactionCount();
34
- const quality = contextManager.getQuality();
35
- const qualityColor = quality >= 70 ? pc.green : quality >= 40 ? pc.yellow : pc.red;
36
- onMeta?.(`\n ${ctxBar} ${pctColor(`${ctxPct}%`)} ${pc.dim(`ctx: ${ctxTokens}/${ctxBudget.history}`)} ${pc.dim(`compactions: ${compCount}`)} ${qualityColor(`quality: ${quality}%`)}\n`);
37
- }
38
- renderCompaction(contextManager, onMeta) {
39
- const compCount = contextManager.getCompactionCount();
40
- if (compCount > this.lastCompactionShown) {
41
- this.lastCompactionShown = compCount;
42
- onMeta?.(pc.dim(`\n ⟳ Context compacted (${compCount})\n`));
43
- }
44
- }
45
- }