@smthrs/std 0.0.0-stage → 1.0.0-rc.12

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 (582) hide show
  1. package/CHANGELOG.md +148 -0
  2. package/LICENSE +21 -0
  3. package/README.md +156 -2
  4. package/dist/cjs/ApplyPatch.d.ts +174 -0
  5. package/dist/cjs/ApplyPatch.d.ts.map +1 -0
  6. package/dist/cjs/ApplyPatch.js +309 -0
  7. package/dist/cjs/ApplyPatch.js.map +7 -0
  8. package/dist/cjs/Bash.d.ts +390 -0
  9. package/dist/cjs/Bash.d.ts.map +1 -0
  10. package/dist/cjs/Bash.js +333 -0
  11. package/dist/cjs/Bash.js.map +7 -0
  12. package/dist/cjs/Checkpoints.d.ts +322 -0
  13. package/dist/cjs/Checkpoints.d.ts.map +1 -0
  14. package/dist/cjs/Checkpoints.js +233 -0
  15. package/dist/cjs/Checkpoints.js.map +7 -0
  16. package/dist/cjs/Container.d.ts +132 -0
  17. package/dist/cjs/Container.d.ts.map +1 -0
  18. package/dist/cjs/Container.js +113 -0
  19. package/dist/cjs/Container.js.map +7 -0
  20. package/dist/cjs/Edit.d.ts +203 -0
  21. package/dist/cjs/Edit.d.ts.map +1 -0
  22. package/dist/cjs/Edit.js +258 -0
  23. package/dist/cjs/Edit.js.map +7 -0
  24. package/dist/cjs/ExaWebSearch.d.ts +22 -0
  25. package/dist/cjs/ExaWebSearch.d.ts.map +1 -0
  26. package/dist/cjs/ExaWebSearch.js +138 -0
  27. package/dist/cjs/ExaWebSearch.js.map +7 -0
  28. package/dist/cjs/Explore.d.ts +328 -0
  29. package/dist/cjs/Explore.d.ts.map +1 -0
  30. package/dist/cjs/Explore.js +90 -0
  31. package/dist/cjs/Explore.js.map +7 -0
  32. package/dist/cjs/Fetch.d.ts +130 -0
  33. package/dist/cjs/Fetch.d.ts.map +1 -0
  34. package/dist/cjs/Fetch.js +64 -0
  35. package/dist/cjs/Fetch.js.map +7 -0
  36. package/dist/cjs/Glob.d.ts +204 -0
  37. package/dist/cjs/Glob.d.ts.map +1 -0
  38. package/dist/cjs/Glob.js +94 -0
  39. package/dist/cjs/Glob.js.map +7 -0
  40. package/dist/cjs/Grep.d.ts +347 -0
  41. package/dist/cjs/Grep.d.ts.map +1 -0
  42. package/dist/cjs/Grep.js +181 -0
  43. package/dist/cjs/Grep.js.map +7 -0
  44. package/dist/cjs/HttpPost.d.ts +130 -0
  45. package/dist/cjs/HttpPost.d.ts.map +1 -0
  46. package/dist/cjs/HttpPost.js +72 -0
  47. package/dist/cjs/HttpPost.js.map +7 -0
  48. package/dist/cjs/LanguageServer.d.ts +90 -0
  49. package/dist/cjs/LanguageServer.d.ts.map +1 -0
  50. package/dist/cjs/LanguageServer.js +60 -0
  51. package/dist/cjs/LanguageServer.js.map +7 -0
  52. package/dist/cjs/Ls.d.ts +164 -0
  53. package/dist/cjs/Ls.d.ts.map +1 -0
  54. package/dist/cjs/Ls.js +136 -0
  55. package/dist/cjs/Ls.js.map +7 -0
  56. package/dist/cjs/Lsp.d.ts +125 -0
  57. package/dist/cjs/Lsp.d.ts.map +1 -0
  58. package/dist/cjs/Lsp.js +137 -0
  59. package/dist/cjs/Lsp.js.map +7 -0
  60. package/dist/cjs/Manifest.d.ts +918 -0
  61. package/dist/cjs/Manifest.d.ts.map +1 -0
  62. package/dist/cjs/Manifest.js +144 -0
  63. package/dist/cjs/Manifest.js.map +7 -0
  64. package/dist/cjs/NativeSearch.d.ts +38 -0
  65. package/dist/cjs/NativeSearch.d.ts.map +1 -0
  66. package/dist/cjs/NativeSearch.js +326 -0
  67. package/dist/cjs/NativeSearch.js.map +7 -0
  68. package/dist/cjs/NodeLanguageServer.d.ts +128 -0
  69. package/dist/cjs/NodeLanguageServer.d.ts.map +1 -0
  70. package/dist/cjs/NodeLanguageServer.js +796 -0
  71. package/dist/cjs/NodeLanguageServer.js.map +7 -0
  72. package/dist/cjs/PortableSearch.d.ts +36 -0
  73. package/dist/cjs/PortableSearch.d.ts.map +1 -0
  74. package/dist/cjs/PortableSearch.js +240 -0
  75. package/dist/cjs/PortableSearch.js.map +7 -0
  76. package/dist/cjs/Probe.d.ts +193 -0
  77. package/dist/cjs/Probe.d.ts.map +1 -0
  78. package/dist/cjs/Probe.js +134 -0
  79. package/dist/cjs/Probe.js.map +7 -0
  80. package/dist/cjs/Read.d.ts +189 -0
  81. package/dist/cjs/Read.d.ts.map +1 -0
  82. package/dist/cjs/Read.js +223 -0
  83. package/dist/cjs/Read.js.map +7 -0
  84. package/dist/cjs/Relocate.d.ts +73 -0
  85. package/dist/cjs/Relocate.d.ts.map +1 -0
  86. package/dist/cjs/Relocate.js +72 -0
  87. package/dist/cjs/Relocate.js.map +7 -0
  88. package/dist/cjs/RemoteSearch.d.ts +54 -0
  89. package/dist/cjs/RemoteSearch.d.ts.map +1 -0
  90. package/dist/cjs/RemoteSearch.js +134 -0
  91. package/dist/cjs/RemoteSearch.js.map +7 -0
  92. package/dist/cjs/Search.d.ts +163 -0
  93. package/dist/cjs/Search.d.ts.map +1 -0
  94. package/dist/cjs/Search.js +51 -0
  95. package/dist/cjs/Search.js.map +7 -0
  96. package/dist/cjs/SearchConformance.d.ts +115 -0
  97. package/dist/cjs/SearchConformance.d.ts.map +1 -0
  98. package/dist/cjs/SearchConformance.js +172 -0
  99. package/dist/cjs/SearchConformance.js.map +7 -0
  100. package/dist/cjs/SearchContract.d.ts +114 -0
  101. package/dist/cjs/SearchContract.d.ts.map +1 -0
  102. package/dist/cjs/SearchContract.js +339 -0
  103. package/dist/cjs/SearchContract.js.map +7 -0
  104. package/dist/cjs/ShellCommand.d.ts +164 -0
  105. package/dist/cjs/ShellCommand.d.ts.map +1 -0
  106. package/dist/cjs/ShellCommand.js +102 -0
  107. package/dist/cjs/ShellCommand.js.map +7 -0
  108. package/dist/cjs/StdError.d.ts +55 -0
  109. package/dist/cjs/StdError.d.ts.map +1 -0
  110. package/dist/cjs/StdError.js +74 -0
  111. package/dist/cjs/StdError.js.map +7 -0
  112. package/dist/cjs/TestRun.d.ts +311 -0
  113. package/dist/cjs/TestRun.d.ts.map +1 -0
  114. package/dist/cjs/TestRun.js +228 -0
  115. package/dist/cjs/TestRun.js.map +7 -0
  116. package/dist/cjs/TestRunner.d.ts +102 -0
  117. package/dist/cjs/TestRunner.d.ts.map +1 -0
  118. package/dist/cjs/TestRunner.js +54 -0
  119. package/dist/cjs/TestRunner.js.map +7 -0
  120. package/dist/cjs/TreeFingerprint.d.ts +140 -0
  121. package/dist/cjs/TreeFingerprint.d.ts.map +1 -0
  122. package/dist/cjs/TreeFingerprint.js +87 -0
  123. package/dist/cjs/TreeFingerprint.js.map +7 -0
  124. package/dist/cjs/UpdatePlan.d.ts +152 -0
  125. package/dist/cjs/UpdatePlan.d.ts.map +1 -0
  126. package/dist/cjs/UpdatePlan.js +87 -0
  127. package/dist/cjs/UpdatePlan.js.map +7 -0
  128. package/dist/cjs/WebFetch.d.ts +134 -0
  129. package/dist/cjs/WebFetch.d.ts.map +1 -0
  130. package/dist/cjs/WebFetch.js +140 -0
  131. package/dist/cjs/WebFetch.js.map +7 -0
  132. package/dist/cjs/WebSearch.d.ts +181 -0
  133. package/dist/cjs/WebSearch.d.ts.map +1 -0
  134. package/dist/cjs/WebSearch.js +86 -0
  135. package/dist/cjs/WebSearch.js.map +7 -0
  136. package/dist/cjs/Write.d.ts +147 -0
  137. package/dist/cjs/Write.d.ts.map +1 -0
  138. package/dist/cjs/Write.js +122 -0
  139. package/dist/cjs/Write.js.map +7 -0
  140. package/dist/cjs/index.d.ts +129 -0
  141. package/dist/cjs/index.d.ts.map +1 -0
  142. package/dist/cjs/index.js +101 -0
  143. package/dist/cjs/index.js.map +7 -0
  144. package/dist/cjs/internal/ApplyPatch.d.ts +145 -0
  145. package/dist/cjs/internal/ApplyPatch.d.ts.map +1 -0
  146. package/dist/cjs/internal/ApplyPatch.js +462 -0
  147. package/dist/cjs/internal/ApplyPatch.js.map +7 -0
  148. package/dist/cjs/internal/CodexText.d.ts +73 -0
  149. package/dist/cjs/internal/CodexText.d.ts.map +1 -0
  150. package/dist/cjs/internal/CodexText.js +108 -0
  151. package/dist/cjs/internal/CodexText.js.map +7 -0
  152. package/dist/cjs/internal/Declaration.d.ts +49 -0
  153. package/dist/cjs/internal/Declaration.d.ts.map +1 -0
  154. package/dist/cjs/internal/Declaration.js +46 -0
  155. package/dist/cjs/internal/Declaration.js.map +7 -0
  156. package/dist/cjs/internal/Diagnostics.d.ts +77 -0
  157. package/dist/cjs/internal/Diagnostics.d.ts.map +1 -0
  158. package/dist/cjs/internal/Diagnostics.js +89 -0
  159. package/dist/cjs/internal/Diagnostics.js.map +7 -0
  160. package/dist/cjs/internal/EnvelopePrecheck.d.ts +69 -0
  161. package/dist/cjs/internal/EnvelopePrecheck.d.ts.map +1 -0
  162. package/dist/cjs/internal/EnvelopePrecheck.js +323 -0
  163. package/dist/cjs/internal/EnvelopePrecheck.js.map +7 -0
  164. package/dist/cjs/internal/Exec.d.ts +151 -0
  165. package/dist/cjs/internal/Exec.d.ts.map +1 -0
  166. package/dist/cjs/internal/Exec.js +207 -0
  167. package/dist/cjs/internal/Exec.js.map +7 -0
  168. package/dist/cjs/internal/FileMutation.d.ts +109 -0
  169. package/dist/cjs/internal/FileMutation.d.ts.map +1 -0
  170. package/dist/cjs/internal/FileMutation.js +116 -0
  171. package/dist/cjs/internal/FileMutation.js.map +7 -0
  172. package/dist/cjs/internal/FsFailure.d.ts +38 -0
  173. package/dist/cjs/internal/FsFailure.d.ts.map +1 -0
  174. package/dist/cjs/internal/FsFailure.js +40 -0
  175. package/dist/cjs/internal/FsFailure.js.map +7 -0
  176. package/dist/cjs/internal/GitWorktree.d.ts +108 -0
  177. package/dist/cjs/internal/GitWorktree.d.ts.map +1 -0
  178. package/dist/cjs/internal/GitWorktree.js +276 -0
  179. package/dist/cjs/internal/GitWorktree.js.map +7 -0
  180. package/dist/cjs/internal/Grouping.d.ts +51 -0
  181. package/dist/cjs/internal/Grouping.d.ts.map +1 -0
  182. package/dist/cjs/internal/Grouping.js +83 -0
  183. package/dist/cjs/internal/Grouping.js.map +7 -0
  184. package/dist/cjs/internal/Html.d.ts +20 -0
  185. package/dist/cjs/internal/Html.d.ts.map +1 -0
  186. package/dist/cjs/internal/Html.js +81 -0
  187. package/dist/cjs/internal/Html.js.map +7 -0
  188. package/dist/cjs/internal/Http.d.ts +95 -0
  189. package/dist/cjs/internal/Http.d.ts.map +1 -0
  190. package/dist/cjs/internal/Http.js +153 -0
  191. package/dist/cjs/internal/Http.js.map +7 -0
  192. package/dist/cjs/internal/HttpNetwork.d.ts +27 -0
  193. package/dist/cjs/internal/HttpNetwork.d.ts.map +1 -0
  194. package/dist/cjs/internal/HttpNetwork.js +146 -0
  195. package/dist/cjs/internal/HttpNetwork.js.map +7 -0
  196. package/dist/cjs/internal/Ignore.d.ts +37 -0
  197. package/dist/cjs/internal/Ignore.d.ts.map +1 -0
  198. package/dist/cjs/internal/Ignore.js +100 -0
  199. package/dist/cjs/internal/Ignore.js.map +7 -0
  200. package/dist/cjs/internal/LinearRegex.d.ts +19 -0
  201. package/dist/cjs/internal/LinearRegex.d.ts.map +1 -0
  202. package/dist/cjs/internal/LinearRegex.js +166 -0
  203. package/dist/cjs/internal/LinearRegex.js.map +7 -0
  204. package/dist/cjs/internal/Match.d.ts +85 -0
  205. package/dist/cjs/internal/Match.d.ts.map +1 -0
  206. package/dist/cjs/internal/Match.js +99 -0
  207. package/dist/cjs/internal/Match.js.map +7 -0
  208. package/dist/cjs/internal/Paths.d.ts +23 -0
  209. package/dist/cjs/internal/Paths.d.ts.map +1 -0
  210. package/dist/cjs/internal/Paths.js +52 -0
  211. package/dist/cjs/internal/Paths.js.map +7 -0
  212. package/dist/cjs/internal/Preserve.d.ts +25 -0
  213. package/dist/cjs/internal/Preserve.d.ts.map +1 -0
  214. package/dist/cjs/internal/Preserve.js +88 -0
  215. package/dist/cjs/internal/Preserve.js.map +7 -0
  216. package/dist/cjs/internal/Prune.d.ts +35 -0
  217. package/dist/cjs/internal/Prune.d.ts.map +1 -0
  218. package/dist/cjs/internal/Prune.js +54 -0
  219. package/dist/cjs/internal/Prune.js.map +7 -0
  220. package/dist/cjs/internal/RemoteTree.d.ts +60 -0
  221. package/dist/cjs/internal/RemoteTree.d.ts.map +1 -0
  222. package/dist/cjs/internal/RemoteTree.js +123 -0
  223. package/dist/cjs/internal/RemoteTree.js.map +7 -0
  224. package/dist/cjs/internal/SearchContract.d.ts +63 -0
  225. package/dist/cjs/internal/SearchContract.d.ts.map +1 -0
  226. package/dist/cjs/internal/SearchContract.js +46 -0
  227. package/dist/cjs/internal/SearchContract.js.map +7 -0
  228. package/dist/cjs/internal/Symbols.d.ts +39 -0
  229. package/dist/cjs/internal/Symbols.d.ts.map +1 -0
  230. package/dist/cjs/internal/Symbols.js +59 -0
  231. package/dist/cjs/internal/Symbols.js.map +7 -0
  232. package/dist/cjs/internal/Tar.d.ts +23 -0
  233. package/dist/cjs/internal/Tar.d.ts.map +1 -0
  234. package/dist/cjs/internal/Tar.js +86 -0
  235. package/dist/cjs/internal/Tar.js.map +7 -0
  236. package/dist/cjs/internal/TestReport.d.ts +52 -0
  237. package/dist/cjs/internal/TestReport.d.ts.map +1 -0
  238. package/dist/cjs/internal/TestReport.js +131 -0
  239. package/dist/cjs/internal/TestReport.js.map +7 -0
  240. package/dist/cjs/internal/Text.d.ts +125 -0
  241. package/dist/cjs/internal/Text.d.ts.map +1 -0
  242. package/dist/cjs/internal/Text.js +85 -0
  243. package/dist/cjs/internal/Text.js.map +7 -0
  244. package/dist/cjs/internal/Url.d.ts +13 -0
  245. package/dist/cjs/internal/Url.d.ts.map +1 -0
  246. package/dist/cjs/internal/Url.js +35 -0
  247. package/dist/cjs/internal/Url.js.map +7 -0
  248. package/dist/cjs/internal/Walk.d.ts +72 -0
  249. package/dist/cjs/internal/Walk.d.ts.map +1 -0
  250. package/dist/cjs/internal/Walk.js +108 -0
  251. package/dist/cjs/internal/Walk.js.map +7 -0
  252. package/dist/cjs/package.json +1 -0
  253. package/dist/esm/ApplyPatch.d.ts +174 -0
  254. package/dist/esm/ApplyPatch.d.ts.map +1 -0
  255. package/dist/esm/ApplyPatch.js +346 -0
  256. package/dist/esm/ApplyPatch.js.map +1 -0
  257. package/dist/esm/Bash.d.ts +390 -0
  258. package/dist/esm/Bash.d.ts.map +1 -0
  259. package/dist/esm/Bash.js +514 -0
  260. package/dist/esm/Bash.js.map +1 -0
  261. package/dist/esm/Checkpoints.d.ts +322 -0
  262. package/dist/esm/Checkpoints.d.ts.map +1 -0
  263. package/dist/esm/Checkpoints.js +396 -0
  264. package/dist/esm/Checkpoints.js.map +1 -0
  265. package/dist/esm/Container.d.ts +132 -0
  266. package/dist/esm/Container.d.ts.map +1 -0
  267. package/dist/esm/Container.js +151 -0
  268. package/dist/esm/Container.js.map +1 -0
  269. package/dist/esm/Edit.d.ts +203 -0
  270. package/dist/esm/Edit.d.ts.map +1 -0
  271. package/dist/esm/Edit.js +296 -0
  272. package/dist/esm/Edit.js.map +1 -0
  273. package/dist/esm/ExaWebSearch.d.ts +22 -0
  274. package/dist/esm/ExaWebSearch.d.ts.map +1 -0
  275. package/dist/esm/ExaWebSearch.js +107 -0
  276. package/dist/esm/ExaWebSearch.js.map +1 -0
  277. package/dist/esm/Explore.d.ts +328 -0
  278. package/dist/esm/Explore.d.ts.map +1 -0
  279. package/dist/esm/Explore.js +106 -0
  280. package/dist/esm/Explore.js.map +1 -0
  281. package/dist/esm/Fetch.d.ts +130 -0
  282. package/dist/esm/Fetch.d.ts.map +1 -0
  283. package/dist/esm/Fetch.js +91 -0
  284. package/dist/esm/Fetch.js.map +1 -0
  285. package/dist/esm/Glob.d.ts +204 -0
  286. package/dist/esm/Glob.d.ts.map +1 -0
  287. package/dist/esm/Glob.js +177 -0
  288. package/dist/esm/Glob.js.map +1 -0
  289. package/dist/esm/Grep.d.ts +347 -0
  290. package/dist/esm/Grep.d.ts.map +1 -0
  291. package/dist/esm/Grep.js +289 -0
  292. package/dist/esm/Grep.js.map +1 -0
  293. package/dist/esm/HttpPost.d.ts +130 -0
  294. package/dist/esm/HttpPost.d.ts.map +1 -0
  295. package/dist/esm/HttpPost.js +89 -0
  296. package/dist/esm/HttpPost.js.map +1 -0
  297. package/dist/esm/LanguageServer.d.ts +90 -0
  298. package/dist/esm/LanguageServer.d.ts.map +1 -0
  299. package/dist/esm/LanguageServer.js +57 -0
  300. package/dist/esm/LanguageServer.js.map +1 -0
  301. package/dist/esm/Ls.d.ts +164 -0
  302. package/dist/esm/Ls.d.ts.map +1 -0
  303. package/dist/esm/Ls.js +178 -0
  304. package/dist/esm/Ls.js.map +1 -0
  305. package/dist/esm/Lsp.d.ts +125 -0
  306. package/dist/esm/Lsp.d.ts.map +1 -0
  307. package/dist/esm/Lsp.js +165 -0
  308. package/dist/esm/Lsp.js.map +1 -0
  309. package/dist/esm/Manifest.d.ts +918 -0
  310. package/dist/esm/Manifest.d.ts.map +1 -0
  311. package/dist/esm/Manifest.js +153 -0
  312. package/dist/esm/Manifest.js.map +1 -0
  313. package/dist/esm/NativeSearch.d.ts +38 -0
  314. package/dist/esm/NativeSearch.d.ts.map +1 -0
  315. package/dist/esm/NativeSearch.js +378 -0
  316. package/dist/esm/NativeSearch.js.map +1 -0
  317. package/dist/esm/NodeLanguageServer.d.ts +128 -0
  318. package/dist/esm/NodeLanguageServer.d.ts.map +1 -0
  319. package/dist/esm/NodeLanguageServer.js +843 -0
  320. package/dist/esm/NodeLanguageServer.js.map +1 -0
  321. package/dist/esm/PortableSearch.d.ts +36 -0
  322. package/dist/esm/PortableSearch.d.ts.map +1 -0
  323. package/dist/esm/PortableSearch.js +256 -0
  324. package/dist/esm/PortableSearch.js.map +1 -0
  325. package/dist/esm/Probe.d.ts +193 -0
  326. package/dist/esm/Probe.d.ts.map +1 -0
  327. package/dist/esm/Probe.js +225 -0
  328. package/dist/esm/Probe.js.map +1 -0
  329. package/dist/esm/Read.d.ts +189 -0
  330. package/dist/esm/Read.d.ts.map +1 -0
  331. package/dist/esm/Read.js +300 -0
  332. package/dist/esm/Read.js.map +1 -0
  333. package/dist/esm/Relocate.d.ts +73 -0
  334. package/dist/esm/Relocate.d.ts.map +1 -0
  335. package/dist/esm/Relocate.js +153 -0
  336. package/dist/esm/Relocate.js.map +1 -0
  337. package/dist/esm/RemoteSearch.d.ts +54 -0
  338. package/dist/esm/RemoteSearch.d.ts.map +1 -0
  339. package/dist/esm/RemoteSearch.js +162 -0
  340. package/dist/esm/RemoteSearch.js.map +1 -0
  341. package/dist/esm/Search.d.ts +163 -0
  342. package/dist/esm/Search.d.ts.map +1 -0
  343. package/dist/esm/Search.js +47 -0
  344. package/dist/esm/Search.js.map +1 -0
  345. package/dist/esm/SearchConformance.d.ts +115 -0
  346. package/dist/esm/SearchConformance.d.ts.map +1 -0
  347. package/dist/esm/SearchConformance.js +193 -0
  348. package/dist/esm/SearchConformance.js.map +1 -0
  349. package/dist/esm/SearchContract.d.ts +114 -0
  350. package/dist/esm/SearchContract.d.ts.map +1 -0
  351. package/dist/esm/SearchContract.js +461 -0
  352. package/dist/esm/SearchContract.js.map +1 -0
  353. package/dist/esm/ShellCommand.d.ts +164 -0
  354. package/dist/esm/ShellCommand.d.ts.map +1 -0
  355. package/dist/esm/ShellCommand.js +159 -0
  356. package/dist/esm/ShellCommand.js.map +1 -0
  357. package/dist/esm/StdError.d.ts +55 -0
  358. package/dist/esm/StdError.d.ts.map +1 -0
  359. package/dist/esm/StdError.js +71 -0
  360. package/dist/esm/StdError.js.map +1 -0
  361. package/dist/esm/TestRun.d.ts +311 -0
  362. package/dist/esm/TestRun.d.ts.map +1 -0
  363. package/dist/esm/TestRun.js +316 -0
  364. package/dist/esm/TestRun.js.map +1 -0
  365. package/dist/esm/TestRunner.d.ts +102 -0
  366. package/dist/esm/TestRunner.d.ts.map +1 -0
  367. package/dist/esm/TestRunner.js +68 -0
  368. package/dist/esm/TestRunner.js.map +1 -0
  369. package/dist/esm/TreeFingerprint.d.ts +140 -0
  370. package/dist/esm/TreeFingerprint.d.ts.map +1 -0
  371. package/dist/esm/TreeFingerprint.js +170 -0
  372. package/dist/esm/TreeFingerprint.js.map +1 -0
  373. package/dist/esm/UpdatePlan.d.ts +152 -0
  374. package/dist/esm/UpdatePlan.d.ts.map +1 -0
  375. package/dist/esm/UpdatePlan.js +129 -0
  376. package/dist/esm/UpdatePlan.js.map +1 -0
  377. package/dist/esm/WebFetch.d.ts +134 -0
  378. package/dist/esm/WebFetch.d.ts.map +1 -0
  379. package/dist/esm/WebFetch.js +151 -0
  380. package/dist/esm/WebFetch.js.map +1 -0
  381. package/dist/esm/WebSearch.d.ts +181 -0
  382. package/dist/esm/WebSearch.d.ts.map +1 -0
  383. package/dist/esm/WebSearch.js +134 -0
  384. package/dist/esm/WebSearch.js.map +1 -0
  385. package/dist/esm/Write.d.ts +147 -0
  386. package/dist/esm/Write.d.ts.map +1 -0
  387. package/dist/esm/Write.js +144 -0
  388. package/dist/esm/Write.js.map +1 -0
  389. package/dist/esm/index.d.ts +129 -0
  390. package/dist/esm/index.d.ts.map +1 -0
  391. package/dist/esm/index.js +129 -0
  392. package/dist/esm/index.js.map +1 -0
  393. package/dist/esm/internal/ApplyPatch.d.ts +145 -0
  394. package/dist/esm/internal/ApplyPatch.d.ts.map +1 -0
  395. package/dist/esm/internal/ApplyPatch.js +489 -0
  396. package/dist/esm/internal/ApplyPatch.js.map +1 -0
  397. package/dist/esm/internal/CodexText.d.ts +73 -0
  398. package/dist/esm/internal/CodexText.d.ts.map +1 -0
  399. package/dist/esm/internal/CodexText.js +156 -0
  400. package/dist/esm/internal/CodexText.js.map +1 -0
  401. package/dist/esm/internal/Declaration.d.ts +49 -0
  402. package/dist/esm/internal/Declaration.d.ts.map +1 -0
  403. package/dist/esm/internal/Declaration.js +42 -0
  404. package/dist/esm/internal/Declaration.js.map +1 -0
  405. package/dist/esm/internal/Diagnostics.d.ts +77 -0
  406. package/dist/esm/internal/Diagnostics.d.ts.map +1 -0
  407. package/dist/esm/internal/Diagnostics.js +99 -0
  408. package/dist/esm/internal/Diagnostics.js.map +1 -0
  409. package/dist/esm/internal/EnvelopePrecheck.d.ts +69 -0
  410. package/dist/esm/internal/EnvelopePrecheck.d.ts.map +1 -0
  411. package/dist/esm/internal/EnvelopePrecheck.js +426 -0
  412. package/dist/esm/internal/EnvelopePrecheck.js.map +1 -0
  413. package/dist/esm/internal/Exec.d.ts +151 -0
  414. package/dist/esm/internal/Exec.d.ts.map +1 -0
  415. package/dist/esm/internal/Exec.js +285 -0
  416. package/dist/esm/internal/Exec.js.map +1 -0
  417. package/dist/esm/internal/FileMutation.d.ts +109 -0
  418. package/dist/esm/internal/FileMutation.d.ts.map +1 -0
  419. package/dist/esm/internal/FileMutation.js +123 -0
  420. package/dist/esm/internal/FileMutation.js.map +1 -0
  421. package/dist/esm/internal/FsFailure.d.ts +38 -0
  422. package/dist/esm/internal/FsFailure.d.ts.map +1 -0
  423. package/dist/esm/internal/FsFailure.js +39 -0
  424. package/dist/esm/internal/FsFailure.js.map +1 -0
  425. package/dist/esm/internal/GitWorktree.d.ts +108 -0
  426. package/dist/esm/internal/GitWorktree.d.ts.map +1 -0
  427. package/dist/esm/internal/GitWorktree.js +352 -0
  428. package/dist/esm/internal/GitWorktree.js.map +1 -0
  429. package/dist/esm/internal/Grouping.d.ts +51 -0
  430. package/dist/esm/internal/Grouping.d.ts.map +1 -0
  431. package/dist/esm/internal/Grouping.js +99 -0
  432. package/dist/esm/internal/Grouping.js.map +1 -0
  433. package/dist/esm/internal/Html.d.ts +20 -0
  434. package/dist/esm/internal/Html.d.ts.map +1 -0
  435. package/dist/esm/internal/Html.js +70 -0
  436. package/dist/esm/internal/Html.js.map +1 -0
  437. package/dist/esm/internal/Http.d.ts +95 -0
  438. package/dist/esm/internal/Http.d.ts.map +1 -0
  439. package/dist/esm/internal/Http.js +154 -0
  440. package/dist/esm/internal/Http.js.map +1 -0
  441. package/dist/esm/internal/HttpNetwork.d.ts +27 -0
  442. package/dist/esm/internal/HttpNetwork.d.ts.map +1 -0
  443. package/dist/esm/internal/HttpNetwork.js +114 -0
  444. package/dist/esm/internal/HttpNetwork.js.map +1 -0
  445. package/dist/esm/internal/Ignore.d.ts +37 -0
  446. package/dist/esm/internal/Ignore.d.ts.map +1 -0
  447. package/dist/esm/internal/Ignore.js +128 -0
  448. package/dist/esm/internal/Ignore.js.map +1 -0
  449. package/dist/esm/internal/LinearRegex.d.ts +19 -0
  450. package/dist/esm/internal/LinearRegex.d.ts.map +1 -0
  451. package/dist/esm/internal/LinearRegex.js +176 -0
  452. package/dist/esm/internal/LinearRegex.js.map +1 -0
  453. package/dist/esm/internal/Match.d.ts +85 -0
  454. package/dist/esm/internal/Match.d.ts.map +1 -0
  455. package/dist/esm/internal/Match.js +142 -0
  456. package/dist/esm/internal/Match.js.map +1 -0
  457. package/dist/esm/internal/Paths.d.ts +23 -0
  458. package/dist/esm/internal/Paths.d.ts.map +1 -0
  459. package/dist/esm/internal/Paths.js +40 -0
  460. package/dist/esm/internal/Paths.js.map +1 -0
  461. package/dist/esm/internal/Preserve.d.ts +25 -0
  462. package/dist/esm/internal/Preserve.d.ts.map +1 -0
  463. package/dist/esm/internal/Preserve.js +70 -0
  464. package/dist/esm/internal/Preserve.js.map +1 -0
  465. package/dist/esm/internal/Prune.d.ts +35 -0
  466. package/dist/esm/internal/Prune.d.ts.map +1 -0
  467. package/dist/esm/internal/Prune.js +60 -0
  468. package/dist/esm/internal/Prune.js.map +1 -0
  469. package/dist/esm/internal/RemoteTree.d.ts +60 -0
  470. package/dist/esm/internal/RemoteTree.d.ts.map +1 -0
  471. package/dist/esm/internal/RemoteTree.js +132 -0
  472. package/dist/esm/internal/RemoteTree.js.map +1 -0
  473. package/dist/esm/internal/SearchContract.d.ts +63 -0
  474. package/dist/esm/internal/SearchContract.d.ts.map +1 -0
  475. package/dist/esm/internal/SearchContract.js +66 -0
  476. package/dist/esm/internal/SearchContract.js.map +1 -0
  477. package/dist/esm/internal/Symbols.d.ts +39 -0
  478. package/dist/esm/internal/Symbols.d.ts.map +1 -0
  479. package/dist/esm/internal/Symbols.js +79 -0
  480. package/dist/esm/internal/Symbols.js.map +1 -0
  481. package/dist/esm/internal/Tar.d.ts +23 -0
  482. package/dist/esm/internal/Tar.d.ts.map +1 -0
  483. package/dist/esm/internal/Tar.js +97 -0
  484. package/dist/esm/internal/Tar.js.map +1 -0
  485. package/dist/esm/internal/TestReport.d.ts +52 -0
  486. package/dist/esm/internal/TestReport.d.ts.map +1 -0
  487. package/dist/esm/internal/TestReport.js +172 -0
  488. package/dist/esm/internal/TestReport.js.map +1 -0
  489. package/dist/esm/internal/Text.d.ts +125 -0
  490. package/dist/esm/internal/Text.d.ts.map +1 -0
  491. package/dist/esm/internal/Text.js +141 -0
  492. package/dist/esm/internal/Text.js.map +1 -0
  493. package/dist/esm/internal/Url.d.ts +13 -0
  494. package/dist/esm/internal/Url.d.ts.map +1 -0
  495. package/dist/esm/internal/Url.js +27 -0
  496. package/dist/esm/internal/Url.js.map +1 -0
  497. package/dist/esm/internal/Walk.d.ts +72 -0
  498. package/dist/esm/internal/Walk.d.ts.map +1 -0
  499. package/dist/esm/internal/Walk.js +126 -0
  500. package/dist/esm/internal/Walk.js.map +1 -0
  501. package/docs/README.md +119 -0
  502. package/docs/api.md +499 -0
  503. package/docs/concepts/effects-and-capabilities.md +138 -0
  504. package/docs/concepts/flows-and-handlers.md +115 -0
  505. package/docs/concepts/limits-and-disclosure.md +105 -0
  506. package/docs/concepts/search-contract.md +182 -0
  507. package/docs/guides/bind-the-standard-flows.md +116 -0
  508. package/docs/guides/implement-a-search-peer.md +133 -0
  509. package/docs/guides/pin-a-checkpoint.md +161 -0
  510. package/docs/guides/query-a-language-server.md +257 -0
  511. package/docs/guides/reach-the-network.md +141 -0
  512. package/docs/guides/read-and-edit-a-file.md +240 -0
  513. package/docs/guides/run-a-shell-command.md +236 -0
  514. package/docs/guides/run-the-test-suite.md +154 -0
  515. package/docs/guides/search-a-workspace.md +148 -0
  516. package/docs/installation.md +115 -0
  517. package/docs/quickstart.md +125 -0
  518. package/docs/reference/flows.md +556 -0
  519. package/docs/troubleshooting.md +347 -0
  520. package/package.json +449 -3
  521. package/src/ApplyPatch.ts +458 -0
  522. package/src/Bash.ts +619 -0
  523. package/src/Checkpoints.ts +589 -0
  524. package/src/Container.ts +212 -0
  525. package/src/Edit.ts +366 -0
  526. package/src/ExaWebSearch.ts +145 -0
  527. package/src/Explore.ts +139 -0
  528. package/src/Fetch.ts +117 -0
  529. package/src/Glob.ts +200 -0
  530. package/src/Grep.ts +320 -0
  531. package/src/HttpPost.ts +120 -0
  532. package/src/LanguageServer.ts +110 -0
  533. package/src/Ls.ts +228 -0
  534. package/src/Lsp.ts +184 -0
  535. package/src/Manifest.ts +162 -0
  536. package/src/NativeSearch.ts +457 -0
  537. package/src/NodeLanguageServer.ts +1148 -0
  538. package/src/PortableSearch.ts +284 -0
  539. package/src/Probe.ts +284 -0
  540. package/src/Read.ts +359 -0
  541. package/src/Relocate.ts +166 -0
  542. package/src/RemoteSearch.ts +199 -0
  543. package/src/Search.ts +185 -0
  544. package/src/SearchConformance.ts +288 -0
  545. package/src/SearchContract.ts +489 -0
  546. package/src/ShellCommand.ts +201 -0
  547. package/src/StdError.ts +80 -0
  548. package/src/TestRun.ts +401 -0
  549. package/src/TestRunner.ts +119 -0
  550. package/src/TreeFingerprint.ts +200 -0
  551. package/src/UpdatePlan.ts +171 -0
  552. package/src/WebFetch.ts +194 -0
  553. package/src/WebSearch.ts +165 -0
  554. package/src/Write.ts +195 -0
  555. package/src/index.ts +157 -0
  556. package/src/internal/ApplyPatch.ts +601 -0
  557. package/src/internal/CodexText.ts +182 -0
  558. package/src/internal/Declaration.ts +60 -0
  559. package/src/internal/Diagnostics.ts +134 -0
  560. package/src/internal/EnvelopePrecheck.ts +489 -0
  561. package/src/internal/Exec.ts +427 -0
  562. package/src/internal/FileMutation.ts +231 -0
  563. package/src/internal/FsFailure.ts +51 -0
  564. package/src/internal/GitWorktree.ts +491 -0
  565. package/src/internal/Grouping.ts +106 -0
  566. package/src/internal/Html.ts +87 -0
  567. package/src/internal/Http.ts +209 -0
  568. package/src/internal/HttpNetwork.ts +153 -0
  569. package/src/internal/Ignore.ts +135 -0
  570. package/src/internal/LinearRegex.ts +173 -0
  571. package/src/internal/Match.ts +172 -0
  572. package/src/internal/Paths.ts +42 -0
  573. package/src/internal/Preserve.ts +108 -0
  574. package/src/internal/Prune.ts +62 -0
  575. package/src/internal/RemoteTree.ts +159 -0
  576. package/src/internal/SearchContract.ts +77 -0
  577. package/src/internal/Symbols.ts +88 -0
  578. package/src/internal/Tar.ts +95 -0
  579. package/src/internal/TestReport.ts +194 -0
  580. package/src/internal/Text.ts +185 -0
  581. package/src/internal/Url.ts +23 -0
  582. package/src/internal/Walk.ts +176 -0
