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,311 @@
1
+ use crate::io::util::DEFAULT_BUF_SIZE;
2
+ use crate::io::{AsyncBufRead, AsyncRead, AsyncSeek, AsyncWrite, ReadBuf};
3
+
4
+ use pin_project_lite::pin_project;
5
+ use std::io::{self, IoSlice, SeekFrom};
6
+ use std::pin::Pin;
7
+ use std::task::{ready, Context, Poll};
8
+ use std::{cmp, fmt, mem};
9
+
10
+ pin_project! {
11
+ /// The `BufReader` struct adds buffering to any reader.
12
+ ///
13
+ /// It can be excessively inefficient to work directly with a [`AsyncRead`]
14
+ /// instance. A `BufReader` performs large, infrequent reads on the underlying
15
+ /// [`AsyncRead`] and maintains an in-memory buffer of the results.
16
+ ///
17
+ /// `BufReader` can improve the speed of programs that make *small* and
18
+ /// *repeated* read calls to the same file or network socket. It does not
19
+ /// help when reading very large amounts at once, or reading just one or a few
20
+ /// times. It also provides no advantage when reading from a source that is
21
+ /// already in memory, like a `Vec<u8>`.
22
+ ///
23
+ /// When the `BufReader` is dropped, the contents of its buffer will be
24
+ /// discarded. Creating multiple instances of a `BufReader` on the same
25
+ /// stream can cause data loss.
26
+ #[cfg_attr(docsrs, doc(cfg(feature = "io-util")))]
27
+ pub struct BufReader<R> {
28
+ #[pin]
29
+ pub(super) inner: R,
30
+ pub(super) buf: Box<[u8]>,
31
+ pub(super) pos: usize,
32
+ pub(super) cap: usize,
33
+ pub(super) seek_state: SeekState,
34
+ }
35
+ }
36
+
37
+ impl<R: AsyncRead> BufReader<R> {
38
+ /// Creates a new `BufReader` with a default buffer capacity. The default is currently 8 KB,
39
+ /// but may change in the future.
40
+ pub fn new(inner: R) -> Self {
41
+ Self::with_capacity(DEFAULT_BUF_SIZE, inner)
42
+ }
43
+
44
+ /// Creates a new `BufReader` with the specified buffer capacity.
45
+ pub fn with_capacity(capacity: usize, inner: R) -> Self {
46
+ let buffer = vec![0; capacity];
47
+ Self {
48
+ inner,
49
+ buf: buffer.into_boxed_slice(),
50
+ pos: 0,
51
+ cap: 0,
52
+ seek_state: SeekState::Init,
53
+ }
54
+ }
55
+
56
+ /// Gets a reference to the underlying reader.
57
+ ///
58
+ /// It is inadvisable to directly read from the underlying reader.
59
+ pub fn get_ref(&self) -> &R {
60
+ &self.inner
61
+ }
62
+
63
+ /// Gets a mutable reference to the underlying reader.
64
+ ///
65
+ /// It is inadvisable to directly read from the underlying reader.
66
+ pub fn get_mut(&mut self) -> &mut R {
67
+ &mut self.inner
68
+ }
69
+
70
+ /// Gets a pinned mutable reference to the underlying reader.
71
+ ///
72
+ /// It is inadvisable to directly read from the underlying reader.
73
+ pub fn get_pin_mut(self: Pin<&mut Self>) -> Pin<&mut R> {
74
+ self.project().inner
75
+ }
76
+
77
+ /// Consumes this `BufReader`, returning the underlying reader.
78
+ ///
79
+ /// Note that any leftover data in the internal buffer is lost.
80
+ pub fn into_inner(self) -> R {
81
+ self.inner
82
+ }
83
+
84
+ /// Returns a reference to the internally buffered data.
85
+ ///
86
+ /// Unlike `fill_buf`, this will not attempt to fill the buffer if it is empty.
87
+ pub fn buffer(&self) -> &[u8] {
88
+ &self.buf[self.pos..self.cap]
89
+ }
90
+
91
+ /// Invalidates all data in the internal buffer.
92
+ #[inline]
93
+ fn discard_buffer(self: Pin<&mut Self>) {
94
+ let me = self.project();
95
+ *me.pos = 0;
96
+ *me.cap = 0;
97
+ }
98
+ }
99
+
100
+ impl<R: AsyncRead> AsyncRead for BufReader<R> {
101
+ fn poll_read(
102
+ mut self: Pin<&mut Self>,
103
+ cx: &mut Context<'_>,
104
+ buf: &mut ReadBuf<'_>,
105
+ ) -> Poll<io::Result<()>> {
106
+ // If we don't have any buffered data and we're doing a massive read
107
+ // (larger than our internal buffer), bypass our internal buffer
108
+ // entirely.
109
+ if self.pos == self.cap && buf.remaining() >= self.buf.len() {
110
+ let res = ready!(self.as_mut().get_pin_mut().poll_read(cx, buf));
111
+ self.discard_buffer();
112
+ return Poll::Ready(res);
113
+ }
114
+ let rem = ready!(self.as_mut().poll_fill_buf(cx))?;
115
+ let amt = std::cmp::min(rem.len(), buf.remaining());
116
+ buf.put_slice(&rem[..amt]);
117
+ self.consume(amt);
118
+ Poll::Ready(Ok(()))
119
+ }
120
+ }
121
+
122
+ impl<R: AsyncRead> AsyncBufRead for BufReader<R> {
123
+ fn poll_fill_buf(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<&[u8]>> {
124
+ let me = self.project();
125
+
126
+ // If we've reached the end of our internal buffer then we need to fetch
127
+ // some more data from the underlying reader.
128
+ // Branch using `>=` instead of the more correct `==`
129
+ // to tell the compiler that the pos..cap slice is always valid.
130
+ if *me.pos >= *me.cap {
131
+ debug_assert!(*me.pos == *me.cap);
132
+ let mut buf = ReadBuf::new(me.buf);
133
+ ready!(me.inner.poll_read(cx, &mut buf))?;
134
+ *me.cap = buf.filled().len();
135
+ *me.pos = 0;
136
+ }
137
+ Poll::Ready(Ok(&me.buf[*me.pos..*me.cap]))
138
+ }
139
+
140
+ fn consume(self: Pin<&mut Self>, amt: usize) {
141
+ let me = self.project();
142
+ *me.pos = cmp::min(*me.pos + amt, *me.cap);
143
+ }
144
+ }
145
+
146
+ #[derive(Debug, Clone, Copy)]
147
+ pub(super) enum SeekState {
148
+ /// `start_seek` has not been called.
149
+ Init,
150
+ /// `start_seek` has been called, but `poll_complete` has not yet been called.
151
+ Start(SeekFrom),
152
+ /// Waiting for completion of the first `poll_complete` in the `n.checked_sub(remainder).is_none()` branch.
153
+ PendingOverflowed(i64),
154
+ /// Waiting for completion of `poll_complete`.
155
+ Pending,
156
+ }
157
+
158
+ /// Seeks to an offset, in bytes, in the underlying reader.
159
+ ///
160
+ /// The position used for seeking with `SeekFrom::Current(_)` is the
161
+ /// position the underlying reader would be at if the `BufReader` had no
162
+ /// internal buffer.
163
+ ///
164
+ /// Seeking always discards the internal buffer, even if the seek position
165
+ /// would otherwise fall within it. This guarantees that calling
166
+ /// `.into_inner()` immediately after a seek yields the underlying reader
167
+ /// at the same position.
168
+ ///
169
+ /// See [`AsyncSeek`] for more details.
170
+ ///
171
+ /// Note: In the edge case where you're seeking with `SeekFrom::Current(n)`
172
+ /// where `n` minus the internal buffer length overflows an `i64`, two
173
+ /// seeks will be performed instead of one. If the second seek returns
174
+ /// `Err`, the underlying reader will be left at the same position it would
175
+ /// have if you called `seek` with `SeekFrom::Current(0)`.
176
+ impl<R: AsyncRead + AsyncSeek> AsyncSeek for BufReader<R> {
177
+ fn start_seek(self: Pin<&mut Self>, pos: SeekFrom) -> io::Result<()> {
178
+ // We needs to call seek operation multiple times.
179
+ // And we should always call both start_seek and poll_complete,
180
+ // as start_seek alone cannot guarantee that the operation will be completed.
181
+ // poll_complete receives a Context and returns a Poll, so it cannot be called
182
+ // inside start_seek.
183
+ *self.project().seek_state = SeekState::Start(pos);
184
+ Ok(())
185
+ }
186
+
187
+ fn poll_complete(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<u64>> {
188
+ let res = match mem::replace(self.as_mut().project().seek_state, SeekState::Init) {
189
+ SeekState::Init => {
190
+ // 1.x AsyncSeek recommends calling poll_complete before start_seek.
191
+ // We don't have to guarantee that the value returned by
192
+ // poll_complete called without start_seek is correct,
193
+ // so we'll return 0.
194
+ return Poll::Ready(Ok(0));
195
+ }
196
+ SeekState::Start(SeekFrom::Current(n)) => {
197
+ let remainder = (self.cap - self.pos) as i64;
198
+ // it should be safe to assume that remainder fits within an i64 as the alternative
199
+ // means we managed to allocate 8 exbibytes and that's absurd.
200
+ // But it's not out of the realm of possibility for some weird underlying reader to
201
+ // support seeking by i64::MIN so we need to handle underflow when subtracting
202
+ // remainder.
203
+ if let Some(offset) = n.checked_sub(remainder) {
204
+ self.as_mut()
205
+ .get_pin_mut()
206
+ .start_seek(SeekFrom::Current(offset))?;
207
+ } else {
208
+ // seek backwards by our remainder, and then by the offset
209
+ self.as_mut()
210
+ .get_pin_mut()
211
+ .start_seek(SeekFrom::Current(-remainder))?;
212
+ if self.as_mut().get_pin_mut().poll_complete(cx)?.is_pending() {
213
+ *self.as_mut().project().seek_state = SeekState::PendingOverflowed(n);
214
+ return Poll::Pending;
215
+ }
216
+
217
+ // https://github.com/rust-lang/rust/pull/61157#issuecomment-495932676
218
+ self.as_mut().discard_buffer();
219
+
220
+ self.as_mut()
221
+ .get_pin_mut()
222
+ .start_seek(SeekFrom::Current(n))?;
223
+ }
224
+ self.as_mut().get_pin_mut().poll_complete(cx)?
225
+ }
226
+ SeekState::PendingOverflowed(n) => {
227
+ if self.as_mut().get_pin_mut().poll_complete(cx)?.is_pending() {
228
+ *self.as_mut().project().seek_state = SeekState::PendingOverflowed(n);
229
+ return Poll::Pending;
230
+ }
231
+
232
+ // https://github.com/rust-lang/rust/pull/61157#issuecomment-495932676
233
+ self.as_mut().discard_buffer();
234
+
235
+ self.as_mut()
236
+ .get_pin_mut()
237
+ .start_seek(SeekFrom::Current(n))?;
238
+ self.as_mut().get_pin_mut().poll_complete(cx)?
239
+ }
240
+ SeekState::Start(pos) => {
241
+ // Seeking with Start/End doesn't care about our buffer length.
242
+ self.as_mut().get_pin_mut().start_seek(pos)?;
243
+ self.as_mut().get_pin_mut().poll_complete(cx)?
244
+ }
245
+ SeekState::Pending => self.as_mut().get_pin_mut().poll_complete(cx)?,
246
+ };
247
+
248
+ match res {
249
+ Poll::Ready(res) => {
250
+ self.discard_buffer();
251
+ Poll::Ready(Ok(res))
252
+ }
253
+ Poll::Pending => {
254
+ *self.as_mut().project().seek_state = SeekState::Pending;
255
+ Poll::Pending
256
+ }
257
+ }
258
+ }
259
+ }
260
+
261
+ impl<R: AsyncRead + AsyncWrite> AsyncWrite for BufReader<R> {
262
+ fn poll_write(
263
+ self: Pin<&mut Self>,
264
+ cx: &mut Context<'_>,
265
+ buf: &[u8],
266
+ ) -> Poll<io::Result<usize>> {
267
+ self.get_pin_mut().poll_write(cx, buf)
268
+ }
269
+
270
+ fn poll_write_vectored(
271
+ self: Pin<&mut Self>,
272
+ cx: &mut Context<'_>,
273
+ bufs: &[IoSlice<'_>],
274
+ ) -> Poll<io::Result<usize>> {
275
+ self.get_pin_mut().poll_write_vectored(cx, bufs)
276
+ }
277
+
278
+ fn is_write_vectored(&self) -> bool {
279
+ self.get_ref().is_write_vectored()
280
+ }
281
+
282
+ fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<()>> {
283
+ self.get_pin_mut().poll_flush(cx)
284
+ }
285
+
286
+ fn poll_shutdown(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<()>> {
287
+ self.get_pin_mut().poll_shutdown(cx)
288
+ }
289
+ }
290
+
291
+ impl<R: fmt::Debug> fmt::Debug for BufReader<R> {
292
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
293
+ f.debug_struct("BufReader")
294
+ .field("reader", &self.inner)
295
+ .field(
296
+ "buffer",
297
+ &format_args!("{}/{}", self.cap - self.pos, self.buf.len()),
298
+ )
299
+ .finish()
300
+ }
301
+ }
302
+
303
+ #[cfg(test)]
304
+ mod tests {
305
+ use super::*;
306
+
307
+ #[test]
308
+ fn assert_unpin() {
309
+ crate::is_unpin::<BufReader<()>>();
310
+ }
311
+ }
@@ -0,0 +1,207 @@
1
+ use crate::io::util::{BufReader, BufWriter};
2
+ use crate::io::{AsyncBufRead, AsyncRead, AsyncSeek, AsyncWrite, ReadBuf};
3
+
4
+ use pin_project_lite::pin_project;
5
+ use std::io::{self, IoSlice, SeekFrom};
6
+ use std::pin::Pin;
7
+ use std::task::{Context, Poll};
8
+
9
+ pin_project! {
10
+ /// Wraps a type that is [`AsyncWrite`] and [`AsyncRead`], and buffers its input and output.
11
+ ///
12
+ /// It can be excessively inefficient to work directly with something that implements [`AsyncWrite`]
13
+ /// and [`AsyncRead`]. For example, every `write`, however small, has to traverse the syscall
14
+ /// interface, and similarly, every read has to do the same. The [`BufWriter`] and [`BufReader`]
15
+ /// types aid with these problems respectively, but do so in only one direction. `BufStream` wraps
16
+ /// one in the other so that both directions are buffered. See their documentation for details.
17
+ #[derive(Debug)]
18
+ #[cfg_attr(docsrs, doc(cfg(feature = "io-util")))]
19
+ pub struct BufStream<RW> {
20
+ #[pin]
21
+ inner: BufReader<BufWriter<RW>>,
22
+ }
23
+ }
24
+
25
+ impl<RW: AsyncRead + AsyncWrite> BufStream<RW> {
26
+ /// Wraps a type in both [`BufWriter`] and [`BufReader`].
27
+ ///
28
+ /// See the documentation for those types and [`BufStream`] for details.
29
+ pub fn new(stream: RW) -> BufStream<RW> {
30
+ BufStream {
31
+ inner: BufReader::new(BufWriter::new(stream)),
32
+ }
33
+ }
34
+
35
+ /// Creates a `BufStream` with the specified [`BufReader`] capacity and [`BufWriter`]
36
+ /// capacity.
37
+ ///
38
+ /// See the documentation for those types and [`BufStream`] for details.
39
+ pub fn with_capacity(
40
+ reader_capacity: usize,
41
+ writer_capacity: usize,
42
+ stream: RW,
43
+ ) -> BufStream<RW> {
44
+ BufStream {
45
+ inner: BufReader::with_capacity(
46
+ reader_capacity,
47
+ BufWriter::with_capacity(writer_capacity, stream),
48
+ ),
49
+ }
50
+ }
51
+
52
+ /// Gets a reference to the underlying I/O object.
53
+ ///
54
+ /// It is inadvisable to directly read from the underlying I/O object.
55
+ pub fn get_ref(&self) -> &RW {
56
+ self.inner.get_ref().get_ref()
57
+ }
58
+
59
+ /// Gets a mutable reference to the underlying I/O object.
60
+ ///
61
+ /// It is inadvisable to directly read from the underlying I/O object.
62
+ pub fn get_mut(&mut self) -> &mut RW {
63
+ self.inner.get_mut().get_mut()
64
+ }
65
+
66
+ /// Gets a pinned mutable reference to the underlying I/O object.
67
+ ///
68
+ /// It is inadvisable to directly read from the underlying I/O object.
69
+ pub fn get_pin_mut(self: Pin<&mut Self>) -> Pin<&mut RW> {
70
+ self.project().inner.get_pin_mut().get_pin_mut()
71
+ }
72
+
73
+ /// Consumes this `BufStream`, returning the underlying I/O object.
74
+ ///
75
+ /// Note that any leftover data in the internal buffer is lost.
76
+ pub fn into_inner(self) -> RW {
77
+ self.inner.into_inner().into_inner()
78
+ }
79
+ }
80
+
81
+ impl<RW> From<BufReader<BufWriter<RW>>> for BufStream<RW> {
82
+ fn from(b: BufReader<BufWriter<RW>>) -> Self {
83
+ BufStream { inner: b }
84
+ }
85
+ }
86
+
87
+ impl<RW> From<BufWriter<BufReader<RW>>> for BufStream<RW> {
88
+ fn from(b: BufWriter<BufReader<RW>>) -> Self {
89
+ // we need to "invert" the reader and writer
90
+ let BufWriter {
91
+ inner:
92
+ BufReader {
93
+ inner,
94
+ buf: rbuf,
95
+ pos,
96
+ cap,
97
+ seek_state: rseek_state,
98
+ },
99
+ buf: wbuf,
100
+ written,
101
+ seek_state: wseek_state,
102
+ } = b;
103
+
104
+ BufStream {
105
+ inner: BufReader {
106
+ inner: BufWriter {
107
+ inner,
108
+ buf: wbuf,
109
+ written,
110
+ seek_state: wseek_state,
111
+ },
112
+ buf: rbuf,
113
+ pos,
114
+ cap,
115
+ seek_state: rseek_state,
116
+ },
117
+ }
118
+ }
119
+ }
120
+
121
+ impl<RW: AsyncRead + AsyncWrite> AsyncWrite for BufStream<RW> {
122
+ fn poll_write(
123
+ self: Pin<&mut Self>,
124
+ cx: &mut Context<'_>,
125
+ buf: &[u8],
126
+ ) -> Poll<io::Result<usize>> {
127
+ self.project().inner.poll_write(cx, buf)
128
+ }
129
+
130
+ fn poll_write_vectored(
131
+ self: Pin<&mut Self>,
132
+ cx: &mut Context<'_>,
133
+ bufs: &[IoSlice<'_>],
134
+ ) -> Poll<io::Result<usize>> {
135
+ self.project().inner.poll_write_vectored(cx, bufs)
136
+ }
137
+
138
+ fn is_write_vectored(&self) -> bool {
139
+ self.inner.is_write_vectored()
140
+ }
141
+
142
+ fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<()>> {
143
+ self.project().inner.poll_flush(cx)
144
+ }
145
+
146
+ fn poll_shutdown(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<()>> {
147
+ self.project().inner.poll_shutdown(cx)
148
+ }
149
+ }
150
+
151
+ impl<RW: AsyncRead + AsyncWrite> AsyncRead for BufStream<RW> {
152
+ fn poll_read(
153
+ self: Pin<&mut Self>,
154
+ cx: &mut Context<'_>,
155
+ buf: &mut ReadBuf<'_>,
156
+ ) -> Poll<io::Result<()>> {
157
+ self.project().inner.poll_read(cx, buf)
158
+ }
159
+ }
160
+
161
+ /// Seek to an offset, in bytes, in the underlying stream.
162
+ ///
163
+ /// The position used for seeking with `SeekFrom::Current(_)` is the
164
+ /// position the underlying stream would be at if the `BufStream` had no
165
+ /// internal buffer.
166
+ ///
167
+ /// Seeking always discards the internal buffer, even if the seek position
168
+ /// would otherwise fall within it. This guarantees that calling
169
+ /// `.into_inner()` immediately after a seek yields the underlying reader
170
+ /// at the same position.
171
+ ///
172
+ /// See [`AsyncSeek`] for more details.
173
+ ///
174
+ /// Note: In the edge case where you're seeking with `SeekFrom::Current(n)`
175
+ /// where `n` minus the internal buffer length overflows an `i64`, two
176
+ /// seeks will be performed instead of one. If the second seek returns
177
+ /// `Err`, the underlying reader will be left at the same position it would
178
+ /// have if you called `seek` with `SeekFrom::Current(0)`.
179
+ impl<RW: AsyncRead + AsyncWrite + AsyncSeek> AsyncSeek for BufStream<RW> {
180
+ fn start_seek(self: Pin<&mut Self>, position: SeekFrom) -> io::Result<()> {
181
+ self.project().inner.start_seek(position)
182
+ }
183
+
184
+ fn poll_complete(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<u64>> {
185
+ self.project().inner.poll_complete(cx)
186
+ }
187
+ }
188
+
189
+ impl<RW: AsyncRead + AsyncWrite> AsyncBufRead for BufStream<RW> {
190
+ fn poll_fill_buf(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<&[u8]>> {
191
+ self.project().inner.poll_fill_buf(cx)
192
+ }
193
+
194
+ fn consume(self: Pin<&mut Self>, amt: usize) {
195
+ self.project().inner.consume(amt);
196
+ }
197
+ }
198
+
199
+ #[cfg(test)]
200
+ mod tests {
201
+ use super::*;
202
+
203
+ #[test]
204
+ fn assert_unpin() {
205
+ crate::is_unpin::<BufStream<()>>();
206
+ }
207
+ }