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

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 (555) hide show
  1. package/CHANGELOG.md +130 -0
  2. package/LICENSE +21 -0
  3. package/README.md +152 -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 +304 -0
  9. package/dist/cjs/Bash.d.ts.map +1 -0
  10. package/dist/cjs/Bash.js +321 -0
  11. package/dist/cjs/Bash.js.map +7 -0
  12. package/dist/cjs/Checkpoints.d.ts +279 -0
  13. package/dist/cjs/Checkpoints.d.ts.map +1 -0
  14. package/dist/cjs/Checkpoints.js +145 -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 +24 -0
  73. package/dist/cjs/PortableSearch.d.ts.map +1 -0
  74. package/dist/cjs/PortableSearch.js +233 -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/Search.d.ts +163 -0
  89. package/dist/cjs/Search.d.ts.map +1 -0
  90. package/dist/cjs/Search.js +51 -0
  91. package/dist/cjs/Search.js.map +7 -0
  92. package/dist/cjs/SearchConformance.d.ts +115 -0
  93. package/dist/cjs/SearchConformance.d.ts.map +1 -0
  94. package/dist/cjs/SearchConformance.js +172 -0
  95. package/dist/cjs/SearchConformance.js.map +7 -0
  96. package/dist/cjs/SearchContract.d.ts +114 -0
  97. package/dist/cjs/SearchContract.d.ts.map +1 -0
  98. package/dist/cjs/SearchContract.js +339 -0
  99. package/dist/cjs/SearchContract.js.map +7 -0
  100. package/dist/cjs/ShellCommand.d.ts +164 -0
  101. package/dist/cjs/ShellCommand.d.ts.map +1 -0
  102. package/dist/cjs/ShellCommand.js +102 -0
  103. package/dist/cjs/ShellCommand.js.map +7 -0
  104. package/dist/cjs/StdError.d.ts +55 -0
  105. package/dist/cjs/StdError.d.ts.map +1 -0
  106. package/dist/cjs/StdError.js +74 -0
  107. package/dist/cjs/StdError.js.map +7 -0
  108. package/dist/cjs/TestRun.d.ts +311 -0
  109. package/dist/cjs/TestRun.d.ts.map +1 -0
  110. package/dist/cjs/TestRun.js +228 -0
  111. package/dist/cjs/TestRun.js.map +7 -0
  112. package/dist/cjs/TestRunner.d.ts +102 -0
  113. package/dist/cjs/TestRunner.d.ts.map +1 -0
  114. package/dist/cjs/TestRunner.js +54 -0
  115. package/dist/cjs/TestRunner.js.map +7 -0
  116. package/dist/cjs/TreeFingerprint.d.ts +140 -0
  117. package/dist/cjs/TreeFingerprint.d.ts.map +1 -0
  118. package/dist/cjs/TreeFingerprint.js +87 -0
  119. package/dist/cjs/TreeFingerprint.js.map +7 -0
  120. package/dist/cjs/UpdatePlan.d.ts +152 -0
  121. package/dist/cjs/UpdatePlan.d.ts.map +1 -0
  122. package/dist/cjs/UpdatePlan.js +87 -0
  123. package/dist/cjs/UpdatePlan.js.map +7 -0
  124. package/dist/cjs/WebFetch.d.ts +134 -0
  125. package/dist/cjs/WebFetch.d.ts.map +1 -0
  126. package/dist/cjs/WebFetch.js +140 -0
  127. package/dist/cjs/WebFetch.js.map +7 -0
  128. package/dist/cjs/WebSearch.d.ts +181 -0
  129. package/dist/cjs/WebSearch.d.ts.map +1 -0
  130. package/dist/cjs/WebSearch.js +86 -0
  131. package/dist/cjs/WebSearch.js.map +7 -0
  132. package/dist/cjs/Write.d.ts +147 -0
  133. package/dist/cjs/Write.d.ts.map +1 -0
  134. package/dist/cjs/Write.js +122 -0
  135. package/dist/cjs/Write.js.map +7 -0
  136. package/dist/cjs/index.d.ts +127 -0
  137. package/dist/cjs/index.d.ts.map +1 -0
  138. package/dist/cjs/index.js +99 -0
  139. package/dist/cjs/index.js.map +7 -0
  140. package/dist/cjs/internal/ApplyPatch.d.ts +145 -0
  141. package/dist/cjs/internal/ApplyPatch.d.ts.map +1 -0
  142. package/dist/cjs/internal/ApplyPatch.js +462 -0
  143. package/dist/cjs/internal/ApplyPatch.js.map +7 -0
  144. package/dist/cjs/internal/CodexText.d.ts +73 -0
  145. package/dist/cjs/internal/CodexText.d.ts.map +1 -0
  146. package/dist/cjs/internal/CodexText.js +108 -0
  147. package/dist/cjs/internal/CodexText.js.map +7 -0
  148. package/dist/cjs/internal/Declaration.d.ts +49 -0
  149. package/dist/cjs/internal/Declaration.d.ts.map +1 -0
  150. package/dist/cjs/internal/Declaration.js +46 -0
  151. package/dist/cjs/internal/Declaration.js.map +7 -0
  152. package/dist/cjs/internal/Diagnostics.d.ts +77 -0
  153. package/dist/cjs/internal/Diagnostics.d.ts.map +1 -0
  154. package/dist/cjs/internal/Diagnostics.js +89 -0
  155. package/dist/cjs/internal/Diagnostics.js.map +7 -0
  156. package/dist/cjs/internal/EnvelopePrecheck.d.ts +67 -0
  157. package/dist/cjs/internal/EnvelopePrecheck.d.ts.map +1 -0
  158. package/dist/cjs/internal/EnvelopePrecheck.js +124 -0
  159. package/dist/cjs/internal/EnvelopePrecheck.js.map +7 -0
  160. package/dist/cjs/internal/Exec.d.ts +139 -0
  161. package/dist/cjs/internal/Exec.d.ts.map +1 -0
  162. package/dist/cjs/internal/Exec.js +158 -0
  163. package/dist/cjs/internal/Exec.js.map +7 -0
  164. package/dist/cjs/internal/FileMutation.d.ts +109 -0
  165. package/dist/cjs/internal/FileMutation.d.ts.map +1 -0
  166. package/dist/cjs/internal/FileMutation.js +116 -0
  167. package/dist/cjs/internal/FileMutation.js.map +7 -0
  168. package/dist/cjs/internal/FsFailure.d.ts +38 -0
  169. package/dist/cjs/internal/FsFailure.d.ts.map +1 -0
  170. package/dist/cjs/internal/FsFailure.js +40 -0
  171. package/dist/cjs/internal/FsFailure.js.map +7 -0
  172. package/dist/cjs/internal/GitWorktree.d.ts +98 -0
  173. package/dist/cjs/internal/GitWorktree.d.ts.map +1 -0
  174. package/dist/cjs/internal/GitWorktree.js +270 -0
  175. package/dist/cjs/internal/GitWorktree.js.map +7 -0
  176. package/dist/cjs/internal/Grouping.d.ts +51 -0
  177. package/dist/cjs/internal/Grouping.d.ts.map +1 -0
  178. package/dist/cjs/internal/Grouping.js +83 -0
  179. package/dist/cjs/internal/Grouping.js.map +7 -0
  180. package/dist/cjs/internal/Html.d.ts +20 -0
  181. package/dist/cjs/internal/Html.d.ts.map +1 -0
  182. package/dist/cjs/internal/Html.js +81 -0
  183. package/dist/cjs/internal/Html.js.map +7 -0
  184. package/dist/cjs/internal/Http.d.ts +95 -0
  185. package/dist/cjs/internal/Http.d.ts.map +1 -0
  186. package/dist/cjs/internal/Http.js +153 -0
  187. package/dist/cjs/internal/Http.js.map +7 -0
  188. package/dist/cjs/internal/HttpNetwork.d.ts +27 -0
  189. package/dist/cjs/internal/HttpNetwork.d.ts.map +1 -0
  190. package/dist/cjs/internal/HttpNetwork.js +146 -0
  191. package/dist/cjs/internal/HttpNetwork.js.map +7 -0
  192. package/dist/cjs/internal/Ignore.d.ts +37 -0
  193. package/dist/cjs/internal/Ignore.d.ts.map +1 -0
  194. package/dist/cjs/internal/Ignore.js +100 -0
  195. package/dist/cjs/internal/Ignore.js.map +7 -0
  196. package/dist/cjs/internal/LinearRegex.d.ts +19 -0
  197. package/dist/cjs/internal/LinearRegex.d.ts.map +1 -0
  198. package/dist/cjs/internal/LinearRegex.js +166 -0
  199. package/dist/cjs/internal/LinearRegex.js.map +7 -0
  200. package/dist/cjs/internal/Match.d.ts +85 -0
  201. package/dist/cjs/internal/Match.d.ts.map +1 -0
  202. package/dist/cjs/internal/Match.js +99 -0
  203. package/dist/cjs/internal/Match.js.map +7 -0
  204. package/dist/cjs/internal/Paths.d.ts +23 -0
  205. package/dist/cjs/internal/Paths.d.ts.map +1 -0
  206. package/dist/cjs/internal/Paths.js +52 -0
  207. package/dist/cjs/internal/Paths.js.map +7 -0
  208. package/dist/cjs/internal/Preserve.d.ts +25 -0
  209. package/dist/cjs/internal/Preserve.d.ts.map +1 -0
  210. package/dist/cjs/internal/Preserve.js +88 -0
  211. package/dist/cjs/internal/Preserve.js.map +7 -0
  212. package/dist/cjs/internal/Prune.d.ts +35 -0
  213. package/dist/cjs/internal/Prune.d.ts.map +1 -0
  214. package/dist/cjs/internal/Prune.js +54 -0
  215. package/dist/cjs/internal/Prune.js.map +7 -0
  216. package/dist/cjs/internal/SearchContract.d.ts +63 -0
  217. package/dist/cjs/internal/SearchContract.d.ts.map +1 -0
  218. package/dist/cjs/internal/SearchContract.js +46 -0
  219. package/dist/cjs/internal/SearchContract.js.map +7 -0
  220. package/dist/cjs/internal/Symbols.d.ts +39 -0
  221. package/dist/cjs/internal/Symbols.d.ts.map +1 -0
  222. package/dist/cjs/internal/Symbols.js +59 -0
  223. package/dist/cjs/internal/Symbols.js.map +7 -0
  224. package/dist/cjs/internal/TestReport.d.ts +52 -0
  225. package/dist/cjs/internal/TestReport.d.ts.map +1 -0
  226. package/dist/cjs/internal/TestReport.js +131 -0
  227. package/dist/cjs/internal/TestReport.js.map +7 -0
  228. package/dist/cjs/internal/Text.d.ts +114 -0
  229. package/dist/cjs/internal/Text.d.ts.map +1 -0
  230. package/dist/cjs/internal/Text.js +82 -0
  231. package/dist/cjs/internal/Text.js.map +7 -0
  232. package/dist/cjs/internal/Url.d.ts +13 -0
  233. package/dist/cjs/internal/Url.d.ts.map +1 -0
  234. package/dist/cjs/internal/Url.js +35 -0
  235. package/dist/cjs/internal/Url.js.map +7 -0
  236. package/dist/cjs/internal/Walk.d.ts +72 -0
  237. package/dist/cjs/internal/Walk.d.ts.map +1 -0
  238. package/dist/cjs/internal/Walk.js +108 -0
  239. package/dist/cjs/internal/Walk.js.map +7 -0
  240. package/dist/cjs/package.json +1 -0
  241. package/dist/esm/ApplyPatch.d.ts +174 -0
  242. package/dist/esm/ApplyPatch.d.ts.map +1 -0
  243. package/dist/esm/ApplyPatch.js +346 -0
  244. package/dist/esm/ApplyPatch.js.map +1 -0
  245. package/dist/esm/Bash.d.ts +304 -0
  246. package/dist/esm/Bash.d.ts.map +1 -0
  247. package/dist/esm/Bash.js +469 -0
  248. package/dist/esm/Bash.js.map +1 -0
  249. package/dist/esm/Checkpoints.d.ts +279 -0
  250. package/dist/esm/Checkpoints.d.ts.map +1 -0
  251. package/dist/esm/Checkpoints.js +298 -0
  252. package/dist/esm/Checkpoints.js.map +1 -0
  253. package/dist/esm/Container.d.ts +132 -0
  254. package/dist/esm/Container.d.ts.map +1 -0
  255. package/dist/esm/Container.js +151 -0
  256. package/dist/esm/Container.js.map +1 -0
  257. package/dist/esm/Edit.d.ts +203 -0
  258. package/dist/esm/Edit.d.ts.map +1 -0
  259. package/dist/esm/Edit.js +296 -0
  260. package/dist/esm/Edit.js.map +1 -0
  261. package/dist/esm/ExaWebSearch.d.ts +22 -0
  262. package/dist/esm/ExaWebSearch.d.ts.map +1 -0
  263. package/dist/esm/ExaWebSearch.js +107 -0
  264. package/dist/esm/ExaWebSearch.js.map +1 -0
  265. package/dist/esm/Explore.d.ts +328 -0
  266. package/dist/esm/Explore.d.ts.map +1 -0
  267. package/dist/esm/Explore.js +106 -0
  268. package/dist/esm/Explore.js.map +1 -0
  269. package/dist/esm/Fetch.d.ts +130 -0
  270. package/dist/esm/Fetch.d.ts.map +1 -0
  271. package/dist/esm/Fetch.js +91 -0
  272. package/dist/esm/Fetch.js.map +1 -0
  273. package/dist/esm/Glob.d.ts +204 -0
  274. package/dist/esm/Glob.d.ts.map +1 -0
  275. package/dist/esm/Glob.js +177 -0
  276. package/dist/esm/Glob.js.map +1 -0
  277. package/dist/esm/Grep.d.ts +347 -0
  278. package/dist/esm/Grep.d.ts.map +1 -0
  279. package/dist/esm/Grep.js +289 -0
  280. package/dist/esm/Grep.js.map +1 -0
  281. package/dist/esm/HttpPost.d.ts +130 -0
  282. package/dist/esm/HttpPost.d.ts.map +1 -0
  283. package/dist/esm/HttpPost.js +89 -0
  284. package/dist/esm/HttpPost.js.map +1 -0
  285. package/dist/esm/LanguageServer.d.ts +90 -0
  286. package/dist/esm/LanguageServer.d.ts.map +1 -0
  287. package/dist/esm/LanguageServer.js +57 -0
  288. package/dist/esm/LanguageServer.js.map +1 -0
  289. package/dist/esm/Ls.d.ts +164 -0
  290. package/dist/esm/Ls.d.ts.map +1 -0
  291. package/dist/esm/Ls.js +178 -0
  292. package/dist/esm/Ls.js.map +1 -0
  293. package/dist/esm/Lsp.d.ts +125 -0
  294. package/dist/esm/Lsp.d.ts.map +1 -0
  295. package/dist/esm/Lsp.js +165 -0
  296. package/dist/esm/Lsp.js.map +1 -0
  297. package/dist/esm/Manifest.d.ts +918 -0
  298. package/dist/esm/Manifest.d.ts.map +1 -0
  299. package/dist/esm/Manifest.js +153 -0
  300. package/dist/esm/Manifest.js.map +1 -0
  301. package/dist/esm/NativeSearch.d.ts +38 -0
  302. package/dist/esm/NativeSearch.d.ts.map +1 -0
  303. package/dist/esm/NativeSearch.js +378 -0
  304. package/dist/esm/NativeSearch.js.map +1 -0
  305. package/dist/esm/NodeLanguageServer.d.ts +128 -0
  306. package/dist/esm/NodeLanguageServer.d.ts.map +1 -0
  307. package/dist/esm/NodeLanguageServer.js +843 -0
  308. package/dist/esm/NodeLanguageServer.js.map +1 -0
  309. package/dist/esm/PortableSearch.d.ts +24 -0
  310. package/dist/esm/PortableSearch.d.ts.map +1 -0
  311. package/dist/esm/PortableSearch.js +240 -0
  312. package/dist/esm/PortableSearch.js.map +1 -0
  313. package/dist/esm/Probe.d.ts +193 -0
  314. package/dist/esm/Probe.d.ts.map +1 -0
  315. package/dist/esm/Probe.js +225 -0
  316. package/dist/esm/Probe.js.map +1 -0
  317. package/dist/esm/Read.d.ts +189 -0
  318. package/dist/esm/Read.d.ts.map +1 -0
  319. package/dist/esm/Read.js +300 -0
  320. package/dist/esm/Read.js.map +1 -0
  321. package/dist/esm/Relocate.d.ts +73 -0
  322. package/dist/esm/Relocate.d.ts.map +1 -0
  323. package/dist/esm/Relocate.js +153 -0
  324. package/dist/esm/Relocate.js.map +1 -0
  325. package/dist/esm/Search.d.ts +163 -0
  326. package/dist/esm/Search.d.ts.map +1 -0
  327. package/dist/esm/Search.js +47 -0
  328. package/dist/esm/Search.js.map +1 -0
  329. package/dist/esm/SearchConformance.d.ts +115 -0
  330. package/dist/esm/SearchConformance.d.ts.map +1 -0
  331. package/dist/esm/SearchConformance.js +193 -0
  332. package/dist/esm/SearchConformance.js.map +1 -0
  333. package/dist/esm/SearchContract.d.ts +114 -0
  334. package/dist/esm/SearchContract.d.ts.map +1 -0
  335. package/dist/esm/SearchContract.js +461 -0
  336. package/dist/esm/SearchContract.js.map +1 -0
  337. package/dist/esm/ShellCommand.d.ts +164 -0
  338. package/dist/esm/ShellCommand.d.ts.map +1 -0
  339. package/dist/esm/ShellCommand.js +159 -0
  340. package/dist/esm/ShellCommand.js.map +1 -0
  341. package/dist/esm/StdError.d.ts +55 -0
  342. package/dist/esm/StdError.d.ts.map +1 -0
  343. package/dist/esm/StdError.js +71 -0
  344. package/dist/esm/StdError.js.map +1 -0
  345. package/dist/esm/TestRun.d.ts +311 -0
  346. package/dist/esm/TestRun.d.ts.map +1 -0
  347. package/dist/esm/TestRun.js +316 -0
  348. package/dist/esm/TestRun.js.map +1 -0
  349. package/dist/esm/TestRunner.d.ts +102 -0
  350. package/dist/esm/TestRunner.d.ts.map +1 -0
  351. package/dist/esm/TestRunner.js +68 -0
  352. package/dist/esm/TestRunner.js.map +1 -0
  353. package/dist/esm/TreeFingerprint.d.ts +140 -0
  354. package/dist/esm/TreeFingerprint.d.ts.map +1 -0
  355. package/dist/esm/TreeFingerprint.js +170 -0
  356. package/dist/esm/TreeFingerprint.js.map +1 -0
  357. package/dist/esm/UpdatePlan.d.ts +152 -0
  358. package/dist/esm/UpdatePlan.d.ts.map +1 -0
  359. package/dist/esm/UpdatePlan.js +129 -0
  360. package/dist/esm/UpdatePlan.js.map +1 -0
  361. package/dist/esm/WebFetch.d.ts +134 -0
  362. package/dist/esm/WebFetch.d.ts.map +1 -0
  363. package/dist/esm/WebFetch.js +151 -0
  364. package/dist/esm/WebFetch.js.map +1 -0
  365. package/dist/esm/WebSearch.d.ts +181 -0
  366. package/dist/esm/WebSearch.d.ts.map +1 -0
  367. package/dist/esm/WebSearch.js +134 -0
  368. package/dist/esm/WebSearch.js.map +1 -0
  369. package/dist/esm/Write.d.ts +147 -0
  370. package/dist/esm/Write.d.ts.map +1 -0
  371. package/dist/esm/Write.js +144 -0
  372. package/dist/esm/Write.js.map +1 -0
  373. package/dist/esm/index.d.ts +127 -0
  374. package/dist/esm/index.d.ts.map +1 -0
  375. package/dist/esm/index.js +127 -0
  376. package/dist/esm/index.js.map +1 -0
  377. package/dist/esm/internal/ApplyPatch.d.ts +145 -0
  378. package/dist/esm/internal/ApplyPatch.d.ts.map +1 -0
  379. package/dist/esm/internal/ApplyPatch.js +489 -0
  380. package/dist/esm/internal/ApplyPatch.js.map +1 -0
  381. package/dist/esm/internal/CodexText.d.ts +73 -0
  382. package/dist/esm/internal/CodexText.d.ts.map +1 -0
  383. package/dist/esm/internal/CodexText.js +156 -0
  384. package/dist/esm/internal/CodexText.js.map +1 -0
  385. package/dist/esm/internal/Declaration.d.ts +49 -0
  386. package/dist/esm/internal/Declaration.d.ts.map +1 -0
  387. package/dist/esm/internal/Declaration.js +42 -0
  388. package/dist/esm/internal/Declaration.js.map +1 -0
  389. package/dist/esm/internal/Diagnostics.d.ts +77 -0
  390. package/dist/esm/internal/Diagnostics.d.ts.map +1 -0
  391. package/dist/esm/internal/Diagnostics.js +99 -0
  392. package/dist/esm/internal/Diagnostics.js.map +1 -0
  393. package/dist/esm/internal/EnvelopePrecheck.d.ts +67 -0
  394. package/dist/esm/internal/EnvelopePrecheck.d.ts.map +1 -0
  395. package/dist/esm/internal/EnvelopePrecheck.js +167 -0
  396. package/dist/esm/internal/EnvelopePrecheck.js.map +1 -0
  397. package/dist/esm/internal/Exec.d.ts +139 -0
  398. package/dist/esm/internal/Exec.d.ts.map +1 -0
  399. package/dist/esm/internal/Exec.js +193 -0
  400. package/dist/esm/internal/Exec.js.map +1 -0
  401. package/dist/esm/internal/FileMutation.d.ts +109 -0
  402. package/dist/esm/internal/FileMutation.d.ts.map +1 -0
  403. package/dist/esm/internal/FileMutation.js +123 -0
  404. package/dist/esm/internal/FileMutation.js.map +1 -0
  405. package/dist/esm/internal/FsFailure.d.ts +38 -0
  406. package/dist/esm/internal/FsFailure.d.ts.map +1 -0
  407. package/dist/esm/internal/FsFailure.js +39 -0
  408. package/dist/esm/internal/FsFailure.js.map +1 -0
  409. package/dist/esm/internal/GitWorktree.d.ts +98 -0
  410. package/dist/esm/internal/GitWorktree.d.ts.map +1 -0
  411. package/dist/esm/internal/GitWorktree.js +345 -0
  412. package/dist/esm/internal/GitWorktree.js.map +1 -0
  413. package/dist/esm/internal/Grouping.d.ts +51 -0
  414. package/dist/esm/internal/Grouping.d.ts.map +1 -0
  415. package/dist/esm/internal/Grouping.js +99 -0
  416. package/dist/esm/internal/Grouping.js.map +1 -0
  417. package/dist/esm/internal/Html.d.ts +20 -0
  418. package/dist/esm/internal/Html.d.ts.map +1 -0
  419. package/dist/esm/internal/Html.js +70 -0
  420. package/dist/esm/internal/Html.js.map +1 -0
  421. package/dist/esm/internal/Http.d.ts +95 -0
  422. package/dist/esm/internal/Http.d.ts.map +1 -0
  423. package/dist/esm/internal/Http.js +154 -0
  424. package/dist/esm/internal/Http.js.map +1 -0
  425. package/dist/esm/internal/HttpNetwork.d.ts +27 -0
  426. package/dist/esm/internal/HttpNetwork.d.ts.map +1 -0
  427. package/dist/esm/internal/HttpNetwork.js +114 -0
  428. package/dist/esm/internal/HttpNetwork.js.map +1 -0
  429. package/dist/esm/internal/Ignore.d.ts +37 -0
  430. package/dist/esm/internal/Ignore.d.ts.map +1 -0
  431. package/dist/esm/internal/Ignore.js +128 -0
  432. package/dist/esm/internal/Ignore.js.map +1 -0
  433. package/dist/esm/internal/LinearRegex.d.ts +19 -0
  434. package/dist/esm/internal/LinearRegex.d.ts.map +1 -0
  435. package/dist/esm/internal/LinearRegex.js +176 -0
  436. package/dist/esm/internal/LinearRegex.js.map +1 -0
  437. package/dist/esm/internal/Match.d.ts +85 -0
  438. package/dist/esm/internal/Match.d.ts.map +1 -0
  439. package/dist/esm/internal/Match.js +142 -0
  440. package/dist/esm/internal/Match.js.map +1 -0
  441. package/dist/esm/internal/Paths.d.ts +23 -0
  442. package/dist/esm/internal/Paths.d.ts.map +1 -0
  443. package/dist/esm/internal/Paths.js +40 -0
  444. package/dist/esm/internal/Paths.js.map +1 -0
  445. package/dist/esm/internal/Preserve.d.ts +25 -0
  446. package/dist/esm/internal/Preserve.d.ts.map +1 -0
  447. package/dist/esm/internal/Preserve.js +70 -0
  448. package/dist/esm/internal/Preserve.js.map +1 -0
  449. package/dist/esm/internal/Prune.d.ts +35 -0
  450. package/dist/esm/internal/Prune.d.ts.map +1 -0
  451. package/dist/esm/internal/Prune.js +60 -0
  452. package/dist/esm/internal/Prune.js.map +1 -0
  453. package/dist/esm/internal/SearchContract.d.ts +63 -0
  454. package/dist/esm/internal/SearchContract.d.ts.map +1 -0
  455. package/dist/esm/internal/SearchContract.js +66 -0
  456. package/dist/esm/internal/SearchContract.js.map +1 -0
  457. package/dist/esm/internal/Symbols.d.ts +39 -0
  458. package/dist/esm/internal/Symbols.d.ts.map +1 -0
  459. package/dist/esm/internal/Symbols.js +79 -0
  460. package/dist/esm/internal/Symbols.js.map +1 -0
  461. package/dist/esm/internal/TestReport.d.ts +52 -0
  462. package/dist/esm/internal/TestReport.d.ts.map +1 -0
  463. package/dist/esm/internal/TestReport.js +172 -0
  464. package/dist/esm/internal/TestReport.js.map +1 -0
  465. package/dist/esm/internal/Text.d.ts +114 -0
  466. package/dist/esm/internal/Text.d.ts.map +1 -0
  467. package/dist/esm/internal/Text.js +130 -0
  468. package/dist/esm/internal/Text.js.map +1 -0
  469. package/dist/esm/internal/Url.d.ts +13 -0
  470. package/dist/esm/internal/Url.d.ts.map +1 -0
  471. package/dist/esm/internal/Url.js +27 -0
  472. package/dist/esm/internal/Url.js.map +1 -0
  473. package/dist/esm/internal/Walk.d.ts +72 -0
  474. package/dist/esm/internal/Walk.d.ts.map +1 -0
  475. package/dist/esm/internal/Walk.js +126 -0
  476. package/dist/esm/internal/Walk.js.map +1 -0
  477. package/docs/README.md +117 -0
  478. package/docs/api.md +472 -0
  479. package/docs/concepts/effects-and-capabilities.md +136 -0
  480. package/docs/concepts/flows-and-handlers.md +115 -0
  481. package/docs/concepts/limits-and-disclosure.md +102 -0
  482. package/docs/concepts/search-contract.md +182 -0
  483. package/docs/guides/bind-the-standard-flows.md +114 -0
  484. package/docs/guides/implement-a-search-peer.md +133 -0
  485. package/docs/guides/pin-a-checkpoint.md +141 -0
  486. package/docs/guides/query-a-language-server.md +257 -0
  487. package/docs/guides/reach-the-network.md +141 -0
  488. package/docs/guides/read-and-edit-a-file.md +240 -0
  489. package/docs/guides/run-a-shell-command.md +215 -0
  490. package/docs/guides/run-the-test-suite.md +154 -0
  491. package/docs/guides/search-a-workspace.md +148 -0
  492. package/docs/installation.md +111 -0
  493. package/docs/quickstart.md +125 -0
  494. package/docs/reference/flows.md +556 -0
  495. package/docs/troubleshooting.md +322 -0
  496. package/package.json +439 -3
  497. package/src/ApplyPatch.ts +458 -0
  498. package/src/Bash.ts +549 -0
  499. package/src/Checkpoints.ts +422 -0
  500. package/src/Container.ts +212 -0
  501. package/src/Edit.ts +366 -0
  502. package/src/ExaWebSearch.ts +145 -0
  503. package/src/Explore.ts +139 -0
  504. package/src/Fetch.ts +117 -0
  505. package/src/Glob.ts +200 -0
  506. package/src/Grep.ts +320 -0
  507. package/src/HttpPost.ts +120 -0
  508. package/src/LanguageServer.ts +110 -0
  509. package/src/Ls.ts +228 -0
  510. package/src/Lsp.ts +184 -0
  511. package/src/Manifest.ts +162 -0
  512. package/src/NativeSearch.ts +457 -0
  513. package/src/NodeLanguageServer.ts +1148 -0
  514. package/src/PortableSearch.ts +264 -0
  515. package/src/Probe.ts +284 -0
  516. package/src/Read.ts +359 -0
  517. package/src/Relocate.ts +166 -0
  518. package/src/Search.ts +185 -0
  519. package/src/SearchConformance.ts +288 -0
  520. package/src/SearchContract.ts +489 -0
  521. package/src/ShellCommand.ts +201 -0
  522. package/src/StdError.ts +80 -0
  523. package/src/TestRun.ts +401 -0
  524. package/src/TestRunner.ts +119 -0
  525. package/src/TreeFingerprint.ts +200 -0
  526. package/src/UpdatePlan.ts +171 -0
  527. package/src/WebFetch.ts +194 -0
  528. package/src/WebSearch.ts +165 -0
  529. package/src/Write.ts +195 -0
  530. package/src/index.ts +154 -0
  531. package/src/internal/ApplyPatch.ts +601 -0
  532. package/src/internal/CodexText.ts +182 -0
  533. package/src/internal/Declaration.ts +60 -0
  534. package/src/internal/Diagnostics.ts +134 -0
  535. package/src/internal/EnvelopePrecheck.ts +233 -0
  536. package/src/internal/Exec.ts +314 -0
  537. package/src/internal/FileMutation.ts +231 -0
  538. package/src/internal/FsFailure.ts +51 -0
  539. package/src/internal/GitWorktree.ts +473 -0
  540. package/src/internal/Grouping.ts +106 -0
  541. package/src/internal/Html.ts +87 -0
  542. package/src/internal/Http.ts +209 -0
  543. package/src/internal/HttpNetwork.ts +153 -0
  544. package/src/internal/Ignore.ts +135 -0
  545. package/src/internal/LinearRegex.ts +173 -0
  546. package/src/internal/Match.ts +172 -0
  547. package/src/internal/Paths.ts +42 -0
  548. package/src/internal/Preserve.ts +108 -0
  549. package/src/internal/Prune.ts +62 -0
  550. package/src/internal/SearchContract.ts +77 -0
  551. package/src/internal/Symbols.ts +88 -0
  552. package/src/internal/TestReport.ts +194 -0
  553. package/src/internal/Text.ts +170 -0
  554. package/src/internal/Url.ts +23 -0
  555. package/src/internal/Walk.ts +176 -0
