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,13 +1,13 @@
1
+ /** Веб-поиск (DuckDuckGo HTML): тул и shared-функция для автопоиска ошибок. */
1
2
  import { t } from "../i18n/index";
2
3
  import { isUrlAllowed, sanitizeUrl } from "../modules/security/network-validator";
3
4
  import { logNetworkRequest, logSecurityBlock } from "../modules/security/audit-log";
4
5
  import { getSessionSecurityConfig } from "../modules/security/session-isolation";
5
6
  /**
6
- * Shared web search (DuckDuckGo HTML) used by BOTH the web_search tool and
7
- * the automatic error search (execution module). `networkConfig` is the
8
- * resolved security network config (may be undefined when security is off);
9
- * `requestTimeoutMs` overrides the timeout when the caller has its own
10
- * setting (the error search uses errorWebSearch.requestTimeoutMs).
7
+ * Общий веб-поиск (DuckDuckGo HTML) для тула web_search и автопоиска ошибок
8
+ * (execution-модуль). `networkConfig` — резолвленная сетевая security-конфигурация
9
+ * (undefined при выключенной безопасности); `requestTimeoutMs` переопределяет
10
+ * таймаут, когда у вызывающего свой (автопоиск — errorWebSearch.requestTimeoutMs).
11
11
  */
12
12
  export async function performWebSearch(query, numResults, networkConfig, requestTimeoutMs) {
13
13
  const url = `https://html.duckduckgo.com/html/?q=${encodeURIComponent(query)}`;
@@ -41,11 +41,13 @@ export async function performWebSearch(query, numResults, networkConfig, request
41
41
  return { success: false, results: [], error: err.message };
42
42
  }
43
43
  }
44
+ /** Форматирует выдачу нумерованным списком. */
44
45
  function formatResults(results) {
45
46
  return results
46
47
  .map((r, i) => `${i + 1}. ${r.title}\n URL: ${r.url}\n ${r.snippet}`)
47
48
  .join("\n");
48
49
  }
