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/hub-rest.ts
DELETED
|
@@ -1,242 +0,0 @@
|
|
|
1
|
-
// Model Hub REST wrappers — thin loopback JSON routes for the web chat's
|
|
2
|
-
// Model Hub panel (docs/design/web-chat-redesign.md §9 Phase 3, beat-matrix
|
|
3
|
-
// Axis 3 "Hub" row). Same posture as src/memory/rest.ts: pure (request|url)
|
|
4
|
-
// => Response handlers with no `ctx` dependency, dispatched from
|
|
5
|
-
// src/server.ts by path+method, so they're unit-testable without booting a
|
|
6
|
-
// model context (see tests/serve/hub-rest.test.ts).
|
|
7
|
-
//
|
|
8
|
-
// Three sources, same as optiq Lab's Hub, plus the hardware-fit column optiq
|
|
9
|
-
// lacks:
|
|
10
|
-
// - GET /api/hub/local — registry's canonical downloaded models, each
|
|
11
|
-
// with a /fit-computed verdict (predicted decode tok/s + fits at a
|
|
12
|
-
// default context) — the beat-matrix "real hardware verdict per row".
|
|
13
|
-
// - GET /api/hub/search — server-side HF model search, filtered to
|
|
14
|
-
// MLX-compatible results, normalized. NEVER auto-downloads.
|
|
15
|
-
// - POST /api/hub/download — kicks off a background download via the
|
|
16
|
-
// existing downloadModel() + process tracker (src/download.ts);
|
|
17
|
-
// progress is already visible via GET /downloads. Refuses a duplicate
|
|
18
|
-
// in-flight download for the same repo.
|
|
19
|
-
// - POST /api/hub/serve — model-swap investigation (see the doc header
|
|
20
|
-
// above the handler): today this ALWAYS returns
|
|
21
|
-
// { ok:false, restart_required:true, command } — see
|
|
22
|
-
// docs/reference/server-config.md for why no in-process swap seam is
|
|
23
|
-
// reachable from the web chat's serving path today.
|
|
24
|
-
|
|
25
|
-
import { loadModelConfig } from "./config";
|
|
26
|
-
import { fit } from "./fit";
|
|
27
|
-
import { downloadModel, hfToken, isDownloadActive, type DownloadOptions } from "./download";
|
|
28
|
-
import { Registry, visionCapable, type ModelRecord } from "./registry";
|
|
29
|
-
import { supportTier } from "./model/support";
|
|
30
|
-
|
|
31
|
-
function jsonOk<T extends object>(body: T, init?: ResponseInit): Response {
|
|
32
|
-
return Response.json({ ok: true, ...body }, init);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
function jsonErr(error: string, status = 400): Response {
|
|
36
|
-
return Response.json({ ok: false, error }, { status });
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// ---- GET /api/hub/local -------------------------------------------------
|
|
40
|
-
|
|
41
|
-
/** One row per canonical repo, mirroring /library's shape but scoped to
|
|
42
|
-
* what the Hub panel needs: size/quant/capabilities + a fit verdict at a
|
|
43
|
-
* fixed 8k context (the same "typical" context /fit and /library use, so
|
|
44
|
-
* the three surfaces never disagree). `reg`/`hubDir` are injectable so
|
|
45
|
-
* tests can point at a synthetic hub dir instead of the real
|
|
46
|
-
* ~/.cache/huggingface/hub (matching tests/unit/registry-fit.test.ts's pattern);
|
|
47
|
-
* the live server route omits both and gets the real registry. */
|
|
48
|
-
export async function handleHubLocal(
|
|
49
|
-
opts: { reg?: Registry; hubDir?: string } = {},
|
|
50
|
-
): Promise<Response> {
|
|
51
|
-
const reg = opts.reg ?? new Registry();
|
|
52
|
-
const ownReg = !opts.reg;
|
|
53
|
-
try {
|
|
54
|
-
await reg.scan(opts.hubDir);
|
|
55
|
-
const rows = [];
|
|
56
|
-
for (const m of reg.listCanonical()) {
|
|
57
|
-
rows.push(await hubLocalRow(m));
|
|
58
|
-
}
|
|
59
|
-
return jsonOk({ models: rows });
|
|
60
|
-
} finally {
|
|
61
|
-
if (ownReg) reg.close();
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
async function hubLocalRow(m: ModelRecord) {
|
|
66
|
-
const tier = supportTier(m.modelType, m.repoId);
|
|
67
|
-
let assessment: {
|
|
68
|
-
fits: boolean;
|
|
69
|
-
max_safe_context: number;
|
|
70
|
-
predicted_decode_tps: number;
|
|
71
|
-
} | null = null;
|
|
72
|
-
try {
|
|
73
|
-
const config = await loadModelConfig(m.path);
|
|
74
|
-
const r = fit(config, m.sizeBytes, 8192, undefined, undefined, m.expertsBytes);
|
|
75
|
-
assessment = {
|
|
76
|
-
fits: r.fits,
|
|
77
|
-
max_safe_context: r.maxSafeContext,
|
|
78
|
-
predicted_decode_tps: r.predictedDecodeTps,
|
|
79
|
-
};
|
|
80
|
-
} catch {
|
|
81
|
-
/* unreadable config — assessment stays null, row still lists */
|
|
82
|
-
}
|
|
83
|
-
return {
|
|
84
|
-
repo_id: m.repoId,
|
|
85
|
-
model_type: m.modelType,
|
|
86
|
-
size_bytes: m.sizeBytes,
|
|
87
|
-
quant_bits: m.quantBits,
|
|
88
|
-
quant_group_size: m.quantGroupSize,
|
|
89
|
-
vision: visionCapable(m),
|
|
90
|
-
supported: tier !== null,
|
|
91
|
-
support_tier: tier,
|
|
92
|
-
assessment,
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// ---- GET /api/hub/search -------------------------------------------------
|
|
97
|
-
|
|
98
|
-
export interface HubSearchResult {
|
|
99
|
-
id: string;
|
|
100
|
-
downloads: number;
|
|
101
|
-
likes: number;
|
|
102
|
-
size_estimate: number | null;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/** The HF Hub's model-search API, filtered to the `mlx` library tag (the
|
|
106
|
-
* tag mlx-community and every other MLX-converted repo carries) so results
|
|
107
|
-
* are MLX-compatible by construction — same convention the download path
|
|
108
|
-
* already speaks HTTPS against (huggingface.co/api/*). Injectable `fetchFn`
|
|
109
|
-
* for tests; defaults to the real global fetch. */
|
|
110
|
-
export async function searchHub(
|
|
111
|
-
query: string,
|
|
112
|
-
opts: { fetchFn?: typeof fetch; limit?: number; endpoint?: string } = {},
|
|
113
|
-
): Promise<
|
|
114
|
-
| { ok: true; offline: false; results: HubSearchResult[] }
|
|
115
|
-
| { ok: false; offline: true; error: string }
|
|
116
|
-
> {
|
|
117
|
-
const fetchFn = opts.fetchFn ?? fetch;
|
|
118
|
-
const endpoint = opts.endpoint ?? "https://huggingface.co";
|
|
119
|
-
const limit = opts.limit ?? 30;
|
|
120
|
-
const token = hfToken();
|
|
121
|
-
const url =
|
|
122
|
-
`${endpoint}/api/models?search=${encodeURIComponent(query)}` +
|
|
123
|
-
`&filter=mlx&sort=downloads&direction=-1&limit=${limit}`;
|
|
124
|
-
let res: Response;
|
|
125
|
-
try {
|
|
126
|
-
res = await fetchFn(url, {
|
|
127
|
-
headers: token ? { authorization: `Bearer ${token}` } : {},
|
|
128
|
-
signal: AbortSignal.timeout(10_000),
|
|
129
|
-
});
|
|
130
|
-
} catch (e) {
|
|
131
|
-
// Network unreachable (offline, DNS failure, timeout) — never surface
|
|
132
|
-
// this as a 500; the Hub panel shows an explicit offline state instead.
|
|
133
|
-
return { ok: false, offline: true, error: (e as Error).message };
|
|
134
|
-
}
|
|
135
|
-
if (!res.ok) {
|
|
136
|
-
return { ok: false, offline: true, error: `HF search ${res.status}` };
|
|
137
|
-
}
|
|
138
|
-
let body: unknown;
|
|
139
|
-
try {
|
|
140
|
-
body = await res.json();
|
|
141
|
-
} catch (e) {
|
|
142
|
-
return { ok: false, offline: true, error: `HF search: bad response (${(e as Error).message})` };
|
|
143
|
-
}
|
|
144
|
-
const rows = Array.isArray(body) ? body : [];
|
|
145
|
-
const results: HubSearchResult[] = rows
|
|
146
|
-
// Belt-and-suspenders: the API's filter=mlx already restricts to the
|
|
147
|
-
// tag, but a defensive re-check keeps a future upstream filter change
|
|
148
|
-
// from silently widening results to non-MLX repos.
|
|
149
|
-
.filter((r) => Array.isArray((r as Record<string, unknown>).tags)
|
|
150
|
-
? ((r as { tags: string[] }).tags).includes("mlx")
|
|
151
|
-
: true)
|
|
152
|
-
.map((r) => {
|
|
153
|
-
const row = r as Record<string, unknown>;
|
|
154
|
-
return {
|
|
155
|
-
id: String(row.id ?? row.modelId ?? ""),
|
|
156
|
-
downloads: typeof row.downloads === "number" ? row.downloads : 0,
|
|
157
|
-
likes: typeof row.likes === "number" ? row.likes : 0,
|
|
158
|
-
// The search endpoint doesn't return file sizes (that's a second
|
|
159
|
-
// per-repo call this v1 skips to keep search fast) — null, not a
|
|
160
|
-
// fabricated number; the frontend's fit badge lands after download.
|
|
161
|
-
size_estimate: null,
|
|
162
|
-
};
|
|
163
|
-
})
|
|
164
|
-
.filter((r) => r.id.length > 0);
|
|
165
|
-
return { ok: true, offline: false, results };
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
export async function handleHubSearch(url: URL): Promise<Response> {
|
|
169
|
-
const q = url.searchParams.get("q")?.trim() ?? "";
|
|
170
|
-
if (!q) return jsonErr("missing ?q=");
|
|
171
|
-
const result = await searchHub(q);
|
|
172
|
-
if (!result.ok) return jsonOk({ offline: true, error: result.error, results: [] });
|
|
173
|
-
return jsonOk({ offline: false, results: result.results });
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
// ---- POST /api/hub/download -----------------------------------------------
|
|
177
|
-
|
|
178
|
-
// downloadModel()'s own DownloadStatus row (src/download.ts's downloadLog,
|
|
179
|
-
// read via isDownloadActive) only exists once listRepoFiles' network round
|
|
180
|
-
// trip resolves — a rapid double-submit of this route can both pass that
|
|
181
|
-
// check before either row is written. Route-local admission closes that
|
|
182
|
-
// window: a repo is marked in-flight synchronously, before the first
|
|
183
|
-
// `await`, and cleared in a `finally` once downloadModel settles either way.
|
|
184
|
-
const inFlightHubDownloads = new Set<string>();
|
|
185
|
-
|
|
186
|
-
export async function handleHubDownload(request: Request): Promise<Response> {
|
|
187
|
-
const body = (await request.json().catch(() => ({}))) as { repo?: string };
|
|
188
|
-
const repo = body.repo?.trim();
|
|
189
|
-
if (!repo) return jsonErr("missing \"repo\"");
|
|
190
|
-
if (inFlightHubDownloads.has(repo) || isDownloadActive(repo))
|
|
191
|
-
return jsonErr(`a download for ${repo} is already in progress`, 409);
|
|
192
|
-
inFlightHubDownloads.add(repo);
|
|
193
|
-
// Fire-and-forget, mirroring the CLI's background-download pattern
|
|
194
|
-
// (cli.ts's `downloadModel(recRepo).then(...).catch(...)`) — progress is
|
|
195
|
-
// already visible via GET /downloads (the process-global tracker
|
|
196
|
-
// downloadModel() itself writes to); this route just starts it and
|
|
197
|
-
// returns immediately rather than blocking on a multi-GB transfer.
|
|
198
|
-
const opts: DownloadOptions = {};
|
|
199
|
-
downloadModel(repo, opts)
|
|
200
|
-
.then(async () => {
|
|
201
|
-
try {
|
|
202
|
-
const reg = new Registry();
|
|
203
|
-
try { await reg.scan(); } finally { reg.close(); }
|
|
204
|
-
} catch { /* best-effort refresh; /downloads still shows completion */ }
|
|
205
|
-
})
|
|
206
|
-
.catch(() => { /* status recorded on the tracker; /downloads shows the error */ })
|
|
207
|
-
.finally(() => inFlightHubDownloads.delete(repo));
|
|
208
|
-
return jsonOk({ repo, started: true });
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
// ---- POST /api/hub/serve --------------------------------------------------
|
|
212
|
-
|
|
213
|
-
/** Model-swap investigation (docs/reference/server-config.md): the web
|
|
214
|
-
* chat's `/ws/chat` is explicitly NOT proxied even under `--isolate`
|
|
215
|
-
* (src/serve/isolate.ts serves it a 501 with a pointer back to the direct,
|
|
216
|
-
* non-isolated server) and `--isolate` itself is opt-in, not the default —
|
|
217
|
-
* so the process the web chat actually talks to always has exactly one
|
|
218
|
-
* model loaded in-process with no drop-weights-and-reload seam. The
|
|
219
|
-
* isolate.ts `ModelPool` (P2, spawn-overlap child-per-model) IS a real,
|
|
220
|
-
* working live-swap mechanism, but it lives entirely on the `--isolate`
|
|
221
|
-
* reverse-proxy's `/v1/*` HTTP surface — not reachable from the WebSocket
|
|
222
|
-
* chat path this Hub panel serves. Faking a swap here (killing/reloading
|
|
223
|
-
* the in-process model while `/ws/chat` sessions are attached) would leave
|
|
224
|
-
* the server in a half-state the ground rules forbid ("the AI may crash,
|
|
225
|
-
* the UI never may" — a self-inflicted crash is not better). Honest
|
|
226
|
-
* answer: refuse, and hand back the exact restart command. Follow-up:
|
|
227
|
-
* wire /ws/chat through the isolate proxy (or move session state above the
|
|
228
|
-
* engine boundary) so ModelPool's spawn-overlap swap is actually reachable
|
|
229
|
-
* from the web chat — tracked as the Hub's live-swap follow-up. */
|
|
230
|
-
export async function handleHubServe(request: Request): Promise<Response> {
|
|
231
|
-
const body = (await request.json().catch(() => ({}))) as { model?: string };
|
|
232
|
-
const model = body.model?.trim();
|
|
233
|
-
if (!model) return jsonErr("missing \"model\"");
|
|
234
|
-
// ok:false is deliberate — this is not an error the caller mishandled, it
|
|
235
|
-
// is the honest capability answer ("no live swap today"), but it is also
|
|
236
|
-
// not success: the frontend must not treat this as "now serving `model`".
|
|
237
|
-
return Response.json({
|
|
238
|
-
ok: false,
|
|
239
|
-
restart_required: true,
|
|
240
|
-
command: `mlx-bun serve ${model}`,
|
|
241
|
-
});
|
|
242
|
-
}
|
package/src/index.ts
DELETED
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
// Public library surface (the npm "." export). What is re-exported here
|
|
2
|
-
// is the semver contract — everything else under src/ is internal and may
|
|
3
|
-
// change without notice. Mirrors the README "Library" example plus the
|
|
4
|
-
// pieces a consumer needs around it.
|
|
5
|
-
//
|
|
6
|
-
// NOTE: library consumers bypass the CLI's first-run step, so call
|
|
7
|
-
// ensureNativeRuntime() once before constructing a model on a machine
|
|
8
|
-
// that may not have the MLX runtime yet (no-op when already present).
|
|
9
|
-
|
|
10
|
-
export { ensureNativeRuntime, nativeRuntimeDir } from "./native-pack";
|
|
11
|
-
export { loadModelConfig } from "./config";
|
|
12
|
-
export { Weights } from "./weights";
|
|
13
|
-
export { Gemma4Model } from "./model/gemma4";
|
|
14
|
-
export { MiniCPM5Model } from "./model/minicpm5";
|
|
15
|
-
export {
|
|
16
|
-
createModel,
|
|
17
|
-
openGlm52RuntimeModel,
|
|
18
|
-
openModel,
|
|
19
|
-
type ModelOpenOptions,
|
|
20
|
-
type Glm52RuntimeOpenOptions,
|
|
21
|
-
type RuntimeModel,
|
|
22
|
-
} from "./model/factory";
|
|
23
|
-
export { ModelImplementationRegistry, type ModelImplementation, type ModelImplementationProvider } from "./model/implementation";
|
|
24
|
-
export type { ModelServingBinding, ModelPromptBuilder, BuiltPrompt, ServedModelInfo } from "./serve/model-binding";
|
|
25
|
-
export type { ServingContext, ModelHostSource, AdapterService } from "./serve/model-host";
|
|
26
|
-
export type { MlxGatewayBinding, MlxBatchGroup } from "./backends/mlx/gateway-binding";
|
|
27
|
-
export type { MlxSerialServices, MlxSerialBinding } from "./backends/mlx/serial-executor";
|
|
28
|
-
export { Qwen3Model } from "./model/qwen3";
|
|
29
|
-
export { configFingerprint } from "./model/fingerprint";
|
|
30
|
-
export {
|
|
31
|
-
BUILTIN_ARTIFACT_PROFILES,
|
|
32
|
-
ENGINE_CAPABILITIES,
|
|
33
|
-
externalArtifactFingerprint,
|
|
34
|
-
resolveModelProfile,
|
|
35
|
-
type ArtifactModelProfile,
|
|
36
|
-
type EngineCapability,
|
|
37
|
-
type FidelityTarget,
|
|
38
|
-
type FidelityTier,
|
|
39
|
-
type GenerationLoop,
|
|
40
|
-
type ModelArtifactIdentity,
|
|
41
|
-
type ModelExecutionComposition,
|
|
42
|
-
type ModelGraph,
|
|
43
|
-
type ModelLoader,
|
|
44
|
-
type ModelProfile,
|
|
45
|
-
type ModelSpecialization,
|
|
46
|
-
type ResolveModelProfileOptions,
|
|
47
|
-
type ResolvedModelProfile,
|
|
48
|
-
} from "./model/profile";
|
|
49
|
-
export { generate } from "./generate";
|
|
50
|
-
export { loadTokenizer } from "./tokenizer";
|
|
51
|
-
export { embedOne, embedMany, isEmbeddingModel, withInstruction, type EmbedResult } from "./embed";
|
|
52
|
-
export { ChatTemplate } from "./chat-template";
|
|
53
|
-
export { chooseAutoModel, COEXIST_FRACTION, DEFAULT_REPO_ID, fit, largestRecommendedRepoId, recommendedRepoId, skuMatrix, thisMachine } from "./fit";
|
|
54
|
-
export { downloadModel } from "./download";
|
|
55
|
-
export { Registry } from "./registry";
|
|
56
|
-
export {
|
|
57
|
-
createServer,
|
|
58
|
-
shutdownServer,
|
|
59
|
-
loadContext,
|
|
60
|
-
type LoadContextOptions,
|
|
61
|
-
type ServerContext,
|
|
62
|
-
type ServerOptions,
|
|
63
|
-
} from "./server";
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import type { GraphDescriptor } from "./graph";
|
|
2
|
-
|
|
3
|
-
/** Denoising has canvas state and feedback, independent of AR token caches.
|
|
4
|
-
* Returned tensors/state are owned by the run. Inputs remain borrowed. A
|
|
5
|
-
* fused method may bypass this graph and implement InferenceMethod directly. */
|
|
6
|
-
export interface DenoisingGraph<Tensor, State> {
|
|
7
|
-
readonly descriptor: GraphDescriptor;
|
|
8
|
-
readonly vocabSize: number;
|
|
9
|
-
readonly canvasLength: number;
|
|
10
|
-
readonly embedScale: number;
|
|
11
|
-
prefill(promptIds: number[], vision?: Tensor): State;
|
|
12
|
-
extendPrefill(tokens: Tensor, state: State): void;
|
|
13
|
-
decoderLogits(canvas: Tensor, state: State, feedback: Tensor | null): Tensor;
|
|
14
|
-
dequantEmbedWeight(): Tensor;
|
|
15
|
-
softEmbeddings(logits: Tensor, weight: Tensor): Tensor;
|
|
16
|
-
closeState(state: State): void;
|
|
17
|
-
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
/** One request's exact-token speculative acceptance walk. The backend owns
|
|
2
|
-
* logits and sampling; this state owns only the accepted prefix and stop facts.
|
|
3
|
-
* A group advances each live walk independently, regardless of batch size. */
|
|
4
|
-
export class DraftAcceptance {
|
|
5
|
-
position = 0;
|
|
6
|
-
accepted = 0;
|
|
7
|
-
correction: number | null = null;
|
|
8
|
-
readonly emitted: number[] = [];
|
|
9
|
-
sawEos = false;
|
|
10
|
-
grammarDone = false;
|
|
11
|
-
done = false;
|
|
12
|
-
|
|
13
|
-
constructor(
|
|
14
|
-
readonly drafts: readonly number[],
|
|
15
|
-
readonly remaining: number,
|
|
16
|
-
readonly eosTokenIds: readonly number[],
|
|
17
|
-
) {}
|
|
18
|
-
|
|
19
|
-
/** Supply one target sample after its sampler has updated request history
|
|
20
|
-
* and grammar. Once done, this request needs no further target samples. */
|
|
21
|
-
accept(token: number, grammarDone = false): void {
|
|
22
|
-
const matches = this.position < this.drafts.length && token === this.drafts[this.position];
|
|
23
|
-
this.position++;
|
|
24
|
-
if (matches) {
|
|
25
|
-
this.accepted++;
|
|
26
|
-
if (this.eosTokenIds.includes(token)) {
|
|
27
|
-
this.sawEos = this.done = true;
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
this.emitted.push(token);
|
|
31
|
-
this.grammarDone = grammarDone;
|
|
32
|
-
this.done = grammarDone || this.emitted.length >= this.remaining;
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
this.correction = token;
|
|
36
|
-
this.sawEos = this.eosTokenIds.includes(token);
|
|
37
|
-
if (!this.sawEos) this.emitted.push(token);
|
|
38
|
-
this.grammarDone = grammarDone;
|
|
39
|
-
this.done = true;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import type { Cancellation, CancelReason, GenerationOutput, TokenLogprobs } from "../contracts/generation";
|
|
2
|
-
import type { DraftAcceptance } from "./draft-acceptance";
|
|
3
|
-
|
|
4
|
-
export interface DraftOutputRow {
|
|
5
|
-
readonly acceptance: DraftAcceptance;
|
|
6
|
-
readonly logprobs?: readonly (TokenLogprobs | undefined)[];
|
|
7
|
-
readonly output: Pick<GenerationOutput, "commit">;
|
|
8
|
-
readonly cancellation?: Cancellation;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
/** Counts apply to this round. Accepted counts describe processed proposed
|
|
12
|
-
* inputs, excluding an unprocessed correction/bonus and any unpublished EOS.
|
|
13
|
-
* Failed/cancelled requests must be discarded, never checkpointed. */
|
|
14
|
-
export type DraftOutputResult = { readonly generated: number; readonly accepted: number } & (
|
|
15
|
-
| { readonly kind: "continue"; readonly pending: number }
|
|
16
|
-
| { readonly kind: "stop" | "length" }
|
|
17
|
-
| { readonly kind: "cancelled"; readonly reason: CancelReason }
|
|
18
|
-
| { readonly kind: "failed"; readonly error: unknown }
|
|
19
|
-
);
|
|
20
|
-
|
|
21
|
-
/** Deliver verified content through the output interface before resolving
|
|
22
|
-
* retained state. A stopped or failed consumer affects only its own request.
|
|
23
|
-
* Token-sized publications preserve callbacks that stop inside a draft burst. */
|
|
24
|
-
export async function deliverDraftOutputs(rows: readonly DraftOutputRow[]): Promise<DraftOutputResult[]> {
|
|
25
|
-
const results: DraftOutputResult[] = [];
|
|
26
|
-
for (const row of rows) results.push(await deliver(row));
|
|
27
|
-
return results;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
async function deliver(row: DraftOutputRow): Promise<DraftOutputResult> {
|
|
31
|
-
const { acceptance } = row;
|
|
32
|
-
let generated = 0;
|
|
33
|
-
const retained = () => ({ generated, accepted: Math.min(generated, acceptance.accepted) });
|
|
34
|
-
try {
|
|
35
|
-
for (const token of acceptance.emitted) {
|
|
36
|
-
const reason = row.cancellation?.reason;
|
|
37
|
-
if (reason) return { kind: "cancelled", reason, generated, accepted: 0 };
|
|
38
|
-
const metadata = row.logprobs?.[generated];
|
|
39
|
-
const more = await row.output.commit([token], metadata ? [metadata] : undefined);
|
|
40
|
-
generated++;
|
|
41
|
-
if (more === false) return { kind: "stop", ...retained() };
|
|
42
|
-
}
|
|
43
|
-
const reason = row.cancellation?.reason;
|
|
44
|
-
if (reason) return { kind: "cancelled", reason, generated, accepted: 0 };
|
|
45
|
-
if (acceptance.sawEos || acceptance.grammarDone) return { kind: "stop", ...retained() };
|
|
46
|
-
if (generated >= acceptance.remaining) return { kind: "length", ...retained() };
|
|
47
|
-
return { kind: "continue", pending: acceptance.correction!, ...retained() };
|
|
48
|
-
} catch (error) { return { kind: "failed", error, generated, accepted: 0 }; }
|
|
49
|
-
}
|
package/src/inference/graph.ts
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
/** Describes an implementation's ABI, not a claim of oracle parity or speed. */
|
|
2
|
-
export interface GraphDescriptor {
|
|
3
|
-
readonly id: string;
|
|
4
|
-
readonly backend: string;
|
|
5
|
-
readonly graphAbi: string;
|
|
6
|
-
readonly stateAbi: string;
|
|
7
|
-
readonly artifact: string;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export type LogitSelection =
|
|
11
|
-
| { readonly type: "all" }
|
|
12
|
-
| { readonly type: "last" }
|
|
13
|
-
| { readonly type: "range"; readonly start: number; readonly end: number };
|
|
14
|
-
|
|
15
|
-
/** Backend-bound graph. Tensor/State/Inputs stay concrete within the binding.
|
|
16
|
-
* Inputs and hidden are borrowed until the returned lazy work completes;
|
|
17
|
-
* returned hidden/logits are owned by the caller. The graph appends to state.
|
|
18
|
-
* Hidden is [batch, positions, hidden-width]; logits are [batch, selected
|
|
19
|
-
* positions, vocabulary]. Selection precedes the vocabulary projection.
|
|
20
|
-
* Dtypes and evaluation/fence semantics belong to the declared backend ABI.
|
|
21
|
-
* Per-run masks, positions, media, taps, and adapters belong in Inputs or in
|
|
22
|
-
* a bound graph context; they are not mutable session fields. */
|
|
23
|
-
export interface AutoregressiveGraph<Tensor, State, Inputs> {
|
|
24
|
-
readonly descriptor: GraphDescriptor;
|
|
25
|
-
forwardHidden(inputs: Inputs, state: State): Tensor | Promise<Tensor>;
|
|
26
|
-
projectLogits(hidden: Tensor, selection: LogitSelection): Tensor;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/** A fused InferenceMethod can bypass this graph interface entirely. It need
|
|
30
|
-
* only satisfy the method's output, cancellation, and ownership contracts. */
|
|
31
|
-
export interface GraphFactory<Artifact, Binding, Graph> {
|
|
32
|
-
open(artifact: Artifact, binding: Binding): Promise<{ graph: Graph; close(): Promise<void> }>;
|
|
33
|
-
}
|
package/src/inference/prefill.ts
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
/** Request-level chunk policy. Execution consumes the selected size; model
|
|
2
|
-
* backends can account for their temporary workspace without changing admission. */
|
|
3
|
-
export interface PrefillPolicy {
|
|
4
|
-
chunkSize(promptTokens: number): number;
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
export interface PrefillPosition {
|
|
8
|
-
readonly length: number;
|
|
9
|
-
readonly position: number;
|
|
10
|
-
readonly chunkSize: number;
|
|
11
|
-
readonly tailSplit: boolean;
|
|
12
|
-
readonly snapshotAt?: number | null;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export interface PrefillStep {
|
|
16
|
-
readonly start: number;
|
|
17
|
-
readonly end: number;
|
|
18
|
-
readonly kind: "drain" | "final";
|
|
19
|
-
readonly snapshot: boolean;
|
|
20
|
-
/** Batch admission may finish a short last drain and token zero in one tick.
|
|
21
|
-
* Serial execution still yields between every drain and the next forward. */
|
|
22
|
-
readonly batchYield: boolean;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/** Shared serial/solo-batch prefill program. No tensors, runtime policy reads,
|
|
26
|
-
* or sampling. Advance position only after executing the returned step. */
|
|
27
|
-
export function nextPrefillStep(input: PrefillPosition): PrefillStep {
|
|
28
|
-
const { length, position, chunkSize, tailSplit, snapshotAt } = input;
|
|
29
|
-
if (!Number.isSafeInteger(length) || !Number.isSafeInteger(position) ||
|
|
30
|
-
!Number.isSafeInteger(chunkSize) || chunkSize < 1 || position < 0 || position >= length)
|
|
31
|
-
throw new Error("invalid prefill position or chunk size");
|
|
32
|
-
if (snapshotAt != null && (!Number.isSafeInteger(snapshotAt) || snapshotAt < 0 || snapshotAt > length))
|
|
33
|
-
throw new Error("invalid prefill snapshot boundary");
|
|
34
|
-
if (snapshotAt != null && snapshotAt > position && snapshotAt < length) {
|
|
35
|
-
const end = Math.min(position + chunkSize, snapshotAt);
|
|
36
|
-
return { start: position, end, kind: "drain", snapshot: end === snapshotAt, batchYield: true };
|
|
37
|
-
}
|
|
38
|
-
const remaining = length - position;
|
|
39
|
-
if (remaining > (tailSplit ? 1 : chunkSize)) {
|
|
40
|
-
const end = position + (tailSplit ? Math.min(chunkSize, remaining - 1) : chunkSize);
|
|
41
|
-
return { start: position, end, kind: "drain", snapshot: false,
|
|
42
|
-
batchYield: !tailSplit || remaining - 1 > chunkSize };
|
|
43
|
-
}
|
|
44
|
-
return { start: position, end: length, kind: "final", snapshot: false, batchYield: false };
|
|
45
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
/** A complete transaction over every participating target state layer.
|
|
2
|
-
* A failed begin/resolve invalidates the run; its state must be discarded. */
|
|
3
|
-
export interface SpeculativeTransaction<Acceptance = number> {
|
|
4
|
-
canBegin(drafts: number): boolean;
|
|
5
|
-
begin(drafts: number): void;
|
|
6
|
-
resolve(accepted: Acceptance): void;
|
|
7
|
-
}
|
package/src/jobs/index.ts
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
// Public API for the background job system. The server imports from here:
|
|
2
|
-
// create/track jobs (JobStore), submit work (in-process or GPU-leased
|
|
3
|
-
// subprocess), gate inference on GPU jobs, and stream a job's log over SSE.
|
|
4
|
-
|
|
5
|
-
export { JobStore, DEFAULT_JOBS_DB, DEFAULT_JOBS_DIR, newJobId } from "./db";
|
|
6
|
-
export {
|
|
7
|
-
registerRunner,
|
|
8
|
-
getRunner,
|
|
9
|
-
submitInProcess,
|
|
10
|
-
submitSubprocess,
|
|
11
|
-
closeSubprocessJobs,
|
|
12
|
-
closeInProcessJobs,
|
|
13
|
-
makeEmit,
|
|
14
|
-
isGpuBusy,
|
|
15
|
-
currentGpuJob,
|
|
16
|
-
drainQueue,
|
|
17
|
-
JOB_ENTRY_PATH,
|
|
18
|
-
} from "./runner";
|
|
19
|
-
export type { SubmitResult, SubprocessOpts } from "./runner";
|
|
20
|
-
export { tailJob, streamJobResponse } from "./sse";
|
|
21
|
-
export type { TailOpts } from "./sse";
|
|
22
|
-
|
|
23
|
-
// Re-export the shared contract so consumers have one import site.
|
|
24
|
-
export type {
|
|
25
|
-
JobEvent,
|
|
26
|
-
Emit,
|
|
27
|
-
JobRunner,
|
|
28
|
-
JobKind,
|
|
29
|
-
JobStatus,
|
|
30
|
-
JobRow,
|
|
31
|
-
} from "./types";
|
package/src/jobs/job-entry.ts
DELETED
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
// Child-process job entry: `bun job-entry.ts <jobId>`.
|
|
2
|
-
//
|
|
3
|
-
// Spawned by submitSubprocess so MLX/GPU state lives in its own address space
|
|
4
|
-
// and an uncatchable crash (segfault / process.exit) dies here without taking
|
|
5
|
-
// the server down. Port of optiq lab jobs.py `_job_main` — opens its OWN
|
|
6
|
-
// JobStore (a SQLite connection MUST NOT cross the process boundary), resolves
|
|
7
|
-
// the runner, runs it with a log-appending emit, sets terminal status, and
|
|
8
|
-
// exits 0 (done) / 1 (failed).
|
|
9
|
-
|
|
10
|
-
import { createJobTaskClient } from "./task-client";
|
|
11
|
-
import { JobStore } from "./db";
|
|
12
|
-
import { getRunner, makeEmit } from "./runner";
|
|
13
|
-
import type { JobRunner } from "./types";
|
|
14
|
-
import { runtimeValue } from "../runtime-config";
|
|
15
|
-
|
|
16
|
-
/** kind → module to dynamically import so it registers its runner. Real job
|
|
17
|
-
* kinds are built by parallel efforts; importing the module is expected to
|
|
18
|
-
* call `registerRunner(kind, ...)` at top level. Missing module ⇒ the job
|
|
19
|
-
* fails cleanly (see resolveRunner). */
|
|
20
|
-
const KIND_MODULES: Record<string, () => Promise<unknown>> = {
|
|
21
|
-
quantize: () => import("../quantize/job"),
|
|
22
|
-
finetune: () => import("../train/job"),
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
/** Resolve a runner for `kind`. Test kinds (noop/crash) are pre-registered in
|
|
26
|
-
* runner.ts. Real kinds are lazily imported; a missing module is a clean
|
|
27
|
-
* failure, not a crash. */
|
|
28
|
-
async function resolveRunner(kind: string): Promise<JobRunner> {
|
|
29
|
-
const existing = getRunner(kind);
|
|
30
|
-
if (existing) return existing;
|
|
31
|
-
|
|
32
|
-
const load = KIND_MODULES[kind];
|
|
33
|
-
if (load) {
|
|
34
|
-
try {
|
|
35
|
-
await load();
|
|
36
|
-
} catch (e) {
|
|
37
|
-
throw new Error(
|
|
38
|
-
`kind "${kind}": failed to load runner module ${kind} ` +
|
|
39
|
-
`(${e instanceof Error ? e.message : String(e)})`,
|
|
40
|
-
);
|
|
41
|
-
}
|
|
42
|
-
const loaded = getRunner(kind);
|
|
43
|
-
if (loaded) return loaded;
|
|
44
|
-
throw new Error(`kind "${kind}": module ${kind} did not register a runner`);
|
|
45
|
-
}
|
|
46
|
-
throw new Error(`no runner registered for kind "${kind}"`);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
function nowIso(): string {
|
|
50
|
-
return new Date().toISOString().replace("T", " ").slice(0, 19);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export async function runJobEntry(jobId = process.argv[2]): Promise<void> {
|
|
54
|
-
if (!jobId) {
|
|
55
|
-
console.error("usage: bun job-entry.ts <jobId>");
|
|
56
|
-
process.exit(2);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// Own fresh connection — overrides come from env so a spawned child finds
|
|
60
|
-
// the same DB/logs the parent used (tests set these to a tmp dir).
|
|
61
|
-
const store = new JobStore(
|
|
62
|
-
runtimeValue("MLX_BUN_JOBS_DB") || undefined,
|
|
63
|
-
runtimeValue("MLX_BUN_JOBS_DIR") || undefined,
|
|
64
|
-
);
|
|
65
|
-
|
|
66
|
-
const row = store.get(jobId);
|
|
67
|
-
if (!row) {
|
|
68
|
-
console.error(`job ${jobId} not found`);
|
|
69
|
-
store.close();
|
|
70
|
-
process.exit(2);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
const emit = makeEmit(store, jobId, row.log_path);
|
|
74
|
-
store.setStatus(jobId, "running");
|
|
75
|
-
emit({ type: "started", ts: Date.now() });
|
|
76
|
-
|
|
77
|
-
let config: Record<string, unknown>;
|
|
78
|
-
try {
|
|
79
|
-
config = JSON.parse(row.config_json) as Record<string, unknown>;
|
|
80
|
-
} catch (e) {
|
|
81
|
-
const error = `bad config_json: ${e instanceof Error ? e.message : String(e)}`;
|
|
82
|
-
store.setStatus(jobId, "failed", { error, endedAt: nowIso() });
|
|
83
|
-
emit({ type: "failed", error, ts: Date.now() });
|
|
84
|
-
store.close();
|
|
85
|
-
process.exit(1);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
try {
|
|
89
|
-
const runner = await resolveRunner(row.kind);
|
|
90
|
-
const result = await createJobTaskClient(runner).run(config, emit);
|
|
91
|
-
const out = result?.outputPath;
|
|
92
|
-
if (out) store.setOutputPath(jobId, out);
|
|
93
|
-
store.setProgress(jobId, 1);
|
|
94
|
-
store.setStatus(jobId, "done", { endedAt: nowIso() });
|
|
95
|
-
emit({ type: "done", ts: Date.now(), output_dir: out ?? row.output_path ?? undefined });
|
|
96
|
-
store.close();
|
|
97
|
-
process.exit(0);
|
|
98
|
-
} catch (e) {
|
|
99
|
-
const error = e instanceof Error ? `${e.name}: ${e.message}` : String(e);
|
|
100
|
-
store.setStatus(jobId, "failed", { error, endedAt: nowIso() });
|
|
101
|
-
emit({ type: "failed", error, ts: Date.now() });
|
|
102
|
-
store.close();
|
|
103
|
-
process.exit(1);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
if (import.meta.main) void runJobEntry();
|
package/src/jobs/task-client.ts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import type { TaskClient } from "../contracts/completion";
|
|
2
|
-
import { throwIfCancelled } from "../engine/cancellation";
|
|
3
|
-
import type { JobEvent, JobRunner } from "./types";
|
|
4
|
-
|
|
5
|
-
/** Numerical runners retain their artifact policy; the client owns delivery
|
|
6
|
-
* and cooperative cancellation at progress boundaries. No event buffering. */
|
|
7
|
-
export function createJobTaskClient(runner: JobRunner): TaskClient<
|
|
8
|
-
Record<string, unknown>, JobEvent, { outputPath?: string } | void
|
|
9
|
-
> {
|
|
10
|
-
return {
|
|
11
|
-
async run(request, report, cancellation) {
|
|
12
|
-
const check = () => { if (cancellation) throwIfCancelled(cancellation); };
|
|
13
|
-
check();
|
|
14
|
-
const result = await runner((event) => { check(); report(event); check(); }, request);
|
|
15
|
-
check();
|
|
16
|
-
return result;
|
|
17
|
-
},
|
|
18
|
-
};
|
|
19
|
-
}
|
package/src/jobs/types.ts
DELETED