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,594 +0,0 @@
1
- # PRODUCT ROADMAP
2
-
3
- Working notes for the product shape of mlx-bun. This is intentionally
4
- less settled than PLAN.md: PLAN is the engineering contract; this file is
5
- the evolving UI/UX/DX north star.
6
-
7
- ## Product north star
8
-
9
- Josh's guiding principle for the entire project is "The absolute BEST local
10
- AI experience on a mac". This governs installation, application development,
11
- everyday use and inference performance.
12
-
13
- Offer multiple simple installation methods without asking users to manage
14
- a Python virtual environment. Let developers import local AI into their
15
- applications without managing a separate inference sidecar. Make JavaScript
16
- and TypeScript first-class ways to build with local AI, without requiring
17
- Python. Make more capable models practical on the same Mac and reduce the
18
- time users wait for successful results.
19
-
20
- Every workstream must serve that experience. Evaluate engineering choices
21
- by the setup, integration and operating burden they remove, as well as the
22
- quality, reliability, speed and hardware efficiency they deliver. Research
23
- and publication can support the project; user benefit determines priority.
24
-
25
- Make the answer to "what is the best way to use local AI on my Mac?"
26
- boringly simple:
27
-
28
- ```sh
29
- mlx-bun
30
- ```
31
-
32
- The user should not need to research Hugging Face variants, quantization
33
- formats, context windows, Python environments, server commands, or agent
34
- provider config before they can try local AI. They should install one
35
- binary, run one command, wait for one resumable model download, and get a
36
- working local chat UI plus a local AI server.
37
-
38
- The intended first-run shape is product, not demo: start with the tiny
39
- welcoming model quickly, begin the stronger recommended model download in the
40
- background, and graduate the user into the best default profile for their
41
- actual Mac without requiring them to learn the model zoo first.
42
-
43
- The runtime can still expose every advanced knob. The default path should
44
- not require them.
45
-
46
- ## Four product faces
47
-
48
- The same runtime has to support four related but distinct jobs:
49
-
50
- 1. **Local AI product** — the one-command experience for someone who just wants
51
- useful local AI. This path should be opinionated, benchmarked, and boringly
52
- reliable.
53
- 2. **Library for app developers** — the embeddable TypeScript/MLX layer for
54
- Bun, Tauri, Electron, and desktop tools that want local inference without a
55
- Python sidecar.
56
- 3. **AI lab for researchers** — the place where parity, evals, kernels,
57
- compiled graphs, ORPO, LoRA adapters, and model experiments can happen in
58
- the same stack that serves the result.
59
- 4. **Autonomous background agent runtime** — the always-available local server
60
- for scripts, recurring tasks, personal tools, and per-request adapter
61
- routing.
62
-
63
- These are not separate products. They are one runtime with progressive
64
- disclosure: appliance defaults at the front, sharp instruments underneath.
65
-
66
- ## The three modes (the organizing design law)
67
-
68
- mlx-bun has not published anything: the entire CLI, command, and flag
69
- surface is still ours to invent, and we are not married to any flag
70
- name. Where a de-facto standard name exists (mlx-lm's), we adopt it
71
- rather than reinvent. The surface is designed once, to serve three
72
- audiences at three depths — progressive disclosure over ONE set of
73
- verbs and one flag vocabulary, not three separate CLIs:
74
-
75
- 1. **Automatic mode** — first-time local-AI users. `mlx-bun` (and bare
76
- verbs) with zero flags. Smart, sane defaults from the device-profile
77
- table (see Core idea). Typing to a chatbot in a web UI in under a
78
- minute, with no knowledge of HF variants, quant formats, or context
79
- windows required.
80
- 2. **Compat mode** — people moving over from mlx-lm. The same verbs,
81
- plus dotted aliases (`mlx-bun.server` *is* `mlx-bun serve`), using
82
- mlx-lm's flag vocabulary, so existing muscle memory and scripts port
83
- with a one-token rename. mlx-lm is canonical because it is the
84
- default Apple references at WWDC and outweighs the alternative by
85
- ~425× monthly installs (1.64M vs 3.85k; mlx-lm 5.8k stars / 765
86
- forks; mlx-optiq has no public repo — measured 2026-06-12).
87
- 3. **Stick-shift mode** — power users and researchers. The full knob
88
- surface: every mlx-lm flag, every optiq feature, plus our own
89
- envelope-pushing ones, all exposed and composable. Build the exact
90
- system you want.
91
-
92
- ### Laws that keep the three modes coherent
93
-
94
- - **One surface, mlx-lm vocabulary.** The dotted form is a pure alias
95
- of the space form. Adopt mlx-lm's flag names wherever they are the
96
- standard; only name a flag ourselves where mlx-lm has no concept for
97
- it (and there we are free to improve on optiq's name, not bound to
98
- it).
99
- - **Compatibility = superset, never intersection.** Every documented
100
- mlx-lm flag/verb behaves faithfully so scripts drop in unchanged. We
101
- never subtract or gate a capability we already have for free to
102
- resemble an upstream — e.g. we serve OpenAI + Anthropic + Responses
103
- from one server, and that stays on: it costs nothing and is invisible
104
- to a beginner.
105
- - **Gate only on conflict.** A capability is always on UNLESS leaving
106
- it on would degrade the automatic or compat experience (it changes
107
- output determinism, trades quality, or surprises a script). Only then
108
- does it move behind a stick-shift flag. This is rule 3 yielding to
109
- rules 1 and 2.
110
- - **optiq is a feature set to absorb, not a flag dialect to honor.**
111
- Its distinctive features (sensitivity mixed-precision convert,
112
- per-layer KV sensitivity profiling, LoRA rank scaling, dual-protocol
113
- serving, latency prediction, the Lab UI) graft onto the mlx-lm spine
114
- as additive flags and a few new verbs.
115
-
116
- ### Status (2026-06-12; compat surface design remains open as of 2026-06-17)
117
-
118
- The compat layer does not exist yet: today's commands (`serve`, `fit`,
119
- `benchmark`, `evals`, `get`/`scan`/`ls`, `pi`, `harness`) are ad-hoc,
120
- not a designed mlx-lm-matching surface — though their flags already
121
- overlap mlx-lm/optiq heavily, so this is mostly rename-and-confirm, not
122
- migration. The work: design the full surface against mlx-lm vocabulary,
123
- reconcile the existing commands into it, and fill the capability matrix
124
- behind it (convert/quantize, LoRA training, eval/perplexity, fuse,
125
- cache_prompt, upload/share). Decomposed into phases in PLAN.md.
126
-
127
- ## Core idea: finite matrix runtime
128
-
129
- The local-AI problem is not continuous for Mac users. MLX means Apple Silicon,
130
- and Apple ships a finite set of real chip/RAM/bandwidth combinations. The
131
- supported model universe is also curated. For each physical device profile and
132
- model snapshot, we can research and preselect the best known model artifact,
133
- context target, KV mode, memory budget, kernel route, graph route, and runtime
134
- flags.
135
-
136
- That means first-run behavior can be a measured lookup table, not a wizard or
137
- an exploratory benchmark:
138
-
139
- ```text
140
- detect exact Mac profile
141
- fingerprint the model snapshot
142
- choose the task mode: chat, vision, tool loop, adapter, training, eval
143
- look up the measured execution plan
144
- download/resume the exact model artifact
145
- start the tuned local server
146
- open the built-in UI
147
- show how to connect external tools and harnesses
148
- ```
149
-
150
- The current `fit` endpoint is the nucleus of this idea: it already reasons over
151
- real Apple Silicon profiles, model bytes, KV bytes, context, and predicted
152
- decode. The product version should evolve from "does this fit?" into:
153
-
154
- ```text
155
- device profile + model checksum + task mode + live memory pressure
156
- -> recommended execution plan
157
- ```
158
-
159
- Execution plans can eventually include specialized graph variants, fused kernel
160
- routes, prompt-cache policy, adapter policy, safe context limits, expected
161
- decode/TTFT, and user-facing rationale. The research work feeds the table. The
162
- table feeds the user.
163
-
164
- ## Recommended profiles
165
-
166
- Initial profile work should stay narrow and excellent. Start with the
167
- Gemma 4 OptiQ family and expand only when the project has a better answer.
168
-
169
- Candidate shape:
170
-
171
- | Device profile | Default model | Intent |
172
- |---|---|---|
173
- | MacBook Air / 16 GB | `mlx-community/gemma-4-e4b-it-OptiQ-4bit` | Fast first local-AI experience. |
174
- | MacBook Pro / 24-32 GB | `mlx-community/gemma-4-12B-it-OptiQ-4bit` | Strong default chat/agent model. |
175
- | Mac Studio / 64 GB | `mlx-community/gemma-4-26B-A4B-it-OptiQ-4bit` | Larger local-agent profile. |
176
-
177
- Exact model choices, context lengths, and flags are not frozen here. They
178
- should be updated from benchmarks, evals, fit predictions, and real use.
179
-
180
- Each profile should eventually carry:
181
-
182
- ```ts
183
- {
184
- id: "macbook-pro-24gb",
185
- model: "mlx-community/gemma-4-12B-it-OptiQ-4bit",
186
- context: 65536,
187
- kv: "mixed",
188
- memoryBudgetBytes: "...",
189
- compiledDecode: true,
190
- expectedDecodeTps: 30,
191
- expectedTtftMs: 100,
192
- label: "Recommended for this Mac",
193
- }
194
- ```
195
-
196
- The important rule: an optimization matters for product defaults when it
197
- changes a device-tier decision, unlocks a larger useful context window,
198
- keeps decode above a user-visible threshold, improves quality at the same
199
- budget, or prevents failure. Saving memory for its own sake is secondary.
200
-
201
- ## Specialization strategy
202
-
203
- For the curated product path, it is acceptable to trade more work up front for a
204
- better hot path later. The Mac is known, the model snapshot is known, and the
205
- task mode is known. That lets us precompute or cache exact plans instead of
206
- shipping every decision to runtime.
207
-
208
- Candidate plan fields:
209
-
210
- - Model checksum and architecture fingerprint.
211
- - Apple Silicon profile: chip, unified memory, bandwidth tier, GPU/CPU shape.
212
- - Context buckets and fixed-shape cache layouts.
213
- - Kernel choices: MLX built-ins, MLX fast paths, custom Metal kernels, or
214
- eager fallback.
215
- - Graph choices: eager, compiled exact-shape graph, compiled bucketed graph,
216
- or prebuilt graph table.
217
- - Adapter choices: none, single LoRA, stacked LoRA, task-routed LoRA.
218
- - Measured results: TTFT, decode tok/s, peak memory, failure envelope.
219
-
220
- This is where loop unrolling, branch deletion, static DAG extraction, fused
221
- kernels, and shape-specialized compiled graphs become product features rather
222
- than abstract optimizations. They matter when they let the default profile be
223
- faster, larger, more stable, or better aligned without asking the user to tune
224
- anything.
225
-
226
- ## First-run UX
227
-
228
- The no-args command should be the friendly path:
229
-
230
- ```sh
231
- mlx-bun
232
- ```
233
-
234
- Likely behavior:
235
-
236
- 1. Detect the hardware profile. *(not yet: `recommendedRepoId()` at `src/fit.ts:86` returns `DEFAULT_REPO_ID` unconditionally — device-profile lookup table is unimplemented)*
237
- 2. Pick the recommended runtime profile. *(same caveat as above)*
238
- 3. Show the selected model and why it was chosen. *(not yet: model is printed, rationale is not)*
239
- 4. Start or resume the background download. **Shipped** — auto-download on first run; resumable.
240
- 5. Start the local server when ready. **Shipped.**
241
- 6. Open or serve the built-in chat UI. **Shipped** — browser tab opened automatically; URL printed either way; `--no-open` skips the tab.
242
- 7. Show connection details for OpenAI/Anthropic-compatible clients. **Shipped** — printed at startup.
243
- 8. Offer harness setup actions for Pi, Hermes, OpenClaw, and others. *Partially shipped: `mlx-bun harness pi` configures an existing Pi install; Hermes and OpenClaw adapters do not exist.*
244
-
245
- This should feel like an appliance, not a framework tutorial.
246
-
247
- ## Adapter catalog vision
248
-
249
- The average user should not have to train adapters to benefit from them. The
250
- product path can ship or offer a curated catalog of lightweight LoRA adapters:
251
- assistant, coding, writing, research, planning, personal-ops, and other
252
- well-scoped modes. A user can install one small adapter and get a better local
253
- assistant without changing the base model.
254
-
255
- Advanced users can still train their own adapters with mlx-bun. The broader
256
- product loop is:
257
-
258
- ```text
259
- curate conversations and task data
260
- train / ORPO task adapters
261
- publish small adapter artifacts
262
- route requests through the right adapter per task
263
- keep the base model resident
264
- ```
265
-
266
- This makes ORPO performance directly product-relevant. If training is cheap and
267
- repeatable enough, the project can keep improving small local models through
268
- adapter updates instead of asking every user to download a larger base model.
269
-
270
- ## Built-in UI
271
-
272
- Bun can serve the UI directly from the same executable. The default UI
273
- does not need to be elaborate at first, but it should work immediately.
274
-
275
- Expected surfaces:
276
-
277
- - Chat UI backed by the local model server.
278
- - Download progress, resume status, and model readiness.
279
- - Current device profile and selected model.
280
- - Server URL and API compatibility hints.
281
- - Simple controls for common settings: context, temperature, max tokens.
282
- - Advanced panel for explicit model/profile overrides.
283
- - Integration panel for harnesses and external clients.
284
-
285
- ### Model hot-swap from the UI (candidate)
286
-
287
- Let the user switch the served model at runtime — e.g. Gemma e4b →
288
- MiniCPM5 — from a picker in the web UI, without restarting the server.
289
- Weight load is cheap (mmap is lazy, load runs on the CPU stream; ~0.5 s
290
- for a small model), so a swap can feel like changing a setting rather
291
- than a relaunch. `/library` already enumerates every model on disk with
292
- a per-machine fit assessment and flags the active one (`serving`), so the
293
- menu and the "does it fit" data already exist — the missing pieces are a
294
- swap action and a mutable served context.
295
-
296
- Sketch:
297
- - Today the server is single-model-per-process: `serve()` captures one
298
- `ServerContext` as a const in the `Bun.serve` closure. Hot-swap needs a
299
- mutable "current context" ref that all handlers and the generation
300
- gateway read through.
301
- - A swap endpoint (e.g. `POST /library/activate`) drains in-flight
302
- generations, frees the old model's GPU buffers + KV/prompt caches,
303
- `loadContext()`s the target, rebuilds the gateway, then atomically
304
- swaps the ref. `/v1/models`, `/status`, and the Pi probe report the new
305
- id afterward.
306
-
307
- Constraints to honor:
308
- - On a memory-bound Mac you can't hold two models at once — unload before
309
- load. There is an unavoidable brief "swapping…" gap, not an instant
310
- switch. Validate fit() before unloading the current model.
311
- - Load time scales with model size; don't promise instant for large ones.
312
- - Decide adapter behavior on swap (dropped vs. model-scoped) and surface
313
- it. Active LoRA adapters are tied to the base model.
314
-
315
- The UI should not hide that this is local. It should make "local" feel
316
- easy: predictable memory, transparent downloads, offline-capable serving,
317
- and clear integration instructions.
318
-
319
- ### SigLIP vision sidecar — image input for gemma e4b (shipped, 2026-06-17)
320
-
321
- The Gemma 4 e4b vision encoder (`src/vision/siglip.ts`) is a faithful port
322
- of the optiq SigLIP tower. It auto-loads on first image input and falls back
323
- to text-only mode when no image is present, so the chat UI gains image support
324
- with no startup cost. Features are within ~1% rel-RMSE of the optiq oracle;
325
- every MLX primitive (rms_norm, gelu, matmul, SDPA, RoPE, pooling) is bit-exact.
326
- The residual is sub-bf16 floating-point accumulation across the deep encoder,
327
- not a porting gap. The L1 and L2 paths both work; vision falls back to the
328
- monolith path on L1 and L2.
329
-
330
- ### Adapter web selector and CLI /v1/adapters (shipped)
331
-
332
- Trained LoRA adapters can be selected from the chat UI via a per-conversation
333
- picker (`#chat-adapter` in `src/web/app.html`). The picker lists adapters
334
- discovered by `GET /v1/adapters/available`, mounts the chosen one via
335
- `POST /v1/adapters`, and sends a `set_adapter` message to Pi-web so that
336
- every subsequent turn is routed through the right adapter — including the
337
- `before_provider_request` hook in `src/pi-web.ts`. Adapters are base-model-scoped
338
- and dropped on model swap.
339
-
340
- ### The UI must never lag while the AI is busy (candidate, 2026-06-16)
341
-
342
- A product guarantee: **the AI may crash, the UI never may** — and the UI
343
- must stay responsive no matter how hard the model is working. Waiting for
344
- a *chat reply* is fine and expected (local inference takes time). A laggy
345
- web UI — slow refreshes, stalled `/status`, a frozen page while an agentic
346
- pipeline hammers the GPU — is not.
347
-
348
- One `mlx-bun` process plays three roles on one event-loop thread: it
349
- serves the UI, serves the API, and runs the AI. The AI work is synchronous
350
- blocking GPU/FFI (each `mlx_eval` is atomic and uninterruptible), so it
351
- starves the loop — worst in the non-streaming path and during prefill,
352
- where nothing hands a macrotask back. Yielding between tokens helps the
353
- common case but cannot isolate the UI under sustained load.
354
-
355
- Direction (decided: **subprocess**, not worker thread — only address-space
356
- isolation survives the uncatchable GPU OOM): move the inference runtime
357
- into its own persistent child process behind the existing
358
- `GenerationGateway` seam. The main process becomes a pure reactor (UI +
359
- API + routing, zero MLX calls); one GPU lease serializes all GPU consumers
360
- (chat, API, quantize, finetune) — reusing the spawn/lease pattern jobs
361
- already prove. Converges with model hot-swap (model lives off the main
362
- thread either way). Full design + phasing: `docs/reference/server-config.md`.
363
-
364
- ## Harness UX
365
-
366
- Harness setup should be executable, not just documented.
367
-
368
- ```sh
369
- mlx-bun harness
370
- mlx-bun harness pi
371
- mlx-bun harness hermes
372
- mlx-bun harness openclaw
373
- ```
374
-
375
- `mlx-bun harness` should open an interactive picker. Direct subcommands
376
- should configure a specific harness.
377
-
378
- Each harness adapter can:
379
-
380
- - Detect whether the harness is installed.
381
- - Preserve existing user config.
382
- - Add or update the local mlx-bun provider entry.
383
- - Point it at the local server.
384
- - Select the right API protocol.
385
- - Validate the connection with a tiny request.
386
- - Show the command to launch the harness.
387
-
388
- Pi deserves a first-class path because it can be embedded through its SDK:
389
-
390
- ```sh
391
- mlx-bun harness pi
392
- mlx-bun pi
393
- ```
394
-
395
- `mlx-bun harness pi` configures the user's existing Pi install. `mlx-bun
396
- pi` should start the local mlx-bun runtime and launch Pi itself against
397
- that runtime. If the Pi TUI is the right surface, use it. If an embedded
398
- SDK session is the right surface, use that.
399
-
400
- Other harnesses should follow the same adapter pattern.
401
-
402
- Sketch:
403
-
404
- ```ts
405
- interface HarnessAdapter {
406
- id: "pi" | "hermes" | "openclaw";
407
- label: string;
408
- detect(): Promise<Detection>;
409
- configure(profile: RuntimeProfile): Promise<ConfigureResult>;
410
- validate(profile: RuntimeProfile): Promise<ValidationResult>;
411
- launch?(profile: RuntimeProfile): Promise<void>;
412
- }
413
- ```
414
-
415
- ## CLI shape
416
-
417
- Possible command map:
418
-
419
- ```sh
420
- mlx-bun # recommended model + server + UI
421
- mlx-bun serve # server only
422
- mlx-bun ui # UI only, connect to local/running server
423
- mlx-bun repl # Bun REPL with a local AI client preloaded
424
- mlx-bun pi # launch embedded Pi against mlx-bun
425
- mlx-bun harness # interactive harness setup
426
- mlx-bun harness pi # configure existing Pi
427
- mlx-bun harness hermes # configure Hermes
428
- mlx-bun harness openclaw # configure OpenClaw
429
- mlx-bun models # installed and recommended models
430
- mlx-bun fit # device/model fit information
431
- mlx-bun doctor # diagnostics
432
- ```
433
-
434
- Flags should compose with these modes. The default is opinionated, not
435
- restrictive.
436
-
437
- Examples:
438
-
439
- ```sh
440
- mlx-bun --model gemma-4-12b --context 65536
441
- mlx-bun serve --no-ui --port 8080
442
- mlx-bun pi --model qwen-profile
443
- mlx-bun harness pi --base-url http://localhost:8080/v1
444
- ```
445
-
446
- ## Research loop behind the product
447
-
448
- The product table should be backed by the same research discipline as
449
- PLAN.md:
450
-
451
- 1. Pick a small set of real target devices.
452
- 2. Pick a small set of candidate model artifacts.
453
- 3. Measure fit, context, decode speed, TTFT, memory, and quality.
454
- 4. Specialize the runtime for winning artifacts.
455
- 5. Promote only defaults that pass clean-machine measurements.
456
- 6. Keep fallback and explicit override paths for research and power users.
457
-
458
- The first family is Gemma 4 OptiQ. Qwen is the next obvious family to
459
- evaluate. The default model should be whichever gives the best experience
460
- for a device profile and use case, not whichever family arrived first.
461
-
462
- ## Artifact design
463
-
464
- Longer term, mlx-bun may not only choose among existing model artifacts.
465
- It may create artifacts for exact device/use-case targets.
466
-
467
- The useful question is not "can we save 1% RAM?" It is:
468
-
469
- ```text
470
- Can this model fit on this device,
471
- with this context window,
472
- above this decode-speed floor,
473
- while preserving enough quality for this use case?
474
- ```
475
-
476
- TurboQuant plus sensitivity analysis fits this direction. The quantizer
477
- can target concrete SKU boundaries and context tiers:
478
-
479
- - Make a specific model fit on 16 GB with useful context.
480
- - Make a 12B-class model hit 64k context on 24-32 GB.
481
- - Keep decode above 30 tok/s on the recommended profile.
482
- - Preserve tool/agent behavior under the chosen quantization.
483
-
484
- This turns quantization from generic compression into product-driven
485
- artifact design.
486
-
487
- ## Runtime specialization
488
-
489
- When a user asks to run a specific model, there is no ambiguity in the hot
490
- path. The artifact, config, tensor shapes, KV config, quantization layout,
491
- chat template, and architectural quirks are known.
492
-
493
- The generic runtime is scaffolding for research, portability, and
494
- fallback. The served instance can be specialized:
495
-
496
- - Generated per-model execution paths.
497
- - Branches and loops removed where the model shape is fixed.
498
- - Per-layer quant bits/group sizes baked in.
499
- - Known cache layouts and attention patterns used directly.
500
- - Custom kernels generated or selected for exact dispatch sites.
501
-
502
- Compatibility paths remain the oracle. Specialized paths are promoted
503
- only when they are correct, measured, and useful.
504
-
505
- ## Lucien / memory-system direction (candidate, 2026-06-12)
506
-
507
- A second product direction under debate alongside the UI/harness work:
508
- make mlx-bun the local-model engine for Lucien (the Dreaming memory
509
- system), in two stages.
510
-
511
- 1. **Prove the models do real work.** Run Lucien's pipeline tasks
512
- (session ingestion, synthesis into articles, recall-grounded chat)
513
- against mlx-bun-served models. Measure quality and performance per
514
- task — this is a real-workload eval, not a benchmark row, and it
515
- feeds the profile table (which model tier can sustain synthesis
516
- work? what context does recall actually need?).
517
- 2. **Package it.** If the models hold up: mlx-bun as a Lucien backend
518
- option — one executable that creates the memory store, gathers
519
- session transcripts, synthesizes them into articles, and serves
520
- conversations grounded on those articles. Same appliance principle
521
- as the chat default: one binary, one command, a working memory
522
- system.
523
-
524
- This stresses exactly the things the runtime is good at measuring:
525
- long-context prefill, sustained batch-ish generation, prompt-cache
526
- reuse across pipeline stages.
527
-
528
- ## Non-goals for the default UX
529
-
530
- - Do not make the user choose from thousands of Hugging Face variants on
531
- first run.
532
- - Do not benchmark their machine before giving a recommendation.
533
- - Do not require Python, a venv, or manual server setup.
534
- - Do not require hand-editing harness config files.
535
- - Do not expose every research flag before the user has a working local
536
- AI experience.
537
-
538
- ## Open questions
539
-
540
- - What exact profile table should ship first? *(The device-profile lookup
541
- table is unimplemented — `recommendedRepoId()` returns `DEFAULT_REPO_ID`
542
- for every SKU. The profile shape in this doc is the spec; the research
543
- work and the fill remain open.)*
544
- - How should background downloads interact with server startup and UI
545
- readiness?
546
- - How should profile recommendations be versioned as benchmarks improve?
547
- - When Qwen lands, what evals decide whether it replaces a Gemma default?
548
-
549
- ### Resolved
550
-
551
- - **Should no-args open the UI automatically, print a local URL, or both?**
552
- Both: the browser tab is opened automatically on start; the URL is always
553
- printed; `--no-open` suppresses the tab without hiding the URL.
554
- - **Which UI stack should be embedded? / How much of Pi should be bundled?**
555
- Resolved by harness-pi + pi-web shipping: the web UI is the bundled
556
- `src/web/app.html` chat page talking to Pi via `pi-web.ts`; Pi is
557
- configured externally via `mlx-bun harness pi`, or launched embedded via
558
- `mlx-bun pi`.
559
- - **What is the right install path?** All of the above — shipped: npm
560
- publish (v0.0.4, `bunx mlx-bun`), Homebrew release pipeline (sign,
561
- notarize, `joshuarossi/homebrew-tap`), and GitHub release binary.
562
-
563
- ## Vision notes (merged from IDEAS.md, 2026-08-23)
564
-
565
- ### Local in the deeper sense
566
-
567
- Two phrases that capture the thesis — especially **mlx-bun × Lucien**:
568
-
569
- 1. **"A truly local model in a deeper sense."** Not just local *compute*
570
- (runs on your Mac, nothing leaves it) — local to *you*: grounded in your
571
- own context and memory, not only your hardware.
572
- 2. **"The best model at being yours."** Not the best model in the absolute /
573
- benchmark sense — the best at *being yours*. A small local model,
574
- fine-tuned and wired to your personal memory, can lose every general
575
- benchmark and still win the only one that matters here.
576
-
577
- Lucien (the Dreaming) is the synthesized, persistent memory of *you*;
578
- mlx-bun is the local, private model runtime. Combined: a model that runs
579
- entirely on your machine **and** is continuously grounded in your own
580
- accumulated context — local in both senses, and yours in a way no hosted
581
- frontier model can be.
582
-
583
- ### Library/app split (idea only — NOT planned, Josh 2026-07-05)
584
-
585
- Two pulls: "one executable, everything you want to do with local AI" (the
586
- product's charm) vs "some people just want a JS ML library — do they need
587
- the rest?" The runtime-isolation work (2026-07-05) drew the exact boundary
588
- either future needs: the engine child = the GPU stuff (src/model, src/mlx,
589
- caches, scheduler, generate); the parent = the app (serve/UI/registry/
590
- jobs/proxy). If a split ever happens it is a PACKAGING decision, not a
591
- refactor — e.g. npm subpath exports (mlx-bun/model vs the full CLI bundle)
592
- so library users import only the core. Library usage is unaffected by
593
- isolation today (in-process generate(), no server involved). Revisit only
594
- if Josh decides; both directions stay open from the current structure.