micro-models-agent 2.16.1 → 2.17.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (428) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/README.md +8 -3
  3. package/dist/assets/app.js +1 -314
  4. package/dist/assets/hljs.js +5 -1244
  5. package/dist/assets/index.html +11 -0
  6. package/dist/assets/js/api.js +1 -28
  7. package/dist/assets/js/core/menus.js +1 -0
  8. package/dist/assets/js/core/store/feed.js +1 -0
  9. package/dist/assets/js/core/store/index.js +1 -0
  10. package/dist/assets/js/core/store/session.js +1 -0
  11. package/dist/assets/js/core/store/settings.js +1 -0
  12. package/dist/assets/js/core/store/tabs.js +1 -0
  13. package/dist/assets/js/dialog.js +1 -105
  14. package/dist/assets/js/dom.js +1 -178
  15. package/dist/assets/js/feed/core.js +1 -0
  16. package/dist/assets/js/feed/history.js +1 -0
  17. package/dist/assets/js/feed/plan.js +1 -0
  18. package/dist/assets/js/feed/question.js +3 -0
  19. package/dist/assets/js/feed/sidebar.js +1 -0
  20. package/dist/assets/js/feed/stream.js +1 -0
  21. package/dist/assets/js/feed/turn.js +5 -0
  22. package/dist/assets/js/feed.js +1 -1250
  23. package/dist/assets/js/format.js +2 -122
  24. package/dist/assets/js/i18n.js +1 -46
  25. package/dist/assets/js/rail.js +1 -114
  26. package/dist/assets/js/session/cmdk.js +1 -0
  27. package/dist/assets/js/session/composer.js +1 -0
  28. package/dist/assets/js/session/sessions-menu.js +1 -0
  29. package/dist/assets/js/session/tabs.js +1 -0
  30. package/dist/assets/js/settings/controls.js +1 -0
  31. package/dist/assets/js/settings/editors.js +1 -0
  32. package/dist/assets/js/settings/form.js +1 -0
  33. package/dist/assets/js/settings/modal.js +1 -0
  34. package/dist/assets/js/settings/panels.js +1 -0
  35. package/dist/assets/js/settings/providers.js +1 -0
  36. package/dist/assets/js/settings/search.js +1 -0
  37. package/dist/assets/js/settings/subdialog.js +1 -0
  38. package/dist/assets/js/settings/write.js +1 -0
  39. package/dist/assets/js/settings.js +1 -1914
  40. package/dist/assets/js/sidebar/core.js +1 -0
  41. package/dist/assets/js/sidebar/lsp.js +2 -0
  42. package/dist/assets/js/sidebar/map.js +1 -0
  43. package/dist/assets/js/sidebar/state.js +1 -0
  44. package/dist/assets/js/sidebar/trace.js +5 -0
  45. package/dist/assets/js/sidebar.js +1 -705
  46. package/dist/assets/js/store.js +1 -82
  47. package/dist/assets/js/subdialog.js +1 -0
  48. package/dist/assets/md.js +1 -291
  49. package/dist/assets/setup.js +3 -816
  50. package/dist/assets/smd.js +29 -1665
  51. package/dist/assets/styles.css +1 -1598
  52. package/dist/certification/certifications.json +1 -494
  53. package/dist/i18n/en.json +1 -1851
  54. package/dist/i18n/ru.json +1 -1854
  55. package/dist/main.js +815 -55797
  56. package/dist/modules/browser/bridge-server.mjs +2 -252
  57. package/package.json +10 -5
  58. package/dist/assets/js/settings-controls.js +0 -452
  59. package/dist/assets/js/tabs.js +0 -867
  60. package/dist/cli/cache-line.js +0 -31
  61. package/dist/cli/command-suggest.js +0 -39
  62. package/dist/cli/commands.js +0 -781
  63. package/dist/cli/completer.js +0 -268
  64. package/dist/cli/index.js +0 -3
  65. package/dist/cli/json-payload.js +0 -32
  66. package/dist/cli/main.js +0 -346
  67. package/dist/cli/onboarding-commands.js +0 -126
  68. package/dist/cli/plugin-commands.js +0 -38
  69. package/dist/cli/relaunch.js +0 -40
  70. package/dist/cli/repl-commands-lsp.js +0 -75
  71. package/dist/cli/repl-commands-skills.js +0 -105
  72. package/dist/cli/repl-commands.js +0 -1218
  73. package/dist/cli/repl.js +0 -1238
  74. package/dist/cli/run-result.js +0 -38
  75. package/dist/cli/security-commands.js +0 -177
  76. package/dist/cli/setup-order.js +0 -6
  77. package/dist/cli/setup-prompt.js +0 -50
  78. package/dist/cli/setup.js +0 -161
  79. package/dist/cli/web-command.js +0 -98
  80. package/dist/config/budget.js +0 -48
  81. package/dist/config/config.js +0 -345
  82. package/dist/config/defaults.js +0 -197
  83. package/dist/config/domains.js +0 -135
  84. package/dist/config/env.js +0 -46
  85. package/dist/config/experts.js +0 -17
  86. package/dist/config/index.js +0 -5
  87. package/dist/config/paths.js +0 -56
  88. package/dist/config/redact.js +0 -44
  89. package/dist/config/registry-extra.js +0 -334
  90. package/dist/config/registry.js +0 -584
  91. package/dist/config/security.js +0 -212
  92. package/dist/config/timeouts.js +0 -74
  93. package/dist/config/types.js +0 -1
  94. package/dist/config/utils.js +0 -57
  95. package/dist/core/agent/artifact-progress.js +0 -59
  96. package/dist/core/agent/artifact-resolve.js +0 -79
  97. package/dist/core/agent/audit-gate.js +0 -53
  98. package/dist/core/agent/compaction.js +0 -89
  99. package/dist/core/agent/constants.js +0 -90
  100. package/dist/core/agent/context-log.js +0 -454
  101. package/dist/core/agent/context-renderer.js +0 -45
  102. package/dist/core/agent/critic-gate.js +0 -132
  103. package/dist/core/agent/hallucination-gate.js +0 -197
  104. package/dist/core/agent/loop-state.js +0 -68
  105. package/dist/core/agent/prefix-monitor.js +0 -101
  106. package/dist/core/agent/reasoning-resolver.js +0 -65
  107. package/dist/core/agent/token-tracker.js +0 -99
  108. package/dist/core/agent/tool-batch.js +0 -312
  109. package/dist/core/agent/tool-images.js +0 -18
  110. package/dist/core/agent/tool-output.js +0 -116
  111. package/dist/core/agent/tool-pairing.js +0 -60
  112. package/dist/core/agent-moe.js +0 -248
  113. package/dist/core/agent.js +0 -1299
  114. package/dist/core/bootstrap/agent-phase.js +0 -66
  115. package/dist/core/bootstrap/config-phase.js +0 -86
  116. package/dist/core/bootstrap/modules-phase.js +0 -269
  117. package/dist/core/bootstrap/provider-phase.js +0 -183
  118. package/dist/core/bootstrap/session-phase.js +0 -204
  119. package/dist/core/bootstrap/state.js +0 -94
  120. package/dist/core/bootstrap/workspace-phase.js +0 -115
  121. package/dist/core/bootstrap.js +0 -112
  122. package/dist/core/crash-handler.js +0 -62
  123. package/dist/core/environment.js +0 -224
  124. package/dist/core/host-plan.js +0 -43
  125. package/dist/core/host.js +0 -23
  126. package/dist/core/index.js +0 -3
  127. package/dist/core/prompt-builder.js +0 -95
  128. package/dist/core/prompt-overflow.js +0 -306
  129. package/dist/core/session-logger.js +0 -375
  130. package/dist/core/system-prompt.js +0 -117
  131. package/dist/core/types.js +0 -1
  132. package/dist/core/version.js +0 -28
  133. package/dist/core/web-host.js +0 -34
  134. package/dist/core/workspace.js +0 -80
  135. package/dist/i18n/index.js +0 -80
  136. package/dist/index.js +0 -30
  137. package/dist/llm/cache-usage.js +0 -76
  138. package/dist/llm/image-utils.js +0 -138
  139. package/dist/llm/index.js +0 -4
  140. package/dist/llm/llm-errors.js +0 -50
  141. package/dist/llm/model-loader.js +0 -86
  142. package/dist/llm/models-dev.js +0 -121
  143. package/dist/llm/openai-compat.js +0 -756
  144. package/dist/llm/orchestrator.js +0 -294
  145. package/dist/llm/provider-budget.js +0 -68
  146. package/dist/llm/provider-context.js +0 -233
  147. package/dist/llm/provider.js +0 -9
  148. package/dist/llm/response.js +0 -44
  149. package/dist/llm/stream-state.js +0 -26
  150. package/dist/llm/token-counter.js +0 -83
  151. package/dist/llm/types.js +0 -1
  152. package/dist/logger/app-logger.js +0 -212
  153. package/dist/logger/file-log.js +0 -160
  154. package/dist/logger/index.js +0 -2
  155. package/dist/migration/backup.js +0 -56
  156. package/dist/migration/detect.js +0 -61
  157. package/dist/migration/index.js +0 -3
  158. package/dist/modules/artifacts/store.js +0 -62
  159. package/dist/modules/browser/actions.js +0 -79
  160. package/dist/modules/browser/bridge-client.js +0 -203
  161. package/dist/modules/browser/bridge-path.js +0 -10
  162. package/dist/modules/browser/console-buffer.js +0 -37
  163. package/dist/modules/browser/cookie-store.js +0 -29
  164. package/dist/modules/browser/driver-types.js +0 -1
  165. package/dist/modules/browser/driver.js +0 -186
  166. package/dist/modules/browser/index.js +0 -9
  167. package/dist/modules/browser/module.js +0 -30
  168. package/dist/modules/browser/session.js +0 -322
  169. package/dist/modules/browser/snapshot.js +0 -154
  170. package/dist/modules/browser/types.js +0 -13
  171. package/dist/modules/certification/cli.js +0 -264
  172. package/dist/modules/certification/fact-checker.js +0 -90
  173. package/dist/modules/certification/loader.js +0 -127
  174. package/dist/modules/certification/manifest.js +0 -231
  175. package/dist/modules/certification/runner.js +0 -233
  176. package/dist/modules/certification/scenarios.js +0 -586
  177. package/dist/modules/certification/syntax-scenarios.js +0 -50
  178. package/dist/modules/certification/types.js +0 -1
  179. package/dist/modules/context/chunk-query.js +0 -122
  180. package/dist/modules/context/fact-extractor.js +0 -170
  181. package/dist/modules/context/history.js +0 -15
  182. package/dist/modules/context/index.js +0 -2
  183. package/dist/modules/context/manager.js +0 -482
  184. package/dist/modules/critic/client.js +0 -176
  185. package/dist/modules/critic/evidence.js +0 -81
  186. package/dist/modules/critic/provider.js +0 -45
  187. package/dist/modules/critic/tools.js +0 -78
  188. package/dist/modules/critic/types.js +0 -1
  189. package/dist/modules/execution/audit-runners.js +0 -206
  190. package/dist/modules/execution/auditor.js +0 -222
  191. package/dist/modules/execution/execution-plugin.js +0 -478
  192. package/dist/modules/execution/index.js +0 -8
  193. package/dist/modules/execution/input-from.js +0 -70
  194. package/dist/modules/execution/module.js +0 -891
  195. package/dist/modules/execution/moe-executor.js +0 -443
  196. package/dist/modules/execution/plan-actions.js +0 -642
  197. package/dist/modules/execution/plan-checks.js +0 -35
  198. package/dist/modules/execution/plan-coverage.js +0 -71
  199. package/dist/modules/execution/plan-persister.js +0 -46
  200. package/dist/modules/execution/plan-steps.js +0 -31
  201. package/dist/modules/execution/plan-store.js +0 -274
  202. package/dist/modules/execution/plan-tool.js +0 -249
  203. package/dist/modules/execution/plan-validator.js +0 -197
  204. package/dist/modules/execution/planner.js +0 -103
  205. package/dist/modules/execution/stuck-detector.js +0 -834
  206. package/dist/modules/execution/tracker.js +0 -92
  207. package/dist/modules/execution/transient-error.js +0 -30
  208. package/dist/modules/execution/types.js +0 -1
  209. package/dist/modules/execution/verifier.js +0 -343
  210. package/dist/modules/execution/windows-commands.js +0 -52
  211. package/dist/modules/hallucination/artifact-claim.js +0 -93
  212. package/dist/modules/hallucination/confidence.js +0 -81
  213. package/dist/modules/hallucination/consistency.js +0 -37
  214. package/dist/modules/hallucination/detector.js +0 -57
  215. package/dist/modules/hallucination/factual.js +0 -205
  216. package/dist/modules/hallucination/index.js +0 -6
  217. package/dist/modules/hallucination/js-identifiers.js +0 -261
  218. package/dist/modules/hallucination/llm-judge.js +0 -116
  219. package/dist/modules/hallucination/success-claim.js +0 -59
  220. package/dist/modules/index.js +0 -5
  221. package/dist/modules/indexer/cache.js +0 -88
  222. package/dist/modules/indexer/index.js +0 -4
  223. package/dist/modules/indexer/map-command.js +0 -33
  224. package/dist/modules/indexer/map-select.js +0 -87
  225. package/dist/modules/indexer/module.js +0 -293
  226. package/dist/modules/indexer/project-profile.js +0 -184
  227. package/dist/modules/indexer/symbols.js +0 -189
  228. package/dist/modules/indexer/walker.js +0 -285
  229. package/dist/modules/lsp/check-tool.js +0 -61
  230. package/dist/modules/lsp/client.js +0 -406
  231. package/dist/modules/lsp/command.js +0 -53
  232. package/dist/modules/lsp/config.js +0 -189
  233. package/dist/modules/lsp/index.js +0 -4
  234. package/dist/modules/lsp/module.js +0 -295
  235. package/dist/modules/lsp/probe.js +0 -86
  236. package/dist/modules/lsp/project-root.js +0 -69
  237. package/dist/modules/lsp/startup-check.js +0 -154
  238. package/dist/modules/lsp/types.js +0 -1
  239. package/dist/modules/mcp/client.js +0 -445
  240. package/dist/modules/mcp/index.js +0 -4
  241. package/dist/modules/mcp/module.js +0 -295
  242. package/dist/modules/mcp/registry.js +0 -20
  243. package/dist/modules/memory/index.js +0 -2
  244. package/dist/modules/memory/module.js +0 -101
  245. package/dist/modules/memory/search.js +0 -45
  246. package/dist/modules/memory/store.js +0 -107
  247. package/dist/modules/onboarding/init.js +0 -47
  248. package/dist/modules/onboarding/meet.js +0 -30
  249. package/dist/modules/onboarding/mode.js +0 -30
  250. package/dist/modules/onboarding/prompts.js +0 -43
  251. package/dist/modules/pipelines/engine.js +0 -70
  252. package/dist/modules/pipelines/index.js +0 -4
  253. package/dist/modules/pipelines/parser.js +0 -59
  254. package/dist/modules/pipelines/template.js +0 -18
  255. package/dist/modules/plugins/builtin/lint-on-write.js +0 -377
  256. package/dist/modules/plugins/builtin/notify.js +0 -11
  257. package/dist/modules/plugins/index.js +0 -2
  258. package/dist/modules/plugins/loader.js +0 -85
  259. package/dist/modules/plugins/manager.js +0 -244
  260. package/dist/modules/plugins/types.js +0 -1
  261. package/dist/modules/pricing/index.js +0 -70
  262. package/dist/modules/pricing/prices.js +0 -147
  263. package/dist/modules/processes/detect.js +0 -34
  264. package/dist/modules/processes/index.js +0 -4
  265. package/dist/modules/processes/kill-tree.js +0 -52
  266. package/dist/modules/processes/registry.js +0 -294
  267. package/dist/modules/processes/runner.js +0 -23
  268. package/dist/modules/providers/cache.js +0 -23
  269. package/dist/modules/providers/capabilities.js +0 -28
  270. package/dist/modules/providers/create.js +0 -21
  271. package/dist/modules/providers/factory.js +0 -28
  272. package/dist/modules/providers/fallback.js +0 -81
  273. package/dist/modules/providers/health.js +0 -47
  274. package/dist/modules/providers/index.js +0 -6
  275. package/dist/modules/providers/manager.js +0 -207
  276. package/dist/modules/providers/naming.js +0 -15
  277. package/dist/modules/providers/preflight.js +0 -71
  278. package/dist/modules/providers/presets.js +0 -232
  279. package/dist/modules/providers/registry.js +0 -27
  280. package/dist/modules/providers/types.js +0 -1
  281. package/dist/modules/reasoning/policy.js +0 -42
  282. package/dist/modules/reasoning/probe.js +0 -116
  283. package/dist/modules/registry.js +0 -48
  284. package/dist/modules/security/audit-log.js +0 -119
  285. package/dist/modules/security/audit-notifier.js +0 -267
  286. package/dist/modules/security/command-validator.js +0 -272
  287. package/dist/modules/security/content-scanner.js +0 -53
  288. package/dist/modules/security/data-sanitizer.js +0 -82
  289. package/dist/modules/security/encryption.js +0 -216
  290. package/dist/modules/security/index.js +0 -15
  291. package/dist/modules/security/network-validator.js +0 -236
  292. package/dist/modules/security/path-validator.js +0 -261
  293. package/dist/modules/security/protected-paths.js +0 -73
  294. package/dist/modules/security/rate-limiter.js +0 -98
  295. package/dist/modules/security/security-policies.js +0 -499
  296. package/dist/modules/security/session-encryption.js +0 -182
  297. package/dist/modules/security/session-isolation.js +0 -75
  298. package/dist/modules/session/auto-name.js +0 -63
  299. package/dist/modules/session/export.js +0 -98
  300. package/dist/modules/session/index.js +0 -4
  301. package/dist/modules/session/manager.js +0 -234
  302. package/dist/modules/session/module.js +0 -33
  303. package/dist/modules/session/store.js +0 -295
  304. package/dist/modules/session/types.js +0 -1
  305. package/dist/modules/setup/answers.js +0 -35
  306. package/dist/modules/setup/apply.js +0 -79
  307. package/dist/modules/setup/discovery.js +0 -72
  308. package/dist/modules/skills/index.js +0 -3
  309. package/dist/modules/skills/loader.js +0 -86
  310. package/dist/modules/skills/matcher.js +0 -27
  311. package/dist/modules/skills/module.js +0 -141
  312. package/dist/modules/types.js +0 -1
  313. package/dist/modules/updater/changelog-reader.js +0 -93
  314. package/dist/modules/updater/checker.js +0 -101
  315. package/dist/modules/updater/dev-detect.js +0 -18
  316. package/dist/modules/updater/index.js +0 -4
  317. package/dist/modules/updater/module.js +0 -129
  318. package/dist/modules/user-profile/compressor.js +0 -18
  319. package/dist/modules/user-profile/index.js +0 -2
  320. package/dist/modules/user-profile/profile.js +0 -77
  321. package/dist/modules/webui/answer-api.js +0 -29
  322. package/dist/modules/webui/assets.js +0 -50
  323. package/dist/modules/webui/body.js +0 -21
  324. package/dist/modules/webui/commands-settings.js +0 -209
  325. package/dist/modules/webui/commands-shared.js +0 -60
  326. package/dist/modules/webui/commands.js +0 -174
  327. package/dist/modules/webui/config-api.js +0 -134
  328. package/dist/modules/webui/file-api.js +0 -202
  329. package/dist/modules/webui/forward.js +0 -159
  330. package/dist/modules/webui/history-api.js +0 -112
  331. package/dist/modules/webui/host-state.js +0 -60
  332. package/dist/modules/webui/i18n-api.js +0 -9
  333. package/dist/modules/webui/limits.js +0 -6
  334. package/dist/modules/webui/log-forward.js +0 -20
  335. package/dist/modules/webui/memory-commands.js +0 -64
  336. package/dist/modules/webui/model-cache.js +0 -18
  337. package/dist/modules/webui/module.js +0 -148
  338. package/dist/modules/webui/persist.js +0 -24
  339. package/dist/modules/webui/prompt-io.js +0 -97
  340. package/dist/modules/webui/providers-api.js +0 -337
  341. package/dist/modules/webui/providers-view.js +0 -56
  342. package/dist/modules/webui/reasoning-view.js +0 -15
  343. package/dist/modules/webui/run-agent.js +0 -81
  344. package/dist/modules/webui/server.js +0 -284
  345. package/dist/modules/webui/sessions-api.js +0 -178
  346. package/dist/modules/webui/settings-api.js +0 -561
  347. package/dist/modules/webui/setup-api.js +0 -201
  348. package/dist/modules/webui/state.js +0 -74
  349. package/dist/modules/webui/util.js +0 -261
  350. package/dist/output/bus.js +0 -37
  351. package/dist/output/channel.js +0 -285
  352. package/dist/output/format.js +0 -15
  353. package/dist/output/index.js +0 -8
  354. package/dist/output/json-sink.js +0 -24
  355. package/dist/output/machine.js +0 -9
  356. package/dist/output/session-sink.js +0 -27
  357. package/dist/output/types.js +0 -1
  358. package/dist/tools/approve.js +0 -41
  359. package/dist/tools/attach-image.js +0 -102
  360. package/dist/tools/auto-fixer.js +0 -180
  361. package/dist/tools/auto-tags.js +0 -83
  362. package/dist/tools/bash.js +0 -649
  363. package/dist/tools/browser.js +0 -160
  364. package/dist/tools/chunk-query.js +0 -112
  365. package/dist/tools/create-dir.js +0 -60
  366. package/dist/tools/delete-file.js +0 -67
  367. package/dist/tools/download-file.js +0 -142
  368. package/dist/tools/edit-file.js +0 -136
  369. package/dist/tools/enable-tools.js +0 -59
  370. package/dist/tools/executor.js +0 -304
  371. package/dist/tools/file-info.js +0 -49
  372. package/dist/tools/filter-tools.js +0 -17
  373. package/dist/tools/glob-tool.js +0 -37
  374. package/dist/tools/grep-tool.js +0 -142
  375. package/dist/tools/hidden-tools-block.js +0 -37
  376. package/dist/tools/index.js +0 -88
  377. package/dist/tools/list-dir.js +0 -53
  378. package/dist/tools/load-skill.js +0 -51
  379. package/dist/tools/mcp-call.js +0 -80
  380. package/dist/tools/meet-done.js +0 -14
  381. package/dist/tools/move-file.js +0 -94
  382. package/dist/tools/path-utils.js +0 -108
  383. package/dist/tools/pipeline-run.js +0 -167
  384. package/dist/tools/preview.js +0 -2
  385. package/dist/tools/process-ids.js +0 -31
  386. package/dist/tools/process-kill.js +0 -33
  387. package/dist/tools/process-list.js +0 -38
  388. package/dist/tools/process-log.js +0 -49
  389. package/dist/tools/process-wait.js +0 -63
  390. package/dist/tools/prompt-io.js +0 -29
  391. package/dist/tools/question.js +0 -288
  392. package/dist/tools/read-file.js +0 -200
  393. package/dist/tools/recall.js +0 -124
  394. package/dist/tools/registry.js +0 -48
  395. package/dist/tools/remember.js +0 -72
  396. package/dist/tools/scope-check.js +0 -32
  397. package/dist/tools/scope-request.js +0 -96
  398. package/dist/tools/search-history.js +0 -88
  399. package/dist/tools/session-info.js +0 -46
  400. package/dist/tools/set-thinking.js +0 -75
  401. package/dist/tools/subagent.js +0 -257
  402. package/dist/tools/syntax-validator.js +0 -379
  403. package/dist/tools/types.js +0 -1
  404. package/dist/tools/user-input.js +0 -134
  405. package/dist/tools/web-browse.js +0 -93
  406. package/dist/tools/web-fetch.js +0 -108
  407. package/dist/tools/web-search.js +0 -107
  408. package/dist/tools/write-file.js +0 -128
  409. package/dist/ui/action-log.js +0 -13
  410. package/dist/ui/box.js +0 -78
  411. package/dist/ui/colors.js +0 -6
  412. package/dist/ui/diff.js +0 -189
  413. package/dist/ui/index.js +0 -7
  414. package/dist/ui/line-editor.js +0 -1083
  415. package/dist/ui/line-math.js +0 -98
  416. package/dist/ui/md-formatter.js +0 -322
  417. package/dist/ui/output.js +0 -19
  418. package/dist/ui/plan-view.js +0 -109
  419. package/dist/ui/renderer.js +0 -589
  420. package/dist/ui/spinner.js +0 -91
  421. package/dist/ui/table.js +0 -142
  422. package/dist/ui/theme.js +0 -143
  423. package/dist/utils/child-run.js +0 -20
  424. package/dist/utils/error.js +0 -4
  425. package/dist/utils/index.js +0 -6
  426. package/dist/utils/retry.js +0 -17
  427. package/dist/utils/sleep.js +0 -23
  428. package/dist/utils/truncate.js +0 -9
