micro-models-agent 2.10.0 → 2.12.0

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 (359) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/dist/assets/app.js +22 -4
  3. package/dist/assets/index.html +29 -0
  4. package/dist/assets/js/dom.js +2 -1
  5. package/dist/assets/js/feed.js +38 -26
  6. package/dist/assets/js/format.js +1 -1
  7. package/dist/assets/js/rail.js +114 -0
  8. package/dist/assets/js/settings-controls.js +2 -2
  9. package/dist/assets/js/settings.js +246 -51
  10. package/dist/assets/js/store.js +3 -0
  11. package/dist/assets/js/tabs.js +104 -2
  12. package/dist/assets/styles.css +215 -66
  13. package/dist/cli/cache-line.js +1 -0
  14. package/dist/cli/command-suggest.js +5 -4
  15. package/dist/cli/commands.js +231 -122
  16. package/dist/cli/completer.js +132 -31
  17. package/dist/cli/index.js +1 -0
  18. package/dist/cli/json-payload.js +4 -4
  19. package/dist/cli/main.js +166 -61
  20. package/dist/cli/onboarding-commands.js +126 -0
  21. package/dist/cli/plugin-commands.js +2 -1
  22. package/dist/cli/relaunch.js +16 -13
  23. package/dist/cli/repl-commands-lsp.js +75 -0
  24. package/dist/cli/repl-commands-skills.js +105 -0
  25. package/dist/cli/repl-commands.js +589 -266
  26. package/dist/cli/repl.js +436 -177
  27. package/dist/cli/run-result.js +5 -6
  28. package/dist/cli/security-commands.js +37 -28
  29. package/dist/cli/setup-order.js +4 -55
  30. package/dist/cli/setup-prompt.js +3 -2
  31. package/dist/cli/setup.js +27 -107
  32. package/dist/cli/web-command.js +98 -0
  33. package/dist/config/budget.js +5 -5
  34. package/dist/config/config.js +103 -96
  35. package/dist/config/defaults.js +38 -8
  36. package/dist/config/domains.js +24 -27
  37. package/dist/config/env.js +46 -0
  38. package/dist/config/experts.js +2 -0
  39. package/dist/config/index.js +1 -0
  40. package/dist/config/paths.js +56 -0
  41. package/dist/config/redact.js +44 -0
  42. package/dist/config/registry-extra.js +334 -0
  43. package/dist/config/registry.js +584 -0
  44. package/dist/config/security.js +35 -36
  45. package/dist/config/timeouts.js +74 -0
  46. package/dist/config/utils.js +16 -15
  47. package/dist/core/agent/artifact-progress.js +59 -0
  48. package/dist/core/agent/artifact-resolve.js +79 -0
  49. package/dist/core/agent/audit-gate.js +7 -3
  50. package/dist/core/agent/compaction.js +2 -2
  51. package/dist/core/agent/constants.js +33 -4
  52. package/dist/core/agent/context-log.js +454 -0
  53. package/dist/core/agent/context-renderer.js +5 -0
  54. package/dist/core/agent/critic-gate.js +132 -0
  55. package/dist/core/agent/hallucination-gate.js +148 -38
  56. package/dist/core/agent/loop-state.js +15 -0
  57. package/dist/core/agent/prefix-monitor.js +1 -1
  58. package/dist/core/agent/reasoning-resolver.js +10 -1
  59. package/dist/core/agent/token-tracker.js +7 -4
  60. package/dist/core/agent/tool-batch.js +93 -18
  61. package/dist/core/agent/tool-images.js +18 -0
  62. package/dist/core/agent/tool-output.js +65 -11
  63. package/dist/core/agent/tool-pairing.js +60 -0
  64. package/dist/core/agent-moe.js +25 -24
  65. package/dist/core/agent.js +429 -108
  66. package/dist/core/bootstrap/agent-phase.js +66 -0
  67. package/dist/core/bootstrap/config-phase.js +86 -0
  68. package/dist/core/bootstrap/modules-phase.js +269 -0
  69. package/dist/core/bootstrap/provider-phase.js +183 -0
  70. package/dist/core/bootstrap/session-phase.js +204 -0
  71. package/dist/core/bootstrap/state.js +94 -0
  72. package/dist/core/bootstrap/workspace-phase.js +115 -0
  73. package/dist/core/bootstrap.js +92 -660
  74. package/dist/core/crash-handler.js +17 -7
  75. package/dist/core/environment.js +37 -12
  76. package/dist/core/host-plan.js +43 -0
  77. package/dist/core/host.js +23 -0
  78. package/dist/core/index.js +1 -0
  79. package/dist/core/prompt-builder.js +17 -1
  80. package/dist/core/prompt-overflow.js +42 -43
  81. package/dist/core/session-logger.js +122 -30
  82. package/dist/core/system-prompt.js +117 -0
  83. package/dist/core/version.js +6 -4
  84. package/dist/core/web-host.js +34 -0
  85. package/dist/core/workspace.js +19 -15
  86. package/dist/i18n/en.json +106 -21
  87. package/dist/i18n/index.js +37 -3
  88. package/dist/i18n/ru.json +109 -21
  89. package/dist/index.js +7 -3
  90. package/dist/llm/image-utils.js +55 -64
  91. package/dist/llm/llm-errors.js +9 -0
  92. package/dist/llm/model-loader.js +10 -32
  93. package/dist/llm/models-dev.js +121 -0
  94. package/dist/llm/openai-compat.js +146 -73
  95. package/dist/llm/orchestrator.js +33 -11
  96. package/dist/llm/provider-budget.js +2 -2
  97. package/dist/llm/provider-context.js +233 -0
  98. package/dist/llm/provider.js +1 -1
  99. package/dist/llm/response.js +5 -0
  100. package/dist/llm/token-counter.js +27 -11
  101. package/dist/logger/app-logger.js +48 -22
  102. package/dist/logger/file-log.js +28 -19
  103. package/dist/logger/index.js +1 -0
  104. package/dist/main.js +24285 -22447
  105. package/dist/migration/backup.js +14 -3
  106. package/dist/migration/detect.js +12 -3
  107. package/dist/migration/index.js +1 -0
  108. package/dist/modules/artifacts/store.js +9 -8
  109. package/dist/modules/browser/actions.js +6 -0
  110. package/dist/modules/browser/bridge-client.js +14 -12
  111. package/dist/modules/browser/bridge-path.js +4 -4
  112. package/dist/modules/browser/console-buffer.js +37 -0
  113. package/dist/modules/browser/cookie-store.js +5 -0
  114. package/dist/modules/browser/driver-types.js +1 -0
  115. package/dist/modules/browser/driver.js +19 -11
  116. package/dist/modules/browser/index.js +3 -1
  117. package/dist/modules/browser/module.js +2 -1
  118. package/dist/modules/browser/session.js +10 -30
  119. package/dist/modules/browser/snapshot.js +19 -13
  120. package/dist/modules/browser/types.js +1 -0
  121. package/dist/modules/certification/cli.js +28 -20
  122. package/dist/modules/certification/fact-checker.js +9 -1
  123. package/dist/modules/certification/loader.js +9 -2
  124. package/dist/modules/certification/manifest.js +83 -21
  125. package/dist/modules/certification/runner.js +23 -13
  126. package/dist/modules/certification/scenarios.js +20 -20
  127. package/dist/modules/certification/syntax-scenarios.js +1 -2
  128. package/dist/modules/context/chunk-query.js +11 -9
  129. package/dist/modules/context/fact-extractor.js +37 -39
  130. package/dist/modules/context/index.js +1 -0
  131. package/dist/modules/context/manager.js +106 -80
  132. package/dist/modules/critic/client.js +176 -0
  133. package/dist/modules/critic/evidence.js +81 -0
  134. package/dist/modules/critic/provider.js +45 -0
  135. package/dist/modules/critic/tools.js +78 -0
  136. package/dist/modules/critic/types.js +1 -0
  137. package/dist/modules/execution/audit-runners.js +28 -34
  138. package/dist/modules/execution/auditor.js +53 -49
  139. package/dist/modules/execution/execution-plugin.js +142 -102
  140. package/dist/modules/execution/index.js +1 -1
  141. package/dist/modules/execution/input-from.js +37 -13
  142. package/dist/modules/execution/module.js +368 -191
  143. package/dist/modules/execution/moe-executor.js +53 -26
  144. package/dist/modules/execution/plan-actions.js +320 -202
  145. package/dist/modules/execution/plan-checks.js +35 -0
  146. package/dist/modules/execution/plan-coverage.js +36 -33
  147. package/dist/modules/execution/plan-steps.js +11 -3
  148. package/dist/modules/execution/plan-store.js +83 -17
  149. package/dist/modules/execution/plan-tool.js +89 -35
  150. package/dist/modules/execution/plan-validator.js +30 -10
  151. package/dist/modules/execution/planner.js +22 -13
  152. package/dist/modules/execution/stuck-detector.js +196 -93
  153. package/dist/modules/execution/tracker.js +22 -8
  154. package/dist/modules/execution/verifier.js +69 -48
  155. package/dist/modules/execution/windows-commands.js +12 -12
  156. package/dist/modules/hallucination/artifact-claim.js +93 -0
  157. package/dist/modules/hallucination/confidence.js +13 -11
  158. package/dist/modules/hallucination/consistency.js +10 -2
  159. package/dist/modules/hallucination/detector.js +10 -5
  160. package/dist/modules/hallucination/factual.js +43 -26
  161. package/dist/modules/hallucination/index.js +1 -0
  162. package/dist/modules/hallucination/js-identifiers.js +44 -45
  163. package/dist/modules/hallucination/llm-judge.js +17 -12
  164. package/dist/modules/hallucination/success-claim.js +59 -0
  165. package/dist/modules/indexer/cache.js +52 -4
  166. package/dist/modules/indexer/index.js +1 -0
  167. package/dist/modules/indexer/map-command.js +2 -4
  168. package/dist/modules/indexer/map-select.js +16 -16
  169. package/dist/modules/indexer/module.js +47 -12
  170. package/dist/modules/indexer/project-profile.js +8 -7
  171. package/dist/modules/indexer/symbols.js +15 -15
  172. package/dist/modules/indexer/walker.js +159 -29
  173. package/dist/modules/lsp/check-tool.js +7 -5
  174. package/dist/modules/lsp/client.js +39 -39
  175. package/dist/modules/lsp/command.js +17 -24
  176. package/dist/modules/lsp/config.js +12 -11
  177. package/dist/modules/lsp/index.js +1 -0
  178. package/dist/modules/lsp/module.js +48 -46
  179. package/dist/modules/lsp/probe.js +13 -14
  180. package/dist/modules/lsp/project-root.js +14 -17
  181. package/dist/modules/lsp/startup-check.js +18 -16
  182. package/dist/modules/mcp/client.js +59 -62
  183. package/dist/modules/mcp/index.js +1 -0
  184. package/dist/modules/mcp/module.js +66 -37
  185. package/dist/modules/mcp/registry.js +5 -0
  186. package/dist/modules/memory/index.js +1 -0
  187. package/dist/modules/memory/module.js +12 -8
  188. package/dist/modules/memory/search.js +4 -1
  189. package/dist/modules/memory/store.js +40 -2
  190. package/dist/modules/onboarding/init.js +47 -0
  191. package/dist/modules/onboarding/meet.js +30 -0
  192. package/dist/modules/onboarding/mode.js +30 -0
  193. package/dist/modules/onboarding/prompts.js +43 -0
  194. package/dist/modules/pipelines/engine.js +10 -0
  195. package/dist/modules/pipelines/index.js +1 -0
  196. package/dist/modules/pipelines/parser.js +4 -1
  197. package/dist/modules/pipelines/template.js +4 -0
  198. package/dist/modules/plugins/builtin/lint-on-write.js +80 -67
  199. package/dist/modules/plugins/builtin/notify.js +2 -0
  200. package/dist/modules/plugins/index.js +1 -0
  201. package/dist/modules/plugins/loader.js +18 -3
  202. package/dist/modules/plugins/manager.js +37 -17
  203. package/dist/modules/pricing/index.js +10 -11
  204. package/dist/modules/pricing/prices.js +12 -12
  205. package/dist/modules/processes/index.js +1 -0
  206. package/dist/modules/processes/kill-tree.js +27 -31
  207. package/dist/modules/processes/registry.js +44 -25
  208. package/dist/modules/processes/runner.js +4 -4
  209. package/dist/modules/providers/capabilities.js +28 -0
  210. package/dist/modules/providers/create.js +3 -4
  211. package/dist/modules/providers/factory.js +7 -7
  212. package/dist/modules/providers/fallback.js +12 -12
  213. package/dist/modules/providers/health.js +4 -4
  214. package/dist/modules/providers/manager.js +50 -19
  215. package/dist/modules/providers/naming.js +15 -0
  216. package/dist/modules/providers/preflight.js +71 -0
  217. package/dist/modules/providers/presets.js +39 -8
  218. package/dist/modules/providers/registry.js +7 -2
  219. package/dist/modules/reasoning/policy.js +8 -6
  220. package/dist/modules/reasoning/probe.js +30 -25
  221. package/dist/modules/security/audit-log.js +19 -36
  222. package/dist/modules/security/audit-notifier.js +35 -75
  223. package/dist/modules/security/command-validator.js +99 -51
  224. package/dist/modules/security/content-scanner.js +8 -8
  225. package/dist/modules/security/data-sanitizer.js +9 -16
  226. package/dist/modules/security/encryption.js +32 -52
  227. package/dist/modules/security/index.js +2 -1
  228. package/dist/modules/security/network-validator.js +120 -43
  229. package/dist/modules/security/path-validator.js +61 -46
  230. package/dist/modules/security/protected-paths.js +73 -0
  231. package/dist/modules/security/rate-limiter.js +17 -49
  232. package/dist/modules/security/security-policies.js +25 -57
  233. package/dist/modules/security/session-encryption.js +32 -71
  234. package/dist/modules/security/session-isolation.js +15 -28
  235. package/dist/modules/session/auto-name.js +63 -0
  236. package/dist/modules/session/export.js +98 -0
  237. package/dist/modules/session/index.js +1 -0
  238. package/dist/modules/session/manager.js +79 -28
  239. package/dist/modules/session/module.js +4 -3
  240. package/dist/modules/session/store.js +57 -20
  241. package/dist/modules/setup/answers.js +35 -0
  242. package/dist/modules/setup/apply.js +79 -0
  243. package/dist/modules/setup/discovery.js +72 -0
  244. package/dist/modules/skills/index.js +1 -0
  245. package/dist/modules/skills/loader.js +9 -1
  246. package/dist/modules/skills/module.js +11 -0
  247. package/dist/modules/updater/changelog-reader.js +15 -16
  248. package/dist/modules/updater/checker.js +9 -4
  249. package/dist/modules/updater/dev-detect.js +7 -6
  250. package/dist/modules/updater/index.js +1 -0
  251. package/dist/modules/updater/module.js +17 -15
  252. package/dist/modules/user-profile/compressor.js +2 -0
  253. package/dist/modules/user-profile/index.js +1 -0
  254. package/dist/modules/user-profile/profile.js +10 -1
  255. package/dist/modules/webui/answer-api.js +29 -0
  256. package/dist/modules/webui/assets.js +50 -0
  257. package/dist/modules/webui/body.js +21 -0
  258. package/dist/modules/webui/commands-settings.js +209 -0
  259. package/dist/modules/webui/commands-shared.js +60 -0
  260. package/dist/modules/webui/commands.js +174 -0
  261. package/dist/modules/webui/config-api.js +134 -0
  262. package/dist/modules/webui/file-api.js +202 -0
  263. package/dist/modules/webui/forward.js +159 -0
  264. package/dist/modules/webui/history-api.js +112 -0
  265. package/dist/modules/webui/host-state.js +60 -0
  266. package/dist/modules/webui/i18n-api.js +9 -0
  267. package/dist/modules/webui/limits.js +6 -0
  268. package/dist/modules/webui/log-forward.js +20 -0
  269. package/dist/modules/webui/memory-commands.js +64 -0
  270. package/dist/modules/webui/model-cache.js +18 -0
  271. package/dist/modules/webui/module.js +148 -0
  272. package/dist/modules/webui/persist.js +24 -0
  273. package/dist/modules/webui/prompt-io.js +97 -0
  274. package/dist/modules/webui/providers-api.js +337 -0
  275. package/dist/modules/webui/providers-view.js +56 -0
  276. package/dist/modules/webui/reasoning-view.js +15 -0
  277. package/dist/modules/webui/run-agent.js +81 -0
  278. package/dist/modules/webui/server.js +284 -0
  279. package/dist/modules/webui/sessions-api.js +178 -0
  280. package/dist/modules/webui/settings-api.js +561 -0
  281. package/dist/modules/webui/setup-api.js +201 -0
  282. package/dist/modules/webui/state.js +74 -0
  283. package/dist/modules/webui/util.js +261 -0
  284. package/dist/output/bus.js +7 -2
  285. package/dist/output/channel.js +80 -28
  286. package/dist/output/format.js +2 -1
  287. package/dist/output/index.js +1 -0
  288. package/dist/output/json-sink.js +5 -3
  289. package/dist/output/machine.js +4 -3
  290. package/dist/output/session-sink.js +4 -4
  291. package/dist/tools/approve.js +4 -0
  292. package/dist/tools/attach-image.js +5 -4
  293. package/dist/tools/auto-fixer.js +26 -44
  294. package/dist/tools/auto-tags.js +83 -0
  295. package/dist/tools/bash.js +193 -116
  296. package/dist/tools/browser.js +76 -31
  297. package/dist/tools/chunk-query.js +14 -6
  298. package/dist/tools/create-dir.js +9 -5
  299. package/dist/tools/delete-file.js +9 -5
  300. package/dist/tools/download-file.js +32 -7
  301. package/dist/tools/edit-file.js +52 -14
  302. package/dist/tools/enable-tools.js +6 -6
  303. package/dist/tools/executor.js +132 -27
  304. package/dist/tools/file-info.js +3 -1
  305. package/dist/tools/filter-tools.js +3 -3
  306. package/dist/tools/glob-tool.js +4 -1
  307. package/dist/tools/grep-tool.js +13 -10
  308. package/dist/tools/hidden-tools-block.js +6 -6
  309. package/dist/tools/index.js +16 -8
  310. package/dist/tools/list-dir.js +4 -2
  311. package/dist/tools/load-skill.js +7 -0
  312. package/dist/tools/mcp-call.js +15 -4
  313. package/dist/tools/meet-done.js +14 -0
  314. package/dist/tools/move-file.js +14 -7
  315. package/dist/tools/path-utils.js +29 -29
  316. package/dist/tools/pipeline-run.js +29 -7
  317. package/dist/tools/preview.js +1 -1
  318. package/dist/tools/process-ids.js +31 -0
  319. package/dist/tools/process-kill.js +9 -16
  320. package/dist/tools/process-list.js +1 -0
  321. package/dist/tools/process-log.js +11 -16
  322. package/dist/tools/process-wait.js +63 -0
  323. package/dist/tools/prompt-io.js +4 -3
  324. package/dist/tools/question.js +172 -25
  325. package/dist/tools/read-file.js +55 -34
  326. package/dist/tools/recall.js +14 -8
  327. package/dist/tools/registry.js +6 -5
  328. package/dist/tools/remember.js +8 -4
  329. package/dist/tools/scope-request.js +11 -6
  330. package/dist/tools/search-history.js +5 -2
  331. package/dist/tools/session-info.js +2 -0
  332. package/dist/tools/set-thinking.js +8 -4
  333. package/dist/tools/subagent.js +59 -39
  334. package/dist/tools/syntax-validator.js +292 -90
  335. package/dist/tools/user-input.js +22 -18
  336. package/dist/tools/web-browse.js +9 -3
  337. package/dist/tools/web-fetch.js +12 -23
  338. package/dist/tools/web-search.js +7 -5
  339. package/dist/tools/write-file.js +45 -15
  340. package/dist/ui/action-log.js +13 -0
  341. package/dist/ui/box.js +4 -3
  342. package/dist/ui/colors.js +2 -0
  343. package/dist/ui/diff.js +6 -5
  344. package/dist/ui/index.js +1 -0
  345. package/dist/ui/line-editor.js +230 -122
  346. package/dist/ui/line-math.js +10 -2
  347. package/dist/ui/md-formatter.js +57 -37
  348. package/dist/ui/output.js +8 -3
  349. package/dist/ui/plan-view.js +21 -10
  350. package/dist/ui/renderer.js +393 -67
  351. package/dist/ui/spinner.js +16 -5
  352. package/dist/ui/table.js +15 -17
  353. package/dist/ui/theme.js +143 -0
  354. package/dist/utils/child-run.js +20 -0
  355. package/dist/utils/error.js +1 -1
  356. package/dist/utils/index.js +2 -0
  357. package/dist/utils/retry.js +2 -2
  358. package/dist/utils/truncate.js +1 -1
  359. package/package.json +1 -1
