@armadra/agent 0.0.0-stage → 0.3.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 (433) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/LICENSE +21 -0
  3. package/README.md +470 -2
  4. package/dist/agent/agent.d.ts +56 -0
  5. package/dist/agent/agent.js +129 -0
  6. package/dist/agent/loop.d.ts +51 -0
  7. package/dist/agent/loop.js +158 -0
  8. package/dist/agent/queue.d.ts +25 -0
  9. package/dist/agent/queue.js +55 -0
  10. package/dist/agent/retry.d.ts +22 -0
  11. package/dist/agent/retry.js +92 -0
  12. package/dist/agent/schema.d.ts +27 -0
  13. package/dist/agent/schema.js +186 -0
  14. package/dist/agent/session-cache.d.ts +100 -0
  15. package/dist/agent/session-cache.js +514 -0
  16. package/dist/agent/session-compaction.d.ts +49 -0
  17. package/dist/agent/session-compaction.js +251 -0
  18. package/dist/agent/session-core.d.ts +103 -0
  19. package/dist/agent/session-core.js +7 -0
  20. package/dist/agent/session-run.d.ts +55 -0
  21. package/dist/agent/session-run.js +246 -0
  22. package/dist/agent/session-state.d.ts +39 -0
  23. package/dist/agent/session-state.js +119 -0
  24. package/dist/agent/session-subagent.d.ts +54 -0
  25. package/dist/agent/session-subagent.js +157 -0
  26. package/dist/agent/session-sync.d.ts +20 -0
  27. package/dist/agent/session-sync.js +111 -0
  28. package/dist/agent/session-tools.d.ts +24 -0
  29. package/dist/agent/session-tools.js +277 -0
  30. package/dist/agent/session.d.ts +117 -0
  31. package/dist/agent/session.js +485 -0
  32. package/dist/agent/system-prompt.d.ts +49 -0
  33. package/dist/agent/system-prompt.js +121 -0
  34. package/dist/agent/tool-runner.d.ts +64 -0
  35. package/dist/agent/tool-runner.js +309 -0
  36. package/dist/agent/transform.d.ts +26 -0
  37. package/dist/agent/transform.js +171 -0
  38. package/dist/agent/types.d.ts +378 -0
  39. package/dist/agent/types.js +21 -0
  40. package/dist/ai/apis/anthropic-messages.d.ts +26 -0
  41. package/dist/ai/apis/anthropic-messages.js +214 -0
  42. package/dist/ai/apis/anthropic-request.d.ts +42 -0
  43. package/dist/ai/apis/anthropic-request.js +282 -0
  44. package/dist/ai/apis/api.d.ts +28 -0
  45. package/dist/ai/apis/api.js +102 -0
  46. package/dist/ai/apis/cache-params.d.ts +48 -0
  47. package/dist/ai/apis/cache-params.js +163 -0
  48. package/dist/ai/apis/google-generative-ai.d.ts +32 -0
  49. package/dist/ai/apis/google-generative-ai.js +249 -0
  50. package/dist/ai/apis/google-request.d.ts +40 -0
  51. package/dist/ai/apis/google-request.js +255 -0
  52. package/dist/ai/apis/openai-compat.d.ts +35 -0
  53. package/dist/ai/apis/openai-compat.js +142 -0
  54. package/dist/ai/apis/openai-completions.d.ts +28 -0
  55. package/dist/ai/apis/openai-completions.js +246 -0
  56. package/dist/ai/apis/openai-request.d.ts +35 -0
  57. package/dist/ai/apis/openai-request.js +303 -0
  58. package/dist/ai/apis/openai-responses-request.d.ts +52 -0
  59. package/dist/ai/apis/openai-responses-request.js +266 -0
  60. package/dist/ai/apis/openai-responses.d.ts +28 -0
  61. package/dist/ai/apis/openai-responses.js +304 -0
  62. package/dist/ai/apis/shared.d.ts +56 -0
  63. package/dist/ai/apis/shared.js +179 -0
  64. package/dist/ai/cache/economics.d.ts +24 -0
  65. package/dist/ai/cache/economics.js +69 -0
  66. package/dist/ai/cache/fingerprint.d.ts +17 -0
  67. package/dist/ai/cache/fingerprint.js +39 -0
  68. package/dist/ai/cache/miss.d.ts +49 -0
  69. package/dist/ai/cache/miss.js +96 -0
  70. package/dist/ai/cache/reporting.d.ts +39 -0
  71. package/dist/ai/cache/reporting.js +103 -0
  72. package/dist/ai/cache/types.d.ts +94 -0
  73. package/dist/ai/cache/types.js +19 -0
  74. package/dist/ai/cache/warmer.d.ts +94 -0
  75. package/dist/ai/cache/warmer.js +224 -0
  76. package/dist/ai/context.d.ts +35 -0
  77. package/dist/ai/context.js +114 -0
  78. package/dist/ai/cost.d.ts +21 -0
  79. package/dist/ai/cost.js +60 -0
  80. package/dist/ai/event-stream.d.ts +33 -0
  81. package/dist/ai/event-stream.js +101 -0
  82. package/dist/ai/fake/fake-provider.d.ts +68 -0
  83. package/dist/ai/fake/fake-provider.js +278 -0
  84. package/dist/ai/fake/fake-script.d.ts +69 -0
  85. package/dist/ai/fake/fake-script.js +142 -0
  86. package/dist/ai/http.d.ts +54 -0
  87. package/dist/ai/http.js +212 -0
  88. package/dist/ai/json-partial.d.ts +17 -0
  89. package/dist/ai/json-partial.js +243 -0
  90. package/dist/ai/overflow.d.ts +22 -0
  91. package/dist/ai/overflow.js +61 -0
  92. package/dist/ai/providers/auth.d.ts +71 -0
  93. package/dist/ai/providers/auth.js +202 -0
  94. package/dist/ai/providers/builtin.d.ts +23 -0
  95. package/dist/ai/providers/builtin.js +148 -0
  96. package/dist/ai/providers/catalog-data.d.ts +5 -0
  97. package/dist/ai/providers/catalog-data.js +19 -0
  98. package/dist/ai/providers/catalog.d.ts +28 -0
  99. package/dist/ai/providers/catalog.js +166 -0
  100. package/dist/ai/providers/channels.d.ts +51 -0
  101. package/dist/ai/providers/channels.js +96 -0
  102. package/dist/ai/providers/enrich.d.ts +34 -0
  103. package/dist/ai/providers/enrich.js +86 -0
  104. package/dist/ai/providers/models-dev-cache.d.ts +53 -0
  105. package/dist/ai/providers/models-dev-cache.js +147 -0
  106. package/dist/ai/providers/models-dev.d.ts +99 -0
  107. package/dist/ai/providers/models-dev.js +315 -0
  108. package/dist/ai/providers/registry.d.ts +114 -0
  109. package/dist/ai/providers/registry.js +458 -0
  110. package/dist/ai/sse.d.ts +32 -0
  111. package/dist/ai/sse.js +140 -0
  112. package/dist/ai/thinking.d.ts +42 -0
  113. package/dist/ai/thinking.js +101 -0
  114. package/dist/ai/types.d.ts +448 -0
  115. package/dist/ai/types.js +19 -0
  116. package/dist/bundle/ama-sandbox.cjs +324 -0
  117. package/dist/bundle/ama.cjs +27837 -0
  118. package/dist/bundle.d.ts +9 -0
  119. package/dist/bundle.js +15 -0
  120. package/dist/cli/args.d.ts +85 -0
  121. package/dist/cli/args.js +408 -0
  122. package/dist/cli/bootstrap.d.ts +18 -0
  123. package/dist/cli/bootstrap.js +399 -0
  124. package/dist/cli/compose-providers.d.ts +37 -0
  125. package/dist/cli/compose-providers.js +107 -0
  126. package/dist/cli/compose-session.d.ts +72 -0
  127. package/dist/cli/compose-session.js +370 -0
  128. package/dist/cli/compose-store.d.ts +24 -0
  129. package/dist/cli/compose-store.js +125 -0
  130. package/dist/cli/compose.d.ts +108 -0
  131. package/dist/cli/compose.js +221 -0
  132. package/dist/cli/default-model.d.ts +16 -0
  133. package/dist/cli/default-model.js +24 -0
  134. package/dist/cli/deps.d.ts +207 -0
  135. package/dist/cli/deps.js +12 -0
  136. package/dist/cli/exit-codes.d.ts +29 -0
  137. package/dist/cli/exit-codes.js +40 -0
  138. package/dist/cli/main.d.ts +27 -0
  139. package/dist/cli/main.js +177 -0
  140. package/dist/cli/runtime.d.ts +90 -0
  141. package/dist/cli/runtime.js +8 -0
  142. package/dist/cli/startup-screen.d.ts +15 -0
  143. package/dist/cli/startup-screen.js +56 -0
  144. package/dist/cli/startup-steps.d.ts +35 -0
  145. package/dist/cli/startup-steps.js +202 -0
  146. package/dist/cli/subcommands/auth.d.ts +12 -0
  147. package/dist/cli/subcommands/auth.js +91 -0
  148. package/dist/cli/subcommands/config.d.ts +53 -0
  149. package/dist/cli/subcommands/config.js +277 -0
  150. package/dist/cli/subcommands/context.d.ts +21 -0
  151. package/dist/cli/subcommands/context.js +42 -0
  152. package/dist/cli/subcommands/doctor.d.ts +11 -0
  153. package/dist/cli/subcommands/doctor.js +246 -0
  154. package/dist/cli/subcommands/init.d.ts +6 -0
  155. package/dist/cli/subcommands/init.js +22 -0
  156. package/dist/cli/subcommands/model-meta.d.ts +16 -0
  157. package/dist/cli/subcommands/model-meta.js +54 -0
  158. package/dist/cli/subcommands/models-cache-probe.d.ts +34 -0
  159. package/dist/cli/subcommands/models-cache-probe.js +190 -0
  160. package/dist/cli/subcommands/models-discover.d.ts +46 -0
  161. package/dist/cli/subcommands/models-discover.js +232 -0
  162. package/dist/cli/subcommands/models.d.ts +40 -0
  163. package/dist/cli/subcommands/models.js +152 -0
  164. package/dist/cli/subcommands/providers-list.d.ts +8 -0
  165. package/dist/cli/subcommands/providers-list.js +97 -0
  166. package/dist/cli/subcommands/providers-plan.d.ts +79 -0
  167. package/dist/cli/subcommands/providers-plan.js +215 -0
  168. package/dist/cli/subcommands/providers.d.ts +27 -0
  169. package/dist/cli/subcommands/providers.js +433 -0
  170. package/dist/cli/subcommands/sessions.d.ts +11 -0
  171. package/dist/cli/subcommands/sessions.js +100 -0
  172. package/dist/codemode/capability.d.ts +37 -0
  173. package/dist/codemode/capability.js +55 -0
  174. package/dist/codemode/declarations.d.ts +44 -0
  175. package/dist/codemode/declarations.js +111 -0
  176. package/dist/codemode/host-side.d.ts +59 -0
  177. package/dist/codemode/host-side.js +253 -0
  178. package/dist/codemode/modes.d.ts +23 -0
  179. package/dist/codemode/modes.js +40 -0
  180. package/dist/codemode/protocol.d.ts +91 -0
  181. package/dist/codemode/protocol.js +114 -0
  182. package/dist/codemode/sandbox-entry.d.ts +25 -0
  183. package/dist/codemode/sandbox-entry.js +323 -0
  184. package/dist/codemode/store.d.ts +26 -0
  185. package/dist/codemode/store.js +53 -0
  186. package/dist/codemode/tool.d.ts +105 -0
  187. package/dist/codemode/tool.js +283 -0
  188. package/dist/compaction/branch-summary.d.ts +30 -0
  189. package/dist/compaction/branch-summary.js +79 -0
  190. package/dist/compaction/breaker.d.ts +32 -0
  191. package/dist/compaction/breaker.js +65 -0
  192. package/dist/compaction/cut-point.d.ts +23 -0
  193. package/dist/compaction/cut-point.js +70 -0
  194. package/dist/compaction/estimate.d.ts +30 -0
  195. package/dist/compaction/estimate.js +114 -0
  196. package/dist/compaction/prune-tier.d.ts +31 -0
  197. package/dist/compaction/prune-tier.js +83 -0
  198. package/dist/compaction/serialize.d.ts +20 -0
  199. package/dist/compaction/serialize.js +115 -0
  200. package/dist/compaction/summarize-tier.d.ts +111 -0
  201. package/dist/compaction/summarize-tier.js +305 -0
  202. package/dist/config/auth-file.d.ts +39 -0
  203. package/dist/config/auth-file.js +92 -0
  204. package/dist/config/context-files.d.ts +30 -0
  205. package/dist/config/context-files.js +77 -0
  206. package/dist/config/init.d.ts +30 -0
  207. package/dist/config/init.js +92 -0
  208. package/dist/config/json-schema.d.ts +14 -0
  209. package/dist/config/json-schema.js +182 -0
  210. package/dist/config/load.d.ts +45 -0
  211. package/dist/config/load.js +97 -0
  212. package/dist/config/merge.d.ts +73 -0
  213. package/dist/config/merge.js +248 -0
  214. package/dist/config/paths.d.ts +38 -0
  215. package/dist/config/paths.js +108 -0
  216. package/dist/config/profile.d.ts +27 -0
  217. package/dist/config/profile.js +65 -0
  218. package/dist/config/schema.d.ts +34 -0
  219. package/dist/config/schema.js +476 -0
  220. package/dist/config/trust.d.ts +42 -0
  221. package/dist/config/trust.js +122 -0
  222. package/dist/config/types.d.ts +190 -0
  223. package/dist/config/types.js +29 -0
  224. package/dist/config/write.d.ts +10 -0
  225. package/dist/config/write.js +25 -0
  226. package/dist/errors.d.ts +28 -0
  227. package/dist/errors.js +30 -0
  228. package/dist/hooks/config.d.ts +49 -0
  229. package/dist/hooks/config.js +102 -0
  230. package/dist/hooks/dispatcher.d.ts +41 -0
  231. package/dist/hooks/dispatcher.js +104 -0
  232. package/dist/hooks/matcher.d.ts +22 -0
  233. package/dist/hooks/matcher.js +108 -0
  234. package/dist/hooks/protocol.d.ts +33 -0
  235. package/dist/hooks/protocol.js +240 -0
  236. package/dist/hooks/runner.d.ts +30 -0
  237. package/dist/hooks/runner.js +143 -0
  238. package/dist/hooks/types.d.ts +147 -0
  239. package/dist/hooks/types.js +20 -0
  240. package/dist/host/api-impl.d.ts +75 -0
  241. package/dist/host/api-impl.js +173 -0
  242. package/dist/host/loader.d.ts +31 -0
  243. package/dist/host/loader.js +147 -0
  244. package/dist/host/types.d.ts +169 -0
  245. package/dist/host/types.js +14 -0
  246. package/dist/host.d.ts +5 -0
  247. package/dist/host.js +4 -0
  248. package/dist/index.d.ts +41 -0
  249. package/dist/index.js +28 -0
  250. package/dist/modes/commands-core.d.ts +44 -0
  251. package/dist/modes/commands-core.js +171 -0
  252. package/dist/modes/image-input.d.ts +27 -0
  253. package/dist/modes/image-input.js +78 -0
  254. package/dist/modes/interactive/approval-dialog.d.ts +48 -0
  255. package/dist/modes/interactive/approval-dialog.js +202 -0
  256. package/dist/modes/interactive/commands.d.ts +41 -0
  257. package/dist/modes/interactive/commands.js +201 -0
  258. package/dist/modes/interactive/completion.d.ts +53 -0
  259. package/dist/modes/interactive/completion.js +157 -0
  260. package/dist/modes/interactive/interactive-mode.d.ts +46 -0
  261. package/dist/modes/interactive/interactive-mode.js +491 -0
  262. package/dist/modes/interactive/key-dispatch.d.ts +29 -0
  263. package/dist/modes/interactive/key-dispatch.js +107 -0
  264. package/dist/modes/interactive/line/line-editor.d.ts +50 -0
  265. package/dist/modes/interactive/line/line-editor.js +232 -0
  266. package/dist/modes/interactive/line/line-mode.d.ts +20 -0
  267. package/dist/modes/interactive/line/line-mode.js +218 -0
  268. package/dist/modes/interactive/line/line-render.d.ts +35 -0
  269. package/dist/modes/interactive/line/line-render.js +171 -0
  270. package/dist/modes/interactive/line/paste-state.d.ts +26 -0
  271. package/dist/modes/interactive/line/paste-state.js +72 -0
  272. package/dist/modes/interactive/message-view.d.ts +77 -0
  273. package/dist/modes/interactive/message-view.js +269 -0
  274. package/dist/modes/interactive/pickers.d.ts +42 -0
  275. package/dist/modes/interactive/pickers.js +115 -0
  276. package/dist/modes/interactive/startup-ui.d.ts +33 -0
  277. package/dist/modes/interactive/startup-ui.js +268 -0
  278. package/dist/modes/interactive/status-bar.d.ts +48 -0
  279. package/dist/modes/interactive/status-bar.js +139 -0
  280. package/dist/modes/interactive/tool-view.d.ts +95 -0
  281. package/dist/modes/interactive/tool-view.js +344 -0
  282. package/dist/modes/print/json-event.d.ts +15 -0
  283. package/dist/modes/print/json-event.js +39 -0
  284. package/dist/modes/print/print-mode.d.ts +17 -0
  285. package/dist/modes/print/print-mode.js +107 -0
  286. package/dist/modes/rpc/commands.d.ts +40 -0
  287. package/dist/modes/rpc/commands.js +263 -0
  288. package/dist/modes/rpc/jsonl.d.ts +16 -0
  289. package/dist/modes/rpc/jsonl.js +55 -0
  290. package/dist/modes/rpc/rpc-mode.d.ts +22 -0
  291. package/dist/modes/rpc/rpc-mode.js +153 -0
  292. package/dist/modes/session-report.d.ts +55 -0
  293. package/dist/modes/session-report.js +278 -0
  294. package/dist/modes/shared.d.ts +13 -0
  295. package/dist/modes/shared.js +52 -0
  296. package/dist/modes/startup-ui-text.d.ts +16 -0
  297. package/dist/modes/startup-ui-text.js +103 -0
  298. package/dist/permissions/broker.d.ts +47 -0
  299. package/dist/permissions/broker.js +107 -0
  300. package/dist/permissions/dangerous.d.ts +47 -0
  301. package/dist/permissions/dangerous.js +370 -0
  302. package/dist/permissions/pipeline.d.ts +51 -0
  303. package/dist/permissions/pipeline.js +181 -0
  304. package/dist/permissions/preview.d.ts +43 -0
  305. package/dist/permissions/preview.js +463 -0
  306. package/dist/permissions/rules.d.ts +58 -0
  307. package/dist/permissions/rules.js +249 -0
  308. package/dist/permissions/types.d.ts +100 -0
  309. package/dist/permissions/types.js +18 -0
  310. package/dist/rpc.d.ts +173 -0
  311. package/dist/rpc.js +13 -0
  312. package/dist/sdk.d.ts +98 -0
  313. package/dist/sdk.js +195 -0
  314. package/dist/session/manager.d.ts +70 -0
  315. package/dist/session/manager.js +278 -0
  316. package/dist/session/migrate.d.ts +19 -0
  317. package/dist/session/migrate.js +53 -0
  318. package/dist/session/projection.d.ts +50 -0
  319. package/dist/session/projection.js +184 -0
  320. package/dist/session/store.d.ts +47 -0
  321. package/dist/session/store.js +210 -0
  322. package/dist/session/tree.d.ts +21 -0
  323. package/dist/session/tree.js +88 -0
  324. package/dist/session/types.d.ts +201 -0
  325. package/dist/session/types.js +18 -0
  326. package/dist/skills/discover.d.ts +60 -0
  327. package/dist/skills/discover.js +160 -0
  328. package/dist/skills/expand.d.ts +35 -0
  329. package/dist/skills/expand.js +46 -0
  330. package/dist/skills/frontmatter.d.ts +27 -0
  331. package/dist/skills/frontmatter.js +157 -0
  332. package/dist/skills/index-prompt.d.ts +13 -0
  333. package/dist/skills/index-prompt.js +42 -0
  334. package/dist/skills/templates.d.ts +52 -0
  335. package/dist/skills/templates.js +177 -0
  336. package/dist/tools/bash.d.ts +49 -0
  337. package/dist/tools/bash.js +222 -0
  338. package/dist/tools/edit-fuzzy.d.ts +36 -0
  339. package/dist/tools/edit-fuzzy.js +129 -0
  340. package/dist/tools/edit.d.ts +38 -0
  341. package/dist/tools/edit.js +241 -0
  342. package/dist/tools/file-mutex.d.ts +8 -0
  343. package/dist/tools/file-mutex.js +29 -0
  344. package/dist/tools/glob.d.ts +44 -0
  345. package/dist/tools/glob.js +217 -0
  346. package/dist/tools/grep.d.ts +39 -0
  347. package/dist/tools/grep.js +179 -0
  348. package/dist/tools/ignore.d.ts +40 -0
  349. package/dist/tools/ignore.js +174 -0
  350. package/dist/tools/image-file.d.ts +31 -0
  351. package/dist/tools/image-file.js +114 -0
  352. package/dist/tools/ls.d.ts +21 -0
  353. package/dist/tools/ls.js +96 -0
  354. package/dist/tools/output-accumulator.d.ts +48 -0
  355. package/dist/tools/output-accumulator.js +106 -0
  356. package/dist/tools/paths.d.ts +20 -0
  357. package/dist/tools/paths.js +58 -0
  358. package/dist/tools/presets.d.ts +71 -0
  359. package/dist/tools/presets.js +128 -0
  360. package/dist/tools/process-tree.d.ts +35 -0
  361. package/dist/tools/process-tree.js +125 -0
  362. package/dist/tools/read.d.ts +24 -0
  363. package/dist/tools/read.js +132 -0
  364. package/dist/tools/registry.d.ts +43 -0
  365. package/dist/tools/registry.js +106 -0
  366. package/dist/tools/shell.d.ts +38 -0
  367. package/dist/tools/shell.js +91 -0
  368. package/dist/tools/task.d.ts +29 -0
  369. package/dist/tools/task.js +107 -0
  370. package/dist/tools/todo.d.ts +28 -0
  371. package/dist/tools/todo.js +107 -0
  372. package/dist/tools/truncate.d.ts +44 -0
  373. package/dist/tools/truncate.js +175 -0
  374. package/dist/tools/types.d.ts +135 -0
  375. package/dist/tools/types.js +19 -0
  376. package/dist/tools/write.d.ts +20 -0
  377. package/dist/tools/write.js +84 -0
  378. package/dist/tui/ansi.d.ts +29 -0
  379. package/dist/tui/ansi.js +420 -0
  380. package/dist/tui/component.d.ts +38 -0
  381. package/dist/tui/component.js +13 -0
  382. package/dist/tui/components/box.d.ts +26 -0
  383. package/dist/tui/components/box.js +65 -0
  384. package/dist/tui/components/container.d.ts +14 -0
  385. package/dist/tui/components/container.js +39 -0
  386. package/dist/tui/components/editor-buffer.d.ts +67 -0
  387. package/dist/tui/components/editor-buffer.js +300 -0
  388. package/dist/tui/components/editor-paste.d.ts +29 -0
  389. package/dist/tui/components/editor-paste.js +64 -0
  390. package/dist/tui/components/editor.d.ts +114 -0
  391. package/dist/tui/components/editor.js +530 -0
  392. package/dist/tui/components/key-value.d.ts +29 -0
  393. package/dist/tui/components/key-value.js +48 -0
  394. package/dist/tui/components/loader.d.ts +35 -0
  395. package/dist/tui/components/loader.js +71 -0
  396. package/dist/tui/components/markdown.d.ts +90 -0
  397. package/dist/tui/components/markdown.js +462 -0
  398. package/dist/tui/components/meter.d.ts +29 -0
  399. package/dist/tui/components/meter.js +47 -0
  400. package/dist/tui/components/overlay.d.ts +24 -0
  401. package/dist/tui/components/overlay.js +52 -0
  402. package/dist/tui/components/select-list.d.ts +57 -0
  403. package/dist/tui/components/select-list.js +179 -0
  404. package/dist/tui/components/spacer.d.ts +11 -0
  405. package/dist/tui/components/spacer.js +16 -0
  406. package/dist/tui/components/text.d.ts +30 -0
  407. package/dist/tui/components/text.js +65 -0
  408. package/dist/tui/keybindings.d.ts +66 -0
  409. package/dist/tui/keybindings.js +120 -0
  410. package/dist/tui/keys.d.ts +38 -0
  411. package/dist/tui/keys.js +275 -0
  412. package/dist/tui/stdin-buffer.d.ts +41 -0
  413. package/dist/tui/stdin-buffer.js +206 -0
  414. package/dist/tui/terminal.d.ts +79 -0
  415. package/dist/tui/terminal.js +153 -0
  416. package/dist/tui/theme.d.ts +31 -0
  417. package/dist/tui/theme.js +199 -0
  418. package/dist/tui/tui.d.ts +103 -0
  419. package/dist/tui/tui.js +363 -0
  420. package/dist/tui/vt-screen.d.ts +46 -0
  421. package/dist/tui/vt-screen.js +251 -0
  422. package/dist/tui.d.ts +30 -0
  423. package/dist/tui.js +31 -0
  424. package/dist/version.d.ts +8 -0
  425. package/dist/version.js +24 -0
  426. package/docs/codemode.md +102 -0
  427. package/docs/hooks.md +196 -0
  428. package/docs/host-api.md +161 -0
  429. package/docs/providers.md +531 -0
  430. package/docs/rpc.md +253 -0
  431. package/docs/session-format.md +119 -0
  432. package/docs/tui.md +170 -0
  433. package/package.json +101 -4
