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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (555) hide show
  1. package/CHANGELOG.md +130 -0
  2. package/LICENSE +21 -0
  3. package/README.md +152 -2
  4. package/dist/cjs/ApplyPatch.d.ts +174 -0
  5. package/dist/cjs/ApplyPatch.d.ts.map +1 -0
  6. package/dist/cjs/ApplyPatch.js +309 -0
  7. package/dist/cjs/ApplyPatch.js.map +7 -0
  8. package/dist/cjs/Bash.d.ts +304 -0
  9. package/dist/cjs/Bash.d.ts.map +1 -0
  10. package/dist/cjs/Bash.js +321 -0
  11. package/dist/cjs/Bash.js.map +7 -0
  12. package/dist/cjs/Checkpoints.d.ts +279 -0
  13. package/dist/cjs/Checkpoints.d.ts.map +1 -0
  14. package/dist/cjs/Checkpoints.js +145 -0
  15. package/dist/cjs/Checkpoints.js.map +7 -0
  16. package/dist/cjs/Container.d.ts +132 -0
  17. package/dist/cjs/Container.d.ts.map +1 -0
  18. package/dist/cjs/Container.js +113 -0
  19. package/dist/cjs/Container.js.map +7 -0
  20. package/dist/cjs/Edit.d.ts +203 -0
  21. package/dist/cjs/Edit.d.ts.map +1 -0
  22. package/dist/cjs/Edit.js +258 -0
  23. package/dist/cjs/Edit.js.map +7 -0
  24. package/dist/cjs/ExaWebSearch.d.ts +22 -0
  25. package/dist/cjs/ExaWebSearch.d.ts.map +1 -0
  26. package/dist/cjs/ExaWebSearch.js +138 -0
  27. package/dist/cjs/ExaWebSearch.js.map +7 -0
  28. package/dist/cjs/Explore.d.ts +328 -0
  29. package/dist/cjs/Explore.d.ts.map +1 -0
  30. package/dist/cjs/Explore.js +90 -0
  31. package/dist/cjs/Explore.js.map +7 -0
  32. package/dist/cjs/Fetch.d.ts +130 -0
  33. package/dist/cjs/Fetch.d.ts.map +1 -0
  34. package/dist/cjs/Fetch.js +64 -0
  35. package/dist/cjs/Fetch.js.map +7 -0
  36. package/dist/cjs/Glob.d.ts +204 -0
  37. package/dist/cjs/Glob.d.ts.map +1 -0
  38. package/dist/cjs/Glob.js +94 -0
  39. package/dist/cjs/Glob.js.map +7 -0
  40. package/dist/cjs/Grep.d.ts +347 -0
  41. package/dist/cjs/Grep.d.ts.map +1 -0
  42. package/dist/cjs/Grep.js +181 -0
  43. package/dist/cjs/Grep.js.map +7 -0
  44. package/dist/cjs/HttpPost.d.ts +130 -0
  45. package/dist/cjs/HttpPost.d.ts.map +1 -0
  46. package/dist/cjs/HttpPost.js +72 -0
  47. package/dist/cjs/HttpPost.js.map +7 -0
  48. package/dist/cjs/LanguageServer.d.ts +90 -0
  49. package/dist/cjs/LanguageServer.d.ts.map +1 -0
  50. package/dist/cjs/LanguageServer.js +60 -0
  51. package/dist/cjs/LanguageServer.js.map +7 -0
  52. package/dist/cjs/Ls.d.ts +164 -0
  53. package/dist/cjs/Ls.d.ts.map +1 -0
  54. package/dist/cjs/Ls.js +136 -0
  55. package/dist/cjs/Ls.js.map +7 -0
  56. package/dist/cjs/Lsp.d.ts +125 -0
  57. package/dist/cjs/Lsp.d.ts.map +1 -0
  58. package/dist/cjs/Lsp.js +137 -0
  59. package/dist/cjs/Lsp.js.map +7 -0
  60. package/dist/cjs/Manifest.d.ts +918 -0
  61. package/dist/cjs/Manifest.d.ts.map +1 -0
  62. package/dist/cjs/Manifest.js +144 -0
  63. package/dist/cjs/Manifest.js.map +7 -0
  64. package/dist/cjs/NativeSearch.d.ts +38 -0
  65. package/dist/cjs/NativeSearch.d.ts.map +1 -0
  66. package/dist/cjs/NativeSearch.js +326 -0
  67. package/dist/cjs/NativeSearch.js.map +7 -0
  68. package/dist/cjs/NodeLanguageServer.d.ts +128 -0
  69. package/dist/cjs/NodeLanguageServer.d.ts.map +1 -0
  70. package/dist/cjs/NodeLanguageServer.js +796 -0
  71. package/dist/cjs/NodeLanguageServer.js.map +7 -0
  72. package/dist/cjs/PortableSearch.d.ts +24 -0
  73. package/dist/cjs/PortableSearch.d.ts.map +1 -0
  74. package/dist/cjs/PortableSearch.js +233 -0
  75. package/dist/cjs/PortableSearch.js.map +7 -0
  76. package/dist/cjs/Probe.d.ts +193 -0
  77. package/dist/cjs/Probe.d.ts.map +1 -0
  78. package/dist/cjs/Probe.js +134 -0
  79. package/dist/cjs/Probe.js.map +7 -0
  80. package/dist/cjs/Read.d.ts +189 -0
  81. package/dist/cjs/Read.d.ts.map +1 -0
  82. package/dist/cjs/Read.js +223 -0
  83. package/dist/cjs/Read.js.map +7 -0
  84. package/dist/cjs/Relocate.d.ts +73 -0
  85. package/dist/cjs/Relocate.d.ts.map +1 -0
  86. package/dist/cjs/Relocate.js +72 -0
  87. package/dist/cjs/Relocate.js.map +7 -0
  88. package/dist/cjs/Search.d.ts +163 -0
  89. package/dist/cjs/Search.d.ts.map +1 -0
  90. package/dist/cjs/Search.js +51 -0
  91. package/dist/cjs/Search.js.map +7 -0
  92. package/dist/cjs/SearchConformance.d.ts +115 -0
  93. package/dist/cjs/SearchConformance.d.ts.map +1 -0
  94. package/dist/cjs/SearchConformance.js +172 -0
  95. package/dist/cjs/SearchConformance.js.map +7 -0
  96. package/dist/cjs/SearchContract.d.ts +114 -0
  97. package/dist/cjs/SearchContract.d.ts.map +1 -0
  98. package/dist/cjs/SearchContract.js +339 -0
  99. package/dist/cjs/SearchContract.js.map +7 -0
  100. package/dist/cjs/ShellCommand.d.ts +164 -0
  101. package/dist/cjs/ShellCommand.d.ts.map +1 -0
  102. package/dist/cjs/ShellCommand.js +102 -0
  103. package/dist/cjs/ShellCommand.js.map +7 -0
  104. package/dist/cjs/StdError.d.ts +55 -0
  105. package/dist/cjs/StdError.d.ts.map +1 -0
  106. package/dist/cjs/StdError.js +74 -0
  107. package/dist/cjs/StdError.js.map +7 -0
  108. package/dist/cjs/TestRun.d.ts +311 -0
  109. package/dist/cjs/TestRun.d.ts.map +1 -0
  110. package/dist/cjs/TestRun.js +228 -0
  111. package/dist/cjs/TestRun.js.map +7 -0
  112. package/dist/cjs/TestRunner.d.ts +102 -0
  113. package/dist/cjs/TestRunner.d.ts.map +1 -0
  114. package/dist/cjs/TestRunner.js +54 -0
  115. package/dist/cjs/TestRunner.js.map +7 -0
  116. package/dist/cjs/TreeFingerprint.d.ts +140 -0
  117. package/dist/cjs/TreeFingerprint.d.ts.map +1 -0
  118. package/dist/cjs/TreeFingerprint.js +87 -0
  119. package/dist/cjs/TreeFingerprint.js.map +7 -0
  120. package/dist/cjs/UpdatePlan.d.ts +152 -0
  121. package/dist/cjs/UpdatePlan.d.ts.map +1 -0
  122. package/dist/cjs/UpdatePlan.js +87 -0
  123. package/dist/cjs/UpdatePlan.js.map +7 -0
  124. package/dist/cjs/WebFetch.d.ts +134 -0
  125. package/dist/cjs/WebFetch.d.ts.map +1 -0
  126. package/dist/cjs/WebFetch.js +140 -0
  127. package/dist/cjs/WebFetch.js.map +7 -0
  128. package/dist/cjs/WebSearch.d.ts +181 -0
  129. package/dist/cjs/WebSearch.d.ts.map +1 -0
  130. package/dist/cjs/WebSearch.js +86 -0
  131. package/dist/cjs/WebSearch.js.map +7 -0
  132. package/dist/cjs/Write.d.ts +147 -0
  133. package/dist/cjs/Write.d.ts.map +1 -0
  134. package/dist/cjs/Write.js +122 -0
  135. package/dist/cjs/Write.js.map +7 -0
  136. package/dist/cjs/index.d.ts +127 -0
  137. package/dist/cjs/index.d.ts.map +1 -0
  138. package/dist/cjs/index.js +99 -0
  139. package/dist/cjs/index.js.map +7 -0
  140. package/dist/cjs/internal/ApplyPatch.d.ts +145 -0
  141. package/dist/cjs/internal/ApplyPatch.d.ts.map +1 -0
  142. package/dist/cjs/internal/ApplyPatch.js +462 -0
  143. package/dist/cjs/internal/ApplyPatch.js.map +7 -0
  144. package/dist/cjs/internal/CodexText.d.ts +73 -0
  145. package/dist/cjs/internal/CodexText.d.ts.map +1 -0
  146. package/dist/cjs/internal/CodexText.js +108 -0
  147. package/dist/cjs/internal/CodexText.js.map +7 -0
  148. package/dist/cjs/internal/Declaration.d.ts +49 -0
  149. package/dist/cjs/internal/Declaration.d.ts.map +1 -0
  150. package/dist/cjs/internal/Declaration.js +46 -0
  151. package/dist/cjs/internal/Declaration.js.map +7 -0
  152. package/dist/cjs/internal/Diagnostics.d.ts +77 -0
  153. package/dist/cjs/internal/Diagnostics.d.ts.map +1 -0
  154. package/dist/cjs/internal/Diagnostics.js +89 -0
  155. package/dist/cjs/internal/Diagnostics.js.map +7 -0
  156. package/dist/cjs/internal/EnvelopePrecheck.d.ts +67 -0
  157. package/dist/cjs/internal/EnvelopePrecheck.d.ts.map +1 -0
  158. package/dist/cjs/internal/EnvelopePrecheck.js +124 -0
  159. package/dist/cjs/internal/EnvelopePrecheck.js.map +7 -0
  160. package/dist/cjs/internal/Exec.d.ts +139 -0
  161. package/dist/cjs/internal/Exec.d.ts.map +1 -0
  162. package/dist/cjs/internal/Exec.js +158 -0
  163. package/dist/cjs/internal/Exec.js.map +7 -0
  164. package/dist/cjs/internal/FileMutation.d.ts +109 -0
  165. package/dist/cjs/internal/FileMutation.d.ts.map +1 -0
  166. package/dist/cjs/internal/FileMutation.js +116 -0
  167. package/dist/cjs/internal/FileMutation.js.map +7 -0
  168. package/dist/cjs/internal/FsFailure.d.ts +38 -0
  169. package/dist/cjs/internal/FsFailure.d.ts.map +1 -0
  170. package/dist/cjs/internal/FsFailure.js +40 -0
  171. package/dist/cjs/internal/FsFailure.js.map +7 -0
  172. package/dist/cjs/internal/GitWorktree.d.ts +98 -0
  173. package/dist/cjs/internal/GitWorktree.d.ts.map +1 -0
  174. package/dist/cjs/internal/GitWorktree.js +270 -0
  175. package/dist/cjs/internal/GitWorktree.js.map +7 -0
  176. package/dist/cjs/internal/Grouping.d.ts +51 -0
  177. package/dist/cjs/internal/Grouping.d.ts.map +1 -0
  178. package/dist/cjs/internal/Grouping.js +83 -0
  179. package/dist/cjs/internal/Grouping.js.map +7 -0
  180. package/dist/cjs/internal/Html.d.ts +20 -0
  181. package/dist/cjs/internal/Html.d.ts.map +1 -0
  182. package/dist/cjs/internal/Html.js +81 -0
  183. package/dist/cjs/internal/Html.js.map +7 -0
  184. package/dist/cjs/internal/Http.d.ts +95 -0
  185. package/dist/cjs/internal/Http.d.ts.map +1 -0
  186. package/dist/cjs/internal/Http.js +153 -0
  187. package/dist/cjs/internal/Http.js.map +7 -0
  188. package/dist/cjs/internal/HttpNetwork.d.ts +27 -0
  189. package/dist/cjs/internal/HttpNetwork.d.ts.map +1 -0
  190. package/dist/cjs/internal/HttpNetwork.js +146 -0
  191. package/dist/cjs/internal/HttpNetwork.js.map +7 -0
  192. package/dist/cjs/internal/Ignore.d.ts +37 -0
  193. package/dist/cjs/internal/Ignore.d.ts.map +1 -0
  194. package/dist/cjs/internal/Ignore.js +100 -0
  195. package/dist/cjs/internal/Ignore.js.map +7 -0
  196. package/dist/cjs/internal/LinearRegex.d.ts +19 -0
  197. package/dist/cjs/internal/LinearRegex.d.ts.map +1 -0
  198. package/dist/cjs/internal/LinearRegex.js +166 -0
  199. package/dist/cjs/internal/LinearRegex.js.map +7 -0
  200. package/dist/cjs/internal/Match.d.ts +85 -0
  201. package/dist/cjs/internal/Match.d.ts.map +1 -0
  202. package/dist/cjs/internal/Match.js +99 -0
  203. package/dist/cjs/internal/Match.js.map +7 -0
  204. package/dist/cjs/internal/Paths.d.ts +23 -0
  205. package/dist/cjs/internal/Paths.d.ts.map +1 -0
  206. package/dist/cjs/internal/Paths.js +52 -0
  207. package/dist/cjs/internal/Paths.js.map +7 -0
  208. package/dist/cjs/internal/Preserve.d.ts +25 -0
  209. package/dist/cjs/internal/Preserve.d.ts.map +1 -0
  210. package/dist/cjs/internal/Preserve.js +88 -0
  211. package/dist/cjs/internal/Preserve.js.map +7 -0
  212. package/dist/cjs/internal/Prune.d.ts +35 -0
  213. package/dist/cjs/internal/Prune.d.ts.map +1 -0
  214. package/dist/cjs/internal/Prune.js +54 -0
  215. package/dist/cjs/internal/Prune.js.map +7 -0
  216. package/dist/cjs/internal/SearchContract.d.ts +63 -0
  217. package/dist/cjs/internal/SearchContract.d.ts.map +1 -0
  218. package/dist/cjs/internal/SearchContract.js +46 -0
  219. package/dist/cjs/internal/SearchContract.js.map +7 -0
  220. package/dist/cjs/internal/Symbols.d.ts +39 -0
  221. package/dist/cjs/internal/Symbols.d.ts.map +1 -0
  222. package/dist/cjs/internal/Symbols.js +59 -0
  223. package/dist/cjs/internal/Symbols.js.map +7 -0
  224. package/dist/cjs/internal/TestReport.d.ts +52 -0
  225. package/dist/cjs/internal/TestReport.d.ts.map +1 -0
  226. package/dist/cjs/internal/TestReport.js +131 -0
  227. package/dist/cjs/internal/TestReport.js.map +7 -0
  228. package/dist/cjs/internal/Text.d.ts +114 -0
  229. package/dist/cjs/internal/Text.d.ts.map +1 -0
  230. package/dist/cjs/internal/Text.js +82 -0
  231. package/dist/cjs/internal/Text.js.map +7 -0
  232. package/dist/cjs/internal/Url.d.ts +13 -0
  233. package/dist/cjs/internal/Url.d.ts.map +1 -0
  234. package/dist/cjs/internal/Url.js +35 -0
  235. package/dist/cjs/internal/Url.js.map +7 -0
  236. package/dist/cjs/internal/Walk.d.ts +72 -0
  237. package/dist/cjs/internal/Walk.d.ts.map +1 -0
  238. package/dist/cjs/internal/Walk.js +108 -0
  239. package/dist/cjs/internal/Walk.js.map +7 -0
  240. package/dist/cjs/package.json +1 -0
  241. package/dist/esm/ApplyPatch.d.ts +174 -0
  242. package/dist/esm/ApplyPatch.d.ts.map +1 -0
  243. package/dist/esm/ApplyPatch.js +346 -0
  244. package/dist/esm/ApplyPatch.js.map +1 -0
  245. package/dist/esm/Bash.d.ts +304 -0
  246. package/dist/esm/Bash.d.ts.map +1 -0
  247. package/dist/esm/Bash.js +469 -0
  248. package/dist/esm/Bash.js.map +1 -0
  249. package/dist/esm/Checkpoints.d.ts +279 -0
  250. package/dist/esm/Checkpoints.d.ts.map +1 -0
  251. package/dist/esm/Checkpoints.js +298 -0
  252. package/dist/esm/Checkpoints.js.map +1 -0
  253. package/dist/esm/Container.d.ts +132 -0
  254. package/dist/esm/Container.d.ts.map +1 -0
  255. package/dist/esm/Container.js +151 -0
  256. package/dist/esm/Container.js.map +1 -0
  257. package/dist/esm/Edit.d.ts +203 -0
  258. package/dist/esm/Edit.d.ts.map +1 -0
  259. package/dist/esm/Edit.js +296 -0
  260. package/dist/esm/Edit.js.map +1 -0
  261. package/dist/esm/ExaWebSearch.d.ts +22 -0
  262. package/dist/esm/ExaWebSearch.d.ts.map +1 -0
  263. package/dist/esm/ExaWebSearch.js +107 -0
  264. package/dist/esm/ExaWebSearch.js.map +1 -0
  265. package/dist/esm/Explore.d.ts +328 -0
  266. package/dist/esm/Explore.d.ts.map +1 -0
  267. package/dist/esm/Explore.js +106 -0
  268. package/dist/esm/Explore.js.map +1 -0
  269. package/dist/esm/Fetch.d.ts +130 -0
  270. package/dist/esm/Fetch.d.ts.map +1 -0
  271. package/dist/esm/Fetch.js +91 -0
  272. package/dist/esm/Fetch.js.map +1 -0
  273. package/dist/esm/Glob.d.ts +204 -0
  274. package/dist/esm/Glob.d.ts.map +1 -0
  275. package/dist/esm/Glob.js +177 -0
  276. package/dist/esm/Glob.js.map +1 -0
  277. package/dist/esm/Grep.d.ts +347 -0
  278. package/dist/esm/Grep.d.ts.map +1 -0
  279. package/dist/esm/Grep.js +289 -0
  280. package/dist/esm/Grep.js.map +1 -0
  281. package/dist/esm/HttpPost.d.ts +130 -0
  282. package/dist/esm/HttpPost.d.ts.map +1 -0
  283. package/dist/esm/HttpPost.js +89 -0
  284. package/dist/esm/HttpPost.js.map +1 -0
  285. package/dist/esm/LanguageServer.d.ts +90 -0
  286. package/dist/esm/LanguageServer.d.ts.map +1 -0
  287. package/dist/esm/LanguageServer.js +57 -0
  288. package/dist/esm/LanguageServer.js.map +1 -0
  289. package/dist/esm/Ls.d.ts +164 -0
  290. package/dist/esm/Ls.d.ts.map +1 -0
  291. package/dist/esm/Ls.js +178 -0
  292. package/dist/esm/Ls.js.map +1 -0
  293. package/dist/esm/Lsp.d.ts +125 -0
  294. package/dist/esm/Lsp.d.ts.map +1 -0
  295. package/dist/esm/Lsp.js +165 -0
  296. package/dist/esm/Lsp.js.map +1 -0
  297. package/dist/esm/Manifest.d.ts +918 -0
  298. package/dist/esm/Manifest.d.ts.map +1 -0
  299. package/dist/esm/Manifest.js +153 -0
  300. package/dist/esm/Manifest.js.map +1 -0
  301. package/dist/esm/NativeSearch.d.ts +38 -0
  302. package/dist/esm/NativeSearch.d.ts.map +1 -0
  303. package/dist/esm/NativeSearch.js +378 -0
  304. package/dist/esm/NativeSearch.js.map +1 -0
  305. package/dist/esm/NodeLanguageServer.d.ts +128 -0
  306. package/dist/esm/NodeLanguageServer.d.ts.map +1 -0
  307. package/dist/esm/NodeLanguageServer.js +843 -0
  308. package/dist/esm/NodeLanguageServer.js.map +1 -0
  309. package/dist/esm/PortableSearch.d.ts +24 -0
  310. package/dist/esm/PortableSearch.d.ts.map +1 -0
  311. package/dist/esm/PortableSearch.js +240 -0
  312. package/dist/esm/PortableSearch.js.map +1 -0
  313. package/dist/esm/Probe.d.ts +193 -0
  314. package/dist/esm/Probe.d.ts.map +1 -0
  315. package/dist/esm/Probe.js +225 -0
  316. package/dist/esm/Probe.js.map +1 -0
  317. package/dist/esm/Read.d.ts +189 -0
  318. package/dist/esm/Read.d.ts.map +1 -0
  319. package/dist/esm/Read.js +300 -0
  320. package/dist/esm/Read.js.map +1 -0
  321. package/dist/esm/Relocate.d.ts +73 -0
  322. package/dist/esm/Relocate.d.ts.map +1 -0
  323. package/dist/esm/Relocate.js +153 -0
  324. package/dist/esm/Relocate.js.map +1 -0
  325. package/dist/esm/Search.d.ts +163 -0
  326. package/dist/esm/Search.d.ts.map +1 -0
  327. package/dist/esm/Search.js +47 -0
  328. package/dist/esm/Search.js.map +1 -0
  329. package/dist/esm/SearchConformance.d.ts +115 -0
  330. package/dist/esm/SearchConformance.d.ts.map +1 -0
  331. package/dist/esm/SearchConformance.js +193 -0
  332. package/dist/esm/SearchConformance.js.map +1 -0
  333. package/dist/esm/SearchContract.d.ts +114 -0
  334. package/dist/esm/SearchContract.d.ts.map +1 -0
  335. package/dist/esm/SearchContract.js +461 -0
  336. package/dist/esm/SearchContract.js.map +1 -0
  337. package/dist/esm/ShellCommand.d.ts +164 -0
  338. package/dist/esm/ShellCommand.d.ts.map +1 -0
  339. package/dist/esm/ShellCommand.js +159 -0
  340. package/dist/esm/ShellCommand.js.map +1 -0
  341. package/dist/esm/StdError.d.ts +55 -0
  342. package/dist/esm/StdError.d.ts.map +1 -0
  343. package/dist/esm/StdError.js +71 -0
  344. package/dist/esm/StdError.js.map +1 -0
  345. package/dist/esm/TestRun.d.ts +311 -0
  346. package/dist/esm/TestRun.d.ts.map +1 -0
  347. package/dist/esm/TestRun.js +316 -0
  348. package/dist/esm/TestRun.js.map +1 -0
  349. package/dist/esm/TestRunner.d.ts +102 -0
  350. package/dist/esm/TestRunner.d.ts.map +1 -0
  351. package/dist/esm/TestRunner.js +68 -0
  352. package/dist/esm/TestRunner.js.map +1 -0
  353. package/dist/esm/TreeFingerprint.d.ts +140 -0
  354. package/dist/esm/TreeFingerprint.d.ts.map +1 -0
  355. package/dist/esm/TreeFingerprint.js +170 -0
  356. package/dist/esm/TreeFingerprint.js.map +1 -0
  357. package/dist/esm/UpdatePlan.d.ts +152 -0
  358. package/dist/esm/UpdatePlan.d.ts.map +1 -0
  359. package/dist/esm/UpdatePlan.js +129 -0
  360. package/dist/esm/UpdatePlan.js.map +1 -0
  361. package/dist/esm/WebFetch.d.ts +134 -0
  362. package/dist/esm/WebFetch.d.ts.map +1 -0
  363. package/dist/esm/WebFetch.js +151 -0
  364. package/dist/esm/WebFetch.js.map +1 -0
  365. package/dist/esm/WebSearch.d.ts +181 -0
  366. package/dist/esm/WebSearch.d.ts.map +1 -0
  367. package/dist/esm/WebSearch.js +134 -0
  368. package/dist/esm/WebSearch.js.map +1 -0
  369. package/dist/esm/Write.d.ts +147 -0
  370. package/dist/esm/Write.d.ts.map +1 -0
  371. package/dist/esm/Write.js +144 -0
  372. package/dist/esm/Write.js.map +1 -0
  373. package/dist/esm/index.d.ts +127 -0
  374. package/dist/esm/index.d.ts.map +1 -0
  375. package/dist/esm/index.js +127 -0
  376. package/dist/esm/index.js.map +1 -0
  377. package/dist/esm/internal/ApplyPatch.d.ts +145 -0
  378. package/dist/esm/internal/ApplyPatch.d.ts.map +1 -0
  379. package/dist/esm/internal/ApplyPatch.js +489 -0
  380. package/dist/esm/internal/ApplyPatch.js.map +1 -0
  381. package/dist/esm/internal/CodexText.d.ts +73 -0
  382. package/dist/esm/internal/CodexText.d.ts.map +1 -0
  383. package/dist/esm/internal/CodexText.js +156 -0
  384. package/dist/esm/internal/CodexText.js.map +1 -0
  385. package/dist/esm/internal/Declaration.d.ts +49 -0
  386. package/dist/esm/internal/Declaration.d.ts.map +1 -0
  387. package/dist/esm/internal/Declaration.js +42 -0
  388. package/dist/esm/internal/Declaration.js.map +1 -0
  389. package/dist/esm/internal/Diagnostics.d.ts +77 -0
  390. package/dist/esm/internal/Diagnostics.d.ts.map +1 -0
  391. package/dist/esm/internal/Diagnostics.js +99 -0
  392. package/dist/esm/internal/Diagnostics.js.map +1 -0
  393. package/dist/esm/internal/EnvelopePrecheck.d.ts +67 -0
  394. package/dist/esm/internal/EnvelopePrecheck.d.ts.map +1 -0
  395. package/dist/esm/internal/EnvelopePrecheck.js +167 -0
  396. package/dist/esm/internal/EnvelopePrecheck.js.map +1 -0
  397. package/dist/esm/internal/Exec.d.ts +139 -0
  398. package/dist/esm/internal/Exec.d.ts.map +1 -0
  399. package/dist/esm/internal/Exec.js +193 -0
  400. package/dist/esm/internal/Exec.js.map +1 -0
  401. package/dist/esm/internal/FileMutation.d.ts +109 -0
  402. package/dist/esm/internal/FileMutation.d.ts.map +1 -0
  403. package/dist/esm/internal/FileMutation.js +123 -0
  404. package/dist/esm/internal/FileMutation.js.map +1 -0
  405. package/dist/esm/internal/FsFailure.d.ts +38 -0
  406. package/dist/esm/internal/FsFailure.d.ts.map +1 -0
  407. package/dist/esm/internal/FsFailure.js +39 -0
  408. package/dist/esm/internal/FsFailure.js.map +1 -0
  409. package/dist/esm/internal/GitWorktree.d.ts +98 -0
  410. package/dist/esm/internal/GitWorktree.d.ts.map +1 -0
  411. package/dist/esm/internal/GitWorktree.js +345 -0
  412. package/dist/esm/internal/GitWorktree.js.map +1 -0
  413. package/dist/esm/internal/Grouping.d.ts +51 -0
  414. package/dist/esm/internal/Grouping.d.ts.map +1 -0
  415. package/dist/esm/internal/Grouping.js +99 -0
  416. package/dist/esm/internal/Grouping.js.map +1 -0
  417. package/dist/esm/internal/Html.d.ts +20 -0
  418. package/dist/esm/internal/Html.d.ts.map +1 -0
  419. package/dist/esm/internal/Html.js +70 -0
  420. package/dist/esm/internal/Html.js.map +1 -0
  421. package/dist/esm/internal/Http.d.ts +95 -0
  422. package/dist/esm/internal/Http.d.ts.map +1 -0
  423. package/dist/esm/internal/Http.js +154 -0
  424. package/dist/esm/internal/Http.js.map +1 -0
  425. package/dist/esm/internal/HttpNetwork.d.ts +27 -0
  426. package/dist/esm/internal/HttpNetwork.d.ts.map +1 -0
  427. package/dist/esm/internal/HttpNetwork.js +114 -0
  428. package/dist/esm/internal/HttpNetwork.js.map +1 -0
  429. package/dist/esm/internal/Ignore.d.ts +37 -0
  430. package/dist/esm/internal/Ignore.d.ts.map +1 -0
  431. package/dist/esm/internal/Ignore.js +128 -0
  432. package/dist/esm/internal/Ignore.js.map +1 -0
  433. package/dist/esm/internal/LinearRegex.d.ts +19 -0
  434. package/dist/esm/internal/LinearRegex.d.ts.map +1 -0
  435. package/dist/esm/internal/LinearRegex.js +176 -0
  436. package/dist/esm/internal/LinearRegex.js.map +1 -0
  437. package/dist/esm/internal/Match.d.ts +85 -0
  438. package/dist/esm/internal/Match.d.ts.map +1 -0
  439. package/dist/esm/internal/Match.js +142 -0
  440. package/dist/esm/internal/Match.js.map +1 -0
  441. package/dist/esm/internal/Paths.d.ts +23 -0
  442. package/dist/esm/internal/Paths.d.ts.map +1 -0
  443. package/dist/esm/internal/Paths.js +40 -0
  444. package/dist/esm/internal/Paths.js.map +1 -0
  445. package/dist/esm/internal/Preserve.d.ts +25 -0
  446. package/dist/esm/internal/Preserve.d.ts.map +1 -0
  447. package/dist/esm/internal/Preserve.js +70 -0
  448. package/dist/esm/internal/Preserve.js.map +1 -0
  449. package/dist/esm/internal/Prune.d.ts +35 -0
  450. package/dist/esm/internal/Prune.d.ts.map +1 -0
  451. package/dist/esm/internal/Prune.js +60 -0
  452. package/dist/esm/internal/Prune.js.map +1 -0
  453. package/dist/esm/internal/SearchContract.d.ts +63 -0
  454. package/dist/esm/internal/SearchContract.d.ts.map +1 -0
  455. package/dist/esm/internal/SearchContract.js +66 -0
  456. package/dist/esm/internal/SearchContract.js.map +1 -0
  457. package/dist/esm/internal/Symbols.d.ts +39 -0
  458. package/dist/esm/internal/Symbols.d.ts.map +1 -0
  459. package/dist/esm/internal/Symbols.js +79 -0
  460. package/dist/esm/internal/Symbols.js.map +1 -0
  461. package/dist/esm/internal/TestReport.d.ts +52 -0
  462. package/dist/esm/internal/TestReport.d.ts.map +1 -0
  463. package/dist/esm/internal/TestReport.js +172 -0
  464. package/dist/esm/internal/TestReport.js.map +1 -0
  465. package/dist/esm/internal/Text.d.ts +114 -0
  466. package/dist/esm/internal/Text.d.ts.map +1 -0
  467. package/dist/esm/internal/Text.js +130 -0
  468. package/dist/esm/internal/Text.js.map +1 -0
  469. package/dist/esm/internal/Url.d.ts +13 -0
  470. package/dist/esm/internal/Url.d.ts.map +1 -0
  471. package/dist/esm/internal/Url.js +27 -0
  472. package/dist/esm/internal/Url.js.map +1 -0
  473. package/dist/esm/internal/Walk.d.ts +72 -0
  474. package/dist/esm/internal/Walk.d.ts.map +1 -0
  475. package/dist/esm/internal/Walk.js +126 -0
  476. package/dist/esm/internal/Walk.js.map +1 -0
  477. package/docs/README.md +117 -0
  478. package/docs/api.md +472 -0
  479. package/docs/concepts/effects-and-capabilities.md +136 -0
  480. package/docs/concepts/flows-and-handlers.md +115 -0
  481. package/docs/concepts/limits-and-disclosure.md +102 -0
  482. package/docs/concepts/search-contract.md +182 -0
  483. package/docs/guides/bind-the-standard-flows.md +114 -0
  484. package/docs/guides/implement-a-search-peer.md +133 -0
  485. package/docs/guides/pin-a-checkpoint.md +141 -0
  486. package/docs/guides/query-a-language-server.md +257 -0
  487. package/docs/guides/reach-the-network.md +141 -0
  488. package/docs/guides/read-and-edit-a-file.md +240 -0
  489. package/docs/guides/run-a-shell-command.md +215 -0
  490. package/docs/guides/run-the-test-suite.md +154 -0
  491. package/docs/guides/search-a-workspace.md +148 -0
  492. package/docs/installation.md +111 -0
  493. package/docs/quickstart.md +125 -0
  494. package/docs/reference/flows.md +556 -0
  495. package/docs/troubleshooting.md +322 -0
  496. package/package.json +439 -3
  497. package/src/ApplyPatch.ts +458 -0
  498. package/src/Bash.ts +549 -0
  499. package/src/Checkpoints.ts +422 -0
  500. package/src/Container.ts +212 -0
  501. package/src/Edit.ts +366 -0
  502. package/src/ExaWebSearch.ts +145 -0
  503. package/src/Explore.ts +139 -0
  504. package/src/Fetch.ts +117 -0
  505. package/src/Glob.ts +200 -0
  506. package/src/Grep.ts +320 -0
  507. package/src/HttpPost.ts +120 -0
  508. package/src/LanguageServer.ts +110 -0
  509. package/src/Ls.ts +228 -0
  510. package/src/Lsp.ts +184 -0
  511. package/src/Manifest.ts +162 -0
  512. package/src/NativeSearch.ts +457 -0
  513. package/src/NodeLanguageServer.ts +1148 -0
  514. package/src/PortableSearch.ts +264 -0
  515. package/src/Probe.ts +284 -0
  516. package/src/Read.ts +359 -0
  517. package/src/Relocate.ts +166 -0
  518. package/src/Search.ts +185 -0
  519. package/src/SearchConformance.ts +288 -0
  520. package/src/SearchContract.ts +489 -0
  521. package/src/ShellCommand.ts +201 -0
  522. package/src/StdError.ts +80 -0
  523. package/src/TestRun.ts +401 -0
  524. package/src/TestRunner.ts +119 -0
  525. package/src/TreeFingerprint.ts +200 -0
  526. package/src/UpdatePlan.ts +171 -0
  527. package/src/WebFetch.ts +194 -0
  528. package/src/WebSearch.ts +165 -0
  529. package/src/Write.ts +195 -0
  530. package/src/index.ts +154 -0
  531. package/src/internal/ApplyPatch.ts +601 -0
  532. package/src/internal/CodexText.ts +182 -0
  533. package/src/internal/Declaration.ts +60 -0
  534. package/src/internal/Diagnostics.ts +134 -0
  535. package/src/internal/EnvelopePrecheck.ts +233 -0
  536. package/src/internal/Exec.ts +314 -0
  537. package/src/internal/FileMutation.ts +231 -0
  538. package/src/internal/FsFailure.ts +51 -0
  539. package/src/internal/GitWorktree.ts +473 -0
  540. package/src/internal/Grouping.ts +106 -0
  541. package/src/internal/Html.ts +87 -0
  542. package/src/internal/Http.ts +209 -0
  543. package/src/internal/HttpNetwork.ts +153 -0
  544. package/src/internal/Ignore.ts +135 -0
  545. package/src/internal/LinearRegex.ts +173 -0
  546. package/src/internal/Match.ts +172 -0
  547. package/src/internal/Paths.ts +42 -0
  548. package/src/internal/Preserve.ts +108 -0
  549. package/src/internal/Prune.ts +62 -0
  550. package/src/internal/SearchContract.ts +77 -0
  551. package/src/internal/Symbols.ts +88 -0
  552. package/src/internal/TestReport.ts +194 -0
  553. package/src/internal/Text.ts +170 -0
  554. package/src/internal/Url.ts +23 -0
  555. package/src/internal/Walk.ts +176 -0
