@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,489 @@
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
+ import * as Schema from "effect/Schema";
13
+ import { sourceLines } from "./Text.js";
14
+ const BEGIN_PATCH_MARKER = "*** Begin Patch";
15
+ const END_PATCH_MARKER = "*** End Patch";
16
+ const ADD_FILE_MARKER = "*** Add File: ";
17
+ const DELETE_FILE_MARKER = "*** Delete File: ";
18
+ const UPDATE_FILE_MARKER = "*** Update File: ";
19
+ const MOVE_TO_MARKER = "*** Move to: ";
20
+ const EOF_MARKER = "*** End of File";
21
+ const CHANGE_CONTEXT_MARKER = "@@ ";
22
+ const EMPTY_CHANGE_CONTEXT_MARKER = "@@";
23
+ const ENVIRONMENT_ID_MARKER = "*** Environment ID:";
24
+ /**
25
+ * Parse failure with Codex-identical message text.
26
+ *
27
+ * `invalid patch: {message}` for patch-level failures and
28
+ * `invalid hunk at line {line}, {message}` for hunk-level failures.
29
+ *
30
+ * @since 1.0.0
31
+ * @private
32
+ */
33
+ export class ParseError extends Schema.TaggedError()("@smthrs/std/ParseError", {
34
+ kind: Schema.Literals(["invalid_patch", "invalid_hunk"]),
35
+ detail: Schema.String,
36
+ lineNumber: Schema.UndefinedOr(Schema.Number)
37
+ }) {
38
+ get message() {
39
+ return this.kind === "invalid_patch"
40
+ ? `invalid patch: ${this.detail}`
41
+ : `invalid hunk at line ${this.lineNumber}, ${this.detail}`;
42
+ }
43
+ }
44
+ const parseError = (kind, detail, lineNumber) => new ParseError({ kind, detail, lineNumber });
45
+ const invalidHunkHeader = (trimmed, lineNumber) => parseError("invalid_hunk", `'${trimmed}' is not a valid hunk header. Valid hunk headers: '*** Add File: {path}', '*** Delete File: {path}', '*** Update File: {path}'`, lineNumber);
46
+ const unexpectedUpdateLine = (line, lineNumber) => parseError("invalid_hunk", `Unexpected line found in update hunk: '${line}'. Every line should start with ' ' (context line), '+' (added line), or '-' (removed line)`, lineNumber);
47
+ /**
48
+ * Streaming line state machine for the V4A patch grammar; a faithful port of
49
+ * `StreamingPatchParser`.
50
+ *
51
+ * @since 1.0.0
52
+ * @private
53
+ */
54
+ export class StreamingPatchParser {
55
+ lineBuffer = "";
56
+ mode = { _tag: "NotStarted" };
57
+ hunks = [];
58
+ lineNumber = 0;
59
+ _environmentId;
60
+ environmentId() {
61
+ return this._environmentId;
62
+ }
63
+ ensureUpdateHunkIsNotEmpty(line) {
64
+ const last = this.hunks[this.hunks.length - 1];
65
+ if (last === undefined || last.kind !== "update")
66
+ return;
67
+ if (last.chunks.length === 0 && this.mode._tag === "UpdateFile") {
68
+ throw parseError("invalid_hunk", `Update file hunk for path '${last.path}' is empty`, this.mode.hunkLineNumber);
69
+ }
70
+ const chunk = last.chunks[last.chunks.length - 1];
71
+ if (chunk !== undefined && chunk.oldLines.length === 0 && chunk.newLines.length === 0) {
72
+ if (line === END_PATCH_MARKER) {
73
+ throw parseError("invalid_hunk", "Update hunk does not contain any lines", this.lineNumber);
74
+ }
75
+ throw unexpectedUpdateLine(line, this.lineNumber);
76
+ }
77
+ }
78
+ handleHunkHeadersAndEndPatch(trimmed) {
79
+ if (this.mode._tag === "StartedPatch" && trimmed.startsWith(ENVIRONMENT_ID_MARKER)) {
80
+ if (this._environmentId !== undefined) {
81
+ throw parseError("invalid_patch", "apply_patch environment_id cannot be specified more than once");
82
+ }
83
+ const environmentId = trimmed.slice(ENVIRONMENT_ID_MARKER.length).trim();
84
+ if (environmentId === "") {
85
+ throw parseError("invalid_patch", "apply_patch environment_id cannot be empty");
86
+ }
87
+ this._environmentId = environmentId;
88
+ return true;
89
+ }
90
+ if (trimmed === END_PATCH_MARKER) {
91
+ this.ensureUpdateHunkIsNotEmpty(trimmed);
92
+ this.mode = { _tag: "EndedPatch" };
93
+ return true;
94
+ }
95
+ if (trimmed.startsWith(ADD_FILE_MARKER)) {
96
+ this.ensureUpdateHunkIsNotEmpty(trimmed);
97
+ this.hunks.push({ kind: "add", path: trimmed.slice(ADD_FILE_MARKER.length), contents: "" });
98
+ this.mode = { _tag: "AddFile" };
99
+ return true;
100
+ }
101
+ if (trimmed.startsWith(DELETE_FILE_MARKER)) {
102
+ this.ensureUpdateHunkIsNotEmpty(trimmed);
103
+ this.hunks.push({ kind: "delete", path: trimmed.slice(DELETE_FILE_MARKER.length) });
104
+ this.mode = { _tag: "DeleteFile" };
105
+ return true;
106
+ }
107
+ if (trimmed.startsWith(UPDATE_FILE_MARKER)) {
108
+ this.ensureUpdateHunkIsNotEmpty(trimmed);
109
+ const hunk = {
110
+ kind: "update",
111
+ path: trimmed.slice(UPDATE_FILE_MARKER.length),
112
+ movePath: undefined,
113
+ chunks: []
114
+ };
115
+ this.hunks.push(hunk);
116
+ this.mode = { _tag: "UpdateFile", hunkLineNumber: this.lineNumber, hunk };
117
+ return true;
118
+ }
119
+ return false;
120
+ }
121
+ pushDelta(delta) {
122
+ for (const ch of delta) {
123
+ if (ch === "\n") {
124
+ let line = this.lineBuffer;
125
+ this.lineBuffer = "";
126
+ if (line.endsWith("\r"))
127
+ line = line.slice(0, -1);
128
+ this.lineNumber += 1;
129
+ this.processLine(line);
130
+ }
131
+ else {
132
+ this.lineBuffer += ch;
133
+ }
134
+ }
135
+ return this.hunks;
136
+ }
137
+ finish() {
138
+ if (this.lineBuffer !== "") {
139
+ const line = this.lineBuffer;
140
+ this.lineBuffer = "";
141
+ this.lineNumber += 1;
142
+ if (line.trim() === END_PATCH_MARKER) {
143
+ this.ensureUpdateHunkIsNotEmpty(line.trim());
144
+ this.mode = { _tag: "EndedPatch" };
145
+ }
146
+ else {
147
+ this.processLine(line);
148
+ }
149
+ }
150
+ if (this.mode._tag !== "EndedPatch") {
151
+ throw parseError("invalid_patch", "The last line of the patch must be '*** End Patch'");
152
+ }
153
+ return this.hunks;
154
+ }
155
+ processLine(line) {
156
+ const trimmed = line.trim();
157
+ switch (this.mode._tag) {
158
+ case "NotStarted": {
159
+ if (trimmed === BEGIN_PATCH_MARKER) {
160
+ this.mode = { _tag: "StartedPatch" };
161
+ return;
162
+ }
163
+ throw parseError("invalid_patch", "The first line of the patch must be '*** Begin Patch'");
164
+ }
165
+ case "StartedPatch": {
166
+ if (this.handleHunkHeadersAndEndPatch(trimmed))
167
+ return;
168
+ throw invalidHunkHeader(trimmed, this.lineNumber);
169
+ }
170
+ case "AddFile": {
171
+ if (this.handleHunkHeadersAndEndPatch(trimmed))
172
+ return;
173
+ const last = this.hunks[this.hunks.length - 1];
174
+ if (line.startsWith("+") && last !== undefined && last.kind === "add") {
175
+ last.contents += `${line.slice(1)}\n`;
176
+ return;
177
+ }
178
+ throw invalidHunkHeader(trimmed, this.lineNumber);
179
+ }
180
+ case "DeleteFile": {
181
+ if (this.handleHunkHeadersAndEndPatch(trimmed))
182
+ return;
183
+ throw invalidHunkHeader(trimmed, this.lineNumber);
184
+ }
185
+ case "UpdateFile": {
186
+ const updateLine = line.replace(/\s+$/, "");
187
+ if (this.handleHunkHeadersAndEndPatch(updateLine))
188
+ return;
189
+ const hunk = this.mode.hunk;
190
+ const chunks = hunk.chunks;
191
+ const lastChunk = chunks[chunks.length - 1];
192
+ if (lastChunk !== undefined && lastChunk.isEndOfFile) {
193
+ if (updateLine === "")
194
+ return;
195
+ if (updateLine !== EMPTY_CHANGE_CONTEXT_MARKER && !updateLine.startsWith(CHANGE_CONTEXT_MARKER)) {
196
+ throw parseError("invalid_hunk", `Expected update hunk to start with a @@ context marker, got: '${line}'`, this.lineNumber);
197
+ }
198
+ }
199
+ if (chunks.length === 0 && hunk.movePath === undefined && updateLine.startsWith(MOVE_TO_MARKER)) {
200
+ hunk.movePath = updateLine.slice(MOVE_TO_MARKER.length);
201
+ return;
202
+ }
203
+ if ((updateLine === EMPTY_CHANGE_CONTEXT_MARKER || updateLine.startsWith(CHANGE_CONTEXT_MARKER)) &&
204
+ lastChunk !== undefined && lastChunk.oldLines.length === 0 && lastChunk.newLines.length === 0) {
205
+ throw unexpectedUpdateLine(line, this.lineNumber);
206
+ }
207
+ if (updateLine === EMPTY_CHANGE_CONTEXT_MARKER) {
208
+ chunks.push({ changeContext: undefined, oldLines: [], newLines: [], isEndOfFile: false });
209
+ return;
210
+ }
211
+ if (updateLine.startsWith(CHANGE_CONTEXT_MARKER)) {
212
+ chunks.push({
213
+ changeContext: updateLine.slice(CHANGE_CONTEXT_MARKER.length),
214
+ oldLines: [],
215
+ newLines: [],
216
+ isEndOfFile: false
217
+ });
218
+ return;
219
+ }
220
+ if (updateLine === EOF_MARKER) {
221
+ if (lastChunk !== undefined && lastChunk.oldLines.length === 0 && lastChunk.newLines.length === 0) {
222
+ throw parseError("invalid_hunk", "Update hunk does not contain any lines", this.lineNumber);
223
+ }
224
+ if (lastChunk !== undefined)
225
+ lastChunk.isEndOfFile = true;
226
+ return;
227
+ }
228
+ const ensureChunk = () => {
229
+ if (chunks.length === 0) {
230
+ chunks.push({ changeContext: undefined, oldLines: [], newLines: [], isEndOfFile: false });
231
+ }
232
+ return chunks[chunks.length - 1];
233
+ };
234
+ if (line === "") {
235
+ const chunk = ensureChunk();
236
+ chunk.oldLines.push("");
237
+ chunk.newLines.push("");
238
+ return;
239
+ }
240
+ if (line.startsWith(" ")) {
241
+ const chunk = ensureChunk();
242
+ chunk.oldLines.push(line.slice(1));
243
+ chunk.newLines.push(line.slice(1));
244
+ return;
245
+ }
246
+ if (line.startsWith("+")) {
247
+ ensureChunk().newLines.push(line.slice(1));
248
+ return;
249
+ }
250
+ if (line.startsWith("-")) {
251
+ ensureChunk().oldLines.push(line.slice(1));
252
+ return;
253
+ }
254
+ if (lastChunk !== undefined && (lastChunk.oldLines.length > 0 || lastChunk.newLines.length > 0)) {
255
+ throw parseError("invalid_hunk", `Expected update hunk to start with a @@ context marker, got: '${line}'`, this.lineNumber);
256
+ }
257
+ throw unexpectedUpdateLine(line, this.lineNumber);
258
+ }
259
+ case "EndedPatch": {
260
+ if (trimmed === "")
261
+ return;
262
+ throw parseError("invalid_patch", "The last line of the patch must be '*** End Patch'");
263
+ }
264
+ }
265
+ }
266
+ }
267
+ const checkStartAndEndLinesStrict = (firstLine, lastLine) => {
268
+ const first = firstLine?.trim();
269
+ const last = lastLine?.trim();
270
+ if (first === BEGIN_PATCH_MARKER && last === END_PATCH_MARKER)
271
+ return;
272
+ if (first !== undefined && first !== BEGIN_PATCH_MARKER) {
273
+ throw parseError("invalid_patch", "The first line of the patch must be '*** Begin Patch'");
274
+ }
275
+ throw parseError("invalid_patch", "The last line of the patch must be '*** End Patch'");
276
+ };
277
+ const checkPatchBoundariesStrict = (lines) => {
278
+ checkStartAndEndLinesStrict(lines[0], lines.length === 0 ? undefined : lines[lines.length - 1]);
279
+ return lines;
280
+ };
281
+ const checkPatchBoundariesLenient = (originalLines) => {
282
+ let originalError;
283
+ try {
284
+ return checkPatchBoundariesStrict(originalLines);
285
+ }
286
+ catch (error) {
287
+ originalError = error;
288
+ }
289
+ if (originalLines.length >= 2) {
290
+ const first = originalLines[0];
291
+ const last = originalLines[originalLines.length - 1];
292
+ if ((first === "<<EOF" || first === "<<'EOF'" || first === "<<\"EOF\"") &&
293
+ last.endsWith("EOF") && originalLines.length >= 4) {
294
+ return checkPatchBoundariesStrict(originalLines.slice(1, -1));
295
+ }
296
+ }
297
+ throw originalError;
298
+ };
299
+ /**
300
+ * Parse a complete patch text; lenient mode (heredoc unwrapping) is always
301
+ * on, matching Codex.
302
+ *
303
+ * @since 1.0.0
304
+ * @private
305
+ */
306
+ export const parsePatch = (patch) => {
307
+ const trimmed = patch.trim();
308
+ const lines = trimmed === "" ? [] : trimmed.split("\n");
309
+ const patchLines = checkPatchBoundariesLenient(lines);
310
+ const parser = new StreamingPatchParser();
311
+ parser.pushDelta(`${patchLines.join("\n")}\n`);
312
+ const hunks = parser.finish();
313
+ return { hunks, environmentId: parser.environmentId() };
314
+ };
315
+ const normalise = (s) => [...s.trim()].map((c) => {
316
+ switch (c) {
317
+ case "‐":
318
+ case "‑":
319
+ case "‒":
320
+ case "–":
321
+ case "—":
322
+ case "―":
323
+ case "−":
324
+ return "-";
325
+ case "‘":
326
+ case "’":
327
+ case "‚":
328
+ case "‛":
329
+ return "'";
330
+ case "“":
331
+ case "”":
332
+ case "„":
333
+ case "‟":
334
+ return "\"";
335
+ case " ":
336
+ case " ":
337
+ case " ":
338
+ case " ":
339
+ case " ":
340
+ case " ":
341
+ case " ":
342
+ case " ":
343
+ case " ":
344
+ case " ":
345
+ case " ":
346
+ case " ":
347
+ case " ":
348
+ return " ";
349
+ default:
350
+ return c;
351
+ }
352
+ }).join("");
353
+ /**
354
+ * Fuzzy sequence search with the Codex leniency ladder: exact, rstrip, trim,
355
+ * then unicode-normalised comparison; end-of-file patterns anchor at the end
356
+ * first.
357
+ *
358
+ * @since 1.0.0
359
+ * @private
360
+ */
361
+ export const seekSequence = (lines, pattern, start, eof) => {
362
+ if (pattern.length === 0)
363
+ return start;
364
+ if (pattern.length > lines.length)
365
+ return undefined;
366
+ const searchStart = eof && lines.length >= pattern.length ? lines.length - pattern.length : start;
367
+ const upper = lines.length - pattern.length;
368
+ const passes = [
369
+ (a, b) => a === b,
370
+ (a, b) => a.replace(/\s+$/, "") === b.replace(/\s+$/, ""),
371
+ (a, b) => a.trim() === b.trim(),
372
+ (a, b) => normalise(a) === normalise(b)
373
+ ];
374
+ for (const equals of passes) {
375
+ for (let i = searchStart; i <= upper; i++) {
376
+ let ok = true;
377
+ for (let p = 0; p < pattern.length; p++) {
378
+ if (!equals(lines[i + p], pattern[p])) {
379
+ ok = false;
380
+ break;
381
+ }
382
+ }
383
+ if (ok)
384
+ return i;
385
+ }
386
+ }
387
+ return undefined;
388
+ };
389
+ /**
390
+ * Applier failure carrying the Codex message text verbatim.
391
+ *
392
+ * `context_not_found` is an `@@` context line absent from the file;
393
+ * `lines_not_found` is a chunk whose expected lines are absent.
394
+ *
395
+ * @since 1.0.0
396
+ * @private
397
+ */
398
+ export class ComputeReplacementsError extends Schema.TaggedError()("@smthrs/std/ComputeReplacementsError", {
399
+ reason: Schema.Literals(["context_not_found", "lines_not_found"]),
400
+ path: Schema.String,
401
+ message: Schema.String
402
+ }) {
403
+ }
404
+ const computeReplacements = (originalLines, path, chunks) => {
405
+ const replacements = [];
406
+ let lineIndex = 0;
407
+ for (const chunk of chunks) {
408
+ if (chunk.changeContext !== undefined) {
409
+ const idx = seekSequence(originalLines, [chunk.changeContext], lineIndex, false);
410
+ if (idx === undefined) {
411
+ throw new ComputeReplacementsError({
412
+ reason: "context_not_found",
413
+ path,
414
+ message: `Failed to find context '${chunk.changeContext}' in ${path}`
415
+ });
416
+ }
417
+ lineIndex = idx + 1;
418
+ }
419
+ if (chunk.oldLines.length === 0) {
420
+ const insertionIdx = originalLines.length > 0 && originalLines[originalLines.length - 1] === ""
421
+ ? originalLines.length - 1
422
+ : originalLines.length;
423
+ replacements.push([insertionIdx, 0, [...chunk.newLines]]);
424
+ continue;
425
+ }
426
+ let pattern = chunk.oldLines;
427
+ let newSlice = chunk.newLines;
428
+ let found = seekSequence(originalLines, pattern, lineIndex, chunk.isEndOfFile);
429
+ if (found === undefined && pattern[pattern.length - 1] === "") {
430
+ pattern = pattern.slice(0, -1);
431
+ if (newSlice[newSlice.length - 1] === "")
432
+ newSlice = newSlice.slice(0, -1);
433
+ found = seekSequence(originalLines, pattern, lineIndex, chunk.isEndOfFile);
434
+ }
435
+ if (found !== undefined) {
436
+ replacements.push([found, pattern.length, [...newSlice]]);
437
+ lineIndex = found + pattern.length;
438
+ }
439
+ else {
440
+ throw new ComputeReplacementsError({
441
+ reason: "lines_not_found",
442
+ path,
443
+ message: `Failed to find expected lines in ${path}:\n${chunk.oldLines.join("\n")}`
444
+ });
445
+ }
446
+ }
447
+ replacements.sort((a, b) => a[0] - b[0]);
448
+ return replacements;
449
+ };
450
+ const applyReplacements = (lines, replacements) => {
451
+ for (let r = replacements.length - 1; r >= 0; r--) {
452
+ const [startIdx, oldLength, newSegment] = replacements[r];
453
+ lines.splice(startIdx, Math.min(oldLength, Math.max(lines.length - startIdx, 0)), ...newSegment);
454
+ }
455
+ return lines;
456
+ };
457
+ /**
458
+ * Derive the new file contents for an update hunk from the original
459
+ * contents, matching Codex `derive_new_contents_from_chunks`.
460
+ *
461
+ * @since 1.0.0
462
+ * @private
463
+ */
464
+ export const deriveNewContents = (originalContents, path, chunks) => {
465
+ const originalLines = sourceLines(originalContents);
466
+ const replacements = computeReplacements(originalLines, path, chunks);
467
+ const newLines = applyReplacements([...originalLines], replacements);
468
+ if (newLines[newLines.length - 1] !== "")
469
+ newLines.push("");
470
+ return newLines.join("\n");
471
+ };
472
+ /**
473
+ * Render the Codex success summary: `Success. Updated the following files:`
474
+ * with `A`/`M`/`D` lines for adds, updates, and deletes in that order.
475
+ *
476
+ * @since 1.0.0
477
+ * @private
478
+ */
479
+ export const printSummary = (affected) => {
480
+ const lines = ["Success. Updated the following files:"];
481
+ for (const path of affected.added)
482
+ lines.push(`A ${path}`);
483
+ for (const path of affected.modified)
484
+ lines.push(`M ${path}`);
485
+ for (const path of affected.deleted)
486
+ lines.push(`D ${path}`);
487
+ return `${lines.join("\n")}\n`;
488
+ };
489
+ //# sourceMappingURL=ApplyPatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApplyPatch.js","sourceRoot":"","sources":["../../../src/internal/ApplyPatch.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Faithful port of the Codex CLI apply_patch engine.\n *\n * Mirrors `codex-rs/apply-patch/src/{parser,streaming_parser,seek_sequence}.rs`\n * and the applier in `lib.rs`: the V4A patch grammar, the lenient heredoc\n * boundary handling, the fuzzy context-matching ladder, and every error\n * string, so ChatGPT-family models see exactly the behavior they were\n * posttrained on. Pure module: no host access.\n *\n * @since 1.0.0\n */\n\nimport * as Schema from \"effect/Schema\"\nimport { sourceLines } from \"./Text.ts\"\n\nconst BEGIN_PATCH_MARKER = \"*** Begin Patch\"\nconst END_PATCH_MARKER = \"*** End Patch\"\nconst ADD_FILE_MARKER = \"*** Add File: \"\nconst DELETE_FILE_MARKER = \"*** Delete File: \"\nconst UPDATE_FILE_MARKER = \"*** Update File: \"\nconst MOVE_TO_MARKER = \"*** Move to: \"\nconst EOF_MARKER = \"*** End of File\"\nconst CHANGE_CONTEXT_MARKER = \"@@ \"\nconst EMPTY_CHANGE_CONTEXT_MARKER = \"@@\"\nconst ENVIRONMENT_ID_MARKER = \"*** Environment ID:\"\n\n/**\n * Parse failure with Codex-identical message text.\n *\n * `invalid patch: {message}` for patch-level failures and\n * `invalid hunk at line {line}, {message}` for hunk-level failures.\n *\n * @since 1.0.0\n * @private\n */\nexport class ParseError extends Schema.TaggedError<ParseError>()(\"@smthrs/std/ParseError\", {\n kind: Schema.Literals([\"invalid_patch\", \"invalid_hunk\"]),\n detail: Schema.String,\n lineNumber: Schema.UndefinedOr(Schema.Number)\n}) {\n override get message(): string {\n return this.kind === \"invalid_patch\"\n ? `invalid patch: ${this.detail}`\n : `invalid hunk at line ${this.lineNumber}, ${this.detail}`\n }\n}\n\nconst parseError = (kind: ParseError[\"kind\"], detail: string, lineNumber?: number): ParseError =>\n new ParseError({ kind, detail, lineNumber })\n\n/**\n * One replaced region of an update hunk.\n *\n * @since 1.0.0\n * @private\n */\nexport interface UpdateFileChunk {\n changeContext: string | undefined\n oldLines: Array<string>\n newLines: Array<string>\n isEndOfFile: boolean\n}\n\n/**\n * A parsed patch hunk.\n *\n * @since 1.0.0\n * @private\n */\nexport type Hunk =\n | { readonly kind: \"add\"; readonly path: string; contents: string }\n | { readonly kind: \"delete\"; readonly path: string }\n | {\n readonly kind: \"update\"\n readonly path: string\n movePath: string | undefined\n readonly chunks: Array<UpdateFileChunk>\n }\n\n/**\n * Parsed patch: hunks plus the optional environment id preamble.\n *\n * @since 1.0.0\n * @private\n */\nexport interface ParsedPatch {\n readonly hunks: ReadonlyArray<Hunk>\n readonly environmentId: string | undefined\n}\n\ntype Mode =\n | { readonly _tag: \"NotStarted\" }\n | { readonly _tag: \"StartedPatch\" }\n | { readonly _tag: \"AddFile\" }\n | { readonly _tag: \"DeleteFile\" }\n | { readonly _tag: \"UpdateFile\"; readonly hunkLineNumber: number; readonly hunk: Extract<Hunk, { kind: \"update\" }> }\n | { readonly _tag: \"EndedPatch\" }\n\nconst invalidHunkHeader = (trimmed: string, lineNumber: number): ParseError =>\n parseError(\n \"invalid_hunk\",\n `'${trimmed}' is not a valid hunk header. Valid hunk headers: '*** Add File: {path}', '*** Delete File: {path}', '*** Update File: {path}'`,\n lineNumber\n )\n\nconst unexpectedUpdateLine = (line: string, lineNumber: number): ParseError =>\n parseError(\n \"invalid_hunk\",\n `Unexpected line found in update hunk: '${line}'. Every line should start with ' ' (context line), '+' (added line), or '-' (removed line)`,\n lineNumber\n )\n\n/**\n * Streaming line state machine for the V4A patch grammar; a faithful port of\n * `StreamingPatchParser`.\n *\n * @since 1.0.0\n * @private\n */\nexport class StreamingPatchParser {\n private lineBuffer = \"\"\n private mode: Mode = { _tag: \"NotStarted\" }\n private hunks: Array<Hunk> = []\n private lineNumber = 0\n private _environmentId: string | undefined\n\n environmentId(): string | undefined {\n return this._environmentId\n }\n\n private ensureUpdateHunkIsNotEmpty(line: string): void {\n const last = this.hunks[this.hunks.length - 1]\n if (last === undefined || last.kind !== \"update\") return\n if (last.chunks.length === 0 && this.mode._tag === \"UpdateFile\") {\n throw parseError(\n \"invalid_hunk\",\n `Update file hunk for path '${last.path}' is empty`,\n this.mode.hunkLineNumber\n )\n }\n const chunk = last.chunks[last.chunks.length - 1]\n if (chunk !== undefined && chunk.oldLines.length === 0 && chunk.newLines.length === 0) {\n if (line === END_PATCH_MARKER) {\n throw parseError(\"invalid_hunk\", \"Update hunk does not contain any lines\", this.lineNumber)\n }\n throw unexpectedUpdateLine(line, this.lineNumber)\n }\n }\n\n private handleHunkHeadersAndEndPatch(trimmed: string): boolean {\n if (this.mode._tag === \"StartedPatch\" && trimmed.startsWith(ENVIRONMENT_ID_MARKER)) {\n if (this._environmentId !== undefined) {\n throw parseError(\"invalid_patch\", \"apply_patch environment_id cannot be specified more than once\")\n }\n const environmentId = trimmed.slice(ENVIRONMENT_ID_MARKER.length).trim()\n if (environmentId === \"\") {\n throw parseError(\"invalid_patch\", \"apply_patch environment_id cannot be empty\")\n }\n this._environmentId = environmentId\n return true\n }\n if (trimmed === END_PATCH_MARKER) {\n this.ensureUpdateHunkIsNotEmpty(trimmed)\n this.mode = { _tag: \"EndedPatch\" }\n return true\n }\n if (trimmed.startsWith(ADD_FILE_MARKER)) {\n this.ensureUpdateHunkIsNotEmpty(trimmed)\n this.hunks.push({ kind: \"add\", path: trimmed.slice(ADD_FILE_MARKER.length), contents: \"\" })\n this.mode = { _tag: \"AddFile\" }\n return true\n }\n if (trimmed.startsWith(DELETE_FILE_MARKER)) {\n this.ensureUpdateHunkIsNotEmpty(trimmed)\n this.hunks.push({ kind: \"delete\", path: trimmed.slice(DELETE_FILE_MARKER.length) })\n this.mode = { _tag: \"DeleteFile\" }\n return true\n }\n if (trimmed.startsWith(UPDATE_FILE_MARKER)) {\n this.ensureUpdateHunkIsNotEmpty(trimmed)\n const hunk: Extract<Hunk, { kind: \"update\" }> = {\n kind: \"update\",\n path: trimmed.slice(UPDATE_FILE_MARKER.length),\n movePath: undefined,\n chunks: []\n }\n this.hunks.push(hunk)\n this.mode = { _tag: \"UpdateFile\", hunkLineNumber: this.lineNumber, hunk }\n return true\n }\n return false\n }\n\n pushDelta(delta: string): ReadonlyArray<Hunk> {\n for (const ch of delta) {\n if (ch === \"\\n\") {\n let line = this.lineBuffer\n this.lineBuffer = \"\"\n if (line.endsWith(\"\\r\")) line = line.slice(0, -1)\n this.lineNumber += 1\n this.processLine(line)\n } else {\n this.lineBuffer += ch\n }\n }\n return this.hunks\n }\n\n finish(): ReadonlyArray<Hunk> {\n if (this.lineBuffer !== \"\") {\n const line = this.lineBuffer\n this.lineBuffer = \"\"\n this.lineNumber += 1\n if (line.trim() === END_PATCH_MARKER) {\n this.ensureUpdateHunkIsNotEmpty(line.trim())\n this.mode = { _tag: \"EndedPatch\" }\n } else {\n this.processLine(line)\n }\n }\n if (this.mode._tag !== \"EndedPatch\") {\n throw parseError(\"invalid_patch\", \"The last line of the patch must be '*** End Patch'\")\n }\n return this.hunks\n }\n\n private processLine(line: string): void {\n const trimmed = line.trim()\n switch (this.mode._tag) {\n case \"NotStarted\": {\n if (trimmed === BEGIN_PATCH_MARKER) {\n this.mode = { _tag: \"StartedPatch\" }\n return\n }\n throw parseError(\"invalid_patch\", \"The first line of the patch must be '*** Begin Patch'\")\n }\n case \"StartedPatch\": {\n if (this.handleHunkHeadersAndEndPatch(trimmed)) return\n throw invalidHunkHeader(trimmed, this.lineNumber)\n }\n case \"AddFile\": {\n if (this.handleHunkHeadersAndEndPatch(trimmed)) return\n const last = this.hunks[this.hunks.length - 1]\n if (line.startsWith(\"+\") && last !== undefined && last.kind === \"add\") {\n last.contents += `${line.slice(1)}\\n`\n return\n }\n throw invalidHunkHeader(trimmed, this.lineNumber)\n }\n case \"DeleteFile\": {\n if (this.handleHunkHeadersAndEndPatch(trimmed)) return\n throw invalidHunkHeader(trimmed, this.lineNumber)\n }\n case \"UpdateFile\": {\n const updateLine = line.replace(/\\s+$/, \"\")\n if (this.handleHunkHeadersAndEndPatch(updateLine)) return\n\n const hunk = this.mode.hunk\n const chunks = hunk.chunks\n const lastChunk = chunks[chunks.length - 1]\n if (lastChunk !== undefined && lastChunk.isEndOfFile) {\n if (updateLine === \"\") return\n if (updateLine !== EMPTY_CHANGE_CONTEXT_MARKER && !updateLine.startsWith(CHANGE_CONTEXT_MARKER)) {\n throw parseError(\n \"invalid_hunk\",\n `Expected update hunk to start with a @@ context marker, got: '${line}'`,\n this.lineNumber\n )\n }\n }\n\n if (chunks.length === 0 && hunk.movePath === undefined && updateLine.startsWith(MOVE_TO_MARKER)) {\n hunk.movePath = updateLine.slice(MOVE_TO_MARKER.length)\n return\n }\n\n if (\n (updateLine === EMPTY_CHANGE_CONTEXT_MARKER || updateLine.startsWith(CHANGE_CONTEXT_MARKER)) &&\n lastChunk !== undefined && lastChunk.oldLines.length === 0 && lastChunk.newLines.length === 0\n ) {\n throw unexpectedUpdateLine(line, this.lineNumber)\n }\n\n if (updateLine === EMPTY_CHANGE_CONTEXT_MARKER) {\n chunks.push({ changeContext: undefined, oldLines: [], newLines: [], isEndOfFile: false })\n return\n }\n\n if (updateLine.startsWith(CHANGE_CONTEXT_MARKER)) {\n chunks.push({\n changeContext: updateLine.slice(CHANGE_CONTEXT_MARKER.length),\n oldLines: [],\n newLines: [],\n isEndOfFile: false\n })\n return\n }\n\n if (updateLine === EOF_MARKER) {\n if (lastChunk !== undefined && lastChunk.oldLines.length === 0 && lastChunk.newLines.length === 0) {\n throw parseError(\"invalid_hunk\", \"Update hunk does not contain any lines\", this.lineNumber)\n }\n if (lastChunk !== undefined) lastChunk.isEndOfFile = true\n return\n }\n\n const ensureChunk = (): UpdateFileChunk => {\n if (chunks.length === 0) {\n chunks.push({ changeContext: undefined, oldLines: [], newLines: [], isEndOfFile: false })\n }\n return chunks[chunks.length - 1]!\n }\n\n if (line === \"\") {\n const chunk = ensureChunk()\n chunk.oldLines.push(\"\")\n chunk.newLines.push(\"\")\n return\n }\n if (line.startsWith(\" \")) {\n const chunk = ensureChunk()\n chunk.oldLines.push(line.slice(1))\n chunk.newLines.push(line.slice(1))\n return\n }\n if (line.startsWith(\"+\")) {\n ensureChunk().newLines.push(line.slice(1))\n return\n }\n if (line.startsWith(\"-\")) {\n ensureChunk().oldLines.push(line.slice(1))\n return\n }\n if (lastChunk !== undefined && (lastChunk.oldLines.length > 0 || lastChunk.newLines.length > 0)) {\n throw parseError(\n \"invalid_hunk\",\n `Expected update hunk to start with a @@ context marker, got: '${line}'`,\n this.lineNumber\n )\n }\n throw unexpectedUpdateLine(line, this.lineNumber)\n }\n case \"EndedPatch\": {\n if (trimmed === \"\") return\n throw parseError(\"invalid_patch\", \"The last line of the patch must be '*** End Patch'\")\n }\n }\n }\n}\n\nconst checkStartAndEndLinesStrict = (firstLine: string | undefined, lastLine: string | undefined): void => {\n const first = firstLine?.trim()\n const last = lastLine?.trim()\n if (first === BEGIN_PATCH_MARKER && last === END_PATCH_MARKER) return\n if (first !== undefined && first !== BEGIN_PATCH_MARKER) {\n throw parseError(\"invalid_patch\", \"The first line of the patch must be '*** Begin Patch'\")\n }\n throw parseError(\"invalid_patch\", \"The last line of the patch must be '*** End Patch'\")\n}\n\nconst checkPatchBoundariesStrict = (lines: ReadonlyArray<string>): ReadonlyArray<string> => {\n checkStartAndEndLinesStrict(lines[0], lines.length === 0 ? undefined : lines[lines.length - 1])\n return lines\n}\n\nconst checkPatchBoundariesLenient = (originalLines: ReadonlyArray<string>): ReadonlyArray<string> => {\n let originalError: ParseError\n try {\n return checkPatchBoundariesStrict(originalLines)\n } catch (error) {\n originalError = error as ParseError\n }\n if (originalLines.length >= 2) {\n const first = originalLines[0]!\n const last = originalLines[originalLines.length - 1]!\n if (\n (first === \"<<EOF\" || first === \"<<'EOF'\" || first === \"<<\\\"EOF\\\"\") &&\n last.endsWith(\"EOF\") && originalLines.length >= 4\n ) {\n return checkPatchBoundariesStrict(originalLines.slice(1, -1))\n }\n }\n throw originalError\n}\n\n/**\n * Parse a complete patch text; lenient mode (heredoc unwrapping) is always\n * on, matching Codex.\n *\n * @since 1.0.0\n * @private\n */\nexport const parsePatch = (patch: string): ParsedPatch => {\n const trimmed = patch.trim()\n const lines = trimmed === \"\" ? [] : trimmed.split(\"\\n\")\n const patchLines = checkPatchBoundariesLenient(lines)\n const parser = new StreamingPatchParser()\n parser.pushDelta(`${patchLines.join(\"\\n\")}\\n`)\n const hunks = parser.finish()\n return { hunks, environmentId: parser.environmentId() }\n}\n\nconst normalise = (s: string): string =>\n [...s.trim()].map((c) => {\n switch (c) {\n case \"‐\":\n case \"‑\":\n case \"‒\":\n case \"–\":\n case \"—\":\n case \"―\":\n case \"−\":\n return \"-\"\n case \"‘\":\n case \"’\":\n case \"‚\":\n case \"‛\":\n return \"'\"\n case \"“\":\n case \"”\":\n case \"„\":\n case \"‟\":\n return \"\\\"\"\n case \" \":\n case \" \":\n case \" \":\n case \" \":\n case \" \":\n case \" \":\n case \" \":\n case \" \":\n case \" \":\n case \" \":\n case \" \":\n case \" \":\n case \" \":\n return \" \"\n default:\n return c\n }\n }).join(\"\")\n\n/**\n * Fuzzy sequence search with the Codex leniency ladder: exact, rstrip, trim,\n * then unicode-normalised comparison; end-of-file patterns anchor at the end\n * first.\n *\n * @since 1.0.0\n * @private\n */\nexport const seekSequence = (\n lines: ReadonlyArray<string>,\n pattern: ReadonlyArray<string>,\n start: number,\n eof: boolean\n): number | undefined => {\n if (pattern.length === 0) return start\n if (pattern.length > lines.length) return undefined\n const searchStart = eof && lines.length >= pattern.length ? lines.length - pattern.length : start\n const upper = lines.length - pattern.length\n const passes: ReadonlyArray<(a: string, b: string) => boolean> = [\n (a, b) => a === b,\n (a, b) => a.replace(/\\s+$/, \"\") === b.replace(/\\s+$/, \"\"),\n (a, b) => a.trim() === b.trim(),\n (a, b) => normalise(a) === normalise(b)\n ]\n for (const equals of passes) {\n for (let i = searchStart; i <= upper; i++) {\n let ok = true\n for (let p = 0; p < pattern.length; p++) {\n if (!equals(lines[i + p]!, pattern[p]!)) {\n ok = false\n break\n }\n }\n if (ok) return i\n }\n }\n return undefined\n}\n\n/**\n * Applier failure carrying the Codex message text verbatim.\n *\n * `context_not_found` is an `@@` context line absent from the file;\n * `lines_not_found` is a chunk whose expected lines are absent.\n *\n * @since 1.0.0\n * @private\n */\nexport class ComputeReplacementsError extends Schema.TaggedError<ComputeReplacementsError>()(\n \"@smthrs/std/ComputeReplacementsError\",\n {\n reason: Schema.Literals([\"context_not_found\", \"lines_not_found\"]),\n path: Schema.String,\n message: Schema.String\n }\n) {}\n\ntype Replacement = readonly [startIndex: number, oldLength: number, newLines: ReadonlyArray<string>]\n\nconst computeReplacements = (\n originalLines: ReadonlyArray<string>,\n path: string,\n chunks: ReadonlyArray<UpdateFileChunk>\n): Array<Replacement> => {\n const replacements: Array<Replacement> = []\n let lineIndex = 0\n\n for (const chunk of chunks) {\n if (chunk.changeContext !== undefined) {\n const idx = seekSequence(originalLines, [chunk.changeContext], lineIndex, false)\n if (idx === undefined) {\n throw new ComputeReplacementsError({\n reason: \"context_not_found\",\n path,\n message: `Failed to find context '${chunk.changeContext}' in ${path}`\n })\n }\n lineIndex = idx + 1\n }\n\n if (chunk.oldLines.length === 0) {\n const insertionIdx = originalLines.length > 0 && originalLines[originalLines.length - 1] === \"\"\n ? originalLines.length - 1\n : originalLines.length\n replacements.push([insertionIdx, 0, [...chunk.newLines]])\n continue\n }\n\n let pattern: ReadonlyArray<string> = chunk.oldLines\n let newSlice: ReadonlyArray<string> = chunk.newLines\n let found = seekSequence(originalLines, pattern, lineIndex, chunk.isEndOfFile)\n\n if (found === undefined && pattern[pattern.length - 1] === \"\") {\n pattern = pattern.slice(0, -1)\n if (newSlice[newSlice.length - 1] === \"\") newSlice = newSlice.slice(0, -1)\n found = seekSequence(originalLines, pattern, lineIndex, chunk.isEndOfFile)\n }\n\n if (found !== undefined) {\n replacements.push([found, pattern.length, [...newSlice]])\n lineIndex = found + pattern.length\n } else {\n throw new ComputeReplacementsError({\n reason: \"lines_not_found\",\n path,\n message: `Failed to find expected lines in ${path}:\\n${chunk.oldLines.join(\"\\n\")}`\n })\n }\n }\n\n replacements.sort((a, b) => a[0] - b[0])\n return replacements\n}\n\nconst applyReplacements = (lines: Array<string>, replacements: ReadonlyArray<Replacement>): Array<string> => {\n for (let r = replacements.length - 1; r >= 0; r--) {\n const [startIdx, oldLength, newSegment] = replacements[r]!\n lines.splice(startIdx, Math.min(oldLength, Math.max(lines.length - startIdx, 0)), ...newSegment)\n }\n return lines\n}\n\n/**\n * Derive the new file contents for an update hunk from the original\n * contents, matching Codex `derive_new_contents_from_chunks`.\n *\n * @since 1.0.0\n * @private\n */\nexport const deriveNewContents = (\n originalContents: string,\n path: string,\n chunks: ReadonlyArray<UpdateFileChunk>\n): string => {\n const originalLines = sourceLines(originalContents)\n const replacements = computeReplacements(originalLines, path, chunks)\n const newLines = applyReplacements([...originalLines], replacements)\n if (newLines[newLines.length - 1] !== \"\") newLines.push(\"\")\n return newLines.join(\"\\n\")\n}\n\n/**\n * Render the Codex success summary: `Success. Updated the following files:`\n * with `A`/`M`/`D` lines for adds, updates, and deletes in that order.\n *\n * @since 1.0.0\n * @private\n */\nexport const printSummary = (affected: {\n readonly added: ReadonlyArray<string>\n readonly modified: ReadonlyArray<string>\n readonly deleted: ReadonlyArray<string>\n}): string => {\n const lines = [\"Success. Updated the following files:\"]\n for (const path of affected.added) lines.push(`A ${path}`)\n for (const path of affected.modified) lines.push(`M ${path}`)\n for (const path of affected.deleted) lines.push(`D ${path}`)\n return `${lines.join(\"\\n\")}\\n`\n}\n"]}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Faithful port of Codex CLI output truncation.
3
+ *
4
+ * Mirrors `codex-rs/utils/string/src/truncate.rs` and
5
+ * `codex-rs/utils/output-truncation/src/lib.rs`: middle truncation on UTF-8
6
+ * boundaries with a `…{n} tokens truncated…` marker and a 4-bytes-per-token
7
+ * estimate, so ChatGPT-family models see the exact shapes they were
8
+ * posttrained on.
9
+ *
10
+ * @since 1.0.0
11
+ */
12
+ /**
13
+ * UTF-8 byte length of a string.
14
+ *
15
+ * @since 1.0.0
16
+ * @private
17
+ */
18
+ export declare const byteLength: (text: string) => number;
19
+ /**
20
+ * Approximate token count: ceil(utf8Bytes / 4).
21
+ *
22
+ * @since 1.0.0
23
+ * @private
24
+ */
25
+ export declare const approxTokenCount: (text: string) => number;
26
+ /**
27
+ * Approximate byte budget for a token budget.
28
+ *
29
+ * @since 1.0.0
30
+ * @private
31
+ */
32
+ export declare const approxBytesForTokens: (tokens: number) => number;
33
+ /**
34
+ * Approximate tokens represented by a byte count: ceil(bytes / 4).
35
+ *
36
+ * @since 1.0.0
37
+ * @private
38
+ */
39
+ export declare const approxTokensFromByteCount: (bytes: number) => number;
40
+ /**
41
+ * Middle-truncate to a byte budget with a char-count marker.
42
+ *
43
+ * @since 1.0.0
44
+ * @private
45
+ */
46
+ export declare const truncateMiddleChars: (s: string, maxBytes: number) => string;
47
+ /**
48
+ * Middle-truncate to an approximate token budget, preserving the beginning
49
+ * and end. Returns the possibly truncated string and the original token
50
+ * count when truncation occurred.
51
+ *
52
+ * @since 1.0.0
53
+ * @private
54
+ */
55
+ export declare const truncateMiddleWithTokenBudget: (s: string, maxTokens: number) => {
56
+ readonly text: string;
57
+ readonly originalTokenCount: number | undefined;
58
+ };
59
+ /**
60
+ * Codex `format_exec_output_for_model`: exit code, wall time, optional line
61
+ * count disclosure, then the (possibly middle-truncated) output.
62
+ *
63
+ * @since 1.0.0
64
+ * @private
65
+ */
66
+ export declare const formatExecOutputForModel: (options: {
67
+ readonly output: string;
68
+ readonly exitCode: number;
69
+ readonly durationSeconds: number;
70
+ readonly maxOutputTokens: number;
71
+ readonly timedOutAfterMs?: number | undefined;
72
+ }) => string;
73
+ //# sourceMappingURL=CodexText.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodexText.d.ts","sourceRoot":"","sources":["../../../src/internal/CodexText.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH;;;;;GAKG;AACH,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,KAAG,MAAyC,CAAA;AAEnF;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM,KAAG,MACsC,CAAA;AAEtF;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAAI,QAAQ,MAAM,KAAG,MAAyC,CAAA;AAE/F;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,GAAI,OAAO,MAAM,KAAG,MACiB,CAAA;AAqE3E;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,GAAI,GAAG,MAAM,EAAE,UAAU,MAAM,KAAG,MAAsD,CAAA;AAExH;;;;;;;GAOG;AACH,eAAO,MAAM,6BAA6B,GACxC,GAAG,MAAM,EACT,WAAW,MAAM,KAChB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAA;CAQ1E,CAAA;AAQD;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,GAAI,SAAS;IAChD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC9C,KAAG,MAeH,CAAA"}