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
package/src/expert-usage.ts
DELETED
|
@@ -1,415 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
closeSync,
|
|
3
|
-
existsSync,
|
|
4
|
-
fsyncSync,
|
|
5
|
-
openSync,
|
|
6
|
-
readFileSync,
|
|
7
|
-
renameSync,
|
|
8
|
-
rmSync,
|
|
9
|
-
writeSync,
|
|
10
|
-
} from "node:fs";
|
|
11
|
-
|
|
12
|
-
const UINT32_MAX = 0xffff_ffff;
|
|
13
|
-
|
|
14
|
-
export interface ExpertUsageRoute {
|
|
15
|
-
readonly indices: ArrayLike<number>;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export interface ExpertUsageLedgerOptions {
|
|
19
|
-
readonly path: string;
|
|
20
|
-
readonly layers: readonly number[];
|
|
21
|
-
readonly expertsPerLayer: number;
|
|
22
|
-
/** A damaged profile is derived state: report it and start fresh. */
|
|
23
|
-
readonly onWarning?: (message: string) => void;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export interface ExpertUsageEntry {
|
|
27
|
-
readonly count: number;
|
|
28
|
-
readonly heat: number;
|
|
29
|
-
readonly lastAccess: number;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export interface ExpertUsageSnapshot {
|
|
33
|
-
readonly clock: number;
|
|
34
|
-
readonly routeSelections: number;
|
|
35
|
-
readonly totalCount: number;
|
|
36
|
-
readonly nonzeroCounts: number;
|
|
37
|
-
readonly dirty: boolean;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export interface ExpertUsageCount {
|
|
41
|
-
readonly layer: number;
|
|
42
|
-
readonly expertId: number;
|
|
43
|
-
readonly count: number;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export interface ExpertAutoPinPlan {
|
|
47
|
-
readonly historySelections: number;
|
|
48
|
-
readonly confidence: number;
|
|
49
|
-
readonly requestedBudgetBytes: number;
|
|
50
|
-
readonly usableBudgetBytes: number;
|
|
51
|
-
readonly plannedBytes: number;
|
|
52
|
-
readonly pins: readonly ExpertUsageCount[];
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export interface ExpertAutoPinInput {
|
|
56
|
-
readonly ledger: ExpertUsageLedger;
|
|
57
|
-
/** Bytes available to the persistent LRU + pin tiers after working banks. */
|
|
58
|
-
readonly residentTierBudgetBytes: number;
|
|
59
|
-
/** One non-evictable LRU slot per managed layer. */
|
|
60
|
-
readonly mandatoryResidentBytes: number;
|
|
61
|
-
readonly slotBytes: (layer: number) => number;
|
|
62
|
-
readonly minHistorySelections?: number;
|
|
63
|
-
readonly fullConfidenceSelections?: number;
|
|
64
|
-
readonly pinShare?: number;
|
|
65
|
-
readonly minPinBudgetBytes?: number;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
export interface ExpertLfruCandidate {
|
|
69
|
-
readonly layer: number;
|
|
70
|
-
readonly coldSlot: number;
|
|
71
|
-
readonly coldExpertId: number;
|
|
72
|
-
readonly hotExpertId: number;
|
|
73
|
-
readonly coldScore: number;
|
|
74
|
-
readonly hotScore: number;
|
|
75
|
-
readonly gain: number;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
export function expertLfruScore(
|
|
79
|
-
heat: number,
|
|
80
|
-
lastAccess: number,
|
|
81
|
-
clock: number,
|
|
82
|
-
): number {
|
|
83
|
-
const age = (clock - lastAccess) >>> 0;
|
|
84
|
-
return heat * 256 + (age < 255 ? 255 - age : 0);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
export function selectExpertLfruCandidates(
|
|
88
|
-
candidates: readonly ExpertLfruCandidate[],
|
|
89
|
-
limit = 4,
|
|
90
|
-
): ExpertLfruCandidate[] {
|
|
91
|
-
positiveSafeInteger(limit, "live-repin limit");
|
|
92
|
-
return candidates.slice().sort((left, right) =>
|
|
93
|
-
right.gain - left.gain ||
|
|
94
|
-
left.layer - right.layer ||
|
|
95
|
-
left.hotExpertId - right.hotExpertId)
|
|
96
|
-
.slice(0, limit);
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
function positiveSafeInteger(value: number, name: string): void {
|
|
100
|
-
if (!Number.isSafeInteger(value) || value <= 0)
|
|
101
|
-
throw new RangeError(`${name} must be a positive safe integer`);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
function incrementUint32(value: number, amount: number): number {
|
|
105
|
-
return Math.min(UINT32_MAX, value + amount);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* Colibri-compatible long-term expert frequency plus session-local heat and
|
|
110
|
-
* recency. The on-disk format is one `layer expert count` row per nonzero
|
|
111
|
-
* counter, matching Colibri's `.coli_usage` reader.
|
|
112
|
-
*/
|
|
113
|
-
export class ExpertUsageLedger {
|
|
114
|
-
readonly path: string;
|
|
115
|
-
readonly layers: readonly number[];
|
|
116
|
-
readonly expertsPerLayer: number;
|
|
117
|
-
#counts = new Map<number, Uint32Array>();
|
|
118
|
-
#heat = new Map<number, Uint32Array>();
|
|
119
|
-
#last = new Map<number, Uint32Array>();
|
|
120
|
-
#clock = 0;
|
|
121
|
-
#routeSelections = 0;
|
|
122
|
-
#dirty = false;
|
|
123
|
-
|
|
124
|
-
private constructor(options: ExpertUsageLedgerOptions) {
|
|
125
|
-
if (!options.path) throw new Error("expert usage path must not be empty");
|
|
126
|
-
positiveSafeInteger(options.expertsPerLayer, "expertsPerLayer");
|
|
127
|
-
if (options.expertsPerLayer > UINT32_MAX)
|
|
128
|
-
throw new RangeError("expertsPerLayer exceeds uint32 range");
|
|
129
|
-
const layers = options.layers.slice();
|
|
130
|
-
if (layers.length === 0 || new Set(layers).size !== layers.length)
|
|
131
|
-
throw new Error("expert usage layers must be non-empty and unique");
|
|
132
|
-
for (const layer of layers)
|
|
133
|
-
if (!Number.isSafeInteger(layer) || layer < 0)
|
|
134
|
-
throw new RangeError(`invalid expert usage layer ${layer}`);
|
|
135
|
-
this.path = options.path;
|
|
136
|
-
this.layers = Object.freeze(layers);
|
|
137
|
-
this.expertsPerLayer = options.expertsPerLayer;
|
|
138
|
-
for (const layer of layers) {
|
|
139
|
-
this.#counts.set(layer, new Uint32Array(options.expertsPerLayer));
|
|
140
|
-
this.#heat.set(layer, new Uint32Array(options.expertsPerLayer));
|
|
141
|
-
this.#last.set(layer, new Uint32Array(options.expertsPerLayer));
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
static open(options: ExpertUsageLedgerOptions): ExpertUsageLedger {
|
|
146
|
-
const ledger = new ExpertUsageLedger(options);
|
|
147
|
-
if (!existsSync(options.path)) return ledger;
|
|
148
|
-
try {
|
|
149
|
-
ledger.#load(readFileSync(options.path, "utf8"));
|
|
150
|
-
} catch (error) {
|
|
151
|
-
const detail = error instanceof Error ? error.message : String(error);
|
|
152
|
-
options.onWarning?.(
|
|
153
|
-
`ignoring invalid expert usage profile ${options.path}: ${detail}`,
|
|
154
|
-
);
|
|
155
|
-
ledger.#clearCounts();
|
|
156
|
-
}
|
|
157
|
-
return ledger;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
/** Count every selected route before the execution plan deduplicates it. */
|
|
161
|
-
recordRoutes(layer: number, routes: readonly ExpertUsageRoute[]): void {
|
|
162
|
-
const counts = this.#counts.get(layer);
|
|
163
|
-
const heat = this.#heat.get(layer);
|
|
164
|
-
const last = this.#last.get(layer);
|
|
165
|
-
if (!counts || !heat || !last)
|
|
166
|
-
throw new RangeError(`layer ${layer} is not tracked by expert usage`);
|
|
167
|
-
|
|
168
|
-
const selected: number[] = [];
|
|
169
|
-
for (let row = 0; row < routes.length; row++) {
|
|
170
|
-
for (let rank = 0; rank < routes[row]!.indices.length; rank++) {
|
|
171
|
-
const expertId = Number(routes[row]!.indices[rank]);
|
|
172
|
-
if (!Number.isSafeInteger(expertId) || expertId < 0 ||
|
|
173
|
-
expertId >= this.expertsPerLayer) {
|
|
174
|
-
throw new RangeError(
|
|
175
|
-
`route ${row} rank ${rank} has invalid expert ${expertId}`,
|
|
176
|
-
);
|
|
177
|
-
}
|
|
178
|
-
selected.push(expertId);
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
for (const expertId of selected) {
|
|
183
|
-
counts[expertId] = incrementUint32(counts[expertId]!, 1);
|
|
184
|
-
heat[expertId] = incrementUint32(heat[expertId]!, 1);
|
|
185
|
-
this.#clock = (this.#clock + 1) >>> 0;
|
|
186
|
-
last[expertId] = this.#clock;
|
|
187
|
-
this.#routeSelections++;
|
|
188
|
-
}
|
|
189
|
-
if (selected.length) this.#dirty = true;
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
entry(layer: number, expertId: number): ExpertUsageEntry {
|
|
193
|
-
this.#validateEntry(layer, expertId);
|
|
194
|
-
return {
|
|
195
|
-
count: this.#counts.get(layer)![expertId]!,
|
|
196
|
-
heat: this.#heat.get(layer)![expertId]!,
|
|
197
|
-
lastAccess: this.#last.get(layer)![expertId]!,
|
|
198
|
-
};
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
snapshot(): ExpertUsageSnapshot {
|
|
202
|
-
let nonzeroCounts = 0;
|
|
203
|
-
let totalCount = 0;
|
|
204
|
-
for (const counts of this.#counts.values())
|
|
205
|
-
for (const count of counts) {
|
|
206
|
-
totalCount += count;
|
|
207
|
-
if (count !== 0) nonzeroCounts++;
|
|
208
|
-
}
|
|
209
|
-
return {
|
|
210
|
-
clock: this.#clock,
|
|
211
|
-
routeSelections: this.#routeSelections,
|
|
212
|
-
totalCount,
|
|
213
|
-
nonzeroCounts,
|
|
214
|
-
dirty: this.#dirty,
|
|
215
|
-
};
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
rankedCounts(): ExpertUsageCount[] {
|
|
219
|
-
const ranked: ExpertUsageCount[] = [];
|
|
220
|
-
for (const layer of this.layers) {
|
|
221
|
-
const counts = this.#counts.get(layer)!;
|
|
222
|
-
for (let expertId = 0; expertId < counts.length; expertId++) {
|
|
223
|
-
const count = counts[expertId]!;
|
|
224
|
-
if (count !== 0) ranked.push({ layer, expertId, count });
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
ranked.sort((left, right) =>
|
|
228
|
-
right.count - left.count ||
|
|
229
|
-
left.layer - right.layer ||
|
|
230
|
-
left.expertId - right.expertId);
|
|
231
|
-
return ranked;
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
lfruCandidate(
|
|
235
|
-
layer: number,
|
|
236
|
-
pinnedExpertIds: readonly number[],
|
|
237
|
-
): ExpertLfruCandidate | null {
|
|
238
|
-
if (pinnedExpertIds.length === 0) return null;
|
|
239
|
-
for (const expertId of pinnedExpertIds) this.#validateEntry(layer, expertId);
|
|
240
|
-
const pinned = new Set(pinnedExpertIds);
|
|
241
|
-
let coldSlot = 0;
|
|
242
|
-
let coldScore = this.#lfruScore(layer, pinnedExpertIds[0]!);
|
|
243
|
-
for (let slot = 1; slot < pinnedExpertIds.length; slot++) {
|
|
244
|
-
const score = this.#lfruScore(layer, pinnedExpertIds[slot]!);
|
|
245
|
-
if (score < coldScore) {
|
|
246
|
-
coldSlot = slot;
|
|
247
|
-
coldScore = score;
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
let hotExpertId = -1;
|
|
251
|
-
let hotScore = 0;
|
|
252
|
-
for (let expertId = 0; expertId < this.expertsPerLayer; expertId++) {
|
|
253
|
-
if (pinned.has(expertId)) continue;
|
|
254
|
-
const score = this.#lfruScore(layer, expertId);
|
|
255
|
-
if (hotExpertId < 0 || score > hotScore) {
|
|
256
|
-
hotExpertId = expertId;
|
|
257
|
-
hotScore = score;
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
if (hotExpertId < 0 ||
|
|
261
|
-
hotScore <= coldScore + Math.floor(coldScore / 4) + 4 * 256) {
|
|
262
|
-
return null;
|
|
263
|
-
}
|
|
264
|
-
return {
|
|
265
|
-
layer,
|
|
266
|
-
coldSlot,
|
|
267
|
-
coldExpertId: pinnedExpertIds[coldSlot]!,
|
|
268
|
-
hotExpertId,
|
|
269
|
-
coldScore,
|
|
270
|
-
hotScore,
|
|
271
|
-
gain: Math.floor((hotScore - coldScore) / 256),
|
|
272
|
-
};
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
decayHeat(): void {
|
|
276
|
-
for (const heat of this.#heat.values())
|
|
277
|
-
for (let expertId = 0; expertId < heat.length; expertId++)
|
|
278
|
-
heat[expertId] = heat[expertId]! >>> 1;
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
/** Persist the current profile with same-directory temp + atomic rename. */
|
|
282
|
-
flush(): void {
|
|
283
|
-
if (!this.#dirty) return;
|
|
284
|
-
const rows: string[] = [];
|
|
285
|
-
for (const layer of this.layers) {
|
|
286
|
-
const counts = this.#counts.get(layer)!;
|
|
287
|
-
for (let expertId = 0; expertId < counts.length; expertId++) {
|
|
288
|
-
const count = counts[expertId]!;
|
|
289
|
-
if (count !== 0) rows.push(`${layer} ${expertId} ${count}\n`);
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
const temp =
|
|
293
|
-
`${this.path}.tmp-${process.pid}-${Math.trunc(Bun.nanoseconds())}`;
|
|
294
|
-
let fd: number | null = null;
|
|
295
|
-
try {
|
|
296
|
-
fd = openSync(temp, "w", 0o600);
|
|
297
|
-
const data = Buffer.from(rows.join(""));
|
|
298
|
-
let written = 0;
|
|
299
|
-
while (written < data.length) {
|
|
300
|
-
written += writeSync(
|
|
301
|
-
fd,
|
|
302
|
-
data,
|
|
303
|
-
written,
|
|
304
|
-
data.length - written,
|
|
305
|
-
written,
|
|
306
|
-
);
|
|
307
|
-
}
|
|
308
|
-
fsyncSync(fd);
|
|
309
|
-
closeSync(fd);
|
|
310
|
-
fd = null;
|
|
311
|
-
renameSync(temp, this.path);
|
|
312
|
-
this.#dirty = false;
|
|
313
|
-
} catch (error) {
|
|
314
|
-
if (fd !== null) closeSync(fd);
|
|
315
|
-
try { rmSync(temp, { force: true }); } catch {}
|
|
316
|
-
throw error;
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
#load(text: string): void {
|
|
321
|
-
for (const [index, raw] of text.split("\n").entries()) {
|
|
322
|
-
const line = raw.trim();
|
|
323
|
-
if (!line) continue;
|
|
324
|
-
const fields = line.split(/\s+/);
|
|
325
|
-
if (fields.length !== 3)
|
|
326
|
-
throw new Error(`line ${index + 1}: expected layer expert count`);
|
|
327
|
-
const [layer, expertId, count] = fields.map(Number);
|
|
328
|
-
if (!Number.isSafeInteger(layer) || !this.#counts.has(layer!))
|
|
329
|
-
throw new Error(`line ${index + 1}: invalid layer ${fields[0]}`);
|
|
330
|
-
if (!Number.isSafeInteger(expertId) || expertId! < 0 ||
|
|
331
|
-
expertId! >= this.expertsPerLayer) {
|
|
332
|
-
throw new Error(`line ${index + 1}: invalid expert ${fields[1]}`);
|
|
333
|
-
}
|
|
334
|
-
if (!Number.isSafeInteger(count) || count! < 0 || count! > UINT32_MAX)
|
|
335
|
-
throw new Error(`line ${index + 1}: invalid count ${fields[2]}`);
|
|
336
|
-
const counts = this.#counts.get(layer!)!;
|
|
337
|
-
counts[expertId!] = incrementUint32(counts[expertId!]!, count!);
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
#clearCounts(): void {
|
|
342
|
-
for (const counts of this.#counts.values()) counts.fill(0);
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
#validateEntry(layer: number, expertId: number): void {
|
|
346
|
-
if (!this.#counts.has(layer))
|
|
347
|
-
throw new RangeError(`layer ${layer} is not tracked by expert usage`);
|
|
348
|
-
if (!Number.isSafeInteger(expertId) || expertId < 0 ||
|
|
349
|
-
expertId >= this.expertsPerLayer) {
|
|
350
|
-
throw new RangeError(`invalid expert ${expertId}`);
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
#lfruScore(layer: number, expertId: number): number {
|
|
355
|
-
const heat = this.#heat.get(layer)![expertId]!;
|
|
356
|
-
const last = this.#last.get(layer)![expertId]!;
|
|
357
|
-
return expertLfruScore(heat, last, this.#clock);
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
/**
|
|
362
|
-
* Faithful, budget-safe form of Colibri's startup AUTOPIN policy. History must
|
|
363
|
-
* reach 5k selections; confidence ramps to one at 200k; pins receive at most
|
|
364
|
-
* half of the resident-tier budget and are not created below a 0.5 GB tier.
|
|
365
|
-
*/
|
|
366
|
-
export function planExpertAutoPins(input: ExpertAutoPinInput): ExpertAutoPinPlan {
|
|
367
|
-
const minHistory = input.minHistorySelections ?? 5_000;
|
|
368
|
-
const fullConfidence = input.fullConfidenceSelections ?? 200_000;
|
|
369
|
-
const pinShare = input.pinShare ?? 0.5;
|
|
370
|
-
const minPinBudget = input.minPinBudgetBytes ?? 500_000_000;
|
|
371
|
-
positiveSafeInteger(minHistory, "auto-pin minHistorySelections");
|
|
372
|
-
positiveSafeInteger(fullConfidence, "auto-pin fullConfidenceSelections");
|
|
373
|
-
if (!Number.isFinite(pinShare) || pinShare <= 0 || pinShare > 1)
|
|
374
|
-
throw new RangeError("auto-pin pinShare must be in (0, 1]");
|
|
375
|
-
if (!Number.isSafeInteger(minPinBudget) || minPinBudget < 0)
|
|
376
|
-
throw new RangeError("auto-pin minPinBudgetBytes must be non-negative");
|
|
377
|
-
if (!Number.isSafeInteger(input.residentTierBudgetBytes) ||
|
|
378
|
-
input.residentTierBudgetBytes < 0 ||
|
|
379
|
-
!Number.isSafeInteger(input.mandatoryResidentBytes) ||
|
|
380
|
-
input.mandatoryResidentBytes < 0) {
|
|
381
|
-
throw new RangeError("auto-pin resident budgets must be non-negative safe integers");
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
const historySelections = input.ledger.snapshot().totalCount;
|
|
385
|
-
const confidence = Math.min(historySelections / fullConfidence, 1);
|
|
386
|
-
const requestedBudgetBytes = Math.floor(
|
|
387
|
-
input.residentTierBudgetBytes * pinShare * confidence,
|
|
388
|
-
);
|
|
389
|
-
const usableBudgetBytes = Math.min(
|
|
390
|
-
requestedBudgetBytes,
|
|
391
|
-
Math.max(
|
|
392
|
-
0,
|
|
393
|
-
input.residentTierBudgetBytes - input.mandatoryResidentBytes,
|
|
394
|
-
),
|
|
395
|
-
);
|
|
396
|
-
const pins: ExpertUsageCount[] = [];
|
|
397
|
-
let plannedBytes = 0;
|
|
398
|
-
if (historySelections >= minHistory && requestedBudgetBytes >= minPinBudget) {
|
|
399
|
-
for (const candidate of input.ledger.rankedCounts()) {
|
|
400
|
-
const bytes = input.slotBytes(candidate.layer);
|
|
401
|
-
positiveSafeInteger(bytes, `auto-pin slotBytes for layer ${candidate.layer}`);
|
|
402
|
-
if (plannedBytes + bytes > usableBudgetBytes) continue;
|
|
403
|
-
pins.push(candidate);
|
|
404
|
-
plannedBytes += bytes;
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
return {
|
|
408
|
-
historySelections,
|
|
409
|
-
confidence,
|
|
410
|
-
requestedBudgetBytes,
|
|
411
|
-
usableBudgetBytes,
|
|
412
|
-
plannedBytes,
|
|
413
|
-
pins: Object.freeze(pins),
|
|
414
|
-
};
|
|
415
|
-
}
|
package/src/fill/echo-index.ts
DELETED
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
// The echo source (K3c, Lab tier) — a growing per-request k-gram index over
|
|
2
|
-
// the session's own tokens, and the branch-point rule that decides how far a
|
|
3
|
-
// copied span may run.
|
|
4
|
-
//
|
|
5
|
-
// PORT. The index is the TS port of `GrowingMatcher` from the corpus study
|
|
6
|
-
// (reports/k3-replication/analyze.py): a sequence plus a k-gram → [start
|
|
7
|
-
// positions] map, appended incrementally so a lookup never rescans the prefix,
|
|
8
|
-
// with the bucket scan capped at the NEAREST candidates. The corpus tool ran
|
|
9
|
-
// it offline over recorded turns to measure how much of an agent's output is
|
|
10
|
-
// copy-determined; this runs the same structure online, over promptIds plus
|
|
11
|
-
// everything emitted (injected tokens included — the model cannot tell them
|
|
12
|
-
// apart, so neither does the index).
|
|
13
|
-
//
|
|
14
|
-
// THE INTERESTING PART is not the lookup, it is the STOPPING RULE. A match
|
|
15
|
-
// tells you where this exact k-gram occurred before; it does not tell you how
|
|
16
|
-
// far the future agrees with the past. So the span extends only while EVERY
|
|
17
|
-
// nearby occurrence continues the same way. The moment two occurrences
|
|
18
|
-
// disagree — the session history forks — the span stops. That is where
|
|
19
|
-
// old-query-vs-new-query divergence lives, and delimiters fall out of it for
|
|
20
|
-
// free: a closing quote is where histories fork.
|
|
21
|
-
//
|
|
22
|
-
// DOCTRINE. An echo span is a GUESS, unlike the schema rows. It ships under
|
|
23
|
-
// policy "verify" unless it is unambiguous all the way to a delimiter-class
|
|
24
|
-
// token — the engine then keeps only the prefix the model itself agrees with.
|
|
25
|
-
// Lab tier: default off, and a paired A/B decides whether it ever becomes a
|
|
26
|
-
// default (PLAN K3).
|
|
27
|
-
import type { Proposal, ProposalSource, TokenView } from "./proposal";
|
|
28
|
-
|
|
29
|
-
export interface EchoConfig {
|
|
30
|
-
/** Anchor length: the k-gram that has to match for a span to be proposed. */
|
|
31
|
-
k: number;
|
|
32
|
-
/** Longest span the source will propose (the session clamps again). */
|
|
33
|
-
maxSpan: number;
|
|
34
|
-
/** Bucket scan cap — the NEAREST occurrences win (recency is the signal;
|
|
35
|
-
* an unbounded scan is also the only quadratic risk here). */
|
|
36
|
-
maxCandidates: number;
|
|
37
|
-
/** Stop growing the index past this many tokens (memory cap). */
|
|
38
|
-
indexMax: number;
|
|
39
|
-
/** Token ids that legitimately END a copied span (a closing quote, the
|
|
40
|
-
* markup that follows an argument value). Derived from the template by the
|
|
41
|
-
* strict-row compiler; empty means "no span can be asserted". */
|
|
42
|
-
delimiters: ReadonlySet<number>;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/** Growing k-gram index over one request's token sequence. */
|
|
46
|
-
export class EchoIndex {
|
|
47
|
-
readonly #k: number;
|
|
48
|
-
readonly #indexMax: number;
|
|
49
|
-
readonly #seq: number[] = [];
|
|
50
|
-
/** hash(k-gram) → start positions, oldest first. Hash collisions are
|
|
51
|
-
* harmless: every candidate's gram is compared id-for-id before use. */
|
|
52
|
-
readonly #buckets = new Map<number, number[]>();
|
|
53
|
-
#frozen = false;
|
|
54
|
-
|
|
55
|
-
constructor(k: number, indexMax: number) {
|
|
56
|
-
this.#k = Math.max(1, Math.floor(k));
|
|
57
|
-
this.#indexMax = Math.max(this.#k, Math.floor(indexMax));
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
get length(): number { return this.#seq.length; }
|
|
61
|
-
/** True once the memory cap stopped the index from growing. */
|
|
62
|
-
get frozen(): boolean { return this.#frozen; }
|
|
63
|
-
|
|
64
|
-
append(ids: readonly number[]): void {
|
|
65
|
-
for (const id of ids) {
|
|
66
|
-
if (this.#seq.length >= this.#indexMax) { this.#frozen = true; return; }
|
|
67
|
-
this.#seq.push(id);
|
|
68
|
-
const start = this.#seq.length - this.#k;
|
|
69
|
-
if (start < 0) continue;
|
|
70
|
-
const h = this.#hash(start);
|
|
71
|
-
const bucket = this.#buckets.get(h);
|
|
72
|
-
if (bucket) bucket.push(start);
|
|
73
|
-
else this.#buckets.set(h, [start]);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/** Start positions whose k-gram equals `gram` AND which have at least one
|
|
78
|
-
* token after it, nearest (most recent) first. */
|
|
79
|
-
candidates(gram: readonly number[], cap: number): number[] {
|
|
80
|
-
if (gram.length !== this.#k) return [];
|
|
81
|
-
let h = 0x811c9dc5;
|
|
82
|
-
for (const id of gram) h = this.#mix(h, id);
|
|
83
|
-
const bucket = this.#buckets.get(h >>> 0);
|
|
84
|
-
if (!bucket) return [];
|
|
85
|
-
const out: number[] = [];
|
|
86
|
-
for (let i = bucket.length - 1; i >= 0 && out.length < cap; i--) {
|
|
87
|
-
const pos = bucket[i]!;
|
|
88
|
-
if (pos + this.#k >= this.#seq.length) continue; // no continuation yet
|
|
89
|
-
let ok = true;
|
|
90
|
-
for (let j = 0; j < this.#k; j++) {
|
|
91
|
-
if (this.#seq[pos + j] !== gram[j]) { ok = false; break; } // collision
|
|
92
|
-
}
|
|
93
|
-
if (ok) out.push(pos);
|
|
94
|
-
}
|
|
95
|
-
return out;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/** Extend forward from the given anchors while EVERY anchor agrees.
|
|
99
|
-
* Returns the agreed continuation, whether it stopped at a fork, and how
|
|
100
|
-
* many occurrences corroborated the WHOLE span (survivors at the last
|
|
101
|
-
* accepted token) — one occurrence is a copy, several are a pattern. */
|
|
102
|
-
extend(
|
|
103
|
-
anchors: readonly number[], maxSpan: number, delimiters: ReadonlySet<number>,
|
|
104
|
-
): { ids: number[]; branchStop: boolean; agreed: number } {
|
|
105
|
-
const ids: number[] = [];
|
|
106
|
-
let agreed = 0;
|
|
107
|
-
let live = anchors.map((p) => p + this.#k);
|
|
108
|
-
while (ids.length < maxSpan) {
|
|
109
|
-
let next: number | undefined;
|
|
110
|
-
let forked = false;
|
|
111
|
-
const stillLive: number[] = [];
|
|
112
|
-
for (const p of live) {
|
|
113
|
-
const v = this.#seq[p];
|
|
114
|
-
// An occurrence that ran out of history simply drops out: a prefix
|
|
115
|
-
// that ends is not evidence of disagreement.
|
|
116
|
-
if (v === undefined) continue;
|
|
117
|
-
if (next === undefined) next = v;
|
|
118
|
-
else if (v !== next) { forked = true; break; }
|
|
119
|
-
stillLive.push(p + 1);
|
|
120
|
-
}
|
|
121
|
-
// A fork means the session's own history disagrees about what comes
|
|
122
|
-
// next. That is exactly the position the model must decide for itself.
|
|
123
|
-
if (forked) return { ids, branchStop: true, agreed };
|
|
124
|
-
if (next === undefined) break; // every occurrence exhausted
|
|
125
|
-
ids.push(next);
|
|
126
|
-
agreed = stillLive.length;
|
|
127
|
-
live = stillLive;
|
|
128
|
-
// A delimiter is a legitimate END: injecting the closing quote is the
|
|
129
|
-
// point, continuing past it is not.
|
|
130
|
-
if (delimiters.has(next)) break;
|
|
131
|
-
}
|
|
132
|
-
return { ids, branchStop: false, agreed };
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
#hash(start: number): number {
|
|
136
|
-
let h = 0x811c9dc5;
|
|
137
|
-
for (let j = 0; j < this.#k; j++) h = this.#mix(h, this.#seq[start + j]!);
|
|
138
|
-
return h >>> 0;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
#mix(h: number, id: number): number {
|
|
142
|
-
let x = h ^ id;
|
|
143
|
-
x = Math.imul(x, 0x01000193);
|
|
144
|
-
return x >>> 0;
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
/** ProposalSource over the echo index. */
|
|
149
|
-
export class EchoSource implements ProposalSource {
|
|
150
|
-
readonly name = "echo";
|
|
151
|
-
readonly windowNeeded: number;
|
|
152
|
-
readonly index: EchoIndex;
|
|
153
|
-
|
|
154
|
-
constructor(private readonly config: EchoConfig, promptIds: readonly number[]) {
|
|
155
|
-
this.windowNeeded = config.k;
|
|
156
|
-
this.index = new EchoIndex(config.k, config.indexMax);
|
|
157
|
-
this.index.append(promptIds);
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
observe(ids: readonly number[]): void {
|
|
161
|
-
this.index.append(ids);
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
propose(view: TokenView): Proposal | null {
|
|
165
|
-
const { k, maxSpan, maxCandidates, delimiters } = this.config;
|
|
166
|
-
const gram = view.tail(k);
|
|
167
|
-
if (gram.length < k) return null;
|
|
168
|
-
const anchors = this.index.candidates(gram, maxCandidates);
|
|
169
|
-
if (anchors.length === 0) return null;
|
|
170
|
-
const { ids, branchStop, agreed } = this.index.extend(anchors, maxSpan, delimiters);
|
|
171
|
-
if (ids.length < 2) return null;
|
|
172
|
-
// POLICY. Assert only with CORROBORATION: several occurrences of this
|
|
173
|
-
// context all continued the same way, nothing forked, and the span stops
|
|
174
|
-
// at a delimiter-class token. A single occurrence is just a copy — and a
|
|
175
|
-
// copy will happily replay whatever followed it in the transcript,
|
|
176
|
-
// including another role's turn, so it has to be the model's call.
|
|
177
|
-
// Everything else rides policy "verify", where a wrong guess costs a
|
|
178
|
-
// rewound forward, never a wrong token.
|
|
179
|
-
const endsAtDelimiter = delimiters.has(ids[ids.length - 1]!);
|
|
180
|
-
const corroborated = agreed >= 2;
|
|
181
|
-
return {
|
|
182
|
-
ids,
|
|
183
|
-
policy: !branchStop && endsAtDelimiter && corroborated ? "assert" : "verify",
|
|
184
|
-
origin: "echo",
|
|
185
|
-
branchStop,
|
|
186
|
-
};
|
|
187
|
-
}
|
|
188
|
-
}
|