@@ -0,0 +1,126 @@
1
+ // Онбординг-команды REPL: /memory, /meet, /init (чистый диспатч + регистрация).
2
+ import { t } from "../i18n/index";
3
+ import { pc } from "../ui/colors";
4
+ import { MemoryStore } from "../modules/memory/store";
5
+ import { runMeet } from "../modules/onboarding/meet";
6
+ import { runInit } from "../modules/onboarding/init";
7
+ import { globalMemoryDir } from "../config/paths";
8
+ const CATEGORIES = ["conventions", "decisions", "errors", "facts"];
9
+ /** Чистый диспатч `/memory`: возвращает строки, рендерит вызывающий. */
10
+ export function applyMemoryCommand(store, args) {
11
+ const [sub, ...rest] = args;
12
+ if (!sub)
13
+ return renderOverview(store);
14
+ switch (sub) {
15
+ case "get": {
16
+ const key = rest[0];
17
+ const prefs = store.getPreferences();
18
+ if (!key || !(key in prefs))
19
+ return [pc.yellow(t("repl.memory_not_found", { key: key ?? "" }))];
20
+ return [`${key}=${prefs[key]}`];
21
+ }
22
+ case "set": {
23
+ const [key, ...value] = rest;
24
+ if (!key || value.length === 0)
25
+ return [t("repl.memory_usage")];
26
+ store.setPreference(key, value.join(" "));
27
+ return [pc.green(t("repl.memory_set", { key, value: value.join(" ") }))];
28
+ }
29
+ case "unset": {
30
+ const key = rest[0];
31
+ if (!key)
32
+ return [t("repl.memory_usage")];
33
+ const ok = store.deletePreference(key);
34
+ return [ok ? t("repl.memory_unset", { key }) : pc.yellow(t("repl.memory_not_found", { key }))];
35
+ }
36
+ case "find": {
37
+ const query = rest.join(" ");
38
+ if (!query)
39
+ return [t("repl.memory_usage")];
40
+ const hits = store.search(query);
41
+ return hits.length ? hits.map((h) => `${pc.dim(h.file)} ${h.match}`) : [t("repl.memory_empty")];
42
+ }
43
+ case "forget": {
44
+ const [category, nRaw] = rest;
45
+ if (!category || !CATEGORIES.includes(category))
46
+ return [t("repl.memory_usage")];
47
+ const n = parseInt(nRaw ?? "0", 10);
48
+ const ok = n > 0 && store.deleteEntry(category, n);
49
+ return [
50
+ ok
51
+ ? t("repl.memory_forgotten", { category, n: String(n) })
52
+ : pc.yellow(t("repl.memory_entry_not_found", { category, n: String(nRaw ?? n) })),
53
+ ];
54
+ }
55
+ default:
56
+ return [t("repl.memory_usage")];
57
+ }
58
+ }
59
+ function renderOverview(store) {
60
+ const out = [];
61
+ const prefs = store.getPreferences();
62
+ out.push(pc.bold(t("repl.memory_prefs")));
63
+ const entries = Object.entries(prefs);
64
+ if (entries.length === 0)
65
+ out.push(pc.dim(t("repl.memory_empty")));
66
+ for (const [k, v] of entries)
67
+ out.push(` ${k} = ${v}`);
68
+ for (const cat of CATEGORIES) {
69
+ const all = store.read(cat).split(/\r?\n/);
70
+ const idxs = all.map((l, i) => (l.startsWith("- ") ? i : -1)).filter((i) => i >= 0);
71
+ const shown = idxs.slice(-3);
72
+ if (shown.length === 0)
73
+ continue;
74
+ out.push(pc.dim(`[${cat}]`));
75
+ for (const i of shown)
76
+ out.push(` [${idxs.indexOf(i) + 1}] ${all[i]}`);
77
+ }
78
+ return out;
79
+ }
80
+ /**
81
+ * Регистрирует `/memory`, `/meet`, `/init`. `/setup` осознанно НЕ
82
+ * перерегистрируется: визардом настройки уже владеет `/wizard`
83
+ * (см. repl-commands) с алиасом `setup` — вторая регистрация продублировала/
84
+ * перекрыла бы его. `/setup` тем самым переиспользует тот хендлер.
85
+ */
86
+ export function registerOnboardingCommands(ctx) {
87
+ const store = () => new MemoryStore(globalMemoryDir());
88
+ ctx.registerCommand({
89
+ name: "memory",
90
+ description: t("repl.memory_usage"),
91
+ usage: t("repl.memory_usage"),
92
+ action: async (args) => {
93
+ for (const l of applyMemoryCommand(store(), args))
94
+ ctx.output.writeLine(l);
95
+ },
96
+ });
97
+ ctx.registerCommand({
98
+ name: "meet",
99
+ description: t("cli.meet"),
100
+ aliases: ["познакомимся"],
101
+ usage: t("repl.meet_usage"),
102
+ action: async (args) => {
103
+ const sub = args[0];
104
+ if (sub === "stop" || sub === "end") {
105
+ if (ctx.toolCtx.onboarding) {
106
+ const { exitMeetMode } = await import("../modules/onboarding/mode");
107
+ exitMeetMode(ctx);
108
+ ctx.output.writeLine(t("repl.meet_stop_done"));
109
+ }
110
+ else {
111
+ ctx.output.writeLine(t("repl.meet_stop_none"));
112
+ }
113
+ return;
114
+ }
115
+ await runMeet(ctx);
116
+ },
117
+ });
118
+ ctx.registerCommand({
119
+ name: "init",
120
+ description: t("repl.init"),
121
+ usage: t("repl.init_usage"),
122
+ action: async () => {
123
+ await runInit(ctx);
124
+ },
125
+ });
126
+ }
@@ -2,8 +2,9 @@ import { bootstrap } from "../core/bootstrap";
2
2
  import { readMmaVersion } from "../core/version";