@@ -0,0 +1,601 @@
1
+ /**
2
+ * Faithful port of the Codex CLI apply_patch engine.
3
+ *
4
+ * Mirrors `codex-rs/apply-patch/src/{parser,streaming_parser,seek_sequence}.rs`
5
+ * and the applier in `lib.rs`: the V4A patch grammar, the lenient heredoc
6
+ * boundary handling, the fuzzy context-matching ladder, and every error
7
+ * string, so ChatGPT-family models see exactly the behavior they were
8
+ * posttrained on. Pure module: no host access.
9
+ *
10
+ * @since 1.0.0
11
+ */
12
+
13
+ import * as Schema from "effect/Schema"
14
+ import { sourceLines } from "./Text.ts"
15
+
16
+ const BEGIN_PATCH_MARKER = "*** Begin Patch"
17
+ const END_PATCH_MARKER = "*** End Patch"
18
+ const ADD_FILE_MARKER = "*** Add File: "
19
+ const DELETE_FILE_MARKER = "*** Delete File: "
20
+ const UPDATE_FILE_MARKER = "*** Update File: "
21
+ const MOVE_TO_MARKER = "*** Move to: "
22
+ const EOF_MARKER = "*** End of File"
23
+ const CHANGE_CONTEXT_MARKER = "@@ "
24
+ const EMPTY_CHANGE_CONTEXT_MARKER = "@@"
25
+ const ENVIRONMENT_ID_MARKER = "*** Environment ID:"
26
+
27
+ /**
28
+ * Parse failure with Codex-identical message text.
29
+ *
30
+ * `invalid patch: {message}` for patch-level failures and
31
+ * `invalid hunk at line {line}, {message}` for hunk-level failures.
32
+ *
33
+ * @since 1.0.0
34
+ * @private
35
+ */
36
+ export class ParseError extends Schema.TaggedError<ParseError>()("@smthrs/std/ParseError", {
37
+ kind: Schema.Literals(["invalid_patch", "invalid_hunk"]),
38
+ detail: Schema.String,
39
+ lineNumber: Schema.UndefinedOr(Schema.Number)
40
+ }) {
41
+ override get message(): string {
42
+ return this.kind === "invalid_patch"
43
+ ? `invalid patch: ${this.detail}`
44
+ : `invalid hunk at line ${this.lineNumber}, ${this.detail}`
45
+ }
46
+ }
47
+
48
+ const parseError = (kind: ParseError["kind"], detail: string, lineNumber?: number): ParseError =>
49
+ new ParseError({ kind, detail, lineNumber })
50
+
51
+ /**
52
+ * One replaced region of an update hunk.
53
+ *
54
+ * @since 1.0.0
55
+ * @private
56
+ */
57
+ export interface UpdateFileChunk {
58
+ changeContext: string | undefined
59
+ oldLines: Array<string>
60
+ newLines: Array<string>
61
+ isEndOfFile: boolean
62
+ }
63
+
64
+ /**
65
+ * A parsed patch hunk.
66
+ *
67
+ * @since 1.0.0
68
+ * @private
69
+ */
70
+ export type Hunk =
71
+ | { readonly kind: "add"; readonly path: string; contents: string }
72
+ | { readonly kind: "delete"; readonly path: string }
73
+ | {
74
+ readonly kind: "update"
75
+ readonly path: string
76
+ movePath: string | undefined
77
+ readonly chunks: Array<UpdateFileChunk>
78
+ }
79
+
80
+ /**
81
+ * Parsed patch: hunks plus the optional environment id preamble.
82
+ *
83
+ * @since 1.0.0
84
+ * @private
85
+ */
86
+ export interface ParsedPatch {
87
+ readonly hunks: ReadonlyArray<Hunk>
88
+ readonly environmentId: string | undefined
89
+ }
90
+
91
+ type Mode =
92
+ | { readonly _tag: "NotStarted" }
93
+ | { readonly _tag: "StartedPatch" }
94
+ | { readonly _tag: "AddFile" }
95
+ | { readonly _tag: "DeleteFile" }
96
+ | { readonly _tag: "UpdateFile"; readonly hunkLineNumber: number; readonly hunk: Extract<Hunk, { kind: "update" }> }
97
+ | { readonly _tag: "EndedPatch" }
98
+
99
+ const invalidHunkHeader = (trimmed: string, lineNumber: number): ParseError =>
100
+ parseError(
101
+ "invalid_hunk",
102
+ `'${trimmed}' is not a valid hunk header. Valid hunk headers: '*** Add File: {path}', '*** Delete File: {path}', '*** Update File: {path}'`,
103
+ lineNumber
104
+ )
105
+
106
+ const unexpectedUpdateLine = (line: string, lineNumber: number): ParseError =>
107
+ parseError(
108
+ "invalid_hunk",
109
+ `Unexpected line found in update hunk: '${line}'. Every line should start with ' ' (context line), '+' (added line), or '-' (removed line)`,
110
+ lineNumber
111
+ )
112
+
113
+ /**
114
+ * Streaming line state machine for the V4A patch grammar; a faithful port of
115
+ * `StreamingPatchParser`.
116
+ *
117
+ * @since 1.0.0
118
+ * @private
119
+ */
120
+ export class StreamingPatchParser {
121
+ private lineBuffer = ""
122
+ private mode: Mode = { _tag: "NotStarted" }
123
+ private hunks: Array<Hunk> = []
124
+ private lineNumber = 0
125
+ private _environmentId: string | undefined
126
+
127
+ environmentId(): string | undefined {
128
+ return this._environmentId
129
+ }
130
+
131
+ private ensureUpdateHunkIsNotEmpty(line: string): void {
132
+ const last = this.hunks[this.hunks.length - 1]
133
+ if (last === undefined || last.kind !== "update") return
134
+ if (last.chunks.length === 0 && this.mode._tag === "UpdateFile") {
135
+ throw parseError(
136
+ "invalid_hunk",
137
+ `Update file hunk for path '${last.path}' is empty`,
138
+ this.mode.hunkLineNumber
139
+ )
140
+ }
141
+ const chunk = last.chunks[last.chunks.length - 1]
142
+ if (chunk !== undefined && chunk.oldLines.length === 0 && chunk.newLines.length === 0) {
143
+ if (line === END_PATCH_MARKER) {
144
+ throw parseError("invalid_hunk", "Update hunk does not contain any lines", this.lineNumber)
145
+ }
146
+ throw unexpectedUpdateLine(line, this.lineNumber)
147
+ }
148
+ }
149
+
150
+ private handleHunkHeadersAndEndPatch(trimmed: string): boolean {
151
+ if (this.mode._tag === "StartedPatch" && trimmed.startsWith(ENVIRONMENT_ID_MARKER)) {
152
+ if (this._environmentId !== undefined) {
153
+ throw parseError("invalid_patch", "apply_patch environment_id cannot be specified more than once")
154
+ }
155
+ const environmentId = trimmed.slice(ENVIRONMENT_ID_MARKER.length).trim()
156
+ if (environmentId === "") {
157
+ throw parseError("invalid_patch", "apply_patch environment_id cannot be empty")
158
+ }
159
+ this._environmentId = environmentId
160
+ return true
161
+ }
162
+ if (trimmed === END_PATCH_MARKER) {
163
+ this.ensureUpdateHunkIsNotEmpty(trimmed)
164
+ this.mode = { _tag: "EndedPatch" }
165
+ return true
166
+ }
167
+ if (trimmed.startsWith(ADD_FILE_MARKER)) {
168
+ this.ensureUpdateHunkIsNotEmpty(trimmed)
169
+ this.hunks.push({ kind: "add", path: trimmed.slice(ADD_FILE_MARKER.length), contents: "" })
170
+ this.mode = { _tag: "AddFile" }
171
+ return true
172
+ }
173
+ if (trimmed.startsWith(DELETE_FILE_MARKER)) {
174
+ this.ensureUpdateHunkIsNotEmpty(trimmed)
175
+ this.hunks.push({ kind: "delete", path: trimmed.slice(DELETE_FILE_MARKER.length) })
176
+ this.mode = { _tag: "DeleteFile" }
177
+ return true
178
+ }
179
+ if (trimmed.startsWith(UPDATE_FILE_MARKER)) {
180
+ this.ensureUpdateHunkIsNotEmpty(trimmed)
181
+ const hunk: Extract<Hunk, { kind: "update" }> = {
182
+ kind: "update",
183
+ path: trimmed.slice(UPDATE_FILE_MARKER.length),
184
+ movePath: undefined,
185
+ chunks: []
186
+ }
187
+ this.hunks.push(hunk)
188
+ this.mode = { _tag: "UpdateFile", hunkLineNumber: this.lineNumber, hunk }
189
+ return true
190
+ }
191
+ return false
192
+ }
193
+
194
+ pushDelta(delta: string): ReadonlyArray<Hunk> {
195
+ for (const ch of delta) {
196
+ if (ch === "\n") {
197
+ let line = this.lineBuffer
198
+ this.lineBuffer = ""
199
+ if (line.endsWith("\r")) line = line.slice(0, -1)
200
+ this.lineNumber += 1
201
+ this.processLine(line)
202
+ } else {
203
+ this.lineBuffer += ch
204
+ }
205
+ }
206
+ return this.hunks
207
+ }
208
+
209
+ finish(): ReadonlyArray<Hunk> {
210
+ if (this.lineBuffer !== "") {
211
+ const line = this.lineBuffer
212
+ this.lineBuffer = ""
213
+ this.lineNumber += 1
214
+ if (line.trim() === END_PATCH_MARKER) {
215
+ this.ensureUpdateHunkIsNotEmpty(line.trim())
216
+ this.mode = { _tag: "EndedPatch" }
217
+ } else {
218
+ this.processLine(line)
219
+ }
220
+ }
221
+ if (this.mode._tag !== "EndedPatch") {
222
+ throw parseError("invalid_patch", "The last line of the patch must be '*** End Patch'")
223
+ }
224
+ return this.hunks
225
+ }
226
+
227
+ private processLine(line: string): void {
228
+ const trimmed = line.trim()
229
+ switch (this.mode._tag) {
230
+ case "NotStarted": {
231
+ if (trimmed === BEGIN_PATCH_MARKER) {
232
+ this.mode = { _tag: "StartedPatch" }
233
+ return
234
+ }
235
+ throw parseError("invalid_patch", "The first line of the patch must be '*** Begin Patch'")
236
+ }
237
+ case "StartedPatch": {
238
+ if (this.handleHunkHeadersAndEndPatch(trimmed)) return
239
+ throw invalidHunkHeader(trimmed, this.lineNumber)
240
+ }
241
+ case "AddFile": {
242
+ if (this.handleHunkHeadersAndEndPatch(trimmed)) return
243
+ const last = this.hunks[this.hunks.length - 1]
244
+ if (line.startsWith("+") && last !== undefined && last.kind === "add") {
245
+ last.contents += `${line.slice(1)}\n`
246
+ return
247
+ }
248
+ throw invalidHunkHeader(trimmed, this.lineNumber)
249
+ }
250
+ case "DeleteFile": {
251
+ if (this.handleHunkHeadersAndEndPatch(trimmed)) return
252
+ throw invalidHunkHeader(trimmed, this.lineNumber)
253
+ }
254
+ case "UpdateFile": {
255
+ const updateLine = line.replace(/\s+$/, "")
256
+ if (this.handleHunkHeadersAndEndPatch(updateLine)) return
257
+
258
+ const hunk = this.mode.hunk
259
+ const chunks = hunk.chunks
260
+ const lastChunk = chunks[chunks.length - 1]
261
+ if (lastChunk !== undefined && lastChunk.isEndOfFile) {
262
+ if (updateLine === "") return
263
+ if (updateLine !== EMPTY_CHANGE_CONTEXT_MARKER && !updateLine.startsWith(CHANGE_CONTEXT_MARKER)) {
264
+ throw parseError(
265
+ "invalid_hunk",
266
+ `Expected update hunk to start with a @@ context marker, got: '${line}'`,
267
+ this.lineNumber
268
+ )
269
+ }
270
+ }
271
+
272
+ if (chunks.length === 0 && hunk.movePath === undefined && updateLine.startsWith(MOVE_TO_MARKER)) {
273
+ hunk.movePath = updateLine.slice(MOVE_TO_MARKER.length)
274
+ return
275
+ }
276
+
277
+ if (
278
+ (updateLine === EMPTY_CHANGE_CONTEXT_MARKER || updateLine.startsWith(CHANGE_CONTEXT_MARKER)) &&
279
+ lastChunk !== undefined && lastChunk.oldLines.length === 0 && lastChunk.newLines.length === 0
280
+ ) {
281
+ throw unexpectedUpdateLine(line, this.lineNumber)
282
+ }
283
+
284
+ if (updateLine === EMPTY_CHANGE_CONTEXT_MARKER) {
285
+ chunks.push({ changeContext: undefined, oldLines: [], newLines: [], isEndOfFile: false })
286
+ return
287
+ }
288
+
289
+ if (updateLine.startsWith(CHANGE_CONTEXT_MARKER)) {
290
+ chunks.push({
291
+ changeContext: updateLine.slice(CHANGE_CONTEXT_MARKER.length),
292
+ oldLines: [],
293
+ newLines: [],
294
+ isEndOfFile: false
295
+ })
296
+ return
297
+ }
298
+
299
+ if (updateLine === EOF_MARKER) {
300
+ if (lastChunk !== undefined && lastChunk.oldLines.length === 0 && lastChunk.newLines.length === 0) {
301
+ throw parseError("invalid_hunk", "Update hunk does not contain any lines", this.lineNumber)
302
+ }
303
+ if (lastChunk !== undefined) lastChunk.isEndOfFile = true
304
+ return
305
+ }
306
+
307
+ const ensureChunk = (): UpdateFileChunk => {
308
+ if (chunks.length === 0) {
309
+ chunks.push({ changeContext: undefined, oldLines: [], newLines: [], isEndOfFile: false })
310
+ }
311
+ return chunks[chunks.length - 1]!
312
+ }
313
+
314
+ if (line === "") {
315
+ const chunk = ensureChunk()
316
+ chunk.oldLines.push("")
317
+ chunk.newLines.push("")
318
+ return
319
+ }
320
+ if (line.startsWith(" ")) {
321
+ const chunk = ensureChunk()
322
+ chunk.oldLines.push(line.slice(1))
323
+ chunk.newLines.push(line.slice(1))
324
+ return
325
+ }
326
+ if (line.startsWith("+")) {
327
+ ensureChunk().newLines.push(line.slice(1))
328
+ return
329
+ }
330
+ if (line.startsWith("-")) {
331
+ ensureChunk().oldLines.push(line.slice(1))
332
+ return
333
+ }
334
+ if (lastChunk !== undefined && (lastChunk.oldLines.length > 0 || lastChunk.newLines.length > 0)) {
335
+ throw parseError(
336
+ "invalid_hunk",
337
+ `Expected update hunk to start with a @@ context marker, got: '${line}'`,
338
+ this.lineNumber
339
+ )
340
+ }
341
+ throw unexpectedUpdateLine(line, this.lineNumber)
342
+ }
343
+ case "EndedPatch": {
344
+ if (trimmed === "") return
345
+ throw parseError("invalid_patch", "The last line of the patch must be '*** End Patch'")
346
+ }
347
+ }
348
+ }
349
+ }
350
+
351
+ const checkStartAndEndLinesStrict = (firstLine: string | undefined, lastLine: string | undefined): void => {
352
+ const first = firstLine?.trim()
353
+ const last = lastLine?.trim()
354
+ if (first === BEGIN_PATCH_MARKER && last === END_PATCH_MARKER) return
355
+ if (first !== undefined && first !== BEGIN_PATCH_MARKER) {
356
+ throw parseError("invalid_patch", "The first line of the patch must be '*** Begin Patch'")
357
+ }
358
+ throw parseError("invalid_patch", "The last line of the patch must be '*** End Patch'")
359
+ }
360
+
361
+ const checkPatchBoundariesStrict = (lines: ReadonlyArray<string>): ReadonlyArray<string> => {
362
+ checkStartAndEndLinesStrict(lines[0], lines.length === 0 ? undefined : lines[lines.length - 1])
363
+ return lines
364
+ }
365
+
366
+ const checkPatchBoundariesLenient = (originalLines: ReadonlyArray<string>): ReadonlyArray<string> => {
367
+ let originalError: ParseError
368
+ try {
369
+ return checkPatchBoundariesStrict(originalLines)
370
+ } catch (error) {
371
+ originalError = error as ParseError
372
+ }
373
+ if (originalLines.length >= 2) {
374
+ const first = originalLines[0]!
375
+ const last = originalLines[originalLines.length - 1]!
376
+ if (
377
+ (first === "<<EOF" || first === "<<'EOF'" || first === "<<\"EOF\"") &&
378
+ last.endsWith("EOF") && originalLines.length >= 4
379
+ ) {
380
+ return checkPatchBoundariesStrict(originalLines.slice(1, -1))
381
+ }
382
+ }
383
+ throw originalError
384
+ }
385
+
386
+ /**
387
+ * Parse a complete patch text; lenient mode (heredoc unwrapping) is always
388
+ * on, matching Codex.
389
+ *
390
+ * @since 1.0.0
391
+ * @private
392
+ */
393
+ export const parsePatch = (patch: string): ParsedPatch => {
394
+ const trimmed = patch.trim()
395
+ const lines = trimmed === "" ? [] : trimmed.split("\n")
396
+ const patchLines = checkPatchBoundariesLenient(lines)
397
+ const parser = new StreamingPatchParser()
398
+ parser.pushDelta(`${patchLines.join("\n")}\n`)
399
+ const hunks = parser.finish()
400
+ return { hunks, environmentId: parser.environmentId() }
401
+ }
402
+
403
+ const normalise = (s: string): string =>
404
+ [...s.trim()].map((c) => {
405
+ switch (c) {
406
+ case "‐":
407
+ case "‑":
408
+ case "‒":
409
+ case "–":
410
+ case "—":
411
+ case "―":
412
+ case "−":
413
+ return "-"
414
+ case "‘":
415
+ case "’":
416
+ case "‚":
417
+ case "‛":
418
+ return "'"
419
+ case "“":
420
+ case "”":
421
+ case "„":
422
+ case "‟":
423
+ return "\""
424
+ case " ":
425
+ case " ":
426
+ case " ":
427
+ case " ":
428
+ case " ":
429
+ case " ":
430
+ case " ":
431
+ case " ":
432
+ case " ":
433
+ case " ":
434
+ case " ":
435
+ case " ":
436
+ case " ":
437
+ return " "
438
+ default:
439
+ return c
440
+ }
441
+ }).join("")
442
+
443
+ /**
444
+ * Fuzzy sequence search with the Codex leniency ladder: exact, rstrip, trim,
445
+ * then unicode-normalised comparison; end-of-file patterns anchor at the end
446
+ * first.
447
+ *
448
+ * @since 1.0.0
449
+ * @private
450
+ */
451
+ export const seekSequence = (
452
+ lines: ReadonlyArray<string>,
453
+ pattern: ReadonlyArray<string>,
454
+ start: number,
455
+ eof: boolean
456
+ ): number | undefined => {
457
+ if (pattern.length === 0) return start
458
+ if (pattern.length > lines.length) return undefined
459
+ const searchStart = eof && lines.length >= pattern.length ? lines.length - pattern.length : start
460
+ const upper = lines.length - pattern.length
461
+ const passes: ReadonlyArray<(a: string, b: string) => boolean> = [
462
+ (a, b) => a === b,
463
+ (a, b) => a.replace(/\s+$/, "") === b.replace(/\s+$/, ""),
464
+ (a, b) => a.trim() === b.trim(),
465
+ (a, b) => normalise(a) === normalise(b)
466
+ ]
467
+ for (const equals of passes) {
468
+ for (let i = searchStart; i <= upper; i++) {
469
+ let ok = true
470
+ for (let p = 0; p < pattern.length; p++) {
471
+ if (!equals(lines[i + p]!, pattern[p]!)) {
472
+ ok = false
473
+ break
474
+ }
475
+ }
476
+ if (ok) return i
477
+ }
478
+ }
479
+ return undefined
480
+ }
481
+
482
+ /**
483
+ * Applier failure carrying the Codex message text verbatim.
484
+ *
485
+ * `context_not_found` is an `@@` context line absent from the file;
486
+ * `lines_not_found` is a chunk whose expected lines are absent.
487
+ *
488
+ * @since 1.0.0
489
+ * @private
490
+ */
491
+ export class ComputeReplacementsError extends Schema.TaggedError<ComputeReplacementsError>()(
492
+ "@smthrs/std/ComputeReplacementsError",
493
+ {
494
+ reason: Schema.Literals(["context_not_found", "lines_not_found"]),
495
+ path: Schema.String,
496
+ message: Schema.String
497
+ }
498
+ ) {}
499
+
500
+ type Replacement = readonly [startIndex: number, oldLength: number, newLines: ReadonlyArray<string>]
501
+
502
+ const computeReplacements = (
503
+ originalLines: ReadonlyArray<string>,
504
+ path: string,
505
+ chunks: ReadonlyArray<UpdateFileChunk>
506
+ ): Array<Replacement> => {
507
+ const replacements: Array<Replacement> = []
508
+ let lineIndex = 0
509
+
510
+ for (const chunk of chunks) {
511
+ if (chunk.changeContext !== undefined) {
512
+ const idx = seekSequence(originalLines, [chunk.changeContext], lineIndex, false)
513
+ if (idx === undefined) {
514
+ throw new ComputeReplacementsError({
515
+ reason: "context_not_found",
516
+ path,
517
+ message: `Failed to find context '${chunk.changeContext}' in ${path}`
518
+ })
519
+ }
520
+ lineIndex = idx + 1
521
+ }
522
+
523
+ if (chunk.oldLines.length === 0) {
524
+ const insertionIdx = originalLines.length > 0 && originalLines[originalLines.length - 1] === ""
525
+ ? originalLines.length - 1
526
+ : originalLines.length
527
+ replacements.push([insertionIdx, 0, [...chunk.newLines]])
528
+ continue
529
+ }
530
+
531
+ let pattern: ReadonlyArray<string> = chunk.oldLines
532
+ let newSlice: ReadonlyArray<string> = chunk.newLines
533
+ let found = seekSequence(originalLines, pattern, lineIndex, chunk.isEndOfFile)
534
+
535
+ if (found === undefined && pattern[pattern.length - 1] === "") {
536
+ pattern = pattern.slice(0, -1)
537
+ if (newSlice[newSlice.length - 1] === "") newSlice = newSlice.slice(0, -1)
538
+ found = seekSequence(originalLines, pattern, lineIndex, chunk.isEndOfFile)
539
+ }
540
+
541
+ if (found !== undefined) {
542
+ replacements.push([found, pattern.length, [...newSlice]])
543
+ lineIndex = found + pattern.length
544
+ } else {
545
+ throw new ComputeReplacementsError({
546
+ reason: "lines_not_found",
547
+ path,
548
+ message: `Failed to find expected lines in ${path}:\n${chunk.oldLines.join("\n")}`
549
+ })
550
+ }
551
+ }
552
+
553
+ replacements.sort((a, b) => a[0] - b[0])
554
+ return replacements
555
+ }
556
+
557
+ const applyReplacements = (lines: Array<string>, replacements: ReadonlyArray<Replacement>): Array<string> => {
558
+ for (let r = replacements.length - 1; r >= 0; r--) {
559
+ const [startIdx, oldLength, newSegment] = replacements[r]!
560
+ lines.splice(startIdx, Math.min(oldLength, Math.max(lines.length - startIdx, 0)), ...newSegment)
561
+ }
562
+ return lines
563
+ }
564
+
565
+ /**
566
+ * Derive the new file contents for an update hunk from the original
567
+ * contents, matching Codex `derive_new_contents_from_chunks`.
568
+ *
569
+ * @since 1.0.0
570
+ * @private
571
+ */
572
+ export const deriveNewContents = (
573
+ originalContents: string,
574
+ path: string,
575
+ chunks: ReadonlyArray<UpdateFileChunk>
576
+ ): string => {
577
+ const originalLines = sourceLines(originalContents)
578
+ const replacements = computeReplacements(originalLines, path, chunks)
579
+ const newLines = applyReplacements([...originalLines], replacements)
580
+ if (newLines[newLines.length - 1] !== "") newLines.push("")
581
+ return newLines.join("\n")
582
+ }
583
+
584
+ /**
585
+ * Render the Codex success summary: `Success. Updated the following files:`
586
+ * with `A`/`M`/`D` lines for adds, updates, and deletes in that order.
587
+ *
588
+ * @since 1.0.0
589
+ * @private
590
+ */
591
+ export const printSummary = (affected: {
592
+ readonly added: ReadonlyArray<string>
593
+ readonly modified: ReadonlyArray<string>
594
+ readonly deleted: ReadonlyArray<string>
595
+ }): string => {
596
+ const lines = ["Success. Updated the following files:"]
597
+ for (const path of affected.added) lines.push(`A ${path}`)
598
+ for (const path of affected.modified) lines.push(`M ${path}`)
599
+ for (const path of affected.deleted) lines.push(`D ${path}`)
600
+ return `${lines.join("\n")}\n`
601
+ }