@@ -0,0 +1,159 @@
1
+ /**
2
+ * A tree another machine listed, served as a read-only `FileSystem`.
3
+ *
4
+ * `RemoteSearch` lists a root on the machine with `find` and brings back the
5
+ * bytes the search reads with `tar`; this module holds what came back and
6
+ * answers what the walk, the globs, and the matcher ask of a filesystem, so
7
+ * `PortableSearch` can search the copy as it searches a host.
8
+ *
9
+ * @since 1.0.0-rc.8
10
+ */
11
+
12
+ import type * as Path from "@smthrs/kernel/Path"
13
+ import { Effect, Option, Stream } from "effect"
14
+ import * as ByteSize from "effect/ByteSize"
15
+ import * as FileSystem from "effect/FileSystem"
16
+ import * as PlatformError from "effect/PlatformError"
17
+ import * as Tar from "./Tar.ts"
18
+
19
+ /**
20
+ * What one listed path is: `d` a directory, `u` a directory the machine's
21
+ * user may not list, `f` a file, `o` anything else, and a symbolic link to a
22
+ * directory (`D`), to a file (`F`), or to neither (`L`).
23
+ *
24
+ * @private
25
+ * @since 1.0.0-rc.8
26
+ */
27
+ export type Kind = "d" | "u" | "f" | "o" | "D" | "F" | "L"
28
+
29
+ /**
30
+ * One machine's listing of a root, and the bytes it brought back, by
31
+ * absolute path.
32
+ *
33
+ * @private
34
+ * @since 1.0.0-rc.8
35
+ */
36
+ export interface Tree {
37
+ readonly kinds: ReadonlyMap<string, Kind>
38
+ readonly children: ReadonlyMap<string, ReadonlyArray<string>>
39
+ readonly contents: ReadonlyMap<string, Uint8Array>
40
+ }
41
+
42
+ const kinds: ReadonlySet<string> = new Set(["d", "u", "f", "o", "D", "F", "L"])
43
+
44
+ /**
45
+ * The member names `tar` wrote for absolute paths, which it strips of their
46
+ * leading `/`, as those paths again.
47
+ *
48
+ * @private
49
+ * @since 1.0.0-rc.8
50
+ */
51
+ export const absolute = (members: ReadonlyMap<string, Uint8Array>): ReadonlyMap<string, Uint8Array> =>
52
+ new Map([...members].map(([name, bytes]) => [`/${name}`, bytes]))
53
+
54
+ /**
55
+ * Reads NUL-terminated `<kind><path>` records up to an `E` record, then the
56
+ * tar stream of `.gitignore` files after it. `root` is the listed root, which
57
+ * is nobody's child. `undefined` when the bytes are not that shape.
58
+ *
59
+ * @private
60
+ * @since 1.0.0-rc.8
61
+ */
62
+ export const parse = (bytes: Uint8Array, root: string, path: Path.Path): Tree | undefined => {
63
+ const decoder = new TextDecoder()
64
+ const listed = new Map<string, Kind>()
65
+ const children = new Map<string, Array<string>>()
66
+ let offset = 0
67
+ for (;;) {
68
+ const end = bytes.indexOf(0, offset)
69
+ if (end === -1) return undefined
70
+ const record = decoder.decode(bytes.subarray(offset, end))
71
+ offset = end + 1
72
+ if (record === "E") break
73
+ const kind = record.slice(0, 1)
74
+ if (!kinds.has(kind)) return undefined
75
+ const entry = record.slice(1)
76
+ listed.set(entry, kind as Kind)
77
+ if (entry === root) continue
78
+ const parent = path.dirname(entry)
79
+ const siblings = children.get(parent)
80
+ if (siblings === undefined) children.set(parent, [path.basename(entry)])
81
+ else siblings.push(path.basename(entry))
82
+ }
83
+ const ignores = Tar.files(bytes.subarray(offset))
84
+ return ignores === undefined ? undefined : { kinds: listed, children, contents: absolute(ignores) }
85
+ }
86
+
87
+ const refusal = (tag: PlatformError.SystemErrorTag, method: string, path: string): PlatformError.PlatformError =>
88
+ PlatformError.systemError({ _tag: tag, module: "FileSystem", method, pathOrDescriptor: path })
89
+
90
+ /** What `stat` says each kind is: links resolved, a dangling one absent. */
91
+ const types: Readonly<Record<Kind, FileSystem.File.Type | undefined>> = {
92
+ d: "Directory",
93
+ u: "Directory",
94
+ D: "Directory",
95
+ f: "File",
96
+ F: "File",
97
+ o: "Unknown",
98
+ L: undefined
99
+ }
100
+
101
+ const info = (type: FileSystem.File.Type, size: number): FileSystem.File.Info => ({
102
+ type,
103
+ size: ByteSize.bytes(BigInt(size)),
104
+ mtime: Option.none(),
105
+ atime: Option.none(),
106
+ birthtime: Option.none(),
107
+ dev: 0,
108
+ ino: Option.none(),
109
+ mode: 0,
110
+ nlink: Option.none(),
111
+ uid: Option.none(),
112
+ gid: Option.none(),
113
+ rdev: Option.none(),
114
+ blksize: Option.none(),
115
+ blocks: Option.none()
116
+ })
117
+
118
+ /**
119
+ * The tree as a read-only `FileSystem`, resolving paths with `path`. A file
120
+ * whose bytes did not come back is one the machine's user could not read,
121
+ * which the in-process peer skips exactly as it skips such a file on a host.
122
+ *
123
+ * @private
124
+ * @since 1.0.0-rc.8
125
+ */
126
+ export const fileSystem = (tree: Tree, path: Path.Path): FileSystem.FileSystem => {
127
+ const kindOf = (value: string) => tree.kinds.get(path.resolve(value))
128
+ const readFile = (value: string) => {
129
+ const bytes = tree.contents.get(path.resolve(value))
130
+ if (bytes !== undefined) return Effect.succeed(bytes)
131
+ const type = types[kindOf(value) ?? "L"]
132
+ return Effect.fail(
133
+ refusal(type === "File" ? "PermissionDenied" : type === undefined ? "NotFound" : "BadResource", "readFile", value)
134
+ )
135
+ }
136
+ return FileSystem.makeNoop({
137
+ stat: (value) => {
138
+ const type = types[kindOf(value) ?? "L"]
139
+ return type === undefined
140
+ ? Effect.fail(refusal("NotFound", "stat", value))
141
+ : Effect.succeed(info(type, tree.contents.get(path.resolve(value))?.length ?? 0))
142
+ },
143
+ readDirectory: (value) => {
144
+ const kind = kindOf(value)
145
+ if (kind === "d") return Effect.succeed([...tree.children.get(path.resolve(value)) ?? []])
146
+ const tag = kind === "u" ? "PermissionDenied" : kind === undefined || kind === "L" ? "NotFound" : "BadResource"
147
+ return Effect.fail(refusal(tag, "readDirectory", value))
148
+ },
149
+ readLink: (value) => {
150
+ const kind = kindOf(value)
151
+ return kind === "D" || kind === "F" || kind === "L"
152
+ ? Effect.succeed("")
153
+ : Effect.fail(refusal(kind === undefined ? "NotFound" : "BadResource", "readLink", value))
154
+ },
155
+ readFile,
156
+ readFileString: (value) => Effect.map(readFile(value), (bytes) => new TextDecoder().decode(bytes)),
157
+ stream: (value) => Stream.fromEffect(readFile(value))
158
+ })
159
+ }
@@ -0,0 +1,77 @@
1
+ /**
2
+ * The failure constructors and the literal escape both Search peers share.
3
+ *
4
+ * The validation and matching rules themselves are public, in
5
+ * `../SearchContract.ts`, because an external peer has to build on them. What
6
+ * is left here is what an external peer never calls: the three `StdError`
7
+ * shapes the contract fails with, the root-failure mapping, and the regex escape a fixed-string search
8
+ * applies before compiling.
9
+ *
10
+ * @since 1.0.0
11
+ */
12
+
13
+ import type * as PlatformError from "effect/PlatformError"
14
+ import * as StdError from "../StdError.ts"
15
+
16
+ /**
17
+ * Constructs the common unsupported-pattern failure.
18
+ *
19
+ * @private
20
+ * @since 1.0.0
21
+ */
22
+ export const invalidPattern = (pattern: string, detail: string): StdError.StdError =>
23
+ new StdError.StdError({ code: "invalid_pattern", message: `${rejectionPrefix}"${pattern}": ${detail}` })
24
+
25
+ /**
26
+ * How every rejection {@link invalidPattern} writes begins.
27
+ *
28
+ * @private
29
+ * @since 1.0.0
30
+ */
31
+ export const rejectionPrefix = "Unsupported ripgrep pattern "
32
+
33
+ /**
34
+ * Constructs the common invalid-options failure.
35
+ *
36
+ * @private
37
+ * @since 1.0.0
38
+ */
39
+ export const invalidInput = (detail: string): StdError.StdError =>
40
+ new StdError.StdError({ code: "invalid_input", message: `Invalid ripgrep options: ${detail}` })
41
+
42
+ /**
43
+ * Constructs the common missing-root failure.
44
+ *
45
+ * @private
46
+ * @since 1.0.0
47
+ */
48
+ export const notFound = (path: string): StdError.StdError =>
49
+ new StdError.StdError({ code: "not_found", message: `Path not found: ${path}`, path })
50
+
51
+ /**
52
+ * Maps a failure to inspect the search root onto the contract's failures.
53
+ *
54
+ * Only a root that does not exist is `not_found`. Every other reason a stat
55
+ * or listing can fail (a guarded host that fails closed, a permission the
56
+ * process lacks, an I/O error) is a host operation failing, and it is
57
+ * reported as `command_failed` with the platform's own message, so the
58
+ * caller reads the real cause instead of a missing-path claim about a path
59
+ * that exists.
60
+ *
61
+ * @private
62
+ * @since 1.0.0
63
+ */
64
+ export const rootFailure = (path: string, error: PlatformError.PlatformError): StdError.StdError =>
65
+ error.reason._tag === "NotFound"
66
+ ? notFound(path)
67
+ : error.reason._tag === "PermissionDenied"
68
+ ? new StdError.StdError({ code: "permission_denied", message: `Cannot search ${path}: ${error.message}`, path })
69
+ : new StdError.StdError({ code: "command_failed", message: `Cannot search ${path}: ${error.message}`, path })
70
+
71
+ /**
72
+ * Escapes literal text for JavaScript regular expressions.
73
+ *
74
+ * @private
75
+ * @since 1.0.0
76
+ */
77
+ export const escapeRegex = (value: string): string => value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")
@@ -0,0 +1,88 @@
1
+ /**
2
+ * The definition a line sits inside, read off the file's own shape.
3
+ *
4
+ * A search hit is a line number, and a line number is not a read window. Agents
5
+ * guess one: `offset: line - 10, limit: 40`, which lands short (astropy-15569
6
+ * missed `get_lookup` by one line and probed the wrong binding) or long (six
7
+ * blind-offset reads on sympy-13878). The enclosing definition is the window the
8
+ * hit actually belongs to, and for indentation- and brace-structured source it
9
+ * is derivable from the text already in hand.
10
+ *
11
+ * This is a heuristic and reports only what it can see plainly: a declaration
12
+ * keyword, a name, and the block that keyword opens. When the shape is not
13
+ * plain — a match at top level, a language this table does not name, a
14
+ * declaration split across lines — it answers `undefined` rather than guessing,
15
+ * because a wrong window is worse than none.
16
+ *
17
+ * @since 1.0.0
18
+ */
19
+
20
+ /**
21
+ * The definition enclosing a line.
22
+ *
23
+ * @category models
24
+ * @since 1.0.0
25
+ */
26
+ export interface Symbol {
27
+ readonly kind: string
28
+ readonly name: string
29
+ readonly startLine: number
30
+ readonly endLine: number
31
+ }
32
+
33
+ /**
34
+ * Declaration keywords this heuristic recognises across the languages the
35
+ * standard flows meet. Modifiers before the keyword are skipped, the name after
36
+ * it is captured, and everything else is left alone.
37
+ */
38
+ const declaration =
39
+ /^([ \t]*)(?:(?:async|export|default|public|private|protected|internal|static|final|abstract|open|pub(?:\([^)]*\))?|unsafe|const|declare)[ \t]+)*(def|class|function|fn|func|struct|impl|interface|trait|enum|module|namespace|type|sub|method)[ \t]+([A-Za-z_$][A-Za-z0-9_$]*)/
40
+
41
+ const closer = /^[ \t]*[)}\]]/
42
+
43
+ const indentOf = (line: string): number => /^[ \t]*/.exec(line)![0].length
44
+
45
+ const blank = (line: string): boolean => line.trim() === ""
46
+
47
+ /**
48
+ * The definition enclosing a 1-based line, or `undefined` when there is none to
49
+ * read plainly.
50
+ *
51
+ * @category navigation
52
+ * @since 1.0.0
53
+ */
54
+ export const enclosing = (lines: ReadonlyArray<string>, line: number): Symbol | undefined => {
55
+ const index = line - 1
56
+ if (index < 0 || index >= lines.length) return undefined
57
+ // A blank match line has no indentation of its own; the nearest text above it
58
+ // does, and that is the block the blank line belongs to.
59
+ let reference = index
60
+ while (reference > 0 && blank(lines[reference]!)) reference--
61
+ const indent = indentOf(lines[reference]!)
62
+ let start = -1
63
+ let parsed: RegExpExecArray | null = null
64
+ for (let candidate = index; candidate >= 0; candidate--) {
65
+ const text = lines[candidate]!
66
+ if (blank(text)) continue
67
+ const found = declaration.exec(text)
68
+ if (found === null) continue
69
+ if (candidate !== index && indentOf(text) >= indent) continue
70
+ start = candidate
71
+ parsed = found
72
+ break
73
+ }
74
+ if (parsed === null) return undefined
75
+ const opening = indentOf(lines[start]!)
76
+ let end = lines.length - 1
77
+ for (let candidate = start + 1; candidate < lines.length; candidate++) {
78
+ const text = lines[candidate]!
79
+ if (blank(text)) continue
80
+ if (indentOf(text) > opening) continue
81
+ // A brace language closes the block at the declaration's own indentation,
82
+ // and that closing line is part of the definition rather than what follows.
83
+ end = closer.test(text) ? candidate : candidate - 1
84
+ break
85
+ }
86
+ while (end > start && blank(lines[end]!)) end--
87
+ return { kind: parsed[2]!, name: parsed[3]!, startLine: start + 1, endLine: end + 1 }
88
+ }
@@ -0,0 +1,95 @@
1
+ /**
2
+ * The regular files of a tar stream.
3
+ *
4
+ * `RemoteSearch` brings a machine's files back with its own `tar`, because
5
+ * every image ships one and it frames each file with its name and size. GNU
6
+ * and BusyBox `tar` write GNU long names, `bsdtar` writes POSIX extended
7
+ * headers, and `xargs` may start `tar` more than once, so the stream can hold
8
+ * several archives one after another. This reads all of them.
9
+ *
10
+ * @since 1.0.0-rc.8
11
+ */
12
+
13
+ const decoder = new TextDecoder()
14
+
15
+ /** Bytes up to the first NUL, as text. */
16
+ const text = (bytes: Uint8Array): string => {
17
+ const end = bytes.indexOf(0)
18
+ return decoder.decode(end === -1 ? bytes : bytes.subarray(0, end))
19
+ }
20
+
21
+ /** An octal header field, or `undefined` when it holds anything else. */
22
+ const octal = (bytes: Uint8Array): number | undefined => {
23
+ const digits = text(bytes).trim()
24
+ return /^[0-7]+$/.test(digits) ? Number.parseInt(digits, 8) : undefined
25
+ }
26
+
27
+ /** The header's checksum, computed with the checksum field read as spaces. */
28
+ const checksum = (header: Uint8Array): number => {
29
+ let sum = 0
30
+ for (let index = 0; index < 512; index++) sum += index >= 148 && index < 156 ? 32 : header[index]!
31
+ return sum
32
+ }
33
+
34
+ /** The `path` record of a POSIX extended header: `<length> <key>=<value>\n` records. */
35
+ const paxPath = (data: Uint8Array): string | undefined => {
36
+ let offset = 0
37
+ let path: string | undefined
38
+ while (offset < data.length) {
39
+ const space = data.indexOf(32, offset)
40
+ const length = space === -1 ? Number.NaN : Number(decoder.decode(data.subarray(offset, space)))
41
+ if (!Number.isSafeInteger(length) || length <= space - offset || offset + length > data.length) return path
42
+ const record = decoder.decode(data.subarray(space + 1, offset + length - 1))
43
+ if (record.startsWith("path=")) path = record.slice("path=".length)
44
+ offset += length
45
+ }
46
+ return path
47
+ }
48
+
49
+ /**
50
+ * Every regular file the stream holds, by member name, or `undefined` when
51
+ * the stream is not whole tar archives: a header whose checksum does not
52
+ * hold, a member cut short, or a last archive with no end. A `tar` that
53
+ * stopped between two members wrote no end, so its missing files are not
54
+ * mistaken for files it could not read.
55
+ *
56
+ * @private
57
+ * @since 1.0.0-rc.8
58
+ */
59
+ export const files = (stream: Uint8Array): ReadonlyMap<string, Uint8Array> | undefined => {
60
+ const found = new Map<string, Uint8Array>()
61
+ let longName: string | undefined
62
+ let extended: string | undefined
63
+ let ended = true
64
+ for (let offset = 0; offset + 512 <= stream.length;) {
65
+ const header = stream.subarray(offset, offset + 512)
66
+ offset += 512
67
+ // Zero blocks end one archive; `xargs` may have started another.
68
+ ended = header.every((byte) => byte === 0)
69
+ if (ended) continue
70
+ const size = octal(header.subarray(124, 136))
71
+ if (size === undefined || octal(header.subarray(148, 156)) !== checksum(header)) return undefined
72
+ if (offset + size > stream.length) return undefined
73
+ const data = stream.subarray(offset, offset + size)
74
+ offset += Math.ceil(size / 512) * 512
75
+ const type = String.fromCharCode(header[156]!)
76
+ if (type === "L") {
77
+ longName = text(data)
78
+ continue
79
+ }
80
+ if (type === "x") {
81
+ extended = paxPath(data) ?? extended
82
+ continue
83
+ }
84
+ // A long link name and a global header describe no member of their own.
85
+ if (type === "K" || type === "g") continue
86
+ if (type === "0" || type === "\0" || type === "7") {
87
+ const prefix = decoder.decode(header.subarray(257, 263)) === "ustar\0" ? text(header.subarray(345, 500)) : ""
88
+ const short = text(header.subarray(0, 100))
89
+ found.set(extended ?? longName ?? (prefix === "" ? short : `${prefix}/${short}`), data.slice())
90
+ }
91
+ longName = undefined
92
+ extended = undefined
93
+ }
94
+ return ended ? found : undefined
95
+ }
@@ -0,0 +1,194 @@
1
+ /**
2
+ * What a test runner said, read out of what it printed.
3
+ *
4
+ * A suite's answer is two facts — how many passed, and which ones failed — and
5
+ * a runner spends twenty to thirty kilobytes of stdout saying them. Paying a
6
+ * model to read that is the expensive way to learn a number, and the measured
7
+ * program shows what it costs: sixteen frames on sphinx-8721 existed because a
8
+ * pre-existing failure was never isolated, and the failure *names* were in the
9
+ * output all along.
10
+ *
11
+ * The parsers below recognise the report shapes the standard runners print.
12
+ * Precision is the design constraint, exactly as in `Probe`: a reader claims a
13
+ * complete report only when the runner printed an authoritative completion
14
+ * statement and the observed outcomes agree with it. Pytest requires a tally,
15
+ * TAP requires a plan with every planned outcome, and unittest requires its
16
+ * `Ran` line plus an `OK` or `FAILED` summary. Incomplete captures still return
17
+ * the outcomes they contain with `parsed: false`. A wrong failure set is worse
18
+ * than no failure set, because attribution is built on it.
19
+ *
20
+ * @since 1.0.0
21
+ */
22
+
23
+ /**
24
+ * One run's outcome as this module could read it.
25
+ *
26
+ * @category models
27
+ * @since 1.0.0
28
+ */
29
+ export interface Report {
30
+ readonly passed: number
31
+ readonly failed: ReadonlyArray<string>
32
+ readonly reportedFailed: number | undefined
33
+ readonly parsed: boolean
34
+ }
35
+
36
+ const unique = (ids: ReadonlyArray<string>): ReadonlyArray<string> => [...new Set(ids)]
37
+
38
+ const collect = (text: string, pattern: RegExp): ReadonlyArray<string> => {
39
+ const found: Array<string> = []
40
+ for (const match of text.matchAll(pattern)) {
41
+ found.push(match[1]!)
42
+ }
43
+ return found
44
+ }
45
+
46
+ const count = (text: string, pattern: RegExp): number | undefined => {
47
+ const match = pattern.exec(text)
48
+ return match === null ? undefined : Number(match[1])
49
+ }
50
+
51
+ /**
52
+ * pytest, in every verbosity it is normally run at.
53
+ *
54
+ * The short summary (`-rA`, and the default on failure) prints one
55
+ * `FAILED path::id - reason` line per failure, and the tally line prints the
56
+ * authoritative counts. Verbose outcome lines preserve observations from an
57
+ * incomplete capture but cannot establish that the run completed.
58
+ */
59
+ const pytest = (text: string): Report | undefined => {
60
+ const summaryFailed = collect(text, /^(?:FAILED|ERROR)[ \t]+(.+?)(?:[ \t]+-[ \t]+.*)?$/gm)
61
+ const outcomes = [...text.matchAll(/^(.+?)[ \t]+(PASSED|FAILED|ERROR)(?:[ \t]+.*)?$/gm)]
62
+ const verboseFailed = outcomes.flatMap((match) => match[2] === "FAILED" || match[2] === "ERROR" ? [match[1]!] : [])
63
+ const verbosePassed = unique(outcomes.flatMap((match) => match[2] === "PASSED" ? [match[1]!] : [])).length
64
+ const failed = unique([...summaryFailed, ...verboseFailed])
65
+ // Only a terminal pytest summary can certify completion. Earlier diagnostic
66
+ // lines (including test stdout) are not runner tallies.
67
+ const lastLine = text.trimEnd().split("\n").at(-1)!
68
+ const summary = /^(?:=+[ \t]*)?(\d+ [a-z]+(?:,[ \t]*\d+ [a-z]+)*) in \d+(?:\.\d+)?s(?: \([^)]*\))?[ \t]*(?:=+)?$/
69
+ .exec(lastLine)?.[1]
70
+ const tally = summary === undefined ? undefined : count(summary, /\b(\d+) passed\b/)
71
+ const failures = summary === undefined ? undefined : count(summary, /\b(\d+) failed\b/)
72
+ const errors = summary === undefined ? undefined : count(summary, /\b(\d+) errors?\b/)
73
+ const hasTally = tally !== undefined || failures !== undefined || errors !== undefined
74
+ const reportedFailed = hasTally ? (failures ?? 0) + (errors ?? 0) : undefined
75
+ if (!hasTally && outcomes.length === 0 && summaryFailed.length === 0) return undefined
76
+ return {
77
+ passed: tally ?? verbosePassed,
78
+ failed,
79
+ reportedFailed,
80
+ parsed: hasTally && failed.length === reportedFailed
81
+ }
82
+ }
83
+
84
+ /**
85
+ * unittest, whose failures name a method and a class in the opposite order to
86
+ * the dotted id everything else uses.
87
+ */
88
+ const unittest = (text: string): Report | undefined => {
89
+ const ran = count(text, /^Ran (\d+) tests?\b/m)
90
+ const outcomes = [...text.matchAll(/^(?:FAIL|ERROR|UNEXPECTED SUCCESS):[ \t]+(\S+)[ \t]+\(([^)\s]+)\)/gm)]
91
+ if (ran === undefined && outcomes.length === 0) return undefined
92
+ const failed = unique(
93
+ outcomes.map((match) => match[2]!.endsWith(`.${match[1]}`) ? match[2]! : `${match[2]}.${match[1]}`)
94
+ )
95
+ const summary = /^(OK|FAILED)(?: \(([^)]*)\))?[ \t]*$/m.exec(text)
96
+ const counts = new Map<string, number>()
97
+ let known = summary !== null
98
+ for (const entry of summary?.[2]?.split(", ") ?? []) {
99
+ const match = /^(failures|errors|skipped|expected failures|unexpected successes)=(\d+)$/.exec(entry)
100
+ if (match === null || counts.has(match[1]!)) known = false
101
+ else counts.set(match[1]!, Number(match[2]))
102
+ }
103
+ const reportedFailed = known
104
+ ? (counts.get("failures") ?? 0) + (counts.get("errors") ?? 0) + (counts.get("unexpected successes") ?? 0)
105
+ : undefined
106
+ const skipped = counts.get("skipped") ?? 0
107
+ const expectedFailures = counts.get("expected failures") ?? 0
108
+ const passed = ran === undefined || reportedFailed === undefined
109
+ ? 0
110
+ : Math.max(0, ran - reportedFailed - skipped - expectedFailures)
111
+ return {
112
+ passed,
113
+ failed,
114
+ reportedFailed,
115
+ parsed: ran !== undefined && reportedFailed !== undefined && failed.length === reportedFailed &&
116
+ (summary?.[1] === "OK" ? reportedFailed === 0 : reportedFailed > 0) &&
117
+ passed + failed.length + skipped + expectedFailures === ran
118
+ }
119
+ }
120
+
121
+ /**
122
+ * TAP, which several ecosystems emit and which names each test on its own line.
123
+ */
124
+ const tap = (text: string): Report | undefined => {
125
+ const outcomes = [...text.matchAll(/^(not ok|ok)\b[ \t]*\d*[ \t]*-?[ \t]*(.*)$/gm)].map((match) => {
126
+ const directive = /[ \t]*#[ \t]*(SKIP|TODO)\b.*$/i.exec(match[2]!)
127
+ return {
128
+ ok: match[1] === "ok",
129
+ id: match[2]!.slice(0, directive?.index).trim(),
130
+ directive: directive === null ? undefined : directive[1]!.toUpperCase()
131
+ }
132
+ })
133
+ const failures = outcomes.filter((outcome) => !outcome.ok && outcome.directive === undefined)
134
+ const failed = unique(failures.flatMap((outcome) => outcome.id === "" ? [] : [outcome.id]))
135
+ const passed = outcomes.filter((outcome) => outcome.ok && outcome.directive !== "SKIP").length
136
+ const planned = count(text, /^1\.\.(\d+)\b/m)
137
+ if (outcomes.length === 0 && planned === undefined) return undefined
138
+ const reportedFailed = failures.length
139
+ return {
140
+ passed,
141
+ failed,
142
+ reportedFailed,
143
+ parsed: planned !== undefined && outcomes.length === planned && failed.length === reportedFailed
144
+ }
145
+ }
146
+
147
+ /**
148
+ * Reads one run's report, or says plainly that it could not.
149
+ *
150
+ * @category parsing
151
+ * @since 1.0.0
152
+ */
153
+ export const parse = (text: string): Report => {
154
+ const hasTap = /^(?:TAP version \d+|1\.\.\d+|not ok\b|ok\b)/m.test(text)
155
+ const hasUnittest = /^Ran \d+ tests?\b/m.test(text)
156
+ const lastLine = text.trimEnd().split("\n").at(-1)!
157
+ const hasPytest = /^(?:=+[ \t]*)?\d+ [a-z]+(?:,[ \t]*\d+ [a-z]+)* in \d+(?:\.\d+)?s(?: \([^)]*\))?[ \t]*(?:=+)?$/
158
+ .test(lastLine)
159
+ // Two runner completion signatures in one capture cannot establish which
160
+ // protocol owns the outcomes. Never attribute such a report.
161
+ if ([hasTap, hasUnittest, hasPytest].filter(Boolean).length > 1) {
162
+ return { passed: 0, failed: [], reportedFailed: undefined, parsed: false }
163
+ }
164
+ const readers = hasTap ? [tap] : hasUnittest ? [unittest] : hasPytest ? [pytest] : [unittest, pytest, tap]
165
+ for (const reader of readers) {
166
+ const report = reader(text)
167
+ if (report !== undefined) return report
168
+ }
169
+ return { passed: 0, failed: [], reportedFailed: undefined, parsed: false }
170
+ }
171
+
172
+ /**
173
+ * How two runs of the same command differ, which is the whole of attribution.
174
+ *
175
+ * @category parsing
176
+ * @since 1.0.0
177
+ */
178
+ export const attribute = (
179
+ current: Report,
180
+ base: Report
181
+ ): {
182
+ readonly introduced: ReadonlyArray<string>
183
+ readonly preexisting: ReadonlyArray<string>
184
+ readonly fixed: ReadonlyArray<string>
185
+ } | undefined => {
186
+ if (!current.parsed || !base.parsed) return undefined
187
+ const before = new Set(base.failed)
188
+ const now = new Set(current.failed)
189
+ return {
190
+ introduced: current.failed.filter((id) => !before.has(id)),
191
+ preexisting: current.failed.filter((id) => before.has(id)),
192
+ fixed: base.failed.filter((id) => !now.has(id))
193
+ }
194
+ }