@smthrs/std 0.0.0-stage → 1.0.0-rc.4
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 +130 -0
- package/LICENSE +21 -0
- package/README.md +152 -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 +380 -0
- package/dist/cjs/Bash.d.ts.map +1 -0
- package/dist/cjs/Bash.js +332 -0
- package/dist/cjs/Bash.js.map +7 -0
- package/dist/cjs/Checkpoints.d.ts +279 -0
- package/dist/cjs/Checkpoints.d.ts.map +1 -0
- package/dist/cjs/Checkpoints.js +145 -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 +24 -0
- package/dist/cjs/PortableSearch.d.ts.map +1 -0
- package/dist/cjs/PortableSearch.js +233 -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/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 +127 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +99 -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 +67 -0
- package/dist/cjs/internal/EnvelopePrecheck.d.ts.map +1 -0
- package/dist/cjs/internal/EnvelopePrecheck.js +124 -0
- package/dist/cjs/internal/EnvelopePrecheck.js.map +7 -0
- package/dist/cjs/internal/Exec.d.ts +139 -0
- package/dist/cjs/internal/Exec.d.ts.map +1 -0
- package/dist/cjs/internal/Exec.js +158 -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/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/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 +114 -0
- package/dist/cjs/internal/Text.d.ts.map +1 -0
- package/dist/cjs/internal/Text.js +82 -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 +380 -0
- package/dist/esm/Bash.d.ts.map +1 -0
- package/dist/esm/Bash.js +505 -0
- package/dist/esm/Bash.js.map +1 -0
- package/dist/esm/Checkpoints.d.ts +279 -0
- package/dist/esm/Checkpoints.d.ts.map +1 -0
- package/dist/esm/Checkpoints.js +298 -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 +24 -0
- package/dist/esm/PortableSearch.d.ts.map +1 -0
- package/dist/esm/PortableSearch.js +240 -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/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 +127 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +127 -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 +67 -0
- package/dist/esm/internal/EnvelopePrecheck.d.ts.map +1 -0
- package/dist/esm/internal/EnvelopePrecheck.js +167 -0
- package/dist/esm/internal/EnvelopePrecheck.js.map +1 -0
- package/dist/esm/internal/Exec.d.ts +139 -0
- package/dist/esm/internal/Exec.d.ts.map +1 -0
- package/dist/esm/internal/Exec.js +193 -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/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/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 +114 -0
- package/dist/esm/internal/Text.d.ts.map +1 -0
- package/dist/esm/internal/Text.js +130 -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 +117 -0
- package/docs/api.md +472 -0
- package/docs/concepts/effects-and-capabilities.md +136 -0
- package/docs/concepts/flows-and-handlers.md +115 -0
- package/docs/concepts/limits-and-disclosure.md +102 -0
- package/docs/concepts/search-contract.md +182 -0
- package/docs/guides/bind-the-standard-flows.md +114 -0
- package/docs/guides/implement-a-search-peer.md +133 -0
- package/docs/guides/pin-a-checkpoint.md +141 -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 +215 -0
- package/docs/guides/run-the-test-suite.md +154 -0
- package/docs/guides/search-a-workspace.md +148 -0
- package/docs/installation.md +111 -0
- package/docs/quickstart.md +125 -0
- package/docs/reference/flows.md +556 -0
- package/docs/troubleshooting.md +322 -0
- package/package.json +439 -3
- package/src/ApplyPatch.ts +458 -0
- package/src/Bash.ts +607 -0
- package/src/Checkpoints.ts +422 -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 +264 -0
- package/src/Probe.ts +284 -0
- package/src/Read.ts +359 -0
- package/src/Relocate.ts +166 -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 +154 -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 +233 -0
- package/src/internal/Exec.ts +314 -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/SearchContract.ts +77 -0
- package/src/internal/Symbols.ts +88 -0
- package/src/internal/TestReport.ts +194 -0
- package/src/internal/Text.ts +170 -0
- package/src/internal/Url.ts +23 -0
- package/src/internal/Walk.ts +176 -0
package/src/Fetch.ts
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP GET flow declaration and portable handler.
|
|
3
|
+
*
|
|
4
|
+
* @since 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import * as Effect from "effect/Effect"
|
|
8
|
+
import * as Schema from "effect/Schema"
|
|
9
|
+
import * as HttpClientRequest from "effect/unstable/http/HttpClientRequest"
|
|
10
|
+
import { capability, envelope } from "./internal/Declaration.ts"
|
|
11
|
+
import { execute, Response, Timeout } from "./internal/Http.ts"
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Registry name for the fetch flow.
|
|
15
|
+
*
|
|
16
|
+
* @category identifiers
|
|
17
|
+
* @since 1.0.0
|
|
18
|
+
*/
|
|
19
|
+
export const name = "fetch"
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Model-facing description of the fetch flow.
|
|
23
|
+
*
|
|
24
|
+
* @category descriptions
|
|
25
|
+
* @since 1.0.0
|
|
26
|
+
*/
|
|
27
|
+
export const description =
|
|
28
|
+
"Get an absolute URL and return its status and text body; long bodies are truncated with a notice. Use http-post to send data."
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Input schema for the fetch flow.
|
|
32
|
+
*
|
|
33
|
+
* @category schemas
|
|
34
|
+
* @since 1.0.0
|
|
35
|
+
*/
|
|
36
|
+
export const Input = Schema.Struct({
|
|
37
|
+
url: Schema.String.annotate({ description: "Absolute http or https URL to retrieve" }),
|
|
38
|
+
headers: Schema.optional(Schema.Record(Schema.String, Schema.String)).annotate({
|
|
39
|
+
description: "Additional request headers"
|
|
40
|
+
}),
|
|
41
|
+
timeout: Schema.optional(Timeout).annotate({
|
|
42
|
+
description: "Total request and response body timeout in seconds; defaults to 30, capped at 120"
|
|
43
|
+
})
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Decoded input accepted by the `fetch` flow.
|
|
48
|
+
*
|
|
49
|
+
* @category models
|
|
50
|
+
* @since 1.0.0
|
|
51
|
+
*/
|
|
52
|
+
export type Input = typeof Input.Type
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Output schema for the fetch flow.
|
|
56
|
+
*
|
|
57
|
+
* @category schemas
|
|
58
|
+
* @since 1.0.0
|
|
59
|
+
*/
|
|
60
|
+
export const Output = Response
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Decoded output returned by the `fetch` flow.
|
|
64
|
+
*
|
|
65
|
+
* @category models
|
|
66
|
+
* @since 1.0.0
|
|
67
|
+
*/
|
|
68
|
+
export type Output = typeof Output.Type
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Static effect envelope for the fetch flow.
|
|
72
|
+
*
|
|
73
|
+
* A retrieval leaves no durable state behind, so it is sealed even though it
|
|
74
|
+
* leaves the machine.
|
|
75
|
+
*
|
|
76
|
+
* @category effects
|
|
77
|
+
* @since 1.0.0
|
|
78
|
+
*/
|
|
79
|
+
export const effects = envelope({ tier: "sealed", mode: "expected", reads: [], writes: [] })
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Narrows the fetch effect envelope for one decoded input.
|
|
83
|
+
*
|
|
84
|
+
* Network reach is expressed as a capability rather than a path envelope, so
|
|
85
|
+
* a retrieval has nothing left to narrow.
|
|
86
|
+
*
|
|
87
|
+
* @category effects
|
|
88
|
+
* @since 1.0.0
|
|
89
|
+
*/
|
|
90
|
+
export const effectsFor = (_input: typeof Input.Type) => effects
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Capabilities required by the fetch flow.
|
|
94
|
+
*
|
|
95
|
+
* @category capabilities
|
|
96
|
+
* @since 1.0.0
|
|
97
|
+
*/
|
|
98
|
+
export const capabilities = [capability("net:get", "*")]
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Declaration-only fetch flow.
|
|
102
|
+
*
|
|
103
|
+
* @category flows
|
|
104
|
+
* @since 1.0.0
|
|
105
|
+
*/
|
|
106
|
+
export const flow = { name, description, input: Input, output: Output, capabilities, effects } as const
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Retrieves a URL through the permission-aware kernel HTTP client.
|
|
110
|
+
*
|
|
111
|
+
* Error statuses are ordinary results; only transport, permission, and body
|
|
112
|
+
* decoding failures use the typed error channel.
|
|
113
|
+
*
|
|
114
|
+
* @category handlers
|
|
115
|
+
* @since 1.0.0
|
|
116
|
+
*/
|
|
117
|
+
export const run = Effect.fn("Fetch.run")((input: Input) => execute(input, HttpClientRequest.get))
|
package/src/Glob.ts
ADDED
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `glob` projection of Smithers Ripgrep Subset v1.
|
|
3
|
+
*
|
|
4
|
+
* It has the same two peer implementations as `grep` and supports the
|
|
5
|
+
* `rg --files -g` pattern subset: `*`, `**`, `?`, and brace alternatives;
|
|
6
|
+
* results are path sorted; hidden files are opt-in; root and nested .gitignore
|
|
7
|
+
* files apply by default (even outside git repositories). `noIgnore: true` opts
|
|
8
|
+
* out. Parent/global ignore files, .git/info/exclude, .ignore and .rgignore
|
|
9
|
+
* are not read. Caller globs filter the remaining files without overriding
|
|
10
|
+
* ignores. An explicitly named ignored or skipped directory is still searched.
|
|
11
|
+
*
|
|
12
|
+
* **Patterns are relative to `root`, never to the filesystem.** A candidate is
|
|
13
|
+
* matched by the path it has *relative to the search root*, so `tests/**\/*.py`
|
|
14
|
+
* — what every caller writing a project-relative pattern means — matches
|
|
15
|
+
* `<root>/tests/admin_views/admin.py`. Three rules follow, and both peers
|
|
16
|
+
* implement all three identically:
|
|
17
|
+
*
|
|
18
|
+
* - A pattern with no `/` matches the **basename** at any depth: `*.py` finds
|
|
19
|
+
* every Python file in the subtree.
|
|
20
|
+
* - A pattern containing `/` is matched against the root-relative path and is
|
|
21
|
+
* anchored at the root: `tests/*.py` matches `<root>/tests/a.py` and not
|
|
22
|
+
* `<root>/src/tests/a.py`.
|
|
23
|
+
* - A leading `/` is the same anchor spelled explicitly, not a filesystem
|
|
24
|
+
* absolute path: `/a.py` matches only `<root>/a.py`, where bare `a.py` would
|
|
25
|
+
* match any `a.py` in the subtree. A leading `./` means the same anchor.
|
|
26
|
+
*
|
|
27
|
+
* `**` crosses directory boundaries, `*` and `?` stay inside one segment, and
|
|
28
|
+
* `?` consumes one UTF-8 byte. Trailing spaces are not part of a pattern:
|
|
29
|
+
* `rg` reads `-g` by gitignore's rules and drops them, so `"a.ts "` finds
|
|
30
|
+
* `a.ts`, and a pattern left blank by that is rejected rather than read as no
|
|
31
|
+
* filter at all.
|
|
32
|
+
*
|
|
33
|
+
* A `root` that names one file is that file. It is reported whatever the
|
|
34
|
+
* pattern says, because `rg` searches a path given on its command line without
|
|
35
|
+
* consulting `-g`, and a walk that reaches one file has nothing to filter.
|
|
36
|
+
*
|
|
37
|
+
* A walk skips what it cannot read — a dangling symlink, a link cycle, a
|
|
38
|
+
* directory the process may not list — and reports everything it did reach.
|
|
39
|
+
* One unreadable entry never fails the call.
|
|
40
|
+
*
|
|
41
|
+
* The consequence worth stating is the one that cost a SWE-bench run 41 of its
|
|
42
|
+
* 43 frames: an *absolute* pattern such as `/home/repo/tests/**` is read as the
|
|
43
|
+
* root-relative path `home/repo/tests/**`, which nothing under a root of
|
|
44
|
+
* `/home/repo` can match. That answer is now never silent — a pattern no file
|
|
45
|
+
* under the root could match reports why through `notice`, so "unsatisfiable"
|
|
46
|
+
* and "searched and found none" stay distinguishable.
|
|
47
|
+
*
|
|
48
|
+
* @since 1.0.0
|
|
49
|
+
*/
|
|
50
|
+
|
|
51
|
+
import { Effect, Schema } from "effect"
|
|
52
|
+
import { capability, envelope, rootSubtree } from "./internal/Declaration.ts"
|
|
53
|
+
import { MAX_ENTRIES } from "./internal/Text.ts"
|
|
54
|
+
import * as Search from "./Search.ts"
|
|
55
|
+
import * as Contract from "./SearchContract.ts"
|
|
56
|
+
import type * as StdError from "./StdError.ts"
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* The registry name for glob.
|
|
60
|
+
*
|
|
61
|
+
* @category identifiers
|
|
62
|
+
* @since 1.0.0
|
|
63
|
+
*/
|
|
64
|
+
export const name = "glob"
|
|
65
|
+
/**
|
|
66
|
+
* The model-facing glob description.
|
|
67
|
+
*
|
|
68
|
+
* @category descriptions
|
|
69
|
+
* @since 1.0.0
|
|
70
|
+
*/
|
|
71
|
+
export const description = "Find files through the Smithers Ripgrep Subset v1 contract."
|
|
72
|
+
/**
|
|
73
|
+
* Input accepted by {@link flow} and {@link run}.
|
|
74
|
+
*
|
|
75
|
+
* @category schemas
|
|
76
|
+
* @since 1.0.0
|
|
77
|
+
*/
|
|
78
|
+
export const Input = Schema.Struct({
|
|
79
|
+
pattern: Schema.NonEmptyString.annotate({
|
|
80
|
+
description:
|
|
81
|
+
"Ripgrep -g pattern, matched against paths relative to root, never absolute paths: *, ?, {a,b} stay inside one segment, ** crosses directories, a pattern without / matches any basename, and a leading / anchors at root."
|
|
82
|
+
}),
|
|
83
|
+
root: Schema.optional(Schema.String).annotate({
|
|
84
|
+
description: "Search root the pattern is relative to; defaults to . (the host workspace)."
|
|
85
|
+
}),
|
|
86
|
+
hidden: Schema.optional(Schema.Boolean).annotate({ description: "Ripgrep --hidden." }),
|
|
87
|
+
noIgnore: Schema.optional(Schema.Boolean).annotate({
|
|
88
|
+
description:
|
|
89
|
+
"Honor root-scoped .gitignore files by default. Set true to include ignored paths; hidden and fixed directory skips still apply."
|
|
90
|
+
}),
|
|
91
|
+
limit: Schema.optional(Schema.Int.check(Schema.isGreaterThanOrEqualTo(0))).annotate({
|
|
92
|
+
description: `Maximum paths, capped at ${MAX_ENTRIES}.`
|
|
93
|
+
})
|
|
94
|
+
})
|
|
95
|
+
/**
|
|
96
|
+
* Decoded input accepted by the `glob` flow.
|
|
97
|
+
*
|
|
98
|
+
* @category models
|
|
99
|
+
* @since 1.0.0
|
|
100
|
+
*/
|
|
101
|
+
export type Input = typeof Input.Type
|
|
102
|
+
/**
|
|
103
|
+
* Output produced by {@link run}.
|
|
104
|
+
*
|
|
105
|
+
* @category schemas
|
|
106
|
+
* @since 1.0.0
|
|
107
|
+
*/
|
|
108
|
+
export const Output = Schema.Struct({
|
|
109
|
+
paths: Schema.Array(Schema.String),
|
|
110
|
+
total: Schema.Int,
|
|
111
|
+
truncated: Schema.Boolean,
|
|
112
|
+
notice: Schema.optional(Schema.String)
|
|
113
|
+
})
|
|
114
|
+
/**
|
|
115
|
+
* Decoded output returned by the `glob` flow.
|
|
116
|
+
*
|
|
117
|
+
* @category models
|
|
118
|
+
* @since 1.0.0
|
|
119
|
+
*/
|
|
120
|
+
export type Output = typeof Output.Type
|
|
121
|
+
/**
|
|
122
|
+
* Conservative sealed declaration for all workspace files.
|
|
123
|
+
*
|
|
124
|
+
* @category effects
|
|
125
|
+
* @since 1.0.0
|
|
126
|
+
*/
|
|
127
|
+
export const effects = envelope({ tier: "sealed", mode: "hermetic", reads: ["/**"], writes: [] })
|
|
128
|
+
/**
|
|
129
|
+
* Narrows the read declaration to the requested root subtree.
|
|
130
|
+
*
|
|
131
|
+
* @category effects
|
|
132
|
+
* @since 1.0.0
|
|
133
|
+
*/
|
|
134
|
+
export const effectsFor = (input: { readonly root?: string | undefined }) =>
|
|
135
|
+
envelope({ tier: "sealed", mode: "hermetic", reads: [rootSubtree(input.root ?? ".")], writes: [] })
|
|
136
|
+
/**
|
|
137
|
+
* Capability strings requested by glob.
|
|
138
|
+
*
|
|
139
|
+
* @category capabilities
|
|
140
|
+
* @since 1.0.0
|
|
141
|
+
*/
|
|
142
|
+
export const capabilities = [capability("fs:read", "/**")]
|
|
143
|
+
/**
|
|
144
|
+
* Declaration-only glob flow.
|
|
145
|
+
*
|
|
146
|
+
* @category flows
|
|
147
|
+
* @since 1.0.0
|
|
148
|
+
*/
|
|
149
|
+
export const flow = { name, description, input: Input, output: Output, capabilities, effects } as const
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* What a call to this flow does, for a reader of a run.
|
|
153
|
+
*
|
|
154
|
+
* Display metadata only. `@smthrs/registry` `Descriptor.FlowActivity` is the
|
|
155
|
+
* governing vocabulary and `StandardFlows` binds this value onto the flow's
|
|
156
|
+
* descriptor, where the binding site checks it. `declarationDigest` excludes
|
|
157
|
+
* it, so declaring it cannot invalidate a call identity or a cached prompt.
|
|
158
|
+
*
|
|
159
|
+
* @category presentation
|
|
160
|
+
* @since 1.0.0-rc.0
|
|
161
|
+
*/
|
|
162
|
+
export const activity = "reads" as const
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* How one recorded call to this flow reads: the verb for each settlement, the
|
|
166
|
+
* input field that is its subject, and the measured output fields a one-line
|
|
167
|
+
* summary may count.
|
|
168
|
+
*
|
|
169
|
+
* Display metadata only, governed by `@smthrs/registry`
|
|
170
|
+
* `Descriptor.CallPresentation` and checked where `StandardFlows` binds it.
|
|
171
|
+
*
|
|
172
|
+
* @category presentation
|
|
173
|
+
* @since 1.0.0-rc.0
|
|
174
|
+
*/
|
|
175
|
+
export const presentation = {
|
|
176
|
+
verb: { pending: "listing", success: "listed", failure: "failed to list" },
|
|
177
|
+
subject: "pattern",
|
|
178
|
+
result: "paths"
|
|
179
|
+
} as const
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Runs one `rg --files -g` contract call through the selected peer implementation.
|
|
183
|
+
*
|
|
184
|
+
* @category handlers
|
|
185
|
+
* @since 1.0.0
|
|
186
|
+
*/
|
|
187
|
+
export const run = Effect.fn("Glob.run")(function*(
|
|
188
|
+
input: typeof Input.Type
|
|
189
|
+
): Effect.fn.Return<typeof Output.Type, StdError.StdError, Search.Search> {
|
|
190
|
+
const patternError = Contract.validateGlob(input.pattern)
|
|
191
|
+
if (patternError !== undefined) return yield* Effect.fail(patternError)
|
|
192
|
+
const search = yield* Search.Search
|
|
193
|
+
return yield* search.glob({
|
|
194
|
+
pattern: input.pattern,
|
|
195
|
+
root: input.root ?? ".",
|
|
196
|
+
hidden: input.hidden ?? false,
|
|
197
|
+
noIgnore: input.noIgnore ?? false,
|
|
198
|
+
limit: Math.min(input.limit ?? MAX_ENTRIES, MAX_ENTRIES)
|
|
199
|
+
})
|
|
200
|
+
})
|
package/src/Grep.ts
ADDED
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `grep` flow and its Smithers Ripgrep Subset v1 contract.
|
|
3
|
+
*
|
|
4
|
+
* Supported ripgrep semantics: Rust-style regular expressions restricted to
|
|
5
|
+
* Smithers Ripgrep ASCII v1; `-F` (`fixedStrings`); `-i` (`ignoreCase`) and `-S`
|
|
6
|
+
* (`smartCase`); ordered `-g` include/exclude globs; `-A`, `-B`, and `-C`
|
|
7
|
+
* context; per-file `--max-count`; `--files-with-matches`; `--hidden`; and
|
|
8
|
+
* deterministic path/line ordering. Root and nested .gitignore files apply by
|
|
9
|
+
* default, including outside git repositories. `noIgnore: true` opts out.
|
|
10
|
+
* Parent/global ignore files, .git/info/exclude, .ignore and .rgignore are not
|
|
11
|
+
* read. File-type registries are outside v1, and there is no `types` field to
|
|
12
|
+
* pass. Patterns are capped at 4096 ASCII bytes and counted repetitions at 1000. Invalid UTF-8 is replacement-decoded; NUL-bearing
|
|
13
|
+
* files are skipped and counted, while an explicitly named binary file is a
|
|
14
|
+
* typed failure.
|
|
15
|
+
*
|
|
16
|
+
* Results are match-centric, which is `rg --json`'s own grouping: `limit`
|
|
17
|
+
* counts matches, each match carries the context lines that belong to it, and
|
|
18
|
+
* every context line belongs to exactly one match. A budget that counted rows
|
|
19
|
+
* could spend itself on context and drop the match — astropy-7166 paid three
|
|
20
|
+
* frames for exactly that — so a hit is never droppable to make room for its
|
|
21
|
+
* own surroundings. Truncation is disclosed through `notice`.
|
|
22
|
+
*
|
|
23
|
+
* Each returned hit also carries the definition enclosing it when the file's
|
|
24
|
+
* shape says so plainly, so a read window is computed rather than guessed, and
|
|
25
|
+
* a metacharacter pattern that finds nothing is retried as a literal with
|
|
26
|
+
* `retriedAsLiteral` set. Both are properties of the contract rather than of a
|
|
27
|
+
* peer: they are computed in `internal/Grouping.ts` for both implementations.
|
|
28
|
+
*
|
|
29
|
+
* `globs` accepts exactly the shapes `glob` accepts and reads them the same
|
|
30
|
+
* way: every pattern is matched against each candidate's path *relative to
|
|
31
|
+
* `root`*, a pattern without `/` matches the basename at any depth, and a
|
|
32
|
+
* leading `/` or `./` anchors at the root rather than naming a filesystem
|
|
33
|
+
* absolute path. A `root` that names one file is searched whatever the globs
|
|
34
|
+
* say. Caller globs filter after ignores; they never override them. See `Glob` for the full statement of the rules. A search that matched
|
|
35
|
+
* nothing because a positive glob was unsatisfiable says so through `notice`
|
|
36
|
+
* instead of returning a silent empty result.
|
|
37
|
+
*
|
|
38
|
+
* `filesSearched` counts every file the walk and globs admitted, including the binaries
|
|
39
|
+
* `skippedBinary` reports and any file the process could not open. A walk
|
|
40
|
+
* skips what it cannot read rather than failing the call.
|
|
41
|
+
*
|
|
42
|
+
* Native and in-process implementations are peers behind `Search.Search`.
|
|
43
|
+
* This module declares and validates the call; it performs no host access.
|
|
44
|
+
*
|
|
45
|
+
* @since 1.0.0
|
|
46
|
+
*/
|
|
47
|
+
|
|
48
|
+
import { Effect, Schema } from "effect"
|
|
49
|
+
import { capability, envelope, rootSubtree } from "./internal/Declaration.ts"
|
|
50
|
+
import { invalidInput } from "./internal/SearchContract.ts"
|
|
51
|
+
import { MAX_GREP_MATCHES } from "./internal/Text.ts"
|
|
52
|
+
import * as Search from "./Search.ts"
|
|
53
|
+
import * as Contract from "./SearchContract.ts"
|
|
54
|
+
import * as StdError from "./StdError.ts"
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* The registry name for grep.
|
|
58
|
+
*
|
|
59
|
+
* @category identifiers
|
|
60
|
+
* @since 1.0.0
|
|
61
|
+
*/
|
|
62
|
+
export const name = "grep"
|
|
63
|
+
/**
|
|
64
|
+
* The model-facing grep description.
|
|
65
|
+
*
|
|
66
|
+
* @category descriptions
|
|
67
|
+
* @since 1.0.0
|
|
68
|
+
*/
|
|
69
|
+
export const description =
|
|
70
|
+
"Search file contents through the Smithers Ripgrep Subset v1 contract. limit counts matches, each carrying its own context and enclosing definition; fixedStrings searches a literal, and one is retried."
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Input accepted by {@link flow} and {@link run}.
|
|
74
|
+
*
|
|
75
|
+
* @category schemas
|
|
76
|
+
* @since 1.0.0
|
|
77
|
+
*/
|
|
78
|
+
export const Input = Schema.Struct({
|
|
79
|
+
pattern: Schema.String.annotate({ description: "Smithers Ripgrep ASCII v1 expression." }),
|
|
80
|
+
root: Schema.optional(Schema.String).annotate({
|
|
81
|
+
description: "Search root the globs are relative to; defaults to . (the host workspace)."
|
|
82
|
+
}),
|
|
83
|
+
fixedStrings: Schema.optional(Schema.Boolean).annotate({ description: "Ripgrep -F." }),
|
|
84
|
+
ignoreCase: Schema.optional(Schema.Boolean).annotate({ description: "Ripgrep -i." }),
|
|
85
|
+
smartCase: Schema.optional(Schema.Boolean).annotate({ description: "Ripgrep -S." }),
|
|
86
|
+
globs: Schema.optional(Schema.Array(Schema.String)).annotate({
|
|
87
|
+
description:
|
|
88
|
+
"Ordered ripgrep -g globs, matched against paths relative to root, never absolute paths: a glob without / matches any basename, a leading / anchors at root, and ** crosses directories. Prefix exclusions with !."
|
|
89
|
+
}),
|
|
90
|
+
beforeContext: Schema.optional(Schema.Int.check(Schema.isGreaterThanOrEqualTo(0))).annotate({
|
|
91
|
+
description: "Ripgrep -B."
|
|
92
|
+
}),
|
|
93
|
+
afterContext: Schema.optional(Schema.Int.check(Schema.isGreaterThanOrEqualTo(0))).annotate({
|
|
94
|
+
description: "Ripgrep -A."
|
|
95
|
+
}),
|
|
96
|
+
context: Schema.optional(Schema.Int.check(Schema.isGreaterThanOrEqualTo(0))).annotate({ description: "Ripgrep -C." }),
|
|
97
|
+
maxCount: Schema.optional(Schema.Int.check(Schema.isGreaterThanOrEqualTo(1))).annotate({
|
|
98
|
+
description: "Ripgrep --max-count, per file; at least 1."
|
|
99
|
+
}),
|
|
100
|
+
filesWithMatches: Schema.optional(Schema.Boolean).annotate({ description: "Ripgrep --files-with-matches." }),
|
|
101
|
+
hidden: Schema.optional(Schema.Boolean).annotate({ description: "Ripgrep --hidden." }),
|
|
102
|
+
symbols: Schema.optional(Schema.Boolean).annotate({
|
|
103
|
+
description: "Report the definition enclosing each returned hit; true by default."
|
|
104
|
+
}),
|
|
105
|
+
noIgnore: Schema.optional(Schema.Boolean).annotate({
|
|
106
|
+
description:
|
|
107
|
+
"Honor root-scoped .gitignore files by default. Set true to include ignored paths; hidden and fixed directory skips still apply."
|
|
108
|
+
}),
|
|
109
|
+
limit: Schema.optional(Schema.Int.check(Schema.isGreaterThanOrEqualTo(0))).annotate({
|
|
110
|
+
description: `Global result limit, capped at ${MAX_GREP_MATCHES}.`
|
|
111
|
+
})
|
|
112
|
+
})
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Decoded input accepted by the `grep` flow.
|
|
116
|
+
*
|
|
117
|
+
* @category models
|
|
118
|
+
* @since 1.0.0
|
|
119
|
+
*/
|
|
120
|
+
export type Input = typeof Input.Type
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* One matching or context line.
|
|
124
|
+
*
|
|
125
|
+
* @category schemas
|
|
126
|
+
* @since 1.0.0
|
|
127
|
+
*/
|
|
128
|
+
export const ContextLine = Schema.Struct({
|
|
129
|
+
line: Schema.Int.annotate({ description: "1-based line number" }),
|
|
130
|
+
text: Schema.String
|
|
131
|
+
})
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* The definition a hit sits inside, when the file's shape says so plainly.
|
|
135
|
+
*
|
|
136
|
+
* @category schemas
|
|
137
|
+
* @since 1.0.0
|
|
138
|
+
*/
|
|
139
|
+
export const Symbol = Schema.Struct({
|
|
140
|
+
kind: Schema.String.annotate({ description: "The declaration keyword, such as def or class" }),
|
|
141
|
+
name: Schema.String,
|
|
142
|
+
startLine: Schema.Int.annotate({ description: "1-based first line of the definition" }),
|
|
143
|
+
endLine: Schema.Int.annotate({
|
|
144
|
+
description: "1-based last line of the definition; read this range, do not guess one"
|
|
145
|
+
})
|
|
146
|
+
})
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* One hit and the context that belongs to it.
|
|
150
|
+
*
|
|
151
|
+
* @category schemas
|
|
152
|
+
* @since 1.0.0
|
|
153
|
+
*/
|
|
154
|
+
export const Match = Schema.Struct({
|
|
155
|
+
file: Schema.String,
|
|
156
|
+
line: Schema.Int,
|
|
157
|
+
text: Schema.String,
|
|
158
|
+
before: Schema.Array(ContextLine),
|
|
159
|
+
after: Schema.Array(ContextLine),
|
|
160
|
+
symbol: Schema.optional(Symbol)
|
|
161
|
+
})
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Output produced by {@link run}.
|
|
165
|
+
*
|
|
166
|
+
* @category schemas
|
|
167
|
+
* @since 1.0.0
|
|
168
|
+
*/
|
|
169
|
+
export const Output = Schema.Struct({
|
|
170
|
+
matches: Schema.Array(Match),
|
|
171
|
+
files: Schema.Array(Schema.String),
|
|
172
|
+
filesSearched: Schema.Int,
|
|
173
|
+
skippedBinary: Schema.Int,
|
|
174
|
+
truncated: Schema.Boolean,
|
|
175
|
+
retriedAsLiteral: Schema.optional(Schema.Boolean).annotate({
|
|
176
|
+
description: "Present when the pattern found nothing as a regex and these results come from re-running it literally"
|
|
177
|
+
}),
|
|
178
|
+
notice: Schema.optional(Schema.String)
|
|
179
|
+
})
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Decoded output returned by the `grep` flow.
|
|
183
|
+
*
|
|
184
|
+
* @category models
|
|
185
|
+
* @since 1.0.0
|
|
186
|
+
*/
|
|
187
|
+
export type Output = typeof Output.Type
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Conservative sealed declaration for all workspace files.
|
|
191
|
+
*
|
|
192
|
+
* @category effects
|
|
193
|
+
* @since 1.0.0
|
|
194
|
+
*/
|
|
195
|
+
export const effects = envelope({ tier: "sealed", mode: "hermetic", reads: ["/**"], writes: [] })
|
|
196
|
+
/**
|
|
197
|
+
* Narrows the read declaration to the requested root subtree.
|
|
198
|
+
*
|
|
199
|
+
* @category effects
|
|
200
|
+
* @since 1.0.0
|
|
201
|
+
*/
|
|
202
|
+
export const effectsFor = (input: { readonly root?: string | undefined }) =>
|
|
203
|
+
envelope({ tier: "sealed", mode: "hermetic", reads: [rootSubtree(input.root ?? ".")], writes: [] })
|
|
204
|
+
/**
|
|
205
|
+
* Capability strings requested by grep.
|
|
206
|
+
*
|
|
207
|
+
* @category capabilities
|
|
208
|
+
* @since 1.0.0
|
|
209
|
+
*/
|
|
210
|
+
export const capabilities = [capability("fs:read", "/**")]
|
|
211
|
+
/**
|
|
212
|
+
* Declaration-only grep flow.
|
|
213
|
+
*
|
|
214
|
+
* @category flows
|
|
215
|
+
* @since 1.0.0
|
|
216
|
+
*/
|
|
217
|
+
export const flow = { name, description, input: Input, output: Output, capabilities, effects } as const
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* What a call to this flow does, for a reader of a run.
|
|
221
|
+
*
|
|
222
|
+
* Display metadata only. `@smthrs/registry` `Descriptor.FlowActivity` is the
|
|
223
|
+
* governing vocabulary and `StandardFlows` binds this value onto the flow's
|
|
224
|
+
* descriptor, where the binding site checks it. `declarationDigest` excludes
|
|
225
|
+
* it, so declaring it cannot invalidate a call identity or a cached prompt.
|
|
226
|
+
*
|
|
227
|
+
* @category presentation
|
|
228
|
+
* @since 1.0.0-rc.0
|
|
229
|
+
*/
|
|
230
|
+
export const activity = "reads" as const
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* How one recorded call to this flow reads: the verb for each settlement, the
|
|
234
|
+
* input field that is its subject, and the measured output fields a one-line
|
|
235
|
+
* summary may count.
|
|
236
|
+
*
|
|
237
|
+
* Display metadata only, governed by `@smthrs/registry`
|
|
238
|
+
* `Descriptor.CallPresentation` and checked where `StandardFlows` binds it.
|
|
239
|
+
*
|
|
240
|
+
* @category presentation
|
|
241
|
+
* @since 1.0.0-rc.0
|
|
242
|
+
*/
|
|
243
|
+
export const presentation = {
|
|
244
|
+
verb: { pending: "searching", success: "searched", failure: "failed to search" },
|
|
245
|
+
subject: "pattern",
|
|
246
|
+
result: "matches"
|
|
247
|
+
} as const
|
|
248
|
+
|
|
249
|
+
const normalize = (input: typeof Input.Type): Search.GrepInput | StdError.StdError => {
|
|
250
|
+
if (input.ignoreCase === true && input.smartCase === true) {
|
|
251
|
+
return invalidInput("-i and -S are mutually exclusive")
|
|
252
|
+
}
|
|
253
|
+
if (input.context !== undefined && (input.beforeContext !== undefined || input.afterContext !== undefined)) {
|
|
254
|
+
return invalidInput("-C cannot be combined with -A or -B")
|
|
255
|
+
}
|
|
256
|
+
// `rg --max-count 0` answers nothing at all, not even the summary the native
|
|
257
|
+
// peer parses, so a cap that admits no match is rejected rather than read
|
|
258
|
+
// differently by each peer.
|
|
259
|
+
if (input.maxCount !== undefined && input.maxCount < 1) {
|
|
260
|
+
return invalidInput("--max-count must be at least 1")
|
|
261
|
+
}
|
|
262
|
+
const fixedStrings = input.fixedStrings ?? false
|
|
263
|
+
const patternError = Contract.validatePattern(input.pattern, fixedStrings)
|
|
264
|
+
if (patternError !== undefined) return patternError
|
|
265
|
+
for (const glob of input.globs ?? []) {
|
|
266
|
+
const globError = Contract.validateGlob(glob)
|
|
267
|
+
if (globError !== undefined) return globError
|
|
268
|
+
}
|
|
269
|
+
return {
|
|
270
|
+
pattern: input.pattern,
|
|
271
|
+
root: input.root ?? ".",
|
|
272
|
+
fixedStrings,
|
|
273
|
+
ignoreCase: input.ignoreCase ?? false,
|
|
274
|
+
smartCase: input.smartCase ?? false,
|
|
275
|
+
globs: input.globs ?? [],
|
|
276
|
+
beforeContext: input.context ?? input.beforeContext ?? 0,
|
|
277
|
+
afterContext: input.context ?? input.afterContext ?? 0,
|
|
278
|
+
maxCount: input.maxCount,
|
|
279
|
+
filesWithMatches: input.filesWithMatches ?? false,
|
|
280
|
+
hidden: input.hidden ?? false,
|
|
281
|
+
noIgnore: input.noIgnore ?? false,
|
|
282
|
+
symbols: input.symbols ?? true,
|
|
283
|
+
limit: Math.min(input.limit ?? MAX_GREP_MATCHES, MAX_GREP_MATCHES)
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
const metacharacters = /[\\^$.|?*+()[\]{}]/
|
|
288
|
+
|
|
289
|
+
const empty = (output: typeof Output.Type): boolean => output.matches.length === 0 && output.files.length === 0
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Runs one validated ripgrep-contract call through the selected peer implementation.
|
|
293
|
+
*
|
|
294
|
+
* A pattern full of metacharacters that finds nothing is the most common way a
|
|
295
|
+
* search lies: `sphinx-16612` searched 867 files for a parenthesised name and
|
|
296
|
+
* read `0 of 867` as "this symbol is not used here". The retry costs one more
|
|
297
|
+
* pass over the same tree only in the case that already found nothing, and the
|
|
298
|
+
* result says plainly that the answer came from the literal reading.
|
|
299
|
+
*
|
|
300
|
+
* @category handlers
|
|
301
|
+
* @since 1.0.0
|
|
302
|
+
*/
|
|
303
|
+
export const run = Effect.fn("Grep.run")(function*(
|
|
304
|
+
input: typeof Input.Type
|
|
305
|
+
): Effect.fn.Return<typeof Output.Type, StdError.StdError, Search.Search> {
|
|
306
|
+
const normalized = normalize(input)
|
|
307
|
+
if (normalized instanceof StdError.StdError) return yield* Effect.fail(normalized)
|
|
308
|
+
const search = yield* Search.Search
|
|
309
|
+
const result = yield* search.grep(normalized)
|
|
310
|
+
if (normalized.fixedStrings || !empty(result) || !metacharacters.test(normalized.pattern)) return result
|
|
311
|
+
const literal = yield* search.grep({ ...normalized, fixedStrings: true })
|
|
312
|
+
if (empty(literal)) return result
|
|
313
|
+
const explanation =
|
|
314
|
+
`The pattern found nothing as a regular expression and these results come from re-running it literally (fixedStrings: true).`
|
|
315
|
+
return {
|
|
316
|
+
...literal,
|
|
317
|
+
retriedAsLiteral: true,
|
|
318
|
+
notice: literal.notice === undefined ? explanation : `${explanation} ${literal.notice}`
|
|
319
|
+
}
|
|
320
|
+
})
|