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