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
@@ -1,65 +1,64 @@
1
1
  /* ---- theme tokens (dark default; light override further below) ---- */
2
2
  :root {
3
- --bg: #12161d;
3
+ --bg: #141414;
4
4
  --fg: #e6edf3;
5
- --panel: #171b22;
6
- --sb-bg: #14181f;
7
- --stab-bg: #14181f;
8
- --stab-on-bg: #12161d;
9
- --surface: #1a1f27;
10
- --input-surface: #1a1f27;
11
- --inp-bg: #1b212a;
12
- --inp-border: #2ea04355;
13
- --inp-focus: #2ea043;
14
- --input-shadow: #2ea04333;
15
- --border: #252b34;
16
- --border-2: #2a313c;
17
- --border-3: #232a33;
18
- --muted: #b1bac4;
19
- --dim-a: #9198a1;
20
- --dim-b: #6e7681;
21
- --dim-c: #6e7681;
22
- --accent: #58a6ff;
23
- --accent-bg: #12233a;
24
- --green: #3fb950;
25
- --green-fill: #238636;
26
- --red: #ff7b72;
27
- --err: #ff7b72;
28
- --red-strong: #f85149;
29
- --yellow: #d29922;
30
- --purple: #d2a8ff;
31
- --cyan: #39c5cf;
32
- --think: #8b7bb8;
33
- --cmdout: #b1bac4;
34
- --meta: #9198a1;
35
- --args: #9198a1;
36
- --hover-bg: #252b34;
37
- --hover-bg-2: #252b34;
38
- --x-hover-bg: #2a313c;
39
- --u-fg: #79c0ff;
40
- --u-bg: #1a2633;
41
- --u-border: #388bfd;
5
+ --panel: #191919;
6
+ --sb-bg: #181818;
7
+ --stab-bg: #181818;
8
+ --surface: #1f1f1f;
9
+ --input-surface: #1f1f1f;
10
+ --inp-bg: #1d1d1d;
11
+ --inp-border: #c4a8ec44;
12
+ --inp-focus: #c4a8ec;
13
+ --input-shadow: #c4a8ec33;
14
+ --border: #262626;
15
+ --border-2: #2e2e2e;
16
+ --border-3: #262626;
17
+ --muted: #d4d4d4;
18
+ --dim-a: #a3a3a3;
19
+ --dim-b: #737373;
20
+ --dim-c: #737373;
21
+ --accent: #c4a8ec;
22
+ --accent-bg: #241e30;
23
+ --green: #c9c5bd;
24
+ --green-fill: #8a8781;
25
+ --red: #e08080;
26
+ --err: #e08080;
27
+ --red-strong: #e08080;
28
+ --yellow: #d9a45b;
29
+ --purple: #b8b0a6;
30
+ --cyan: #a8a29e;
31
+ --think: #9c9c9c;
32
+ --cmdout: #d4d4d4;
33
+ --meta: #a3a3a3;
34
+ --args: #a3a3a3;
35
+ --hover-bg: #262626;
36
+ --hover-bg-2: #222222;
37
+ --x-hover-bg: #2e2e2e;
38
+ --u-fg: #d3bdf2;
39
+ --u-bg: #221c2e;
40
+ --u-border: #c4a8ec;
42
41
  --ans: #a5adb6;
43
- --toggle-off: #30363d;
44
- --toggle-knob: #b1bac4;
42
+ --toggle-off: #2e2e2e;
43
+ --toggle-knob: #a3a3a3;
45
44
  --toggle-knob-on: #fff;
46
- --scroll-thumb: #2a313c;
47
- --scroll-thumb-hover: #6e7681;
48
- --stab-thumb: #3d444d;
49
- --stab-thumb-hover: #6e7681;
50
- --pipe: #3d444d;
51
- --rule: #3d444d;
52
- --checker-a: #232a33;
53
- --checker-b: #2a313c;
54
- --checker-base: #171b22;
55
- --checker-border: #3d444d;
45
+ --scroll-thumb: #2e2e2e;
46
+ --scroll-thumb-hover: #737373;
47
+ --stab-thumb: #2e2e2e;
48
+ --stab-thumb-hover: #737373;
49
+ --pipe: #2e2e2e;
50
+ --rule: #2e2e2e;
51
+ --checker-a: #222222;
52
+ --checker-b: #2e2e2e;
53
+ --checker-base: #191919;
54
+ --checker-border: #2e2e2e;
56
55
  --ph-light: #eaeef2;
57
- --track: #252b34;
58
- --plan-line: #2a313c;
59
- --plan-bar-fg: #b1bac4;
60
- --sec-h: #9198a1;
61
- --sec-h-hover: #b1bac4;
62
- --stab-fg: #9198a1;
56
+ --track: #262626;
57
+ --plan-line: #2e2e2e;
58
+ --plan-bar-fg: #a3a3a3;
59
+ --sec-h: #a3a3a3;
60
+ --sec-h-hover: #d4d4d4;
61
+ --stab-fg: #a3a3a3;
63
62
  --overlay: rgba(0,0,0,.55);
64
63
  --shadow-menu: 0 8px 24px rgba(0,0,0,.5);
65
64
  --shadow-dd: 0 12px 32px rgba(0,0,0,.55);
@@ -76,7 +75,6 @@ body.light {
76
75
  --panel: #ffffff;
77
76
  --sb-bg: #ffffff;
78
77
  --stab-bg: #f6f8fa;
79
- --stab-on-bg: #ffffff;
80
78
  --surface: #f6f8fa;
81
79
  --input-surface: #ffffff;
82
80
  --inp-bg: #ffffff;
@@ -142,8 +140,12 @@ html, body { height: 100%; }
142
140
  body {
143
141
  background: var(--bg); color: var(--fg);
144
142
  font-family: ui-monospace, "Cascadia Code", "JetBrains Mono", Consolas, monospace;
145
- font-size: 13px; display: flex; flex-direction: column; overflow: hidden;
143
+ font-size: 15px; display: flex; flex-direction: column; overflow: hidden;
146
144
  }
145
+ /* Chat font size (`ui.fontSize`): the base above is `comfortable` (default).
146
+ `compact` restores the old 13px, `large` steps up to 17px. */
147
+ body[data-font="compact"] { font-size: 13px; }
148
+ body[data-font="large"] { font-size: 17px; }
147
149
 
148
150
  /* ---- topbar: new chat, sessions dropdown, tabstrip, settings ---- */
149
151
  .bar-top {
@@ -157,6 +159,11 @@ body {
157
159
  }
158
160
  .icon-btn:hover { background: var(--hover-bg); color: var(--fg); }
159
161
  .icon-btn.primary { color: var(--accent); }
162
+ .icon-btn:disabled { opacity: .35; cursor: default; }
163
+ .icon-btn:disabled:hover { background: none; color: var(--muted); }
164
+ /* Mobile session sub-header (see #sessBar): hidden on desktop, flex ≤760px.
165
+ The + / list tools relocate into #sessTools (placeTopTools in tabs.js). */
166
+ .bar-sub { display: none; }
160
167
  #openSettings { margin-left: auto; margin-right: 6px; }
161
168
  #toggleSidebar { display: none; }
162
169
  .conn { color: var(--dim-a); font-size: 11.5px; white-space: nowrap; }
@@ -172,12 +179,12 @@ body {
172
179
  .tabstrip::-webkit-scrollbar-thumb:hover { background: var(--stab-thumb-hover); }
173
180
  .stab {
174
181
  display: flex; gap: 7px; align-items: center; white-space: nowrap;
175
- height: 24px; padding: 0 6px 0 10px; border-radius: 5px 5px 0 0; cursor: pointer;
182
+ height: 24px; padding: 0 6px 0 10px; border-radius: 7px; cursor: pointer;
176
183
  color: var(--stab-fg); font-size: 12.5px; background: var(--stab-bg);
177
- border: 1px solid transparent; border-bottom: none; max-width: 220px;
184
+ border: 1px solid transparent; max-width: 220px;
178
185
  }
179
186
  .stab:hover { color: var(--fg); }
180
- .stab.on { background: var(--stab-on-bg); color: var(--fg); border-color: var(--border); }
187
+ .stab.on { background: var(--accent-bg); color: var(--accent); border-color: transparent; }
181
188
  .stab .name { flex: 0 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
182
189
  .stab .stab-x {
183
190
  flex: 0 0 auto; width: 18px; height: 18px; padding: 0; justify-content: center;
@@ -392,6 +399,9 @@ body.light .imgcard .ph { background: var(--ph-light); }
392
399
  }
393
400
  .filecard .fc-open:hover { border-color: var(--accent); text-decoration: none; }
394
401
  .filecard .fc-open:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
402
+ .filecard button.fc-open { font: inherit; }
403
+ .filecard .fc-actions { display: flex; gap: 6px; align-items: center; margin-left: auto; flex: 0 0 auto; }
404
+ .filecard .fc-hint { color: var(--dim-a); font-size: 12px; }
395
405
  .linkline { margin-left: 26px; min-width: 0; overflow-wrap: anywhere; }
396
406
  .linkline a { color: var(--accent); text-decoration: none; overflow-wrap: anywhere; word-break: break-word; }
397
407
  .linkline a:hover { text-decoration: underline; }
@@ -444,16 +454,25 @@ body.light .imgcard .ph { background: var(--ph-light); }
444
454
 
445
455
  /* ---- composer: selectors, attachments, input, autocomplete ---- */
446
456
  .input-area { margin: 14px 22px 16px; position: relative; }
447
- .selectors { display: flex; gap: 8px; margin-bottom: 8px; flex-wrap: wrap; }
448
- .sel { position: relative; }
457
+ .selectors { display: flex; gap: 8px; margin-bottom: 8px; flex-wrap: wrap; min-width: 0; }
458
+ .sel { position: relative; min-width: 0; max-width: 100%; }
449
459
  .sel > button {
450
460
  font: inherit; font-size: 12.5px; cursor: pointer;
451
461
  background: var(--surface); color: var(--muted); border: none; border-radius: 4px;
452
462
  padding: 4px 10px; display: inline-flex; align-items: center; gap: 6px;
463
+ min-width: 0; max-width: 100%;
453
464
  }
454
465
  body.light .sel > button { border: 1px solid var(--border); }
455
- .sel > button b { font-weight: 400; color: var(--purple); }
466
+ .sel > button b { font-weight: 400; color: var(--purple); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
456
467
  .sel > button .svg-icon { width: 13px; height: 13px; color: var(--dim-a); }
468
+ /* Selector switch pending (boot + provider/model/context/reasoning writes):
469
+ buttons and menus go inert while the `⋯` mark shows. The mark is a static
470
+ glyph via `::after` — no animation, so `prefers-reduced-motion` needs no
471
+ special case and no label rewrites desync the DOM. */
472
+ .selectors[data-pending] .sel > button,
473
+ .selectors[data-pending] .menu { pointer-events: none; }
474
+ .sel > button.pending { cursor: wait; }
475
+ .sel > button.pending b::after { content: " ⋯"; color: var(--dim-b); }
457
476
  .menu {
458
477
  display: none; position: absolute; bottom: calc(100% + 4px); left: 0; z-index: 30;
459
478
  background: var(--panel); border: 1px solid var(--border-2); border-radius: 6px;
@@ -571,9 +590,79 @@ body.light .sel > button { border: 1px solid var(--border); }
571
590
  .input-area.dragover .composer { border-color: var(--accent); box-shadow: 0 0 0 2px var(--input-shadow); }
572
591
  @keyframes blink { 50% { opacity: 0; } }
573
592
 
593
+ /* ---- activity rail — indicator above the composer while a turn runs ----
594
+ Reproduces docs/design/ui/demo-activity-rail-chat.html (variant №12).
595
+ `l-line` (default) = compact one-liner, `l-meta` = inside the hint row,
596
+ `l-full` = full width; `off` hides the node entirely. */
597
+ .rail-wrap { display: flex; flex-direction: column; gap: 6px; margin-bottom: 10px; }
598
+ .rail-wrap[hidden] { display: none; }
599
+ .rail-wrap.l-line, .rail-wrap.l-meta {
600
+ flex-direction: row; align-items: center; gap: 6px 10px; margin-bottom: 8px;
601
+ flex-wrap: wrap;
602
+ }
603
+ .rail-wrap.l-line .rl-track { order: -1; flex: 1 1 120px; min-width: 80px; max-width: 180px; }
604
+ .rail-wrap.l-meta .rl-track { order: -1; flex: 1 1 90px; min-width: 64px; max-width: 110px; }
605
+ .rail-wrap.l-line .rail-l1, .rail-wrap.l-line .rail-l2 { flex: 1 1 auto; min-width: 0; }
606
+ .rail-wrap.l-line .rail-l1 .right { display: none; } /* Esc уже есть в .inp-meta */
607
+ .rail-wrap.l-line .rail-l2::before { content: '·'; color: var(--dim-a); margin-right: -2px; }
608
+ .rail-wrap.l-meta { margin-bottom: 0; }
609
+ .rail-wrap.l-meta .rail-l1 { font-size: 11.5px; }
610
+ .rail-wrap.l-meta .rail-l1 .st, .rail-wrap.l-meta .rail-l1 .s, .rail-wrap.l-meta .rail-l1 .right { display: none; }
611
+ .rail-wrap.l-meta .rail-l2 { display: none; } /* в строке подсказок только самое важное */
612
+ .rail-wrap.l-full .rl-track { flex: 1 1 auto; }
613
+ .rail-l1 {
614
+ display: flex; gap: 8px; align-items: baseline; flex-wrap: wrap;
615
+ font-size: 13px; color: var(--think);
616
+ }
617
+ .rail-l1 .s, .rail-l1 .right { color: var(--dim-a); }
618
+ .rail-l1 .right { margin-left: auto; font-size: 11.5px; }
619
+ .rail-l2 { display: flex; gap: 8px; align-items: baseline; font-size: 11.5px; color: var(--dim-a); flex-wrap: wrap; min-width: 0; }
620
+ .rail-l2 .last { color: var(--args); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 100%; }
621
+
622
+ .rl-track {
623
+ position: relative; height: 12px; border-radius: 6px;
624
+ background: var(--border); overflow: hidden;
625
+ }
626
+ .rl-fill {
627
+ position: absolute; left: 0; top: 0; bottom: 0; width: calc(var(--prog, 0) * 1%);
628
+ background: linear-gradient(90deg, var(--think), var(--accent));
629
+ transition: width .2s linear;
630
+ }
631
+ .rl-fill::after {
632
+ content: ''; position: absolute; inset: 0;
633
+ background: linear-gradient(90deg, transparent, rgba(255,255,255,.45), transparent);
634
+ transform: translateX(-100%); animation: rlSweep 1.5s linear infinite;
635
+ }
636
+ @keyframes rlSweep { to { transform: translateX(100%); } }
637
+ /* Засечки шагов плана — только в режиме plan */
638
+ .rl-track[data-mode="plan"]::after {
639
+ content: ''; position: absolute; inset: 0; pointer-events: none;
640
+ background: repeating-linear-gradient(90deg,
641
+ transparent 0, transparent calc(33.333% - 1.5px),
642
+ var(--bg) calc(33.333% - 1.5px), var(--bg) 33.333%);
643
+ }
644
+ /* indeterminate: бегущий сканер по всей длине */
645
+ .rl-track[data-mode="scan"] .rl-fill { display: none; }
646
+ .rl-scan {
647
+ display: none; position: absolute; top: 0; bottom: 0; width: 30%; left: -30%;
648
+ background: linear-gradient(90deg, transparent, var(--think) 40%, var(--accent) 72%, transparent);
649
+ }
650
+ .rl-track[data-mode="scan"] .rl-scan {
651
+ display: block; animation: rlScan 1.7s cubic-bezier(.4, .1, .6, .9) infinite;
652
+ }
653
+ @keyframes rlScan { to { left: 100%; } }
654
+ .rail-wrap.phase-tool .rl-track[data-mode="scan"] .rl-scan { animation-duration: 1s; }
655
+ .rail-wrap.phase-compose .rl-track[data-mode="scan"] .rl-scan { animation-duration: 1.3s; }
656
+ /* Вспышка на реальное событие (tool_start / tool_end / text / plan) */
657
+ .rl-track.flash {
658
+ box-shadow: 0 0 0 1px var(--accent), 0 0 14px rgba(196,168,236,.35);
659
+ animation: rlFlash .45s ease-out;
660
+ }
661
+ @keyframes rlFlash { 0% { filter: brightness(1.9); } 100% { filter: brightness(1); } }
662
+
574
663
  /* ---- sidebar — plan / usage / environment sections ---- */
575
664
  .sb {
576
- width: 280px; min-width: 280px; display: flex; flex-direction: column;
665
+ width: 340px; min-width: 340px; display: flex; flex-direction: column;
577
666
  border-left: 1px solid var(--border); background: var(--sb-bg); min-height: 0;
578
667
  }
579
668
  .sec {
@@ -879,12 +968,30 @@ body.light .toggle { background: var(--toggle-off); }
879
968
  background: var(--input-surface); border: 1px solid var(--border-2); border-radius: 4px;
880
969
  color: var(--fg); font: inherit; font-size: 12.5px; padding: 6px 8px; width: 100%; min-width: 0;
881
970
  }
971
+ /* base-URL field: the free-text input sits under the dropdown when "custom" */
972
+ .pform-base { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
882
973
  /* preset row sits above the field grid — keep it off the fields */
883
974
  .provider-body .pform > .pform-field { margin-bottom: 16px; }
884
975
  .pform-adv { margin-top: 18px; }
885
976
  .pform-adv summary { cursor: pointer; font-size: 11.5px; color: var(--dim-a); text-transform: uppercase; letter-spacing: .04em; }
886
977
  .pform-adv .pform-grid { margin-top: 12px; }
887
978
 
979
+ /* titled groups inside "advanced" (retry numbers / cache flags) */
980
+ .pform-checks { display: flex; flex-direction: column; gap: 10px; margin-top: 16px; }
981
+ .pform-checks-title {
982
+ font-size: 11.5px; color: var(--dim-a); text-transform: uppercase; letter-spacing: .04em;
983
+ }
984
+ /* the group gap already separates the title from its grid */
985
+ .pform-checks .pform-grid { margin-top: 0; }
986
+ .pform-checks-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 6px 16px; }
987
+ .pform-check {
988
+ display: inline-flex; align-items: center; gap: 7px; min-width: 0;
989
+ font-size: 12.5px; color: var(--muted); cursor: pointer;
990
+ }
991
+ .pform-check input[type="checkbox"] { width: auto; flex: 0 0 auto; margin: 0; accent-color: var(--accent); }
992
+ .pform-check span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
993
+ .pform-check:hover { color: var(--fg); }
994
+
888
995
  .sec-desc { color: var(--dim-a); font-size: 11.5px; line-height: 1.4; padding: 6px 0 0; max-width: 70ch; }
889
996
 
890
997
  /* structured editors (tags / checkboxes / table) own the full row width */
@@ -1078,6 +1185,25 @@ button.toggle:disabled { opacity: .5; cursor: default; }
1078
1185
  /* ---- responsive layout ---- */
1079
1186
  @media (max-width: 760px) {
1080
1187
  .bar-top { gap: 8px; padding: 8px 10px; }
1188
+ .bar-sub {
1189
+ display: flex; gap: 2px; align-items: center;
1190
+ padding: 5px 10px; background: var(--panel); border-bottom: 1px solid var(--border);
1191
+ color: var(--muted); font-size: 12.5px;
1192
+ }
1193
+ .bar-sub .icon-btn { height: 28px; min-width: 28px; }
1194
+ .sess-name {
1195
+ flex: 1 1 auto; min-width: 0; display: flex; cursor: pointer;
1196
+ background: none; border: none; font: inherit; color: var(--fg);
1197
+ padding: 5px 6px; border-radius: 4px; text-align: left;
1198
+ }
1199
+ .sess-name:hover { background: var(--hover-bg); }
1200
+ .sess-name:disabled { cursor: default; }
1201
+ .sess-name:disabled:hover { background: none; }
1202
+ .sess-name span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1203
+ /* + / list tools live here on phones; the dropdown opens below the bar. */
1204
+ .sess-tools { display: flex; gap: 2px; align-items: center; margin-left: auto; }
1205
+ .sess-tools .dd-menu { left: auto; right: 0; }
1206
+ #sessClose:hover { color: var(--red-strong); }
1081
1207
  .conn { display: none; }
1082
1208
  /* Sidebar toggle lives next to settings; settings keeps the right edge. */
1083
1209
  #toggleSidebar { display: inline-flex; }
@@ -1088,7 +1214,7 @@ button.toggle:disabled { opacity: .5; cursor: default; }
1088
1214
  .sb { display: none; }
1089
1215
  body.sb-open .sb {
1090
1216
  display: flex; position: fixed; top: 41px; right: 0; bottom: 0; z-index: 45;
1091
- width: min(320px, 85vw); min-width: 0; max-height: none;
1217
+ width: min(360px, 85vw); min-width: 0; max-height: none;
1092
1218
  border-left: 1px solid var(--border); border-top: none;
1093
1219
  box-shadow: var(--shadow-dd);
1094
1220
  }
@@ -1116,6 +1242,29 @@ button.toggle:disabled { opacity: .5; cursor: default; }
1116
1242
  .row { font-size: 12.5px; }
1117
1243
  .input-area { margin: 8px 10px 10px; }
1118
1244
  .msgs { padding: 12px 10px; }
1245
+ /* narrow phones: rail stacks vertically, track takes the full row */
1246
+ .rail-wrap.l-line, .rail-wrap.l-meta {
1247
+ flex-direction: column; align-items: stretch; gap: 6px;
1248
+ }
1249
+ .rail-wrap.l-line .rl-track, .rail-wrap.l-meta .rl-track {
1250
+ order: -1; flex: none; width: 100%; max-width: none;
1251
+ }
1252
+ .rail-wrap.l-line .rail-l1, .rail-wrap.l-line .rail-l2 { flex: none; }
1253
+ .rail-wrap.l-meta { width: 100%; flex-basis: 100%; }
1254
+ .selectors { gap: 6px; }
1255
+ .composer-main { gap: 4px; }
1256
+ /* phones have no Enter/Shift+Enter/Esc/Ctrl+V — hints only take up space.
1257
+ Spans only (not the whole row): the `meta` rail layout lives inside
1258
+ .inp-meta and must stay visible. */
1259
+ .inp-meta > span { display: none; }
1260
+ .inp-meta { gap: 0; margin-top: 0; padding: 0 2px; }
1261
+ .inp-meta:empty { display: none; }
1262
+ }
1263
+
1264
+ /* touch devices at any width: keyboard hints don't apply */
1265
+ @media (pointer: coarse) {
1266
+ .inp-meta > span { display: none; }
1267
+ .inp-meta { gap: 0; }
1119
1268
  }
1120
1269
 
1121
1270
  /* --- First-run setup gate ---------------------------------------------------
@@ -1,3 +1,4 @@
1
+ // Строка кеша в футере: хитрейт, экономия, стабильность префикса.
1
2
  import { t } from "../i18n/index";
2
3
  import { formatCost } from "../modules/pricing/prices";
3
4
  /**
@@ -1,4 +1,5 @@
1
- /** Levenshtein edit distance between two strings (case-insensitive). */
1
+ // Подсказки при опечатках в командах: расстояние Левенштейна.
2
+ /** Редакционное расстояние Левенштейна между строками (без учёта регистра). */
2
3
  export function levenshtein(a, b) {
3
4
  const s = a.toLowerCase();
4
5
  const t = b.toLowerCase();
@@ -20,9 +21,9 @@ export function levenshtein(a, b) {
20
21
  return prev[t.length];
21
22
  }
22
23
  /**
23
- * The known command whose name is within `maxDistance` of `input`, or
24
- * `undefined` when nothing is close enough. Used to catch subcommand typos
25
- * (`mma sesion list`) that would otherwise be silently sent to the LLM.
24
+ * Известная команда, чьё имя в пределах `maxDistance` от `input`, или
25
+ * `undefined`, если близких нет. Ловит опечатки в субкомандах
26
+ * (`mma sesion list`), которые иначе молча ушли бы в LLM.
26
27
  */
27
28
  export function closestCommand(input, known, maxDistance = 2) {
28
29
  let best;