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,393 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ONNX offline summarization provider.
|
|
3
|
+
*
|
|
4
|
+
* Model: Xenova/distilbart-cnn-6-6 (seq2seq summarization, ~300MB)
|
|
5
|
+
* Download: bun run install-onnx-model
|
|
6
|
+
* Model dir: ~/.ashlr/models/distilbart/
|
|
7
|
+
*
|
|
8
|
+
* Requires onnxruntime-node (optional dependency):
|
|
9
|
+
* bun add onnxruntime-node # or: npm install onnxruntime-node
|
|
10
|
+
*
|
|
11
|
+
* Architecture: encoder-decoder (seq2seq). We run the encoder once, then
|
|
12
|
+
* autoregressively decode with greedy search until EOS or max_new_tokens.
|
|
13
|
+
*
|
|
14
|
+
* Tokenizer: BPE via a minimal implementation that covers the distilbart
|
|
15
|
+
* vocabulary. The full tokenizer.json is loaded from the model directory so
|
|
16
|
+
* we don't bundle vocab files at install time.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { existsSync, statSync } from "fs";
|
|
20
|
+
import { readFile } from "fs/promises";
|
|
21
|
+
import { homedir } from "os";
|
|
22
|
+
import { join } from "path";
|
|
23
|
+
import type { LlmProvider, LlmSummarizeResult } from "./types.ts";
|
|
24
|
+
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// Paths
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
|
|
29
|
+
function home(): string {
|
|
30
|
+
return process.env.HOME ?? homedir();
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function modelDir(): string {
|
|
34
|
+
return join(home(), ".ashlr", "models", "distilbart");
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function modelFiles() {
|
|
38
|
+
const base = modelDir();
|
|
39
|
+
return {
|
|
40
|
+
encoderOnnx: join(base, "onnx", "encoder_model.onnx"),
|
|
41
|
+
decoderOnnx: join(base, "onnx", "decoder_model_merged.onnx"),
|
|
42
|
+
tokenizerJson: join(base, "tokenizer.json"),
|
|
43
|
+
configJson: join(base, "config.json"),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// ---------------------------------------------------------------------------
|
|
48
|
+
// Availability
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
|
|
51
|
+
function isOnnxRuntimeInstalled(): boolean {
|
|
52
|
+
try {
|
|
53
|
+
require("onnxruntime-node");
|
|
54
|
+
return true;
|
|
55
|
+
} catch {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function isModelPresent(): boolean {
|
|
61
|
+
const files = modelFiles();
|
|
62
|
+
return (
|
|
63
|
+
existsSync(files.encoderOnnx) &&
|
|
64
|
+
existsSync(files.decoderOnnx) &&
|
|
65
|
+
existsSync(files.tokenizerJson)
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** Returns combined size of ONNX model files in bytes, or null if not present. */
|
|
70
|
+
export function modelSizeBytes(): number | null {
|
|
71
|
+
const files = modelFiles();
|
|
72
|
+
const paths = [files.encoderOnnx, files.decoderOnnx, files.tokenizerJson, files.configJson];
|
|
73
|
+
let total = 0;
|
|
74
|
+
for (const p of paths) {
|
|
75
|
+
if (!existsSync(p)) return null;
|
|
76
|
+
try {
|
|
77
|
+
total += statSync(p).size;
|
|
78
|
+
} catch {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return total;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// ---------------------------------------------------------------------------
|
|
86
|
+
// Minimal BPE tokenizer (loads vocab from tokenizer.json)
|
|
87
|
+
// ---------------------------------------------------------------------------
|
|
88
|
+
|
|
89
|
+
interface TokenizerData {
|
|
90
|
+
model?: {
|
|
91
|
+
vocab?: Record<string, number>;
|
|
92
|
+
merges?: string[];
|
|
93
|
+
};
|
|
94
|
+
added_tokens?: Array<{ id: number; content: string }>;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
interface Tokenizer {
|
|
98
|
+
encode(text: string): number[];
|
|
99
|
+
decode(ids: number[]): string;
|
|
100
|
+
eosId: number;
|
|
101
|
+
bosId: number;
|
|
102
|
+
padId: number;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
let _tokenizerCache: Tokenizer | null = null;
|
|
106
|
+
|
|
107
|
+
async function loadTokenizer(): Promise<Tokenizer> {
|
|
108
|
+
if (_tokenizerCache) return _tokenizerCache;
|
|
109
|
+
|
|
110
|
+
const raw = await readFile(modelFiles().tokenizerJson, "utf-8");
|
|
111
|
+
const data = JSON.parse(raw) as TokenizerData;
|
|
112
|
+
|
|
113
|
+
const vocab: Record<string, number> = data.model?.vocab ?? {};
|
|
114
|
+
const merges: string[] = data.model?.merges ?? [];
|
|
115
|
+
const idToToken: Record<number, string> = {};
|
|
116
|
+
for (const [tok, id] of Object.entries(vocab)) {
|
|
117
|
+
idToToken[id] = tok;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// BPE merge rules as a priority map: merge_pair -> rank
|
|
121
|
+
const mergeRanks: Map<string, number> = new Map();
|
|
122
|
+
for (let i = 0; i < merges.length; i++) {
|
|
123
|
+
mergeRanks.set(merges[i], i);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Resolve special tokens from added_tokens
|
|
127
|
+
function findSpecialId(content: string): number {
|
|
128
|
+
const entry = data.added_tokens?.find((t) => t.content === content);
|
|
129
|
+
if (entry) return entry.id;
|
|
130
|
+
return vocab[content] ?? -1;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const eosId = findSpecialId("</s>");
|
|
134
|
+
const bosId = findSpecialId("<s>");
|
|
135
|
+
const padId = vocab["<pad>"] ?? eosId;
|
|
136
|
+
|
|
137
|
+
// Byte-level BPE pre-tokenization (GPT-2 style used by distilbart/BART)
|
|
138
|
+
const BYTES_TO_UNICODE: Record<number, string> = (() => {
|
|
139
|
+
const bs: number[] = [];
|
|
140
|
+
const cs: number[] = [];
|
|
141
|
+
for (let i = "!".charCodeAt(0); i <= "~".charCodeAt(0); i++) { bs.push(i); cs.push(i); }
|
|
142
|
+
for (let i = "¡".charCodeAt(0); i <= "¬".charCodeAt(0); i++) { bs.push(i); cs.push(i); }
|
|
143
|
+
for (let i = "®".charCodeAt(0); i <= "ÿ".charCodeAt(0); i++) { bs.push(i); cs.push(i); }
|
|
144
|
+
let n = 0;
|
|
145
|
+
for (let b = 0; b < 256; b++) {
|
|
146
|
+
if (!bs.includes(b)) { bs.push(b); cs.push(256 + n); n++; }
|
|
147
|
+
}
|
|
148
|
+
const map: Record<number, string> = {};
|
|
149
|
+
for (let i = 0; i < bs.length; i++) map[bs[i]] = String.fromCodePoint(cs[i]);
|
|
150
|
+
return map;
|
|
151
|
+
})();
|
|
152
|
+
|
|
153
|
+
function bytesToUnicode(text: string): string {
|
|
154
|
+
const bytes = new TextEncoder().encode(text);
|
|
155
|
+
return Array.from(bytes).map((b) => BYTES_TO_UNICODE[b] ?? String.fromCodePoint(b)).join("");
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function bpeEncode(text: string): number[] {
|
|
159
|
+
// Pre-tokenize: split on whitespace preserving spaces at start of word (GPT-2 style)
|
|
160
|
+
const pattern = /\s?\S+/g;
|
|
161
|
+
const words = text.match(pattern) ?? [];
|
|
162
|
+
const allIds: number[] = [];
|
|
163
|
+
|
|
164
|
+
for (const word of words) {
|
|
165
|
+
const mapped = bytesToUnicode(word);
|
|
166
|
+
let chars = Array.from(mapped);
|
|
167
|
+
|
|
168
|
+
while (chars.length > 1) {
|
|
169
|
+
let bestRank = Infinity;
|
|
170
|
+
let bestIdx = -1;
|
|
171
|
+
for (let i = 0; i < chars.length - 1; i++) {
|
|
172
|
+
const pair = chars[i] + " " + chars[i + 1];
|
|
173
|
+
const rank = mergeRanks.get(pair) ?? Infinity;
|
|
174
|
+
if (rank < bestRank) { bestRank = rank; bestIdx = i; }
|
|
175
|
+
}
|
|
176
|
+
if (bestIdx === -1) break;
|
|
177
|
+
const merged = chars[bestIdx] + chars[bestIdx + 1];
|
|
178
|
+
chars = [...chars.slice(0, bestIdx), merged, ...chars.slice(bestIdx + 2)];
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
for (const tok of chars) {
|
|
182
|
+
const id = vocab[tok];
|
|
183
|
+
if (id !== undefined) allIds.push(id);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
return allIds;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
function decode(ids: number[]): string {
|
|
191
|
+
// Reverse the byte-level encoding
|
|
192
|
+
const unicodeToBytes: Record<string, number> = {};
|
|
193
|
+
for (const [b, u] of Object.entries(BYTES_TO_UNICODE)) {
|
|
194
|
+
unicodeToBytes[u] = Number(b);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
let result = "";
|
|
198
|
+
for (const id of ids) {
|
|
199
|
+
const tok = idToToken[id];
|
|
200
|
+
if (!tok || tok === "</s>" || tok === "<s>" || tok === "<pad>") continue;
|
|
201
|
+
// Decode unicode-escaped bytes back to UTF-8
|
|
202
|
+
const bytes: number[] = [];
|
|
203
|
+
for (const ch of tok) {
|
|
204
|
+
const byte = unicodeToBytes[ch];
|
|
205
|
+
if (byte !== undefined) bytes.push(byte);
|
|
206
|
+
else bytes.push(...new TextEncoder().encode(ch));
|
|
207
|
+
}
|
|
208
|
+
result += new TextDecoder().decode(new Uint8Array(bytes));
|
|
209
|
+
}
|
|
210
|
+
return result;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
_tokenizerCache = {
|
|
214
|
+
encode(text: string): number[] {
|
|
215
|
+
// Add BOS token for BART-style models
|
|
216
|
+
const ids = bpeEncode(text);
|
|
217
|
+
// Prepend BOS, append EOS
|
|
218
|
+
return bosId >= 0 ? [bosId, ...ids, eosId] : [...ids, eosId];
|
|
219
|
+
},
|
|
220
|
+
decode,
|
|
221
|
+
eosId,
|
|
222
|
+
bosId,
|
|
223
|
+
padId,
|
|
224
|
+
};
|
|
225
|
+
|
|
226
|
+
return _tokenizerCache;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/** Reset tokenizer cache (for testing). */
|
|
230
|
+
export function _resetTokenizerCache(): void {
|
|
231
|
+
_tokenizerCache = null;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// ---------------------------------------------------------------------------
|
|
235
|
+
// ONNX inference
|
|
236
|
+
// ---------------------------------------------------------------------------
|
|
237
|
+
|
|
238
|
+
const MAX_INPUT_TOKENS = 512;
|
|
239
|
+
const MAX_NEW_TOKENS = 128;
|
|
240
|
+
|
|
241
|
+
// ort types as seen at runtime — typed as any since onnxruntime-node is optional
|
|
242
|
+
// and not installed during typecheck. The shapes are stable across ort 1.x/2.x.
|
|
243
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
244
|
+
type OrtModule = any;
|
|
245
|
+
|
|
246
|
+
async function runInference(text: string): Promise<string> {
|
|
247
|
+
// Dynamic require — onnxruntime-node is an optional dependency.
|
|
248
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
249
|
+
const ort: OrtModule = require("onnxruntime-node");
|
|
250
|
+
const tokenizer = await loadTokenizer();
|
|
251
|
+
const files = modelFiles();
|
|
252
|
+
|
|
253
|
+
// Encode + truncate input
|
|
254
|
+
let inputIds = tokenizer.encode(text);
|
|
255
|
+
if (inputIds.length > MAX_INPUT_TOKENS) {
|
|
256
|
+
inputIds = inputIds.slice(0, MAX_INPUT_TOKENS - 1);
|
|
257
|
+
inputIds.push(tokenizer.eosId);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
const seqLen = inputIds.length;
|
|
261
|
+
const inputTensor = new ort.Tensor(
|
|
262
|
+
"int64",
|
|
263
|
+
BigInt64Array.from(inputIds.map((x: number) => BigInt(x))),
|
|
264
|
+
[1, seqLen],
|
|
265
|
+
);
|
|
266
|
+
const attentionMask = new ort.Tensor(
|
|
267
|
+
"int64",
|
|
268
|
+
BigInt64Array.from(new Array(seqLen).fill(1n)),
|
|
269
|
+
[1, seqLen],
|
|
270
|
+
);
|
|
271
|
+
|
|
272
|
+
// Run encoder
|
|
273
|
+
const encoder = await ort.InferenceSession.create(files.encoderOnnx, {
|
|
274
|
+
executionProviders: ["cpu"],
|
|
275
|
+
graphOptimizationLevel: "basic",
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
const encoderOut = await encoder.run({
|
|
279
|
+
input_ids: inputTensor,
|
|
280
|
+
attention_mask: attentionMask,
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
const encoderHidden = encoderOut["last_hidden_state"];
|
|
284
|
+
await encoder.release();
|
|
285
|
+
|
|
286
|
+
// Greedy decode with the decoder_model_merged (handles initial + cached steps)
|
|
287
|
+
const decoder = await ort.InferenceSession.create(files.decoderOnnx, {
|
|
288
|
+
executionProviders: ["cpu"],
|
|
289
|
+
graphOptimizationLevel: "basic",
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
const decoderIds: number[] = [tokenizer.bosId >= 0 ? tokenizer.bosId : 2]; // 2 = <s> for BART
|
|
293
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
294
|
+
let pastKeyValues: Record<string, any> = {};
|
|
295
|
+
|
|
296
|
+
for (let step = 0; step < MAX_NEW_TOKENS; step++) {
|
|
297
|
+
const lastId = decoderIds[decoderIds.length - 1];
|
|
298
|
+
const decInputIds = new ort.Tensor(
|
|
299
|
+
"int64",
|
|
300
|
+
BigInt64Array.from([BigInt(lastId)]),
|
|
301
|
+
[1, 1],
|
|
302
|
+
);
|
|
303
|
+
|
|
304
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
305
|
+
const feeds: Record<string, any> = {
|
|
306
|
+
input_ids: decInputIds,
|
|
307
|
+
encoder_hidden_states: encoderHidden,
|
|
308
|
+
encoder_attention_mask: attentionMask,
|
|
309
|
+
};
|
|
310
|
+
|
|
311
|
+
// On step 0, use_cache_branch = false; subsequent steps = true
|
|
312
|
+
const useCacheBranch = new ort.Tensor("bool", [step > 0], [1]);
|
|
313
|
+
feeds["use_cache_branch"] = useCacheBranch;
|
|
314
|
+
|
|
315
|
+
// Inject past key values on step > 0
|
|
316
|
+
for (const [k, v] of Object.entries(pastKeyValues)) {
|
|
317
|
+
feeds[k] = v;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
const out = await decoder.run(feeds);
|
|
321
|
+
|
|
322
|
+
// Logits: [1, 1, vocab_size] → argmax
|
|
323
|
+
const logits = out["logits"];
|
|
324
|
+
const logitData = logits.data as Float32Array;
|
|
325
|
+
const vocabSize = logits.dims[2];
|
|
326
|
+
let bestId = 0;
|
|
327
|
+
let bestVal = -Infinity;
|
|
328
|
+
for (let i = 0; i < vocabSize; i++) {
|
|
329
|
+
if (logitData[i] > bestVal) { bestVal = logitData[i]; bestId = i; }
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
// Collect new past key values for next step
|
|
333
|
+
pastKeyValues = {};
|
|
334
|
+
for (const [k, v] of Object.entries(out)) {
|
|
335
|
+
if (k.startsWith("present.")) pastKeyValues[k.replace("present.", "past_key_values.")] = v;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
if (bestId === tokenizer.eosId) break;
|
|
339
|
+
decoderIds.push(bestId);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
await decoder.release();
|
|
343
|
+
|
|
344
|
+
// Decode (skip the initial BOS token)
|
|
345
|
+
return tokenizer.decode(decoderIds.slice(1));
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
// ---------------------------------------------------------------------------
|
|
349
|
+
// Provider export
|
|
350
|
+
// ---------------------------------------------------------------------------
|
|
351
|
+
|
|
352
|
+
export const onnxProvider: LlmProvider = {
|
|
353
|
+
name: "onnx",
|
|
354
|
+
|
|
355
|
+
async isAvailable(): Promise<boolean> {
|
|
356
|
+
if (!isOnnxRuntimeInstalled()) return false;
|
|
357
|
+
return isModelPresent();
|
|
358
|
+
},
|
|
359
|
+
|
|
360
|
+
async summarize(
|
|
361
|
+
text: string,
|
|
362
|
+
_prompt: string,
|
|
363
|
+
_opts?: { maxTokens?: number },
|
|
364
|
+
): Promise<LlmSummarizeResult> {
|
|
365
|
+
if (!isOnnxRuntimeInstalled()) {
|
|
366
|
+
throw new Error(
|
|
367
|
+
"ONNX provider: onnxruntime-node not installed. " +
|
|
368
|
+
"Run: bun add onnxruntime-node (or: npm install onnxruntime-node)",
|
|
369
|
+
);
|
|
370
|
+
}
|
|
371
|
+
if (!isModelPresent()) {
|
|
372
|
+
throw new Error(
|
|
373
|
+
"ONNX provider: model not found at " + modelDir() + ". " +
|
|
374
|
+
"Run: bun run install-onnx-model",
|
|
375
|
+
);
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
const t0 = Date.now();
|
|
379
|
+
|
|
380
|
+
// Truncate input text to avoid very slow inference on huge inputs.
|
|
381
|
+
// The model accepts up to 1024 tokens; we aim for ~2000 chars as a heuristic.
|
|
382
|
+
const truncated = text.length > 4000 ? text.slice(0, 4000) : text;
|
|
383
|
+
|
|
384
|
+
const output = await runInference(truncated);
|
|
385
|
+
const latencyMs = Date.now() - t0;
|
|
386
|
+
|
|
387
|
+
// Token count approximation (no exact count without running the tokenizer twice)
|
|
388
|
+
const inTokens = Math.ceil(truncated.length / 4);
|
|
389
|
+
const outTokens = Math.ceil(output.length / 4);
|
|
390
|
+
|
|
391
|
+
return { output, inTokens, outTokens, latencyMs };
|
|
392
|
+
},
|
|
393
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for the LLM provider abstraction layer.
|
|
3
|
+
*
|
|
4
|
+
* Provider hierarchy (auto mode): anthropic → onnx → local → none
|
|
5
|
+
* Callers should never import concrete providers directly — use
|
|
6
|
+
* `selectProvider()` from `./index.ts` instead.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export interface LlmSummarizeResult {
|
|
10
|
+
output: string;
|
|
11
|
+
inTokens: number;
|
|
12
|
+
outTokens: number;
|
|
13
|
+
latencyMs: number;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface LlmProvider {
|
|
17
|
+
name: "anthropic" | "onnx" | "local" | "cloud" | "none";
|
|
18
|
+
isAvailable(): Promise<boolean>;
|
|
19
|
+
summarize(
|
|
20
|
+
text: string,
|
|
21
|
+
prompt: string,
|
|
22
|
+
opts?: { maxTokens?: number },
|
|
23
|
+
): Promise<LlmSummarizeResult>;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** Env var that controls which provider is selected. Default: "auto". */
|
|
27
|
+
export type ProviderName = "auto" | "anthropic" | "onnx" | "local" | "cloud" | "off";
|