3
3
  import { t } from "../i18n/index";
4
4
  import { getDefaultChannel } from "../output";
5
+ // CLI-группа `mma plugins`: список плагинов.
5
6
  /**
6
- * Create the `mma plugins` subcommand group.
7
+ * Создаёт группу субкоманд `mma plugins`.
7
8
  */
8
9
  export function createPluginCommand(program) {
9
10
  const pluginsCmd = program.command("plugins").description(t("cli.plugins.description"));
@@ -1,24 +1,27 @@
1
+ // Перезапуск CLI в свежем процессе после визарда настройки.
1
2
  import { spawnSync } from "node:child_process";
3
+ import { t } from "../i18n/index";
2
4
  import { getDefaultChannel } from "../output";
5
+ import { MMA_ENV } from "../config/env";
3
6
  /**
4
- * Args that relaunch the current CLI in a fresh process: drop the runtime's
5
- * argv[0] (the bun/node binary) and keep the entry script plus every user arg.
7
+ * Аргументы для перезапуска текущего CLI в свежем процессе: дропаем argv[0]
8
+ * рантайма (бинарник bun/node), оставляем входной скрипт и все юзер-аргументы.
6
9
  */
7
10
  export function relaunchArgs(argv) {
8
11
  return argv.slice(1);
9
12
  }
10
13
  /**
11
- * Re-exec the current CLI in a brand-new process with inherited stdio, then
12
- * exit with its status.
14
+ * Переисполняет текущий CLI в brand-new процессе с inherit stdio и выходит
15
+ * с его статусом.
13
16
  *
14
- * First-run setup uses this so the wizard and the REPL never share a process:
15
- * on Bun/Windows the raw-mode `LineEditor` only receives keypresses when it is
16
- * the FIRST consumer of stdin, and reusing one editor across the
17
- * wizard → bootstrap → REPL phases leaks prompt/frame state. A fresh process
18
- * makes the REPL editor the first stdin consumer by construction.
17
+ * Первый запуск использует это, чтобы визард и REPL не делили процесс: на
18
+ * Bun/Windows raw-режимный `LineEditor` получает keypress, только будучи ПЕРВЫМ
19
+ * потребителем stdin, а переиспользование одного редактора через фазы
20
+ * wizard → bootstrap → REPL протекает состоянием промпта/кадра. Свежий процесс
21
+ * делает REPL-редактор первым потребителем по построению.
19
22
  *
20
- * `MMA_POST_SETUP=1` is set on the child so a failed config write can never
21
- * loop the wizard.
23
+ * `MMA_POST_SETUP=1` ставится ребёнку, чтобы неуспешная запись конфига не могла
24
+ * зациклить визард.
22
25
  */
23
26
  export function relaunchCli() {
24
27
  const args = relaunchArgs(process.argv);
@@ -27,10 +30,10 @@ export function relaunchCli() {
27
30
  process.exit(0);
28
31
  const child = spawnSync(process.execPath, args, {
29
32
  stdio: "inherit",
30
- env: { ...process.env, MMA_POST_SETUP: "1" },
33
+ env: { ...process.env, [MMA_ENV.POST_SETUP]: "1" },
31
34
  });
32
35
  if (child.error) {
33
- getDefaultChannel().writeLine(`Failed to relaunch the CLI: ${child.error.message}`, "stderr");
36
+ getDefaultChannel().writeLine(t("cli.relaunch_failed", { message: child.error.message }), "stderr");
34
37
  process.exit(1);
35
38
  }
36
39
  process.exit(child.status ?? 0);
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Команда REPL `/lsp`: вынесена из `repl-commands.ts` (нарезка крупных файлов).
3
+ */
4
+ import { pc } from "../ui/colors";
5
+ import { t } from "../i18n/index";
6
+ import { errMsg } from "../utils";
7
+ /** Регистрирует `/lsp` (status/restart/check) через handler-map (правило #17). */
8
+ export function registerLspCommands(ctx) {
9
+ ctx.registerCommand({
10
+ name: "lsp",
11
+ description: t("repl.lsp"),
12
+ usage: t("repl.lsp_usage"),
13
+ examples: ["/lsp status", "/lsp restart", "/lsp check src/index.ts"],
14
+ action: async (args) => {
15
+ // Доступ к LSP-модулю через реестр модулей агента.
16
+ const lspModule = ctx.agent.getModule("lsp");
17
+ if (!lspModule) {
18
+ ctx.output.writeLine(pc.yellow(t("repl.lsp_not_available")));
19
+ return;
20
+ }
21
+ const handlers = {
22
+ status: () => {
23
+ const disabled = lspModule.getDisabledServers();
24
+ const failures = lspModule.getFailureCounts();
25
+ const config = ctx.config.lsp;
26
+ ctx.output.writeLine(pc.bold(t("repl.lsp_status_header")));
27
+ ctx.output.writeLine(`${t("repl.lsp_enabled")} ${config?.enabled ? pc.green(t("repl.yes")) : pc.red(t("repl.no"))}`);
28
+ if (disabled.length > 0) {
29
+ ctx.output.writeLine(pc.yellow(`${t("repl.lsp_disabled_servers")} ${disabled.join(", ")}`));
30
+ }
31
+ if (failures.size > 0) {
32
+ ctx.output.writeLine(pc.dim(t("repl.lsp_failure_counts")));
33
+ for (const [server, count] of failures) {
34
+ ctx.output.writeLine(pc.dim(` ${server}: ${count}`));
35
+ }
36
+ }
37
+ if (disabled.length === 0 && failures.size === 0) {
38
+ ctx.output.writeLine(pc.green(t("repl.lsp_all_ok")));
39
+ }
40
+ },
41
+ restart: () => {
42
+ ctx.output.writeLine(pc.yellow(t("repl.lsp_restarting")));
43
+ lspModule.resetDisabledServers();
44
+ ctx.output.writeLine(pc.green(t("repl.lsp_restarted")));
45
+ },
46
+ check: async (rest) => {
47
+ const path = rest[0];
48
+ if (!path) {
49
+ ctx.output.writeLine(pc.yellow(t("repl.lsp_check_usage")));
50
+ return;
51
+ }
52
+ ctx.output.writeLine(pc.dim(t("repl.lsp_checking", { path })));
53
+ // Запуск тула lsp_check через публичный API агента (не через приватные deps)
54
+ try {
55
+ const result = await ctx.agent.runTool("lsp_check", { path });
56
+ if (result?.output) {
57
+ ctx.output.writeLine(result.output);
58
+ }
59
+ }
60
+ catch (e) {
61
+ ctx.output.writeLine(pc.red(t("repl.lsp_check_error", { error: errMsg(e) })), "stderr");
62
+ }
63
+ },
64
+ };
65
+ const subcommand = args[0] || "status";
66
+ const handler = handlers[subcommand];
67
+ if (!handler) {
68
+ ctx.output.writeLine(pc.yellow(t("repl.unknown_sub", { cmd: "lsp", sub: subcommand })));
69
+ ctx.output.writeLine(pc.dim(t("repl.lsp_usage")));
70
+ return;
71
+ }
72
+ await handler(args.slice(1));
73
+ },
74
+ });
75
+ }
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Команда REPL `/skill`: вынесена из `repl-commands.ts` (нарезка крупных файлов).
3
+ */
4
+ import { pc } from "../ui/colors";
5
+ import { t } from "../i18n/index";
6
+ import { estimateTokens } from "../llm/token-counter";
7
+ /** Регистрирует `/skill` (list/loaded/load/unload/search). Нет модуля скиллов — скип. */
8
+ export function registerSkillCommands(ctx) {
9
+ if (!ctx.skillsModule)
10
+ return;
11
+ const listSkills = () => {
12
+ const available = ctx.skillsModule.getAvailable();
13
+ if (available.length === 0) {
14
+ ctx.output.writeLine(t("repl.no_skills"));
15
+ return;
16
+ }
17
+ ctx.output.writeLine(pc.bold(t("repl.available_skills")));
18
+ for (const skill of available) {
19
+ const tokens = estimateTokens(skill.content);
20
+ const loaded = ctx.skillsModule.getLoaded().some((s) => s.name === skill.name);
21
+ const marker = loaded ? pc.green(` ${t("repl.loaded")}`) : "";
22
+ ctx.output.writeLine(` ${pc.cyan(skill.name)}${marker} ${pc.dim(`(${tokens} tokens)`)} ${skill.description.slice(0, 60)}`);
23
+ }
24
+ };
25
+ const listLoaded = () => {
26
+ const loaded = ctx.skillsModule.getLoaded();
27
+ const budget = ctx.skillsModule.getBudget();
28
+ if (loaded.length === 0) {
29
+ ctx.output.writeLine(t("repl.no_loaded"));
30
+ return;
31
+ }
32
+ ctx.output.writeLine(pc.bold(t("repl.loaded_skills")));
33
+ for (const skill of loaded) {
34
+ const tokens = estimateTokens(skill.content);
35
+ ctx.output.writeLine(` ${pc.cyan(skill.name)} ${pc.dim(`(${tokens} tokens)`)} ${skill.description.slice(0, 60)}`);
36
+ }
37
+ ctx.output.writeLine(pc.dim(`\n ${t("repl.budget", { used: budget.used, total: budget.total, remaining: budget.remaining })}`));
38
+ };
39
+ const loadSkill = (args) => {
40
+ const arg = args.join(" ");
41
+ if (!arg) {
42
+ ctx.output.writeLine(t("repl.skill_load_usage"));
43
+ return;
44
+ }
45
+ const result = ctx.skillsModule.loadByName(arg);
46
+ if (result.success) {
47
+ ctx.output.writeLine(pc.green(result.message));
48
+ }
49
+ else {
50
+ ctx.output.writeLine(pc.red(result.message), "stderr");
51
+ }
52
+ };
53
+ const unloadSkill = (args) => {
54
+ const arg = args.join(" ");
55
+ if (!arg) {
56
+ ctx.output.writeLine(t("repl.skill_unload_usage"));
57
+ return;
58
+ }
59
+ if (ctx.skillsModule.unload(arg)) {
60
+ ctx.output.writeLine(pc.green(t("repl.skill_unloaded", { name: arg })));
61
+ }
62
+ else {
63
+ ctx.output.writeLine(pc.red(t("repl.skill_not_loaded", { name: arg })), "stderr");
64
+ }
65
+ };
66
+ const searchSkills = (args) => {
67
+ const arg = args.join(" ");
68
+ if (!arg) {
69
+ ctx.output.writeLine(t("repl.skill_search_usage"));
70
+ return;
71
+ }
72
+ const results = ctx.skillsModule.search(arg);
73
+ if (results.length === 0) {
74
+ ctx.output.writeLine(t("repl.no_skill_match", { query: arg }));
75
+ return;
76
+ }
77
+ ctx.output.writeLine(pc.bold(t("repl.skills_matching", { query: arg })));
78
+ for (const skill of results) {
79
+ const tokens = estimateTokens(skill.content);
80
+ ctx.output.writeLine(` ${pc.cyan(skill.name)} ${pc.dim(`(${tokens} tokens)`)} ${skill.description.slice(0, 60)}`);
81
+ }
82
+ };
83
+ const skillHandlers = {
84
+ list: listSkills,
85
+ loaded: listLoaded,
86
+ load: loadSkill,
87
+ unload: unloadSkill,
88
+ search: searchSkills,
89
+ };
90
+ ctx.registerCommand({
91
+ name: "skill",
92
+ description: t("repl.skill"),
93
+ usage: t("repl.skill_usage"),
94
+ action: (args) => {
95
+ const subcmd = args[0];
96
+ const handler = subcmd ? skillHandlers[subcmd] : skillHandlers.list;
97
+ if (!handler) {
98
+ ctx.output.writeLine(pc.yellow(t("repl.unknown_sub", { cmd: "skill", sub: subcmd })));
99
+ ctx.output.writeLine(t("repl.skill_usage"));
100
+ return;
101
+ }
102
+ handler(args.slice(1));
103
+ },
104
+ });
105
+ }