@smthrs/std 0.0.0-stage → 1.0.0-rc.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +148 -0
- package/LICENSE +21 -0
- package/README.md +156 -2
- package/dist/cjs/ApplyPatch.d.ts +174 -0
- package/dist/cjs/ApplyPatch.d.ts.map +1 -0
- package/dist/cjs/ApplyPatch.js +309 -0
- package/dist/cjs/ApplyPatch.js.map +7 -0
- package/dist/cjs/Bash.d.ts +390 -0
- package/dist/cjs/Bash.d.ts.map +1 -0
- package/dist/cjs/Bash.js +333 -0
- package/dist/cjs/Bash.js.map +7 -0
- package/dist/cjs/Checkpoints.d.ts +322 -0
- package/dist/cjs/Checkpoints.d.ts.map +1 -0
- package/dist/cjs/Checkpoints.js +233 -0
- package/dist/cjs/Checkpoints.js.map +7 -0
- package/dist/cjs/Container.d.ts +132 -0
- package/dist/cjs/Container.d.ts.map +1 -0
- package/dist/cjs/Container.js +113 -0
- package/dist/cjs/Container.js.map +7 -0
- package/dist/cjs/Edit.d.ts +203 -0
- package/dist/cjs/Edit.d.ts.map +1 -0
- package/dist/cjs/Edit.js +258 -0
- package/dist/cjs/Edit.js.map +7 -0
- package/dist/cjs/ExaWebSearch.d.ts +22 -0
- package/dist/cjs/ExaWebSearch.d.ts.map +1 -0
- package/dist/cjs/ExaWebSearch.js +138 -0
- package/dist/cjs/ExaWebSearch.js.map +7 -0
- package/dist/cjs/Explore.d.ts +328 -0
- package/dist/cjs/Explore.d.ts.map +1 -0
- package/dist/cjs/Explore.js +90 -0
- package/dist/cjs/Explore.js.map +7 -0
- package/dist/cjs/Fetch.d.ts +130 -0
- package/dist/cjs/Fetch.d.ts.map +1 -0
- package/dist/cjs/Fetch.js +64 -0
- package/dist/cjs/Fetch.js.map +7 -0
- package/dist/cjs/Glob.d.ts +204 -0
- package/dist/cjs/Glob.d.ts.map +1 -0
- package/dist/cjs/Glob.js +94 -0
- package/dist/cjs/Glob.js.map +7 -0
- package/dist/cjs/Grep.d.ts +347 -0
- package/dist/cjs/Grep.d.ts.map +1 -0
- package/dist/cjs/Grep.js +181 -0
- package/dist/cjs/Grep.js.map +7 -0
- package/dist/cjs/HttpPost.d.ts +130 -0
- package/dist/cjs/HttpPost.d.ts.map +1 -0
- package/dist/cjs/HttpPost.js +72 -0
- package/dist/cjs/HttpPost.js.map +7 -0
- package/dist/cjs/LanguageServer.d.ts +90 -0
- package/dist/cjs/LanguageServer.d.ts.map +1 -0
- package/dist/cjs/LanguageServer.js +60 -0
- package/dist/cjs/LanguageServer.js.map +7 -0
- package/dist/cjs/Ls.d.ts +164 -0
- package/dist/cjs/Ls.d.ts.map +1 -0
- package/dist/cjs/Ls.js +136 -0
- package/dist/cjs/Ls.js.map +7 -0
- package/dist/cjs/Lsp.d.ts +125 -0
- package/dist/cjs/Lsp.d.ts.map +1 -0
- package/dist/cjs/Lsp.js +137 -0
- package/dist/cjs/Lsp.js.map +7 -0
- package/dist/cjs/Manifest.d.ts +918 -0
- package/dist/cjs/Manifest.d.ts.map +1 -0
- package/dist/cjs/Manifest.js +144 -0
- package/dist/cjs/Manifest.js.map +7 -0
- package/dist/cjs/NativeSearch.d.ts +38 -0
- package/dist/cjs/NativeSearch.d.ts.map +1 -0
- package/dist/cjs/NativeSearch.js +326 -0
- package/dist/cjs/NativeSearch.js.map +7 -0
- package/dist/cjs/NodeLanguageServer.d.ts +128 -0
- package/dist/cjs/NodeLanguageServer.d.ts.map +1 -0
- package/dist/cjs/NodeLanguageServer.js +796 -0
- package/dist/cjs/NodeLanguageServer.js.map +7 -0
- package/dist/cjs/PortableSearch.d.ts +36 -0
- package/dist/cjs/PortableSearch.d.ts.map +1 -0
- package/dist/cjs/PortableSearch.js +240 -0
- package/dist/cjs/PortableSearch.js.map +7 -0
- package/dist/cjs/Probe.d.ts +193 -0
- package/dist/cjs/Probe.d.ts.map +1 -0
- package/dist/cjs/Probe.js +134 -0
- package/dist/cjs/Probe.js.map +7 -0
- package/dist/cjs/Read.d.ts +189 -0
- package/dist/cjs/Read.d.ts.map +1 -0
- package/dist/cjs/Read.js +223 -0
- package/dist/cjs/Read.js.map +7 -0
- package/dist/cjs/Relocate.d.ts +73 -0
- package/dist/cjs/Relocate.d.ts.map +1 -0
- package/dist/cjs/Relocate.js +72 -0
- package/dist/cjs/Relocate.js.map +7 -0
- package/dist/cjs/RemoteSearch.d.ts +54 -0
- package/dist/cjs/RemoteSearch.d.ts.map +1 -0
- package/dist/cjs/RemoteSearch.js +134 -0
- package/dist/cjs/RemoteSearch.js.map +7 -0
- package/dist/cjs/Search.d.ts +163 -0
- package/dist/cjs/Search.d.ts.map +1 -0
- package/dist/cjs/Search.js +51 -0
- package/dist/cjs/Search.js.map +7 -0
- package/dist/cjs/SearchConformance.d.ts +115 -0
- package/dist/cjs/SearchConformance.d.ts.map +1 -0
- package/dist/cjs/SearchConformance.js +172 -0
- package/dist/cjs/SearchConformance.js.map +7 -0
- package/dist/cjs/SearchContract.d.ts +114 -0
- package/dist/cjs/SearchContract.d.ts.map +1 -0
- package/dist/cjs/SearchContract.js +339 -0
- package/dist/cjs/SearchContract.js.map +7 -0
- package/dist/cjs/ShellCommand.d.ts +164 -0
- package/dist/cjs/ShellCommand.d.ts.map +1 -0
- package/dist/cjs/ShellCommand.js +102 -0
- package/dist/cjs/ShellCommand.js.map +7 -0
- package/dist/cjs/StdError.d.ts +55 -0
- package/dist/cjs/StdError.d.ts.map +1 -0
- package/dist/cjs/StdError.js +74 -0
- package/dist/cjs/StdError.js.map +7 -0
- package/dist/cjs/TestRun.d.ts +311 -0
- package/dist/cjs/TestRun.d.ts.map +1 -0
- package/dist/cjs/TestRun.js +228 -0
- package/dist/cjs/TestRun.js.map +7 -0
- package/dist/cjs/TestRunner.d.ts +102 -0
- package/dist/cjs/TestRunner.d.ts.map +1 -0
- package/dist/cjs/TestRunner.js +54 -0
- package/dist/cjs/TestRunner.js.map +7 -0
- package/dist/cjs/TreeFingerprint.d.ts +140 -0
- package/dist/cjs/TreeFingerprint.d.ts.map +1 -0
- package/dist/cjs/TreeFingerprint.js +87 -0
- package/dist/cjs/TreeFingerprint.js.map +7 -0
- package/dist/cjs/UpdatePlan.d.ts +152 -0
- package/dist/cjs/UpdatePlan.d.ts.map +1 -0
- package/dist/cjs/UpdatePlan.js +87 -0
- package/dist/cjs/UpdatePlan.js.map +7 -0
- package/dist/cjs/WebFetch.d.ts +134 -0
- package/dist/cjs/WebFetch.d.ts.map +1 -0
- package/dist/cjs/WebFetch.js +140 -0
- package/dist/cjs/WebFetch.js.map +7 -0
- package/dist/cjs/WebSearch.d.ts +181 -0
- package/dist/cjs/WebSearch.d.ts.map +1 -0
- package/dist/cjs/WebSearch.js +86 -0
- package/dist/cjs/WebSearch.js.map +7 -0
- package/dist/cjs/Write.d.ts +147 -0
- package/dist/cjs/Write.d.ts.map +1 -0
- package/dist/cjs/Write.js +122 -0
- package/dist/cjs/Write.js.map +7 -0
- package/dist/cjs/index.d.ts +129 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +101 -0
- package/dist/cjs/index.js.map +7 -0
- package/dist/cjs/internal/ApplyPatch.d.ts +145 -0
- package/dist/cjs/internal/ApplyPatch.d.ts.map +1 -0
- package/dist/cjs/internal/ApplyPatch.js +462 -0
- package/dist/cjs/internal/ApplyPatch.js.map +7 -0
- package/dist/cjs/internal/CodexText.d.ts +73 -0
- package/dist/cjs/internal/CodexText.d.ts.map +1 -0
- package/dist/cjs/internal/CodexText.js +108 -0
- package/dist/cjs/internal/CodexText.js.map +7 -0
- package/dist/cjs/internal/Declaration.d.ts +49 -0
- package/dist/cjs/internal/Declaration.d.ts.map +1 -0
- package/dist/cjs/internal/Declaration.js +46 -0
- package/dist/cjs/internal/Declaration.js.map +7 -0
- package/dist/cjs/internal/Diagnostics.d.ts +77 -0
- package/dist/cjs/internal/Diagnostics.d.ts.map +1 -0
- package/dist/cjs/internal/Diagnostics.js +89 -0
- package/dist/cjs/internal/Diagnostics.js.map +7 -0
- package/dist/cjs/internal/EnvelopePrecheck.d.ts +69 -0
- package/dist/cjs/internal/EnvelopePrecheck.d.ts.map +1 -0
- package/dist/cjs/internal/EnvelopePrecheck.js +323 -0
- package/dist/cjs/internal/EnvelopePrecheck.js.map +7 -0
- package/dist/cjs/internal/Exec.d.ts +151 -0
- package/dist/cjs/internal/Exec.d.ts.map +1 -0
- package/dist/cjs/internal/Exec.js +207 -0
- package/dist/cjs/internal/Exec.js.map +7 -0
- package/dist/cjs/internal/FileMutation.d.ts +109 -0
- package/dist/cjs/internal/FileMutation.d.ts.map +1 -0
- package/dist/cjs/internal/FileMutation.js +116 -0
- package/dist/cjs/internal/FileMutation.js.map +7 -0
- package/dist/cjs/internal/FsFailure.d.ts +38 -0
- package/dist/cjs/internal/FsFailure.d.ts.map +1 -0
- package/dist/cjs/internal/FsFailure.js +40 -0
- package/dist/cjs/internal/FsFailure.js.map +7 -0
- package/dist/cjs/internal/GitWorktree.d.ts +108 -0
- package/dist/cjs/internal/GitWorktree.d.ts.map +1 -0
- package/dist/cjs/internal/GitWorktree.js +276 -0
- package/dist/cjs/internal/GitWorktree.js.map +7 -0
- package/dist/cjs/internal/Grouping.d.ts +51 -0
- package/dist/cjs/internal/Grouping.d.ts.map +1 -0
- package/dist/cjs/internal/Grouping.js +83 -0
- package/dist/cjs/internal/Grouping.js.map +7 -0
- package/dist/cjs/internal/Html.d.ts +20 -0
- package/dist/cjs/internal/Html.d.ts.map +1 -0
- package/dist/cjs/internal/Html.js +81 -0
- package/dist/cjs/internal/Html.js.map +7 -0
- package/dist/cjs/internal/Http.d.ts +95 -0
- package/dist/cjs/internal/Http.d.ts.map +1 -0
- package/dist/cjs/internal/Http.js +153 -0
- package/dist/cjs/internal/Http.js.map +7 -0
- package/dist/cjs/internal/HttpNetwork.d.ts +27 -0
- package/dist/cjs/internal/HttpNetwork.d.ts.map +1 -0
- package/dist/cjs/internal/HttpNetwork.js +146 -0
- package/dist/cjs/internal/HttpNetwork.js.map +7 -0
- package/dist/cjs/internal/Ignore.d.ts +37 -0
- package/dist/cjs/internal/Ignore.d.ts.map +1 -0
- package/dist/cjs/internal/Ignore.js +100 -0
- package/dist/cjs/internal/Ignore.js.map +7 -0
- package/dist/cjs/internal/LinearRegex.d.ts +19 -0
- package/dist/cjs/internal/LinearRegex.d.ts.map +1 -0
- package/dist/cjs/internal/LinearRegex.js +166 -0
- package/dist/cjs/internal/LinearRegex.js.map +7 -0
- package/dist/cjs/internal/Match.d.ts +85 -0
- package/dist/cjs/internal/Match.d.ts.map +1 -0
- package/dist/cjs/internal/Match.js +99 -0
- package/dist/cjs/internal/Match.js.map +7 -0
- package/dist/cjs/internal/Paths.d.ts +23 -0
- package/dist/cjs/internal/Paths.d.ts.map +1 -0
- package/dist/cjs/internal/Paths.js +52 -0
- package/dist/cjs/internal/Paths.js.map +7 -0
- package/dist/cjs/internal/Preserve.d.ts +25 -0
- package/dist/cjs/internal/Preserve.d.ts.map +1 -0
- package/dist/cjs/internal/Preserve.js +88 -0
- package/dist/cjs/internal/Preserve.js.map +7 -0
- package/dist/cjs/internal/Prune.d.ts +35 -0
- package/dist/cjs/internal/Prune.d.ts.map +1 -0
- package/dist/cjs/internal/Prune.js +54 -0
- package/dist/cjs/internal/Prune.js.map +7 -0
- package/dist/cjs/internal/RemoteTree.d.ts +60 -0
- package/dist/cjs/internal/RemoteTree.d.ts.map +1 -0
- package/dist/cjs/internal/RemoteTree.js +123 -0
- package/dist/cjs/internal/RemoteTree.js.map +7 -0
- package/dist/cjs/internal/SearchContract.d.ts +63 -0
- package/dist/cjs/internal/SearchContract.d.ts.map +1 -0
- package/dist/cjs/internal/SearchContract.js +46 -0
- package/dist/cjs/internal/SearchContract.js.map +7 -0
- package/dist/cjs/internal/Symbols.d.ts +39 -0
- package/dist/cjs/internal/Symbols.d.ts.map +1 -0
- package/dist/cjs/internal/Symbols.js +59 -0
- package/dist/cjs/internal/Symbols.js.map +7 -0
- package/dist/cjs/internal/Tar.d.ts +23 -0
- package/dist/cjs/internal/Tar.d.ts.map +1 -0
- package/dist/cjs/internal/Tar.js +86 -0
- package/dist/cjs/internal/Tar.js.map +7 -0
- package/dist/cjs/internal/TestReport.d.ts +52 -0
- package/dist/cjs/internal/TestReport.d.ts.map +1 -0
- package/dist/cjs/internal/TestReport.js +131 -0
- package/dist/cjs/internal/TestReport.js.map +7 -0
- package/dist/cjs/internal/Text.d.ts +125 -0
- package/dist/cjs/internal/Text.d.ts.map +1 -0
- package/dist/cjs/internal/Text.js +85 -0
- package/dist/cjs/internal/Text.js.map +7 -0
- package/dist/cjs/internal/Url.d.ts +13 -0
- package/dist/cjs/internal/Url.d.ts.map +1 -0
- package/dist/cjs/internal/Url.js +35 -0
- package/dist/cjs/internal/Url.js.map +7 -0
- package/dist/cjs/internal/Walk.d.ts +72 -0
- package/dist/cjs/internal/Walk.d.ts.map +1 -0
- package/dist/cjs/internal/Walk.js +108 -0
- package/dist/cjs/internal/Walk.js.map +7 -0
- package/dist/cjs/package.json +1 -0
- package/dist/esm/ApplyPatch.d.ts +174 -0
- package/dist/esm/ApplyPatch.d.ts.map +1 -0
- package/dist/esm/ApplyPatch.js +346 -0
- package/dist/esm/ApplyPatch.js.map +1 -0
- package/dist/esm/Bash.d.ts +390 -0
- package/dist/esm/Bash.d.ts.map +1 -0
- package/dist/esm/Bash.js +514 -0
- package/dist/esm/Bash.js.map +1 -0
- package/dist/esm/Checkpoints.d.ts +322 -0
- package/dist/esm/Checkpoints.d.ts.map +1 -0
- package/dist/esm/Checkpoints.js +396 -0
- package/dist/esm/Checkpoints.js.map +1 -0
- package/dist/esm/Container.d.ts +132 -0
- package/dist/esm/Container.d.ts.map +1 -0
- package/dist/esm/Container.js +151 -0
- package/dist/esm/Container.js.map +1 -0
- package/dist/esm/Edit.d.ts +203 -0
- package/dist/esm/Edit.d.ts.map +1 -0
- package/dist/esm/Edit.js +296 -0
- package/dist/esm/Edit.js.map +1 -0
- package/dist/esm/ExaWebSearch.d.ts +22 -0
- package/dist/esm/ExaWebSearch.d.ts.map +1 -0
- package/dist/esm/ExaWebSearch.js +107 -0
- package/dist/esm/ExaWebSearch.js.map +1 -0
- package/dist/esm/Explore.d.ts +328 -0
- package/dist/esm/Explore.d.ts.map +1 -0
- package/dist/esm/Explore.js +106 -0
- package/dist/esm/Explore.js.map +1 -0
- package/dist/esm/Fetch.d.ts +130 -0
- package/dist/esm/Fetch.d.ts.map +1 -0
- package/dist/esm/Fetch.js +91 -0
- package/dist/esm/Fetch.js.map +1 -0
- package/dist/esm/Glob.d.ts +204 -0
- package/dist/esm/Glob.d.ts.map +1 -0
- package/dist/esm/Glob.js +177 -0
- package/dist/esm/Glob.js.map +1 -0
- package/dist/esm/Grep.d.ts +347 -0
- package/dist/esm/Grep.d.ts.map +1 -0
- package/dist/esm/Grep.js +289 -0
- package/dist/esm/Grep.js.map +1 -0
- package/dist/esm/HttpPost.d.ts +130 -0
- package/dist/esm/HttpPost.d.ts.map +1 -0
- package/dist/esm/HttpPost.js +89 -0
- package/dist/esm/HttpPost.js.map +1 -0
- package/dist/esm/LanguageServer.d.ts +90 -0
- package/dist/esm/LanguageServer.d.ts.map +1 -0
- package/dist/esm/LanguageServer.js +57 -0
- package/dist/esm/LanguageServer.js.map +1 -0
- package/dist/esm/Ls.d.ts +164 -0
- package/dist/esm/Ls.d.ts.map +1 -0
- package/dist/esm/Ls.js +178 -0
- package/dist/esm/Ls.js.map +1 -0
- package/dist/esm/Lsp.d.ts +125 -0
- package/dist/esm/Lsp.d.ts.map +1 -0
- package/dist/esm/Lsp.js +165 -0
- package/dist/esm/Lsp.js.map +1 -0
- package/dist/esm/Manifest.d.ts +918 -0
- package/dist/esm/Manifest.d.ts.map +1 -0
- package/dist/esm/Manifest.js +153 -0
- package/dist/esm/Manifest.js.map +1 -0
- package/dist/esm/NativeSearch.d.ts +38 -0
- package/dist/esm/NativeSearch.d.ts.map +1 -0
- package/dist/esm/NativeSearch.js +378 -0
- package/dist/esm/NativeSearch.js.map +1 -0
- package/dist/esm/NodeLanguageServer.d.ts +128 -0
- package/dist/esm/NodeLanguageServer.d.ts.map +1 -0
- package/dist/esm/NodeLanguageServer.js +843 -0
- package/dist/esm/NodeLanguageServer.js.map +1 -0
- package/dist/esm/PortableSearch.d.ts +36 -0
- package/dist/esm/PortableSearch.d.ts.map +1 -0
- package/dist/esm/PortableSearch.js +256 -0
- package/dist/esm/PortableSearch.js.map +1 -0
- package/dist/esm/Probe.d.ts +193 -0
- package/dist/esm/Probe.d.ts.map +1 -0
- package/dist/esm/Probe.js +225 -0
- package/dist/esm/Probe.js.map +1 -0
- package/dist/esm/Read.d.ts +189 -0
- package/dist/esm/Read.d.ts.map +1 -0
- package/dist/esm/Read.js +300 -0
- package/dist/esm/Read.js.map +1 -0
- package/dist/esm/Relocate.d.ts +73 -0
- package/dist/esm/Relocate.d.ts.map +1 -0
- package/dist/esm/Relocate.js +153 -0
- package/dist/esm/Relocate.js.map +1 -0
- package/dist/esm/RemoteSearch.d.ts +54 -0
- package/dist/esm/RemoteSearch.d.ts.map +1 -0
- package/dist/esm/RemoteSearch.js +162 -0
- package/dist/esm/RemoteSearch.js.map +1 -0
- package/dist/esm/Search.d.ts +163 -0
- package/dist/esm/Search.d.ts.map +1 -0
- package/dist/esm/Search.js +47 -0
- package/dist/esm/Search.js.map +1 -0
- package/dist/esm/SearchConformance.d.ts +115 -0
- package/dist/esm/SearchConformance.d.ts.map +1 -0
- package/dist/esm/SearchConformance.js +193 -0
- package/dist/esm/SearchConformance.js.map +1 -0
- package/dist/esm/SearchContract.d.ts +114 -0
- package/dist/esm/SearchContract.d.ts.map +1 -0
- package/dist/esm/SearchContract.js +461 -0
- package/dist/esm/SearchContract.js.map +1 -0
- package/dist/esm/ShellCommand.d.ts +164 -0
- package/dist/esm/ShellCommand.d.ts.map +1 -0
- package/dist/esm/ShellCommand.js +159 -0
- package/dist/esm/ShellCommand.js.map +1 -0
- package/dist/esm/StdError.d.ts +55 -0
- package/dist/esm/StdError.d.ts.map +1 -0
- package/dist/esm/StdError.js +71 -0
- package/dist/esm/StdError.js.map +1 -0
- package/dist/esm/TestRun.d.ts +311 -0
- package/dist/esm/TestRun.d.ts.map +1 -0
- package/dist/esm/TestRun.js +316 -0
- package/dist/esm/TestRun.js.map +1 -0
- package/dist/esm/TestRunner.d.ts +102 -0
- package/dist/esm/TestRunner.d.ts.map +1 -0
- package/dist/esm/TestRunner.js +68 -0
- package/dist/esm/TestRunner.js.map +1 -0
- package/dist/esm/TreeFingerprint.d.ts +140 -0
- package/dist/esm/TreeFingerprint.d.ts.map +1 -0
- package/dist/esm/TreeFingerprint.js +170 -0
- package/dist/esm/TreeFingerprint.js.map +1 -0
- package/dist/esm/UpdatePlan.d.ts +152 -0
- package/dist/esm/UpdatePlan.d.ts.map +1 -0
- package/dist/esm/UpdatePlan.js +129 -0
- package/dist/esm/UpdatePlan.js.map +1 -0
- package/dist/esm/WebFetch.d.ts +134 -0
- package/dist/esm/WebFetch.d.ts.map +1 -0
- package/dist/esm/WebFetch.js +151 -0
- package/dist/esm/WebFetch.js.map +1 -0
- package/dist/esm/WebSearch.d.ts +181 -0
- package/dist/esm/WebSearch.d.ts.map +1 -0
- package/dist/esm/WebSearch.js +134 -0
- package/dist/esm/WebSearch.js.map +1 -0
- package/dist/esm/Write.d.ts +147 -0
- package/dist/esm/Write.d.ts.map +1 -0
- package/dist/esm/Write.js +144 -0
- package/dist/esm/Write.js.map +1 -0
- package/dist/esm/index.d.ts +129 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +129 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/internal/ApplyPatch.d.ts +145 -0
- package/dist/esm/internal/ApplyPatch.d.ts.map +1 -0
- package/dist/esm/internal/ApplyPatch.js +489 -0
- package/dist/esm/internal/ApplyPatch.js.map +1 -0
- package/dist/esm/internal/CodexText.d.ts +73 -0
- package/dist/esm/internal/CodexText.d.ts.map +1 -0
- package/dist/esm/internal/CodexText.js +156 -0
- package/dist/esm/internal/CodexText.js.map +1 -0
- package/dist/esm/internal/Declaration.d.ts +49 -0
- package/dist/esm/internal/Declaration.d.ts.map +1 -0
- package/dist/esm/internal/Declaration.js +42 -0
- package/dist/esm/internal/Declaration.js.map +1 -0
- package/dist/esm/internal/Diagnostics.d.ts +77 -0
- package/dist/esm/internal/Diagnostics.d.ts.map +1 -0
- package/dist/esm/internal/Diagnostics.js +99 -0
- package/dist/esm/internal/Diagnostics.js.map +1 -0
- package/dist/esm/internal/EnvelopePrecheck.d.ts +69 -0
- package/dist/esm/internal/EnvelopePrecheck.d.ts.map +1 -0
- package/dist/esm/internal/EnvelopePrecheck.js +426 -0
- package/dist/esm/internal/EnvelopePrecheck.js.map +1 -0
- package/dist/esm/internal/Exec.d.ts +151 -0
- package/dist/esm/internal/Exec.d.ts.map +1 -0
- package/dist/esm/internal/Exec.js +285 -0
- package/dist/esm/internal/Exec.js.map +1 -0
- package/dist/esm/internal/FileMutation.d.ts +109 -0
- package/dist/esm/internal/FileMutation.d.ts.map +1 -0
- package/dist/esm/internal/FileMutation.js +123 -0
- package/dist/esm/internal/FileMutation.js.map +1 -0
- package/dist/esm/internal/FsFailure.d.ts +38 -0
- package/dist/esm/internal/FsFailure.d.ts.map +1 -0
- package/dist/esm/internal/FsFailure.js +39 -0
- package/dist/esm/internal/FsFailure.js.map +1 -0
- package/dist/esm/internal/GitWorktree.d.ts +108 -0
- package/dist/esm/internal/GitWorktree.d.ts.map +1 -0
- package/dist/esm/internal/GitWorktree.js +352 -0
- package/dist/esm/internal/GitWorktree.js.map +1 -0
- package/dist/esm/internal/Grouping.d.ts +51 -0
- package/dist/esm/internal/Grouping.d.ts.map +1 -0
- package/dist/esm/internal/Grouping.js +99 -0
- package/dist/esm/internal/Grouping.js.map +1 -0
- package/dist/esm/internal/Html.d.ts +20 -0
- package/dist/esm/internal/Html.d.ts.map +1 -0
- package/dist/esm/internal/Html.js +70 -0
- package/dist/esm/internal/Html.js.map +1 -0
- package/dist/esm/internal/Http.d.ts +95 -0
- package/dist/esm/internal/Http.d.ts.map +1 -0
- package/dist/esm/internal/Http.js +154 -0
- package/dist/esm/internal/Http.js.map +1 -0
- package/dist/esm/internal/HttpNetwork.d.ts +27 -0
- package/dist/esm/internal/HttpNetwork.d.ts.map +1 -0
- package/dist/esm/internal/HttpNetwork.js +114 -0
- package/dist/esm/internal/HttpNetwork.js.map +1 -0
- package/dist/esm/internal/Ignore.d.ts +37 -0
- package/dist/esm/internal/Ignore.d.ts.map +1 -0
- package/dist/esm/internal/Ignore.js +128 -0
- package/dist/esm/internal/Ignore.js.map +1 -0
- package/dist/esm/internal/LinearRegex.d.ts +19 -0
- package/dist/esm/internal/LinearRegex.d.ts.map +1 -0
- package/dist/esm/internal/LinearRegex.js +176 -0
- package/dist/esm/internal/LinearRegex.js.map +1 -0
- package/dist/esm/internal/Match.d.ts +85 -0
- package/dist/esm/internal/Match.d.ts.map +1 -0
- package/dist/esm/internal/Match.js +142 -0
- package/dist/esm/internal/Match.js.map +1 -0
- package/dist/esm/internal/Paths.d.ts +23 -0
- package/dist/esm/internal/Paths.d.ts.map +1 -0
- package/dist/esm/internal/Paths.js +40 -0
- package/dist/esm/internal/Paths.js.map +1 -0
- package/dist/esm/internal/Preserve.d.ts +25 -0
- package/dist/esm/internal/Preserve.d.ts.map +1 -0
- package/dist/esm/internal/Preserve.js +70 -0
- package/dist/esm/internal/Preserve.js.map +1 -0
- package/dist/esm/internal/Prune.d.ts +35 -0
- package/dist/esm/internal/Prune.d.ts.map +1 -0
- package/dist/esm/internal/Prune.js +60 -0
- package/dist/esm/internal/Prune.js.map +1 -0
- package/dist/esm/internal/RemoteTree.d.ts +60 -0
- package/dist/esm/internal/RemoteTree.d.ts.map +1 -0
- package/dist/esm/internal/RemoteTree.js +132 -0
- package/dist/esm/internal/RemoteTree.js.map +1 -0
- package/dist/esm/internal/SearchContract.d.ts +63 -0
- package/dist/esm/internal/SearchContract.d.ts.map +1 -0
- package/dist/esm/internal/SearchContract.js +66 -0
- package/dist/esm/internal/SearchContract.js.map +1 -0
- package/dist/esm/internal/Symbols.d.ts +39 -0
- package/dist/esm/internal/Symbols.d.ts.map +1 -0
- package/dist/esm/internal/Symbols.js +79 -0
- package/dist/esm/internal/Symbols.js.map +1 -0
- package/dist/esm/internal/Tar.d.ts +23 -0
- package/dist/esm/internal/Tar.d.ts.map +1 -0
- package/dist/esm/internal/Tar.js +97 -0
- package/dist/esm/internal/Tar.js.map +1 -0
- package/dist/esm/internal/TestReport.d.ts +52 -0
- package/dist/esm/internal/TestReport.d.ts.map +1 -0
- package/dist/esm/internal/TestReport.js +172 -0
- package/dist/esm/internal/TestReport.js.map +1 -0
- package/dist/esm/internal/Text.d.ts +125 -0
- package/dist/esm/internal/Text.d.ts.map +1 -0
- package/dist/esm/internal/Text.js +141 -0
- package/dist/esm/internal/Text.js.map +1 -0
- package/dist/esm/internal/Url.d.ts +13 -0
- package/dist/esm/internal/Url.d.ts.map +1 -0
- package/dist/esm/internal/Url.js +27 -0
- package/dist/esm/internal/Url.js.map +1 -0
- package/dist/esm/internal/Walk.d.ts +72 -0
- package/dist/esm/internal/Walk.d.ts.map +1 -0
- package/dist/esm/internal/Walk.js +126 -0
- package/dist/esm/internal/Walk.js.map +1 -0
- package/docs/README.md +119 -0
- package/docs/api.md +499 -0
- package/docs/concepts/effects-and-capabilities.md +138 -0
- package/docs/concepts/flows-and-handlers.md +115 -0
- package/docs/concepts/limits-and-disclosure.md +105 -0
- package/docs/concepts/search-contract.md +182 -0
- package/docs/guides/bind-the-standard-flows.md +116 -0
- package/docs/guides/implement-a-search-peer.md +133 -0
- package/docs/guides/pin-a-checkpoint.md +161 -0
- package/docs/guides/query-a-language-server.md +257 -0
- package/docs/guides/reach-the-network.md +141 -0
- package/docs/guides/read-and-edit-a-file.md +240 -0
- package/docs/guides/run-a-shell-command.md +236 -0
- package/docs/guides/run-the-test-suite.md +154 -0
- package/docs/guides/search-a-workspace.md +148 -0
- package/docs/installation.md +115 -0
- package/docs/quickstart.md +125 -0
- package/docs/reference/flows.md +556 -0
- package/docs/troubleshooting.md +347 -0
- package/package.json +449 -3
- package/src/ApplyPatch.ts +458 -0
- package/src/Bash.ts +619 -0
- package/src/Checkpoints.ts +589 -0
- package/src/Container.ts +212 -0
- package/src/Edit.ts +366 -0
- package/src/ExaWebSearch.ts +145 -0
- package/src/Explore.ts +139 -0
- package/src/Fetch.ts +117 -0
- package/src/Glob.ts +200 -0
- package/src/Grep.ts +320 -0
- package/src/HttpPost.ts +120 -0
- package/src/LanguageServer.ts +110 -0
- package/src/Ls.ts +228 -0
- package/src/Lsp.ts +184 -0
- package/src/Manifest.ts +162 -0
- package/src/NativeSearch.ts +457 -0
- package/src/NodeLanguageServer.ts +1148 -0
- package/src/PortableSearch.ts +284 -0
- package/src/Probe.ts +284 -0
- package/src/Read.ts +359 -0
- package/src/Relocate.ts +166 -0
- package/src/RemoteSearch.ts +199 -0
- package/src/Search.ts +185 -0
- package/src/SearchConformance.ts +288 -0
- package/src/SearchContract.ts +489 -0
- package/src/ShellCommand.ts +201 -0
- package/src/StdError.ts +80 -0
- package/src/TestRun.ts +401 -0
- package/src/TestRunner.ts +119 -0
- package/src/TreeFingerprint.ts +200 -0
- package/src/UpdatePlan.ts +171 -0
- package/src/WebFetch.ts +194 -0
- package/src/WebSearch.ts +165 -0
- package/src/Write.ts +195 -0
- package/src/index.ts +157 -0
- package/src/internal/ApplyPatch.ts +601 -0
- package/src/internal/CodexText.ts +182 -0
- package/src/internal/Declaration.ts +60 -0
- package/src/internal/Diagnostics.ts +134 -0
- package/src/internal/EnvelopePrecheck.ts +489 -0
- package/src/internal/Exec.ts +427 -0
- package/src/internal/FileMutation.ts +231 -0
- package/src/internal/FsFailure.ts +51 -0
- package/src/internal/GitWorktree.ts +491 -0
- package/src/internal/Grouping.ts +106 -0
- package/src/internal/Html.ts +87 -0
- package/src/internal/Http.ts +209 -0
- package/src/internal/HttpNetwork.ts +153 -0
- package/src/internal/Ignore.ts +135 -0
- package/src/internal/LinearRegex.ts +173 -0
- package/src/internal/Match.ts +172 -0
- package/src/internal/Paths.ts +42 -0
- package/src/internal/Preserve.ts +108 -0
- package/src/internal/Prune.ts +62 -0
- package/src/internal/RemoteTree.ts +159 -0
- package/src/internal/SearchContract.ts +77 -0
- package/src/internal/Symbols.ts +88 -0
- package/src/internal/Tar.ts +95 -0
- package/src/internal/TestReport.ts +194 -0
- package/src/internal/Text.ts +185 -0
- package/src/internal/Url.ts +23 -0
- 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
|
+
}
|