ashlr-plugin 1.36.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.
Files changed (499) hide show
  1. package/.agents/plugins/marketplace.json +20 -0
  2. package/.claude-plugin/marketplace.json +39 -0
  3. package/.claude-plugin/plugin.json +36 -0
  4. package/.codex/agents/README.md +9 -0
  5. package/.codex/agents/ashlr-explorer.md +36 -0
  6. package/.codex/agents/ashlr-worker.md +38 -0
  7. package/.codex-plugin/plugin.json +45 -0
  8. package/.mcp.json +14 -0
  9. package/LICENSE +21 -0
  10. package/README.md +311 -0
  11. package/agents/ashlr-code.md +69 -0
  12. package/agents/ashlr-explore.md +44 -0
  13. package/agents/ashlr-plan.md +54 -0
  14. package/bench/fixtures/notebook-large.ipynb +660 -0
  15. package/bench/fixtures/notebook-small.ipynb +39 -0
  16. package/bench/fixtures/tasklist-closed.json +62 -0
  17. package/bench/fixtures/tasklist-large-mixed.json +27 -0
  18. package/bench/fixtures/tasklist-sprint-open.json +79 -0
  19. package/bench/fixtures/websearch-bun-runtime.json +32 -0
  20. package/bench/fixtures/websearch-react-hooks-patterns.json +32 -0
  21. package/bench/fixtures/websearch-typescript-generics.json +38 -0
  22. package/bench/refs/node-sdk/.refrev +1 -0
  23. package/bench/refs/node-sdk/README.md +17 -0
  24. package/bench/refs/node-sdk/src/agent/agent.ts +163 -0
  25. package/bench/refs/node-sdk/src/agent/create-agent-ui-stream.ts +83 -0
  26. package/bench/refs/node-sdk/src/agent/tool-loop-agent.ts +238 -0
  27. package/bench/refs/node-sdk/src/embed/embed-many.ts +409 -0
  28. package/bench/refs/node-sdk/src/embed/embed-result.ts +50 -0
  29. package/bench/refs/node-sdk/src/embed/embed.ts +257 -0
  30. package/bench/refs/node-sdk/src/error/invalid-argument-error.ts +34 -0
  31. package/bench/refs/node-sdk/src/error/invalid-tool-input-error.ts +33 -0
  32. package/bench/refs/node-sdk/src/error/no-object-generated-error.ts +70 -0
  33. package/bench/refs/node-sdk/src/generate-image/generate-image-result.ts +42 -0
  34. package/bench/refs/node-sdk/src/generate-image/generate-image.ts +362 -0
  35. package/bench/refs/node-sdk/src/generate-object/generate-object-result.ts +67 -0
  36. package/bench/refs/node-sdk/src/generate-object/generate-object.ts +501 -0
  37. package/bench/refs/node-sdk/src/generate-object/inject-json-instruction.ts +30 -0
  38. package/bench/refs/node-sdk/src/generate-object/output-strategy.ts +415 -0
  39. package/bench/refs/node-sdk/src/generate-object/repair-text.ts +12 -0
  40. package/bench/refs/node-sdk/src/generate-object/stream-object.ts +960 -0
  41. package/bench/refs/node-sdk/src/generate-speech/generate-speech.ts +191 -0
  42. package/bench/refs/node-sdk/src/generate-text/generate-text.ts +1484 -0
  43. package/bench/refs/node-sdk/src/generate-text/stream-text.ts +2708 -0
  44. package/bench/refs/node-sdk/src/generate-text/tool-call.ts +59 -0
  45. package/bench/refs/node-sdk/src/generate-text/tool-result.ts +36 -0
  46. package/bench/refs/node-sdk/src/telemetry/create-telemetry-dispatcher.ts +146 -0
  47. package/bench/refs/node-sdk/src/telemetry/telemetry-registry.ts +15 -0
  48. package/bench/refs/node-sdk/src/telemetry/telemetry.ts +223 -0
  49. package/bench/refs/node-sdk/src/util/async-iterable-stream.ts +94 -0
  50. package/bench/refs/node-sdk/src/util/consume-stream.ts +31 -0
  51. package/bench/refs/node-sdk/src/util/create-stitchable-stream.ts +112 -0
  52. package/bench/refs/node-sdk/src/util/download/download.ts +74 -0
  53. package/bench/refs/node-sdk/src/util/error-handler.ts +1 -0
  54. package/bench/refs/node-sdk/src/util/fix-json.ts +401 -0
  55. package/bench/refs/node-sdk/src/util/merge-objects.ts +79 -0
  56. package/bench/refs/python-lib/.refrev +1 -0
  57. package/bench/refs/python-lib/README.md +18 -0
  58. package/bench/refs/python-lib/pandas/core/_numba/executor.py +249 -0
  59. package/bench/refs/python-lib/pandas/core/_numba/extensions.py +586 -0
  60. package/bench/refs/python-lib/pandas/core/_numba/kernels/mean_.py +198 -0
  61. package/bench/refs/python-lib/pandas/core/_numba/kernels/min_max_.py +178 -0
  62. package/bench/refs/python-lib/pandas/core/_numba/kernels/sum_.py +255 -0
  63. package/bench/refs/python-lib/pandas/core/_numba/kernels/var_.py +251 -0
  64. package/bench/refs/python-lib/pandas/core/accessor.py +520 -0
  65. package/bench/refs/python-lib/pandas/core/api.py +138 -0
  66. package/bench/refs/python-lib/pandas/core/array_algos/masked_accumulations.py +97 -0
  67. package/bench/refs/python-lib/pandas/core/array_algos/masked_reductions.py +252 -0
  68. package/bench/refs/python-lib/pandas/core/array_algos/putmask.py +150 -0
  69. package/bench/refs/python-lib/pandas/core/array_algos/quantile.py +232 -0
  70. package/bench/refs/python-lib/pandas/core/array_algos/replace.py +159 -0
  71. package/bench/refs/python-lib/pandas/core/array_algos/take.py +609 -0
  72. package/bench/refs/python-lib/pandas/core/arraylike.py +534 -0
  73. package/bench/refs/python-lib/pandas/core/arrays/_arrow_string_mixins.py +434 -0
  74. package/bench/refs/python-lib/pandas/core/arrays/_mixins.py +630 -0
  75. package/bench/refs/python-lib/pandas/core/arrays/_ranges.py +276 -0
  76. package/bench/refs/python-lib/pandas/core/arrays/_utils.py +77 -0
  77. package/bench/refs/python-lib/pandas/core/arrays/arrow/accessors.py +521 -0
  78. package/bench/refs/python-lib/pandas/core/arrays/arrow/extension_types.py +174 -0
  79. package/bench/refs/python-lib/pandas/core/arrays/boolean.py +454 -0
  80. package/bench/refs/python-lib/pandas/core/arrays/floating.py +192 -0
  81. package/bench/refs/python-lib/pandas/core/arrays/integer.py +296 -0
  82. package/bench/refs/python-lib/pandas/core/arrays/masked.py +2140 -0
  83. package/bench/refs/python-lib/pandas/core/arrays/numeric.py +305 -0
  84. package/bench/refs/python-lib/pandas/core/arrays/numpy_.py +701 -0
  85. package/bench/refs/python-lib/pandas/core/arrays/period.py +1586 -0
  86. package/bench/refs/python-lib/pandas/core/arrays/sparse/accessor.py +505 -0
  87. package/bench/refs/python-lib/pandas/core/arrays/sparse/scipy_sparse.py +208 -0
  88. package/bench/refs/rust-project/.refrev +1 -0
  89. package/bench/refs/rust-project/README.md +17 -0
  90. package/bench/refs/rust-project/tokio/src/doc/os.rs +68 -0
  91. package/bench/refs/rust-project/tokio/src/fs/dir_builder.rs +129 -0
  92. package/bench/refs/rust-project/tokio/src/fs/file.rs +1113 -0
  93. package/bench/refs/rust-project/tokio/src/fs/mocks.rs +176 -0
  94. package/bench/refs/rust-project/tokio/src/fs/mod.rs +324 -0
  95. package/bench/refs/rust-project/tokio/src/fs/open_options.rs +856 -0
  96. package/bench/refs/rust-project/tokio/src/fs/read.rs +80 -0
  97. package/bench/refs/rust-project/tokio/src/fs/read_dir.rs +357 -0
  98. package/bench/refs/rust-project/tokio/src/fs/write.rs +99 -0
  99. package/bench/refs/rust-project/tokio/src/future/maybe_done.rs +123 -0
  100. package/bench/refs/rust-project/tokio/src/future/try_join.rs +82 -0
  101. package/bench/refs/rust-project/tokio/src/io/async_buf_read.rs +117 -0
  102. package/bench/refs/rust-project/tokio/src/io/async_read.rs +133 -0
  103. package/bench/refs/rust-project/tokio/src/io/async_seek.rs +96 -0
  104. package/bench/refs/rust-project/tokio/src/io/async_write.rs +402 -0
  105. package/bench/refs/rust-project/tokio/src/io/blocking.rs +339 -0
  106. package/bench/refs/rust-project/tokio/src/io/interest.rs +345 -0
  107. package/bench/refs/rust-project/tokio/src/io/join.rs +130 -0
  108. package/bench/refs/rust-project/tokio/src/io/mod.rs +308 -0
  109. package/bench/refs/rust-project/tokio/src/io/poll_evented.rs +319 -0
  110. package/bench/refs/rust-project/tokio/src/io/read_buf.rs +344 -0
  111. package/bench/refs/rust-project/tokio/src/io/ready.rs +322 -0
  112. package/bench/refs/rust-project/tokio/src/io/split.rs +166 -0
  113. package/bench/refs/rust-project/tokio/src/io/stderr.rs +148 -0
  114. package/bench/refs/rust-project/tokio/src/io/stdin.rs +98 -0
  115. package/bench/refs/rust-project/tokio/src/io/stdio_common.rs +222 -0
  116. package/bench/refs/rust-project/tokio/src/io/stdout.rs +197 -0
  117. package/bench/refs/rust-project/tokio/src/io/util/buf_reader.rs +311 -0
  118. package/bench/refs/rust-project/tokio/src/io/util/buf_stream.rs +207 -0
  119. package/bench/refs/rust-project/tokio/src/io/util/buf_writer.rs +310 -0
  120. package/bench/refs/rust-project/tokio/src/io/util/chain.rs +144 -0
  121. package/commands/_spawn-patterns.json +32 -0
  122. package/commands/ashlr-allow.md +21 -0
  123. package/commands/ashlr-benchmark.md +53 -0
  124. package/commands/ashlr-brief.md +97 -0
  125. package/commands/ashlr-budget.md +76 -0
  126. package/commands/ashlr-compact.md +54 -0
  127. package/commands/ashlr-dashboard.md +37 -0
  128. package/commands/ashlr-doctor.md +56 -0
  129. package/commands/ashlr-eco-mode.md +92 -0
  130. package/commands/ashlr-genome-init.md +24 -0
  131. package/commands/ashlr-genome-keygen.md +36 -0
  132. package/commands/ashlr-genome-loop.md +118 -0
  133. package/commands/ashlr-genome-push.md +36 -0
  134. package/commands/ashlr-genome-rewrap.md +48 -0
  135. package/commands/ashlr-genome-team-init.md +67 -0
  136. package/commands/ashlr-handoff.md +23 -0
  137. package/commands/ashlr-help.md +86 -0
  138. package/commands/ashlr-hook-timings.md +30 -0
  139. package/commands/ashlr-leaderboard.md +50 -0
  140. package/commands/ashlr-ollama-setup.md +39 -0
  141. package/commands/ashlr-orchestrate-status.md +72 -0
  142. package/commands/ashlr-orchestrate.md +83 -0
  143. package/commands/ashlr-parallelize.md +63 -0
  144. package/commands/ashlr-report-crash.md +33 -0
  145. package/commands/ashlr-resume.md +72 -0
  146. package/commands/ashlr-savings.md +24 -0
  147. package/commands/ashlr-settings.md +50 -0
  148. package/commands/ashlr-spawn.md +61 -0
  149. package/commands/ashlr-start.md +60 -0
  150. package/commands/ashlr-status.md +64 -0
  151. package/commands/ashlr-team-invite.md +47 -0
  152. package/commands/ashlr-tier.md +122 -0
  153. package/commands/ashlr-tour.md +60 -0
  154. package/commands/ashlr-update.md +155 -0
  155. package/commands/ashlr-upgrade.md +96 -0
  156. package/commands/goal.md +58 -0
  157. package/commands/loop.md +40 -0
  158. package/docs/CNAME +1 -0
  159. package/docs/PRO_TIER.md +104 -0
  160. package/docs/README.md +21 -0
  161. package/docs/architecture.md +415 -0
  162. package/docs/ashlr-pipe.md +161 -0
  163. package/docs/assets/logo.svg +19 -0
  164. package/docs/assets/og.png +0 -0
  165. package/docs/assets/og.svg +41 -0
  166. package/docs/benchmarks-v2.json +355 -0
  167. package/docs/benchmarks.json +102 -0
  168. package/docs/benchmarks.md +211 -0
  169. package/docs/billing.md +185 -0
  170. package/docs/cloud-genome.md +155 -0
  171. package/docs/competitive-wozcode.md +92 -0
  172. package/docs/deploy.md +325 -0
  173. package/docs/email-templates.md +113 -0
  174. package/docs/embed-tuning.md +103 -0
  175. package/docs/genome.md +120 -0
  176. package/docs/github-oauth-onboarding.md +127 -0
  177. package/docs/hero-video-script.md +129 -0
  178. package/docs/index.html +2262 -0
  179. package/docs/install-prompt.md +78 -0
  180. package/docs/install-windows.md +132 -0
  181. package/docs/install.ps1 +171 -0
  182. package/docs/install.sh +146 -0
  183. package/docs/launch/README.md +114 -0
  184. package/docs/launch/hn.md +49 -0
  185. package/docs/launch/reddit.md +45 -0
  186. package/docs/launch/x.md +65 -0
  187. package/docs/launch-post.md +112 -0
  188. package/docs/legal.md +78 -0
  189. package/docs/llm-providers.md +99 -0
  190. package/docs/multi-host-mcp.md +217 -0
  191. package/docs/multi-turn-architecture.md +108 -0
  192. package/docs/operations/deployment.md +108 -0
  193. package/docs/operations/error-monitoring.md +70 -0
  194. package/docs/operations/weekly-digest.md +70 -0
  195. package/docs/operations.md +494 -0
  196. package/docs/platform-support.md +133 -0
  197. package/docs/policy-packs.md +188 -0
  198. package/docs/press-kit/fact-sheet.md +78 -0
  199. package/docs/press-kit/founder-bio.md +3 -0
  200. package/docs/press-kit/logo.svg +33 -0
  201. package/docs/press-kit/screenshots.md +146 -0
  202. package/docs/pricing.md +251 -0
  203. package/docs/pro-backend-architecture.md +523 -0
  204. package/docs/producthunt.md +52 -0
  205. package/docs/router-migration.md +110 -0
  206. package/docs/session-log-schema.md +68 -0
  207. package/docs/social.md +95 -0
  208. package/docs/team-genome.md +528 -0
  209. package/docs/telemetry.md +194 -0
  210. package/docs/test-isolation.md +100 -0
  211. package/docs/upgrade.md +159 -0
  212. package/hooks/_hook-errors.ts +87 -0
  213. package/hooks/_hook-perf-emit.ts +113 -0
  214. package/hooks/_hook-timing-ledger.ts +1133 -0
  215. package/hooks/_nudge-throttle.ts +127 -0
  216. package/hooks/_recent-blocks.ts +127 -0
  217. package/hooks/audit-upload.ts +86 -0
  218. package/hooks/codex-hooks.json +171 -0
  219. package/hooks/commit-attribution.ts +179 -0
  220. package/hooks/edit-batching-nudge.ts +154 -0
  221. package/hooks/genome-scribe-hook.ts +219 -0
  222. package/hooks/hooks.json +294 -0
  223. package/hooks/orient-nudge-hook.ts +242 -0
  224. package/hooks/policy-enforce.ts +214 -0
  225. package/hooks/post-tool-use-embedding.ts +93 -0
  226. package/hooks/post-tool-use-genome.sh +37 -0
  227. package/hooks/post-tool-use-genome.ts +69 -0
  228. package/hooks/posttooluse-correlate.ts +122 -0
  229. package/hooks/posttooluse-dedupe-output.ts +241 -0
  230. package/hooks/posttooluse-genome-refresh.ts +223 -0
  231. package/hooks/posttooluse-native-nudge.ts +205 -0
  232. package/hooks/posttooluse-stale-result.ts +277 -0
  233. package/hooks/pretooluse-bash.ts +63 -0
  234. package/hooks/pretooluse-budget-guard.ts +318 -0
  235. package/hooks/pretooluse-common.ts +985 -0
  236. package/hooks/pretooluse-eco-router.ts +196 -0
  237. package/hooks/pretooluse-edit.sh +93 -0
  238. package/hooks/pretooluse-edit.ts +197 -0
  239. package/hooks/pretooluse-glob.ts +70 -0
  240. package/hooks/pretooluse-grep.sh +85 -0
  241. package/hooks/pretooluse-grep.ts +96 -0
  242. package/hooks/pretooluse-notebookedit.ts +121 -0
  243. package/hooks/pretooluse-read.sh +118 -0
  244. package/hooks/pretooluse-read.ts +118 -0
  245. package/hooks/pretooluse-task.ts +130 -0
  246. package/hooks/pretooluse-webfetch.ts +66 -0
  247. package/hooks/pretooluse-websearch.ts +85 -0
  248. package/hooks/pretooluse-write.ts +128 -0
  249. package/hooks/pulse-emit.ts +197 -0
  250. package/hooks/session-end-consolidate.sh +35 -0
  251. package/hooks/session-end-consolidate.ts +188 -0
  252. package/hooks/session-end-stats-gc.ts +80 -0
  253. package/hooks/session-log-append.sh +94 -0
  254. package/hooks/session-log-append.ts +116 -0
  255. package/hooks/session-start.ts +993 -0
  256. package/hooks/sessionend-hook-health-nudge.ts +451 -0
  257. package/hooks/sessionend-savings-nudge.ts +318 -0
  258. package/hooks/sessionend-status-line-nudge.ts +296 -0
  259. package/hooks/sessionstart-brief.ts +140 -0
  260. package/hooks/sessionstart-cost-refactor.ts +95 -0
  261. package/hooks/sessionstart-efficient.ts +110 -0
  262. package/hooks/sessionstart-genome-author.ts +93 -0
  263. package/hooks/sessionstart-lean-tools.ts +98 -0
  264. package/hooks/sessionstart-search.ts +97 -0
  265. package/hooks/stop-accounting.ts +152 -0
  266. package/hooks/subagent-stop-rollup.ts +162 -0
  267. package/hooks/userpromptsubmit-brief-trigger.ts +156 -0
  268. package/package.json +56 -0
  269. package/ports/README.md +108 -0
  270. package/ports/cursor/mcp.json +11 -0
  271. package/ports/goose/recipe.yaml +26 -0
  272. package/scripts/ashlr-mcp.ts +40 -0
  273. package/scripts/auto-update.ts +177 -0
  274. package/scripts/baseline-scan.ts +831 -0
  275. package/scripts/bench-orchestrate.ts +377 -0
  276. package/scripts/benchmark-refs.ts +292 -0
  277. package/scripts/bootstrap.mjs +100 -0
  278. package/scripts/brief-eval.ts +234 -0
  279. package/scripts/bump-version.ts +82 -0
  280. package/scripts/bun-resolve.d.mts +11 -0
  281. package/scripts/bun-resolve.mjs +59 -0
  282. package/scripts/calibrate-grep.ts +467 -0
  283. package/scripts/capture-grep-workload.ts +260 -0
  284. package/scripts/check-tier.ts +61 -0
  285. package/scripts/check-version-sync.ts +97 -0
  286. package/scripts/cli-orchestrate-status.ts +386 -0
  287. package/scripts/cli-orchestrate.ts +303 -0
  288. package/scripts/cli.ts +478 -0
  289. package/scripts/cloud-smoke-test.ts +313 -0
  290. package/scripts/coach-report.ts +373 -0
  291. package/scripts/context-db-migrate.ts +137 -0
  292. package/scripts/context-status.ts +43 -0
  293. package/scripts/demo-run.ts +255 -0
  294. package/scripts/deploy-smoke.sh +140 -0
  295. package/scripts/doctor.ts +992 -0
  296. package/scripts/embed-file-worker.ts +104 -0
  297. package/scripts/embed-tune.ts +308 -0
  298. package/scripts/errors-report.ts +428 -0
  299. package/scripts/find-test-leak.ts +69 -0
  300. package/scripts/generate-badge.ts +357 -0
  301. package/scripts/genome-auto-consolidate.ts +533 -0
  302. package/scripts/genome-auto-propose.ts +578 -0
  303. package/scripts/genome-cloud-pull.ts +363 -0
  304. package/scripts/genome-cloud-push.ts +382 -0
  305. package/scripts/genome-cloud-sync.ts +587 -0
  306. package/scripts/genome-commit-watcher.ts +295 -0
  307. package/scripts/genome-init.ts +986 -0
  308. package/scripts/genome-key.ts +233 -0
  309. package/scripts/genome-keygen.ts +168 -0
  310. package/scripts/genome-link.ts +59 -0
  311. package/scripts/genome-refresh-worker.ts +364 -0
  312. package/scripts/genome-rewrap.ts +90 -0
  313. package/scripts/genome-synthesizer.ts +679 -0
  314. package/scripts/genome-team-init.ts +312 -0
  315. package/scripts/handoff-pack.ts +438 -0
  316. package/scripts/hook-bootstrap.mjs +75 -0
  317. package/scripts/hook-timing-reader.ts +371 -0
  318. package/scripts/hook-timings-report.ts +554 -0
  319. package/scripts/install-genome-hooks.ts +196 -0
  320. package/scripts/install-onnx-model.ts +154 -0
  321. package/scripts/install-permissions.ts +276 -0
  322. package/scripts/install-status-line.ts +150 -0
  323. package/scripts/mcp-entrypoint.sh +78 -0
  324. package/scripts/mcp-entrypoint.ts +130 -0
  325. package/scripts/mdx-angle-bracket-lint.ts +152 -0
  326. package/scripts/measure-cold-start.ts +126 -0
  327. package/scripts/migrate-stats-to-sqlite.ts +86 -0
  328. package/scripts/ollama-setup.ts +498 -0
  329. package/scripts/onboarding-wizard.ts +1691 -0
  330. package/scripts/orchestrate-emit-telemetry.ts +177 -0
  331. package/scripts/orchestrate-expand.ts +517 -0
  332. package/scripts/orchestrate-run.ts +744 -0
  333. package/scripts/print-legend.ts +50 -0
  334. package/scripts/product-metadata.ts +38 -0
  335. package/scripts/prune-old-memories.ts +208 -0
  336. package/scripts/publish.sh +88 -0
  337. package/scripts/read-calibration.ts +122 -0
  338. package/scripts/report-crash.ts +226 -0
  339. package/scripts/run-benchmark.ts +750 -0
  340. package/scripts/run-root-tests.ts +28 -0
  341. package/scripts/savings-dashboard.ts +1258 -0
  342. package/scripts/savings-report-extras.ts +447 -0
  343. package/scripts/savings-status-line.ts +873 -0
  344. package/scripts/session-event-emit.ts +266 -0
  345. package/scripts/session-greet.ts +686 -0
  346. package/scripts/session-log-report.ts +551 -0
  347. package/scripts/session-resume.ts +614 -0
  348. package/scripts/set-hook-mode.ts +83 -0
  349. package/scripts/smoke-cross-platform.ts +117 -0
  350. package/scripts/smoke-realtime.ts +257 -0
  351. package/scripts/smoke-tools.ts +21 -0
  352. package/scripts/stats-cloud-pull.ts +213 -0
  353. package/scripts/stats-cloud-sync.ts +261 -0
  354. package/scripts/telemetry-flush.ts +160 -0
  355. package/scripts/telemetry-status.ts +266 -0
  356. package/scripts/timing-budget.ts +35 -0
  357. package/scripts/ui-animation.ts +120 -0
  358. package/scripts/ui.ts +431 -0
  359. package/scripts/upgrade-flow.ts +775 -0
  360. package/scripts/weekly-digest.ts +394 -0
  361. package/servers/_accounting.ts +78 -0
  362. package/servers/_ask-router.ts +84 -0
  363. package/servers/_ast-chunker.ts +434 -0
  364. package/servers/_ast-helpers.ts +183 -0
  365. package/servers/_ast-languages.ts +153 -0
  366. package/servers/_ast-refactor/_shared.ts +221 -0
  367. package/servers/_ast-refactor/cross-file-rename.ts +560 -0
  368. package/servers/_ast-refactor/extract-function.ts +357 -0
  369. package/servers/_ast-refactor/file-local-rename.ts +172 -0
  370. package/servers/_ast-refactor.ts +41 -0
  371. package/servers/_ast-skeleton.ts +107 -0
  372. package/servers/_bash-summarizers-registry.ts +1096 -0
  373. package/servers/_crash-dump.ts +210 -0
  374. package/servers/_cwd-clamp.ts +342 -0
  375. package/servers/_edit-log.ts +28 -0
  376. package/servers/_edit-match.ts +236 -0
  377. package/servers/_edit-validate.ts +196 -0
  378. package/servers/_embed-calibration.ts +123 -0
  379. package/servers/_embedding-cache.ts +401 -0
  380. package/servers/_embedding-model.ts +329 -0
  381. package/servers/_events.ts +113 -0
  382. package/servers/_genome-cache.ts +154 -0
  383. package/servers/_genome-commits.ts +172 -0
  384. package/servers/_genome-crypto-v2.ts +242 -0
  385. package/servers/_genome-crypto.ts +259 -0
  386. package/servers/_genome-discoveries.ts +140 -0
  387. package/servers/_genome-embed-populator.ts +216 -0
  388. package/servers/_genome-freshness.ts +134 -0
  389. package/servers/_genome-issues.ts +171 -0
  390. package/servers/_genome-live.ts +263 -0
  391. package/servers/_genome-prs.ts +188 -0
  392. package/servers/_genome-search.ts +479 -0
  393. package/servers/_genome-sync.ts +297 -0
  394. package/servers/_history-tracker.ts +279 -0
  395. package/servers/_http-helpers.ts +151 -0
  396. package/servers/_identity-hash.ts +151 -0
  397. package/servers/_llm-providers/anthropic.ts +132 -0
  398. package/servers/_llm-providers/cloud.ts +195 -0
  399. package/servers/_llm-providers/index.ts +350 -0
  400. package/servers/_llm-providers/local.ts +127 -0
  401. package/servers/_llm-providers/onnx.ts +393 -0
  402. package/servers/_llm-providers/types.ts +27 -0
  403. package/servers/_manifest-v2.ts +447 -0
  404. package/servers/_mcp-host.ts +93 -0
  405. package/servers/_nudge-events.ts +451 -0
  406. package/servers/_orchestrate-executor.ts +316 -0
  407. package/servers/_prefetch.ts +435 -0
  408. package/servers/_pricing.ts +256 -0
  409. package/servers/_pro.ts +381 -0
  410. package/servers/_read-cache.ts +44 -0
  411. package/servers/_router-handlers.ts +46 -0
  412. package/servers/_router.ts +55 -0
  413. package/servers/_run-with-timeout.ts +173 -0
  414. package/servers/_savings-render.ts +214 -0
  415. package/servers/_stats-sqlite.ts +640 -0
  416. package/servers/_stats.ts +1183 -0
  417. package/servers/_status-line-cells.ts +469 -0
  418. package/servers/_streaks.ts +162 -0
  419. package/servers/_summarize.ts +208 -0
  420. package/servers/_task-graph-render.ts +217 -0
  421. package/servers/_task-graph.ts +545 -0
  422. package/servers/_telemetry.ts +719 -0
  423. package/servers/_test-parsers.ts +530 -0
  424. package/servers/_test-watch.ts +626 -0
  425. package/servers/_text-helpers.ts +37 -0
  426. package/servers/_token-measure.ts +160 -0
  427. package/servers/_tool-base.ts +248 -0
  428. package/servers/_weekly-digest.ts +391 -0
  429. package/servers/ask-server-handlers.ts +49 -0
  430. package/servers/ask-server.ts +174 -0
  431. package/servers/bash-server-handlers.ts +138 -0
  432. package/servers/bash-server.ts +1136 -0
  433. package/servers/bench.ts +186 -0
  434. package/servers/diff-semantic-server-handlers.ts +39 -0
  435. package/servers/diff-semantic-server.ts +566 -0
  436. package/servers/diff-server-handlers.ts +317 -0
  437. package/servers/diff-server.ts +20 -0
  438. package/servers/edit-server-handlers.ts +31 -0
  439. package/servers/edit-server.ts +209 -0
  440. package/servers/edit-structural-server-handlers.ts +322 -0
  441. package/servers/efficiency-server-handlers.ts +161 -0
  442. package/servers/efficiency-server.ts +1135 -0
  443. package/servers/flush-server-handlers.ts +21 -0
  444. package/servers/flush-server.ts +19 -0
  445. package/servers/genome-server-handlers.ts +118 -0
  446. package/servers/genome-server.ts +397 -0
  447. package/servers/github-server-handlers.ts +187 -0
  448. package/servers/github-server.ts +856 -0
  449. package/servers/glob-server-handlers.ts +233 -0
  450. package/servers/glob-server.ts +20 -0
  451. package/servers/grep-server-handlers.ts +61 -0
  452. package/servers/grep-server.ts +564 -0
  453. package/servers/http-server-handlers.ts +36 -0
  454. package/servers/http-server.ts +149 -0
  455. package/servers/logs-server-handlers.ts +42 -0
  456. package/servers/logs-server.ts +359 -0
  457. package/servers/ls-server-handlers.ts +166 -0
  458. package/servers/ls-server.ts +20 -0
  459. package/servers/multi-edit-server-handlers.ts +51 -0
  460. package/servers/multi-edit-server.ts +422 -0
  461. package/servers/notebook-edit-server-handlers.ts +34 -0
  462. package/servers/notebook-edit-server.ts +181 -0
  463. package/servers/orient-server-handlers.ts +52 -0
  464. package/servers/orient-server.ts +436 -0
  465. package/servers/pipe-server-handlers.ts +68 -0
  466. package/servers/pipe-server.ts +300 -0
  467. package/servers/read-server-handlers.ts +42 -0
  468. package/servers/read-server.ts +206 -0
  469. package/servers/rename-file-server-handlers.ts +67 -0
  470. package/servers/rename-file-server.ts +699 -0
  471. package/servers/savings-server-handlers.ts +27 -0
  472. package/servers/savings-server.ts +54 -0
  473. package/servers/search-replace-regex-server-handlers.ts +96 -0
  474. package/servers/search-replace-regex-server.ts +751 -0
  475. package/servers/sql-server-handlers.ts +58 -0
  476. package/servers/sql-server.ts +505 -0
  477. package/servers/task-server-handlers.ts +358 -0
  478. package/servers/task-server.ts +24 -0
  479. package/servers/test-server-handlers.ts +351 -0
  480. package/servers/test-server.ts +20 -0
  481. package/servers/tree-server-handlers.ts +503 -0
  482. package/servers/tree-server.ts +20 -0
  483. package/servers/webfetch-server-handlers.ts +166 -0
  484. package/servers/webfetch-server.ts +20 -0
  485. package/servers/websearch-server-handlers.ts +215 -0
  486. package/servers/websearch-server.ts +19 -0
  487. package/servers/write-server-handlers.ts +27 -0
  488. package/servers/write-server.ts +97 -0
  489. package/skills/ashlr-brief/SKILL.md +80 -0
  490. package/skills/ashlr-codex-doctor/SKILL.md +21 -0
  491. package/skills/ashlr-codex-efficient-tools/SKILL.md +17 -0
  492. package/skills/ashlr-codex-genome-refresh/SKILL.md +20 -0
  493. package/skills/ashlr-codex-parallel-explore/SKILL.md +20 -0
  494. package/skills/ashlr-codex-savings/SKILL.md +17 -0
  495. package/skills/ashlr-cost-refactor/SKILL.md +50 -0
  496. package/skills/ashlr-efficient/SKILL.md +64 -0
  497. package/skills/ashlr-genome-author/SKILL.md +43 -0
  498. package/skills/ashlr-lean-tools/SKILL.md +43 -0
  499. package/skills/ashlr-search/SKILL.md +46 -0
