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,630 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from functools import wraps
|
|
4
|
+
from typing import (
|
|
5
|
+
TYPE_CHECKING,
|
|
6
|
+
Any,
|
|
7
|
+
Literal,
|
|
8
|
+
Self,
|
|
9
|
+
cast,
|
|
10
|
+
overload,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
import numpy as np
|
|
14
|
+
|
|
15
|
+
from pandas._libs import lib
|
|
16
|
+
from pandas._libs.arrays import NDArrayBacked
|
|
17
|
+
from pandas._libs.tslibs import is_supported_dtype
|
|
18
|
+
from pandas.errors import AbstractMethodError
|
|
19
|
+
from pandas.util._validators import (
|
|
20
|
+
validate_bool_kwarg,
|
|
21
|
+
validate_insert_loc,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
from pandas.core.dtypes.cast import construct_1d_object_array_from_listlike
|
|
25
|
+
from pandas.core.dtypes.common import pandas_dtype
|
|
26
|
+
from pandas.core.dtypes.dtypes import (
|
|
27
|
+
DatetimeTZDtype,
|
|
28
|
+
ExtensionDtype,
|
|
29
|
+
PeriodDtype,
|
|
30
|
+
)
|
|
31
|
+
from pandas.core.dtypes.missing import array_equivalent
|
|
32
|
+
|
|
33
|
+
from pandas.core import missing
|
|
34
|
+
from pandas.core.algorithms import (
|
|
35
|
+
take,
|
|
36
|
+
unique,
|
|
37
|
+
value_counts_internal as value_counts,
|
|
38
|
+
)
|
|
39
|
+
from pandas.core.array_algos.quantile import quantile_with_mask
|
|
40
|
+
from pandas.core.array_algos.transforms import shift
|
|
41
|
+
from pandas.core.arrays.base import ExtensionArray
|
|
42
|
+
from pandas.core.construction import extract_array
|
|
43
|
+
from pandas.core.indexers import (
|
|
44
|
+
check_array_indexer,
|
|
45
|
+
getitem_returns_view,
|
|
46
|
+
)
|
|
47
|
+
from pandas.core.sorting import nargminmax
|
|
48
|
+
|
|
49
|
+
if TYPE_CHECKING:
|
|
50
|
+
from collections.abc import Sequence
|
|
51
|
+
|
|
52
|
+
from pandas._typing import (
|
|
53
|
+
ArrayLike,
|
|
54
|
+
AxisInt,
|
|
55
|
+
Dtype,
|
|
56
|
+
F,
|
|
57
|
+
FillnaOptions,
|
|
58
|
+
NumpySorter,
|
|
59
|
+
NumpyValueArrayLike,
|
|
60
|
+
PositionalIndexer2D,
|
|
61
|
+
PositionalIndexerTuple,
|
|
62
|
+
ScalarIndexer,
|
|
63
|
+
SequenceIndexer,
|
|
64
|
+
Shape,
|
|
65
|
+
TakeIndexer,
|
|
66
|
+
npt,
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
from pandas import Series
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def ravel_compat(meth: F) -> F:
|
|
73
|
+
"""
|
|
74
|
+
Decorator to ravel a 2D array before passing it to a cython operation,
|
|
75
|
+
then reshape the result to our own shape.
|
|
76
|
+
"""
|
|
77
|
+
|
|
78
|
+
@wraps(meth)
|
|
79
|
+
def method(self, *args, **kwargs):
|
|
80
|
+
if self.ndim == 1:
|
|
81
|
+
return meth(self, *args, **kwargs)
|
|
82
|
+
|
|
83
|
+
flags = self._ndarray.flags
|
|
84
|
+
flat = self.ravel("K")
|
|
85
|
+
result = meth(flat, *args, **kwargs)
|
|
86
|
+
order = "F" if flags.f_contiguous else "C"
|
|
87
|
+
return result.reshape(self.shape, order=order)
|
|
88
|
+
|
|
89
|
+
return cast("F", method)
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
class NDArrayBackedExtensionArray(NDArrayBacked, ExtensionArray):
|
|
93
|
+
"""
|
|
94
|
+
ExtensionArray that is backed by a single NumPy ndarray.
|
|
95
|
+
"""
|
|
96
|
+
|
|
97
|
+
_ndarray: np.ndarray
|
|
98
|
+
|
|
99
|
+
# scalar used to denote NA value inside our self._ndarray, e.g. -1
|
|
100
|
+
# for Categorical, iNaT for Period. Outside of object dtype,
|
|
101
|
+
# self.isna() should be exactly locations in self._ndarray with
|
|
102
|
+
# _internal_fill_value.
|
|
103
|
+
_internal_fill_value: Any
|
|
104
|
+
|
|
105
|
+
def _box_func(self, x):
|
|
106
|
+
"""
|
|
107
|
+
Wrap numpy type in our dtype.type if necessary.
|
|
108
|
+
"""
|
|
109
|
+
return x
|
|
110
|
+
|
|
111
|
+
def _validate_scalar(self, value):
|
|
112
|
+
# used by NDArrayBackedExtensionIndex.insert
|
|
113
|
+
raise AbstractMethodError(self)
|
|
114
|
+
|
|
115
|
+
# ------------------------------------------------------------------------
|
|
116
|
+
|
|
117
|
+
@overload
|
|
118
|
+
def view(self, dtype: None = ...) -> Self: ...
|
|
119
|
+
|
|
120
|
+
@overload
|
|
121
|
+
def view(self, dtype: Dtype | None = ...) -> ArrayLike: ...
|
|
122
|
+
|
|
123
|
+
def view(self, dtype: Dtype | None = None) -> ArrayLike:
|
|
124
|
+
# We handle datetime64, datetime64tz, timedelta64, and period
|
|
125
|
+
# dtypes here. Everything else we pass through to the underlying
|
|
126
|
+
# ndarray.
|
|
127
|
+
if dtype is None or dtype is self.dtype:
|
|
128
|
+
return self._from_backing_data(self._ndarray)
|
|
129
|
+
|
|
130
|
+
if isinstance(dtype, type):
|
|
131
|
+
# we sometimes pass non-dtype objects, e.g np.ndarray;
|
|
132
|
+
# pass those through to the underlying ndarray
|
|
133
|
+
return self._ndarray.view(dtype)
|
|
134
|
+
|
|
135
|
+
dtype = pandas_dtype(dtype)
|
|
136
|
+
arr = self._ndarray
|
|
137
|
+
|
|
138
|
+
if isinstance(dtype, PeriodDtype):
|
|
139
|
+
cls = dtype.construct_array_type()
|
|
140
|
+
return cls(arr.view("i8"), dtype=dtype)
|
|
141
|
+
elif isinstance(dtype, DatetimeTZDtype):
|
|
142
|
+
dt_cls = dtype.construct_array_type()
|
|
143
|
+
dt64_values = arr.view(f"M8[{dtype.unit}]")
|
|
144
|
+
return dt_cls._simple_new(dt64_values, dtype=dtype)
|
|
145
|
+
elif lib.is_np_dtype(dtype, "M") and is_supported_dtype(dtype):
|
|
146
|
+
from pandas.core.arrays import DatetimeArray
|
|
147
|
+
|
|
148
|
+
dt64_values = arr.view(dtype)
|
|
149
|
+
return DatetimeArray._simple_new(dt64_values, dtype=dtype)
|
|
150
|
+
elif lib.is_np_dtype(dtype, "m") and is_supported_dtype(dtype):
|
|
151
|
+
from pandas.core.arrays import TimedeltaArray
|
|
152
|
+
|
|
153
|
+
td64_values = arr.view(dtype)
|
|
154
|
+
return TimedeltaArray._simple_new(td64_values, dtype=dtype)
|
|
155
|
+
# error: Argument "dtype" to "view" of "ndarray" has incompatible type
|
|
156
|
+
# "ExtensionDtype | dtype[Any]"; expected "dtype[Any] | _HasDType[dtype[Any]]"
|
|
157
|
+
return arr.view(dtype=dtype) # type: ignore[arg-type]
|
|
158
|
+
|
|
159
|
+
def take(
|
|
160
|
+
self,
|
|
161
|
+
indices: TakeIndexer,
|
|
162
|
+
*,
|
|
163
|
+
allow_fill: bool = False,
|
|
164
|
+
fill_value: Any = None,
|
|
165
|
+
axis: AxisInt = 0,
|
|
166
|
+
) -> Self:
|
|
167
|
+
if allow_fill:
|
|
168
|
+
fill_value = self._validate_scalar(fill_value)
|
|
169
|
+
|
|
170
|
+
new_data = take(
|
|
171
|
+
self._ndarray,
|
|
172
|
+
indices,
|
|
173
|
+
allow_fill=allow_fill,
|
|
174
|
+
fill_value=fill_value,
|
|
175
|
+
axis=axis,
|
|
176
|
+
)
|
|
177
|
+
return self._from_backing_data(new_data)
|
|
178
|
+
|
|
179
|
+
# ------------------------------------------------------------------------
|
|
180
|
+
|
|
181
|
+
def equals(self, other) -> bool:
|
|
182
|
+
if type(self) is not type(other):
|
|
183
|
+
return False
|
|
184
|
+
if self.dtype != other.dtype:
|
|
185
|
+
return False
|
|
186
|
+
return bool(array_equivalent(self._ndarray, other._ndarray, dtype_equal=True))
|
|
187
|
+
|
|
188
|
+
@classmethod
|
|
189
|
+
def _from_factorized(cls, values, original):
|
|
190
|
+
assert values.dtype == original._ndarray.dtype
|
|
191
|
+
return original._from_backing_data(values)
|
|
192
|
+
|
|
193
|
+
def _values_for_argsort(self) -> np.ndarray:
|
|
194
|
+
return self._ndarray
|
|
195
|
+
|
|
196
|
+
def _values_for_factorize(self):
|
|
197
|
+
return self._ndarray, self._internal_fill_value
|
|
198
|
+
|
|
199
|
+
def _hash_pandas_object(
|
|
200
|
+
self, *, encoding: str, hash_key: str, categorize: bool
|
|
201
|
+
) -> npt.NDArray[np.uint64]:
|
|
202
|
+
from pandas.core.util.hashing import hash_array
|
|
203
|
+
|
|
204
|
+
values = self._ndarray
|
|
205
|
+
return hash_array(
|
|
206
|
+
values, encoding=encoding, hash_key=hash_key, categorize=categorize
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
def _cast_pointwise_result(self, values: ArrayLike) -> ArrayLike:
|
|
210
|
+
if not (isinstance(values, np.ndarray) and values.dtype == object):
|
|
211
|
+
values = construct_1d_object_array_from_listlike(values) # type: ignore[arg-type]
|
|
212
|
+
return lib.maybe_convert_objects(values, convert_non_numeric=True)
|
|
213
|
+
|
|
214
|
+
# Signature of "argmin" incompatible with supertype "ExtensionArray"
|
|
215
|
+
def argmin(self, axis: AxisInt = 0, skipna: bool = True): # type: ignore[override]
|
|
216
|
+
# override base class by adding axis keyword
|
|
217
|
+
validate_bool_kwarg(skipna, "skipna")
|
|
218
|
+
if not skipna and self._hasna:
|
|
219
|
+
raise ValueError("Encountered an NA value with skipna=False")
|
|
220
|
+
return nargminmax(self, "argmin", axis=axis)
|
|
221
|
+
|
|
222
|
+
# Signature of "argmax" incompatible with supertype "ExtensionArray"
|
|
223
|
+
def argmax(self, axis: AxisInt = 0, skipna: bool = True): # type: ignore[override]
|
|
224
|
+
# override base class by adding axis keyword
|
|
225
|
+
validate_bool_kwarg(skipna, "skipna")
|
|
226
|
+
if not skipna and self._hasna:
|
|
227
|
+
raise ValueError("Encountered an NA value with skipna=False")
|
|
228
|
+
return nargminmax(self, "argmax", axis=axis)
|
|
229
|
+
|
|
230
|
+
def unique(self) -> Self:
|
|
231
|
+
new_data = unique(self._ndarray)
|
|
232
|
+
return self._from_backing_data(new_data)
|
|
233
|
+
|
|
234
|
+
@classmethod
|
|
235
|
+
def _concat_same_type(
|
|
236
|
+
cls,
|
|
237
|
+
to_concat: Sequence[Self],
|
|
238
|
+
axis: AxisInt = 0,
|
|
239
|
+
) -> Self:
|
|
240
|
+
"""
|
|
241
|
+
Concatenate multiple arrays of this dtype.
|
|
242
|
+
|
|
243
|
+
Parameters
|
|
244
|
+
----------
|
|
245
|
+
to_concat : sequence of this type
|
|
246
|
+
|
|
247
|
+
Returns
|
|
248
|
+
-------
|
|
249
|
+
ExtensionArray
|
|
250
|
+
"""
|
|
251
|
+
if not lib.dtypes_all_equal([x.dtype for x in to_concat]):
|
|
252
|
+
dtypes = {str(x.dtype) for x in to_concat}
|
|
253
|
+
raise ValueError("to_concat must have the same dtype", dtypes)
|
|
254
|
+
|
|
255
|
+
return super()._concat_same_type(to_concat, axis=axis)
|
|
256
|
+
|
|
257
|
+
def searchsorted(
|
|
258
|
+
self,
|
|
259
|
+
value: NumpyValueArrayLike | ExtensionArray,
|
|
260
|
+
side: Literal["left", "right"] = "left",
|
|
261
|
+
sorter: NumpySorter | None = None,
|
|
262
|
+
) -> npt.NDArray[np.intp] | np.intp:
|
|
263
|
+
"""
|
|
264
|
+
Find indices where elements should be inserted to maintain order.
|
|
265
|
+
|
|
266
|
+
Find the indices into a sorted array `self` (a) such that, if the
|
|
267
|
+
corresponding elements in `value` were inserted before the indices,
|
|
268
|
+
the order of `self` would be preserved.
|
|
269
|
+
|
|
270
|
+
Assuming that `self` is sorted:
|
|
271
|
+
|
|
272
|
+
====== ================================
|
|
273
|
+
`side` returned index `i` satisfies
|
|
274
|
+
====== ================================
|
|
275
|
+
left ``self[i-1] < value <= self[i]``
|
|
276
|
+
right ``self[i-1] <= value < self[i]``
|
|
277
|
+
====== ================================
|
|
278
|
+
|
|
279
|
+
Parameters
|
|
280
|
+
----------
|
|
281
|
+
value : array-like, list or scalar
|
|
282
|
+
Value(s) to insert into `self`.
|
|
283
|
+
side : {'left', 'right'}, optional
|
|
284
|
+
If 'left', the index of the first suitable location found is given.
|
|
285
|
+
If 'right', return the last such index. If there is no suitable
|
|
286
|
+
index, return either 0 or N (where N is the length of `self`).
|
|
287
|
+
sorter : 1-D array-like, optional
|
|
288
|
+
Optional array of integer indices that sort array a into ascending
|
|
289
|
+
order. They are typically the result of argsort.
|
|
290
|
+
|
|
291
|
+
Returns
|
|
292
|
+
-------
|
|
293
|
+
array of ints or int
|
|
294
|
+
If value is array-like, array of insertion points.
|
|
295
|
+
If value is scalar, a single integer.
|
|
296
|
+
|
|
297
|
+
See Also
|
|
298
|
+
--------
|
|
299
|
+
numpy.searchsorted : Similar method from NumPy.
|
|
300
|
+
"""
|
|
301
|
+
npvalue = self._validate_setitem_value(value)
|
|
302
|
+
return self._ndarray.searchsorted(npvalue, side=side, sorter=sorter)
|
|
303
|
+
|
|
304
|
+
def shift(self, periods: int = 1, fill_value=None) -> Self:
|
|
305
|
+
"""
|
|
306
|
+
Shift values by desired number.
|
|
307
|
+
|
|
308
|
+
Newly introduced missing values are filled with
|
|
309
|
+
``self.dtype.na_value``.
|
|
310
|
+
|
|
311
|
+
Parameters
|
|
312
|
+
----------
|
|
313
|
+
periods : int, default 1
|
|
314
|
+
The number of periods to shift. Negative values are allowed
|
|
315
|
+
for shifting backwards.
|
|
316
|
+
|
|
317
|
+
fill_value : object, optional
|
|
318
|
+
The scalar value to use for newly introduced missing values.
|
|
319
|
+
The default is ``self.dtype.na_value``.
|
|
320
|
+
|
|
321
|
+
Returns
|
|
322
|
+
-------
|
|
323
|
+
ExtensionArray
|
|
324
|
+
Shifted.
|
|
325
|
+
|
|
326
|
+
Notes
|
|
327
|
+
-----
|
|
328
|
+
If ``self`` is empty or ``periods`` is 0, a copy of ``self`` is
|
|
329
|
+
returned.
|
|
330
|
+
|
|
331
|
+
If ``periods > len(self)``, then an array of size
|
|
332
|
+
len(self) is returned, with all values filled with
|
|
333
|
+
``self.dtype.na_value``.
|
|
334
|
+
"""
|
|
335
|
+
# NB: shift is always along axis=self.ndim-1
|
|
336
|
+
fill_value = self._validate_scalar(fill_value)
|
|
337
|
+
new_values = shift(self._ndarray, periods, fill_value)
|
|
338
|
+
|
|
339
|
+
return self._from_backing_data(new_values)
|
|
340
|
+
|
|
341
|
+
def __setitem__(self, key, value) -> None:
|
|
342
|
+
if self._readonly:
|
|
343
|
+
raise ValueError("Cannot modify read-only array")
|
|
344
|
+
|
|
345
|
+
key = check_array_indexer(self, key)
|
|
346
|
+
value = self._validate_setitem_value(value)
|
|
347
|
+
self._ndarray[key] = value
|
|
348
|
+
|
|
349
|
+
def _validate_setitem_value(self, value):
|
|
350
|
+
return value
|
|
351
|
+
|
|
352
|
+
@overload
|
|
353
|
+
def __getitem__(self, key: ScalarIndexer) -> Any: ...
|
|
354
|
+
|
|
355
|
+
@overload
|
|
356
|
+
def __getitem__(
|
|
357
|
+
self,
|
|
358
|
+
key: SequenceIndexer | PositionalIndexerTuple,
|
|
359
|
+
) -> Self: ...
|
|
360
|
+
|
|
361
|
+
def __getitem__(
|
|
362
|
+
self,
|
|
363
|
+
key: PositionalIndexer2D,
|
|
364
|
+
) -> Self | Any:
|
|
365
|
+
if lib.is_integer(key):
|
|
366
|
+
# fast-path
|
|
367
|
+
result = self._ndarray[key]
|
|
368
|
+
if self.ndim == 1:
|
|
369
|
+
return self._box_func(result)
|
|
370
|
+
result = self._from_backing_data(result)
|
|
371
|
+
if getitem_returns_view(self, key):
|
|
372
|
+
result._readonly = self._readonly
|
|
373
|
+
return result
|
|
374
|
+
|
|
375
|
+
# error: Incompatible types in assignment (expression has type "ExtensionArray",
|
|
376
|
+
# variable has type "Union[int, slice, ndarray]")
|
|
377
|
+
key = extract_array(key, extract_numpy=True) # type: ignore[assignment]
|
|
378
|
+
key = check_array_indexer(self, key)
|
|
379
|
+
result = self._ndarray[key]
|
|
380
|
+
if lib.is_scalar(result):
|
|
381
|
+
return self._box_func(result)
|
|
382
|
+
|
|
383
|
+
result = self._from_backing_data(result)
|
|
384
|
+
if getitem_returns_view(self, key):
|
|
385
|
+
result._readonly = self._readonly
|
|
386
|
+
return result
|
|
387
|
+
|
|
388
|
+
def _pad_or_backfill(
|
|
389
|
+
self,
|
|
390
|
+
*,
|
|
391
|
+
method: FillnaOptions,
|
|
392
|
+
limit: int | None = None,
|
|
393
|
+
limit_area: Literal["inside", "outside"] | None = None,
|
|
394
|
+
copy: bool = True,
|
|
395
|
+
) -> Self:
|
|
396
|
+
mask = self.isna()
|
|
397
|
+
if mask.any():
|
|
398
|
+
# (for now) when self.ndim == 2, we assume axis=0
|
|
399
|
+
func = missing.get_fill_func(method, ndim=self.ndim)
|
|
400
|
+
|
|
401
|
+
npvalues = self._ndarray.T
|
|
402
|
+
if copy:
|
|
403
|
+
npvalues = npvalues.copy()
|
|
404
|
+
func(npvalues, limit=limit, limit_area=limit_area, mask=mask.T)
|
|
405
|
+
npvalues = npvalues.T
|
|
406
|
+
|
|
407
|
+
if copy:
|
|
408
|
+
new_values = self._from_backing_data(npvalues)
|
|
409
|
+
else:
|
|
410
|
+
new_values = self
|
|
411
|
+
|
|
412
|
+
elif copy:
|
|
413
|
+
new_values = self.copy()
|
|
414
|
+
else:
|
|
415
|
+
new_values = self
|
|
416
|
+
return new_values
|
|
417
|
+
|
|
418
|
+
def fillna(self, value, limit: int | None = None, copy: bool = True) -> Self:
|
|
419
|
+
"""
|
|
420
|
+
Fill NA/NaN values using the specified method.
|
|
421
|
+
|
|
422
|
+
Parameters
|
|
423
|
+
----------
|
|
424
|
+
value : scalar, array-like
|
|
425
|
+
If a scalar value is passed it is used to fill all missing values.
|
|
426
|
+
Alternatively, an array-like 'value' can be given. It's expected
|
|
427
|
+
that the array-like have the same length as 'self'.
|
|
428
|
+
limit : int, default None
|
|
429
|
+
The maximum number of entries along the entire axis where NaNs will be
|
|
430
|
+
filled.
|
|
431
|
+
|
|
432
|
+
Returns
|
|
433
|
+
-------
|
|
434
|
+
ExtensionArray
|
|
435
|
+
With NA/NaN filled.
|
|
436
|
+
"""
|
|
437
|
+
mask = self.isna()
|
|
438
|
+
if limit is not None and limit < len(self):
|
|
439
|
+
# mypy doesn't like that mask can be an EA which need not have `cumsum`
|
|
440
|
+
modify = mask.cumsum() > limit # type: ignore[union-attr]
|
|
441
|
+
if modify.any():
|
|
442
|
+
# Only copy mask if necessary
|
|
443
|
+
mask = mask.copy()
|
|
444
|
+
mask[modify] = False
|
|
445
|
+
# error: Argument 2 to "check_value_size" has incompatible type
|
|
446
|
+
# "ExtensionArray"; expected "ndarray"
|
|
447
|
+
value = missing.check_value_size(
|
|
448
|
+
value,
|
|
449
|
+
mask, # type: ignore[arg-type]
|
|
450
|
+
len(self),
|
|
451
|
+
)
|
|
452
|
+
|
|
453
|
+
if mask.any():
|
|
454
|
+
# fill with value
|
|
455
|
+
if copy:
|
|
456
|
+
new_values = self.copy()
|
|
457
|
+
else:
|
|
458
|
+
new_values = self[:]
|
|
459
|
+
new_values[mask] = value
|
|
460
|
+
else:
|
|
461
|
+
# We validate the fill_value even if there is nothing to fill
|
|
462
|
+
self._validate_setitem_value(value)
|
|
463
|
+
|
|
464
|
+
if not copy:
|
|
465
|
+
new_values = self[:]
|
|
466
|
+
else:
|
|
467
|
+
new_values = self.copy()
|
|
468
|
+
return new_values
|
|
469
|
+
|
|
470
|
+
# ------------------------------------------------------------------------
|
|
471
|
+
# Reductions
|
|
472
|
+
|
|
473
|
+
def _wrap_reduction_result(self, axis: AxisInt | None, result) -> Any:
|
|
474
|
+
if axis is None or self.ndim == 1:
|
|
475
|
+
return self._box_func(result)
|
|
476
|
+
return self._from_backing_data(result)
|
|
477
|
+
|
|
478
|
+
# ------------------------------------------------------------------------
|
|
479
|
+
# __array_function__ methods
|
|
480
|
+
|
|
481
|
+
def _putmask(self, mask: npt.NDArray[np.bool_], value) -> None:
|
|
482
|
+
"""
|
|
483
|
+
Analogue to np.putmask(self, mask, value)
|
|
484
|
+
|
|
485
|
+
Parameters
|
|
486
|
+
----------
|
|
487
|
+
mask : np.ndarray[bool]
|
|
488
|
+
value : scalar or listlike
|
|
489
|
+
|
|
490
|
+
Raises
|
|
491
|
+
------
|
|
492
|
+
TypeError
|
|
493
|
+
If value cannot be cast to self.dtype.
|
|
494
|
+
"""
|
|
495
|
+
value = self._validate_setitem_value(value)
|
|
496
|
+
|
|
497
|
+
np.putmask(self._ndarray, mask, value)
|
|
498
|
+
|
|
499
|
+
def _where(self: Self, mask: npt.NDArray[np.bool_], value) -> Self:
|
|
500
|
+
"""
|
|
501
|
+
Analogue to np.where(mask, self, value)
|
|
502
|
+
|
|
503
|
+
Parameters
|
|
504
|
+
----------
|
|
505
|
+
mask : np.ndarray[bool]
|
|
506
|
+
value : scalar or listlike
|
|
507
|
+
|
|
508
|
+
Raises
|
|
509
|
+
------
|
|
510
|
+
TypeError
|
|
511
|
+
If value cannot be cast to self.dtype.
|
|
512
|
+
"""
|
|
513
|
+
value = self._validate_setitem_value(value)
|
|
514
|
+
|
|
515
|
+
res_values = np.where(mask, self._ndarray, value)
|
|
516
|
+
if res_values.dtype != self._ndarray.dtype:
|
|
517
|
+
raise AssertionError(
|
|
518
|
+
# GH#56410
|
|
519
|
+
"Something has gone wrong, please report a bug at "
|
|
520
|
+
"github.com/pandas-dev/pandas/"
|
|
521
|
+
)
|
|
522
|
+
return self._from_backing_data(res_values)
|
|
523
|
+
|
|
524
|
+
# ------------------------------------------------------------------------
|
|
525
|
+
# Index compat methods
|
|
526
|
+
|
|
527
|
+
def insert(self, loc: int, item) -> Self:
|
|
528
|
+
"""
|
|
529
|
+
Make new ExtensionArray inserting new item at location. Follows
|
|
530
|
+
Python list.append semantics for negative values.
|
|
531
|
+
|
|
532
|
+
Parameters
|
|
533
|
+
----------
|
|
534
|
+
loc : int
|
|
535
|
+
item : object
|
|
536
|
+
|
|
537
|
+
Returns
|
|
538
|
+
-------
|
|
539
|
+
type(self)
|
|
540
|
+
"""
|
|
541
|
+
loc = validate_insert_loc(loc, len(self))
|
|
542
|
+
|
|
543
|
+
code = self._validate_scalar(item)
|
|
544
|
+
|
|
545
|
+
new_vals = np.concatenate(
|
|
546
|
+
(
|
|
547
|
+
self._ndarray[:loc],
|
|
548
|
+
np.asarray([code], dtype=self._ndarray.dtype),
|
|
549
|
+
self._ndarray[loc:],
|
|
550
|
+
)
|
|
551
|
+
)
|
|
552
|
+
return self._from_backing_data(new_vals)
|
|
553
|
+
|
|
554
|
+
# ------------------------------------------------------------------------
|
|
555
|
+
# Additional array methods
|
|
556
|
+
# These are not part of the EA API, but we implement them because
|
|
557
|
+
# pandas assumes they're there.
|
|
558
|
+
|
|
559
|
+
def value_counts(self, dropna: bool = True) -> Series:
|
|
560
|
+
"""
|
|
561
|
+
Return a Series containing counts of unique values.
|
|
562
|
+
|
|
563
|
+
Parameters
|
|
564
|
+
----------
|
|
565
|
+
dropna : bool, default True
|
|
566
|
+
Don't include counts of NA values.
|
|
567
|
+
|
|
568
|
+
Returns
|
|
569
|
+
-------
|
|
570
|
+
Series
|
|
571
|
+
"""
|
|
572
|
+
if self.ndim != 1:
|
|
573
|
+
raise NotImplementedError
|
|
574
|
+
|
|
575
|
+
from pandas import (
|
|
576
|
+
Index,
|
|
577
|
+
Series,
|
|
578
|
+
)
|
|
579
|
+
|
|
580
|
+
if dropna:
|
|
581
|
+
# error: Invalid index type
|
|
582
|
+
values = self[~self.isna()]._ndarray # type: ignore[index]
|
|
583
|
+
else:
|
|
584
|
+
values = self._ndarray
|
|
585
|
+
|
|
586
|
+
result = value_counts(values, sort=False, dropna=dropna)
|
|
587
|
+
|
|
588
|
+
index_arr = self._from_backing_data(np.asarray(result.index._data))
|
|
589
|
+
index = Index(index_arr, name=result.index.name, copy=False)
|
|
590
|
+
return Series(result._values, index=index, name=result.name, copy=False)
|
|
591
|
+
|
|
592
|
+
def _quantile(
|
|
593
|
+
self,
|
|
594
|
+
qs: npt.NDArray[np.float64],
|
|
595
|
+
interpolation: str,
|
|
596
|
+
) -> Self:
|
|
597
|
+
# TODO: disable for Categorical if not ordered?
|
|
598
|
+
|
|
599
|
+
mask = np.asarray(self.isna())
|
|
600
|
+
arr = self._ndarray
|
|
601
|
+
fill_value = self._internal_fill_value
|
|
602
|
+
|
|
603
|
+
res_values = quantile_with_mask(arr, mask, fill_value, qs, interpolation)
|
|
604
|
+
if res_values.dtype == self._ndarray.dtype:
|
|
605
|
+
return self._from_backing_data(res_values)
|
|
606
|
+
else:
|
|
607
|
+
# e.g. test_quantile_empty we are empty integer dtype and res_values
|
|
608
|
+
# has floating dtype
|
|
609
|
+
# TODO: technically __init__ isn't defined here.
|
|
610
|
+
# Should we raise NotImplementedError and handle this on NumpyEA?
|
|
611
|
+
return type(self)(res_values) # type: ignore[call-arg]
|
|
612
|
+
|
|
613
|
+
# ------------------------------------------------------------------------
|
|
614
|
+
# numpy-like methods
|
|
615
|
+
|
|
616
|
+
@classmethod
|
|
617
|
+
def _empty(cls, shape: Shape, dtype: ExtensionDtype) -> Self:
|
|
618
|
+
"""
|
|
619
|
+
Analogous to np.empty(shape, dtype=dtype)
|
|
620
|
+
|
|
621
|
+
Parameters
|
|
622
|
+
----------
|
|
623
|
+
shape : tuple[int]
|
|
624
|
+
dtype : ExtensionDtype
|
|
625
|
+
"""
|
|
626
|
+
# The base implementation uses a naive approach to find the dtype
|
|
627
|
+
# for the backing ndarray
|
|
628
|
+
arr = cls._from_sequence([], dtype=dtype)
|
|
629
|
+
backing = np.empty(shape, dtype=arr._ndarray.dtype)
|
|
630
|
+
return arr._from_backing_data(backing)
|