@@ -0,0 +1,296 @@
1
+ /**
2
+ * Edit flow declaration and portable handler.
3
+ *
4
+ * Three rules, each of them paid for by a measured failure:
5
+ *
6
+ * 1. **Exact or loud.** The anchor matches the file's bytes or the call fails
7
+ * with the file's actual bytes at the nearest region. No fuzzy apply reports
8
+ * success (sympy-15380 corrupted a file that way), and no failure returns a
9
+ * bare `null` (sphinx-7590 abandoned a correct edit twice against one).
10
+ * 2. **Anchors by reference.** A prior `grep` or `read` already located the
11
+ * region; `startLine`/`endLine` re-use that hit instead of retyping the text,
12
+ * and `expect` turns the retyped copy into a checked assertion rather than a
13
+ * search key.
14
+ * 3. **The hunk comes back.** The result carries the applied region as raw text
15
+ * with its line range, so a mis-indented edit costs one glance instead of an
16
+ * investigation (sphinx-7233 lost its verdict to a hunk nobody could see).
17
+ * With a `LanguageServer` bound, the file's errors after the edit come back
18
+ * too.
19
+ *
20
+ * @since 1.0.0
21
+ */
22
+ import * as Effect from "effect/Effect";
23
+ import * as FileSystem from "effect/FileSystem";
24
+ import * as Schema from "effect/Schema";
25
+ import { capability, envelope } from "./internal/Declaration.js";
26
+ import * as Diagnostics from "./internal/Diagnostics.js";
27
+ import * as FileMutation from "./internal/FileMutation.js";
28
+ import * as FsFailure from "./internal/FsFailure.js";
29
+ import * as Match from "./internal/Match.js";
30
+ import * as Preserve from "./internal/Preserve.js";
31
+ import { sourceLines } from "./internal/Text.js";
32
+ import * as StdError from "./StdError.js";
33
+ /**
34
+ * Registry name for the edit flow.
35
+ *
36
+ * @category identifiers
37
+ * @since 1.0.0
38
+ */
39
+ export const name = "edit";
40
+ /**
41
+ * Model-facing description of the edit flow.
42
+ *
43
+ * @category descriptions
44
+ * @since 1.0.0
45
+ */
46
+ export const description = "Edit a file by exact text (oldString, unique unless replaceAll) or by an earlier hit's line range (startLine/endLine, optional expect). A miss returns the file's real text; a hit returns the hunk.";
47
+ /**
48
+ * Input schema for the edit flow.
49
+ *
50
+ * @category schemas
51
+ * @since 1.0.0
52
+ */
53
+ export const Input = Schema.Struct({
54
+ path: Schema.String.annotate({ description: "Path of the file to edit" }),
55
+ oldString: Schema.optional(Schema.String).annotate({
56
+ description: "Exact text to replace, byte for byte, including surrounding context"
57
+ }),
58
+ startLine: Schema.optional(Schema.Int.check(Schema.isGreaterThanOrEqualTo(1))).annotate({
59
+ description: "First 1-based line to replace, from a prior read or grep hit; pair with endLine"
60
+ }),
61
+ endLine: Schema.optional(Schema.Int.check(Schema.isGreaterThanOrEqualTo(1))).annotate({
62
+ description: "Last 1-based line to replace, inclusive"
63
+ }),
64
+ expect: Schema.optional(Schema.String).annotate({
65
+ description: "What those lines currently hold; the edit fails loudly if they hold anything else"
66
+ }),
67
+ newString: Schema.String.annotate({ description: "Replacement text" }),
68
+ replaceAll: Schema.optional(Schema.Boolean).annotate({ description: "Replace every occurrence instead of one" })
69
+ });
70
+ /**
71
+ * Output schema for the edit flow.
72
+ *
73
+ * @category schemas
74
+ * @since 1.0.0
75
+ */
76
+ export const Output = Schema.Struct({
77
+ path: Schema.String.annotate({ description: "Path that was edited" }),
78
+ replacements: Schema.Number.annotate({ description: "Number of occurrences replaced" }),
79
+ startLine: Schema.Number.annotate({ description: "First 1-based line of the returned hunk" }),
80
+ endLine: Schema.Number.annotate({ description: "Last 1-based line of the returned hunk" }),
81
+ hunk: Schema.String.annotate({
82
+ description: "The edited region as it now stands, raw and with its exact indentation, plus two lines of context"
83
+ }),
84
+ errors: Schema.optional(Schema.Array(Diagnostics.Problem)).annotate({
85
+ description: "Errors the language server reports in the file after the edit; absent when no server answered"
86
+ })
87
+ });
88
+ /**
89
+ * Static conservative effect envelope for the edit flow.
90
+ *
91
+ * @category effects
92
+ * @since 1.0.0
93
+ */
94
+ export const effects = envelope({ tier: "compensable", mode: "hermetic", reads: ["/**"], writes: ["/**"] });
95
+ /**
96
+ * Narrows the edit effect envelope to one input path.
97
+ *
98
+ * @category effects
99
+ * @since 1.0.0
100
+ */
101
+ export const effectsFor = (input) => envelope({ tier: "compensable", mode: "hermetic", reads: [input.path], writes: [input.path] });
102
+ /**
103
+ * Capabilities required by the edit flow.
104
+ *
105
+ * @category capabilities
106
+ * @since 1.0.0
107
+ */
108
+ export const capabilities = [capability("fs:read", "/**"), capability("fs:write", "/**")];
109
+ /**
110
+ * Declaration-only edit flow.
111
+ *
112
+ * @category flows
113
+ * @since 1.0.0
114
+ */
115
+ export const flow = { name, description, input: Input, output: Output, capabilities, effects };
116
+ /**
117
+ * What a call to this flow does, for a reader of a run.
118
+ *
119
+ * Display metadata only. `@smthrs/registry` `Descriptor.FlowActivity` is the
120
+ * governing vocabulary and `StandardFlows` binds this value onto the flow's
121
+ * descriptor, where the binding site checks it. `declarationDigest` excludes
122
+ * it, so declaring it cannot invalidate a call identity or a cached prompt.
123
+ *
124
+ * @category presentation
125
+ * @since 1.0.0-rc.0
126
+ */
127
+ export const activity = "writes";
128
+ /**
129
+ * How one recorded call to this flow reads: the verb for each settlement, the
130
+ * input field that is its subject, and the measured output fields a one-line
131
+ * summary may count.
132
+ *
133
+ * Display metadata only, governed by `@smthrs/registry`
134
+ * `Descriptor.CallPresentation` and checked where `StandardFlows` binds it.
135
+ *
136
+ * @category presentation
137
+ * @since 1.0.0-rc.0
138
+ */
139
+ export const presentation = {
140
+ verb: { pending: "editing", success: "edited", failure: "failed to edit" },
141
+ subject: "path",
142
+ result: "edit"
143
+ };
144
+ const invalid = (path, message) => new StdError.StdError({ code: "invalid_input", message, path });
145
+ /** The failure text for an anchor that is not in the file, with the file's own bytes. */
146
+ const miss = (path, content, needle, subject) => {
147
+ const region = Match.nearest(content, needle);
148
+ return new StdError.StdError({
149
+ code: "no_match",
150
+ message: region === undefined
151
+ ? `${subject} does not occur in ${path}, and no line of it occurs there either — this is the wrong file, or the region is not what you remember. Read it and anchor on what it actually holds.`
152
+ : `${subject} does not occur in ${path}. Lines ${region.startLine}-${region.endLine} actually hold this, raw:\n${region.text}\n\nCopy the lines you meant from that text, or anchor by startLine/endLine instead.`,
153
+ path
154
+ });
155
+ };
156
+ /** The byte span of an inclusive 1-based line range, or the failure explaining why not. */
157
+ const lineSpan = (path, content, startLine, endLine) => {
158
+ const lines = sourceLines(content);
159
+ if (endLine < startLine)
160
+ return invalid(path, `endLine ${endLine} is before startLine ${startLine}`);
161
+ if (startLine > lines.length) {
162
+ return new StdError.StdError({
163
+ code: "offset_out_of_range",
164
+ message: `${path} has ${lines.length} lines, so line ${startLine} is outside it`,
165
+ path
166
+ });
167
+ }
168
+ if (endLine > lines.length) {
169
+ return new StdError.StdError({
170
+ code: "offset_out_of_range",
171
+ message: `Requested endLine ${endLine}, but ${path} has ${lines.length} lines`,
172
+ path
173
+ });
174
+ }
175
+ const last = endLine;
176
+ let start = 0;
177
+ for (let index = 0; index < startLine - 1; index++)
178
+ start += lines[index].length + 1;
179
+ let end = start;
180
+ for (let index = startLine - 1; index < last; index++)
181
+ end += lines[index].length + (index === last - 1 ? 0 : 1);
182
+ return { start, end };
183
+ };
184
+ /**
185
+ * Applies one exact-anchored edit through the permission-aware kernel filesystem.
186
+ *
187
+ * Every refusal names what the file actually holds. A non-unique match is a
188
+ * refusal rather than a silent first-match edit, and it reports the lines every
189
+ * occurrence sits on so the caller can widen the anchor without re-reading.
190
+ *
191
+ * @category handlers
192
+ * @since 1.0.0
193
+ */
194
+ export const run = Effect.fn("Edit.run")(function* (input) {
195
+ const fileSystem = yield* FileSystem.FileSystem;
196
+ const byLines = input.startLine !== undefined || input.endLine !== undefined;
197
+ if (input.oldString !== undefined && byLines) {
198
+ return yield* Effect.fail(invalid(input.path, "Anchor by oldString or by startLine/endLine, not by both"));
199
+ }
200
+ if (input.oldString === undefined && !byLines) {
201
+ return yield* Effect.fail(invalid(input.path, "Give either oldString or a startLine/endLine range; use the write flow to create a file"));
202
+ }
203
+ if (byLines && (input.startLine === undefined || input.endLine === undefined)) {
204
+ return yield* Effect.fail(invalid(input.path, "A line anchor needs both startLine and endLine"));
205
+ }
206
+ if (input.oldString === "") {
207
+ return yield* Effect.fail(invalid(input.path, "oldString must not be empty; use the write flow to create a file"));
208
+ }
209
+ if (input.oldString !== undefined && input.expect !== undefined) {
210
+ return yield* Effect.fail(invalid(input.path, "expect cannot be used with oldString"));
211
+ }
212
+ if (byLines && input.replaceAll !== undefined) {
213
+ return yield* Effect.fail(invalid(input.path, "replaceAll cannot be used with startLine/endLine"));
214
+ }
215
+ const edited = yield* Effect.scoped(Effect.gen(function* () {
216
+ const mutation = yield* FileMutation.acquire(fileSystem, [input.path]);
217
+ const bytes = yield* mutation.read(input.path, fileSystem.readFile(input.path).pipe(Effect.mapError(FsFailure.reading(input.path, `File not found: ${input.path}`))));
218
+ if (bytes.includes(0)) {
219
+ return yield* Effect.fail(new StdError.StdError({
220
+ code: "binary_file",
221
+ message: `Cannot read binary file: ${input.path}`,
222
+ path: input.path
223
+ }));
224
+ }
225
+ const content = yield* Effect.try({
226
+ try: () => new TextDecoder("utf-8", { fatal: true }).decode(bytes),
227
+ catch: () => new StdError.StdError({
228
+ code: "binary_file",
229
+ message: `File is not valid UTF-8: ${input.path}`,
230
+ path: input.path
231
+ })
232
+ });
233
+ const targets = [];
234
+ if (input.oldString !== undefined) {
235
+ const located = Match.locate(content, input.oldString);
236
+ if (located.length === 0)
237
+ return yield* Effect.fail(miss(input.path, content, input.oldString, "oldString"));
238
+ if (located.length > 1 && input.replaceAll !== true) {
239
+ const at = located.map((span) => span.startLine).join(", ");
240
+ return yield* Effect.fail(invalid(input.path, `oldString occurs ${located.length} times in ${input.path}, on lines ${at}; add surrounding context to pick one, anchor by startLine/endLine, or set replaceAll`));
241
+ }
242
+ targets.push(...(input.replaceAll === true ? located : [located[0]]));
243
+ }
244
+ else {
245
+ const span = lineSpan(input.path, content, input.startLine, input.endLine);
246
+ if (span instanceof StdError.StdError)
247
+ return yield* Effect.fail(span);
248
+ if (input.expect !== undefined && content.slice(span.start, span.end) !== input.expect) {
249
+ return yield* Effect.fail(new StdError.StdError({
250
+ code: "no_match",
251
+ message: `Lines ${input.startLine}-${input.endLine} of ${input.path} do not hold expect. They hold this, raw:\n${content.slice(span.start, span.end)}\n\nRe-read the file: it moved under the line numbers you anchored on.`,
252
+ path: input.path
253
+ }));
254
+ }
255
+ targets.push(span);
256
+ }
257
+ let replaced = "";
258
+ let cursor = 0;
259
+ for (const span of targets) {
260
+ replaced += content.slice(cursor, span.start) + input.newString;
261
+ cursor = span.end;
262
+ }
263
+ replaced += content.slice(cursor);
264
+ yield* mutation.commit([{
265
+ path: input.path,
266
+ content: new TextEncoder().encode(replaced)
267
+ }], Preserve.writeFileString(fileSystem, input.path, replaced).pipe(Effect.mapError((error) => error.reason.method === "chmod"
268
+ ? new StdError.StdError({
269
+ code: "command_failed",
270
+ message: `Could not preserve the mode of ${input.path} before replacement by chmod`,
271
+ path: input.path
272
+ })
273
+ : FsFailure.denied(input.path, () => new StdError.StdError({
274
+ code: "command_failed",
275
+ message: `Could not write ${input.path}`,
276
+ path: input.path
277
+ }))(error))));
278
+ // Synced under the file lock, so a later edit's text never reaches the
279
+ // server before this one's.
280
+ const server = yield* Diagnostics.sync(input.path, replaced);
281
+ const first = targets[0];
282
+ const applied = Match.hunk(replaced, first.start, first.start + input.newString.length);
283
+ const output = {
284
+ path: input.path,
285
+ replacements: targets.length,
286
+ startLine: applied.startLine,
287
+ endLine: applied.endLine,
288
+ hunk: applied.text
289
+ };
290
+ return { output, server };
291
+ }));
292
+ // Without a synced text the server can only describe the file as it was.
293
+ const errors = edited.server === undefined ? undefined : yield* Diagnostics.errorsOf(edited.server, input.path);
294
+ return errors === undefined ? edited.output : { ...edited.output, errors };
295
+ });
296
+ //# sourceMappingURL=Edit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Edit.js","sourceRoot":"","sources":["../../src/Edit.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Edit flow declaration and portable handler.\n *\n * Three rules, each of them paid for by a measured failure:\n *\n * 1. **Exact or loud.** The anchor matches the file's bytes or the call fails\n * with the file's actual bytes at the nearest region. No fuzzy apply reports\n * success (sympy-15380 corrupted a file that way), and no failure returns a\n * bare `null` (sphinx-7590 abandoned a correct edit twice against one).\n * 2. **Anchors by reference.** A prior `grep` or `read` already located the\n * region; `startLine`/`endLine` re-use that hit instead of retyping the text,\n * and `expect` turns the retyped copy into a checked assertion rather than a\n * search key.\n * 3. **The hunk comes back.** The result carries the applied region as raw text\n * with its line range, so a mis-indented edit costs one glance instead of an\n * investigation (sphinx-7233 lost its verdict to a hunk nobody could see).\n * With a `LanguageServer` bound, the file's errors after the edit come back\n * too.\n *\n * @since 1.0.0\n */\n\nimport * as Effect from \"effect/Effect\"\nimport * as FileSystem from \"effect/FileSystem\"\nimport * as Schema from \"effect/Schema\"\nimport { capability, envelope } from \"./internal/Declaration.ts\"\nimport * as Diagnostics from \"./internal/Diagnostics.ts\"\nimport * as FileMutation from \"./internal/FileMutation.ts\"\nimport * as FsFailure from \"./internal/FsFailure.ts\"\nimport * as Match from \"./internal/Match.ts\"\nimport * as Preserve from \"./internal/Preserve.ts\"\nimport { sourceLines } from \"./internal/Text.ts\"\nimport * as StdError from \"./StdError.ts\"\n\n/**\n * Registry name for the edit flow.\n *\n * @category identifiers\n * @since 1.0.0\n */\nexport const name = \"edit\"\n\n/**\n * Model-facing description of the edit flow.\n *\n * @category descriptions\n * @since 1.0.0\n */\nexport const description =\n \"Edit a file by exact text (oldString, unique unless replaceAll) or by an earlier hit's line range (startLine/endLine, optional expect). A miss returns the file's real text; a hit returns the hunk.\"\n\n/**\n * Input schema for the edit flow.\n *\n * @category schemas\n * @since 1.0.0\n */\nexport const Input = Schema.Struct({\n path: Schema.String.annotate({ description: \"Path of the file to edit\" }),\n oldString: Schema.optional(Schema.String).annotate({\n description: \"Exact text to replace, byte for byte, including surrounding context\"\n }),\n startLine: Schema.optional(Schema.Int.check(Schema.isGreaterThanOrEqualTo(1))).annotate({\n description: \"First 1-based line to replace, from a prior read or grep hit; pair with endLine\"\n }),\n endLine: Schema.optional(Schema.Int.check(Schema.isGreaterThanOrEqualTo(1))).annotate({\n description: \"Last 1-based line to replace, inclusive\"\n }),\n expect: Schema.optional(Schema.String).annotate({\n description: \"What those lines currently hold; the edit fails loudly if they hold anything else\"\n }),\n newString: Schema.String.annotate({ description: \"Replacement text\" }),\n replaceAll: Schema.optional(Schema.Boolean).annotate({ description: \"Replace every occurrence instead of one\" })\n})\n\n/**\n * Decoded input accepted by the `edit` flow.\n *\n * @category models\n * @since 1.0.0\n */\nexport type Input = typeof Input.Type\n\n/**\n * Output schema for the edit flow.\n *\n * @category schemas\n * @since 1.0.0\n */\nexport const Output = Schema.Struct({\n path: Schema.String.annotate({ description: \"Path that was edited\" }),\n replacements: Schema.Number.annotate({ description: \"Number of occurrences replaced\" }),\n startLine: Schema.Number.annotate({ description: \"First 1-based line of the returned hunk\" }),\n endLine: Schema.Number.annotate({ description: \"Last 1-based line of the returned hunk\" }),\n hunk: Schema.String.annotate({\n description: \"The edited region as it now stands, raw and with its exact indentation, plus two lines of context\"\n }),\n errors: Schema.optional(Schema.Array(Diagnostics.Problem)).annotate({\n description: \"Errors the language server reports in the file after the edit; absent when no server answered\"\n })\n})\n\n/**\n * Decoded output returned by the `edit` flow.\n *\n * @category models\n * @since 1.0.0\n */\nexport type Output = typeof Output.Type\n\n/**\n * Static conservative effect envelope for the edit flow.\n *\n * @category effects\n * @since 1.0.0\n */\nexport const effects = envelope({ tier: \"compensable\", mode: \"hermetic\", reads: [\"/**\"], writes: [\"/**\"] })\n\n/**\n * Narrows the edit effect envelope to one input path.\n *\n * @category effects\n * @since 1.0.0\n */\nexport const effectsFor = (input: typeof Input.Type) =>\n envelope({ tier: \"compensable\", mode: \"hermetic\", reads: [input.path], writes: [input.path] })\n\n/**\n * Capabilities required by the edit flow.\n *\n * @category capabilities\n * @since 1.0.0\n */\nexport const capabilities = [capability(\"fs:read\", \"/**\"), capability(\"fs:write\", \"/**\")]\n\n/**\n * Declaration-only edit flow.\n *\n * @category flows\n * @since 1.0.0\n */\nexport const flow = { name, description, input: Input, output: Output, capabilities, effects } as const\n\n/**\n * What a call to this flow does, for a reader of a run.\n *\n * Display metadata only. `@smthrs/registry` `Descriptor.FlowActivity` is the\n * governing vocabulary and `StandardFlows` binds this value onto the flow's\n * descriptor, where the binding site checks it. `declarationDigest` excludes\n * it, so declaring it cannot invalidate a call identity or a cached prompt.\n *\n * @category presentation\n * @since 1.0.0-rc.0\n */\nexport const activity = \"writes\" as const\n\n/**\n * How one recorded call to this flow reads: the verb for each settlement, the\n * input field that is its subject, and the measured output fields a one-line\n * summary may count.\n *\n * Display metadata only, governed by `@smthrs/registry`\n * `Descriptor.CallPresentation` and checked where `StandardFlows` binds it.\n *\n * @category presentation\n * @since 1.0.0-rc.0\n */\nexport const presentation = {\n verb: { pending: \"editing\", success: \"edited\", failure: \"failed to edit\" },\n subject: \"path\",\n result: \"edit\"\n} as const\n\nconst invalid = (path: string, message: string): StdError.StdError =>\n new StdError.StdError({ code: \"invalid_input\", message, path })\n\n/** The failure text for an anchor that is not in the file, with the file's own bytes. */\nconst miss = (path: string, content: string, needle: string, subject: string): StdError.StdError => {\n const region = Match.nearest(content, needle)\n return new StdError.StdError({\n code: \"no_match\",\n message: region === undefined\n ? `${subject} does not occur in ${path}, and no line of it occurs there either — this is the wrong file, or the region is not what you remember. Read it and anchor on what it actually holds.`\n : `${subject} does not occur in ${path}. Lines ${region.startLine}-${region.endLine} actually hold this, raw:\\n${region.text}\\n\\nCopy the lines you meant from that text, or anchor by startLine/endLine instead.`,\n path\n })\n}\n\n/** The byte span of an inclusive 1-based line range, or the failure explaining why not. */\nconst lineSpan = (\n path: string,\n content: string,\n startLine: number,\n endLine: number\n): { readonly start: number; readonly end: number } | StdError.StdError => {\n const lines = sourceLines(content)\n if (endLine < startLine) return invalid(path, `endLine ${endLine} is before startLine ${startLine}`)\n if (startLine > lines.length) {\n return new StdError.StdError({\n code: \"offset_out_of_range\",\n message: `${path} has ${lines.length} lines, so line ${startLine} is outside it`,\n path\n })\n }\n if (endLine > lines.length) {\n return new StdError.StdError({\n code: \"offset_out_of_range\",\n message: `Requested endLine ${endLine}, but ${path} has ${lines.length} lines`,\n path\n })\n }\n const last = endLine\n let start = 0\n for (let index = 0; index < startLine - 1; index++) start += lines[index]!.length + 1\n let end = start\n for (let index = startLine - 1; index < last; index++) end += lines[index]!.length + (index === last - 1 ? 0 : 1)\n return { start, end }\n}\n\n/**\n * Applies one exact-anchored edit through the permission-aware kernel filesystem.\n *\n * Every refusal names what the file actually holds. A non-unique match is a\n * refusal rather than a silent first-match edit, and it reports the lines every\n * occurrence sits on so the caller can widen the anchor without re-reading.\n *\n * @category handlers\n * @since 1.0.0\n */\nexport const run = Effect.fn(\"Edit.run\")(function*(\n input: typeof Input.Type\n): Effect.fn.Return<typeof Output.Type, StdError.StdError, FileSystem.FileSystem> {\n const fileSystem = yield* FileSystem.FileSystem\n const byLines = input.startLine !== undefined || input.endLine !== undefined\n if (input.oldString !== undefined && byLines) {\n return yield* Effect.fail(\n invalid(input.path, \"Anchor by oldString or by startLine/endLine, not by both\")\n )\n }\n if (input.oldString === undefined && !byLines) {\n return yield* Effect.fail(\n invalid(input.path, \"Give either oldString or a startLine/endLine range; use the write flow to create a file\")\n )\n }\n if (byLines && (input.startLine === undefined || input.endLine === undefined)) {\n return yield* Effect.fail(invalid(input.path, \"A line anchor needs both startLine and endLine\"))\n }\n if (input.oldString === \"\") {\n return yield* Effect.fail(\n invalid(input.path, \"oldString must not be empty; use the write flow to create a file\")\n )\n }\n if (input.oldString !== undefined && input.expect !== undefined) {\n return yield* Effect.fail(invalid(input.path, \"expect cannot be used with oldString\"))\n }\n if (byLines && input.replaceAll !== undefined) {\n return yield* Effect.fail(invalid(input.path, \"replaceAll cannot be used with startLine/endLine\"))\n }\n const edited = yield* Effect.scoped(Effect.gen(function*() {\n const mutation = yield* FileMutation.acquire(fileSystem, [input.path])\n const bytes = yield* mutation.read(\n input.path,\n fileSystem.readFile(input.path).pipe(\n Effect.mapError(FsFailure.reading(input.path, `File not found: ${input.path}`))\n )\n )\n if (bytes.includes(0)) {\n return yield* Effect.fail(\n new StdError.StdError({\n code: \"binary_file\",\n message: `Cannot read binary file: ${input.path}`,\n path: input.path\n })\n )\n }\n const content = yield* Effect.try({\n try: () => new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes),\n catch: () =>\n new StdError.StdError({\n code: \"binary_file\",\n message: `File is not valid UTF-8: ${input.path}`,\n path: input.path\n })\n })\n\n const targets: Array<{ readonly start: number; readonly end: number }> = []\n if (input.oldString !== undefined) {\n const located = Match.locate(content, input.oldString)\n if (located.length === 0) return yield* Effect.fail(miss(input.path, content, input.oldString, \"oldString\"))\n if (located.length > 1 && input.replaceAll !== true) {\n const at = located.map((span) => span.startLine).join(\", \")\n return yield* Effect.fail(\n invalid(\n input.path,\n `oldString occurs ${located.length} times in ${input.path}, on lines ${at}; add surrounding context to pick one, anchor by startLine/endLine, or set replaceAll`\n )\n )\n }\n targets.push(...(input.replaceAll === true ? located : [located[0]!]))\n } else {\n const span = lineSpan(input.path, content, input.startLine!, input.endLine!)\n if (span instanceof StdError.StdError) return yield* Effect.fail(span)\n if (input.expect !== undefined && content.slice(span.start, span.end) !== input.expect) {\n return yield* Effect.fail(\n new StdError.StdError({\n code: \"no_match\",\n message:\n `Lines ${input.startLine}-${input.endLine} of ${input.path} do not hold expect. They hold this, raw:\\n${\n content.slice(span.start, span.end)\n }\\n\\nRe-read the file: it moved under the line numbers you anchored on.`,\n path: input.path\n })\n )\n }\n targets.push(span)\n }\n\n let replaced = \"\"\n let cursor = 0\n for (const span of targets) {\n replaced += content.slice(cursor, span.start) + input.newString\n cursor = span.end\n }\n replaced += content.slice(cursor)\n yield* mutation.commit(\n [{\n path: input.path,\n content: new TextEncoder().encode(replaced)\n }],\n Preserve.writeFileString(fileSystem, input.path, replaced).pipe(\n Effect.mapError((error) =>\n error.reason.method === \"chmod\"\n ? new StdError.StdError({\n code: \"command_failed\",\n message: `Could not preserve the mode of ${input.path} before replacement by chmod`,\n path: input.path\n })\n : FsFailure.denied(input.path, () =>\n new StdError.StdError({\n code: \"command_failed\",\n message: `Could not write ${input.path}`,\n path: input.path\n }))(\n error\n )\n )\n )\n )\n // Synced under the file lock, so a later edit's text never reaches the\n // server before this one's.\n const server = yield* Diagnostics.sync(input.path, replaced)\n const first = targets[0]!\n const applied = Match.hunk(replaced, first.start, first.start + input.newString.length)\n const output: typeof Output.Type = {\n path: input.path,\n replacements: targets.length,\n startLine: applied.startLine,\n endLine: applied.endLine,\n hunk: applied.text\n }\n return { output, server }\n }))\n // Without a synced text the server can only describe the file as it was.\n const errors = edited.server === undefined ? undefined : yield* Diagnostics.errorsOf(edited.server, input.path)\n return errors === undefined ? edited.output : { ...edited.output, errors }\n})\n"]}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * The Exa provider for the `websearch` flow.
3
+ *
4
+ * {@link layer} binds `WebSearch.WebSearch` to the Exa search API. It reads the
5
+ * API key from a named credential on every search, calls Exa through the
6
+ * permission-checked `HttpClient`, and maps each hit onto `WebSearch.Result`.
7
+ *
8
+ * @since 1.0.0
9
+ */
10
+ import * as Credential from "@smthrs/control/Credential";
11
+ import * as HttpClient from "@smthrs/kernel/HttpClient";
12
+ import { Layer } from "effect";
13
+ import * as WebSearch from "./WebSearch.ts";
14
+ /**
15
+ * Provides {@link WebSearch.WebSearch} backed by the Exa API, reading its
16
+ * key from the named credential.
17
+ *
18
+ * @category layers
19
+ * @since 1.0.0
20
+ */
21
+ export declare const layer: (credentialId: string) => Layer.Layer<WebSearch.WebSearch, never, Credential.Credential | HttpClient.HttpClient>;
22
+ //# sourceMappingURL=ExaWebSearch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExaWebSearch.d.ts","sourceRoot":"","sources":["../../src/ExaWebSearch.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,UAAU,MAAM,4BAA4B,CAAA;AACxD,OAAO,KAAK,UAAU,MAAM,2BAA2B,CAAA;AACvD,OAAO,EAAiB,KAAK,EAAoB,MAAM,QAAQ,CAAA;AAI/D,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAsB3C;;;;;;GAMG;AACH,eAAO,MAAM,KAAK,GAChB,cAAc,MAAM,KACnB,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,EAAE,UAAU,CAAC,UAAU,GAAG,UAAU,CAAC,UAAU,CAiGrF,CAAA"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * The Exa provider for the `websearch` flow.
3
+ *
4
+ * {@link layer} binds `WebSearch.WebSearch` to the Exa search API. It reads the
5
+ * API key from a named credential on every search, calls Exa through the
6
+ * permission-checked `HttpClient`, and maps each hit onto `WebSearch.Result`.
7
+ *
8
+ * @since 1.0.0
9
+ */
10
+ import * as Credential from "@smthrs/control/Credential";
11
+ import * as HttpClient from "@smthrs/kernel/HttpClient";
12
+ import { Clock, Effect, Layer, Redacted, Schema } from "effect";
13
+ import * as HttpClientRequest from "effect/unstable/http/HttpClientRequest";
14
+ import { header, readBounded } from "./internal/Http.js";
15
+ import * as StdError from "./StdError.js";
16
+ import * as WebSearch from "./WebSearch.js";
17
+ const maxResults = 20;
18
+ const requestTimeoutMs = 30_000;
19
+ const ExaResult = Schema.Struct({
20
+ title: Schema.optional(Schema.String),
21
+ url: Schema.String,
22
+ text: Schema.optional(Schema.String),
23
+ publishedDate: Schema.optional(Schema.String)
24
+ });
25
+ const ExaResponse = Schema.Struct({
26
+ results: Schema.Array(ExaResult)
27
+ });
28
+ const freshnessDays = {
29
+ day: 1,
30
+ week: 7,
31
+ month: 31,
32
+ year: 365
33
+ };
34
+ const failure = (code, message) => new StdError.StdError({ code, message });
35
+ /**
36
+ * Provides {@link WebSearch.WebSearch} backed by the Exa API, reading its
37
+ * key from the named credential.
38
+ *
39
+ * @category layers
40
+ * @since 1.0.0
41
+ */
42
+ export const layer = (credentialId) => Layer.effect(WebSearch.WebSearch, Effect.gen(function* () {
43
+ const credentials = yield* Credential.Credential;
44
+ const http = yield* HttpClient.HttpClient;
45
+ return WebSearch.make({
46
+ search: (input) => Effect.gen(function* () {
47
+ const reference = yield* credentials.get(credentialId).pipe(Effect.mapError(() => new StdError.StdError({
48
+ code: "provider_unavailable",
49
+ message: "Configured Exa credential is unavailable"
50
+ })));
51
+ const secret = yield* credentials.resolve(reference).pipe(Effect.mapError(() => new StdError.StdError({
52
+ code: "provider_unavailable",
53
+ message: "Configured Exa credential cannot be resolved"
54
+ })));
55
+ const now = yield* Clock.currentTimeMillis;
56
+ const request = HttpClientRequest.setHeaders(HttpClientRequest.bodyJsonUnsafe(HttpClientRequest.post("https://api.exa.ai/search"), {
57
+ query: input.query,
58
+ numResults: Math.min(input.numResults ?? 8, maxResults),
59
+ ...(input.freshness === undefined
60
+ ? {}
61
+ : { startPublishedDate: new Date(now - freshnessDays[input.freshness] * 86_400_000).toISOString() })
62
+ }), { "authorization": `Bearer ${Redacted.value(secret)}`, "content-type": "application/json" });
63
+ const response = yield* http.execute(request).pipe(Effect.timeout(requestTimeoutMs), Effect.mapError((error) => error._tag === "TimeoutError"
64
+ ? failure("timeout", "Exa search request timed out")
65
+ : failure("request_failed", "Exa search request failed")));
66
+ const retryAfter = header(response.headers, "retry-after");
67
+ // Successful responses may carry pacing advice too; status decides refusal.
68
+ const refused = response.status < 200 || response.status >= 300;
69
+ if (response.status === 429 || (refused && retryAfter !== undefined)) {
70
+ const delay = retryAfter === undefined
71
+ ? NaN
72
+ : /^\d+$/.test(retryAfter.trim())
73
+ ? Number(retryAfter)
74
+ : Math.max(0, Math.ceil((Date.parse(retryAfter) - (yield* Clock.currentTimeMillis)) / 1_000));
75
+ return yield* Effect.fail(failure("rate_limited", Number.isFinite(delay)
76
+ ? `Exa search was throttled; retry after ${delay} seconds`
77
+ : "Exa search was throttled"));
78
+ }
79
+ if (response.status === 401 || response.status === 403) {
80
+ return yield* Effect.fail(failure("provider_unavailable", "Exa search authentication was rejected"));
81
+ }
82
+ if (response.status >= 500) {
83
+ return yield* Effect.fail(failure("provider_unavailable", `Exa search returned ${response.status}`));
84
+ }
85
+ if (response.status < 200 || response.status >= 300) {
86
+ return yield* Effect.fail(failure("request_failed", `Exa search returned ${response.status}`));
87
+ }
88
+ // Bound the body before decoding: an endpoint must not choose how
89
+ // much of it the host buffers.
90
+ const bytes = yield* readBounded(response.stream, "https://api.exa.ai/search").pipe(Effect.timeout(requestTimeoutMs), Effect.mapError((error) => error._tag === "TimeoutError"
91
+ ? failure("timeout", "Exa search response timed out")
92
+ : error instanceof StdError.StdError && error.code === "response_too_large"
93
+ ? failure("response_too_large", "Exa search response exceeds the 5 MiB limit")
94
+ : failure("request_failed", "Exa search response was invalid")));
95
+ const body = yield* Schema.decodeUnknownEffect(Schema.fromJsonString(ExaResponse))(new TextDecoder().decode(bytes)).pipe(Effect.mapError(() => new StdError.StdError({ code: "request_failed", message: "Exa search response was invalid" })));
96
+ return {
97
+ results: body.results.slice(0, Math.min(input.numResults ?? 8, maxResults)).map((result) => ({
98
+ title: result.title ?? result.url,
99
+ url: result.url,
100
+ snippet: (result.text ?? "").slice(0, 2_000),
101
+ ...(result.publishedDate === undefined ? {} : { publishedAt: result.publishedDate })
102
+ }))
103
+ };
104
+ })
105
+ });
106
+ }));
107
+ //# sourceMappingURL=ExaWebSearch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExaWebSearch.js","sourceRoot":"","sources":["../../src/ExaWebSearch.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The Exa provider for the `websearch` flow.\n *\n * {@link layer} binds `WebSearch.WebSearch` to the Exa search API. It reads the\n * API key from a named credential on every search, calls Exa through the\n * permission-checked `HttpClient`, and maps each hit onto `WebSearch.Result`.\n *\n * @since 1.0.0\n */\n\nimport * as Credential from \"@smthrs/control/Credential\"\nimport * as HttpClient from \"@smthrs/kernel/HttpClient\"\nimport { Clock, Effect, Layer, Redacted, Schema } from \"effect\"\nimport * as HttpClientRequest from \"effect/unstable/http/HttpClientRequest\"\nimport { header, readBounded } from \"./internal/Http.ts\"\nimport * as StdError from \"./StdError.ts\"\nimport * as WebSearch from \"./WebSearch.ts\"\n\nconst maxResults = 20\nconst requestTimeoutMs = 30_000\nconst ExaResult = Schema.Struct({\n title: Schema.optional(Schema.String),\n url: Schema.String,\n text: Schema.optional(Schema.String),\n publishedDate: Schema.optional(Schema.String)\n})\nconst ExaResponse = Schema.Struct({\n results: Schema.Array(ExaResult)\n})\nconst freshnessDays = {\n day: 1,\n week: 7,\n month: 31,\n year: 365\n} as const\n\nconst failure = (code: StdError.Code, message: string): StdError.StdError => new StdError.StdError({ code, message })\n\n/**\n * Provides {@link WebSearch.WebSearch} backed by the Exa API, reading its\n * key from the named credential.\n *\n * @category layers\n * @since 1.0.0\n */\nexport const layer = (\n credentialId: string\n): Layer.Layer<WebSearch.WebSearch, never, Credential.Credential | HttpClient.HttpClient> =>\n Layer.effect(\n WebSearch.WebSearch,\n Effect.gen(function*() {\n const credentials = yield* Credential.Credential\n const http = yield* HttpClient.HttpClient\n return WebSearch.make({\n search: (input): Effect.Effect<typeof WebSearch.Output.Type, StdError.StdError> =>\n Effect.gen(function*() {\n const reference = yield* credentials.get(credentialId).pipe(Effect.mapError(() =>\n new StdError.StdError({\n code: \"provider_unavailable\",\n message: \"Configured Exa credential is unavailable\"\n })\n ))\n const secret = yield* credentials.resolve(reference).pipe(Effect.mapError(() =>\n new StdError.StdError({\n code: \"provider_unavailable\",\n message: \"Configured Exa credential cannot be resolved\"\n })\n ))\n const now = yield* Clock.currentTimeMillis\n const request = HttpClientRequest.setHeaders(\n HttpClientRequest.bodyJsonUnsafe(HttpClientRequest.post(\"https://api.exa.ai/search\"), {\n query: input.query,\n numResults: Math.min(input.numResults ?? 8, maxResults),\n ...(input.freshness === undefined\n ? {}\n : { startPublishedDate: new Date(now - freshnessDays[input.freshness] * 86_400_000).toISOString() })\n }),\n { \"authorization\": `Bearer ${Redacted.value(secret)}`, \"content-type\": \"application/json\" }\n )\n const response = yield* http.execute(request).pipe(\n Effect.timeout(requestTimeoutMs),\n Effect.mapError((error) =>\n error._tag === \"TimeoutError\"\n ? failure(\"timeout\", \"Exa search request timed out\")\n : failure(\"request_failed\", \"Exa search request failed\")\n )\n )\n const retryAfter = header(response.headers, \"retry-after\")\n // Successful responses may carry pacing advice too; status decides refusal.\n const refused = response.status < 200 || response.status >= 300\n if (response.status === 429 || (refused && retryAfter !== undefined)) {\n const delay = retryAfter === undefined\n ? NaN\n : /^\\d+$/.test(retryAfter.trim())\n ? Number(retryAfter)\n : Math.max(0, Math.ceil((Date.parse(retryAfter) - (yield* Clock.currentTimeMillis)) / 1_000))\n return yield* Effect.fail(\n failure(\n \"rate_limited\",\n Number.isFinite(delay)\n ? `Exa search was throttled; retry after ${delay} seconds`\n : \"Exa search was throttled\"\n )\n )\n }\n if (response.status === 401 || response.status === 403) {\n return yield* Effect.fail(failure(\"provider_unavailable\", \"Exa search authentication was rejected\"))\n }\n if (response.status >= 500) {\n return yield* Effect.fail(failure(\"provider_unavailable\", `Exa search returned ${response.status}`))\n }\n if (response.status < 200 || response.status >= 300) {\n return yield* Effect.fail(failure(\"request_failed\", `Exa search returned ${response.status}`))\n }\n // Bound the body before decoding: an endpoint must not choose how\n // much of it the host buffers.\n const bytes = yield* readBounded(response.stream, \"https://api.exa.ai/search\").pipe(\n Effect.timeout(requestTimeoutMs),\n Effect.mapError((error) =>\n error._tag === \"TimeoutError\"\n ? failure(\"timeout\", \"Exa search response timed out\")\n : error instanceof StdError.StdError && error.code === \"response_too_large\"\n ? failure(\"response_too_large\", \"Exa search response exceeds the 5 MiB limit\")\n : failure(\"request_failed\", \"Exa search response was invalid\")\n )\n )\n const body = yield* Schema.decodeUnknownEffect(Schema.fromJsonString(ExaResponse))(\n new TextDecoder().decode(bytes)\n ).pipe(\n Effect.mapError(() =>\n new StdError.StdError({ code: \"request_failed\", message: \"Exa search response was invalid\" })\n )\n )\n return {\n results: body.results.slice(0, Math.min(input.numResults ?? 8, maxResults)).map((result) => ({\n title: result.title ?? result.url,\n url: result.url,\n snippet: (result.text ?? \"\").slice(0, 2_000),\n ...(result.publishedDate === undefined ? {} : { publishedAt: result.publishedDate })\n }))\n }\n })\n })\n })\n )\n"]}