mlx-bun 0.5.0 → 1.0.0
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/README.md +1449 -109
- package/THIRD_PARTY_NOTICES.md +882 -0
- package/bin/mlx-bun.convert.mjs +4 -0
- package/bin/mlx-bun.fuse.mjs +4 -0
- package/bin/mlx-bun.generate.mjs +4 -0
- package/bin/mlx-bun.lora.mjs +4 -0
- package/bin/mlx-bun.mjs +13 -21
- package/bin/mlx-bun.server.mjs +4 -0
- package/bin/mlx-bun.upload.mjs +4 -0
- package/dist/web/app.js +9584 -0
- package/package.json +50 -53
- package/src/cli/ane-install.ts +76 -0
- package/src/cli/args.ts +179 -0
- package/src/cli/engine-entry.ts +68 -0
- package/src/cli/inference.ts +214 -0
- package/src/cli/job-entry.ts +97 -0
- package/src/cli/library-host.ts +117 -0
- package/src/cli/main.ts +57 -0
- package/src/cli/memory-engine.ts +163 -0
- package/src/cli/memory.ts +36 -0
- package/src/cli/mlx-lm-aliases.ts +309 -0
- package/src/cli/model-choice.ts +33 -0
- package/src/cli/model-selection.ts +84 -0
- package/src/cli/module-host.ts +11 -0
- package/src/cli/module-verbs.ts +50 -0
- package/src/cli/numerical-policy.ts +12 -0
- package/src/cli/perplexity.ts +89 -0
- package/src/cli/serve-host.ts +423 -0
- package/src/cli/serve-isolated.ts +217 -0
- package/src/cli/serve-options.ts +106 -0
- package/src/cli/serve-state.ts +205 -0
- package/src/cli/serve.ts +500 -0
- package/src/cli/served-model-host.ts +102 -0
- package/src/cli/server-entry.ts +148 -0
- package/src/cli/serving-unit.ts +177 -0
- package/src/{tui.ts → cli/terminal.ts} +13 -8
- package/src/cli/worker-adapters.ts +34 -0
- package/src/cli/worker-entry.ts +272 -0
- package/src/cli/worker-unit.ts +179 -0
- package/src/engine/adapter-operation.ts +26 -0
- package/src/engine/cache-services.ts +114 -0
- package/src/engine/completion.ts +39 -0
- package/src/engine/generation-gateway.ts +358 -0
- package/src/engine/index.ts +59 -0
- package/src/engine/kv-budget.ts +120 -0
- package/src/engine/media-preparation.ts +232 -0
- package/src/engine/model-binding.ts +24 -0
- package/src/engine/model-host.ts +513 -0
- package/src/engine/model-serving.ts +89 -0
- package/src/{serve → engine}/preparation.ts +7 -5
- package/src/{serve → engine}/session-completion-engine.ts +6 -6
- package/src/engine/telemetry.ts +109 -0
- package/src/hub/downloads.ts +116 -0
- package/src/jobs/db.ts +16 -7
- package/src/jobs/events.ts +29 -0
- package/src/jobs/executable.ts +5 -0
- package/src/jobs/host.ts +51 -0
- package/src/jobs/in-process.ts +55 -0
- package/src/{contracts/jobs.ts → jobs/protocol.ts} +7 -9
- package/src/jobs/runner.ts +150 -231
- package/src/jobs/service.ts +75 -0
- package/src/jobs/sse.ts +59 -23
- package/src/jobs/worker-memory.ts +46 -0
- package/src/jobs/worker-process.ts +163 -0
- package/src/jobs/worker-supervisor.ts +258 -0
- package/src/modules.ts +58 -0
- package/src/publishing/catalog-hub.ts +18 -0
- package/src/publishing/credentials.ts +31 -0
- package/src/publishing/upload.ts +37 -0
- package/src/residency/leased-adapters.ts +21 -0
- package/src/residency/local-records.ts +16 -0
- package/src/residency/model-residency.ts +405 -0
- package/src/residency/record-index.ts +28 -0
- package/src/residency/resident-estimate.ts +50 -0
- package/src/{anthropic.ts → server/anthropic.ts} +3 -81
- package/src/server/cache-routes.ts +36 -0
- package/src/{serve → server}/chat-request.ts +10 -10
- package/src/{serve → server}/chat-stage.ts +14 -14
- package/src/{client.ts → server/client.ts} +28 -2
- package/src/{serve → server}/completion-executor.ts +33 -41
- package/src/server/decision-body.ts +55 -0
- package/src/server/decision-routes.ts +134 -0
- package/src/server/decision-wire.ts +228 -0
- package/src/{serve → server}/discovery-routes.ts +25 -82
- package/src/{serve → server}/http.ts +25 -13
- package/src/{serve → server}/inference-request.ts +5 -5
- package/src/server/job-routes.ts +20 -0
- package/src/server/media-prompt.ts +63 -0
- package/src/server/memory-completion-client.ts +46 -0
- package/src/server/model-routes.ts +192 -0
- package/src/{serve → server}/openai-wire.ts +3 -2
- package/src/{serve → server}/pipeline.ts +1 -1
- package/src/server/prompt-builder.ts +13 -0
- package/src/server/prompt-contracts.ts +17 -0
- package/src/server/proxy-routes.ts +187 -0
- package/src/server/publishing-routes.ts +41 -0
- package/src/{serve → server}/request-plan.ts +6 -8
- package/src/{serve → server}/request-prep.ts +47 -50
- package/src/{serve → server}/responses-client.ts +30 -13
- package/src/{responses.ts → server/responses.ts} +12 -93
- package/src/server/routes.ts +205 -0
- package/src/server/start.ts +72 -0
- package/src/server/status-routes.ts +108 -0
- package/src/{serve → server}/text-completion-stage.ts +25 -4
- package/src/server/text-prompt.ts +12 -0
- package/src/{serve → server}/token-streams.ts +36 -38
- package/src/server/worker-routes.ts +311 -0
- package/src/storage/paths.ts +61 -0
- package/src/web/assets.ts +37 -0
- package/src/web/{src → browser}/api.ts +5 -23
- package/src/web/browser/chat-host.ts +17 -0
- package/src/web/browser/installed-panels.ts +6 -0
- package/src/web/browser/main.ts +55 -0
- package/src/web/browser/markdown.ts +279 -0
- package/src/web/browser/memory-panel.ts +9 -0
- package/src/web/browser/palette.ts +64 -0
- package/src/web/browser/protocol.ts +13 -0
- package/src/web/browser/shell.ts +467 -0
- package/src/web/{src → browser}/status.ts +32 -36
- package/src/web/build.ts +51 -0
- package/src/web/public/app.html +1054 -0
- package/src/web/{sw.js → public/sw.js} +4 -3
- package/src/web/{vendor → public/vendor}/hljs-theme.css +2 -2
- package/src/web/{vendor → public/vendor}/hljs.js +2 -2
- package/THIRD_PARTY_LICENSES.md +0 -51
- package/docs/README.md +0 -107
- package/docs/archive/hlg-sampling.md +0 -350
- package/docs/archive/investigations/audio-input-plan.md +0 -356
- package/docs/archive/investigations/benchmark-ledger-through-v0.4.0.md +0 -3617
- package/docs/archive/investigations/chunk-finetune-experiment.md +0 -84
- package/docs/archive/investigations/colibri-glm52-port.md +0 -1486
- package/docs/archive/investigations/colibri-oracle-pin.md +0 -1284
- package/docs/archive/investigations/curve-bisector-routing.md +0 -123
- package/docs/archive/investigations/decode-roofline-lookagain.md +0 -348
- package/docs/archive/investigations/diffusion-gemma-port.md +0 -602
- package/docs/archive/investigations/dspark-handoff.md +0 -224
- package/docs/archive/investigations/expert-offload-single-user-moe.md +0 -292
- package/docs/archive/investigations/faithful-l1-consolidation.md +0 -310
- package/docs/archive/investigations/hlg-sampling-investigation.md +0 -970
- package/docs/archive/investigations/indexshare-performance-spike.md +0 -357
- package/docs/archive/investigations/kernel-perf-review-2026-07.md +0 -171
- package/docs/archive/investigations/lab-build-journal.md +0 -157
- package/docs/archive/investigations/minicpm5-decode-megakernel.md +0 -489
- package/docs/archive/investigations/openjarvis-fit.md +0 -198
- package/docs/archive/investigations/openwiki-evaluation.md +0 -249
- package/docs/archive/investigations/optimization_plan.md +0 -346
- package/docs/archive/investigations/orpo-base-uf-experiment-and-directions.md +0 -120
- package/docs/archive/investigations/orpo-flash-cce-pin-leak.md +0 -167
- package/docs/archive/investigations/orpo-uf-testing-handoff.md +0 -126
- package/docs/archive/investigations/pareto-specialized-runtime-findings.md +0 -92
- package/docs/archive/investigations/pi-builtin-investigation.md +0 -308
- package/docs/archive/investigations/pre-colibri-stabilization.md +0 -329
- package/docs/archive/investigations/qwen38-27b-campaign-log.md +0 -1092
- package/docs/archive/investigations/segmented-backward-handoff.md +0 -148
- package/docs/archive/investigations/starter-model-port-handoff.md +0 -342
- package/docs/archive/investigations/steel-flash-cce-handoff.md +0 -489
- package/docs/archive/investigations/the-dreaming-handoff.md +0 -141
- package/docs/archive/investigations/trainer-validation-experiment.md +0 -173
- package/docs/archive/planning/chat-ui-vision-memory-first.md +0 -199
- package/docs/archive/planning/chat-ui-vision.md +0 -50
- package/docs/archive/planning/chunk-task-roadmap.md +0 -77
- package/docs/archive/planning/curve-sampler-research-plan.md +0 -331
- package/docs/archive/planning/journal.md +0 -316
- package/docs/archive/planning/memory-docs-and-dag-plan.md +0 -194
- package/docs/archive/planning/pi-integration-review.md +0 -178
- package/docs/archive/planning/release-notes-v0.0.10.md +0 -57
- package/docs/archive/planning/release-notes-v0.0.11.md +0 -239
- package/docs/archive/planning/release-notes-v0.0.12.md +0 -80
- package/docs/archive/planning/release-notes-v0.0.13.md +0 -77
- package/docs/archive/planning/release-notes-v0.0.9.md +0 -122
- package/docs/archive/planning/release-notes-v0.2.0.md +0 -49
- package/docs/archive/planning/release-notes-v0.3.0.md +0 -35
- package/docs/archive/planning/release-notes-v0.4.0.md +0 -45
- package/docs/archive/planning/release-notes-v0.5.0.md +0 -37
- package/docs/archive/planning/web-ui-pass-plan.md +0 -213
- package/docs/archive/planning/website-readme-pass-plan.md +0 -224
- package/docs/design/batching.md +0 -2054
- package/docs/design/decode-speed-program.md +0 -2404
- package/docs/design/dreaming-nightly-pipeline.md +0 -684
- package/docs/design/generic-model-support.md +0 -821
- package/docs/design/kv-cache.md +0 -993
- package/docs/design/orpo-training.md +0 -680
- package/docs/design/speculative-decoding.md +0 -2129
- package/docs/design/turboquant.md +0 -2225
- package/docs/design/unified-engine-frontier-plan.md +0 -1987
- package/docs/design/web-chat-redesign.md +0 -695
- package/docs/planning/PRODUCT_ROADMAP.md +0 -593
- package/docs/planning/ResearchTopics.md +0 -119
- package/docs/planning/public-readiness-handoff.md +0 -244
- package/docs/planning/public-readiness.md +0 -149
- package/docs/planning/video-series.md +0 -421
- package/docs/reference/benchmarks.md +0 -3587
- package/docs/reference/cli.md +0 -646
- package/docs/reference/distribution.md +0 -380
- package/docs/reference/environment.md +0 -494
- package/docs/reference/glossary.md +0 -39
- package/docs/reference/library-api.md +0 -688
- package/docs/reference/memory.md +0 -260
- package/docs/reference/models.md +0 -346
- package/docs/reference/server-api.md +0 -1945
- package/docs/reference/server-config.md +0 -973
- package/docs/reference/training.md +0 -462
- package/docs/reference/troubleshooting.md +0 -158
- package/src/admission-plan.ts +0 -18
- package/src/audio/audiotoolbox.ts +0 -112
- package/src/audio/conformer.ts +0 -655
- package/src/audio/decode.ts +0 -133
- package/src/audio/features.ts +0 -202
- package/src/audio/mic-capture.ts +0 -98
- package/src/audio/silero-vad.ts +0 -379
- package/src/audio/transcode.ts +0 -67
- package/src/audio/whisper-decode.ts +0 -774
- package/src/audio/whisper-fast.ts +0 -732
- package/src/audio/whisper-format.ts +0 -73
- package/src/audio/whisper-mel.ts +0 -185
- package/src/audio/whisper-timing.ts +0 -274
- package/src/audio/whisper-tokenizer.ts +0 -239
- package/src/audio/whisper-transcribe.ts +0 -410
- package/src/backends/mlx/assistant-target.ts +0 -46
- package/src/backends/mlx/autoregressive-draft-rows.ts +0 -120
- package/src/backends/mlx/autoregressive.ts +0 -129
- package/src/backends/mlx/batch-group.ts +0 -1874
- package/src/backends/mlx/cache-attachment.ts +0 -67
- package/src/backends/mlx/cache-layout.ts +0 -31
- package/src/backends/mlx/checkpoint-state.ts +0 -53
- package/src/backends/mlx/continuation-persistence.ts +0 -107
- package/src/backends/mlx/continuation-request.ts +0 -43
- package/src/backends/mlx/continuation.ts +0 -77
- package/src/backends/mlx/diffusion.ts +0 -39
- package/src/backends/mlx/draft-target.ts +0 -32
- package/src/backends/mlx/encoder-cache.ts +0 -25
- package/src/backends/mlx/evaluation.ts +0 -105
- package/src/backends/mlx/fill-append.ts +0 -58
- package/src/backends/mlx/fill-group.ts +0 -497
- package/src/backends/mlx/full-kv-row-append.ts +0 -32
- package/src/backends/mlx/full-kv-row-donor.ts +0 -54
- package/src/backends/mlx/full-transitioning-kv-rows.ts +0 -65
- package/src/backends/mlx/gateway-binding.ts +0 -174
- package/src/backends/mlx/graph.ts +0 -38
- package/src/backends/mlx/kv-codec.ts +0 -9
- package/src/backends/mlx/kv-maintenance.ts +0 -161
- package/src/backends/mlx/kv-tensor-rows.ts +0 -212
- package/src/backends/mlx/memory-client.ts +0 -189
- package/src/backends/mlx/methods.ts +0 -90
- package/src/backends/mlx/mixed-iteration.ts +0 -62
- package/src/backends/mlx/model-prompt.ts +0 -178
- package/src/backends/mlx/model-serving.ts +0 -80
- package/src/backends/mlx/paged-cache-codec.ts +0 -27
- package/src/backends/mlx/prefill-cohort.ts +0 -100
- package/src/backends/mlx/prefill-policy.ts +0 -26
- package/src/backends/mlx/prefill-rows.ts +0 -244
- package/src/backends/mlx/prefill.ts +0 -33
- package/src/backends/mlx/projected-context-rows.ts +0 -72
- package/src/backends/mlx/prompt-input.ts +0 -29
- package/src/backends/mlx/qwen-prompt-input.ts +0 -40
- package/src/backends/mlx/request-policy.ts +0 -20
- package/src/backends/mlx/request-state-policy.ts +0 -54
- package/src/backends/mlx/rollback.ts +0 -92
- package/src/backends/mlx/row-sampling.ts +0 -49
- package/src/backends/mlx/serial-executor.ts +0 -251
- package/src/backends/mlx/speculative-group.ts +0 -438
- package/src/backends/mlx/speculative-round.ts +0 -161
- package/src/backends/mlx/speculative.ts +0 -131
- package/src/backends/mlx/state-rows.ts +0 -104
- package/src/backends/mlx/state-views.ts +0 -46
- package/src/backends/mlx/target-layout-capability.ts +0 -35
- package/src/backends/mlx/text-engine.ts +0 -73
- package/src/backends/mlx/transitioning-kv-rows.ts +0 -173
- package/src/chat-template.ts +0 -382
- package/src/cli.ts +0 -3490
- package/src/config.ts +0 -399
- package/src/contracts/completion.ts +0 -16
- package/src/contracts/execution.ts +0 -70
- package/src/contracts/generation.ts +0 -103
- package/src/contracts/host.ts +0 -7
- package/src/contracts/object-cache.ts +0 -8
- package/src/contracts/pi-provider.ts +0 -30
- package/src/contracts/pi.ts +0 -261
- package/src/contracts/prefix-cache.ts +0 -33
- package/src/contracts/resources.ts +0 -25
- package/src/contracts/sampling.ts +0 -23
- package/src/contracts/scheduling.ts +0 -54
- package/src/contracts/tsconfig.json +0 -14
- package/src/dataset/generators.ts +0 -1087
- package/src/dataset/index.ts +0 -12
- package/src/dataset/job.ts +0 -81
- package/src/dataset/llm.ts +0 -71
- package/src/dataset/registry.ts +0 -528
- package/src/diffusion/diffusion-generate.ts +0 -507
- package/src/download.ts +0 -505
- package/src/embed.ts +0 -77
- package/src/engine/admission.ts +0 -59
- package/src/engine/cancellation.ts +0 -38
- package/src/engine/engine.ts +0 -56
- package/src/engine/execution-coordinator.ts +0 -70
- package/src/engine/execution-plan.ts +0 -64
- package/src/engine/execution-tasks.ts +0 -44
- package/src/engine/namespaced-cache.ts +0 -13
- package/src/engine/resources.ts +0 -53
- package/src/engine/scheduler.ts +0 -92
- package/src/engine/session.ts +0 -247
- package/src/eval/README.md +0 -130
- package/src/eval/ifeval.ts +0 -81
- package/src/eval/kl-prompts.ts +0 -29
- package/src/eval/kl.ts +0 -590
- package/src/eval/perplexity.ts +0 -164
- package/src/eval/quality-db.ts +0 -92
- package/src/eval/reference-logits.ts +0 -207
- package/src/eval/runner.ts +0 -124
- package/src/eval/score.ts +0 -49
- package/src/eval/tasks/bfcl.ts +0 -535
- package/src/eval/tasks/gsm8k.ts +0 -98
- package/src/eval/tasks/hashhop.ts +0 -139
- package/src/eval/tasks/humaneval.ts +0 -275
- package/src/eval/tasks/ifeval.ts +0 -525
- package/src/eval/tasks/mmlu.ts +0 -157
- package/src/eval/ultrafeedback.ts +0 -60
- package/src/evaldb.ts +0 -199
- package/src/expert-io.ts +0 -393
- package/src/expert-offload-build.ts +0 -77
- package/src/expert-offload.ts +0 -76
- package/src/expert-residency.ts +0 -1134
- package/src/expert-usage.ts +0 -415
- package/src/fill/echo-index.ts +0 -188
- package/src/fill/fill-session.ts +0 -463
- package/src/fill/proposal.ts +0 -68
- package/src/fill/schema-rows.ts +0 -506
- package/src/fill/tool-boundary.ts +0 -103
- package/src/fit.ts +0 -249
- package/src/generate.ts +0 -1352
- package/src/grammar.ts +0 -604
- package/src/harness-pi.ts +0 -184
- package/src/hf-push.ts +0 -628
- package/src/hub-rest.ts +0 -242
- package/src/index.ts +0 -63
- package/src/inference/denoising.ts +0 -17
- package/src/inference/draft-acceptance.ts +0 -41
- package/src/inference/draft-output.ts +0 -49
- package/src/inference/graph.ts +0 -33
- package/src/inference/prefill.ts +0 -45
- package/src/inference/rollback.ts +0 -7
- package/src/jobs/index.ts +0 -31
- package/src/jobs/job-entry.ts +0 -107
- package/src/jobs/task-client.ts +0 -19
- package/src/jobs/types.ts +0 -2
- package/src/kv-scheme.ts +0 -279
- package/src/kv-store.ts +0 -1135
- package/src/lab/README.md +0 -22
- package/src/lab/curve/curve-designer.html +0 -303
- package/src/lab/curve/curve-sampler.ts +0 -122
- package/src/lab/expert-trace/expert-trace.ts +0 -69
- package/src/lab/paged-kv/paged-attention.ts +0 -117
- package/src/lab/paged-kv/paged-kv-rows.ts +0 -111
- package/src/lab/paged-kv/paged-kv.ts +0 -336
- package/src/library.ts +0 -40
- package/src/lora.ts +0 -408
- package/src/md-modules.d.ts +0 -54
- package/src/media-fetch.ts +0 -442
- package/src/memory/article.ts +0 -558
- package/src/memory/chunk-validation.ts +0 -150
- package/src/memory/chunk.ts +0 -318
- package/src/memory/cluster.ts +0 -351
- package/src/memory/coverage.ts +0 -134
- package/src/memory/crosslink.ts +0 -0
- package/src/memory/db.ts +0 -253
- package/src/memory/entity.ts +0 -203
- package/src/memory/gate.ts +0 -187
- package/src/memory/history.ts +0 -152
- package/src/memory/ingest.ts +0 -335
- package/src/memory/model.ts +0 -183
- package/src/memory/normalize.ts +0 -671
- package/src/memory/parse.ts +0 -22
- package/src/memory/pipeline.ts +0 -275
- package/src/memory/prompts.ts +0 -65
- package/src/memory/query.ts +0 -334
- package/src/memory/reconcile.ts +0 -734
- package/src/memory/redirect.ts +0 -108
- package/src/memory/reindex.ts +0 -325
- package/src/memory/resolve.ts +0 -307
- package/src/memory/rest.ts +0 -245
- package/src/memory/route.ts +0 -272
- package/src/memory/schedule.ts +0 -165
- package/src/memory/stages.ts +0 -777
- package/src/memory/synthesize.ts +0 -1638
- package/src/memory/tools.ts +0 -749
- package/src/memory/vault.ts +0 -1194
- package/src/memory/wikify.ts +0 -1064
- package/src/mlx/array.ts +0 -425
- package/src/mlx/autograd.ts +0 -304
- package/src/mlx/checkpoint.ts +0 -149
- package/src/mlx/compile.ts +0 -168
- package/src/mlx/custom-vjp.ts +0 -188
- package/src/mlx/ffi.ts +0 -531
- package/src/mlx/materialize.ts +0 -23
- package/src/mlx/metal-kernel.ts +0 -159
- package/src/mlx/normalized-argmax.ts +0 -116
- package/src/mlx/ops.ts +0 -1108
- package/src/mlx/quantized-rows.ts +0 -36
- package/src/mlx/token-bitmask.ts +0 -52
- package/src/mlx/turboquant-kv-decode.ts +0 -82
- package/src/mlx/turboquant-kv-inverse.ts +0 -122
- package/src/mlx/turboquant-ops.ts +0 -861
- package/src/mlx/turboquant-tables.ts +0 -237
- package/src/mmap.ts +0 -90
- package/src/model/artifact-identity.ts +0 -73
- package/src/model/batched-kv.ts +0 -235
- package/src/model/batched-mask.ts +0 -279
- package/src/model/batched-quant.ts +0 -212
- package/src/model/batched-quantized-kv.ts +0 -144
- package/src/model/batched-rotating-quant.ts +0 -353
- package/src/model/batched-rotating-state.ts +0 -149
- package/src/model/batched-rotating.ts +0 -338
- package/src/model/batched-row-storage.ts +0 -179
- package/src/model/batched-ssm.ts +0 -52
- package/src/model/batched-turboquant-kv.ts +0 -94
- package/src/model/compiled-decode.ts +0 -712
- package/src/model/decoded-kv-donor.ts +0 -12
- package/src/model/delayed-quantized-kv.ts +0 -72
- package/src/model/delayed-rotating-quantized-kv.ts +0 -93
- package/src/model/delayed-turboquant-kv.ts +0 -57
- package/src/model/diffusion-gemma.ts +0 -1026
- package/src/model/factory.ts +0 -215
- package/src/model/fingerprint.ts +0 -45
- package/src/model/flash-attention.ts +0 -694
- package/src/model/full-prefill-padding.ts +0 -56
- package/src/model/full-prefill-row.ts +0 -105
- package/src/model/gemma4-base.ts +0 -2370
- package/src/model/gemma4.ts +0 -1395
- package/src/model/generated/gemma4-12b.ts +0 -429
- package/src/model/generated/gemma4-26b.ts +0 -448
- package/src/model/generated/gemma4-e4b.ts +0 -717
- package/src/model/generated/index.ts +0 -18
- package/src/model/glm52-atlas.ts +0 -511
- package/src/model/glm52-cache.ts +0 -792
- package/src/model/glm52-config.ts +0 -262
- package/src/model/glm52-container.ts +0 -305
- package/src/model/glm52-coupling.ts +0 -388
- package/src/model/glm52-dsa.ts +0 -606
- package/src/model/glm52-expert-layout.ts +0 -253
- package/src/model/glm52-layout.ts +0 -152
- package/src/model/glm52-memory.ts +0 -500
- package/src/model/glm52-mla.ts +0 -792
- package/src/model/glm52-moe.ts +0 -223
- package/src/model/glm52-pilot.ts +0 -537
- package/src/model/glm52-reference.ts +0 -445
- package/src/model/glm52-residency.ts +0 -557
- package/src/model/glm52-resident-weights.ts +0 -135
- package/src/model/glm52-streamed-experts.ts +0 -453
- package/src/model/glm52-streamed-metal.ts +0 -610
- package/src/model/glm52-weights.ts +0 -503
- package/src/model/glm52.ts +0 -1132
- package/src/model/implementation.ts +0 -69
- package/src/model/kv-attention-view.ts +0 -70
- package/src/model/minicpm5.ts +0 -376
- package/src/model/profile.ts +0 -468
- package/src/model/quantized-append-attention.ts +0 -31
- package/src/model/qwen-append.ts +0 -12
- package/src/model/qwen-conv.ts +0 -52
- package/src/model/qwen3-delta-state.ts +0 -74
- package/src/model/qwen3-delta.ts +0 -451
- package/src/model/qwen3-moe.ts +0 -404
- package/src/model/qwen3-mrope.ts +0 -250
- package/src/model/qwen3.ts +0 -277
- package/src/model/qwen3_5-checkpoint.ts +0 -164
- package/src/model/qwen3_5.ts +0 -881
- package/src/model/rotating-kv-donor.ts +0 -35
- package/src/model/rotating-kv-layout.ts +0 -262
- package/src/model/rotating-row-transaction.ts +0 -35
- package/src/model/speculative-rotating-kv.ts +0 -101
- package/src/model/ssm-prefill-padding.ts +0 -39
- package/src/model/support.ts +0 -110
- package/src/model/token-groups.ts +0 -66
- package/src/model/trellis-balanced-scatter.ts +0 -51
- package/src/model/trellis-linear.ts +0 -672
- package/src/model/trellis-shared-m.ts +0 -151
- package/src/model/trellis-shared-scatter.ts +0 -144
- package/src/model/trellis-splitk-prefill.ts +0 -158
- package/src/model/trellis-tiled-prefill.ts +0 -136
- package/src/model/trellis-vector-expand.ts +0 -62
- package/src/model/trellis-wide-prefill.ts +0 -94
- package/src/model/turboquant-codec.ts +0 -89
- package/src/model/universal/archs.ts +0 -332
- package/src/model/universal/dense.ts +0 -612
- package/src/model/universal/modules.ts +0 -170
- package/src/model/universal/rope.ts +0 -381
- package/src/model/whisper.ts +0 -435
- package/src/native/expert_io.c +0 -523
- package/src/native/frame_extract.swift +0 -140
- package/src/native/mic_capture.swift +0 -92
- package/src/native-pack.ts +0 -163
- package/src/pi-provider.ts +0 -53
- package/src/pi-session.ts +0 -81
- package/src/pi-terminal.ts +0 -274
- package/src/pi-web.ts +0 -1940
- package/src/preflight.ts +0 -158
- package/src/prompt-cache.ts +0 -682
- package/src/quantize/allocator.ts +0 -627
- package/src/quantize/atomic-output.ts +0 -38
- package/src/quantize/calibration.ts +0 -181
- package/src/quantize/config-writer.ts +0 -145
- package/src/quantize/index.ts +0 -84
- package/src/quantize/job.ts +0 -162
- package/src/quantize/quantizer.ts +0 -666
- package/src/quantize/rotate.ts +0 -603
- package/src/quantize/safetensors-writer.ts +0 -249
- package/src/quantize/sensitivity.ts +0 -216
- package/src/quantize/trellis.ts +0 -586
- package/src/quantize/weight-transform.ts +0 -292
- package/src/registry.ts +0 -602
- package/src/runtime-config.ts +0 -77
- package/src/safetensors.ts +0 -165
- package/src/sampler.ts +0 -1012
- package/src/serve/admin-routes.ts +0 -184
- package/src/serve/assets/curve-terrain.html +0 -105
- package/src/serve/assets/training-inference-map.html +0 -575
- package/src/serve/audio-routes.ts +0 -323
- package/src/serve/aux-routes.ts +0 -132
- package/src/serve/batch-scheduler.ts +0 -8
- package/src/serve/checkpoint-identity.ts +0 -64
- package/src/serve/generation-gateway.ts +0 -537
- package/src/serve/isolate.ts +0 -609
- package/src/serve/kv-budget.ts +0 -14
- package/src/serve/lab-routes.ts +0 -341
- package/src/serve/lane-registry.ts +0 -45
- package/src/serve/model-admin-routes.ts +0 -155
- package/src/serve/model-binding.ts +0 -49
- package/src/serve/model-host.ts +0 -511
- package/src/serve/parent-application.ts +0 -56
- package/src/serve/prompt-response-trace.ts +0 -161
- package/src/serve/response-lease.ts +0 -24
- package/src/serve/session-search.ts +0 -326
- package/src/serve/static-routes.ts +0 -101
- package/src/serve/transcription-server.ts +0 -64
- package/src/serve/transcription-service.ts +0 -502
- package/src/server.ts +0 -1282
- package/src/spec/assistant-rows.ts +0 -93
- package/src/spec/assistant-source.ts +0 -126
- package/src/spec/cache-identity.ts +0 -22
- package/src/spec/deepspec-rows.ts +0 -29
- package/src/spec/deepspec-source.ts +0 -145
- package/src/spec/dflash-source.ts +0 -149
- package/src/spec/drafter.ts +0 -304
- package/src/spec/dspark/ab-stats.ts +0 -136
- package/src/spec/dspark/calibration.ts +0 -112
- package/src/spec/dspark/data-dflash.ts +0 -156
- package/src/spec/dspark/data.ts +0 -201
- package/src/spec/dspark/deepspec-module.ts +0 -776
- package/src/spec/dspark/generate-dflash.ts +0 -245
- package/src/spec/dspark/generate.ts +0 -290
- package/src/spec/dspark/loader.ts +0 -23
- package/src/spec/dspark/loss.ts +0 -213
- package/src/spec/dspark/module-dflash.ts +0 -560
- package/src/spec/dspark/module.ts +0 -540
- package/src/spec/dspark/quantize-drafter.ts +0 -91
- package/src/spec/dspark/sample.ts +0 -112
- package/src/spec/generate.ts +0 -276
- package/src/spec/glm52-mtp-graph.ts +0 -29
- package/src/spec/glm52-mtp-rows.ts +0 -132
- package/src/spec/glm52-mtp-source.ts +0 -318
- package/src/spec/glm52-mtp-state.ts +0 -33
- package/src/spec/ngram-source.ts +0 -226
- package/src/spec/projected-draft-rows.ts +0 -73
- package/src/spec/qwen-mtp-module.ts +0 -171
- package/src/spec/qwen-mtp-rows.ts +0 -230
- package/src/spec/qwen-mtp-source.ts +0 -386
- package/src/spec/qwen-mtp-state.ts +0 -30
- package/src/spec/serve-loop.ts +0 -587
- package/src/spec/source.ts +0 -228
- package/src/spec/two-model-rows.ts +0 -62
- package/src/spec/two-model.ts +0 -113
- package/src/ssd-cache.ts +0 -431
- package/src/ssd-durability.ts +0 -209
- package/src/storage/host-buffer.ts +0 -24
- package/src/storage/kv-writer.ts +0 -83
- package/src/storage/kv-writer.worker.js +0 -264
- package/src/storage/retention-policy.ts +0 -37
- package/src/tiered-prompt-cache.ts +0 -45
- package/src/tokenizer.ts +0 -335
- package/src/tool-approvals.ts +0 -131
- package/src/tool-call.ts +0 -695
- package/src/train/dataset.ts +0 -484
- package/src/train/diffusion-lora.ts +0 -216
- package/src/train/export.ts +0 -32
- package/src/train/flash-cce.ts +0 -1234
- package/src/train/forward.ts +0 -266
- package/src/train/fuse.ts +0 -243
- package/src/train/index.ts +0 -46
- package/src/train/job.ts +0 -205
- package/src/train/lora-params.ts +0 -254
- package/src/train/loss.ts +0 -1591
- package/src/train/merge.ts +0 -195
- package/src/train/optimizer.ts +0 -183
- package/src/train/prefix-shared.ts +0 -490
- package/src/train/rank.ts +0 -137
- package/src/train/segmented.ts +0 -1828
- package/src/train/steel-qmm-header.ts +0 -1461
- package/src/train/trainer.ts +0 -1221
- package/src/train/watch.ts +0 -542
- package/src/vision/diffusion-vision.ts +0 -620
- package/src/vision/embedder.ts +0 -176
- package/src/vision/preprocess.ts +0 -247
- package/src/vision/prompt.ts +0 -409
- package/src/vision/qwen3vl-preprocess.ts +0 -409
- package/src/vision/qwen3vl-prompt.ts +0 -233
- package/src/vision/qwen3vl-tower.ts +0 -566
- package/src/vision/siglip.ts +0 -607
- package/src/vision/video-frames.ts +0 -148
- package/src/web/app.html +0 -2155
- package/src/web/app.js +0 -5863
- package/src/web/skills/memory/SKILL.md +0 -120
- package/src/web/skills/web-research/SKILL.md +0 -46
- package/src/web/skills.ts +0 -97
- package/src/web/src/adapters-panel.ts +0 -288
- package/src/web/src/assistant.ts +0 -451
- package/src/web/src/chat.ts +0 -1060
- package/src/web/src/composer.ts +0 -962
- package/src/web/src/dataset.ts +0 -132
- package/src/web/src/finetune.ts +0 -267
- package/src/web/src/hub.ts +0 -428
- package/src/web/src/main.ts +0 -98
- package/src/web/src/markdown.ts +0 -0
- package/src/web/src/memory-panel.ts +0 -572
- package/src/web/src/model-picker.ts +0 -159
- package/src/web/src/palette.ts +0 -346
- package/src/web/src/protocol.ts +0 -26
- package/src/web/src/quantize.ts +0 -167
- package/src/web/src/rag.ts +0 -274
- package/src/web/src/sessions.ts +0 -469
- package/src/web/src/shell.ts +0 -804
- package/src/web/src/ui-catalog.ts +0 -78
- package/src/web/src/voice.ts +0 -141
- package/src/web/vendor/README.md +0 -61
- package/src/web-assets.ts +0 -47
- package/src/web-tools.ts +0 -478
- package/src/weights.ts +0 -255
- /package/src/{serve → server}/completion-sink.ts +0 -0
- /package/src/{serve → server}/generated-token-history.ts +0 -0
- /package/src/web/{icon.svg → public/icon.svg} +0 -0
- /package/src/web/{manifest.webmanifest → public/manifest.webmanifest} +0 -0
- /package/src/web/{vendor → public/vendor}/hljs-LICENSE +0 -0
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
import type { MlxArray } from "../../mlx/array";
|
|
2
|
-
import * as ops from "../../mlx/ops";
|
|
3
|
-
import type { Cache } from "../../model/gemma4";
|
|
4
|
-
import type { RuntimeModel } from "../../model/factory";
|
|
5
|
-
import type { Sampler } from "../../sampler";
|
|
6
|
-
import type { DraftProvider, DraftSource } from "../../spec/source";
|
|
7
|
-
import { runtimeConfig, type RuntimeConfig } from "../../runtime-config";
|
|
8
|
-
import type { MlxModelMemory } from "./autoregressive";
|
|
9
|
-
import type { SpeculativeTransaction } from "../../inference/rollback";
|
|
10
|
-
import { bindCacheRollback } from "./rollback";
|
|
11
|
-
import type { GraphDescriptor } from "../../inference/graph";
|
|
12
|
-
import { bindLegacyDraftTarget } from "./draft-target";
|
|
13
|
-
import type { MlxForwardWork } from "./mixed-iteration";
|
|
14
|
-
import type { PrefillPolicy } from "../../inference/prefill";
|
|
15
|
-
import { resolveMlxPrefillPolicy } from "./prefill-policy";
|
|
16
|
-
|
|
17
|
-
/** Bound target operations and draft construction for one speculative run.
|
|
18
|
-
* A replacement graph supplies this entire port, including any hidden taps.
|
|
19
|
-
* The verifier never needs a RuntimeModel or an artifact-family check. */
|
|
20
|
-
export interface MlxSpeculativeBinding {
|
|
21
|
-
readonly runtime?: RuntimeConfig;
|
|
22
|
-
readonly prefillPolicy?: PrefillPolicy;
|
|
23
|
-
readonly memory?: MlxModelMemory;
|
|
24
|
-
readonly descriptor: GraphDescriptor;
|
|
25
|
-
readonly eosTokenIds: readonly number[];
|
|
26
|
-
readonly prefillTailSplit: boolean;
|
|
27
|
-
makeCache(): Cache[];
|
|
28
|
-
openDraft(sampler: Sampler, caches: Cache[]): DraftSource;
|
|
29
|
-
bindRollback(caches: Cache[]): SpeculativeTransaction;
|
|
30
|
-
forward(ids: MlxArray, caches: Cache[], tapLayers?: number[], work?: MlxForwardWork):
|
|
31
|
-
Promise<{ hidden: MlxArray; ctxML: MlxArray | null }>;
|
|
32
|
-
projectLogits(hidden: MlxArray): MlxArray;
|
|
33
|
-
/** Establish the implementation's verify kernel context; restore on close. */
|
|
34
|
-
pinVerify?(): { close(): void };
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export type MlxSpeculativeTargetBinding = Omit<MlxSpeculativeBinding, "openDraft">;
|
|
38
|
-
|
|
39
|
-
/** Legacy mutable tap/kernel fields require the gateway's exclusive lease. */
|
|
40
|
-
export function bindSpeculativeTargetModel(model: RuntimeModel): MlxSpeculativeTargetBinding {
|
|
41
|
-
const runtime = runtimeConfig();
|
|
42
|
-
return {
|
|
43
|
-
runtime,
|
|
44
|
-
prefillPolicy: resolveMlxPrefillPolicy(model.config, runtime),
|
|
45
|
-
memory: model,
|
|
46
|
-
descriptor: Object.freeze({ id: `legacy-spec:${model.config.modelType}`, backend: "mlx",
|
|
47
|
-
graphAbi: "mlx-hidden-bsh-v1", stateAbi: "legacy-cache-array-v1", artifact: "legacy-resident-model" }),
|
|
48
|
-
eosTokenIds: model.config.eosTokenIds,
|
|
49
|
-
prefillTailSplit: runtime.flag("MLX_BUN_PREFILL_TAIL_SPLIT", true),
|
|
50
|
-
makeCache: model.makeCache.bind(model),
|
|
51
|
-
bindRollback: bindCacheRollback,
|
|
52
|
-
forward: (ids, caches, tapLayers, work) => legacyForwardWithTaps(model, ids, caches, tapLayers, work),
|
|
53
|
-
projectLogits: model.logitsFromHidden.bind(model),
|
|
54
|
-
...("setSpecKernelPinned" in model ? {
|
|
55
|
-
pinVerify() {
|
|
56
|
-
model.setSpecKernelPinned(true);
|
|
57
|
-
return { close() { model.setSpecKernelPinned(false); } };
|
|
58
|
-
},
|
|
59
|
-
} : {}),
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/** Serial compatibility binds draft construction separately from target work. */
|
|
64
|
-
export function bindLegacySpeculativeModel(model: RuntimeModel, provider: DraftProvider): MlxSpeculativeBinding {
|
|
65
|
-
return { ...bindSpeculativeTargetModel(model),
|
|
66
|
-
openDraft: (sampler, caches) => provider.open({ sampler, target: bindLegacyDraftTarget(model, caches) }) };
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
export function assertMlxSpeculativeBinding(binding: MlxSpeculativeBinding): void {
|
|
70
|
-
const descriptor = binding.descriptor;
|
|
71
|
-
if (descriptor.backend !== "mlx" || descriptor.graphAbi !== "mlx-hidden-bsh-v1" ||
|
|
72
|
-
descriptor.stateAbi !== "legacy-cache-array-v1")
|
|
73
|
-
throw new Error(`speculative binding ${descriptor.id} has an incompatible backend, graph, or state ABI`);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/** Run one target forward, and when `tapLayers` is set (⟹ a Gemma4 target — a
|
|
77
|
-
* DSpark-style source), also return the captured multi-layer context
|
|
78
|
-
* [1,L,m*H] (tapLayers concatenated on the feature axis; index nLayers is the
|
|
79
|
-
* post-finalNorm sentinel). Non-tapping sources get ctxML=null and never
|
|
80
|
-
* touch model.hiddenTap. Mirrors generate-dflash.ts forwardTapped. */
|
|
81
|
-
async function legacyForwardWithTaps(
|
|
82
|
-
model: RuntimeModel,
|
|
83
|
-
ids: MlxArray,
|
|
84
|
-
caches: Cache[],
|
|
85
|
-
tapLayers: number[] | undefined,
|
|
86
|
-
work?: MlxForwardWork,
|
|
87
|
-
): Promise<{ hidden: MlxArray; ctxML: MlxArray | null }> {
|
|
88
|
-
if (!tapLayers) {
|
|
89
|
-
if (work) return { hidden: await work(ids, caches), ctxML: null };
|
|
90
|
-
const asyncModel = model as RuntimeModel & {
|
|
91
|
-
forwardHiddenAsync?: (
|
|
92
|
-
ids: MlxArray,
|
|
93
|
-
caches: Cache[],
|
|
94
|
-
) => Promise<MlxArray>;
|
|
95
|
-
};
|
|
96
|
-
const hidden = typeof asyncModel.forwardHiddenAsync === "function"
|
|
97
|
-
? await asyncModel.forwardHiddenAsync(ids, caches)
|
|
98
|
-
: model.forwardHidden(ids, caches);
|
|
99
|
-
return { hidden, ctxML: null };
|
|
100
|
-
}
|
|
101
|
-
if (!("hiddenTap" in model)) throw new Error("target graph does not support hidden taps");
|
|
102
|
-
const m = model;
|
|
103
|
-
const previousTap = m.hiddenTap;
|
|
104
|
-
const cap = new Map<number, MlxArray>();
|
|
105
|
-
const layers = new Set(tapLayers);
|
|
106
|
-
if (!work) m.hiddenTap = { layers, captured: cap };
|
|
107
|
-
let hidden: MlxArray | null = null;
|
|
108
|
-
try {
|
|
109
|
-
hidden = work ? await work(ids, caches, { captureLayer(layer, h) {
|
|
110
|
-
if (layers.has(layer)) cap.set(layer, ops.contiguous(h));
|
|
111
|
-
} }) : model.forwardHidden(ids, caches);
|
|
112
|
-
const perLayer = tapLayers.map((li) => {
|
|
113
|
-
const a = cap.get(li);
|
|
114
|
-
if (!a) throw new Error(`spec tap: layer ${li} not captured`);
|
|
115
|
-
return a;
|
|
116
|
-
});
|
|
117
|
-
const ctxML = ops.concatAxis(perLayer, 2); // [1,L,m*H]
|
|
118
|
-
for (const [, a] of cap) a.dispose();
|
|
119
|
-
cap.clear(); // consumed — the finally must not double-dispose
|
|
120
|
-
const out = { hidden, ctxML };
|
|
121
|
-
hidden = null; // ownership returned to the caller
|
|
122
|
-
return out;
|
|
123
|
-
} finally {
|
|
124
|
-
// On any throw (forward mid-capture, missing layer, concat), free the
|
|
125
|
-
// partially-captured tap tensors and the orphaned hidden. On success both
|
|
126
|
-
// are already gone (cap cleared, hidden nulled).
|
|
127
|
-
hidden?.dispose();
|
|
128
|
-
for (const [, a] of cap) a.dispose();
|
|
129
|
-
if (!work) m.hiddenTap = previousTap;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
import type { BatchableCache, Cache } from "../../model/gemma4-base";
|
|
2
|
-
import { applyStateChanges, cleanupFailure, disposeResources } from "../../engine/resources";
|
|
3
|
-
import type { PreparedStateChange } from "../../contracts/resources";
|
|
4
|
-
|
|
5
|
-
/** Preserve the graph's layout capabilities when an empty sibling is made. */
|
|
6
|
-
export interface MlxRowLayout<Layout extends BatchableCache> extends BatchableCache {
|
|
7
|
-
makeEmptyBatch(): Layout;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
/** Layer layouts own tensor geometry. This collection only applies the same
|
|
11
|
-
* row membership operation to every layer. It has no scheduling, sampling,
|
|
12
|
-
* checkpoint-key or persistence policy. */
|
|
13
|
-
export class MlxStateRows<Layout extends MlxRowLayout<Layout> = BatchableCache> {
|
|
14
|
-
/** Borrowed by the bound target graph; collection ownership stays here. */
|
|
15
|
-
readonly caches: Layout[];
|
|
16
|
-
#rows = 0;
|
|
17
|
-
|
|
18
|
-
/** Takes ownership of empty, compatible layer layouts. */
|
|
19
|
-
constructor(layouts: readonly Layout[]) { this.caches = [...layouts]; }
|
|
20
|
-
get rowCount(): number { return this.#rows; }
|
|
21
|
-
/** Retain an immutable batch boundary without extracting or materializing
|
|
22
|
-
* individual rows. Layer layouts decide how to share their backing arrays. */
|
|
23
|
-
clone(): MlxStateRows<Layout> {
|
|
24
|
-
const layouts: Layout[] = [];
|
|
25
|
-
try {
|
|
26
|
-
for (const source of this.caches) {
|
|
27
|
-
const layout = source.makeEmptyBatch(); layouts.push(layout);
|
|
28
|
-
layout.mergeRows([source]);
|
|
29
|
-
}
|
|
30
|
-
const result = new MlxStateRows(layouts); result.#rows = this.#rows;
|
|
31
|
-
return result;
|
|
32
|
-
} catch (error) { return cleanupFailure(error, () => disposeResources(layouts)); }
|
|
33
|
-
}
|
|
34
|
-
/** Prepare an initial cohort with one merge per layer. */
|
|
35
|
-
mergeRows(rows: readonly (readonly Cache[])[]): void {
|
|
36
|
-
const next: Layout[] = [];
|
|
37
|
-
try {
|
|
38
|
-
for (let layer = 0; layer < this.caches.length; layer++) {
|
|
39
|
-
const layout = this.caches[layer]!.makeEmptyBatch(); next.push(layout);
|
|
40
|
-
layout.mergeRows(rows.map(row => row[layer]!));
|
|
41
|
-
}
|
|
42
|
-
} catch (error) { return cleanupFailure(error, () => disposeResources(next)); }
|
|
43
|
-
const previous = this.caches.splice(0, this.caches.length, ...next);
|
|
44
|
-
this.#rows = rows.length; disposeResources(previous);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/** Borrow a prepared request's state. Build every replacement before
|
|
48
|
-
* releasing the active group, so a failed admission leaves it intact. */
|
|
49
|
-
append(row: readonly Cache[]): void {
|
|
50
|
-
applyStateChanges([() => this.prepareAppend(row)]);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/** Stage membership so a method can compose it with companion-state admission. */
|
|
54
|
-
prepareAppend(row: readonly Cache[]): PreparedStateChange {
|
|
55
|
-
return this.prepareAppendMany([row]);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/** Stage several admissions with one membership operation per layer. */
|
|
59
|
-
prepareAppendMany(rows: readonly (readonly Cache[])[]): PreparedStateChange {
|
|
60
|
-
const next: Layout[] = [];
|
|
61
|
-
try {
|
|
62
|
-
for (let layer = 0; layer < this.caches.length; layer++) {
|
|
63
|
-
const layout = this.caches[layer]!;
|
|
64
|
-
const merged = layout.makeEmptyBatch();
|
|
65
|
-
next.push(merged);
|
|
66
|
-
merged.mergeRows([...(this.#rows ? [layout] : []), ...rows.map(row => row[layer]!)]);
|
|
67
|
-
}
|
|
68
|
-
} catch (error) { return cleanupFailure(error, () => disposeResources(next)); }
|
|
69
|
-
return {
|
|
70
|
-
commit: () => {
|
|
71
|
-
const previous = this.caches.splice(0, this.caches.length, ...next.splice(0));
|
|
72
|
-
this.#rows += rows.length;
|
|
73
|
-
next.push(...previous);
|
|
74
|
-
},
|
|
75
|
-
dispose: () => disposeResources(next.splice(0)),
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/** The method calls this only between committed steps. A layer failure
|
|
80
|
-
* invalidates the group; its caller discards the state. */
|
|
81
|
-
filterRows(keep: readonly number[]): void {
|
|
82
|
-
if (!keep.length) { this.clear(); return; }
|
|
83
|
-
for (const layout of this.caches) layout.filterRows(keep);
|
|
84
|
-
this.#rows = keep.length;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
/** Returns independent request state for a cache publisher or a new group. */
|
|
88
|
-
extractRow(row: number): Cache[] {
|
|
89
|
-
const state: Cache[] = [];
|
|
90
|
-
try { for (const layout of this.caches) state.push(layout.extractRow(row)); return state; }
|
|
91
|
-
catch (error) { return cleanupFailure(error, () => disposeResources(state)); }
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
clear(): void {
|
|
95
|
-
const next: Layout[] = [];
|
|
96
|
-
try { for (const layout of this.caches) next.push(layout.makeEmptyBatch()); }
|
|
97
|
-
catch (error) { return cleanupFailure(error, () => disposeResources(next)); }
|
|
98
|
-
const previous = this.caches.splice(0, this.caches.length, ...next);
|
|
99
|
-
this.#rows = 0;
|
|
100
|
-
disposeResources(previous);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
dispose(): void { this.#rows = 0; disposeResources(this.caches); }
|
|
104
|
-
}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import type { StateView } from "../../contracts/resources";
|
|
2
|
-
import { disposeResources, ownResource } from "../../engine/resources";
|
|
3
|
-
import type { MlxArray } from "../../mlx/array";
|
|
4
|
-
import { isBatchableCache, type Cache } from "../../model/gemma4-base";
|
|
5
|
-
import { cloneKvCaches, type CacheCodecProvider } from "../../kv-store";
|
|
6
|
-
|
|
7
|
-
/** Compatibility boundary for legacy state(). Numerical code consumes a lease,
|
|
8
|
-
* never the legacy ownership marker. No copy, evaluation or fence is added. */
|
|
9
|
-
export function leaseCacheState(cache: Cache): StateView<MlxArray> {
|
|
10
|
-
return ownResource<readonly MlxArray[]>(cache.state(), cache.stateNeedsDispose ? disposeResources : () => {});
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
/** Preserve the existing prefill evaluation order: temporary views first,
|
|
14
|
-
* borrowed state second. Partial acquisition releases every acquired view. */
|
|
15
|
-
export function leaseCacheStates(caches: readonly Cache[]): StateView<MlxArray> {
|
|
16
|
-
const leases: StateView<MlxArray>[] = [];
|
|
17
|
-
const close = () => disposeResources(leases.map((lease) => ({ dispose: () => lease.close() })));
|
|
18
|
-
try {
|
|
19
|
-
for (const owned of [true, false]) {
|
|
20
|
-
for (const cache of caches) if (!!cache.stateNeedsDispose === owned) leases.push(leaseCacheState(cache));
|
|
21
|
-
}
|
|
22
|
-
return ownResource(leases.flatMap((lease) => [...lease.borrow()]), close);
|
|
23
|
-
} catch (error) {
|
|
24
|
-
try { close(); } catch (cleanupError) { throw new AggregateError([error, cleanupError], "state view acquisition failed"); }
|
|
25
|
-
throw error;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/** Precision/storage transitions constrain reuse independently of scheduling. */
|
|
30
|
-
export function minimumReusableOffset(caches: readonly Pick<Cache, "minimumReusableOffset">[]): number {
|
|
31
|
-
return Math.max(0, ...caches.map(cache => cache.minimumReusableOffset ?? 0));
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/** Snapshot an adopted single-row state into persistence-compatible caches.
|
|
35
|
-
* Row layouts own compact extraction; ordinary serial caches use their codec. */
|
|
36
|
-
export function cloneSingleRowState(caches: readonly Cache[], codecs?: CacheCodecProvider): Cache[] {
|
|
37
|
-
const owned: Cache[] = [];
|
|
38
|
-
try {
|
|
39
|
-
for (const cache of caches) owned.push(...(isBatchableCache(cache)
|
|
40
|
-
? [cache.extractRow(0)] : cloneKvCaches([cache], codecs)));
|
|
41
|
-
return owned;
|
|
42
|
-
} catch (error) {
|
|
43
|
-
try { disposeResources(owned); } catch (cleanupError) { throw new AggregateError([error, cleanupError], "single-row snapshot failed"); }
|
|
44
|
-
throw error;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { Glm52Cache } from "../../model/glm52-cache";
|
|
2
|
-
import { SpeculativeRotatingKVCache } from "../../model/speculative-rotating-kv";
|
|
3
|
-
import { RotatingAffineLayout, SpeculativeRotatingAffineLayout } from "../../model/rotating-kv-layout";
|
|
4
|
-
import type { Cache } from "../../model/gemma4-base";
|
|
5
|
-
import { KVCache, QuantizedKVCache, TurboQuantKVCache, RotatingKVCache, RotatingQuantizedKVCache } from "../../model/gemma4-base";
|
|
6
|
-
import { DelayedRotatingQuantizedKVCache } from "../../model/delayed-rotating-quantized-kv";
|
|
7
|
-
import { DelayedQuantizedKVCache } from "../../model/delayed-quantized-kv";
|
|
8
|
-
import { DelayedTurboQuantKVCache } from "../../model/delayed-turboquant-kv";
|
|
9
|
-
import { SSMCache } from "../../model/qwen3-delta";
|
|
10
|
-
import { BatchedSSMCache } from "../../model/batched-ssm";
|
|
11
|
-
import { BatchedKVCache } from "../../model/batched-kv";
|
|
12
|
-
import { BatchedQuantizedKVCache } from "../../model/batched-quantized-kv";
|
|
13
|
-
import { BatchedTurboQuantKVCache } from "../../model/batched-turboquant-kv";
|
|
14
|
-
|
|
15
|
-
export type TargetRowLayout = Glm52Cache | DelayedRotatingQuantizedKVCache | RotatingAffineLayout | SpeculativeRotatingKVCache | BatchedKVCache | BatchedQuantizedKVCache | BatchedTurboQuantKVCache |
|
|
16
|
-
BatchedSSMCache | DelayedTurboQuantKVCache | DelayedQuantizedKVCache;
|
|
17
|
-
|
|
18
|
-
/** The storage binding advertises a row transaction factory. The gateway can
|
|
19
|
-
* compose supported model graphs without identifying their model family. */
|
|
20
|
-
export function targetRowLayoutFactory(cache: Cache): (() => TargetRowLayout) | undefined {
|
|
21
|
-
if (cache instanceof Glm52Cache) return () => cache.makeEmptyBatch();
|
|
22
|
-
if (cache instanceof DelayedRotatingQuantizedKVCache)
|
|
23
|
-
return () => new DelayedRotatingQuantizedKVCache(cache.maxSize, cache.groupSize, cache.bits, cache.start, cache.maintain, undefined, true);
|
|
24
|
-
if (cache instanceof RotatingAffineLayout || cache instanceof RotatingQuantizedKVCache)
|
|
25
|
-
return () => new SpeculativeRotatingAffineLayout(cache.maxSize, cache.groupSize, cache.bits);
|
|
26
|
-
if (cache instanceof RotatingKVCache || cache instanceof SpeculativeRotatingKVCache) return () => new SpeculativeRotatingKVCache(cache.maxSize);
|
|
27
|
-
if (cache instanceof DelayedTurboQuantKVCache || cache instanceof DelayedQuantizedKVCache ||
|
|
28
|
-
cache instanceof BatchedTurboQuantKVCache || cache instanceof BatchedKVCache ||
|
|
29
|
-
cache instanceof BatchedQuantizedKVCache || cache instanceof BatchedSSMCache) return () => cache.makeEmptyBatch();
|
|
30
|
-
if (cache instanceof TurboQuantKVCache) return () => new BatchedTurboQuantKVCache(cache.kBits, cache.vBits, cache.fusedDecode);
|
|
31
|
-
if (cache instanceof SSMCache) return () => new BatchedSSMCache();
|
|
32
|
-
if (cache instanceof QuantizedKVCache) return () => new BatchedQuantizedKVCache(cache.groupSize, cache.bits);
|
|
33
|
-
if (cache instanceof KVCache) return () => new BatchedKVCache();
|
|
34
|
-
return undefined;
|
|
35
|
-
}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import { createCompletionMethod } from "../../serve/session-completion-engine";
|
|
2
|
-
import type { ExecutionPlanner, InferenceEngine, Timer } from "../../contracts/generation";
|
|
3
|
-
import { createInferenceEngine, type EngineOptions } from "../../engine/engine";
|
|
4
|
-
import { throwIfCancelled } from "../../engine/cancellation";
|
|
5
|
-
import type { GenerateOptions, GenerateStats } from "../../generate";
|
|
6
|
-
import type { GenerationGateway, RequestShape } from "../../serve/generation-gateway";
|
|
7
|
-
|
|
8
|
-
/** Data-only API for text requests whose policy/shape was already
|
|
9
|
-
* resolved by the caller. Native request resources still belong to the prepared
|
|
10
|
-
* completion API; they are deliberately absent from this token API. */
|
|
11
|
-
export type TextGenerationOptions = Omit<GenerateOptions,
|
|
12
|
-
"signal" | "cache" | "grammar" | "fill" | "adapters" | "promptEmbeddings" |
|
|
13
|
-
"imageMask" | "multimodalMask" | "visionPixels" | "onPrefillDone" |
|
|
14
|
-
"onDecodeCheckpoint" | "initialPendingToken" | "initialGeneratedTokens" |
|
|
15
|
-
"originalPromptTokens" | "snapshotAt" | "checkpointEveryTokens"
|
|
16
|
-
>;
|
|
17
|
-
|
|
18
|
-
export interface TextGenerationRequest {
|
|
19
|
-
readonly promptIds: readonly number[];
|
|
20
|
-
readonly options: TextGenerationOptions;
|
|
21
|
-
readonly shape: RequestShape;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export const hostTimer: Timer = {
|
|
25
|
-
after(milliseconds, callback) {
|
|
26
|
-
const timer = setTimeout(callback, milliseconds);
|
|
27
|
-
return () => { clearTimeout(timer); };
|
|
28
|
-
},
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
/** Reuses the gateway's placement, exclusive lease, prompt cache, batching,
|
|
32
|
-
* and quant-specific execution. The portable session never imports them.
|
|
33
|
-
* Closing this engine cancels its sessions; it does not dispose a shared gateway. */
|
|
34
|
-
export function createTextInferenceEngine(
|
|
35
|
-
gateway: Pick<GenerationGateway, "place" | "run">,
|
|
36
|
-
options: Omit<EngineOptions, "timer"> & { timer?: Timer } = {},
|
|
37
|
-
): InferenceEngine<TextGenerationRequest, GenerateStats> {
|
|
38
|
-
const planner: ExecutionPlanner<TextGenerationRequest, GenerateStats> = {
|
|
39
|
-
async plan(request, cancellation) {
|
|
40
|
-
throwIfCancelled(cancellation);
|
|
41
|
-
if (request.shape.hasVision || request.shape.hasAdapters || request.shape.hasGrammar)
|
|
42
|
-
throw new Error("native request resources require the prepared completion API");
|
|
43
|
-
const placement = gateway.place(request.shape, request.options);
|
|
44
|
-
const maxTokens = request.options.maxTokens ?? 512;
|
|
45
|
-
return {
|
|
46
|
-
id: `text:${placement.mechanism}`, outputTokenLimit: maxTokens,
|
|
47
|
-
method: createCompletionMethod(gateway, {
|
|
48
|
-
prompt: [...request.promptIds], options: request.options,
|
|
49
|
-
shape: request.shape, placement,
|
|
50
|
-
}),
|
|
51
|
-
};
|
|
52
|
-
},
|
|
53
|
-
};
|
|
54
|
-
const engine = createInferenceEngine(planner, { ...options, timer: options.timer ?? hostTimer });
|
|
55
|
-
return {
|
|
56
|
-
open(request, control) {
|
|
57
|
-
// Snapshot before demand-start: callers may reuse/mutate request arrays.
|
|
58
|
-
// TextGenerationOptions contains data only; no native handles or callbacks.
|
|
59
|
-
const snapshot = structuredClone(request);
|
|
60
|
-
if (!snapshot.promptIds.length || snapshot.promptIds.some((id) => !Number.isInteger(id) || id < 0 || id > 0xffffffff))
|
|
61
|
-
return Promise.reject(new Error("prompt must contain valid token ids"));
|
|
62
|
-
const maxTokens = snapshot.options.maxTokens ?? 512;
|
|
63
|
-
if (!Number.isSafeInteger(maxTokens) || maxTokens <= 0)
|
|
64
|
-
return Promise.reject(new Error("text generation requires a positive token limit"));
|
|
65
|
-
if ((snapshot.options.topLogprobs ?? 0) > (options.maxTopLogprobs ?? 20))
|
|
66
|
-
return Promise.reject(new Error("top logprobs exceed session delivery capacity"));
|
|
67
|
-
if (control.output === "collect" && (snapshot.options.logprobs || snapshot.options.topLogprobs))
|
|
68
|
-
return Promise.reject(new Error("token logprobs require stream consumption"));
|
|
69
|
-
return engine.open(snapshot, control);
|
|
70
|
-
},
|
|
71
|
-
close: () => engine.close(),
|
|
72
|
-
};
|
|
73
|
-
}
|
|
@@ -1,173 +0,0 @@
|
|
|
1
|
-
import type { MlxArray } from "../../mlx/array";
|
|
2
|
-
import * as ops from "../../mlx/ops";
|
|
3
|
-
import type { BatchableCache, Cache, Mask } from "../../model/gemma4-base";
|
|
4
|
-
import { KvTensorRows } from "./kv-tensor-rows";
|
|
5
|
-
import { leaseCacheStates, minimumReusableOffset } from "./state-views";
|
|
6
|
-
import { withResource, disposeResources } from "../../engine/resources";
|
|
7
|
-
import { cloneKvCaches } from "../../kv-store";
|
|
8
|
-
|
|
9
|
-
/** Encoded layouts retain physical row alignment across precision changes. */
|
|
10
|
-
export interface TransitionedKvLayout extends BatchableCache {
|
|
11
|
-
alignRows?(leftPad: readonly number[]): void;
|
|
12
|
-
}
|
|
13
|
-
export interface SpeculativeTransitionedKvLayout extends TransitionedKvLayout {
|
|
14
|
-
specRoundBegin(): void;
|
|
15
|
-
specRoundCommit(): void;
|
|
16
|
-
specRoundRollback(keep: number | readonly number[]): void;
|
|
17
|
-
}
|
|
18
|
-
export interface KvRowTransition<Layout extends TransitionedKvLayout> {
|
|
19
|
-
readonly signature: string;
|
|
20
|
-
readonly conversionOffset?: number;
|
|
21
|
-
maintain(rows: Cache[]): void;
|
|
22
|
-
converted(row: Cache): boolean;
|
|
23
|
-
makeLayout(): Layout;
|
|
24
|
-
packRows?(layout: Layout, rows: readonly Cache[]): void;
|
|
25
|
-
prepareRows?(rows: Cache[]): Cache[];
|
|
26
|
-
extractRow?(row: Cache): Cache;
|
|
27
|
-
rollbackRow?(row: Cache, before: number, keep: number, preserveColumns: boolean): void;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
export interface TransitioningKvPositions {
|
|
32
|
-
readonly rowOffsets: readonly number[];
|
|
33
|
-
readonly leftPad: readonly number[];
|
|
34
|
-
readonly offset: number;
|
|
35
|
-
readonly batchSize: number | null;
|
|
36
|
-
readonly ropeOffsetArr: MlxArray | undefined;
|
|
37
|
-
sync(rows: readonly Cache[], preserve: boolean): void;
|
|
38
|
-
filterRows(keep: readonly number[]): void;
|
|
39
|
-
makeMask(tokens: number, window: number | null): Mask;
|
|
40
|
-
dispose(): void;
|
|
41
|
-
}
|
|
42
|
-
export class FullKvPositions extends KvTensorRows implements TransitioningKvPositions {
|
|
43
|
-
sync(rows: readonly Cache[], preserve: boolean): void {
|
|
44
|
-
this.mergeRows(preserve
|
|
45
|
-
? [{ planes: [], rowOffsets: rows.map(row => row.offset), leftPad: [...this.leftPad] }]
|
|
46
|
-
: rows.map(row => ({ planes: [], rowOffsets: [row.offset], leftPad: [0] })));
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/** Owns membership, committed positions and precision transitions. Codec and
|
|
51
|
-
* attention adapters own tensor access; scheduling and persistence use the
|
|
52
|
-
* existing batch and checkpoint contracts. Row conversion never examines an
|
|
53
|
-
* uncommitted speculative suffix. */
|
|
54
|
-
export abstract class TransitioningKvRows<Layout extends TransitionedKvLayout> implements BatchableCache {
|
|
55
|
-
protected readonly positions: TransitioningKvPositions;
|
|
56
|
-
protected rows: Cache[] = [];
|
|
57
|
-
protected packed?: Layout;
|
|
58
|
-
#prefilling = false;
|
|
59
|
-
|
|
60
|
-
readonly stateNeedsDispose = true;
|
|
61
|
-
constructor(readonly transition: KvRowTransition<Layout>, row?: Cache, positions: TransitioningKvPositions = new FullKvPositions()) {
|
|
62
|
-
this.positions = positions;
|
|
63
|
-
if (row) { this.rows = transition.prepareRows?.([row]) ?? [row]; this.syncPositions(); }
|
|
64
|
-
}
|
|
65
|
-
signature(): string { return this.transition.signature; }
|
|
66
|
-
get prefillMaintenance() { return this; }
|
|
67
|
-
beginPrefill(): void { this.#prefilling = true; }
|
|
68
|
-
commitPrefill(indices: readonly number[]): void {
|
|
69
|
-
if (this.packed) return;
|
|
70
|
-
for (const index of indices) {
|
|
71
|
-
const row = [this.rows[index]!];
|
|
72
|
-
try { this.transition.maintain(row); }
|
|
73
|
-
finally { this.rows[index] = row[0]!; }
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
endPrefill(): void { this.#prefilling = false; }
|
|
77
|
-
get minimumReusableOffset(): number { return this.packed?.minimumReusableOffset ?? minimumReusableOffset(this.rows); }
|
|
78
|
-
get rowOffsets(): readonly number[] { return this.packed?.rowOffsets ?? this.positions.rowOffsets; }
|
|
79
|
-
get leftPad(): readonly number[] { return this.packed?.leftPad ?? this.positions.leftPad; }
|
|
80
|
-
get offset(): number { return this.packed?.offset ?? this.positions.offset; }
|
|
81
|
-
maxAppendTokens(): number {
|
|
82
|
-
if (this.packed) return this.packed.maxAppendTokens?.() ?? Infinity;
|
|
83
|
-
const end = this.transition.conversionOffset;
|
|
84
|
-
if (end === undefined) return Infinity;
|
|
85
|
-
return Math.min(Infinity, ...this.rowOffsets.map((offset, row) =>
|
|
86
|
-
offset < end && !this.transition.converted(this.rows[row]!) ? end - offset : Infinity));
|
|
87
|
-
}
|
|
88
|
-
get batchSize(): number | null { return this.packed?.batchSize ?? this.positions.batchSize; }
|
|
89
|
-
get ropeOffsetArr(): MlxArray | undefined { return this.packed ? this.packed.ropeOffsetArr : this.positions.ropeOffsetArr; }
|
|
90
|
-
bytesPerToken(): number { return this.packed?.bytesPerToken?.() ?? Math.max(0, ...this.rows.map(row => row.bytesPerToken?.() ?? 0)); }
|
|
91
|
-
projectedBytes(tokens: number): number { return this.bytesPerToken() * tokens; }
|
|
92
|
-
makeMask(tokens: number, window: number | null): Mask { return (this.packed ?? this.positions).makeMask(tokens, window); }
|
|
93
|
-
isTrimmable(): boolean { return this.packed?.isTrimmable() ?? this.rows.every(row => row.isTrimmable()); }
|
|
94
|
-
trim(count: number): void {
|
|
95
|
-
if (this.packed) this.packed.trim(count);
|
|
96
|
-
else { for (const row of this.rows) row.trim(count); this.syncPositions(true); }
|
|
97
|
-
}
|
|
98
|
-
protected syncPositions(preserve = false): void { this.positions.sync(this.rows, preserve); }
|
|
99
|
-
protected advance(): void {
|
|
100
|
-
if (this.packed) return;
|
|
101
|
-
if (!this.#prefilling) this.transition.maintain(this.rows);
|
|
102
|
-
if (this.rows.length && this.rows.every(row => this.transition.converted(row))) {
|
|
103
|
-
const packed = this.transition.makeLayout();
|
|
104
|
-
try {
|
|
105
|
-
if (this.transition.packRows) this.transition.packRows(packed, this.rows);
|
|
106
|
-
else packed.mergeRows(this.rows);
|
|
107
|
-
packed.alignRows?.(this.positions.leftPad);
|
|
108
|
-
}
|
|
109
|
-
catch (error) { packed.dispose(); throw error; }
|
|
110
|
-
const previous = this.rows; this.rows = []; this.packed = packed;
|
|
111
|
-
this.positions.dispose(); disposeResources(previous);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
abstract updateAndFetch(k: MlxArray, v: MlxArray): [MlxArray, MlxArray];
|
|
115
|
-
abstract makeEmptyBatch(): TransitioningKvRows<Layout>;
|
|
116
|
-
mergeRows(rows: readonly Cache[]): void {
|
|
117
|
-
const owned: Cache[] = [];
|
|
118
|
-
try {
|
|
119
|
-
for (const row of rows) {
|
|
120
|
-
if (row instanceof TransitioningKvRows) {
|
|
121
|
-
for (let index = 0; index < row.batchSize!; index++) owned.push(row.extractRow(index));
|
|
122
|
-
} else owned.push(...cloneKvCaches([row]));
|
|
123
|
-
}
|
|
124
|
-
} catch (error) { disposeResources(owned); throw error; }
|
|
125
|
-
let prepared: Cache[];
|
|
126
|
-
try { prepared = this.transition.prepareRows?.(owned) ?? owned; }
|
|
127
|
-
catch (error) { disposeResources(owned); throw error; }
|
|
128
|
-
this.dispose(); this.rows = prepared; this.syncPositions();
|
|
129
|
-
}
|
|
130
|
-
filterRows(keep: readonly number[]): void {
|
|
131
|
-
if (this.packed) { this.packed.filterRows(keep); return; }
|
|
132
|
-
const previous = this.rows; this.rows = keep.map(index => previous[index]!);
|
|
133
|
-
disposeResources(previous.filter((_, index) => !keep.includes(index))); this.positions.filterRows(keep);
|
|
134
|
-
}
|
|
135
|
-
extractRow(row: number): Cache { return this.packed?.extractRow(row) ?? (this.transition.extractRow?.(this.rows[row]!) ?? cloneKvCaches([this.rows[row]!])[0]!); }
|
|
136
|
-
state(): MlxArray[] {
|
|
137
|
-
return withResource(leaseCacheStates(this.packed ? [this.packed] : this.rows), arrays => {
|
|
138
|
-
const views: MlxArray[] = [];
|
|
139
|
-
try { for (const array of arrays) views.push(ops.contiguous(array)); return views; }
|
|
140
|
-
catch (error) { disposeResources(views); throw error; }
|
|
141
|
-
});
|
|
142
|
-
}
|
|
143
|
-
dispose(): void {
|
|
144
|
-
this.#prefilling = false;
|
|
145
|
-
const previous = this.rows; this.rows = [];
|
|
146
|
-
this.packed?.dispose(); this.packed = undefined; this.positions.dispose(); disposeResources(previous);
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
/** Rollback is a method capability, separate from ordinary cache membership. */
|
|
151
|
-
export abstract class SpeculativeTransitioningKvRows<Layout extends SpeculativeTransitionedKvLayout> extends TransitioningKvRows<Layout> {
|
|
152
|
-
#beforeRound?: number[];
|
|
153
|
-
specRoundBegin(): void {
|
|
154
|
-
this.advance(); this.#beforeRound = [...this.rowOffsets]; this.packed?.specRoundBegin();
|
|
155
|
-
}
|
|
156
|
-
specRoundCommit(): void {
|
|
157
|
-
this.packed?.specRoundCommit(); this.#beforeRound = undefined; this.advance();
|
|
158
|
-
}
|
|
159
|
-
specRoundRollback(keep: number | readonly number[]): void {
|
|
160
|
-
if (this.packed) this.packed.specRoundRollback(keep);
|
|
161
|
-
else {
|
|
162
|
-
for (const [index, row] of this.rows.entries()) {
|
|
163
|
-
const count = typeof keep === "number" ? keep : keep[index]!;
|
|
164
|
-
const before = this.#beforeRound![index]!;
|
|
165
|
-
if (this.transition.rollbackRow) this.transition.rollbackRow(row, before, count, this.rows.length > 1);
|
|
166
|
-
else row.trim(row.offset - before - count);
|
|
167
|
-
}
|
|
168
|
-
this.syncPositions(true);
|
|
169
|
-
}
|
|
170
|
-
this.#beforeRound = undefined; this.advance();
|
|
171
|
-
}
|
|
172
|
-
override dispose(): void { this.#beforeRound = undefined; super.dispose(); }
|
|
173
|
-
}
|