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,856 @@
1
+ use crate::fs::{asyncify, File};
2
+
3
+ use std::io;
4
+ use std::path::Path;
5
+
6
+ cfg_io_uring! {
7
+ mod uring_open_options;
8
+ pub(crate) use uring_open_options::UringOpenOptions;
9
+ use crate::runtime::driver::op::Op;
10
+ }
11
+
12
+ #[cfg(test)]
13
+ mod mock_open_options;
14
+ #[cfg(test)]
15
+ use mock_open_options::MockOpenOptions as StdOpenOptions;
16
+ #[cfg(not(test))]
17
+ use std::fs::OpenOptions as StdOpenOptions;
18
+
19
+ #[cfg(unix)]
20
+ use std::os::unix::fs::OpenOptionsExt;
21
+ #[cfg(windows)]
22
+ use std::os::windows::fs::OpenOptionsExt;
23
+
24
+ /// Options and flags which can be used to configure how a file is opened.
25
+ ///
26
+ /// This builder exposes the ability to configure how a [`File`] is opened and
27
+ /// what operations are permitted on the open file. The [`File::open`] and
28
+ /// [`File::create`] methods are aliases for commonly used options using this
29
+ /// builder.
30
+ ///
31
+ /// Generally speaking, when using `OpenOptions`, you'll first call [`new`],
32
+ /// then chain calls to methods to set each option, then call [`open`], passing
33
+ /// the path of the file you're trying to open. This will give you a
34
+ /// [`io::Result`] with a [`File`] inside that you can further operate
35
+ /// on.
36
+ ///
37
+ /// This is a specialized version of [`std::fs::OpenOptions`] for usage from
38
+ /// the Tokio runtime.
39
+ ///
40
+ /// `From<std::fs::OpenOptions>` is implemented for more advanced configuration
41
+ /// than the methods provided here.
42
+ ///
43
+ /// [`new`]: OpenOptions::new
44
+ /// [`open`]: OpenOptions::open
45
+ /// [`File`]: File
46
+ /// [`File::open`]: File::open
47
+ /// [`File::create`]: File::create
48
+ ///
49
+ /// # Examples
50
+ ///
51
+ /// Opening a file to read:
52
+ ///
53
+ /// ```no_run
54
+ /// use tokio::fs::OpenOptions;
55
+ /// use std::io;
56
+ ///
57
+ /// #[tokio::main]
58
+ /// async fn main() -> io::Result<()> {
59
+ /// let file = OpenOptions::new()
60
+ /// .read(true)
61
+ /// .open("foo.txt")
62
+ /// .await?;
63
+ ///
64
+ /// Ok(())
65
+ /// }
66
+ /// ```
67
+ ///
68
+ /// Opening a file for both reading and writing, as well as creating it if it
69
+ /// doesn't exist:
70
+ ///
71
+ /// ```no_run
72
+ /// use tokio::fs::OpenOptions;
73
+ /// use std::io;
74
+ ///
75
+ /// #[tokio::main]
76
+ /// async fn main() -> io::Result<()> {
77
+ /// let file = OpenOptions::new()
78
+ /// .read(true)
79
+ /// .write(true)
80
+ /// .create(true)
81
+ /// .open("foo.txt")
82
+ /// .await?;
83
+ ///
84
+ /// Ok(())
85
+ /// }
86
+ /// ```
87
+ #[derive(Clone, Debug)]
88
+ pub struct OpenOptions {
89
+ inner: Kind,
90
+ }
91
+
92
+ #[derive(Debug, Clone)]
93
+ enum Kind {
94
+ Std(StdOpenOptions),
95
+ #[cfg(all(
96
+ tokio_unstable,
97
+ feature = "io-uring",
98
+ feature = "rt",
99
+ feature = "fs",
100
+ target_os = "linux"
101
+ ))]
102
+ Uring(UringOpenOptions),
103
+ }
104
+
105
+ impl OpenOptions {
106
+ /// Creates a blank new set of options ready for configuration.
107
+ ///
108
+ /// All options are initially set to `false`.
109
+ ///
110
+ /// This is an async version of [`std::fs::OpenOptions::new`][std]
111
+ ///
112
+ /// [std]: std::fs::OpenOptions::new
113
+ ///
114
+ /// # Examples
115
+ ///
116
+ /// ```no_run
117
+ /// use tokio::fs::OpenOptions;
118
+ ///
119
+ /// let mut options = OpenOptions::new();
120
+ /// let future = options.read(true).open("foo.txt");
121
+ /// ```
122
+ pub fn new() -> OpenOptions {
123
+ #[cfg(all(
124
+ tokio_unstable,
125
+ feature = "io-uring",
126
+ feature = "rt",
127
+ feature = "fs",
128
+ target_os = "linux"
129
+ ))]
130
+ let inner = Kind::Uring(UringOpenOptions::new());
131
+ #[cfg(not(all(
132
+ tokio_unstable,
133
+ feature = "io-uring",
134
+ feature = "rt",
135
+ feature = "fs",
136
+ target_os = "linux"
137
+ )))]
138
+ let inner = Kind::Std(StdOpenOptions::new());
139
+
140
+ OpenOptions { inner }
141
+ }
142
+
143
+ /// Sets the option for read access.
144
+ ///
145
+ /// This option, when true, will indicate that the file should be
146
+ /// `read`-able if opened.
147
+ ///
148
+ /// This is an async version of [`std::fs::OpenOptions::read`][std]
149
+ ///
150
+ /// [std]: std::fs::OpenOptions::read
151
+ ///
152
+ /// # Examples
153
+ ///
154
+ /// ```no_run
155
+ /// use tokio::fs::OpenOptions;
156
+ /// use std::io;
157
+ ///
158
+ /// #[tokio::main]
159
+ /// async fn main() -> io::Result<()> {
160
+ /// let file = OpenOptions::new()
161
+ /// .read(true)
162
+ /// .open("foo.txt")
163
+ /// .await?;
164
+ ///
165
+ /// Ok(())
166
+ /// }
167
+ /// ```
168
+ pub fn read(&mut self, read: bool) -> &mut OpenOptions {
169
+ match &mut self.inner {
170
+ Kind::Std(opts) => {
171
+ opts.read(read);
172
+ }
173
+ #[cfg(all(
174
+ tokio_unstable,
175
+ feature = "io-uring",
176
+ feature = "rt",
177
+ feature = "fs",
178
+ target_os = "linux"
179
+ ))]
180
+ Kind::Uring(opts) => {
181
+ opts.read(read);
182
+ }
183
+ }
184
+ self
185
+ }
186
+
187
+ /// Sets the option for write access.
188
+ ///
189
+ /// This option, when true, will indicate that the file should be
190
+ /// `write`-able if opened.
191
+ ///
192
+ /// This is an async version of [`std::fs::OpenOptions::write`][std]
193
+ ///
194
+ /// [std]: std::fs::OpenOptions::write
195
+ ///
196
+ /// # Examples
197
+ ///
198
+ /// ```no_run
199
+ /// use tokio::fs::OpenOptions;
200
+ /// use std::io;
201
+ ///
202
+ /// #[tokio::main]
203
+ /// async fn main() -> io::Result<()> {
204
+ /// let file = OpenOptions::new()
205
+ /// .write(true)
206
+ /// .open("foo.txt")
207
+ /// .await?;
208
+ ///
209
+ /// Ok(())
210
+ /// }
211
+ /// ```
212
+ pub fn write(&mut self, write: bool) -> &mut OpenOptions {
213
+ match &mut self.inner {
214
+ Kind::Std(opts) => {
215
+ opts.write(write);
216
+ }
217
+ #[cfg(all(
218
+ tokio_unstable,
219
+ feature = "io-uring",
220
+ feature = "rt",
221
+ feature = "fs",
222
+ target_os = "linux"
223
+ ))]
224
+ Kind::Uring(opts) => {
225
+ opts.write(write);
226
+ }
227
+ }
228
+ self
229
+ }
230
+
231
+ /// Sets the option for the append mode.
232
+ ///
233
+ /// This option, when true, means that writes will append to a file instead
234
+ /// of overwriting previous contents. Note that setting
235
+ /// `.write(true).append(true)` has the same effect as setting only
236
+ /// `.append(true)`.
237
+ ///
238
+ /// For most filesystems, the operating system guarantees that all writes are
239
+ /// atomic: no writes get mangled because another process writes at the same
240
+ /// time.
241
+ ///
242
+ /// One maybe obvious note when using append-mode: make sure that all data
243
+ /// that belongs together is written to the file in one operation. This
244
+ /// can be done by concatenating strings before passing them to [`write()`],
245
+ /// or using a buffered writer (with a buffer of adequate size),
246
+ /// and calling [`flush()`] when the message is complete.
247
+ ///
248
+ /// If a file is opened with both read and append access, beware that after
249
+ /// opening, and after every write, the position for reading may be set at the
250
+ /// end of the file. So, before writing, save the current position (using
251
+ /// [`seek`]`(`[`SeekFrom`]`::`[`Current`]`(0))`), and restore it before the next read.
252
+ ///
253
+ /// This is an async version of [`std::fs::OpenOptions::append`][std]
254
+ ///
255
+ /// [std]: std::fs::OpenOptions::append
256
+ ///
257
+ /// ## Note
258
+ ///
259
+ /// This function doesn't create the file if it doesn't exist. Use the [`create`]
260
+ /// method to do so.
261
+ ///
262
+ /// [`write()`]: crate::io::AsyncWriteExt::write
263
+ /// [`flush()`]: crate::io::AsyncWriteExt::flush
264
+ /// [`seek`]: crate::io::AsyncSeekExt::seek
265
+ /// [`SeekFrom`]: std::io::SeekFrom
266
+ /// [`Current`]: std::io::SeekFrom::Current
267
+ /// [`create`]: OpenOptions::create
268
+ ///
269
+ /// # Examples
270
+ ///
271
+ /// ```no_run
272
+ /// use tokio::fs::OpenOptions;
273
+ /// use std::io;
274
+ ///
275
+ /// #[tokio::main]
276
+ /// async fn main() -> io::Result<()> {
277
+ /// let file = OpenOptions::new()
278
+ /// .append(true)
279
+ /// .open("foo.txt")
280
+ /// .await?;
281
+ ///
282
+ /// Ok(())
283
+ /// }
284
+ /// ```
285
+ pub fn append(&mut self, append: bool) -> &mut OpenOptions {
286
+ match &mut self.inner {
287
+ Kind::Std(opts) => {
288
+ opts.append(append);
289
+ }
290
+ #[cfg(all(
291
+ tokio_unstable,
292
+ feature = "io-uring",
293
+ feature = "rt",
294
+ feature = "fs",
295
+ target_os = "linux"
296
+ ))]
297
+ Kind::Uring(opts) => {
298
+ opts.append(append);
299
+ }
300
+ }
301
+ self
302
+ }
303
+
304
+ /// Sets the option for truncating a previous file.
305
+ ///
306
+ /// If a file is successfully opened with this option set it will truncate
307
+ /// the file to 0 length if it already exists.
308
+ ///
309
+ /// The file must be opened with write access for truncate to work.
310
+ ///
311
+ /// This is an async version of [`std::fs::OpenOptions::truncate`][std]
312
+ ///
313
+ /// [std]: std::fs::OpenOptions::truncate
314
+ ///
315
+ /// # Examples
316
+ ///
317
+ /// ```no_run
318
+ /// use tokio::fs::OpenOptions;
319
+ /// use std::io;
320
+ ///
321
+ /// #[tokio::main]
322
+ /// async fn main() -> io::Result<()> {
323
+ /// let file = OpenOptions::new()
324
+ /// .write(true)
325
+ /// .truncate(true)
326
+ /// .open("foo.txt")
327
+ /// .await?;
328
+ ///
329
+ /// Ok(())
330
+ /// }
331
+ /// ```
332
+ pub fn truncate(&mut self, truncate: bool) -> &mut OpenOptions {
333
+ match &mut self.inner {
334
+ Kind::Std(opts) => {
335
+ opts.truncate(truncate);
336
+ }
337
+ #[cfg(all(
338
+ tokio_unstable,
339
+ feature = "io-uring",
340
+ feature = "rt",
341
+ feature = "fs",
342
+ target_os = "linux"
343
+ ))]
344
+ Kind::Uring(opts) => {
345
+ opts.truncate(truncate);
346
+ }
347
+ }
348
+ self
349
+ }
350
+
351
+ /// Sets the option for creating a new file.
352
+ ///
353
+ /// This option indicates whether a new file will be created if the file
354
+ /// does not yet already exist.
355
+ ///
356
+ /// In order for the file to be created, [`write`] or [`append`] access must
357
+ /// be used.
358
+ ///
359
+ /// This is an async version of [`std::fs::OpenOptions::create`][std]
360
+ ///
361
+ /// [std]: std::fs::OpenOptions::create
362
+ /// [`write`]: OpenOptions::write
363
+ /// [`append`]: OpenOptions::append
364
+ ///
365
+ /// # Examples
366
+ ///
367
+ /// ```no_run
368
+ /// use tokio::fs::OpenOptions;
369
+ /// use std::io;
370
+ ///
371
+ /// #[tokio::main]
372
+ /// async fn main() -> io::Result<()> {
373
+ /// let file = OpenOptions::new()
374
+ /// .write(true)
375
+ /// .create(true)
376
+ /// .open("foo.txt")
377
+ /// .await?;
378
+ ///
379
+ /// Ok(())
380
+ /// }
381
+ /// ```
382
+ pub fn create(&mut self, create: bool) -> &mut OpenOptions {
383
+ match &mut self.inner {
384
+ Kind::Std(opts) => {
385
+ opts.create(create);
386
+ }
387
+ #[cfg(all(
388
+ tokio_unstable,
389
+ feature = "io-uring",
390
+ feature = "rt",
391
+ feature = "fs",
392
+ target_os = "linux"
393
+ ))]
394
+ Kind::Uring(opts) => {
395
+ opts.create(create);
396
+ }
397
+ }
398
+ self
399
+ }
400
+
401
+ /// Sets the option to always create a new file.
402
+ ///
403
+ /// This option indicates whether a new file will be created. No file is
404
+ /// allowed to exist at the target location, also no (dangling) symlink.
405
+ ///
406
+ /// This option is useful because it is atomic. Otherwise between checking
407
+ /// whether a file exists and creating a new one, the file may have been
408
+ /// created by another process (a TOCTOU race condition / attack).
409
+ ///
410
+ /// If `.create_new(true)` is set, [`.create()`] and [`.truncate()`] are
411
+ /// ignored.
412
+ ///
413
+ /// The file must be opened with write or append access in order to create a
414
+ /// new file.
415
+ ///
416
+ /// This is an async version of [`std::fs::OpenOptions::create_new`][std]
417
+ ///
418
+ /// [std]: std::fs::OpenOptions::create_new
419
+ /// [`.create()`]: OpenOptions::create
420
+ /// [`.truncate()`]: OpenOptions::truncate
421
+ ///
422
+ /// # Examples
423
+ ///
424
+ /// ```no_run
425
+ /// use tokio::fs::OpenOptions;
426
+ /// use std::io;
427
+ ///
428
+ /// #[tokio::main]
429
+ /// async fn main() -> io::Result<()> {
430
+ /// let file = OpenOptions::new()
431
+ /// .write(true)
432
+ /// .create_new(true)
433
+ /// .open("foo.txt")
434
+ /// .await?;
435
+ ///
436
+ /// Ok(())
437
+ /// }
438
+ /// ```
439
+ pub fn create_new(&mut self, create_new: bool) -> &mut OpenOptions {
440
+ match &mut self.inner {
441
+ Kind::Std(opts) => {
442
+ opts.create_new(create_new);
443
+ }
444
+ #[cfg(all(
445
+ tokio_unstable,
446
+ feature = "io-uring",
447
+ feature = "rt",
448
+ feature = "fs",
449
+ target_os = "linux"
450
+ ))]
451
+ Kind::Uring(opts) => {
452
+ opts.create_new(create_new);
453
+ }
454
+ }
455
+ self
456
+ }
457
+
458
+ /// Opens a file at `path` with the options specified by `self`.
459
+ ///
460
+ /// This is an async version of [`std::fs::OpenOptions::open`][std]
461
+ ///
462
+ /// [std]: std::fs::OpenOptions::open
463
+ ///
464
+ /// # Errors
465
+ ///
466
+ /// This function will return an error under a number of different
467
+ /// circumstances. Some of these error conditions are listed here, together
468
+ /// with their [`ErrorKind`]. The mapping to [`ErrorKind`]s is not part of
469
+ /// the compatibility contract of the function, especially the `Other` kind
470
+ /// might change to more specific kinds in the future.
471
+ ///
472
+ /// * [`NotFound`]: The specified file does not exist and neither `create`
473
+ /// or `create_new` is set.
474
+ /// * [`NotFound`]: One of the directory components of the file path does
475
+ /// not exist.
476
+ /// * [`PermissionDenied`]: The user lacks permission to get the specified
477
+ /// access rights for the file.
478
+ /// * [`PermissionDenied`]: The user lacks permission to open one of the
479
+ /// directory components of the specified path.
480
+ /// * [`AlreadyExists`]: `create_new` was specified and the file already
481
+ /// exists.
482
+ /// * [`InvalidInput`]: Invalid combinations of open options (truncate
483
+ /// without write access, no access mode set, etc.).
484
+ /// * [`Other`]: One of the directory components of the specified file path
485
+ /// was not, in fact, a directory.
486
+ /// * [`Other`]: Filesystem-level errors: full disk, write permission
487
+ /// requested on a read-only file system, exceeded disk quota, too many
488
+ /// open files, too long filename, too many symbolic links in the
489
+ /// specified path (Unix-like systems only), etc.
490
+ ///
491
+ /// # io_uring support
492
+ ///
493
+ /// On Linux, you can also use `io_uring` for executing system calls.
494
+ /// To enable `io_uring`, you need to specify the `--cfg tokio_unstable`
495
+ /// flag at compile time, enable the `io-uring` cargo feature, and set the
496
+ /// `Builder::enable_io_uring` runtime option.
497
+ ///
498
+ /// Support for `io_uring` is currently experimental, so its behavior may
499
+ /// change or it may be removed in future versions.
500
+ ///
501
+ /// # Examples
502
+ ///
503
+ /// ```no_run
504
+ /// use tokio::fs::OpenOptions;
505
+ /// use std::io;
506
+ ///
507
+ /// #[tokio::main]
508
+ /// async fn main() -> io::Result<()> {
509
+ /// let file = OpenOptions::new().open("foo.txt").await?;
510
+ /// Ok(())
511
+ /// }
512
+ /// ```
513
+ ///
514
+ /// [`ErrorKind`]: std::io::ErrorKind
515
+ /// [`AlreadyExists`]: std::io::ErrorKind::AlreadyExists
516
+ /// [`InvalidInput`]: std::io::ErrorKind::InvalidInput
517
+ /// [`NotFound`]: std::io::ErrorKind::NotFound
518
+ /// [`Other`]: std::io::ErrorKind::Other
519
+ /// [`PermissionDenied`]: std::io::ErrorKind::PermissionDenied
520
+ pub async fn open(&self, path: impl AsRef<Path>) -> io::Result<File> {
521
+ match &self.inner {
522
+ Kind::Std(opts) => Self::std_open(opts, path).await,
523
+ #[cfg(all(
524
+ tokio_unstable,
525
+ feature = "io-uring",
526
+ feature = "rt",
527
+ feature = "fs",
528
+ target_os = "linux"
529
+ ))]
530
+ Kind::Uring(opts) => {
531
+ let handle = crate::runtime::Handle::current();
532
+ let driver_handle = handle.inner.driver().io();
533
+
534
+ if driver_handle
535
+ .check_and_init(io_uring::opcode::OpenAt::CODE)
536
+ .await?
537
+ {
538
+ Op::open(path.as_ref(), opts)?.await
539
+ } else {
540
+ let opts = opts.clone().into();
541
+ Self::std_open(&opts, path).await
542
+ }
543
+ }
544
+ }
545
+ }
546
+
547
+ async fn std_open(opts: &StdOpenOptions, path: impl AsRef<Path>) -> io::Result<File> {
548
+ let path = path.as_ref().to_owned();
549
+ let opts = opts.clone();
550
+
551
+ let std = asyncify(move || opts.open(path)).await?;
552
+ Ok(File::from_std(std))
553
+ }
554
+
555
+ #[cfg(windows)]
556
+ pub(super) fn as_inner_mut(&mut self) -> &mut StdOpenOptions {
557
+ match &mut self.inner {
558
+ Kind::Std(ref mut opts) => opts,
559
+ }
560
+ }
561
+ }
562
+
563
+ feature! {
564
+ #![unix]
565
+
566
+ impl OpenOptions {
567
+ /// Sets the mode bits that a new file will be created with.
568
+ ///
569
+ /// If a new file is created as part of an `OpenOptions::open` call then this
570
+ /// specified `mode` will be used as the permission bits for the new file.
571
+ /// If no `mode` is set, the default of `0o666` will be used.
572
+ /// The operating system masks out bits with the system's `umask`, to produce
573
+ /// the final permissions.
574
+ ///
575
+ /// # Examples
576
+ ///
577
+ /// ```no_run
578
+ /// use tokio::fs::OpenOptions;
579
+ /// use std::io;
580
+ ///
581
+ /// #[tokio::main]
582
+ /// async fn main() -> io::Result<()> {
583
+ /// let mut options = OpenOptions::new();
584
+ /// options.mode(0o644); // Give read/write for owner and read for others.
585
+ /// let file = options.open("foo.txt").await?;
586
+ ///
587
+ /// Ok(())
588
+ /// }
589
+ /// ```
590
+ pub fn mode(&mut self, mode: u32) -> &mut OpenOptions {
591
+ match &mut self.inner {
592
+ Kind::Std(opts) => {
593
+ opts.mode(mode);
594
+ }
595
+ #[cfg(all(
596
+ tokio_unstable,
597
+ feature = "io-uring",
598
+ feature = "rt",
599
+ feature = "fs",
600
+ target_os = "linux"
601
+ ))]
602
+ Kind::Uring(opts) => {
603
+ opts.mode(mode);
604
+ }
605
+ }
606
+ self
607
+ }
608
+
609
+ /// Passes custom flags to the `flags` argument of `open`.
610
+ ///
611
+ /// The bits that define the access mode are masked out with `O_ACCMODE`, to
612
+ /// ensure they do not interfere with the access mode set by Rusts options.
613
+ ///
614
+ /// Custom flags can only set flags, not remove flags set by Rusts options.
615
+ /// This options overwrites any previously set custom flags.
616
+ ///
617
+ /// # Examples
618
+ ///
619
+ /// ```no_run
620
+ /// use tokio::fs::OpenOptions;
621
+ /// use std::io;
622
+ ///
623
+ /// #[tokio::main]
624
+ /// async fn main() -> io::Result<()> {
625
+ /// let mut options = OpenOptions::new();
626
+ /// options.write(true);
627
+ /// if cfg!(unix) {
628
+ /// options.custom_flags(libc::O_NOFOLLOW);
629
+ /// }
630
+ /// let file = options.open("foo.txt").await?;
631
+ ///
632
+ /// Ok(())
633
+ /// }
634
+ /// ```
635
+ pub fn custom_flags(&mut self, flags: i32) -> &mut OpenOptions {
636
+ match &mut self.inner {
637
+ Kind::Std(opts) => {
638
+ opts.custom_flags(flags);
639
+ }
640
+ #[cfg(all(
641
+ tokio_unstable,
642
+ feature = "io-uring",
643
+ feature = "rt",
644
+ feature = "fs",
645
+ target_os = "linux"
646
+ ))]
647
+ Kind::Uring(opts) => {
648
+ opts.custom_flags(flags);
649
+ }
650
+ }
651
+ self
652
+ }
653
+ }
654
+ }
655
+
656
+ cfg_windows! {
657
+ impl OpenOptions {
658
+ /// Overrides the `dwDesiredAccess` argument to the call to [`CreateFile`]
659
+ /// with the specified value.
660
+ ///
661
+ /// This will override the `read`, `write`, and `append` flags on the
662
+ /// `OpenOptions` structure. This method provides fine-grained control over
663
+ /// the permissions to read, write and append data, attributes (like hidden
664
+ /// and system), and extended attributes.
665
+ ///
666
+ /// # Examples
667
+ ///
668
+ /// ```no_run
669
+ /// use tokio::fs::OpenOptions;
670
+ ///
671
+ /// # #[tokio::main]
672
+ /// # async fn main() -> std::io::Result<()> {
673
+ /// // Open without read and write permission, for example if you only need
674
+ /// // to call `stat` on the file
675
+ /// let file = OpenOptions::new().access_mode(0).open("foo.txt").await?;
676
+ /// # Ok(())
677
+ /// # }
678
+ /// ```
679
+ ///
680
+ /// [`CreateFile`]: https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilea
681
+ pub fn access_mode(&mut self, access: u32) -> &mut OpenOptions {
682
+ self.as_inner_mut().access_mode(access);
683
+ self
684
+ }
685
+
686
+ /// Overrides the `dwShareMode` argument to the call to [`CreateFile`] with
687
+ /// the specified value.
688
+ ///
689
+ /// By default `share_mode` is set to
690
+ /// `FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE`. This allows
691
+ /// other processes to read, write, and delete/rename the same file
692
+ /// while it is open. Removing any of the flags will prevent other
693
+ /// processes from performing the corresponding operation until the file
694
+ /// handle is closed.
695
+ ///
696
+ /// # Examples
697
+ ///
698
+ /// ```no_run
699
+ /// use tokio::fs::OpenOptions;
700
+ ///
701
+ /// # #[tokio::main]
702
+ /// # async fn main() -> std::io::Result<()> {
703
+ /// // Do not allow others to read or modify this file while we have it open
704
+ /// // for writing.
705
+ /// let file = OpenOptions::new()
706
+ /// .write(true)
707
+ /// .share_mode(0)
708
+ /// .open("foo.txt").await?;
709
+ /// # Ok(())
710
+ /// # }
711
+ /// ```
712
+ ///
713
+ /// [`CreateFile`]: https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilea
714
+ pub fn share_mode(&mut self, share: u32) -> &mut OpenOptions {
715
+ self.as_inner_mut().share_mode(share);
716
+ self
717
+ }
718
+
719
+ /// Sets extra flags for the `dwFileFlags` argument to the call to
720
+ /// [`CreateFile2`] to the specified value (or combines it with
721
+ /// `attributes` and `security_qos_flags` to set the `dwFlagsAndAttributes`
722
+ /// for [`CreateFile`]).
723
+ ///
724
+ /// Custom flags can only set flags, not remove flags set by Rust's options.
725
+ /// This option overwrites any previously set custom flags.
726
+ ///
727
+ /// # Examples
728
+ ///
729
+ /// ```no_run
730
+ /// use windows_sys::Win32::Storage::FileSystem::FILE_FLAG_DELETE_ON_CLOSE;
731
+ /// use tokio::fs::OpenOptions;
732
+ ///
733
+ /// # #[tokio::main]
734
+ /// # async fn main() -> std::io::Result<()> {
735
+ /// let file = OpenOptions::new()
736
+ /// .create(true)
737
+ /// .write(true)
738
+ /// .custom_flags(FILE_FLAG_DELETE_ON_CLOSE)
739
+ /// .open("foo.txt").await?;
740
+ /// # Ok(())
741
+ /// # }
742
+ /// ```
743
+ ///
744
+ /// [`CreateFile`]: https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilea
745
+ /// [`CreateFile2`]: https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfile2
746
+ pub fn custom_flags(&mut self, flags: u32) -> &mut OpenOptions {
747
+ self.as_inner_mut().custom_flags(flags);
748
+ self
749
+ }
750
+
751
+ /// Sets the `dwFileAttributes` argument to the call to [`CreateFile2`] to
752
+ /// the specified value (or combines it with `custom_flags` and
753
+ /// `security_qos_flags` to set the `dwFlagsAndAttributes` for
754
+ /// [`CreateFile`]).
755
+ ///
756
+ /// If a _new_ file is created because it does not yet exist and
757
+ /// `.create(true)` or `.create_new(true)` are specified, the new file is
758
+ /// given the attributes declared with `.attributes()`.
759
+ ///
760
+ /// If an _existing_ file is opened with `.create(true).truncate(true)`, its
761
+ /// existing attributes are preserved and combined with the ones declared
762
+ /// with `.attributes()`.
763
+ ///
764
+ /// In all other cases the attributes get ignored.
765
+ ///
766
+ /// # Examples
767
+ ///
768
+ /// ```no_run
769
+ /// use windows_sys::Win32::Storage::FileSystem::FILE_ATTRIBUTE_HIDDEN;
770
+ /// use tokio::fs::OpenOptions;
771
+ ///
772
+ /// # #[tokio::main]
773
+ /// # async fn main() -> std::io::Result<()> {
774
+ /// let file = OpenOptions::new()
775
+ /// .write(true)
776
+ /// .create(true)
777
+ /// .attributes(FILE_ATTRIBUTE_HIDDEN)
778
+ /// .open("foo.txt").await?;
779
+ /// # Ok(())
780
+ /// # }
781
+ /// ```
782
+ ///
783
+ /// [`CreateFile`]: https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilea
784
+ /// [`CreateFile2`]: https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfile2
785
+ pub fn attributes(&mut self, attributes: u32) -> &mut OpenOptions {
786
+ self.as_inner_mut().attributes(attributes);
787
+ self
788
+ }
789
+
790
+ /// Sets the `dwSecurityQosFlags` argument to the call to [`CreateFile2`] to
791
+ /// the specified value (or combines it with `custom_flags` and `attributes`
792
+ /// to set the `dwFlagsAndAttributes` for [`CreateFile`]).
793
+ ///
794
+ /// By default `security_qos_flags` is not set. It should be specified when
795
+ /// opening a named pipe, to control to which degree a server process can
796
+ /// act on behalf of a client process (security impersonation level).
797
+ ///
798
+ /// When `security_qos_flags` is not set, a malicious program can gain the
799
+ /// elevated privileges of a privileged Rust process when it allows opening
800
+ /// user-specified paths, by tricking it into opening a named pipe. So
801
+ /// arguably `security_qos_flags` should also be set when opening arbitrary
802
+ /// paths. However the bits can then conflict with other flags, specifically
803
+ /// `FILE_FLAG_OPEN_NO_RECALL`.
804
+ ///
805
+ /// For information about possible values, see [Impersonation Levels] on the
806
+ /// Windows Dev Center site. The `SECURITY_SQOS_PRESENT` flag is set
807
+ /// automatically when using this method.
808
+ ///
809
+ /// # Examples
810
+ ///
811
+ /// ```no_run
812
+ /// use windows_sys::Win32::Storage::FileSystem::SECURITY_IDENTIFICATION;
813
+ /// use tokio::fs::OpenOptions;
814
+ ///
815
+ /// # #[tokio::main]
816
+ /// # async fn main() -> std::io::Result<()> {
817
+ /// let file = OpenOptions::new()
818
+ /// .write(true)
819
+ /// .create(true)
820
+ ///
821
+ /// // Sets the flag value to `SecurityIdentification`.
822
+ /// .security_qos_flags(SECURITY_IDENTIFICATION)
823
+ ///
824
+ /// .open(r"\\.\pipe\MyPipe").await?;
825
+ /// # Ok(())
826
+ /// # }
827
+ /// ```
828
+ ///
829
+ /// [`CreateFile`]: https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilea
830
+ /// [`CreateFile2`]: https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfile2
831
+ /// [Impersonation Levels]:
832
+ /// https://docs.microsoft.com/en-us/windows/win32/api/winnt/ne-winnt-security_impersonation_level
833
+ pub fn security_qos_flags(&mut self, flags: u32) -> &mut OpenOptions {
834
+ self.as_inner_mut().security_qos_flags(flags);
835
+ self
836
+ }
837
+ }
838
+ }
839
+
840
+ impl From<StdOpenOptions> for OpenOptions {
841
+ fn from(options: StdOpenOptions) -> OpenOptions {
842
+ OpenOptions {
843
+ inner: Kind::Std(options),
844
+ // TODO: Add support for converting `StdOpenOptions` to `UringOpenOptions`
845
+ // if user enables `io-uring` cargo feature. It is blocked by:
846
+ // * https://github.com/rust-lang/rust/issues/74943
847
+ // * https://github.com/rust-lang/rust/issues/76801
848
+ }
849
+ }
850
+ }
851
+
852
+ impl Default for OpenOptions {
853
+ fn default() -> Self {
854
+ Self::new()
855
+ }
856
+ }