@@ -0,0 +1,82 @@
1
+ use crate::future::maybe_done::{maybe_done, MaybeDone};
2
+
3
+ use pin_project_lite::pin_project;
4
+ use std::future::Future;
5
+ use std::pin::Pin;
6
+ use std::task::{Context, Poll};
7
+
8
+ pub(crate) fn try_join3<T1, F1, T2, F2, T3, F3, E>(
9
+ future1: F1,
10
+ future2: F2,
11
+ future3: F3,
12
+ ) -> TryJoin3<F1, F2, F3>
13
+ where
14
+ F1: Future<Output = Result<T1, E>>,
15
+ F2: Future<Output = Result<T2, E>>,
16
+ F3: Future<Output = Result<T3, E>>,
17
+ {
18
+ TryJoin3 {
19
+ future1: maybe_done(future1),
20
+ future2: maybe_done(future2),
21
+ future3: maybe_done(future3),
22
+ }
23
+ }
24
+
25
+ pin_project! {
26
+ pub(crate) struct TryJoin3<F1, F2, F3>
27
+ where
28
+ F1: Future,
29
+ F2: Future,
30
+ F3: Future,
31
+ {
32
+ #[pin]
33
+ future1: MaybeDone<F1>,
34
+ #[pin]
35
+ future2: MaybeDone<F2>,
36
+ #[pin]
37
+ future3: MaybeDone<F3>,
38
+ }
39
+ }
40
+
41
+ impl<T1, F1, T2, F2, T3, F3, E> Future for TryJoin3<F1, F2, F3>
42
+ where
43
+ F1: Future<Output = Result<T1, E>>,
44
+ F2: Future<Output = Result<T2, E>>,
45
+ F3: Future<Output = Result<T3, E>>,
46
+ {
47
+ type Output = Result<(T1, T2, T3), E>;
48
+
49
+ fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
50
+ let mut all_done = true;
51
+
52
+ let mut me = self.project();
53
+
54
+ if me.future1.as_mut().poll(cx).is_pending() {
55
+ all_done = false;
56
+ } else if me.future1.as_mut().output_mut().unwrap().is_err() {
57
+ return Poll::Ready(Err(me.future1.take_output().unwrap().err().unwrap()));
58
+ }
59
+
60
+ if me.future2.as_mut().poll(cx).is_pending() {
61
+ all_done = false;
62
+ } else if me.future2.as_mut().output_mut().unwrap().is_err() {
63
+ return Poll::Ready(Err(me.future2.take_output().unwrap().err().unwrap()));
64
+ }
65
+
66
+ if me.future3.as_mut().poll(cx).is_pending() {
67
+ all_done = false;
68
+ } else if me.future3.as_mut().output_mut().unwrap().is_err() {
69
+ return Poll::Ready(Err(me.future3.take_output().unwrap().err().unwrap()));
70
+ }
71
+
72
+ if all_done {
73
+ Poll::Ready(Ok((
74
+ me.future1.take_output().unwrap().ok().unwrap(),
75
+ me.future2.take_output().unwrap().ok().unwrap(),
76
+ me.future3.take_output().unwrap().ok().unwrap(),
77
+ )))
78
+ } else {
79
+ Poll::Pending
80
+ }
81
+ }
82
+ }
@@ -0,0 +1,117 @@
1
+ use crate::io::AsyncRead;
2
+
3
+ use std::io;
4
+ use std::ops::DerefMut;
5
+ use std::pin::Pin;
6
+ use std::task::{Context, Poll};
7
+
8
+ /// Reads bytes asynchronously.
9
+ ///
10
+ /// This trait is analogous to [`std::io::BufRead`], but integrates with
11
+ /// the asynchronous task system. In particular, the [`poll_fill_buf`] method,
12
+ /// unlike [`BufRead::fill_buf`], will automatically queue the current task for wakeup
13
+ /// and return if data is not yet available, rather than blocking the calling
14
+ /// thread.
15
+ ///
16
+ /// Utilities for working with `AsyncBufRead` values are provided by
17
+ /// [`AsyncBufReadExt`].
18
+ ///
19
+ /// [`std::io::BufRead`]: std::io::BufRead
20
+ /// [`poll_fill_buf`]: AsyncBufRead::poll_fill_buf
21
+ /// [`BufRead::fill_buf`]: std::io::BufRead::fill_buf
22
+ /// [`AsyncBufReadExt`]: crate::io::AsyncBufReadExt
23
+ pub trait AsyncBufRead: AsyncRead {
24
+ /// Attempts to return the contents of the internal buffer, filling it with more data
25
+ /// from the inner reader if it is empty.
26
+ ///
27
+ /// On success, returns `Poll::Ready(Ok(buf))`.
28
+ ///
29
+ /// If no data is available for reading, the method returns
30
+ /// `Poll::Pending` and arranges for the current task (via
31
+ /// `cx.waker().wake_by_ref()`) to receive a notification when the object becomes
32
+ /// readable or is closed.
33
+ ///
34
+ /// This function is a lower-level call. It needs to be paired with the
35
+ /// [`consume`] method to function properly. When calling this
36
+ /// method, none of the contents will be "read" in the sense that later
37
+ /// calling [`poll_read`] may return the same contents. As such, [`consume`] must
38
+ /// be called with the number of bytes that are consumed from this buffer to
39
+ /// ensure that the bytes are never returned twice.
40
+ ///
41
+ /// An empty buffer returned indicates that the stream has reached EOF.
42
+ ///
43
+ /// [`poll_read`]: AsyncRead::poll_read
44
+ /// [`consume`]: AsyncBufRead::consume
45
+ fn poll_fill_buf(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<&[u8]>>;
46
+
47
+ /// Tells this buffer that `amt` bytes have been consumed from the buffer,
48
+ /// so they should no longer be returned in calls to [`poll_read`].
49
+ ///
50
+ /// This function is a lower-level call. It needs to be paired with the
51
+ /// [`poll_fill_buf`] method to function properly. This function does
52
+ /// not perform any I/O, it simply informs this object that some amount of
53
+ /// its buffer, returned from [`poll_fill_buf`], has been consumed and should
54
+ /// no longer be returned. As such, this function may do odd things if
55
+ /// [`poll_fill_buf`] isn't called before calling it.
56
+ ///
57
+ /// The `amt` must be `<=` the number of bytes in the buffer returned by
58
+ /// [`poll_fill_buf`].
59
+ ///
60
+ /// [`poll_read`]: AsyncRead::poll_read
61
+ /// [`poll_fill_buf`]: AsyncBufRead::poll_fill_buf
62
+ fn consume(self: Pin<&mut Self>, amt: usize);
63
+ }
64
+
65
+ macro_rules! deref_async_buf_read {
66
+ () => {
67
+ fn poll_fill_buf(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<&[u8]>> {
68
+ Pin::new(&mut **self.get_mut()).poll_fill_buf(cx)
69
+ }
70
+
71
+ fn consume(mut self: Pin<&mut Self>, amt: usize) {
72
+ Pin::new(&mut **self).consume(amt)
73
+ }
74
+ };
75
+ }
76
+
77
+ impl<T: ?Sized + AsyncBufRead + Unpin> AsyncBufRead for Box<T> {
78
+ deref_async_buf_read!();
79
+ }
80
+
81
+ impl<T: ?Sized + AsyncBufRead + Unpin> AsyncBufRead for &mut T {
82
+ deref_async_buf_read!();
83
+ }
84
+
85
+ impl<P> AsyncBufRead for Pin<P>
86
+ where
87
+ P: DerefMut,
88
+ P::Target: AsyncBufRead,
89
+ {
90
+ fn poll_fill_buf(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<&[u8]>> {
91
+ crate::util::pin_as_deref_mut(self).poll_fill_buf(cx)
92
+ }
93
+
94
+ fn consume(self: Pin<&mut Self>, amt: usize) {
95
+ crate::util::pin_as_deref_mut(self).consume(amt);
96
+ }
97
+ }
98
+
99
+ impl AsyncBufRead for &[u8] {
100
+ fn poll_fill_buf(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<io::Result<&[u8]>> {
101
+ Poll::Ready(Ok(*self))
102
+ }
103
+
104
+ fn consume(mut self: Pin<&mut Self>, amt: usize) {
105
+ *self = &self[amt..];
106
+ }
107
+ }
108
+
109
+ impl<T: AsRef<[u8]> + Unpin> AsyncBufRead for io::Cursor<T> {
110
+ fn poll_fill_buf(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<io::Result<&[u8]>> {
111
+ Poll::Ready(io::BufRead::fill_buf(self.get_mut()))
112
+ }
113
+
114
+ fn consume(self: Pin<&mut Self>, amt: usize) {
115
+ io::BufRead::consume(self.get_mut(), amt);
116
+ }
117
+ }
@@ -0,0 +1,133 @@
1
+ use super::ReadBuf;
2
+ use std::io;
3
+ use std::ops::DerefMut;
4
+ use std::pin::Pin;
5
+ use std::task::{Context, Poll};
6
+
7
+ /// Reads bytes from a source.
8
+ ///
9
+ /// This trait is analogous to the [`std::io::Read`] trait, but integrates with
10
+ /// the asynchronous task system. In particular, the [`poll_read`] method,
11
+ /// unlike [`Read::read`], will automatically queue the current task for wakeup
12
+ /// and return if data is not yet available, rather than blocking the calling
13
+ /// thread.
14
+ ///
15
+ /// Specifically, this means that the `poll_read` function will return one of
16
+ /// the following:
17
+ ///
18
+ /// * `Poll::Ready(Ok(()))` means that data was immediately read and placed into
19
+ /// the output buffer. The amount of data read can be determined by the
20
+ /// increase in the length of the slice returned by `ReadBuf::filled`. If the
21
+ /// difference is 0, either EOF has been reached, or the output buffer had zero
22
+ /// capacity (i.e. `buf.remaining()` == 0).
23
+ ///
24
+ /// * `Poll::Pending` means that no data was read into the buffer
25
+ /// provided. The I/O object is not currently readable but may become readable
26
+ /// in the future. Most importantly, **the current future's task is scheduled
27
+ /// to get unparked when the object is readable**. This means that like
28
+ /// `Future::poll` you'll receive a notification when the I/O object is
29
+ /// readable again.
30
+ ///
31
+ /// * `Poll::Ready(Err(e))` for other errors are standard I/O errors coming from the
32
+ /// underlying object.
33
+ ///
34
+ /// This trait importantly means that the `read` method only works in the
35
+ /// context of a future's task. The object may panic if used outside of a task.
36
+ ///
37
+ /// Utilities for working with `AsyncRead` values are provided by
38
+ /// [`AsyncReadExt`].
39
+ ///
40
+ /// [`poll_read`]: AsyncRead::poll_read
41
+ /// [`std::io::Read`]: std::io::Read
42
+ /// [`Read::read`]: std::io::Read::read
43
+ /// [`AsyncReadExt`]: crate::io::AsyncReadExt
44
+ pub trait AsyncRead {
45
+ /// Attempts to read from the `AsyncRead` into `buf`.
46
+ ///
47
+ /// On success, returns `Poll::Ready(Ok(()))` and places data in the
48
+ /// unfilled portion of `buf`. If no data was read (`buf.filled().len()` is
49
+ /// unchanged), it implies that EOF has been reached, or the output buffer
50
+ /// had zero capacity (i.e. `buf.remaining()` == 0).
51
+ ///
52
+ /// If no data is available for reading, the method returns `Poll::Pending`
53
+ /// and arranges for the current task (via `cx.waker()`) to receive a
54
+ /// notification when the object becomes readable or is closed.
55
+ fn poll_read(
56
+ self: Pin<&mut Self>,
57
+ cx: &mut Context<'_>,
58
+ buf: &mut ReadBuf<'_>,
59
+ ) -> Poll<io::Result<()>>;
60
+ }
61
+
62
+ macro_rules! deref_async_read {
63
+ () => {
64
+ fn poll_read(
65
+ mut self: Pin<&mut Self>,
66
+ cx: &mut Context<'_>,
67
+ buf: &mut ReadBuf<'_>,
68
+ ) -> Poll<io::Result<()>> {
69
+ Pin::new(&mut **self).poll_read(cx, buf)
70
+ }
71
+ };
72
+ }
73
+
74
+ impl<T: ?Sized + AsyncRead + Unpin> AsyncRead for Box<T> {
75
+ deref_async_read!();
76
+ }
77
+
78
+ impl<T: ?Sized + AsyncRead + Unpin> AsyncRead for &mut T {
79
+ deref_async_read!();
80
+ }
81
+
82
+ impl<P> AsyncRead for Pin<P>
83
+ where
84
+ P: DerefMut,
85
+ P::Target: AsyncRead,
86
+ {
87
+ fn poll_read(
88
+ self: Pin<&mut Self>,
89
+ cx: &mut Context<'_>,
90
+ buf: &mut ReadBuf<'_>,
91
+ ) -> Poll<io::Result<()>> {
92
+ crate::util::pin_as_deref_mut(self).poll_read(cx, buf)
93
+ }
94
+ }
95
+
96
+ impl AsyncRead for &[u8] {
97
+ fn poll_read(
98
+ mut self: Pin<&mut Self>,
99
+ _cx: &mut Context<'_>,
100
+ buf: &mut ReadBuf<'_>,
101
+ ) -> Poll<io::Result<()>> {
102
+ let amt = std::cmp::min(self.len(), buf.remaining());
103
+ let (a, b) = self.split_at(amt);
104
+ buf.put_slice(a);
105
+ *self = b;
106
+ Poll::Ready(Ok(()))
107
+ }
108
+ }
109
+
110
+ impl<T: AsRef<[u8]> + Unpin> AsyncRead for io::Cursor<T> {
111
+ fn poll_read(
112
+ mut self: Pin<&mut Self>,
113
+ _cx: &mut Context<'_>,
114
+ buf: &mut ReadBuf<'_>,
115
+ ) -> Poll<io::Result<()>> {
116
+ let pos = self.position();
117
+ let slice: &[u8] = (*self).get_ref().as_ref();
118
+
119
+ // The position could technically be out of bounds, so don't panic...
120
+ if pos > slice.len() as u64 {
121
+ return Poll::Ready(Ok(()));
122
+ }
123
+
124
+ let start = pos as usize;
125
+ let amt = std::cmp::min(slice.len() - start, buf.remaining());
126
+ // Add won't overflow because of pos check above.
127
+ let end = start + amt;
128
+ buf.put_slice(&slice[start..end]);
129
+ self.set_position(end as u64);
130
+
131
+ Poll::Ready(Ok(()))
132
+ }
133
+ }
@@ -0,0 +1,96 @@
1
+ use std::io::{self, SeekFrom};
2
+ use std::ops::DerefMut;
3
+ use std::pin::Pin;
4
+ use std::task::{Context, Poll};
5
+
6
+ /// Seek bytes asynchronously.
7
+ ///
8
+ /// This trait is analogous to the [`std::io::Seek`] trait, but integrates
9
+ /// with the asynchronous task system. In particular, the `start_seek`
10
+ /// method, unlike [`Seek::seek`], will not block the calling thread.
11
+ ///
12
+ /// Utilities for working with `AsyncSeek` values are provided by
13
+ /// [`AsyncSeekExt`].
14
+ ///
15
+ /// [`std::io::Seek`]: std::io::Seek
16
+ /// [`Seek::seek`]: std::io::Seek::seek()
17
+ /// [`AsyncSeekExt`]: crate::io::AsyncSeekExt
18
+ pub trait AsyncSeek {
19
+ /// Attempts to seek to an offset, in bytes, in a stream.
20
+ ///
21
+ /// A seek beyond the end of a stream is allowed, but behavior is defined
22
+ /// by the implementation.
23
+ ///
24
+ /// If this function returns successfully, then the job has been submitted.
25
+ /// To find out when it completes, call `poll_complete`.
26
+ ///
27
+ /// # Errors
28
+ ///
29
+ /// This function can return [`io::ErrorKind::Other`] in case there is
30
+ /// another seek in progress. To avoid this, it is advisable that any call
31
+ /// to `start_seek` is preceded by a call to `poll_complete` to ensure all
32
+ /// pending seeks have completed.
33
+ fn start_seek(self: Pin<&mut Self>, position: SeekFrom) -> io::Result<()>;
34
+
35
+ /// Waits for a seek operation to complete.
36
+ ///
37
+ /// If the seek operation completed successfully, this method returns the
38
+ /// new position from the start of the stream. That position can be used
39
+ /// later with [`SeekFrom::Start`].
40
+ ///
41
+ /// The position returned by calling this method can only be relied on right
42
+ /// after `start_seek`. If you have changed the position by e.g. reading or
43
+ /// writing since calling `start_seek`, then it is unspecified whether the
44
+ /// returned position takes that position change into account. Similarly, if
45
+ /// `start_seek` has never been called, then it is unspecified whether
46
+ /// `poll_complete` returns the actual position or some other placeholder
47
+ /// value (such as 0).
48
+ ///
49
+ /// # Errors
50
+ ///
51
+ /// Seeking to a negative offset is considered an error.
52
+ fn poll_complete(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<u64>>;
53
+ }
54
+
55
+ macro_rules! deref_async_seek {
56
+ () => {
57
+ fn start_seek(mut self: Pin<&mut Self>, pos: SeekFrom) -> io::Result<()> {
58
+ Pin::new(&mut **self).start_seek(pos)
59
+ }
60
+
61
+ fn poll_complete(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<u64>> {
62
+ Pin::new(&mut **self).poll_complete(cx)
63
+ }
64
+ };
65
+ }
66
+
67
+ impl<T: ?Sized + AsyncSeek + Unpin> AsyncSeek for Box<T> {
68
+ deref_async_seek!();
69
+ }
70
+
71
+ impl<T: ?Sized + AsyncSeek + Unpin> AsyncSeek for &mut T {
72
+ deref_async_seek!();
73
+ }
74
+
75
+ impl<P> AsyncSeek for Pin<P>
76
+ where
77
+ P: DerefMut,
78
+ P::Target: AsyncSeek,
79
+ {
80
+ fn start_seek(self: Pin<&mut Self>, pos: SeekFrom) -> io::Result<()> {
81
+ crate::util::pin_as_deref_mut(self).start_seek(pos)
82
+ }
83
+
84
+ fn poll_complete(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<u64>> {
85
+ crate::util::pin_as_deref_mut(self).poll_complete(cx)
86
+ }
87
+ }
88
+
89
+ impl<T: AsRef<[u8]> + Unpin> AsyncSeek for io::Cursor<T> {
90
+ fn start_seek(mut self: Pin<&mut Self>, pos: SeekFrom) -> io::Result<()> {
91
+ io::Seek::seek(&mut *self, pos).map(drop)
92
+ }
93
+ fn poll_complete(self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll<io::Result<u64>> {
94
+ Poll::Ready(Ok(self.get_mut().position()))
95
+ }
96
+ }