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,322 @@
1
+ #![cfg_attr(not(feature = "net"), allow(unreachable_pub))]
2
+
3
+ use crate::io::interest::Interest;
4
+
5
+ use std::fmt;
6
+ use std::ops;
7
+
8
+ const READABLE: usize = 0b0_01;
9
+ const WRITABLE: usize = 0b0_10;
10
+ const READ_CLOSED: usize = 0b0_0100;
11
+ const WRITE_CLOSED: usize = 0b0_1000;
12
+ #[cfg(any(target_os = "linux", target_os = "android"))]
13
+ const PRIORITY: usize = 0b1_0000;
14
+ const ERROR: usize = 0b10_0000;
15
+
16
+ /// Describes the readiness state of an I/O resources.
17
+ ///
18
+ /// `Ready` tracks which operation an I/O resource is ready to perform.
19
+ #[cfg_attr(docsrs, doc(cfg(feature = "net")))]
20
+ #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
21
+ pub struct Ready(usize);
22
+
23
+ impl Ready {
24
+ /// Returns the empty `Ready` set.
25
+ pub const EMPTY: Ready = Ready(0);
26
+
27
+ /// Returns a `Ready` representing readable readiness.
28
+ pub const READABLE: Ready = Ready(READABLE);
29
+
30
+ /// Returns a `Ready` representing writable readiness.
31
+ pub const WRITABLE: Ready = Ready(WRITABLE);
32
+
33
+ /// Returns a `Ready` representing read closed readiness.
34
+ pub const READ_CLOSED: Ready = Ready(READ_CLOSED);
35
+
36
+ /// Returns a `Ready` representing write closed readiness.
37
+ pub const WRITE_CLOSED: Ready = Ready(WRITE_CLOSED);
38
+
39
+ /// Returns a `Ready` representing priority readiness.
40
+ #[cfg(any(target_os = "linux", target_os = "android"))]
41
+ #[cfg_attr(docsrs, doc(cfg(any(target_os = "linux", target_os = "android"))))]
42
+ pub const PRIORITY: Ready = Ready(PRIORITY);
43
+
44
+ /// Returns a `Ready` representing error readiness.
45
+ pub const ERROR: Ready = Ready(ERROR);
46
+
47
+ /// Returns a `Ready` representing readiness for all operations.
48
+ #[cfg(any(target_os = "linux", target_os = "android"))]
49
+ pub const ALL: Ready =
50
+ Ready(READABLE | WRITABLE | READ_CLOSED | WRITE_CLOSED | ERROR | PRIORITY);
51
+
52
+ /// Returns a `Ready` representing readiness for all operations.
53
+ #[cfg(not(any(target_os = "linux", target_os = "android")))]
54
+ pub const ALL: Ready = Ready(READABLE | WRITABLE | READ_CLOSED | WRITE_CLOSED | ERROR);
55
+
56
+ // Must remain crate-private to avoid adding a public dependency on Mio.
57
+ pub(crate) fn from_mio(event: &mio::event::Event) -> Ready {
58
+ let mut ready = Ready::EMPTY;
59
+
60
+ #[cfg(all(target_os = "freebsd", feature = "net"))]
61
+ {
62
+ if event.is_aio() {
63
+ ready |= Ready::READABLE;
64
+ }
65
+
66
+ if event.is_lio() {
67
+ ready |= Ready::READABLE;
68
+ }
69
+ }
70
+
71
+ if event.is_readable() {
72
+ ready |= Ready::READABLE;
73
+ }
74
+
75
+ if event.is_writable() {
76
+ ready |= Ready::WRITABLE;
77
+ }
78
+
79
+ if event.is_read_closed() {
80
+ ready |= Ready::READ_CLOSED;
81
+ }
82
+
83
+ if event.is_write_closed() {
84
+ ready |= Ready::WRITE_CLOSED;
85
+ }
86
+
87
+ if event.is_error() {
88
+ ready |= Ready::ERROR;
89
+ }
90
+
91
+ #[cfg(any(target_os = "linux", target_os = "android"))]
92
+ {
93
+ if event.is_priority() {
94
+ ready |= Ready::PRIORITY;
95
+ }
96
+ }
97
+
98
+ ready
99
+ }
100
+
101
+ /// Returns true if `Ready` is the empty set.
102
+ ///
103
+ /// # Examples
104
+ ///
105
+ /// ```
106
+ /// use tokio::io::Ready;
107
+ ///
108
+ /// assert!(Ready::EMPTY.is_empty());
109
+ /// assert!(!Ready::READABLE.is_empty());
110
+ /// ```
111
+ pub fn is_empty(self) -> bool {
112
+ self == Ready::EMPTY
113
+ }
114
+
115
+ /// Returns `true` if the value includes `readable`.
116
+ ///
117
+ /// # Examples
118
+ ///
119
+ /// ```
120
+ /// use tokio::io::Ready;
121
+ ///
122
+ /// assert!(!Ready::EMPTY.is_readable());
123
+ /// assert!(Ready::READABLE.is_readable());
124
+ /// assert!(Ready::READ_CLOSED.is_readable());
125
+ /// assert!(!Ready::WRITABLE.is_readable());
126
+ /// ```
127
+ pub fn is_readable(self) -> bool {
128
+ self.contains(Ready::READABLE) || self.is_read_closed()
129
+ }
130
+
131
+ /// Returns `true` if the value includes writable `readiness`.
132
+ ///
133
+ /// # Examples
134
+ ///
135
+ /// ```
136
+ /// use tokio::io::Ready;
137
+ ///
138
+ /// assert!(!Ready::EMPTY.is_writable());
139
+ /// assert!(!Ready::READABLE.is_writable());
140
+ /// assert!(Ready::WRITABLE.is_writable());
141
+ /// assert!(Ready::WRITE_CLOSED.is_writable());
142
+ /// ```
143
+ pub fn is_writable(self) -> bool {
144
+ self.contains(Ready::WRITABLE) || self.is_write_closed()
145
+ }
146
+
147
+ /// Returns `true` if the value includes read-closed `readiness`.
148
+ ///
149
+ /// # Examples
150
+ ///
151
+ /// ```
152
+ /// use tokio::io::Ready;
153
+ ///
154
+ /// assert!(!Ready::EMPTY.is_read_closed());
155
+ /// assert!(!Ready::READABLE.is_read_closed());
156
+ /// assert!(Ready::READ_CLOSED.is_read_closed());
157
+ /// ```
158
+ pub fn is_read_closed(self) -> bool {
159
+ self.contains(Ready::READ_CLOSED)
160
+ }
161
+
162
+ /// Returns `true` if the value includes write-closed `readiness`.
163
+ ///
164
+ /// # Examples
165
+ ///
166
+ /// ```
167
+ /// use tokio::io::Ready;
168
+ ///
169
+ /// assert!(!Ready::EMPTY.is_write_closed());
170
+ /// assert!(!Ready::WRITABLE.is_write_closed());
171
+ /// assert!(Ready::WRITE_CLOSED.is_write_closed());
172
+ /// ```
173
+ pub fn is_write_closed(self) -> bool {
174
+ self.contains(Ready::WRITE_CLOSED)
175
+ }
176
+
177
+ /// Returns `true` if the value includes priority `readiness`.
178
+ ///
179
+ /// # Examples
180
+ ///
181
+ /// ```
182
+ /// use tokio::io::Ready;
183
+ ///
184
+ /// assert!(!Ready::EMPTY.is_priority());
185
+ /// assert!(!Ready::WRITABLE.is_priority());
186
+ /// assert!(Ready::PRIORITY.is_priority());
187
+ /// ```
188
+ #[cfg(any(target_os = "linux", target_os = "android"))]
189
+ #[cfg_attr(docsrs, doc(cfg(any(target_os = "linux", target_os = "android"))))]
190
+ pub fn is_priority(self) -> bool {
191
+ self.contains(Ready::PRIORITY)
192
+ }
193
+
194
+ /// Returns `true` if the value includes error `readiness`.
195
+ ///
196
+ /// # Examples
197
+ ///
198
+ /// ```
199
+ /// use tokio::io::Ready;
200
+ ///
201
+ /// assert!(!Ready::EMPTY.is_error());
202
+ /// assert!(!Ready::WRITABLE.is_error());
203
+ /// assert!(Ready::ERROR.is_error());
204
+ /// ```
205
+ pub fn is_error(self) -> bool {
206
+ self.contains(Ready::ERROR)
207
+ }
208
+
209
+ /// Returns true if `self` is a superset of `other`.
210
+ ///
211
+ /// `other` may represent more than one readiness operations, in which case
212
+ /// the function only returns true if `self` contains all readiness
213
+ /// specified in `other`.
214
+ pub(crate) fn contains<T: Into<Self>>(self, other: T) -> bool {
215
+ let other = other.into();
216
+ (self & other) == other
217
+ }
218
+
219
+ /// Creates a `Ready` instance using the given `usize` representation.
220
+ ///
221
+ /// The `usize` representation must have been obtained from a call to
222
+ /// `Readiness::as_usize`.
223
+ ///
224
+ /// This function is mainly provided to allow the caller to get a
225
+ /// readiness value from an `AtomicUsize`.
226
+ pub(crate) fn from_usize(val: usize) -> Ready {
227
+ Ready(val & Ready::ALL.as_usize())
228
+ }
229
+
230
+ /// Returns a `usize` representation of the `Ready` value.
231
+ ///
232
+ /// This function is mainly provided to allow the caller to store a
233
+ /// readiness value in an `AtomicUsize`.
234
+ pub(crate) fn as_usize(self) -> usize {
235
+ self.0
236
+ }
237
+
238
+ pub(crate) fn from_interest(interest: Interest) -> Ready {
239
+ let mut ready = Ready::EMPTY;
240
+
241
+ if interest.is_readable() {
242
+ ready |= Ready::READABLE;
243
+ ready |= Ready::READ_CLOSED;
244
+ }
245
+
246
+ if interest.is_writable() {
247
+ ready |= Ready::WRITABLE;
248
+ ready |= Ready::WRITE_CLOSED;
249
+ }
250
+
251
+ #[cfg(any(target_os = "linux", target_os = "android"))]
252
+ if interest.is_priority() {
253
+ ready |= Ready::PRIORITY;
254
+ ready |= Ready::READ_CLOSED;
255
+ }
256
+
257
+ if interest.is_error() {
258
+ ready |= Ready::ERROR;
259
+ }
260
+
261
+ ready
262
+ }
263
+
264
+ pub(crate) fn intersection(self, interest: Interest) -> Ready {
265
+ Ready(self.0 & Ready::from_interest(interest).0)
266
+ }
267
+
268
+ pub(crate) fn satisfies(self, interest: Interest) -> bool {
269
+ self.0 & Ready::from_interest(interest).0 != 0
270
+ }
271
+ }
272
+
273
+ impl ops::BitOr<Ready> for Ready {
274
+ type Output = Ready;
275
+
276
+ #[inline]
277
+ fn bitor(self, other: Ready) -> Ready {
278
+ Ready(self.0 | other.0)
279
+ }
280
+ }
281
+
282
+ impl ops::BitOrAssign<Ready> for Ready {
283
+ #[inline]
284
+ fn bitor_assign(&mut self, other: Ready) {
285
+ self.0 |= other.0;
286
+ }
287
+ }
288
+
289
+ impl ops::BitAnd<Ready> for Ready {
290
+ type Output = Ready;
291
+
292
+ #[inline]
293
+ fn bitand(self, other: Ready) -> Ready {
294
+ Ready(self.0 & other.0)
295
+ }
296
+ }
297
+
298
+ impl ops::Sub<Ready> for Ready {
299
+ type Output = Ready;
300
+
301
+ #[inline]
302
+ fn sub(self, other: Ready) -> Ready {
303
+ Ready(self.0 & !other.0)
304
+ }
305
+ }
306
+
307
+ impl fmt::Debug for Ready {
308
+ fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
309
+ let mut fmt = fmt.debug_struct("Ready");
310
+
311
+ fmt.field("is_readable", &self.is_readable())
312
+ .field("is_writable", &self.is_writable())
313
+ .field("is_read_closed", &self.is_read_closed())
314
+ .field("is_write_closed", &self.is_write_closed())
315
+ .field("is_error", &self.is_error());
316
+
317
+ #[cfg(any(target_os = "linux", target_os = "android"))]
318
+ fmt.field("is_priority", &self.is_priority());
319
+
320
+ fmt.finish()
321
+ }
322
+ }
@@ -0,0 +1,166 @@
1
+ //! Split a single value implementing `AsyncRead + AsyncWrite` into separate
2
+ //! `AsyncRead` and `AsyncWrite` handles.
3
+ //!
4
+ //! To restore this read/write object from its `split::ReadHalf` and
5
+ //! `split::WriteHalf` use `unsplit`.
6
+
7
+ use crate::io::{AsyncRead, AsyncWrite, ReadBuf};
8
+
9
+ use std::fmt;
10
+ use std::io;
11
+ use std::pin::Pin;
12
+ use std::sync::Arc;
13
+ use std::sync::Mutex;
14
+ use std::task::{Context, Poll};
15
+
16
+ cfg_io_util! {
17
+ /// The readable half of a value returned from [`split`](split()).
18
+ pub struct ReadHalf<T> {
19
+ inner: Arc<Inner<T>>,
20
+ }
21
+
22
+ /// The writable half of a value returned from [`split`](split()).
23
+ pub struct WriteHalf<T> {
24
+ inner: Arc<Inner<T>>,
25
+ }
26
+
27
+ /// Splits a single value implementing `AsyncRead + AsyncWrite` into separate
28
+ /// `AsyncRead` and `AsyncWrite` handles.
29
+ ///
30
+ /// To restore this read/write object from its `ReadHalf` and
31
+ /// `WriteHalf` use [`unsplit`](ReadHalf::unsplit()).
32
+ pub fn split<T>(stream: T) -> (ReadHalf<T>, WriteHalf<T>)
33
+ where
34
+ T: AsyncRead + AsyncWrite,
35
+ {
36
+ let is_write_vectored = stream.is_write_vectored();
37
+
38
+ let inner = Arc::new(Inner {
39
+ stream: Mutex::new(stream),
40
+ is_write_vectored,
41
+ });
42
+
43
+ let rd = ReadHalf {
44
+ inner: inner.clone(),
45
+ };
46
+
47
+ let wr = WriteHalf { inner };
48
+
49
+ (rd, wr)
50
+ }
51
+ }
52
+
53
+ struct Inner<T> {
54
+ stream: Mutex<T>,
55
+ is_write_vectored: bool,
56
+ }
57
+
58
+ impl<T> Inner<T> {
59
+ fn with_lock<R>(&self, f: impl FnOnce(Pin<&mut T>) -> R) -> R {
60
+ let mut guard = self.stream.lock().unwrap();
61
+
62
+ // safety: we do not move the stream.
63
+ let stream = unsafe { Pin::new_unchecked(&mut *guard) };
64
+
65
+ f(stream)
66
+ }
67
+ }
68
+
69
+ impl<T> ReadHalf<T> {
70
+ /// Checks if this `ReadHalf` and some `WriteHalf` were split from the same
71
+ /// stream.
72
+ pub fn is_pair_of(&self, other: &WriteHalf<T>) -> bool {
73
+ other.is_pair_of(self)
74
+ }
75
+
76
+ /// Reunites with a previously split `WriteHalf`.
77
+ ///
78
+ /// # Panics
79
+ ///
80
+ /// If this `ReadHalf` and the given `WriteHalf` do not originate from the
81
+ /// same `split` operation this method will panic.
82
+ /// This can be checked ahead of time by calling [`is_pair_of()`](Self::is_pair_of).
83
+ #[track_caller]
84
+ pub fn unsplit(self, wr: WriteHalf<T>) -> T
85
+ where
86
+ T: Unpin,
87
+ {
88
+ if self.is_pair_of(&wr) {
89
+ drop(wr);
90
+
91
+ let inner = Arc::try_unwrap(self.inner)
92
+ .ok()
93
+ .expect("`Arc::try_unwrap` failed");
94
+
95
+ inner.stream.into_inner().unwrap()
96
+ } else {
97
+ panic!("Unrelated `split::Write` passed to `split::Read::unsplit`.")
98
+ }
99
+ }
100
+ }
101
+
102
+ impl<T> WriteHalf<T> {
103
+ /// Checks if this `WriteHalf` and some `ReadHalf` were split from the same
104
+ /// stream.
105
+ pub fn is_pair_of(&self, other: &ReadHalf<T>) -> bool {
106
+ Arc::ptr_eq(&self.inner, &other.inner)
107
+ }
108
+ }
109
+
110
+ impl<T: AsyncRead> AsyncRead for ReadHalf<T> {
111
+ fn poll_read(
112
+ self: Pin<&mut Self>,
113
+ cx: &mut Context<'_>,
114
+ buf: &mut ReadBuf<'_>,
115
+ ) -> Poll<io::Result<()>> {
116
+ self.inner.with_lock(|stream| stream.poll_read(cx, buf))
117
+ }
118
+ }
119
+
120
+ impl<T: AsyncWrite> AsyncWrite for WriteHalf<T> {
121
+ fn poll_write(
122
+ self: Pin<&mut Self>,
123
+ cx: &mut Context<'_>,
124
+ buf: &[u8],
125
+ ) -> Poll<Result<usize, io::Error>> {
126
+ self.inner.with_lock(|stream| stream.poll_write(cx, buf))
127
+ }
128
+
129
+ fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<(), io::Error>> {
130
+ self.inner.with_lock(|stream| stream.poll_flush(cx))
131
+ }
132
+
133
+ fn poll_shutdown(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<(), io::Error>> {
134
+ self.inner.with_lock(|stream| stream.poll_shutdown(cx))
135
+ }
136
+
137
+ fn poll_write_vectored(
138
+ self: Pin<&mut Self>,
139
+ cx: &mut Context<'_>,
140
+ bufs: &[io::IoSlice<'_>],
141
+ ) -> Poll<Result<usize, io::Error>> {
142
+ self.inner
143
+ .with_lock(|stream| stream.poll_write_vectored(cx, bufs))
144
+ }
145
+
146
+ fn is_write_vectored(&self) -> bool {
147
+ self.inner.is_write_vectored
148
+ }
149
+ }
150
+
151
+ unsafe impl<T: Send> Send for ReadHalf<T> {}
152
+ unsafe impl<T: Send> Send for WriteHalf<T> {}
153
+ unsafe impl<T: Sync> Sync for ReadHalf<T> {}
154
+ unsafe impl<T: Sync> Sync for WriteHalf<T> {}
155
+
156
+ impl<T: fmt::Debug> fmt::Debug for ReadHalf<T> {
157
+ fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
158
+ fmt.debug_struct("split::ReadHalf").finish()
159
+ }
160
+ }
161
+
162
+ impl<T: fmt::Debug> fmt::Debug for WriteHalf<T> {
163
+ fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
164
+ fmt.debug_struct("split::WriteHalf").finish()
165
+ }
166
+ }
@@ -0,0 +1,148 @@
1
+ use crate::io::blocking::Blocking;
2
+ use crate::io::stdio_common::SplitByUtf8BoundaryIfWindows;
3
+ use crate::io::AsyncWrite;
4
+
5
+ use std::io;
6
+ use std::pin::Pin;
7
+ use std::task::Context;
8
+ use std::task::Poll;
9
+
10
+ cfg_io_std! {
11
+ /// A handle to the standard error stream of a process.
12
+ ///
13
+ /// Concurrent writes to stderr must be executed with care: Only individual
14
+ /// writes to this [`AsyncWrite`] are guaranteed to be intact. In particular
15
+ /// you should be aware that writes using [`write_all`] are not guaranteed
16
+ /// to occur as a single write, so multiple threads writing data with
17
+ /// [`write_all`] may result in interleaved output.
18
+ ///
19
+ /// Created by the [`stderr`] function.
20
+ ///
21
+ /// [`stderr`]: stderr()
22
+ /// [`AsyncWrite`]: AsyncWrite
23
+ /// [`write_all`]: crate::io::AsyncWriteExt::write_all()
24
+ ///
25
+ /// # Examples
26
+ ///
27
+ /// ```
28
+ /// use tokio::io::{self, AsyncWriteExt};
29
+ ///
30
+ /// #[tokio::main]
31
+ /// async fn main() -> io::Result<()> {
32
+ /// let mut stderr = io::stderr();
33
+ /// stderr.write_all(b"Print some error here.").await?;
34
+ /// Ok(())
35
+ /// }
36
+ /// ```
37
+ #[derive(Debug)]
38
+ pub struct Stderr {
39
+ std: SplitByUtf8BoundaryIfWindows<Blocking<std::io::Stderr>>,
40
+ }
41
+
42
+ /// Constructs a new handle to the standard error of the current process.
43
+ ///
44
+ /// The returned handle allows writing to standard error from the within the
45
+ /// Tokio runtime.
46
+ ///
47
+ /// Concurrent writes to stderr must be executed with care: Only individual
48
+ /// writes to this [`AsyncWrite`] are guaranteed to be intact. In particular
49
+ /// you should be aware that writes using [`write_all`] are not guaranteed
50
+ /// to occur as a single write, so multiple threads writing data with
51
+ /// [`write_all`] may result in interleaved output.
52
+ ///
53
+ /// Note that unlike [`std::io::stderr`], each call to this `stderr()`
54
+ /// produces a new writer, so for example, this program does **not** flush stderr:
55
+ ///
56
+ /// ```no_run
57
+ /// # use tokio::io::AsyncWriteExt;
58
+ /// # #[tokio::main]
59
+ /// # async fn main() -> std::io::Result<()> {
60
+ /// tokio::io::stderr().write_all(b"aa").await?;
61
+ /// tokio::io::stderr().flush().await?;
62
+ /// # Ok(())
63
+ /// # }
64
+ /// ```
65
+ ///
66
+ /// [`std::io::stderr`]: std::io::stderr
67
+ /// [`AsyncWrite`]: AsyncWrite
68
+ /// [`write_all`]: crate::io::AsyncWriteExt::write_all()
69
+ ///
70
+ /// # Examples
71
+ ///
72
+ /// ```
73
+ /// use tokio::io::{self, AsyncWriteExt};
74
+ ///
75
+ /// #[tokio::main]
76
+ /// async fn main() -> io::Result<()> {
77
+ /// let mut stderr = io::stderr();
78
+ /// stderr.write_all(b"Print some error here.").await?;
79
+ /// Ok(())
80
+ /// }
81
+ /// ```
82
+ pub fn stderr() -> Stderr {
83
+ let std = io::stderr();
84
+ // SAFETY: The `Read` implementation of `std` does not read from the
85
+ // buffer it is borrowing and correctly reports the length of the data
86
+ // written into the buffer.
87
+ let blocking = unsafe { Blocking::new(std) };
88
+ Stderr {
89
+ std: SplitByUtf8BoundaryIfWindows::new(blocking),
90
+ }
91
+ }
92
+ }
93
+
94
+ #[cfg(unix)]
95
+ mod sys {
96
+ use std::os::unix::io::{AsFd, AsRawFd, BorrowedFd, RawFd};
97
+
98
+ use super::Stderr;
99
+
100
+ impl AsRawFd for Stderr {
101
+ fn as_raw_fd(&self) -> RawFd {
102
+ std::io::stderr().as_raw_fd()
103
+ }
104
+ }
105
+
106
+ impl AsFd for Stderr {
107
+ fn as_fd(&self) -> BorrowedFd<'_> {
108
+ unsafe { BorrowedFd::borrow_raw(self.as_raw_fd()) }
109
+ }
110
+ }
111
+ }
112
+
113
+ cfg_windows! {
114
+ use crate::os::windows::io::{AsHandle, BorrowedHandle, AsRawHandle, RawHandle};
115
+
116
+ impl AsRawHandle for Stderr {
117
+ fn as_raw_handle(&self) -> RawHandle {
118
+ std::io::stderr().as_raw_handle()
119
+ }
120
+ }
121
+
122
+ impl AsHandle for Stderr {
123
+ fn as_handle(&self) -> BorrowedHandle<'_> {
124
+ unsafe { BorrowedHandle::borrow_raw(self.as_raw_handle()) }
125
+ }
126
+ }
127
+ }
128
+
129
+ impl AsyncWrite for Stderr {
130
+ fn poll_write(
131
+ mut self: Pin<&mut Self>,
132
+ cx: &mut Context<'_>,
133
+ buf: &[u8],
134
+ ) -> Poll<io::Result<usize>> {
135
+ Pin::new(&mut self.std).poll_write(cx, buf)
136
+ }
137
+
138
+ fn poll_flush(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<(), io::Error>> {
139
+ Pin::new(&mut self.std).poll_flush(cx)
140
+ }
141
+
142
+ fn poll_shutdown(
143
+ mut self: Pin<&mut Self>,
144
+ cx: &mut Context<'_>,
145
+ ) -> Poll<Result<(), io::Error>> {
146
+ Pin::new(&mut self.std).poll_shutdown(cx)
147
+ }
148
+ }