50
+ /** Ищет в вебе (заголовки + сниппеты); поисковики открывать не надо. */
49
51
  export const webSearchTool = {
50
52
  name: "web_search",
51
53
  icon: "🌍",
@@ -1,5 +1,6 @@
1
+ /** Тул записи файла: скоуп, security-скан, валидация синтаксиса, diff. */
1
2
  import { writeFileSync, mkdirSync, existsSync, readFileSync } from "fs";
2
- import { dirname } from "path";
3
+ import { resolve, dirname } from "path";
3
4
  import { t } from "../i18n/index";
4
5
  import { isPathWritable } from "../modules/security/path-validator";
5
6
  import { scanContent } from "../modules/security/content-scanner";
@@ -8,6 +9,9 @@ import { getSessionSecurityConfig } from "../modules/security/session-isolation"
8
9
  import { generateDiff, generateNewFileDiff } from "../ui/diff";
9
10
  import { safeResolvePath } from "./path-utils";
10
11
  import { preValidateSyntax, detectImportConflicts } from "./syntax-validator";
12
+ import { errMsg } from "../utils";
13
+ import { protectedPathBlock } from "../modules/security/protected-paths";
14
+ /** Создаёт/перезаписывает файл; parent-dirs, проверки, diff в ответе. */
11
15
  export const writeFileTool = {
12
16
  name: "write_file",
13
17
  icon: "📝",
@@ -24,7 +28,19 @@ export const writeFileTool = {
24
28
  handler: async (ctx, args) => {
25
29
  const path = String(args.path);
26
30
  const resolved = safeResolvePath(ctx.baseDir, path);
27
- // Check path permissions using the resolved path
31
+ if (ctx.writePathAllowlist) {
32
+ const ok = ctx.writePathAllowlist.some((p) => resolve(p).toLowerCase() === resolve(resolved).toLowerCase());
33
+ if (!ok) {
34
+ return {
35
+ success: false,
36
+ output: t("file.path_not_allowed", {
37
+ path: `${path} — ${t("onboarding.write_restricted")}`,
38
+ reason: t("onboarding.write_restricted"),
39
+ }),
40
+ };
41
+ }
42
+ }
43
+ // Проверка прав по резолвленному пути.
28
44
  const scopeCheck = isPathWritable(ctx.baseDir, resolved, ctx.scope, ctx.config.security?.paths);
29
45
  if (!scopeCheck.allowed) {
30
46
  logSecurityBlock(ctx.sessionId, "file_write", scopeCheck.reason || "Path not allowed", path);
@@ -35,11 +51,15 @@ export const writeFileTool = {
35
51
  }),
36
52
  };
37
53
  }
38
- // Get session-specific security config
54
+ // Always-on fallback (security выкл): защищённые пути — спросить юзера.
55
+ const protectedBlock = protectedPathBlock(ctx, resolved, path);
56
+ if (protectedBlock)
57
+ return protectedBlock;
58
+ // Сессионный security-конфиг.
39
59
  const securityConfig = ctx.sessionContext
40
60
  ? getSessionSecurityConfig(ctx.config, ctx.sessionContext)
41
61
  : ctx.config.security;
42
- // Check file operations limit
62
+ // Лимит файловых операций.
43
63
  const maxFileOps = securityConfig?.maxFileOperations ?? 100;
44
64
  const currentCount = ctx.fileOperationsCount ?? 0;
45
65
  if (currentCount >= maxFileOps) {
@@ -49,9 +69,9 @@ export const writeFileTool = {
49
69
  output: `[SECURITY BLOCKED] Maximum file operations (${maxFileOps}) exceeded`,
50
70
  };
51
71
  }
52
- // Check content for dangerous patterns — only when security is enabled.
53
- // contentScan has its own `enabled` flag, but it must NOT fire while the
54
- // global security switch is off (false positives on ordinary CLI code).
72
+ // Скан контента на опасные паттерны — только при включённой безопасности.
73
+ // У contentScan свой флаг `enabled`, но при выключенном глобальном свитче
74
+ // он молчит (ложные срабатывания на обычном CLI-коде).
55
75
  const content = String(args.content);
56
76
  if (securityConfig?.enabled && securityConfig?.contentScan?.enabled) {
57
77
  const scanResult = scanContent(content, path, securityConfig.contentScan);
@@ -67,7 +87,7 @@ export const writeFileTool = {
67
87
  if (!existsSync(dir)) {
68
88
  mkdirSync(dir, { recursive: true });
69
89
  }
70
- // Pre-validate syntax BEFORE writing — prevents "file written" + syntax error loop
90
+ // Превалидация синтаксиса ДО записи — иначе петля "файл записан" + syntax error.
71
91
  const validation = await preValidateSyntax(resolved, content, ctx.baseDir);
72
92
  if (!validation.valid) {
73
93
  return {
@@ -75,20 +95,30 @@ export const writeFileTool = {
75
95
  output: t("file.syntax_error", { path, error: validation.error || "Unknown syntax error" }),
76
96
  };
77
97
  }
78
- // Detect import/export conflicts — warning only (code may be valid)
98
+ // Конфликты import/export — только warning (код может быть валиден).
79
99
  const conflicts = detectImportConflicts(content);
80
100
  const fileExists = existsSync(resolved);
81
101
  let oldContent = "";
82
- if (fileExists) {
83
- oldContent = readFileSync(resolved, "utf-8");
102
+ try {
103
+ if (fileExists) {
104
+ oldContent = readFileSync(resolved, "utf-8");
105
+ }
106
+ writeFileSync(resolved, content, "utf-8");
107
+ }
108
+ catch (err) {
109
+ // Ошибка ФС (ENOSPC/EPERM/…) должна вернуть путь и причину, а не
110
+ // вылететь голым Node-исключением в цикл агента.
111
+ return {
112
+ success: false,
113
+ output: t("file.write_failed", { path, error: errMsg(err) }),
114
+ };
84
115
  }
85
- writeFileSync(resolved, content, "utf-8");
86
116
  const diff = fileExists ? generateDiff(oldContent, content) : generateNewFileDiff(content);
87
- // Increment file operations counter
117
+ // Счётчик файловых операций.
88
118
  ctx.fileOperationsCount = currentCount + 1;
89
- // Log successful file write
119
+ // Успешная запись в аудит-лог.
90
120
  logFileWrite(ctx.sessionId, path, true, `File ${fileExists ? "updated" : "created"}`);
91
- // Add conflict warning to output if any
121
+ // Предупреждение о конфликтах — в вывод.
92
122
  let output = t("file.written", { path });
93
123
  if (conflicts.length > 0) {
94
124
  output += `\n[WARNING] Import/export conflicts: ${conflicts.join(", ")}`;
@@ -0,0 +1,13 @@
1
+ let last = null;
2
+ /** Запоминает последнее действие. */
3
+ export function recordLastAction(action) {
4
+ last = action;
5
+ }
6
+ /** Отдаёт последнее действие (null — не было). */
7
+ export function getLastAction() {
8
+ return last;
9
+ }
10
+ /** Сбрасывает запомненное действие. */
11
+ export function clearLastAction() {
12
+ last = null;
13
+ }
package/dist/ui/box.js CHANGED
@@ -1,7 +1,8 @@
1
+ // Рамки только для мастера первого запуска (в чате запрещены, см. STYLE.md).
1
2
  import stringWidth from "string-width";
2
3
  import { pc } from "./colors";
3
4
  import { getTerminalWidth } from "./table";
4
- /** Wrap a string to `width` columns, keeping ANSI codes intact. */
5
+ /** Переносит строку по колонкам, сохраняя ANSI-коды. */
5
6
  export function wrapText(text, width) {
6
7
  if (width < 1)
7
8
  return text ? [text] : [];
@@ -45,7 +46,7 @@ function padTo(text, width) {
45
46
  const gap = Math.max(0, width - stringWidth(text));
46
47
  return text + " ".repeat(gap);
47
48
  }
48
- /** Render a box with an optional title embedded in the top border. */
49
+ /** Рендерит рамку с опц. заголовком в верхней границе. */
49
50
  export function box(lines, opts = {}) {
50
51
  const pad = opts.padding ?? 1;
51
52
  const width = Math.max(20, Math.min(opts.width ?? getTerminalWidth(), 120));
@@ -70,7 +71,7 @@ export function box(lines, opts = {}) {
70
71
  out.push(pc.dim(`└${"─".repeat(width - 2)}┘`));
71
72
  return out;
72
73
  }
73
- /** A horizontal rule that respects the terminal width (max 60 cols). */
74
+ /** Горизонтальная линейка по ширине терминала (макс. 60 кол.). */
74
75
  export function divider(width) {
75
76
  const w = Math.min(width ?? getTerminalWidth(), 60);
76
77
  return pc.dim("─".repeat(w));
package/dist/ui/colors.js CHANGED
@@ -1,4 +1,6 @@
1
+ // Цвета терминала (picocolors): вкл только в TTY и без CI/NO_COLOR.
1
2
  import { createColors } from "picocolors";
2
3
  const isTty = () => process.stdout.isTTY === true;
3
4
  const enabled = isTty() && !process.env.CI && !process.env.NO_COLOR;
5
+ /** Палитра picocolors (no-op вне TTY / при CI / NO_COLOR). */
4
6
  export const pc = createColors(enabled);
package/dist/ui/diff.js CHANGED
@@ -1,9 +1,9 @@
1
+ // Диффы правок файлов для чата: LCS с капами, цветные строки ±.
1
2
  import { pc } from "./colors";
2
3
  const CONTEXT_LINES = 3;
3
4
  const MAX_DIFF_LINES = 100;
4
- // LCS is O(m*n) in time and memory — cap the DP input so a huge edit_file
5
- // can't allocate hundreds of MB. Beyond the cap, diff degrades to a
6
- // "changed N lines" summary instead of a full LCS.
5
+ // LCS — O(m*n) по времени и памяти: режем вход DP, чтобы огромный edit_file не
6
+ // отъел сотни МБ. За капом дифф деградирует до сводки "изменено N строк".
7
7
  const MAX_LCS_INPUT_LINES = 2000;
8
8
  function computeLCS(oldLines, newLines) {
9
9
  const m = oldLines.length;
@@ -126,6 +126,7 @@ function formatLine(line, maxNumWidth) {
126
126
  return ` ${numStr} ${line.content}`;
127
127
  }
128
128
  }
129
+ /** Строка диффа старого/нового содержимого. */
129
130
  export function generateDiff(oldContent, newContent) {
130
131
  if (oldContent === newContent)
131
132
  return "";
@@ -133,8 +134,7 @@ export function generateDiff(oldContent, newContent) {
133
134
  const newLines = newContent.split("\n");
134
135
  if (oldLines.length > MAX_LCS_INPUT_LINES ||
135
136
  newLines.length > MAX_LCS_INPUT_LINES) {
136
- // Too large for the O(m*n) DP — show a bounded summary instead of
137
- // allocating an m*n matrix.
137
+ // Слишком велик для O(m*n) DP — ограниченная сводка вместо матрицы m*n.
138
138
  return pc.dim(` ... (file too large for line diff: ${oldLines.length} -> ${newLines.length} lines)`);
139
139
  }
140
140
  const diff = buildDiff(oldLines, newLines);
@@ -153,6 +153,7 @@ export function generateDiff(oldContent, newContent) {
153
153
  }
154
154
  return lines.join("\n");
155
155
  }
156
+ /** Дифф нового файла: все строки как добавленные. */
156
157
  export function generateNewFileDiff(content) {
157
158
  const lines = content.split("\n");
158
159
  const maxNumWidth = Math.max(String(lines.length).length, 3);
package/dist/ui/index.js CHANGED
@@ -1,3 +1,4 @@
1
+ // Фасад UI: форматтеры, вывод, таблицы, спиннер, рендерер.
1
2
  export { formatMarkdown, formatError, formatSuccess, formatWarning, FormattingStream, } from "./md-formatter";
2
3
  export { writeOutput, writeError, writeSuccess, writeWarning } from "./output";
3
4
  export { formatTable, splitRow, isSeparatorRow, getTerminalWidth } from "./table";