@@ -0,0 +1,29 @@
1
+ /**
2
+ * 按路径串行化读 - 改 - 写(设计 §1.2)。[B3]
3
+ *
4
+ * 同一绝对路径上的 write / edit 排队执行;不同路径互不阻塞。前一个失败不影响后一个。
5
+ */
6
+ import { resolve } from "node:path";
7
+ const tails = new Map();
8
+ function keyOf(path) {
9
+ const abs = resolve(path);
10
+ return process.platform === "win32" || process.platform === "darwin" ? abs.toLowerCase() : abs;
11
+ }
12
+ export async function withFileMutex(path, fn) {
13
+ const key = keyOf(path);
14
+ const previous = tails.get(key) ?? Promise.resolve();
15
+ const run = previous.then(fn, fn);
16
+ const tail = run.then(() => undefined, () => undefined);
17
+ tails.set(key, tail);
18
+ try {
19
+ return await run;
20
+ }
21
+ finally {
22
+ if (tails.get(key) === tail)
23
+ tails.delete(key);
24
+ }
25
+ }
26
+ /** 当前持有队列的路径数(测试用)。 */
27
+ export function pendingMutexCount() {
28
+ return tails.size;
29
+ }
@@ -0,0 +1,44 @@
1
+ /**
2
+ * 内置 glob(设计 §5.2 glob)。[B3]
3
+ *
4
+ * 语法:`*`(不跨 `/`)、`?`、`**`(零或多段)、`[abc]` / `[a-z]` / `[!x]`、`{a,b}`(可嵌套)、`\` 转义;
5
+ * 以 `!` 开头的模式是排除。不含 `/` 的模式匹配**文件名**(任意深度),含 `/` 的匹配相对搜索根的
6
+ * 路径。点文件同样参与匹配(`.git` 由遍历层排除)。Windows 上大小写不敏感。
7
+ *
8
+ * 工具:遍历尊重 `.gitignore` / `.ignore`,按 mtime 倒序,缺省上限 1000。
9
+ */
10
+ import type { ToolContext, ToolDefinition, ToolResult } from "./types.js";
11
+ export interface GlobBodyOptions {
12
+ /** 是否识别 `{a,b}`(gitignore 不识别)。 */
13
+ braces?: boolean;
14
+ }
15
+ /** 把 glob 翻译成不带锚点的正则源。 */
16
+ export declare function globBody(pattern: string, options?: GlobBodyOptions): string;
17
+ export interface GlobMatchOptions {
18
+ nocase?: boolean;
19
+ }
20
+ export declare function globToRegExp(pattern: string, options?: GlobMatchOptions): RegExp;
21
+ /** 多模式匹配器:正模式取并集,`!` 模式排除;只有排除模式时视为全集减排除。 */
22
+ export declare class GlobMatcher {
23
+ private readonly include;
24
+ private readonly exclude;
25
+ constructor(patterns: string | readonly string[], options?: GlobMatchOptions);
26
+ private static hit;
27
+ /** `rel` 为相对搜索根的 `/` 分隔路径。 */
28
+ matches(rel: string): boolean;
29
+ }
30
+ export interface GlobInput {
31
+ pattern: string;
32
+ path?: string;
33
+ limit?: number;
34
+ }
35
+ export declare const DEFAULT_GLOB_LIMIT = 1000;
36
+ export interface GlobMatchFile {
37
+ abs: string;
38
+ rel: string;
39
+ mtimeMs: number;
40
+ }
41
+ /** 收集匹配文件并按 mtime 倒序(同 mtime 按路径)。 */
42
+ export declare function globFiles(root: string, pattern: string | readonly string[], signal?: AbortSignal): Promise<GlobMatchFile[]>;
43
+ export declare function executeGlob(input: GlobInput, ctx: ToolContext): Promise<ToolResult>;
44
+ export declare function createGlobTool(): ToolDefinition<GlobInput>;
@@ -0,0 +1,217 @@
1
+ /**
2
+ * 内置 glob(设计 §5.2 glob)。[B3]
3
+ *
4
+ * 语法:`*`(不跨 `/`)、`?`、`**`(零或多段)、`[abc]` / `[a-z]` / `[!x]`、`{a,b}`(可嵌套)、`\` 转义;
5
+ * 以 `!` 开头的模式是排除。不含 `/` 的模式匹配**文件名**(任意深度),含 `/` 的匹配相对搜索根的
6
+ * 路径。点文件同样参与匹配(`.git` 由遍历层排除)。Windows 上大小写不敏感。
7
+ *
8
+ * 工具:遍历尊重 `.gitignore` / `.ignore`,按 mtime 倒序,缺省上限 1000。
9
+ */
10
+ import { stat } from "node:fs/promises";
11
+ import { displayPath, resolvePath } from "./paths.js";
12
+ import { walk } from "./ignore.js";
13
+ const REGEX_SPECIAL = /[.+^${}()|[\]\\*?]/;
14
+ function escapeChar(ch) {
15
+ return REGEX_SPECIAL.test(ch) || ch === "/" ? `\\${ch}` : ch;
16
+ }
17
+ /** 从 `start`(指向 `[`)解析字符类,返回 [正则片段, 结束下标];不闭合返回 undefined。 */
18
+ function parseClass(p, start) {
19
+ let i = start + 1;
20
+ let negate = false;
21
+ if (p[i] === "!" || p[i] === "^") {
22
+ negate = true;
23
+ i++;
24
+ }
25
+ let body = "";
26
+ let first = true;
27
+ while (i < p.length) {
28
+ const ch = p[i];
29
+ if (ch === "]" && !first) {
30
+ return [`[${negate ? "^" : ""}${body}${negate ? "/" : ""}]`, i];
31
+ }
32
+ if (ch === "\\" && i + 1 < p.length) {
33
+ body += `\\${p[i + 1]}`;
34
+ i += 2;
35
+ }
36
+ else {
37
+ body += ch === "\\" || ch === "]" || ch === "[" || ch === "^" ? `\\${ch}` : ch;
38
+ i++;
39
+ }
40
+ first = false;
41
+ }
42
+ return undefined;
43
+ }
44
+ /** 与 `{` 配对的 `}` 下标;无则 -1。 */
45
+ function matchingBrace(p, start) {
46
+ let depth = 0;
47
+ for (let i = start; i < p.length; i++) {
48
+ const ch = p[i];
49
+ if (ch === "\\")
50
+ i++;
51
+ else if (ch === "{")
52
+ depth++;
53
+ else if (ch === "}" && --depth === 0)
54
+ return i;
55
+ }
56
+ return -1;
57
+ }
58
+ /** 把 glob 翻译成不带锚点的正则源。 */
59
+ export function globBody(pattern, options = {}) {
60
+ const braces = options.braces ?? true;
61
+ let out = "";
62
+ const closers = [];
63
+ for (let i = 0; i < pattern.length; i++) {
64
+ const ch = pattern[i];
65
+ if (ch === "\\" && i + 1 < pattern.length) {
66
+ out += escapeChar(pattern[++i]);
67
+ }
68
+ else if (ch === "*") {
69
+ if (pattern[i + 1] === "*") {
70
+ const atStart = i === 0 || pattern[i - 1] === "/";
71
+ const next = pattern[i + 2];
72
+ if (atStart && next === "/") {
73
+ out += "(?:[^/]*/)*";
74
+ i += 2;
75
+ }
76
+ else if (atStart && next === undefined) {
77
+ out += ".*";
78
+ i += 1;
79
+ }
80
+ else {
81
+ out += "[^/]*";
82
+ i += 1;
83
+ }
84
+ }
85
+ else {
86
+ out += "[^/]*";
87
+ }
88
+ }
89
+ else if (ch === "?") {
90
+ out += "[^/]";
91
+ }
92
+ else if (ch === "[") {
93
+ const cls = parseClass(pattern, i);
94
+ if (cls) {
95
+ out += cls[0];
96
+ i = cls[1];
97
+ }
98
+ else
99
+ out += "\\[";
100
+ }
101
+ else if (braces && ch === "{" && matchingBrace(pattern, i) > 0) {
102
+ closers.push(matchingBrace(pattern, i));
103
+ out += "(?:";
104
+ }
105
+ else if (braces && ch === "," && closers.length > 0) {
106
+ out += "|";
107
+ }
108
+ else if (braces && ch === "}" && closers[closers.length - 1] === i) {
109
+ closers.pop();
110
+ out += ")";
111
+ }
112
+ else {
113
+ out += escapeChar(ch);
114
+ }
115
+ }
116
+ return out;
117
+ }
118
+ export function globToRegExp(pattern, options = {}) {
119
+ return new RegExp(`^${globBody(pattern)}$`, options.nocase ? "i" : "");
120
+ }
121
+ /** 多模式匹配器:正模式取并集,`!` 模式排除;只有排除模式时视为全集减排除。 */
122
+ export class GlobMatcher {
123
+ include = [];
124
+ exclude = [];
125
+ constructor(patterns, options = {}) {
126
+ const nocase = options.nocase ?? process.platform === "win32";
127
+ for (const raw of typeof patterns === "string" ? [patterns] : patterns) {
128
+ const negate = raw.startsWith("!");
129
+ let p = negate ? raw.slice(1) : raw;
130
+ if (p.startsWith("./"))
131
+ p = p.slice(2);
132
+ if (p === "")
133
+ continue;
134
+ const compiled = { regex: globToRegExp(p, { nocase }), basename: !p.includes("/") };
135
+ (negate ? this.exclude : this.include).push(compiled);
136
+ }
137
+ }
138
+ static hit(g, rel) {
139
+ const target = g.basename ? (rel.split("/").pop() ?? rel) : rel;
140
+ return g.regex.test(target);
141
+ }
142
+ /** `rel` 为相对搜索根的 `/` 分隔路径。 */
143
+ matches(rel) {
144
+ const included = this.include.length === 0 || this.include.some((g) => GlobMatcher.hit(g, rel));
145
+ return included && !this.exclude.some((g) => GlobMatcher.hit(g, rel));
146
+ }
147
+ }
148
+ export const DEFAULT_GLOB_LIMIT = 1000;
149
+ /** 收集匹配文件并按 mtime 倒序(同 mtime 按路径)。 */
150
+ export async function globFiles(root, pattern, signal) {
151
+ const matcher = new GlobMatcher(pattern);
152
+ const found = [];
153
+ for await (const entry of walk(root, signal ? { signal } : {})) {
154
+ if (entry.isDir || !matcher.matches(entry.rel))
155
+ continue;
156
+ let mtimeMs = 0;
157
+ try {
158
+ mtimeMs = (await stat(entry.abs)).mtimeMs;
159
+ }
160
+ catch {
161
+ continue;
162
+ }
163
+ found.push({ abs: entry.abs, rel: entry.rel, mtimeMs });
164
+ }
165
+ found.sort((a, b) => b.mtimeMs - a.mtimeMs || a.rel.localeCompare(b.rel));
166
+ return found;
167
+ }
168
+ export async function executeGlob(input, ctx) {
169
+ if (typeof input.pattern !== "string" || input.pattern === "") {
170
+ return { content: "pattern must be a non-empty string", isError: true };
171
+ }
172
+ const limit = input.limit ?? DEFAULT_GLOB_LIMIT;
173
+ if (!Number.isInteger(limit) || limit < 1) {
174
+ return { content: "limit must be an integer ≥ 1", isError: true };
175
+ }
176
+ const root = resolvePath(input.path ?? ".", ctx.cwd);
177
+ try {
178
+ if (!(await stat(root)).isDirectory()) {
179
+ return { content: `${displayPath(root, ctx.cwd)} is not a directory`, isError: true };
180
+ }
181
+ }
182
+ catch {
183
+ return { content: `Directory not found: ${displayPath(root, ctx.cwd)}`, isError: true };
184
+ }
185
+ const files = await globFiles(root, input.pattern, ctx.signal);
186
+ if (files.length === 0)
187
+ return { content: "No files found", details: { count: 0 } };
188
+ const shown = files.slice(0, limit).map((f) => displayPath(f.abs, ctx.cwd));
189
+ let content = shown.join("\n");
190
+ if (files.length > limit) {
191
+ content += `\n\n[${files.length} files matched; showing the ${limit} most recently modified. Narrow the pattern or raise limit.]`;
192
+ }
193
+ return { content, details: { count: files.length, truncated: files.length > limit } };
194
+ }
195
+ export function createGlobTool() {
196
+ return {
197
+ name: "glob",
198
+ label: "Glob",
199
+ description: "Find files by glob (`**`, `*`, `?`, `[...]`, `{a,b}`, leading `!` excludes). " +
200
+ "Patterns without `/` match names at any depth. Respects .gitignore/.ignore; newest first.",
201
+ parameters: {
202
+ type: "object",
203
+ properties: {
204
+ pattern: { type: "string", description: "e.g. **/*.ts" },
205
+ path: { type: "string", description: "Directory (default: cwd)" },
206
+ limit: { type: "integer", description: `Default ${DEFAULT_GLOB_LIMIT}` },
207
+ },
208
+ required: ["pattern"],
209
+ additionalProperties: false,
210
+ },
211
+ permission: "read",
212
+ executionMode: "parallel",
213
+ annotations: { readOnly: true },
214
+ promptSnippet: "glob: find files by name pattern",
215
+ execute: executeGlob,
216
+ };
217
+ }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * 内置正则搜索(设计 §5.2 grep)。[B3]
3
+ *
4
+ * - 遍历尊重 `.gitignore` / `.ignore`;跳过二进制(NUL 嗅探)与 > 2 MB 文件;每批并发 16 个文件;
5
+ * - 文件按路径排序处理,输出确定;匹配行 `path:line: text`,上下文行 `path-line- text`,
6
+ * 不相邻的组之间 `--`;匹配行截 500 字符;
7
+ * - 匹配数到 limit(缺省 100)即停并提示;整体输出再按 50 KB 头截断。
8
+ */
9
+ import type { ToolContext, ToolDefinition, ToolResult } from "./types.js";
10
+ export interface GrepInput {
11
+ pattern: string;
12
+ path?: string;
13
+ glob?: string;
14
+ ignoreCase?: boolean;
15
+ literal?: boolean;
16
+ context?: number;
17
+ limit?: number;
18
+ }
19
+ export declare const DEFAULT_GREP_LIMIT = 100;
20
+ export declare const GREP_MAX_FILE_BYTES: number;
21
+ export declare const GREP_CONCURRENCY = 16;
22
+ export interface GrepMatch {
23
+ file: string;
24
+ line: number;
25
+ text: string;
26
+ }
27
+ export declare function compilePattern(input: Pick<GrepInput, "pattern" | "ignoreCase" | "literal">): RegExp;
28
+ interface FileHits {
29
+ lines: string[];
30
+ hits: number[];
31
+ }
32
+ /** 一个文件的输出块;`budget` 是还允许输出的匹配数。 */
33
+ export declare function formatFileHits(shown: string, file: FileHits, context: number, budget: number): {
34
+ text: string[];
35
+ used: number;
36
+ };
37
+ export declare function executeGrep(input: GrepInput, ctx: ToolContext): Promise<ToolResult>;
38
+ export declare function createGrepTool(): ToolDefinition<GrepInput>;
39
+ export {};
@@ -0,0 +1,179 @@
1
+ /**
2
+ * 内置正则搜索(设计 §5.2 grep)。[B3]
3
+ *
4
+ * - 遍历尊重 `.gitignore` / `.ignore`;跳过二进制(NUL 嗅探)与 > 2 MB 文件;每批并发 16 个文件;
5
+ * - 文件按路径排序处理,输出确定;匹配行 `path:line: text`,上下文行 `path-line- text`,
6
+ * 不相邻的组之间 `--`;匹配行截 500 字符;
7
+ * - 匹配数到 limit(缺省 100)即停并提示;整体输出再按 50 KB 头截断。
8
+ */
9
+ import { readFile, stat } from "node:fs/promises";
10
+ import { displayPath, resolvePath } from "./paths.js";
11
+ import { walk } from "./ignore.js";
12
+ import { GlobMatcher } from "./glob.js";
13
+ import { isBinary } from "./read.js";
14
+ import { DEFAULT_MAX_BYTES, truncateHead, truncateLine } from "./truncate.js";
15
+ export const DEFAULT_GREP_LIMIT = 100;
16
+ export const GREP_MAX_FILE_BYTES = 2 * 1024 * 1024;
17
+ export const GREP_CONCURRENCY = 16;
18
+ const MAX_CONTEXT = 5;
19
+ function escapeRegExp(text) {
20
+ return text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
21
+ }
22
+ export function compilePattern(input) {
23
+ const source = input.literal ? escapeRegExp(input.pattern) : input.pattern;
24
+ return new RegExp(source, input.ignoreCase ? "i" : "");
25
+ }
26
+ async function searchFile(abs, regex) {
27
+ try {
28
+ const info = await stat(abs);
29
+ if (!info.isFile() || info.size > GREP_MAX_FILE_BYTES)
30
+ return undefined;
31
+ const buf = await readFile(abs);
32
+ if (isBinary(buf))
33
+ return undefined;
34
+ const lines = buf.toString("utf8").replace(/\r\n/g, "\n").split("\n");
35
+ if (lines[lines.length - 1] === "")
36
+ lines.pop();
37
+ const hits = [];
38
+ lines.forEach((line, i) => {
39
+ if (regex.test(line))
40
+ hits.push(i);
41
+ });
42
+ return hits.length > 0 ? { lines, hits } : undefined;
43
+ }
44
+ catch {
45
+ return undefined;
46
+ }
47
+ }
48
+ /** 一个文件的输出块;`budget` 是还允许输出的匹配数。 */
49
+ export function formatFileHits(shown, file, context, budget) {
50
+ const hits = file.hits.slice(0, budget);
51
+ const out = [];
52
+ let lastPrinted = -1;
53
+ const hitSet = new Set(hits);
54
+ for (const hit of hits) {
55
+ const from = Math.max(0, hit - context);
56
+ const to = Math.min(file.lines.length - 1, hit + context);
57
+ if (context > 0 && lastPrinted >= 0 && from > lastPrinted + 1)
58
+ out.push("--");
59
+ for (let i = Math.max(from, lastPrinted + 1); i <= to; i++) {
60
+ const sep = hitSet.has(i) ? ":" : "-";
61
+ out.push(`${shown}${sep}${i + 1}${sep} ${truncateLine(file.lines[i] ?? "")}`);
62
+ }
63
+ lastPrinted = Math.max(lastPrinted, to);
64
+ }
65
+ return { text: out, used: hits.length };
66
+ }
67
+ async function candidateFiles(root, isFile, glob, signal) {
68
+ if (isFile)
69
+ return [root];
70
+ const matcher = glob ? new GlobMatcher(glob) : undefined;
71
+ const files = [];
72
+ for await (const entry of walk(root, { signal })) {
73
+ if (entry.isDir)
74
+ continue;
75
+ if (matcher && !matcher.matches(entry.rel))
76
+ continue;
77
+ files.push(entry.abs);
78
+ }
79
+ return files;
80
+ }
81
+ export async function executeGrep(input, ctx) {
82
+ if (typeof input.pattern !== "string" || input.pattern === "") {
83
+ return { content: "pattern must be a non-empty string", isError: true };
84
+ }
85
+ let regex;
86
+ try {
87
+ regex = compilePattern(input);
88
+ }
89
+ catch (err) {
90
+ return { content: `Invalid regular expression: ${err.message}`, isError: true };
91
+ }
92
+ const context = Math.min(MAX_CONTEXT, Math.max(0, Math.floor(input.context ?? 0)));
93
+ const limit = input.limit ?? DEFAULT_GREP_LIMIT;
94
+ if (!Number.isInteger(limit) || limit < 1) {
95
+ return { content: "limit must be an integer ≥ 1", isError: true };
96
+ }
97
+ const root = resolvePath(input.path ?? ".", ctx.cwd);
98
+ let rootIsFile;
99
+ try {
100
+ rootIsFile = (await stat(root)).isFile();
101
+ }
102
+ catch {
103
+ return { content: `Path not found: ${displayPath(root, ctx.cwd)}`, isError: true };
104
+ }
105
+ const files = await candidateFiles(root, rootIsFile, input.glob, ctx.signal);
106
+ const blocks = [];
107
+ let matches = 0;
108
+ let matchedFiles = 0;
109
+ let limited = false;
110
+ outer: for (let i = 0; i < files.length; i += GREP_CONCURRENCY) {
111
+ if (ctx.signal.aborted)
112
+ return { content: "aborted by user", isError: true };
113
+ const batch = files.slice(i, i + GREP_CONCURRENCY);
114
+ const results = await Promise.all(batch.map((f) => searchFile(f, regex)));
115
+ for (let j = 0; j < batch.length; j++) {
116
+ const hits = results[j];
117
+ if (!hits)
118
+ continue;
119
+ if (matches >= limit) {
120
+ limited = true;
121
+ break outer;
122
+ }
123
+ const shown = displayPath(batch[j], ctx.cwd);
124
+ const block = formatFileHits(shown, hits, context, limit - matches);
125
+ blocks.push(block.text.join("\n"));
126
+ matches += block.used;
127
+ matchedFiles++;
128
+ if (block.used < hits.hits.length) {
129
+ limited = true;
130
+ break outer;
131
+ }
132
+ }
133
+ }
134
+ if (matches === 0)
135
+ return { content: "No matches found", details: { matches: 0, files: 0 } };
136
+ const joined = blocks.join(context > 0 ? "\n--\n" : "\n");
137
+ const cut = truncateHead(joined, {
138
+ maxLines: Number.MAX_SAFE_INTEGER,
139
+ maxBytes: DEFAULT_MAX_BYTES,
140
+ });
141
+ let content = cut.content;
142
+ if (limited) {
143
+ content += `\n\n[Stopped at ${limit} matches. Narrow the search or raise limit.]`;
144
+ }
145
+ else if (cut.truncated) {
146
+ content += "\n\n[Output truncated at 50 KB. Narrow the search.]";
147
+ }
148
+ return {
149
+ content,
150
+ details: { matches, files: matchedFiles, limited, truncated: cut.truncated },
151
+ };
152
+ }
153
+ export function createGrepTool() {
154
+ return {
155
+ name: "grep",
156
+ label: "Grep",
157
+ description: "Search file contents by JS regex. Respects .gitignore/.ignore; skips binary and >2 MB " +
158
+ "files. Output: `path:line: text`.",
159
+ parameters: {
160
+ type: "object",
161
+ properties: {
162
+ pattern: { type: "string" },
163
+ path: { type: "string", description: "File or dir (default: cwd)" },
164
+ glob: { type: "string", description: "File filter, e.g. *.ts" },
165
+ ignoreCase: { type: "boolean" },
166
+ literal: { type: "boolean" },
167
+ context: { type: "integer", description: "0-5 lines" },
168
+ limit: { type: "integer", description: `Default ${DEFAULT_GREP_LIMIT}` },
169
+ },
170
+ required: ["pattern"],
171
+ additionalProperties: false,
172
+ },
173
+ permission: "read",
174
+ executionMode: "parallel",
175
+ annotations: { readOnly: true },
176
+ promptSnippet: "grep: search file contents",
177
+ execute: executeGrep,
178
+ };
179
+ }
@@ -0,0 +1,40 @@
1
+ /**
2
+ * `.gitignore` / `.ignore` 解析与匹配,以及尊重它们的目录遍历(设计 §5.2 grep / glob)。[B3]
3
+ *
4
+ * 规则语义(gitignore 子集):空行与 `#` 注释;`\#`、`\!`、`\ ` 转义;`!` 取反;末尾 `/` 只匹配目录;
5
+ * 中间或开头含 `/` 的模式锚定在 ignore 文件所在目录,否则匹配任意深度的名字;`**` 的三种位置;
6
+ * 同一路径**最后**命中的规则生效;被忽略的目录不再下钻(其下的取反规则无效,与 git 一致)。
7
+ * 嵌套:每个目录的 `.gitignore` 先、`.ignore` 后(后者优先);从搜索根向上到仓库根(含 `.git` 的
8
+ * 目录)的祖先 ignore 文件也生效。`.git` 目录永远跳过;目录符号链接不跟随。
9
+ */
10
+ export interface IgnoreRule {
11
+ negate: boolean;
12
+ dirOnly: boolean;
13
+ regex: RegExp;
14
+ /** ignore 文件所在目录(绝对路径,`/` 分隔,无尾斜杠)。 */
15
+ base: string;
16
+ source: string;
17
+ }
18
+ export declare const IGNORE_FILES: readonly [".gitignore", ".ignore"];
19
+ /** 解析一行;空 / 注释返回 undefined。 */
20
+ export declare function parseIgnoreLine(rawLine: string, base: string, nocase?: boolean): IgnoreRule | undefined;
21
+ export declare function parseIgnoreFile(content: string, base: string, nocase?: boolean): IgnoreRule[];
22
+ /** 按规则顺序求值,最后命中者生效。 */
23
+ export declare function isIgnoredBy(rules: readonly IgnoreRule[], absPath: string, isDir: boolean): boolean;
24
+ /** 搜索根之上、直到仓库根(含 `.git` 的目录)的祖先 ignore 规则,外层在前。 */
25
+ export declare function ancestorRules(root: string, nocase?: boolean): Promise<IgnoreRule[]>;
26
+ export interface WalkEntry {
27
+ abs: string;
28
+ /** 相对遍历根,`/` 分隔。 */
29
+ rel: string;
30
+ isDir: boolean;
31
+ }
32
+ export interface WalkOptions {
33
+ /** 缺省 true。 */
34
+ respectIgnore?: boolean;
35
+ signal?: AbortSignal;
36
+ /** 只在 Windows 上缺省大小写不敏感。 */
37
+ nocase?: boolean;
38
+ }
39
+ /** 深度优先、目录内按名字排序的遍历;产出文件与目录(目录先于其内容)。 */
40
+ export declare function walk(root: string, options?: WalkOptions): AsyncGenerator<WalkEntry>;