@@ -1,136 +0,0 @@
1
- /** Тул точечной правки: exact-match замена, скан, валидация, diff. */
2
- import { readFileSync, writeFileSync } from "fs";
3
- import { resolve } from "path";
4
- import { t } from "../i18n/index";
5
- import { isPathWritable } from "../modules/security/path-validator";
6
- import { scanContent } from "../modules/security/content-scanner";
7
- import { logFileWrite, logSecurityBlock } from "../modules/security/audit-log";
8
- import { getSessionSecurityConfig } from "../modules/security/session-isolation";
9
- import { generateDiff } from "../ui/diff";
10
- import { safeResolvePath } from "./path-utils";
11
- import { preValidateSyntax, detectImportConflicts } from "./syntax-validator";
12
- import { errMsg } from "../utils";
13
- import { protectedPathBlock } from "../modules/security/protected-paths";
14
- /** Заменяет точный фрагмент в существующем файле (не regex). */
15
- export const editFileTool = {
16
- name: "edit_file",
17
- icon: "✏️",
18
- description: "Find and replace text in an existing file. Uses exact string match (not regex).",
19
- tags: ["file", "code"],
20
- parameters: {
21
- type: "object",
22
- properties: {
23
- path: { type: "string", description: "File path" },
24
- old: { type: "string", description: "Text to replace" },
25
- new: { type: "string", description: "Replacement text" },
26
- },
27
- required: ["path", "old", "new"],
28
- },
29
- handler: async (ctx, args) => {
30
- const path = String(args.path);
31
- const resolved = safeResolvePath(ctx.baseDir, path);
32
- if (ctx.writePathAllowlist) {
33
- const ok = ctx.writePathAllowlist.some((p) => resolve(p).toLowerCase() === resolve(resolved).toLowerCase());
34
- if (!ok) {
35
- return {
36
- success: false,
37
- output: t("file.path_not_allowed", {
38
- path: `${path} — ${t("onboarding.write_restricted")}`,
39
- reason: t("onboarding.write_restricted"),
40
- }),
41
- };
42
- }
43
- }
44
- // Сессионный security-конфиг.
45
- const securityConfig = ctx.sessionContext
46
- ? getSessionSecurityConfig(ctx.config, ctx.sessionContext)
47
- : ctx.config.security;
48
- // Лимит файловых операций.
49
- const maxFileOps = securityConfig?.maxFileOperations ?? 100;
50
- const currentCount = ctx.fileOperationsCount ?? 0;
51
- if (currentCount >= maxFileOps) {
52
- logSecurityBlock(ctx.sessionId, "file_write", `Maximum file operations (${maxFileOps}) exceeded`, path);
53
- return {
54
- success: false,
55
- output: `[SECURITY BLOCKED] Maximum file operations (${maxFileOps}) exceeded`,
56
- };
57
- }
58
- // Проверка прав на путь.
59
- const scopeCheck = isPathWritable(ctx.baseDir, resolved, ctx.scope, ctx.config.security?.paths);
60
- if (!scopeCheck.allowed) {
61
- logSecurityBlock(ctx.sessionId, "file_write", scopeCheck.reason || "Path not allowed", path);
62
- return {
63
- success: false,
64
- output: t("file.path_not_allowed", {
65
- path: `${path} — ${scopeCheck.reason}`,
66
- }),
67
- };
68
- }
69
- // Защищённые пути (.git/, .env, ключи) — всегда спросить юзера.
70
- const protectedBlock = protectedPathBlock(ctx, resolved, path);
71
- if (protectedBlock)
72
- return protectedBlock;
73
- // Строковые аргументы обязательны: String(null) дало бы "null" и молча
74
- // испортило файл. Явно отклоняем не-строки с понятной ошибкой.
75
- if (typeof args.old !== "string" || typeof args.new !== "string") {
76
- return {
77
- success: false,
78
- output: t("file.edit_args_invalid", {
79
- oldType: typeof args.old,
80
- newType: typeof args.new,
81
- }),
82
- };
83
- }
84
- const oldStr = args.old;
85
- const newStr = args.new;
86
- let content;
87
- try {
88
- content = readFileSync(resolved, "utf-8");
89
- }
90
- catch (err) {
91
- return {
92
- success: false,
93
- output: t("file.read_failed", { path, error: errMsg(err) }),
94
- };
95
- }
96
- if (!content.includes(oldStr)) {
97
- return {
98
- success: false,
99
- output: t("file.string_not_found", { str: oldStr, path }),
100
- };
101
- }
102
- // Замена через функцию — иначе newStr трактуется как шаблон и `$&`, `$1`
103
- // молча испортят содержимое файла.
104
- const updated = content.replace(oldStr, () => newStr);
105
- // Скан нового контента — только при включённой безопасности.
106
- if (securityConfig?.enabled && securityConfig?.contentScan?.enabled) {
107
- const scanResult = scanContent(updated, path, securityConfig.contentScan);
108
- if (!scanResult.allowed) {
109
- logSecurityBlock(ctx.sessionId, "file_write", scanResult.reason || "Content contains dangerous patterns", path);
110
- return {
111
- success: false,
112
- output: `[SECURITY BLOCKED] ${scanResult.reason}`,
113
- };
114
- }
115
- }
116
- // Превалидация синтаксиса ДО записи — иначе петля "файл записан" + syntax error.
117
- const validation = await preValidateSyntax(resolved, updated, ctx.baseDir);
118
- if (!validation.valid) {
119
- return {
120
- success: false,
121
- output: t("file.syntax_error", { path, error: validation.error || "Unknown syntax error" }),
122
- };
123
- }
124
- // Конфликты import/export — только warning.
125
- const conflicts = detectImportConflicts(updated);
126
- writeFileSync(resolved, updated, "utf-8");
127
- const diff = generateDiff(content, updated);
128
- ctx.fileOperationsCount = currentCount + 1;
129
- logFileWrite(ctx.sessionId, path, true, "File edited");
130
- let output = t("file.replaced_in", { path });
131
- if (conflicts.length > 0) {
132
- output += `\n[WARNING] Import/export conflicts: ${conflicts.join(", ")}`;
133
- }
134
- return { success: true, output, diff };
135
- },
136
- };
@@ -1,59 +0,0 @@
1
- /** On-demand тул: включает скрытые категории тулов на сессию. */
2
- import { t } from "../i18n/index";
3
- /**
4
- * On-demand активация тулов. Главный цикл показывает только
5
- * `config.tools.defaultTags` (+ структурные `alwaysOn`); спецтулы (web,
6
- * browser, memory, process) скрыты из схемы ради экономии токенов. Модель
7
- * включает их этим тулом; хендлер дописывает теги в общий мутабельный
8
- * `ctx.activeToolTags`, который цикл перечитывает каждую итерацию.
9
- */
10
- export const enableToolsTool = {
11
- name: "enable_tools",
12
- icon: "🔌",
13
- description: "Enable hidden tool categories for the current session. Only the essential tools (file/code/shell) are active by default. Call this with the tags you need and they become available from the next turn. Available tags: file, code, shell, research, browser, vision, image, memory, core. Returns the newly available tools. To run a task in a separate context instead, use subagent with tool_tags.",
14
- alwaysOn: true,
15
- parameters: {
16
- type: "object",
17
- properties: {
18
- tags: {
19
- type: "array",
20
- items: { type: "string" },
21
- description: 'Tool tags to enable (e.g. ["research"] for web_search/web_fetch, ["browser"] for the browser, ["memory"] for remember/recall, ["shell"] for process management).',
22
- },
23
- },
24
- required: ["tags"],
25
- },
26
- handler: async (ctx, args) => {
27
- const requested = Array.isArray(args.tags) ? args.tags.map(String).filter(Boolean) : [];
28
- if (requested.length === 0) {
29
- return { success: false, output: t("tools.enable_no_tags") };
30
- }
31
- const active = ctx.activeToolTags ?? [];
32
- const added = [];
33
- for (const tag of requested) {
34
- if (!active.includes(tag)) {
35
- active.push(tag);
36
- added.push(tag);
37
- }
38
- }
39
- if (!ctx.toolExecutor) {
40
- return { success: false, output: t("tools.enable_no_executor") };
41
- }
42
- const nowVisible = ctx.toolExecutor.getToolDefinitions([...active]).map((t) => t.name);
43
- if (added.length === 0) {
44
- return {
45
- success: true,
46
- output: t("tools.enable_already_active", {
47
- tags: requested.join(", "),
48
- }),
49
- };
50
- }
51
- return {
52
- success: true,
53
- output: t("tools.enable_added", {
54
- tags: added.join(", "),
55
- tools: nowVisible.join(", "),
56
- }),
57
- };
58
- },
59
- };
@@ -1,304 +0,0 @@
1
- import { killByCallId } from "../modules/processes/runner";
2
- import { t } from "../i18n/index";
3
- import { TOOL_EXECUTION_TIMEOUT_MS, TOOL_MEMO_TTL_MS as MEMO_TTL_MS, } from "../config/timeouts";
4
- const MEMO_MAX_ENTRIES = 100;
5
- /** Стабильная сериализация: сортировка ключей, порядок аргументов на ключ не влияет. */
6
- function stableArgsKey(value) {
7
- if (Array.isArray(value))
8
- return value.map(stableArgsKey);
9
- if (value && typeof value === "object") {
10
- const entries = Object.keys(value)
11
- .sort()
12
- .map((k) => [k, stableArgsKey(value[k])]);
13
- return Object.fromEntries(entries);
14
- }
15
- return value;
16
- }
17
- /** Исполнитель: реестр, контекст, плагины, сессионное мемо. */
18
- export class ToolExecutor {
19
- registry;
20
- ctx;
21
- pluginManager;
22
- /**
23
- * Сессионное мемо детерминированных read-only результатов
24
- * (`ToolDefinition.cacheable` + ручные записи `manualMemo`-тулов вроде bash).
25
- * Ключ: `sessionId::name::stableArgs`.
26
- */
27
- memo = new Map();
28
- constructor(registry, ctx, pluginManager) {
29
- this.registry = registry;
30
- this.ctx = ctx;
31
- this.pluginManager = pluginManager;
32
- }
33
- /**
34
- * Запуск тула по имени с plain-аргументами (без call id и таймаут-обвязки).
35
- * Для внутреннего использования — напр. bash перенаправляет ошибочный
36
- * tool-call-как-команду в настоящий тул. Идёт через те же реестр и хуки.
37
- *
38
- * Внимание по реентрантности: временно подменяет `this.ctx`. Безопасно для
39
- * последовательных вызовов, но НЕ для конкурентных на одном инстансе —
40
- * будет гонка на подмене. Сейчас все вызовы последовательны (bash-редирект,
41
- * один subagent-тул); так и держать.
42
- */
43
- async executeByName(name, args, ctx) {
44
- const prevCtx = this.ctx;
45
- if (ctx)
46
- this.ctx = ctx;
47
- try {
48
- return await this.execute({
49
- id: `redirect_${Date.now()}`,
50
- name,
51
- arguments: args,
52
- });
53
- }
54
- finally {
55
- this.ctx = prevCtx;
56
- }
57
- }
58
- /** Есть ли тул с таким именем (проверка перед редиректами). */
59
- hasTool(name) {
60
- return this.registry.has(name);
61
- }
62
- memoKey(name, args) {
63
- return `${this.ctx.sessionId ?? ""}::${name}::${JSON.stringify(stableArgsKey(args))}`;
64
- }
65
- /**
66
- * Чтение мемо для `manualMemo`-тулов (bash). Возвращает откреплённую копию —
67
- * `toolCallId` вызывающий ставит сам.
68
- */
69
- memoGet(name, args) {
70
- const hit = this.memo.get(this.memoKey(name, args));
71
- if (!hit)
72
- return undefined;
73
- if (Date.now() - hit.at > MEMO_TTL_MS) {
74
- this.memo.delete(this.memoKey(name, args));
75
- return undefined;
76
- }
77
- return { ...hit.result };
78
- }
79
- /** Запись в мемо для `manualMemo`-тулов. Хранит откреплённую копию. */
80
- memoSet(name, args, result) {
81
- const key = this.memoKey(name, args);
82
- if (!this.memo.has(key) && this.memo.size >= MEMO_MAX_ENTRIES) {
83
- const oldest = this.memo.keys().next();
84
- if (!oldest.done)
85
- this.memo.delete(oldest.value);
86
- }
87
- this.memo.set(key, { result: { ...result }, at: Date.now() });
88
- }
89
- /** Сброс мемо — после всего, что могло мутировать состояние. */
90
- memoInvalidate() {
91
- this.memo.clear();
92
- }
93
- /**
94
- * Имена разрешённых тулов множеством, `null` — без ограничений.
95
- * `undefined` — без ограничений; `[]` — запрещено всё.
96
- */
97
- allowedNames() {
98
- const allow = this.ctx.toolAllowlist;
99
- return allow ? new Set(allow) : null;
100
- }
101
- /** Выполнить tool call: allowlist → плагины → хендлер → post-хуки. */
102
- async execute(call, signal) {
103
- const allow = this.allowedNames();
104
- if (allow && !allow.has(call.name)) {
105
- return {
106
- success: false,
107
- output: t("tool.not_allowed", { name: call.name }),
108
- toolCallId: call.id,
109
- };
110
- }
111
- const tool = this.registry.get(call.name);
112
- if (!tool) {
113
- return {
114
- success: false,
115
- output: t("tool.unknown", { name: call.name }),
116
- toolCallId: call.id,
117
- };
118
- }
119
- for (const plugin of this.pluginManager.getAllPlugins()) {
120
- if (plugin.onBeforeTool) {
121
- try {
122
- const proceed = await plugin.onBeforeTool(this.ctx, call);
123
- if (proceed === false || typeof proceed === "string") {
124
- const pluginName = plugin.name || plugin.constructor?.name || "unknown";
125
- const reason = typeof proceed === "string" ? proceed : undefined;
126
- return {
127
- success: false,
128
- blocked: true,
129
- output: reason
130
- ? t("tool.blocked_reason", { plugin: pluginName, reason })
131
- : t("tool.blocked", { plugin: pluginName }),
132
- toolCallId: call.id,
133
- };
134
- }
135
- }
136
- catch (e) {
137
- this.ctx.logger.warn(`Plugin onBeforeTool error: ${e.message}`);
138
- }
139
- }
140
- }
141
- let result;
142
- // Мемоизированный повтор детерминированного чтения (cacheable): хендлер
143
- // пропускается, но общий хвост (post-плагины, логирование) идёт как обычно,
144
- // чтобы мемо-хит был неотличим от свежего прогона.
145
- const memoHit = tool.cacheable ? this.memoGet(call.name, call.arguments) : undefined;
146
- try {
147
- this.ctx.activeCallId = call.id;
148
- if (tool.interactive) {
149
- // Интерактивные тулы ждут ввода — без таймаута.
150
- result = memoHit ?? (await tool.handler(this.ctx, call.arguments));
151
- }
152
- else {
153
- const timeoutMs = tool.timeoutMs ?? TOOL_EXECUTION_TIMEOUT_MS;
154
- const failFast = (message) => {
155
- // Убить долгоживущий дочерний процесс этого вызова.
156
- killByCallId(call.id);
157
- // Тул-специфичный cleanup (напр. восстановление скоупа subagent) —
158
- // до reject, чтобы общее состояние восстановилось и при abandonment.
159
- const cleanup = this.ctx.cleanup;
160
- if (cleanup) {
161
- cleanup();
162
- // Сбрасывать, только если более новый вызов не подменил тем временем.
163
- if (this.ctx.cleanup === cleanup)
164
- this.ctx.cleanup = undefined;
165
- }
166
- return new Error(message);
167
- };
168
- let timer;
169
- let onAbort;
170
- const timeoutPromise = new Promise((_, reject) => {
171
- timer = setTimeout(() => {
172
- reject(failFast(t("tool.timeout", {
173
- name: call.name,
174
- seconds: Math.round(timeoutMs / 1000),
175
- })));
176
- }, timeoutMs);
177
- });
178
- const racePromises = [
179
- memoHit ? Promise.resolve(memoHit) : tool.handler(this.ctx, call.arguments),
180
- timeoutPromise,
181
- ];
182
- if (signal) {
183
- const abortPromise = new Promise((_, reject) => {
184
- onAbort = () => reject(failFast(t("tool.aborted", { name: call.name })));
185
- if (signal.aborted) {
186
- onAbort();
187
- }
188
- else {
189
- signal.addEventListener("abort", onAbort, { once: true });
190
- }
191
- });
192
- racePromises.push(abortPromise);
193
- }
194
- try {
195
- result = await Promise.race(racePromises);
196
- }
197
- finally {
198
- // Остановить таймер и снять abort-слушатель, чтобы они не сработали
199
- // против контекста/cleanup УЖЕ ДРУГОГО вызова.
200
- if (timer !== undefined)
201
- clearTimeout(timer);
202
- if (onAbort && signal)
203
- signal.removeEventListener("abort", onAbort);
204
- // У проигравших промисов потребителя после settled race нет (их
205
- // kill/cleanup-эффекты уже применены в failFast). Залогировать
206
- // reject и отцепить, чтобы не всплыл как unhandled rejection.
207
- for (const p of racePromises.slice(1)) {
208
- p.catch((e) => {
209
- this.ctx.logger.debug(`Tool ${call.name}: discarded race loser: ${e.message}`);
210
- });
211
- }
212
- }
213
- }
214
- result.toolCallId = call.id;
215
- }
216
- catch (e) {
217
- result = {
218
- success: false,
219
- output: `${t("error.prefix")}${e.message}`,
220
- toolCallId: call.id,
221
- };
222
- }
223
- if (!memoHit) {
224
- // Успешные детерминированные чтения мемоизируются; всё остальное, что
225
- // реально выполнялось, могло мутировать состояние (даже упавшая команда
226
- // применяется наполовину) — мемо сбрасывается. `manualMemo` (bash) ведут
227
- // свои записи сами.
228
- if (tool.cacheable && result.success) {
229
- this.memoSet(call.name, call.arguments, result);
230
- }
231
- else if (!tool.cacheable && !tool.manualMemo) {
232
- this.memoInvalidate();
233
- }
234
- }
235
- // После аборта работа тула отбрасывается (цикл агента завершается без
236
- // рендера/логирования), поэтому медленные post-плагины (LSP, lint, tsc)
237
- // пропускаются целиком. Аборт посреди плагина виден ему через signal
238
- // в контексте хука — плагин убьёт свои дочерние процессы.
239
- if (signal?.aborted) {
240
- this.ctx.logger.debug(`Tool ${call.name}: abort, skipping onAfterTool plugins`);
241
- }
242
- else {
243
- const pluginCtx = signal ? { ...this.ctx, signal } : this.ctx;
244
- for (const plugin of this.pluginManager.getAllPlugins()) {
245
- if (plugin.onAfterTool) {
246
- try {
247
- await plugin.onAfterTool(pluginCtx, call, result);
248
- }
249
- catch (e) {
250
- this.ctx.logger.warn(`Plugin onAfterTool error: ${e.message}`);
251
- }
252
- }
253
- }
254
- }
255
- this.ctx.logger.logToolCall(call.name, JSON.stringify(call.arguments)?.slice(0, 200) ?? "", result.success ? "OK" : `FAIL: ${result.output?.slice(0, 200)}`);
256
- this.ctx.logger.logToolOutput(call.name, result.output ?? "", result.success ? 0 : 1);
257
- this.ctx.logger.debug(`Tool ${call.name}: ${result.success ? "OK" : "FAIL"}`);
258
- return result;
259
- }
260
- /** Определения тулов с учётом allowlist (для схемы LLM). */
261
- getToolDefinitions(tags) {
262
- const allow = this.allowedNames();
263
- if (allow) {
264
- return this.registry
265
- .getAll()
266
- .filter((t) => allow.has(t.name))
267
- .map((t) => ({
268
- name: t.name,
269
- description: t.description,
270
- parameters: t.parameters,
271
- boundedOutput: t.boundedOutput,
272
- }));
273
- }
274
- return this.registry.getAllForLLM(tags);
275
- }
276
- /** Доступ к реестру. */
277
- getRegistry() {
278
- return this.registry;
279
- }
280
- /** Установить скоуп shared-исполнителя. */
281
- setScope(scope) {
282
- this.ctx.scope = scope;
283
- }
284
- /** Текущий скоуп shared-исполнителя (для compare-and-restore субагентов). */
285
- getScope() {
286
- return this.ctx.scope;
287
- }
288
- /** Установить prompt-поверхность для интерактивных тулов. */
289
- setPromptIO(io) {
290
- this.ctx.promptIO = io;
291
- }
292
- /** Текущая глубина рекурсии субагентов. */
293
- getRecursionDepth() {
294
- return this.ctx.recursionDepth ?? 0;
295
- }
296
- /** Установить глубину рекурсии. */
297
- setRecursionDepth(depth) {
298
- this.ctx.recursionDepth = depth;
299
- }
300
- /** Подменить LLM-провайдер в контексте. */
301
- updateProvider(provider) {
302
- this.ctx.llmProvider = provider;
303
- }
304
- }
@@ -1,49 +0,0 @@
1
- /** Тул метаданных файла/каталога (размер, даты; кешируемый). */
2
- import { statSync, existsSync } from "fs";
3
- import { t } from "../i18n/index";
4
- import { isPathInScope } from "../modules/security/path-validator";
5
- import { safeResolvePath } from "./path-utils";
6
- /** Возвращает JSON с размером, типом, датами создания/изменения. */
7
- export const fileInfoTool = {
8
- name: "file_info",
9
- icon: "ℹ️",
10
- description: "Get metadata about a file or directory (size, creation date, modification date).",
11
- tags: ["file"],
12
- boundedOutput: true,
13
- cacheable: true,
14
- parameters: {
15
- type: "object",
16
- properties: {
17
- path: { type: "string", description: "File path" },
18
- },
19
- required: ["path"],
20
- },
21
- handler: async (ctx, args) => {
22
- const path = String(args.path);
23
- const resolved = safeResolvePath(ctx.baseDir, path);
24
- const scopeCheck = isPathInScope(ctx.baseDir, resolved, ctx.scope, ctx.config.security?.paths);
25
- if (!scopeCheck.allowed) {
26
- return {
27
- success: false,
28
- output: t("file.path_not_allowed", {
29
- path: `${path} — ${scopeCheck.reason}`,
30
- }),
31
- };
32
- }
33
- if (!existsSync(resolved)) {
34
- return { success: false, output: t("file.not_found_short", { path }) };
35
- }
36
- const stat = statSync(resolved);
37
- return {
38
- success: true,
39
- output: JSON.stringify({
40
- path,
41
- size: stat.size,
42
- isDirectory: stat.isDirectory(),
43
- isFile: stat.isFile(),
44
- created: stat.birthtime,
45
- modified: stat.mtime,
46
- }, null, 2),
47
- };
48
- },
49
- };
@@ -1,17 +0,0 @@
1
- /**
2
- * Фильтрует тулы по набору тегов, всегда оставляя `alwaysOn`. Для MoE-роутинга
3
- * экспертов и subagent tool_tags — структурные тулы (plan/todo/verify,
4
- * project_map, lsp_check, enable_tools) переживают сужение.
5
- */
6
- export function filterToolsByTags(tools, toolTags) {
7
- if (!toolTags || toolTags.length === 0)
8
- return tools;
9
- const tagSet = new Set(toolTags);
10
- return tools.filter((t) => {
11
- if (t.alwaysOn)
12
- return true;
13
- if (!t.tags || t.tags.length === 0)
14
- return false;
15
- return t.tags.some((tag) => tagSet.has(tag));
16
- });
17
- }
@@ -1,37 +0,0 @@
1
- /** Тул поиска файлов по glob-паттерну (кешируемый, jail в baseDir). */
2
- import { globSync } from "fs";
3
- import { t } from "../i18n/index";
4
- import { MAX_PREVIEW_LINES } from "./preview";
5
- /** Ищет файлы по glob; выдача обрезана MAX_PREVIEW_LINES. */
6
- export const globTool = {
7
- name: "glob",
8
- icon: "🔎",
9
- description: `Search for files matching a glob pattern. Shows up to ${MAX_PREVIEW_LINES} results by default. Uses standard glob syntax (e.g., **/*.ts, src/**/*.test.ts).`,
10
- tags: ["file", "code", "research"],
11
- cacheable: true,
12
- parameters: {
13
- type: "object",
14
- properties: {
15
- pattern: { type: "string", description: "Glob pattern" },
16
- },
17
- required: ["pattern"],
18
- },
19
- handler: async (ctx, args) => {
20
- const pattern = String(args.pattern);
21
- // Абсолютные паттерны (/etc/*) и ".." выводят за baseDir — запретить.
22
- if (/^([a-zA-Z]:)?[\\/]/.test(pattern) || pattern.split(/[\\/]/).includes("..")) {
23
- return {
24
- success: false,
25
- output: t("file.path_not_allowed", { path: pattern }),
26
- };
27
- }
28
- const results = globSync(pattern, { cwd: ctx.baseDir });
29
- if (results.length === 0) {
30
- return { success: true, output: t("file.no_matches") };
31
- }
32
- const truncated = results.length > MAX_PREVIEW_LINES
33
- ? `\n... (${results.length - MAX_PREVIEW_LINES} more files)`
34
- : "";
35
- return { success: true, output: results.slice(0, MAX_PREVIEW_LINES).join("\n") + truncated };
36
- },
37
- };