mlx-bun 0.4.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 +1453 -88
- 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 +10 -8
- 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 +12 -10
- package/src/{serve → server}/chat-stage.ts +27 -22
- package/src/{client.ts → server/client.ts} +28 -2
- package/src/{serve → server}/completion-executor.ts +42 -42
- 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 +42 -83
- package/src/server/generated-token-history.ts +57 -0
- 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 +8 -8
- package/src/{serve → server}/request-prep.ts +82 -68
- 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 -94
- package/docs/archive/hlg-sampling.md +0 -350
- package/docs/archive/investigations/audio-input-plan.md +0 -356
- 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/web-ui-pass-plan.md +0 -213
- package/docs/archive/planning/website-readme-pass-plan.md +0 -224
- package/docs/design/batching.md +0 -1841
- package/docs/design/decode-speed-program.md +0 -2349
- package/docs/design/dreaming-nightly-pipeline.md +0 -684
- package/docs/design/generic-model-support.md +0 -705
- package/docs/design/kv-cache.md +0 -824
- package/docs/design/orpo-training.md +0 -680
- package/docs/design/speculative-decoding.md +0 -1990
- package/docs/design/turboquant.md +0 -2212
- package/docs/design/unified-engine-frontier-plan.md +0 -1880
- package/docs/design/web-chat-redesign.md +0 -695
- package/docs/planning/PRODUCT_ROADMAP.md +0 -594
- package/docs/planning/ResearchTopics.md +0 -119
- package/docs/planning/release-notes-v0.4.0.md +0 -45
- package/docs/planning/video-series.md +0 -421
- package/docs/reference/benchmarks.md +0 -3613
- package/docs/reference/cli.md +0 -585
- package/docs/reference/distribution.md +0 -355
- package/docs/reference/environment.md +0 -398
- package/docs/reference/glossary.md +0 -39
- package/docs/reference/library-api.md +0 -674
- package/docs/reference/memory.md +0 -260
- package/docs/reference/models.md +0 -334
- package/docs/reference/server-api.md +0 -1775
- package/docs/reference/server-config.md +0 -846
- package/docs/reference/training.md +0 -462
- package/docs/reference/troubleshooting.md +0 -158
- package/src/admission-plan.ts +0 -18
- package/src/audio/conformer.ts +0 -647
- package/src/audio/decode.ts +0 -133
- package/src/audio/features.ts +0 -202
- package/src/audio/transcode.ts +0 -67
- 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 -108
- package/src/backends/mlx/batch-group.ts +0 -1790
- 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 -106
- 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/evaluation.ts +0 -105
- package/src/backends/mlx/fill-append.ts +0 -45
- 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 -130
- 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 -133
- 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/model-prompt.ts +0 -164
- package/src/backends/mlx/model-serving.ts +0 -79
- package/src/backends/mlx/prefill-cohort.ts +0 -89
- package/src/backends/mlx/prefill-rows.ts +0 -200
- package/src/backends/mlx/prefill.ts +0 -33
- package/src/backends/mlx/projected-context-rows.ts +0 -72
- package/src/backends/mlx/request-policy.ts +0 -20
- package/src/backends/mlx/request-state-policy.ts +0 -41
- package/src/backends/mlx/rollback.ts +0 -89
- package/src/backends/mlx/row-sampling.ts +0 -49
- package/src/backends/mlx/serial-executor.ts +0 -242
- package/src/backends/mlx/speculative-group.ts +0 -359
- package/src/backends/mlx/speculative-round.ts +0 -161
- package/src/backends/mlx/speculative.ts +0 -114
- 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 -165
- package/src/chat-template.ts +0 -382
- package/src/cli.ts +0 -3168
- package/src/config.ts +0 -399
- package/src/contracts/completion.ts +0 -16
- package/src/contracts/execution.ts +0 -60
- package/src/contracts/generation.ts +0 -103
- package/src/contracts/host.ts +0 -7
- package/src/contracts/pi-provider.ts +0 -30
- package/src/contracts/pi.ts +0 -259
- package/src/contracts/prefix-cache.ts +0 -23
- package/src/contracts/resources.ts +0 -25
- package/src/contracts/sampling.ts +0 -23
- package/src/contracts/scheduling.ts +0 -45
- 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 -53
- package/src/engine/resources.ts +0 -53
- package/src/engine/scheduler.ts +0 -72
- 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 -452
- 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 -1346
- package/src/grammar.ts +0 -591
- 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 -39
- 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 -257
- package/src/kv-store.ts +0 -1099
- package/src/lab/README.md +0 -18
- 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-kv-rows.ts +0 -83
- package/src/lab/paged-kv/paged-kv.ts +0 -270
- package/src/library.ts +0 -40
- package/src/lora.ts +0 -408
- package/src/md-modules.d.ts +0 -49
- 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 -388
- 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 -512
- package/src/mlx/materialize.ts +0 -23
- package/src/mlx/metal-kernel.ts +0 -159
- package/src/mlx/ops.ts +0 -1021
- 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 -93
- 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 -55
- package/src/model/diffusion-gemma.ts +0 -1026
- package/src/model/factory.ts +0 -189
- package/src/model/fingerprint.ts +0 -33
- 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 -2351
- package/src/model/gemma4.ts +0 -1315
- 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 -67
- package/src/model/minicpm5.ts +0 -376
- package/src/model/profile.ts +0 -443
- 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 -252
- package/src/model/qwen3.ts +0 -277
- package/src/model/qwen3_5-checkpoint.ts +0 -164
- package/src/model/qwen3_5.ts +0 -819
- 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 -102
- 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 -83
- 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/native/expert_io.c +0 -523
- package/src/native/frame_extract.swift +0 -140
- package/src/native-pack.ts +0 -162
- 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 -1932
- package/src/preflight.ts +0 -158
- package/src/prompt-cache.ts +0 -460
- 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 -81
- package/src/safetensors.ts +0 -158
- package/src/sampler.ts +0 -1011
- 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/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 -496
- 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 -43
- package/src/serve/model-host.ts +0 -511
- package/src/serve/parent-application.ts +0 -56
- package/src/serve/prompt-response-trace.ts +0 -147
- 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/server.ts +0 -1314
- package/src/spec/assistant-rows.ts +0 -92
- 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 -317
- package/src/spec/glm52-mtp-state.ts +0 -33
- package/src/spec/ngram-source.ts +0 -204
- 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 -219
- package/src/spec/qwen-mtp-source.ts +0 -383
- package/src/spec/qwen-mtp-state.ts +0 -30
- package/src/spec/serve-loop.ts +0 -585
- package/src/spec/source.ts +0 -215
- package/src/spec/two-model-rows.ts +0 -61
- package/src/spec/two-model.ts +0 -113
- package/src/ssd-cache.ts +0 -372
- package/src/ssd-durability.ts +0 -211
- 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 -168
- package/src/vision/preprocess.ts +0 -247
- package/src/vision/prompt.ts +0 -373
- package/src/vision/qwen3vl-preprocess.ts +0 -409
- package/src/vision/qwen3vl-prompt.ts +0 -196
- package/src/vision/qwen3vl-tower.ts +0 -555
- package/src/vision/siglip.ts +0 -599
- package/src/vision/video-frames.ts +0 -148
- package/src/web/app.html +0 -2143
- package/src/web/app.js +0 -5703
- 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 -1057
- package/src/web/src/composer.ts +0 -959
- 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/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/web/{icon.svg → public/icon.svg} +0 -0
- /package/src/web/{manifest.webmanifest → public/manifest.webmanifest} +0 -0
- /package/src/web/{vendor → public/vendor}/hljs-LICENSE +0 -0
|
@@ -1,355 +0,0 @@
|
|
|
1
|
-
# Distributing mlx-bun — build, sign, notarize, publish
|
|
2
|
-
|
|
3
|
-
The canonical ship doc. Everything here is what the scripts do, not a
|
|
4
|
-
recipe to type by hand: [scripts/build-binary.sh](../../scripts/build-binary.sh)
|
|
5
|
-
builds the bundle, [scripts/release-binary.sh](../../scripts/release-binary.sh)
|
|
6
|
-
signs and notarizes it, [scripts/publish-release.sh](../../scripts/publish-release.sh)
|
|
7
|
-
pushes it to every channel. If this doc and a script disagree, the script
|
|
8
|
-
is right and this doc has drifted.
|
|
9
|
-
|
|
10
|
-
Three install channels ship from one release:
|
|
11
|
-
|
|
12
|
-
| channel | what the user gets | network step |
|
|
13
|
-
|---|---|---|
|
|
14
|
-
| Homebrew (`brew install joshuarossi/tap/mlx-bun`) | the signed + notarized self-contained bundle | one tarball, via brew |
|
|
15
|
-
| Direct download (`curl -fsSL https://mlx-bun.dev/install.sh \| sh`) | the same bundle, into `~/.mlx-bun` | one tarball, via curl |
|
|
16
|
-
| npm / bunx (`bunx mlx-bun`, `bun install -g mlx-bun`) | a launcher + the TypeScript source, run under the user's Bun | the package, then the native runtime pack on first run |
|
|
17
|
-
|
|
18
|
-
[docs/reference/distribution.md](./distribution.md) covers the *sidecar* use of the same bundle
|
|
19
|
-
inside a Tauri/Electron app; the build and signing facts it relies on are
|
|
20
|
-
documented here.
|
|
21
|
-
|
|
22
|
-
## What ships in the bundle
|
|
23
|
-
|
|
24
|
-
`scripts/build-binary.sh [outdir]` (default `dist/`) produces one relocatable
|
|
25
|
-
directory. The release tarball is the directory's *contents* (no parent
|
|
26
|
-
dir), ~80 MB compressed; `mlx.metallib` is the bulk of the installed size.
|
|
27
|
-
|
|
28
|
-
| file | what | built from |
|
|
29
|
-
|---|---|---|
|
|
30
|
-
| `mlx-bun` | the CLI/server, `bun build --compile src/cli.ts` | our code + Bun |
|
|
31
|
-
| `libmlxc.dylib` | mlx-c; load command rewritten to `@loader_path/libmlx.dylib` | `/opt/homebrew/lib/libmlxc.dylib` (override `MLXC_DYLIB`) |
|
|
32
|
-
| `libmlx.dylib`, `libjaccl.dylib`, `mlx.metallib` | MLX core, its distributed-comm dependency, the Metal kernels (libmlx loads the metallib from its own directory) | `/opt/homebrew/opt/mlx/lib` (override `MLX_LIB_DIR`) |
|
|
33
|
-
| `libmlx_bun_expert_io.dylib` | bounded streamed-expert I/O for GLM-5.2 MoE serving | [scripts/build-expert-io.sh](../../scripts/build-expert-io.sh) |
|
|
34
|
-
| `mlx-bun-frame-extract` | AVFoundation frame-extraction helper for video input (a Mach-O *executable*, not a dylib) | [scripts/build-frame-extract.sh](../../scripts/build-frame-extract.sh) → `swiftc -O src/native/frame_extract.swift` |
|
|
35
|
-
| `photon_rs_bg.wasm` | pi's image codec, resolved next to the executable by the web chat's `read`-on-image path (best-effort; pi degrades to a text note without it) | `node_modules/@silvia-odwyer/photon-node` (override `PHOTON_WASM`) |
|
|
36
|
-
| `theme/*.json`, `assets/*.png`, `export-html/`, `package.json`, `CHANGELOG.md`, `native/darwin/prebuilds/<arch>/darwin-modifiers.node` | assets the embedded pi **terminal** (`mlx-bun pi`) resolves by path: themes, startup art, `/export` template, version banner + changelog, native modifier-key helper (degrades if absent) | `node_modules/@earendil-works/pi-coding-agent/dist`, `pi-tui` |
|
|
37
|
-
|
|
38
|
-
pi's JavaScript itself is bundled into the executable by `bun build
|
|
39
|
-
--compile`; only what pi resolves *by path* rides along. For a Bun
|
|
40
|
-
single-file executable pi computes its package dir as
|
|
41
|
-
`dirname(process.execPath)`, so every asset sits flat next to `mlx-bun`.
|
|
42
|
-
|
|
43
|
-
After copying, the script runs `install_name_tool` (`libmlxc` →
|
|
44
|
-
`@loader_path/libmlx.dylib`; `@loader_path` rpath on `libmlx` for `libjaccl`)
|
|
45
|
-
and **ad-hoc signs** every Mach-O it touched — arm64 requires a valid
|
|
46
|
-
signature after any load-command rewrite. Ad-hoc is only for local runs; the
|
|
47
|
-
release script replaces it (below).
|
|
48
|
-
|
|
49
|
-
The C and Swift helpers target macOS 14.0 by default, matching the package's
|
|
50
|
-
minimum macOS version. `MACOSX_DEPLOYMENT_TARGET` can override that build
|
|
51
|
-
target. Verify the MLX libraries' deployment targets as well when replacing
|
|
52
|
-
the bundled runtime; compiling our helpers for 14.0 cannot lower a dependency's
|
|
53
|
-
minimum OS version.
|
|
54
|
-
|
|
55
|
-
**Build-time smoke.** The script then runs `mlx-bun --version`, `--help`, and
|
|
56
|
-
`ls`, and compiles [scripts/verify-binary-pi.ts](../../scripts/verify-binary-pi.ts)
|
|
57
|
-
into a *sibling* binary inside the same directory so `process.execPath` points
|
|
58
|
-
at the bundle exactly as it does for the real binary. That smoke builds the
|
|
59
|
-
same headless pi session `src/pi-web.ts` builds (against an unreachable
|
|
60
|
-
provider — a provider error is the success signal), exercises the photon
|
|
61
|
-
image path, calls `initTheme` (load-bearing for `mlx-bun pi`; a failure here
|
|
62
|
-
fails the smoke), and loads the native modifier helper. No model, no server.
|
|
63
|
-
A live streaming turn is the one thing it cannot cover.
|
|
64
|
-
|
|
65
|
-
**Runtime resolution.** The binary finds its native runtime in this order
|
|
66
|
-
(`src/mlx/ffi.ts`, mirrored by `nativeRuntimeDir()` in `src/native-pack.ts`):
|
|
67
|
-
`MLX_BUN_LIBMLXC` env → `libmlxc.dylib` beside the executable → the
|
|
68
|
-
native-pack cache (`~/Library/Caches/mlx-bun/native-v<ver>-<arch>/`) →
|
|
69
|
-
`/opt/homebrew/lib` → `/usr/local/lib`. The expert helper resolves
|
|
70
|
-
`MLX_BUN_EXPERT_IO_DYLIB` → beside the executable → the cache
|
|
71
|
-
(`src/expert-io.ts`); the frame extractor resolves `MLX_BUN_FRAME_EXTRACT` →
|
|
72
|
-
beside the executable → the cache → `dist-native/` → compile-on-demand from
|
|
73
|
-
`src/native/` via the Xcode CLT (`src/vision/video-frames.ts`). The whole
|
|
74
|
-
directory can be moved or renamed; nothing references an absolute path after
|
|
75
|
-
the fixups. Bun realpaths `execPath`, so a symlink to `mlx-bun` (Homebrew's
|
|
76
|
-
`bin/`, the installer's `~/.local/bin`) resolves back to the bundle.
|
|
77
|
-
|
|
78
|
-
## One-time machine setup
|
|
79
|
-
|
|
80
|
-
Releases are inherently local: signing and notarization need the Developer
|
|
81
|
-
ID certificate and Apple credentials on this Mac, so the publish step is
|
|
82
|
-
local too (no cross-repo CI token, nothing for the tap to drift from). The
|
|
83
|
-
release machine needs:
|
|
84
|
-
|
|
85
|
-
1. **Build inputs** — Homebrew `mlx` + `mlx-c` (the bundle copies the dylibs
|
|
86
|
-
and metallib from the brew prefixes above), the Xcode command-line tools
|
|
87
|
-
(`swiftc` for the frame extractor, the C toolchain for the expert helper),
|
|
88
|
-
and Bun at or above the floor in `package.json` `engines.bun`.
|
|
89
|
-
2. **Developer ID Application certificate** — Xcode → Settings → Accounts →
|
|
90
|
-
your Apple ID → *Manage Certificates…* → **+** → **Developer ID
|
|
91
|
-
Application**. The release script picks the first such identity from
|
|
92
|
-
`security find-identity -v -p codesigning`; override with
|
|
93
|
-
`MLX_BUN_SIGN_IDENTITY`.
|
|
94
|
-
3. **Notary credentials** — an App Store Connect **API key** (not your Apple
|
|
95
|
-
ID password): App Store Connect → Users and Access → Integrations → App
|
|
96
|
-
Store Connect API → Team Keys → **+** (role: Developer). Download the
|
|
97
|
-
`AuthKey_<KEYID>.p8` (one-time download), note the Key ID and Issuer ID,
|
|
98
|
-
then store them under the profile name the script expects:
|
|
99
|
-
```sh
|
|
100
|
-
xcrun notarytool store-credentials AC_PROFILE \
|
|
101
|
-
--key ~/.private_keys/AuthKey_<KEYID>.p8 \
|
|
102
|
-
--key-id "<KEYID>" --issuer "<ISSUER-UUID>"
|
|
103
|
-
```
|
|
104
|
-
`store-credentials` validates against Apple before saving. Override the
|
|
105
|
-
profile name with `NOTARY_PROFILE`.
|
|
106
|
-
4. **GitHub** — `gh auth login` with push access to `joshuarossi/mlx-bun`
|
|
107
|
-
(releases) and `joshuarossi/homebrew-tap` (the tap is cloned over https
|
|
108
|
-
and pushed).
|
|
109
|
-
5. **npm** — a publish token for `mlx-bun` (`.npmrc`; `npm whoami` must
|
|
110
|
-
answer).
|
|
111
|
-
6. **The tap repo** — `joshuarossi/homebrew-tap` (Homebrew shorthand
|
|
112
|
-
`joshuarossi/tap`) must already contain `Formula/mlx-bun.rb`; the publish
|
|
113
|
-
script rewrites three fields in it and refuses to run if the file is
|
|
114
|
-
missing.
|
|
115
|
-
|
|
116
|
-
## Per-release flow
|
|
117
|
-
|
|
118
|
-
Exactly what `bun run release` (= `PUBLISH=1 sh scripts/release-binary.sh`)
|
|
119
|
-
does, in order. Steps 1–3 are yours; the rest is the scripts.
|
|
120
|
-
|
|
121
|
-
1. **Write the notes** at `docs/planning/release-notes-v<ver>.md`. The
|
|
122
|
-
publish script uses it as the GitHub release body (`--notes-file`); if it
|
|
123
|
-
is missing the release is created with a bare title and a warning. After
|
|
124
|
-
the release the file is archived to `docs/archive/planning/` (the
|
|
125
|
-
planning directory holds living docs only).
|
|
126
|
-
2. **Bump `version` in `package.json`** and commit.
|
|
127
|
-
3. **Push** so `HEAD == origin/main`. The publish preflight refuses a dirty
|
|
128
|
-
tree or a local HEAD that differs from `origin/main`: the site deploys from
|
|
129
|
-
the push while the binaries are built from the local tree, and the two
|
|
130
|
-
must tell the same story. `RELEASE_SKIP_GIT_CHECK=1` bypasses this for an
|
|
131
|
-
assets-only re-run.
|
|
132
|
-
4. **Build** — `scripts/build-binary.sh dist` as described above
|
|
133
|
-
(`BUILD_DIR` overrides `dist`). Release builds are arm64-only; the script
|
|
134
|
-
exits on any other host arch.
|
|
135
|
-
5. **Sign nested code first** — every `*.dylib`, `*.node`, and the
|
|
136
|
-
`mlx-bun-frame-extract` helper, matched by name under the build dir, gets
|
|
137
|
-
`codesign --force --timestamp --options runtime -s "<identity>"`.
|
|
138
|
-
Nested-before-container is required. The metallib, wasm, JSON, and PNG
|
|
139
|
-
assets are data, not code, and are skipped.
|
|
140
|
-
6. **Sign the executable** with the hardened runtime and
|
|
141
|
-
[scripts/packaging/entitlements.plist](../../scripts/packaging/entitlements.plist):
|
|
142
|
-
- `allow-jit` + `allow-unsigned-executable-memory` — JavaScriptCore JITs;
|
|
143
|
-
under the hardened runtime the binary is killed on launch without them;
|
|
144
|
-
- `disable-library-validation` — required for the Homebrew install.
|
|
145
|
-
brew ad-hoc re-signs bundled dylibs during its relocation pass,
|
|
146
|
-
stripping our team ID off them while leaving the executable
|
|
147
|
-
Developer-ID signed; library validation would then reject the team-ID
|
|
148
|
-
mismatch at `dlopen`. Notarization still passes with it.
|
|
149
|
-
7. **Verify + smoke** — `codesign --verify --strict`, then
|
|
150
|
-
`dist/mlx-bun --version`. A missing entitlement kills the binary here, not
|
|
151
|
-
in a user's `brew install`.
|
|
152
|
-
8. **Notarize** — `ditto` the bundle into a zip, `xcrun notarytool submit
|
|
153
|
-
--wait` under the notary profile (Apple's automated scan, typically 1–5
|
|
154
|
-
min), delete the zip. The script greps the output for
|
|
155
|
-
`status: Accepted` and **exits non-zero on anything else**, printing the
|
|
156
|
-
`xcrun notarytool log <submission-id>` command to inspect the rejection.
|
|
157
|
-
`notarytool` itself exits 0 on `Invalid`, so without this gate a rejected
|
|
158
|
-
bundle would reach PUBLISH.
|
|
159
|
-
9. **Package** — `tar -czf dist-release/mlx-bun-v<ver>-arm64.tar.gz` of the
|
|
160
|
-
bundle contents (only the files that exist from the fixed manifest:
|
|
161
|
-
binary, four dylibs, helper, metallib, wasm, pi assets), plus a `.sha256`
|
|
162
|
-
sidecar. The script prints the `version` / `url` / `sha256` triple for
|
|
163
|
-
the formula. (`OUT_DIR` overrides `dist-release`.) Without `PUBLISH=1` it
|
|
164
|
-
stops here and tells you to run `scripts/publish-release.sh`.
|
|
165
|
-
10. **GitHub release** (`publish-release.sh`, step 1) — copies the tarball to
|
|
166
|
-
a versionless `mlx-bun-arm64.tar.gz`, then `gh release create v<ver>`
|
|
167
|
-
with both assets and the notes file; if the release already exists the
|
|
168
|
-
assets are re-uploaded with `--clobber` instead.
|
|
169
|
-
11. **Tap push** (step 2) — clones `joshuarossi/homebrew-tap`, rewrites
|
|
170
|
-
`version` / `url` / `sha256` in `Formula/mlx-bun.rb` with `sed`, commits
|
|
171
|
-
and pushes only if the diff is non-empty.
|
|
172
|
-
12. **Mirror the formula** (step 3) — the same three fields are rewritten in
|
|
173
|
-
the in-repo source of truth,
|
|
174
|
-
[scripts/packaging/homebrew/mlx-bun.rb](../../scripts/packaging/homebrew/mlx-bun.rb),
|
|
175
|
-
and left **uncommitted** for you.
|
|
176
|
-
13. **npm publish** (step 4) — `npm view mlx-bun@<ver>`; if that version is
|
|
177
|
-
already live the step is skipped, otherwise `bun publish`. On failure the
|
|
178
|
-
script exits with the retry hint `bun run publish:npm`.
|
|
179
|
-
14. **Commit the mirrored formula** — the script's closing line:
|
|
180
|
-
`git commit -am "chore(dist): mlx-bun <ver>"`.
|
|
181
|
-
|
|
182
|
-
Two-step variant: run `./scripts/release-binary.sh` alone, eyeball
|
|
183
|
-
`dist-release/`, then `./scripts/publish-release.sh`. Both are idempotent —
|
|
184
|
-
re-running publish clobbers the release assets, no-ops the tap push, and skips
|
|
185
|
-
npm if the version is live. Env overrides: `MLX_BUN_SIGN_IDENTITY`,
|
|
186
|
-
`NOTARY_PROFILE`, `BUILD_DIR`, `OUT_DIR` (release); `OUT_DIR`, `REPO`,
|
|
187
|
-
`TAP_REPO` (publish).
|
|
188
|
-
|
|
189
|
-
For an SSH-driven release, a local keychain unlock may still leave
|
|
190
|
-
`notarytool` reporting `keychainLocked` in the SSH session. The v0.3.0
|
|
191
|
-
release succeeded by running `release-binary.sh` in the M1 Max's local
|
|
192
|
-
Terminal, then `publish-release.sh` over SSH. Both steps used the same clean
|
|
193
|
-
merged source and `OUT_DIR`. Check `npm whoami` from the actual release
|
|
194
|
-
checkout too: a project `.npmrc` can override the user's configuration.
|
|
195
|
-
|
|
196
|
-
### The notarization lesson (v0.2.0, 2026-08-24)
|
|
197
|
-
|
|
198
|
-
The first v0.2.0 submission came back **Invalid**. The release added
|
|
199
|
-
`mlx-bun-frame-extract`, a Swift executable, to the bundle; the signing step
|
|
200
|
-
matched only `*.dylib` and `*.node`, so the helper reached Apple with the
|
|
201
|
-
build script's ad-hoc signature — no Developer ID, no hardened runtime, no
|
|
202
|
-
timestamp — and notarization rejects any nested Mach-O signed that way. The
|
|
203
|
-
old script also treated `notarytool`'s exit 0 as success, which would have
|
|
204
|
-
let the rejected bundle go on to publish.
|
|
205
|
-
|
|
206
|
-
Two changes, both in `scripts/release-binary.sh`: helper executables are
|
|
207
|
-
matched **by name** in the nested-signing pass (add every new helper there
|
|
208
|
-
when it lands — the manifest in the packaging step is the checklist), and
|
|
209
|
-
the script fails on any status other than `Accepted`. The resubmission was
|
|
210
|
-
accepted and the release shipped the same day.
|
|
211
|
-
|
|
212
|
-
### Stapling, quarantine, and where notarization matters
|
|
213
|
-
|
|
214
|
-
A flat CLI bundle **cannot be stapled** (`stapler` only handles `.app` /
|
|
215
|
-
`.dmg` / `.pkg`); the notarization ticket lives on Apple's servers, and
|
|
216
|
-
Gatekeeper consults it online only when a copy carries the
|
|
217
|
-
`com.apple.quarantine` xattr. Homebrew's download and the installer's
|
|
218
|
-
`curl` do not set that xattr, so both run prompt-free regardless;
|
|
219
|
-
notarization is load-bearing for a browser-downloaded copy (or a future
|
|
220
|
-
Cask). `xattr -d com.apple.quarantine <file>` is the manual escape hatch for
|
|
221
|
-
a quarantined copy on an offline machine.
|
|
222
|
-
|
|
223
|
-
## Channel: Homebrew
|
|
224
|
-
|
|
225
|
-
`brew install joshuarossi/tap/mlx-bun`; upgrades with
|
|
226
|
-
`brew upgrade joshuarossi/tap/mlx-bun`. The formula
|
|
227
|
-
([scripts/packaging/homebrew/mlx-bun.rb](../../scripts/packaging/homebrew/mlx-bun.rb),
|
|
228
|
-
mirrored to the tap by the publish script):
|
|
229
|
-
|
|
230
|
-
- `depends_on arch: :arm64`, `depends_on macos: :sonoma` — bump the macOS
|
|
231
|
-
floor if MLX needs newer;
|
|
232
|
-
- `libexec.install Dir["*"]` then `bin.install_symlink libexec/"mlx-bun"` —
|
|
233
|
-
the whole bundle lands in `libexec`, and the dylibs and pi assets resolve
|
|
234
|
-
next to the executable through Bun's realpath of `execPath`;
|
|
235
|
-
- `test do` asserts `mlx-bun --version` prints the formula version.
|
|
236
|
-
|
|
237
|
-
The formula deliberately ships everything in one tarball rather than the
|
|
238
|
-
npm approach of a small package plus a first-run download, so `brew install`
|
|
239
|
-
is the only network step and the entire bundle is one signed, notarized
|
|
240
|
-
artifact. Before pushing a formula change by hand, `brew audit --strict --new
|
|
241
|
-
joshuarossi/tap/mlx-bun` catches most issues and `brew install
|
|
242
|
-
--build-from-source` + `brew test` runs the `test do` block locally.
|
|
243
|
-
|
|
244
|
-
## Channel: direct download
|
|
245
|
-
|
|
246
|
-
`publish-release.sh` uploads two assets per release: the versioned tarball
|
|
247
|
-
and a versionless `mlx-bun-arm64.tar.gz`, so `releases/latest` has a URL
|
|
248
|
-
that never changes:
|
|
249
|
-
|
|
250
|
-
```
|
|
251
|
-
https://github.com/joshuarossi/mlx-bun/releases/latest/download/mlx-bun-arm64.tar.gz
|
|
252
|
-
```
|
|
253
|
-
|
|
254
|
-
The user-facing path is [website/public/install.sh](../../website/public/install.sh)
|
|
255
|
-
(served at `mlx-bun.dev/install.sh`):
|
|
256
|
-
|
|
257
|
-
```sh
|
|
258
|
-
curl -fsSL https://mlx-bun.dev/install.sh | sh
|
|
259
|
-
```
|
|
260
|
-
|
|
261
|
-
It checks for Darwin/arm64, downloads that URL (or a pinned tag via
|
|
262
|
-
`MLX_BUN_VERSION=v<ver>`), extracts the **whole** bundle into
|
|
263
|
-
`MLX_BUN_INSTALL_DIR` (default `~/.mlx-bun`), and symlinks `mlx-bun` into the
|
|
264
|
-
first writable of `~/.local/bin`, `/usr/local/bin`, `/opt/homebrew/bin` —
|
|
265
|
-
or prints the `PATH` line to add. Extract into a directory, never just the
|
|
266
|
-
`mlx-bun` file: the executable alone would fall through to the native-pack
|
|
267
|
-
download on first run and lose the pi terminal's assets.
|
|
268
|
-
|
|
269
|
-
## Channel: npm / bunx
|
|
270
|
-
|
|
271
|
-
```sh
|
|
272
|
-
bunx mlx-bun # one-off, no install
|
|
273
|
-
bun install -g mlx-bun # permanent
|
|
274
|
-
mlx-bun --version
|
|
275
|
-
```
|
|
276
|
-
|
|
277
|
-
The npm package is **source, not a binary**. `package.json` `files[]` ships
|
|
278
|
-
`bin/`, `src/`, `docs/`, `README.md`, `LICENSE`, `THIRD_PARTY_LICENSES.md`;
|
|
279
|
-
`exports["."]` points at `src/index.ts` (the library API), `bin.mlx-bun` at
|
|
280
|
-
[bin/mlx-bun.mjs](../../bin/mlx-bun.mjs). There is no postinstall hook and
|
|
281
|
-
no build step. `scripts/packaging/` is not in `files[]`, so the pi
|
|
282
|
-
adapter extension
|
|
283
|
-
([scripts/packaging/pi-extensions/mlx-bun-adapter.ts](../../scripts/packaging/pi-extensions/mlx-bun-adapter.ts))
|
|
284
|
-
is installed by copying it from the repo into `~/.pi/agent/extensions/`.
|
|
285
|
-
|
|
286
|
-
**The launcher** is plain `.mjs` so any runtime can parse it before anything
|
|
287
|
-
touches `bun:ffi` / `bun:sqlite`. It exits with an install hint when `Bun` is
|
|
288
|
-
undefined (Node), when `Bun.version` is below `MIN_BUN` (kept equal to
|
|
289
|
-
`engines.bun`), or when the platform is not darwin/arm64; otherwise it
|
|
290
|
-
imports `src/cli.ts`.
|
|
291
|
-
|
|
292
|
-
**First run: the native runtime pack.** Before importing anything that
|
|
293
|
-
`dlopen`s, `src/cli.ts` calls `ensureNativeRuntime()` (`src/native-pack.ts`).
|
|
294
|
-
If no runtime resolves through the order above, it downloads
|
|
295
|
-
`mlx-bun-native-v<ver>-<arch>.tar.gz` from the GitHub release tagged
|
|
296
|
-
`native-v<ver>` (override the URL with `MLX_BUN_NATIVE_PACK_URL`) through the
|
|
297
|
-
same resumable, sha256- and size-verified `downloadOne` path as model
|
|
298
|
-
downloads, extracts it into a staging directory, checks every file in
|
|
299
|
-
`NATIVE_PACK_FILES` is present, and renames it into
|
|
300
|
-
`~/Library/Caches/mlx-bun/native-v<ver>-<arch>/` — a crashed extract never
|
|
301
|
-
leaves a half-populated cache. Dev trees and embedders resolve via
|
|
302
|
-
Homebrew/env or the sidecar and never hit this path.
|
|
303
|
-
|
|
304
|
-
The pack contains the six native files: `libmlxc.dylib`, `libmlx.dylib`,
|
|
305
|
-
`libjaccl.dylib`, `mlx.metallib`, `libmlx_bun_expert_io.dylib`,
|
|
306
|
-
`mlx-bun-frame-extract`. It is **versioned independently** of the package
|
|
307
|
-
(`NATIVE_PACK_VERSION` in `src/native-pack.ts`, not `package.json`), because
|
|
308
|
-
it changes only when MLX or the helper set changes.
|
|
309
|
-
|
|
310
|
-
### Publishing a new native pack
|
|
311
|
-
|
|
312
|
-
Whenever the pack's file manifest or the MLX runtime changes, publish the pack
|
|
313
|
-
**before** the package release that depends on it — the download 404s until
|
|
314
|
-
the `native-v<ver>` release exists:
|
|
315
|
-
|
|
316
|
-
```sh
|
|
317
|
-
sh scripts/build-native-pack.sh <ver> dist-native
|
|
318
|
-
gh release create native-v<ver> \
|
|
319
|
-
dist-native/mlx-bun-native-v<ver>-arm64.tar.gz \
|
|
320
|
-
dist-native/mlx-bun-native-v<ver>-arm64.tar.gz.sha256 \
|
|
321
|
-
--latest=false --title "mlx-bun native runtime v<ver>" --notes "<what changed>"
|
|
322
|
-
```
|
|
323
|
-
|
|
324
|
-
`build-native-pack.sh` stages the same six files with the same
|
|
325
|
-
`install_name_tool` fixups and ad-hoc signatures as the bundle, tars them,
|
|
326
|
-
and prints the three constants to bake into `src/native-pack.ts`:
|
|
327
|
-
`NATIVE_PACK_VERSION`, the arm64 `SHA256`, and the arm64 `SIZE`. Paste them,
|
|
328
|
-
add any new file to `NATIVE_PACK_FILES`, and commit before bumping the
|
|
329
|
-
package. Pre-publish smoke: a fresh-cache extraction plus a real MLX
|
|
330
|
-
`dlopen` (and, when the helpers changed, an expert read or a video decode).
|
|
331
|
-
The pack is ad-hoc signed only — `build-native-pack.sh` never touches a
|
|
332
|
-
Developer ID and nothing notarizes it; it is `dlopen`ed by the user's own Bun
|
|
333
|
-
process, not by our signed executable. Use `--latest=false` so a native pack
|
|
334
|
-
does not replace the application release behind the direct installer's URL.
|
|
335
|
-
|
|
336
|
-
Native pack 0.4.0 was published on 2026-09-08 with MLX 0.32.2 and MLX-C
|
|
337
|
-
`c74db5307cc8ce122f48d97ef951b30578674e7f`. Its six-file macOS 14 archive
|
|
338
|
-
was uploaded from the M1 Max and downloaded again; its checksum matches the
|
|
339
|
-
package manifest. It was published before mlx-bun v0.3.0. Runtime bindings
|
|
340
|
-
match this one C API, and startup checks the linked core version. The old
|
|
341
|
-
runtime and source controls remain separate for benchmark comparisons.
|
|
342
|
-
|
|
343
|
-
CI builds that pinned C wrapper with
|
|
344
|
-
`sh scripts/packaging/build-native-runtime.sh <new-output-directory>` and sets
|
|
345
|
-
`MLX_BUN_LIBMLXC` to its `lib/libmlxc.dylib`. The script verifies the official
|
|
346
|
-
macOS 14 MLX-Metal archive hash and checks out the exact MLX-C commit. It
|
|
347
|
-
extracts native libraries and headers without running Python or compiling
|
|
348
|
-
Metal sources. This also reproduces the native-pack build inputs;
|
|
349
|
-
Homebrew's C wrapper is not the CI runtime.
|
|
350
|
-
|
|
351
|
-
Managed jobs in the compiled binary re-exec that binary through a private job
|
|
352
|
-
entry, with the database/log paths passed in the environment. They do not depend
|
|
353
|
-
on a Bun executable or a TypeScript source tree. The build runs
|
|
354
|
-
`scripts/packaging/verify-jobs.ts` as a compiled smoke: subprocess completion,
|
|
355
|
-
progress persistence and the CLI entry must pass before the bundle is accepted.
|