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.
Files changed (601) hide show
  1. package/README.md +1453 -88
  2. package/THIRD_PARTY_NOTICES.md +882 -0
  3. package/bin/mlx-bun.convert.mjs +4 -0
  4. package/bin/mlx-bun.fuse.mjs +4 -0
  5. package/bin/mlx-bun.generate.mjs +4 -0
  6. package/bin/mlx-bun.lora.mjs +4 -0
  7. package/bin/mlx-bun.mjs +13 -21
  8. package/bin/mlx-bun.server.mjs +4 -0
  9. package/bin/mlx-bun.upload.mjs +4 -0
  10. package/dist/web/app.js +9584 -0
  11. package/package.json +50 -53
  12. package/src/cli/ane-install.ts +76 -0
  13. package/src/cli/args.ts +179 -0
  14. package/src/cli/engine-entry.ts +68 -0
  15. package/src/cli/inference.ts +214 -0
  16. package/src/cli/job-entry.ts +97 -0
  17. package/src/cli/library-host.ts +117 -0
  18. package/src/cli/main.ts +57 -0
  19. package/src/cli/memory-engine.ts +163 -0
  20. package/src/cli/memory.ts +36 -0
  21. package/src/cli/mlx-lm-aliases.ts +309 -0
  22. package/src/cli/model-choice.ts +33 -0
  23. package/src/cli/model-selection.ts +84 -0
  24. package/src/cli/module-host.ts +11 -0
  25. package/src/cli/module-verbs.ts +50 -0
  26. package/src/cli/numerical-policy.ts +12 -0
  27. package/src/cli/perplexity.ts +89 -0
  28. package/src/cli/serve-host.ts +423 -0
  29. package/src/cli/serve-isolated.ts +217 -0
  30. package/src/cli/serve-options.ts +106 -0
  31. package/src/cli/serve-state.ts +205 -0
  32. package/src/cli/serve.ts +500 -0
  33. package/src/cli/served-model-host.ts +102 -0
  34. package/src/cli/server-entry.ts +148 -0
  35. package/src/cli/serving-unit.ts +177 -0
  36. package/src/{tui.ts → cli/terminal.ts} +13 -8
  37. package/src/cli/worker-adapters.ts +34 -0
  38. package/src/cli/worker-entry.ts +272 -0
  39. package/src/cli/worker-unit.ts +179 -0
  40. package/src/engine/adapter-operation.ts +26 -0
  41. package/src/engine/cache-services.ts +114 -0
  42. package/src/engine/completion.ts +39 -0
  43. package/src/engine/generation-gateway.ts +358 -0
  44. package/src/engine/index.ts +59 -0
  45. package/src/engine/kv-budget.ts +120 -0
  46. package/src/engine/media-preparation.ts +232 -0
  47. package/src/engine/model-binding.ts +24 -0
  48. package/src/engine/model-host.ts +513 -0
  49. package/src/engine/model-serving.ts +89 -0
  50. package/src/{serve → engine}/preparation.ts +10 -8
  51. package/src/{serve → engine}/session-completion-engine.ts +6 -6
  52. package/src/engine/telemetry.ts +109 -0
  53. package/src/hub/downloads.ts +116 -0
  54. package/src/jobs/db.ts +16 -7
  55. package/src/jobs/events.ts +29 -0
  56. package/src/jobs/executable.ts +5 -0
  57. package/src/jobs/host.ts +51 -0
  58. package/src/jobs/in-process.ts +55 -0
  59. package/src/{contracts/jobs.ts → jobs/protocol.ts} +7 -9
  60. package/src/jobs/runner.ts +150 -231
  61. package/src/jobs/service.ts +75 -0
  62. package/src/jobs/sse.ts +59 -23
  63. package/src/jobs/worker-memory.ts +46 -0
  64. package/src/jobs/worker-process.ts +163 -0
  65. package/src/jobs/worker-supervisor.ts +258 -0
  66. package/src/modules.ts +58 -0
  67. package/src/publishing/catalog-hub.ts +18 -0
  68. package/src/publishing/credentials.ts +31 -0
  69. package/src/publishing/upload.ts +37 -0
  70. package/src/residency/leased-adapters.ts +21 -0
  71. package/src/residency/local-records.ts +16 -0
  72. package/src/residency/model-residency.ts +405 -0
  73. package/src/residency/record-index.ts +28 -0
  74. package/src/residency/resident-estimate.ts +50 -0
  75. package/src/{anthropic.ts → server/anthropic.ts} +3 -81
  76. package/src/server/cache-routes.ts +36 -0
  77. package/src/{serve → server}/chat-request.ts +12 -10
  78. package/src/{serve → server}/chat-stage.ts +27 -22
  79. package/src/{client.ts → server/client.ts} +28 -2
  80. package/src/{serve → server}/completion-executor.ts +42 -42
  81. package/src/server/decision-body.ts +55 -0
  82. package/src/server/decision-routes.ts +134 -0
  83. package/src/server/decision-wire.ts +228 -0
  84. package/src/{serve → server}/discovery-routes.ts +42 -83
  85. package/src/server/generated-token-history.ts +57 -0
  86. package/src/{serve → server}/http.ts +25 -13
  87. package/src/{serve → server}/inference-request.ts +5 -5
  88. package/src/server/job-routes.ts +20 -0
  89. package/src/server/media-prompt.ts +63 -0
  90. package/src/server/memory-completion-client.ts +46 -0
  91. package/src/server/model-routes.ts +192 -0
  92. package/src/{serve → server}/openai-wire.ts +3 -2
  93. package/src/{serve → server}/pipeline.ts +1 -1
  94. package/src/server/prompt-builder.ts +13 -0
  95. package/src/server/prompt-contracts.ts +17 -0
  96. package/src/server/proxy-routes.ts +187 -0
  97. package/src/server/publishing-routes.ts +41 -0
  98. package/src/{serve → server}/request-plan.ts +8 -8
  99. package/src/{serve → server}/request-prep.ts +82 -68
  100. package/src/{serve → server}/responses-client.ts +30 -13
  101. package/src/{responses.ts → server/responses.ts} +12 -93
  102. package/src/server/routes.ts +205 -0
  103. package/src/server/start.ts +72 -0
  104. package/src/server/status-routes.ts +108 -0
  105. package/src/{serve → server}/text-completion-stage.ts +25 -4
  106. package/src/server/text-prompt.ts +12 -0
  107. package/src/{serve → server}/token-streams.ts +36 -38
  108. package/src/server/worker-routes.ts +311 -0
  109. package/src/storage/paths.ts +61 -0
  110. package/src/web/assets.ts +37 -0
  111. package/src/web/{src → browser}/api.ts +5 -23
  112. package/src/web/browser/chat-host.ts +17 -0
  113. package/src/web/browser/installed-panels.ts +6 -0
  114. package/src/web/browser/main.ts +55 -0
  115. package/src/web/browser/markdown.ts +279 -0
  116. package/src/web/browser/memory-panel.ts +9 -0
  117. package/src/web/browser/palette.ts +64 -0
  118. package/src/web/browser/protocol.ts +13 -0
  119. package/src/web/browser/shell.ts +467 -0
  120. package/src/web/{src → browser}/status.ts +32 -36
  121. package/src/web/build.ts +51 -0
  122. package/src/web/public/app.html +1054 -0
  123. package/src/web/{sw.js → public/sw.js} +4 -3
  124. package/src/web/{vendor → public/vendor}/hljs-theme.css +2 -2
  125. package/src/web/{vendor → public/vendor}/hljs.js +2 -2
  126. package/THIRD_PARTY_LICENSES.md +0 -51
  127. package/docs/README.md +0 -94
  128. package/docs/archive/hlg-sampling.md +0 -350
  129. package/docs/archive/investigations/audio-input-plan.md +0 -356
  130. package/docs/archive/investigations/chunk-finetune-experiment.md +0 -84
  131. package/docs/archive/investigations/colibri-glm52-port.md +0 -1486
  132. package/docs/archive/investigations/colibri-oracle-pin.md +0 -1284
  133. package/docs/archive/investigations/curve-bisector-routing.md +0 -123
  134. package/docs/archive/investigations/decode-roofline-lookagain.md +0 -348
  135. package/docs/archive/investigations/diffusion-gemma-port.md +0 -602
  136. package/docs/archive/investigations/dspark-handoff.md +0 -224
  137. package/docs/archive/investigations/expert-offload-single-user-moe.md +0 -292
  138. package/docs/archive/investigations/faithful-l1-consolidation.md +0 -310
  139. package/docs/archive/investigations/hlg-sampling-investigation.md +0 -970
  140. package/docs/archive/investigations/indexshare-performance-spike.md +0 -357
  141. package/docs/archive/investigations/kernel-perf-review-2026-07.md +0 -171
  142. package/docs/archive/investigations/lab-build-journal.md +0 -157
  143. package/docs/archive/investigations/minicpm5-decode-megakernel.md +0 -489
  144. package/docs/archive/investigations/openjarvis-fit.md +0 -198
  145. package/docs/archive/investigations/openwiki-evaluation.md +0 -249
  146. package/docs/archive/investigations/optimization_plan.md +0 -346
  147. package/docs/archive/investigations/orpo-base-uf-experiment-and-directions.md +0 -120
  148. package/docs/archive/investigations/orpo-flash-cce-pin-leak.md +0 -167
  149. package/docs/archive/investigations/orpo-uf-testing-handoff.md +0 -126
  150. package/docs/archive/investigations/pareto-specialized-runtime-findings.md +0 -92
  151. package/docs/archive/investigations/pi-builtin-investigation.md +0 -308
  152. package/docs/archive/investigations/pre-colibri-stabilization.md +0 -329
  153. package/docs/archive/investigations/qwen38-27b-campaign-log.md +0 -1092
  154. package/docs/archive/investigations/segmented-backward-handoff.md +0 -148
  155. package/docs/archive/investigations/starter-model-port-handoff.md +0 -342
  156. package/docs/archive/investigations/steel-flash-cce-handoff.md +0 -489
  157. package/docs/archive/investigations/the-dreaming-handoff.md +0 -141
  158. package/docs/archive/investigations/trainer-validation-experiment.md +0 -173
  159. package/docs/archive/planning/chat-ui-vision-memory-first.md +0 -199
  160. package/docs/archive/planning/chat-ui-vision.md +0 -50
  161. package/docs/archive/planning/chunk-task-roadmap.md +0 -77
  162. package/docs/archive/planning/curve-sampler-research-plan.md +0 -331
  163. package/docs/archive/planning/journal.md +0 -316
  164. package/docs/archive/planning/memory-docs-and-dag-plan.md +0 -194
  165. package/docs/archive/planning/pi-integration-review.md +0 -178
  166. package/docs/archive/planning/release-notes-v0.0.10.md +0 -57
  167. package/docs/archive/planning/release-notes-v0.0.11.md +0 -239
  168. package/docs/archive/planning/release-notes-v0.0.12.md +0 -80
  169. package/docs/archive/planning/release-notes-v0.0.13.md +0 -77
  170. package/docs/archive/planning/release-notes-v0.0.9.md +0 -122
  171. package/docs/archive/planning/release-notes-v0.2.0.md +0 -49
  172. package/docs/archive/planning/release-notes-v0.3.0.md +0 -35
  173. package/docs/archive/planning/web-ui-pass-plan.md +0 -213
  174. package/docs/archive/planning/website-readme-pass-plan.md +0 -224
  175. package/docs/design/batching.md +0 -1841
  176. package/docs/design/decode-speed-program.md +0 -2349
  177. package/docs/design/dreaming-nightly-pipeline.md +0 -684
  178. package/docs/design/generic-model-support.md +0 -705
  179. package/docs/design/kv-cache.md +0 -824
  180. package/docs/design/orpo-training.md +0 -680
  181. package/docs/design/speculative-decoding.md +0 -1990
  182. package/docs/design/turboquant.md +0 -2212
  183. package/docs/design/unified-engine-frontier-plan.md +0 -1880
  184. package/docs/design/web-chat-redesign.md +0 -695
  185. package/docs/planning/PRODUCT_ROADMAP.md +0 -594
  186. package/docs/planning/ResearchTopics.md +0 -119
  187. package/docs/planning/release-notes-v0.4.0.md +0 -45
  188. package/docs/planning/video-series.md +0 -421
  189. package/docs/reference/benchmarks.md +0 -3613
  190. package/docs/reference/cli.md +0 -585
  191. package/docs/reference/distribution.md +0 -355
  192. package/docs/reference/environment.md +0 -398
  193. package/docs/reference/glossary.md +0 -39
  194. package/docs/reference/library-api.md +0 -674
  195. package/docs/reference/memory.md +0 -260
  196. package/docs/reference/models.md +0 -334
  197. package/docs/reference/server-api.md +0 -1775
  198. package/docs/reference/server-config.md +0 -846
  199. package/docs/reference/training.md +0 -462
  200. package/docs/reference/troubleshooting.md +0 -158
  201. package/src/admission-plan.ts +0 -18
  202. package/src/audio/conformer.ts +0 -647
  203. package/src/audio/decode.ts +0 -133
  204. package/src/audio/features.ts +0 -202
  205. package/src/audio/transcode.ts +0 -67
  206. package/src/backends/mlx/assistant-target.ts +0 -46
  207. package/src/backends/mlx/autoregressive-draft-rows.ts +0 -120
  208. package/src/backends/mlx/autoregressive.ts +0 -108
  209. package/src/backends/mlx/batch-group.ts +0 -1790
  210. package/src/backends/mlx/cache-attachment.ts +0 -67
  211. package/src/backends/mlx/cache-layout.ts +0 -31
  212. package/src/backends/mlx/checkpoint-state.ts +0 -53
  213. package/src/backends/mlx/continuation-persistence.ts +0 -106
  214. package/src/backends/mlx/continuation-request.ts +0 -43
  215. package/src/backends/mlx/continuation.ts +0 -77
  216. package/src/backends/mlx/diffusion.ts +0 -39
  217. package/src/backends/mlx/draft-target.ts +0 -32
  218. package/src/backends/mlx/evaluation.ts +0 -105
  219. package/src/backends/mlx/fill-append.ts +0 -45
  220. package/src/backends/mlx/full-kv-row-append.ts +0 -32
  221. package/src/backends/mlx/full-kv-row-donor.ts +0 -54
  222. package/src/backends/mlx/full-transitioning-kv-rows.ts +0 -65
  223. package/src/backends/mlx/gateway-binding.ts +0 -130
  224. package/src/backends/mlx/graph.ts +0 -38
  225. package/src/backends/mlx/kv-codec.ts +0 -9
  226. package/src/backends/mlx/kv-maintenance.ts +0 -133
  227. package/src/backends/mlx/kv-tensor-rows.ts +0 -212
  228. package/src/backends/mlx/memory-client.ts +0 -189
  229. package/src/backends/mlx/methods.ts +0 -90
  230. package/src/backends/mlx/model-prompt.ts +0 -164
  231. package/src/backends/mlx/model-serving.ts +0 -79
  232. package/src/backends/mlx/prefill-cohort.ts +0 -89
  233. package/src/backends/mlx/prefill-rows.ts +0 -200
  234. package/src/backends/mlx/prefill.ts +0 -33
  235. package/src/backends/mlx/projected-context-rows.ts +0 -72
  236. package/src/backends/mlx/request-policy.ts +0 -20
  237. package/src/backends/mlx/request-state-policy.ts +0 -41
  238. package/src/backends/mlx/rollback.ts +0 -89
  239. package/src/backends/mlx/row-sampling.ts +0 -49
  240. package/src/backends/mlx/serial-executor.ts +0 -242
  241. package/src/backends/mlx/speculative-group.ts +0 -359
  242. package/src/backends/mlx/speculative-round.ts +0 -161
  243. package/src/backends/mlx/speculative.ts +0 -114
  244. package/src/backends/mlx/state-rows.ts +0 -104
  245. package/src/backends/mlx/state-views.ts +0 -46
  246. package/src/backends/mlx/target-layout-capability.ts +0 -35
  247. package/src/backends/mlx/text-engine.ts +0 -73
  248. package/src/backends/mlx/transitioning-kv-rows.ts +0 -165
  249. package/src/chat-template.ts +0 -382
  250. package/src/cli.ts +0 -3168
  251. package/src/config.ts +0 -399
  252. package/src/contracts/completion.ts +0 -16
  253. package/src/contracts/execution.ts +0 -60
  254. package/src/contracts/generation.ts +0 -103
  255. package/src/contracts/host.ts +0 -7
  256. package/src/contracts/pi-provider.ts +0 -30
  257. package/src/contracts/pi.ts +0 -259
  258. package/src/contracts/prefix-cache.ts +0 -23
  259. package/src/contracts/resources.ts +0 -25
  260. package/src/contracts/sampling.ts +0 -23
  261. package/src/contracts/scheduling.ts +0 -45
  262. package/src/contracts/tsconfig.json +0 -14
  263. package/src/dataset/generators.ts +0 -1087
  264. package/src/dataset/index.ts +0 -12
  265. package/src/dataset/job.ts +0 -81
  266. package/src/dataset/llm.ts +0 -71
  267. package/src/dataset/registry.ts +0 -528
  268. package/src/diffusion/diffusion-generate.ts +0 -507
  269. package/src/download.ts +0 -505
  270. package/src/embed.ts +0 -77
  271. package/src/engine/admission.ts +0 -59
  272. package/src/engine/cancellation.ts +0 -38
  273. package/src/engine/engine.ts +0 -56
  274. package/src/engine/execution-coordinator.ts +0 -70
  275. package/src/engine/execution-plan.ts +0 -53
  276. package/src/engine/resources.ts +0 -53
  277. package/src/engine/scheduler.ts +0 -72
  278. package/src/engine/session.ts +0 -247
  279. package/src/eval/README.md +0 -130
  280. package/src/eval/ifeval.ts +0 -81
  281. package/src/eval/kl-prompts.ts +0 -29
  282. package/src/eval/kl.ts +0 -590
  283. package/src/eval/perplexity.ts +0 -164
  284. package/src/eval/quality-db.ts +0 -92
  285. package/src/eval/reference-logits.ts +0 -207
  286. package/src/eval/runner.ts +0 -124
  287. package/src/eval/score.ts +0 -49
  288. package/src/eval/tasks/bfcl.ts +0 -535
  289. package/src/eval/tasks/gsm8k.ts +0 -98
  290. package/src/eval/tasks/hashhop.ts +0 -139
  291. package/src/eval/tasks/humaneval.ts +0 -275
  292. package/src/eval/tasks/ifeval.ts +0 -525
  293. package/src/eval/tasks/mmlu.ts +0 -157
  294. package/src/eval/ultrafeedback.ts +0 -60
  295. package/src/evaldb.ts +0 -199
  296. package/src/expert-io.ts +0 -393
  297. package/src/expert-offload-build.ts +0 -77
  298. package/src/expert-offload.ts +0 -76
  299. package/src/expert-residency.ts +0 -1134
  300. package/src/expert-usage.ts +0 -415
  301. package/src/fill/echo-index.ts +0 -188
  302. package/src/fill/fill-session.ts +0 -452
  303. package/src/fill/proposal.ts +0 -68
  304. package/src/fill/schema-rows.ts +0 -506
  305. package/src/fill/tool-boundary.ts +0 -103
  306. package/src/fit.ts +0 -249
  307. package/src/generate.ts +0 -1346
  308. package/src/grammar.ts +0 -591
  309. package/src/harness-pi.ts +0 -184
  310. package/src/hf-push.ts +0 -628
  311. package/src/hub-rest.ts +0 -242
  312. package/src/index.ts +0 -63
  313. package/src/inference/denoising.ts +0 -17
  314. package/src/inference/draft-acceptance.ts +0 -41
  315. package/src/inference/draft-output.ts +0 -49
  316. package/src/inference/graph.ts +0 -33
  317. package/src/inference/prefill.ts +0 -39
  318. package/src/inference/rollback.ts +0 -7
  319. package/src/jobs/index.ts +0 -31
  320. package/src/jobs/job-entry.ts +0 -107
  321. package/src/jobs/task-client.ts +0 -19
  322. package/src/jobs/types.ts +0 -2
  323. package/src/kv-scheme.ts +0 -257
  324. package/src/kv-store.ts +0 -1099
  325. package/src/lab/README.md +0 -18
  326. package/src/lab/curve/curve-designer.html +0 -303
  327. package/src/lab/curve/curve-sampler.ts +0 -122
  328. package/src/lab/expert-trace/expert-trace.ts +0 -69
  329. package/src/lab/paged-kv/paged-kv-rows.ts +0 -83
  330. package/src/lab/paged-kv/paged-kv.ts +0 -270
  331. package/src/library.ts +0 -40
  332. package/src/lora.ts +0 -408
  333. package/src/md-modules.d.ts +0 -49
  334. package/src/media-fetch.ts +0 -442
  335. package/src/memory/article.ts +0 -558
  336. package/src/memory/chunk-validation.ts +0 -150
  337. package/src/memory/chunk.ts +0 -318
  338. package/src/memory/cluster.ts +0 -351
  339. package/src/memory/coverage.ts +0 -134
  340. package/src/memory/crosslink.ts +0 -0
  341. package/src/memory/db.ts +0 -253
  342. package/src/memory/entity.ts +0 -203
  343. package/src/memory/gate.ts +0 -187
  344. package/src/memory/history.ts +0 -152
  345. package/src/memory/ingest.ts +0 -335
  346. package/src/memory/model.ts +0 -183
  347. package/src/memory/normalize.ts +0 -671
  348. package/src/memory/parse.ts +0 -22
  349. package/src/memory/pipeline.ts +0 -275
  350. package/src/memory/prompts.ts +0 -65
  351. package/src/memory/query.ts +0 -334
  352. package/src/memory/reconcile.ts +0 -734
  353. package/src/memory/redirect.ts +0 -108
  354. package/src/memory/reindex.ts +0 -325
  355. package/src/memory/resolve.ts +0 -307
  356. package/src/memory/rest.ts +0 -245
  357. package/src/memory/route.ts +0 -272
  358. package/src/memory/schedule.ts +0 -165
  359. package/src/memory/stages.ts +0 -777
  360. package/src/memory/synthesize.ts +0 -1638
  361. package/src/memory/tools.ts +0 -749
  362. package/src/memory/vault.ts +0 -1194
  363. package/src/memory/wikify.ts +0 -1064
  364. package/src/mlx/array.ts +0 -388
  365. package/src/mlx/autograd.ts +0 -304
  366. package/src/mlx/checkpoint.ts +0 -149
  367. package/src/mlx/compile.ts +0 -168
  368. package/src/mlx/custom-vjp.ts +0 -188
  369. package/src/mlx/ffi.ts +0 -512
  370. package/src/mlx/materialize.ts +0 -23
  371. package/src/mlx/metal-kernel.ts +0 -159
  372. package/src/mlx/ops.ts +0 -1021
  373. package/src/mlx/quantized-rows.ts +0 -36
  374. package/src/mlx/token-bitmask.ts +0 -52
  375. package/src/mlx/turboquant-kv-decode.ts +0 -82
  376. package/src/mlx/turboquant-kv-inverse.ts +0 -122
  377. package/src/mlx/turboquant-ops.ts +0 -861
  378. package/src/mlx/turboquant-tables.ts +0 -237
  379. package/src/mmap.ts +0 -90
  380. package/src/model/artifact-identity.ts +0 -73
  381. package/src/model/batched-kv.ts +0 -235
  382. package/src/model/batched-mask.ts +0 -279
  383. package/src/model/batched-quant.ts +0 -212
  384. package/src/model/batched-quantized-kv.ts +0 -144
  385. package/src/model/batched-rotating-quant.ts +0 -353
  386. package/src/model/batched-rotating-state.ts +0 -149
  387. package/src/model/batched-rotating.ts +0 -338
  388. package/src/model/batched-row-storage.ts +0 -179
  389. package/src/model/batched-ssm.ts +0 -52
  390. package/src/model/batched-turboquant-kv.ts +0 -93
  391. package/src/model/compiled-decode.ts +0 -712
  392. package/src/model/decoded-kv-donor.ts +0 -12
  393. package/src/model/delayed-quantized-kv.ts +0 -72
  394. package/src/model/delayed-rotating-quantized-kv.ts +0 -93
  395. package/src/model/delayed-turboquant-kv.ts +0 -55
  396. package/src/model/diffusion-gemma.ts +0 -1026
  397. package/src/model/factory.ts +0 -189
  398. package/src/model/fingerprint.ts +0 -33
  399. package/src/model/flash-attention.ts +0 -694
  400. package/src/model/full-prefill-padding.ts +0 -56
  401. package/src/model/full-prefill-row.ts +0 -105
  402. package/src/model/gemma4-base.ts +0 -2351
  403. package/src/model/gemma4.ts +0 -1315
  404. package/src/model/generated/gemma4-12b.ts +0 -429
  405. package/src/model/generated/gemma4-26b.ts +0 -448
  406. package/src/model/generated/gemma4-e4b.ts +0 -717
  407. package/src/model/generated/index.ts +0 -18
  408. package/src/model/glm52-atlas.ts +0 -511
  409. package/src/model/glm52-cache.ts +0 -792
  410. package/src/model/glm52-config.ts +0 -262
  411. package/src/model/glm52-container.ts +0 -305
  412. package/src/model/glm52-coupling.ts +0 -388
  413. package/src/model/glm52-dsa.ts +0 -606
  414. package/src/model/glm52-expert-layout.ts +0 -253
  415. package/src/model/glm52-layout.ts +0 -152
  416. package/src/model/glm52-memory.ts +0 -500
  417. package/src/model/glm52-mla.ts +0 -792
  418. package/src/model/glm52-moe.ts +0 -223
  419. package/src/model/glm52-pilot.ts +0 -537
  420. package/src/model/glm52-reference.ts +0 -445
  421. package/src/model/glm52-residency.ts +0 -557
  422. package/src/model/glm52-resident-weights.ts +0 -135
  423. package/src/model/glm52-streamed-experts.ts +0 -453
  424. package/src/model/glm52-streamed-metal.ts +0 -610
  425. package/src/model/glm52-weights.ts +0 -503
  426. package/src/model/glm52.ts +0 -1132
  427. package/src/model/implementation.ts +0 -69
  428. package/src/model/kv-attention-view.ts +0 -67
  429. package/src/model/minicpm5.ts +0 -376
  430. package/src/model/profile.ts +0 -443
  431. package/src/model/qwen-append.ts +0 -12
  432. package/src/model/qwen-conv.ts +0 -52
  433. package/src/model/qwen3-delta-state.ts +0 -74
  434. package/src/model/qwen3-delta.ts +0 -451
  435. package/src/model/qwen3-moe.ts +0 -404
  436. package/src/model/qwen3-mrope.ts +0 -252
  437. package/src/model/qwen3.ts +0 -277
  438. package/src/model/qwen3_5-checkpoint.ts +0 -164
  439. package/src/model/qwen3_5.ts +0 -819
  440. package/src/model/rotating-kv-donor.ts +0 -35
  441. package/src/model/rotating-kv-layout.ts +0 -262
  442. package/src/model/rotating-row-transaction.ts +0 -35
  443. package/src/model/speculative-rotating-kv.ts +0 -101
  444. package/src/model/ssm-prefill-padding.ts +0 -39
  445. package/src/model/support.ts +0 -102
  446. package/src/model/trellis-balanced-scatter.ts +0 -51
  447. package/src/model/trellis-linear.ts +0 -672
  448. package/src/model/trellis-shared-m.ts +0 -151
  449. package/src/model/trellis-shared-scatter.ts +0 -144
  450. package/src/model/trellis-splitk-prefill.ts +0 -158
  451. package/src/model/trellis-tiled-prefill.ts +0 -136
  452. package/src/model/trellis-vector-expand.ts +0 -62
  453. package/src/model/trellis-wide-prefill.ts +0 -94
  454. package/src/model/turboquant-codec.ts +0 -83
  455. package/src/model/universal/archs.ts +0 -332
  456. package/src/model/universal/dense.ts +0 -612
  457. package/src/model/universal/modules.ts +0 -170
  458. package/src/model/universal/rope.ts +0 -381
  459. package/src/native/expert_io.c +0 -523
  460. package/src/native/frame_extract.swift +0 -140
  461. package/src/native-pack.ts +0 -162
  462. package/src/pi-provider.ts +0 -53
  463. package/src/pi-session.ts +0 -81
  464. package/src/pi-terminal.ts +0 -274
  465. package/src/pi-web.ts +0 -1932
  466. package/src/preflight.ts +0 -158
  467. package/src/prompt-cache.ts +0 -460
  468. package/src/quantize/allocator.ts +0 -627
  469. package/src/quantize/atomic-output.ts +0 -38
  470. package/src/quantize/calibration.ts +0 -181
  471. package/src/quantize/config-writer.ts +0 -145
  472. package/src/quantize/index.ts +0 -84
  473. package/src/quantize/job.ts +0 -162
  474. package/src/quantize/quantizer.ts +0 -666
  475. package/src/quantize/rotate.ts +0 -603
  476. package/src/quantize/safetensors-writer.ts +0 -249
  477. package/src/quantize/sensitivity.ts +0 -216
  478. package/src/quantize/trellis.ts +0 -586
  479. package/src/quantize/weight-transform.ts +0 -292
  480. package/src/registry.ts +0 -602
  481. package/src/runtime-config.ts +0 -81
  482. package/src/safetensors.ts +0 -158
  483. package/src/sampler.ts +0 -1011
  484. package/src/serve/admin-routes.ts +0 -184
  485. package/src/serve/assets/curve-terrain.html +0 -105
  486. package/src/serve/assets/training-inference-map.html +0 -575
  487. package/src/serve/aux-routes.ts +0 -132
  488. package/src/serve/batch-scheduler.ts +0 -8
  489. package/src/serve/checkpoint-identity.ts +0 -64
  490. package/src/serve/generation-gateway.ts +0 -496
  491. package/src/serve/isolate.ts +0 -609
  492. package/src/serve/kv-budget.ts +0 -14
  493. package/src/serve/lab-routes.ts +0 -341
  494. package/src/serve/lane-registry.ts +0 -45
  495. package/src/serve/model-admin-routes.ts +0 -155
  496. package/src/serve/model-binding.ts +0 -43
  497. package/src/serve/model-host.ts +0 -511
  498. package/src/serve/parent-application.ts +0 -56
  499. package/src/serve/prompt-response-trace.ts +0 -147
  500. package/src/serve/response-lease.ts +0 -24
  501. package/src/serve/session-search.ts +0 -326
  502. package/src/serve/static-routes.ts +0 -101
  503. package/src/server.ts +0 -1314
  504. package/src/spec/assistant-rows.ts +0 -92
  505. package/src/spec/assistant-source.ts +0 -126
  506. package/src/spec/cache-identity.ts +0 -22
  507. package/src/spec/deepspec-rows.ts +0 -29
  508. package/src/spec/deepspec-source.ts +0 -145
  509. package/src/spec/dflash-source.ts +0 -149
  510. package/src/spec/drafter.ts +0 -304
  511. package/src/spec/dspark/ab-stats.ts +0 -136
  512. package/src/spec/dspark/calibration.ts +0 -112
  513. package/src/spec/dspark/data-dflash.ts +0 -156
  514. package/src/spec/dspark/data.ts +0 -201
  515. package/src/spec/dspark/deepspec-module.ts +0 -776
  516. package/src/spec/dspark/generate-dflash.ts +0 -245
  517. package/src/spec/dspark/generate.ts +0 -290
  518. package/src/spec/dspark/loader.ts +0 -23
  519. package/src/spec/dspark/loss.ts +0 -213
  520. package/src/spec/dspark/module-dflash.ts +0 -560
  521. package/src/spec/dspark/module.ts +0 -540
  522. package/src/spec/dspark/quantize-drafter.ts +0 -91
  523. package/src/spec/dspark/sample.ts +0 -112
  524. package/src/spec/generate.ts +0 -276
  525. package/src/spec/glm52-mtp-graph.ts +0 -29
  526. package/src/spec/glm52-mtp-rows.ts +0 -132
  527. package/src/spec/glm52-mtp-source.ts +0 -317
  528. package/src/spec/glm52-mtp-state.ts +0 -33
  529. package/src/spec/ngram-source.ts +0 -204
  530. package/src/spec/projected-draft-rows.ts +0 -73
  531. package/src/spec/qwen-mtp-module.ts +0 -171
  532. package/src/spec/qwen-mtp-rows.ts +0 -219
  533. package/src/spec/qwen-mtp-source.ts +0 -383
  534. package/src/spec/qwen-mtp-state.ts +0 -30
  535. package/src/spec/serve-loop.ts +0 -585
  536. package/src/spec/source.ts +0 -215
  537. package/src/spec/two-model-rows.ts +0 -61
  538. package/src/spec/two-model.ts +0 -113
  539. package/src/ssd-cache.ts +0 -372
  540. package/src/ssd-durability.ts +0 -211
  541. package/src/tokenizer.ts +0 -335
  542. package/src/tool-approvals.ts +0 -131
  543. package/src/tool-call.ts +0 -695
  544. package/src/train/dataset.ts +0 -484
  545. package/src/train/diffusion-lora.ts +0 -216
  546. package/src/train/export.ts +0 -32
  547. package/src/train/flash-cce.ts +0 -1234
  548. package/src/train/forward.ts +0 -266
  549. package/src/train/fuse.ts +0 -243
  550. package/src/train/index.ts +0 -46
  551. package/src/train/job.ts +0 -205
  552. package/src/train/lora-params.ts +0 -254
  553. package/src/train/loss.ts +0 -1591
  554. package/src/train/merge.ts +0 -195
  555. package/src/train/optimizer.ts +0 -183
  556. package/src/train/prefix-shared.ts +0 -490
  557. package/src/train/rank.ts +0 -137
  558. package/src/train/segmented.ts +0 -1828
  559. package/src/train/steel-qmm-header.ts +0 -1461
  560. package/src/train/trainer.ts +0 -1221
  561. package/src/train/watch.ts +0 -542
  562. package/src/vision/diffusion-vision.ts +0 -620
  563. package/src/vision/embedder.ts +0 -168
  564. package/src/vision/preprocess.ts +0 -247
  565. package/src/vision/prompt.ts +0 -373
  566. package/src/vision/qwen3vl-preprocess.ts +0 -409
  567. package/src/vision/qwen3vl-prompt.ts +0 -196
  568. package/src/vision/qwen3vl-tower.ts +0 -555
  569. package/src/vision/siglip.ts +0 -599
  570. package/src/vision/video-frames.ts +0 -148
  571. package/src/web/app.html +0 -2143
  572. package/src/web/app.js +0 -5703
  573. package/src/web/skills/memory/SKILL.md +0 -120
  574. package/src/web/skills/web-research/SKILL.md +0 -46
  575. package/src/web/skills.ts +0 -97
  576. package/src/web/src/adapters-panel.ts +0 -288
  577. package/src/web/src/assistant.ts +0 -451
  578. package/src/web/src/chat.ts +0 -1057
  579. package/src/web/src/composer.ts +0 -959
  580. package/src/web/src/dataset.ts +0 -132
  581. package/src/web/src/finetune.ts +0 -267
  582. package/src/web/src/hub.ts +0 -428
  583. package/src/web/src/main.ts +0 -98
  584. package/src/web/src/markdown.ts +0 -0
  585. package/src/web/src/memory-panel.ts +0 -572
  586. package/src/web/src/model-picker.ts +0 -159
  587. package/src/web/src/palette.ts +0 -346
  588. package/src/web/src/protocol.ts +0 -26
  589. package/src/web/src/quantize.ts +0 -167
  590. package/src/web/src/rag.ts +0 -274
  591. package/src/web/src/sessions.ts +0 -469
  592. package/src/web/src/shell.ts +0 -804
  593. package/src/web/src/ui-catalog.ts +0 -78
  594. package/src/web/vendor/README.md +0 -61
  595. package/src/web-assets.ts +0 -47
  596. package/src/web-tools.ts +0 -478
  597. package/src/weights.ts +0 -255
  598. /package/src/{serve → server}/completion-sink.ts +0 -0
  599. /package/src/web/{icon.svg → public/icon.svg} +0 -0
  600. /package/src/web/{manifest.webmanifest → public/manifest.webmanifest} +0 -0
  601. /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.