mlx-bun 0.5.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (640) hide show
  1. package/README.md +1449 -109
  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 +7 -5
  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 +10 -10
  78. package/src/{serve → server}/chat-stage.ts +14 -14
  79. package/src/{client.ts → server/client.ts} +28 -2
  80. package/src/{serve → server}/completion-executor.ts +33 -41
  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 +25 -82
  85. package/src/{serve → server}/http.ts +25 -13
  86. package/src/{serve → server}/inference-request.ts +5 -5
  87. package/src/server/job-routes.ts +20 -0
  88. package/src/server/media-prompt.ts +63 -0
  89. package/src/server/memory-completion-client.ts +46 -0
  90. package/src/server/model-routes.ts +192 -0
  91. package/src/{serve → server}/openai-wire.ts +3 -2
  92. package/src/{serve → server}/pipeline.ts +1 -1
  93. package/src/server/prompt-builder.ts +13 -0
  94. package/src/server/prompt-contracts.ts +17 -0
  95. package/src/server/proxy-routes.ts +187 -0
  96. package/src/server/publishing-routes.ts +41 -0
  97. package/src/{serve → server}/request-plan.ts +6 -8
  98. package/src/{serve → server}/request-prep.ts +47 -50
  99. package/src/{serve → server}/responses-client.ts +30 -13
  100. package/src/{responses.ts → server/responses.ts} +12 -93
  101. package/src/server/routes.ts +205 -0
  102. package/src/server/start.ts +72 -0
  103. package/src/server/status-routes.ts +108 -0
  104. package/src/{serve → server}/text-completion-stage.ts +25 -4
  105. package/src/server/text-prompt.ts +12 -0
  106. package/src/{serve → server}/token-streams.ts +36 -38
  107. package/src/server/worker-routes.ts +311 -0
  108. package/src/storage/paths.ts +61 -0
  109. package/src/web/assets.ts +37 -0
  110. package/src/web/{src → browser}/api.ts +5 -23
  111. package/src/web/browser/chat-host.ts +17 -0
  112. package/src/web/browser/installed-panels.ts +6 -0
  113. package/src/web/browser/main.ts +55 -0
  114. package/src/web/browser/markdown.ts +279 -0
  115. package/src/web/browser/memory-panel.ts +9 -0
  116. package/src/web/browser/palette.ts +64 -0
  117. package/src/web/browser/protocol.ts +13 -0
  118. package/src/web/browser/shell.ts +467 -0
  119. package/src/web/{src → browser}/status.ts +32 -36
  120. package/src/web/build.ts +51 -0
  121. package/src/web/public/app.html +1054 -0
  122. package/src/web/{sw.js → public/sw.js} +4 -3
  123. package/src/web/{vendor → public/vendor}/hljs-theme.css +2 -2
  124. package/src/web/{vendor → public/vendor}/hljs.js +2 -2
  125. package/THIRD_PARTY_LICENSES.md +0 -51
  126. package/docs/README.md +0 -107
  127. package/docs/archive/hlg-sampling.md +0 -350
  128. package/docs/archive/investigations/audio-input-plan.md +0 -356
  129. package/docs/archive/investigations/benchmark-ledger-through-v0.4.0.md +0 -3617
  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/release-notes-v0.4.0.md +0 -45
  174. package/docs/archive/planning/release-notes-v0.5.0.md +0 -37
  175. package/docs/archive/planning/web-ui-pass-plan.md +0 -213
  176. package/docs/archive/planning/website-readme-pass-plan.md +0 -224
  177. package/docs/design/batching.md +0 -2054
  178. package/docs/design/decode-speed-program.md +0 -2404
  179. package/docs/design/dreaming-nightly-pipeline.md +0 -684
  180. package/docs/design/generic-model-support.md +0 -821
  181. package/docs/design/kv-cache.md +0 -993
  182. package/docs/design/orpo-training.md +0 -680
  183. package/docs/design/speculative-decoding.md +0 -2129
  184. package/docs/design/turboquant.md +0 -2225
  185. package/docs/design/unified-engine-frontier-plan.md +0 -1987
  186. package/docs/design/web-chat-redesign.md +0 -695
  187. package/docs/planning/PRODUCT_ROADMAP.md +0 -593
  188. package/docs/planning/ResearchTopics.md +0 -119
  189. package/docs/planning/public-readiness-handoff.md +0 -244
  190. package/docs/planning/public-readiness.md +0 -149
  191. package/docs/planning/video-series.md +0 -421
  192. package/docs/reference/benchmarks.md +0 -3587
  193. package/docs/reference/cli.md +0 -646
  194. package/docs/reference/distribution.md +0 -380
  195. package/docs/reference/environment.md +0 -494
  196. package/docs/reference/glossary.md +0 -39
  197. package/docs/reference/library-api.md +0 -688
  198. package/docs/reference/memory.md +0 -260
  199. package/docs/reference/models.md +0 -346
  200. package/docs/reference/server-api.md +0 -1945
  201. package/docs/reference/server-config.md +0 -973
  202. package/docs/reference/training.md +0 -462
  203. package/docs/reference/troubleshooting.md +0 -158
  204. package/src/admission-plan.ts +0 -18
  205. package/src/audio/audiotoolbox.ts +0 -112
  206. package/src/audio/conformer.ts +0 -655
  207. package/src/audio/decode.ts +0 -133
  208. package/src/audio/features.ts +0 -202
  209. package/src/audio/mic-capture.ts +0 -98
  210. package/src/audio/silero-vad.ts +0 -379
  211. package/src/audio/transcode.ts +0 -67
  212. package/src/audio/whisper-decode.ts +0 -774
  213. package/src/audio/whisper-fast.ts +0 -732
  214. package/src/audio/whisper-format.ts +0 -73
  215. package/src/audio/whisper-mel.ts +0 -185
  216. package/src/audio/whisper-timing.ts +0 -274
  217. package/src/audio/whisper-tokenizer.ts +0 -239
  218. package/src/audio/whisper-transcribe.ts +0 -410
  219. package/src/backends/mlx/assistant-target.ts +0 -46
  220. package/src/backends/mlx/autoregressive-draft-rows.ts +0 -120
  221. package/src/backends/mlx/autoregressive.ts +0 -129
  222. package/src/backends/mlx/batch-group.ts +0 -1874
  223. package/src/backends/mlx/cache-attachment.ts +0 -67
  224. package/src/backends/mlx/cache-layout.ts +0 -31
  225. package/src/backends/mlx/checkpoint-state.ts +0 -53
  226. package/src/backends/mlx/continuation-persistence.ts +0 -107
  227. package/src/backends/mlx/continuation-request.ts +0 -43
  228. package/src/backends/mlx/continuation.ts +0 -77
  229. package/src/backends/mlx/diffusion.ts +0 -39
  230. package/src/backends/mlx/draft-target.ts +0 -32
  231. package/src/backends/mlx/encoder-cache.ts +0 -25
  232. package/src/backends/mlx/evaluation.ts +0 -105
  233. package/src/backends/mlx/fill-append.ts +0 -58
  234. package/src/backends/mlx/fill-group.ts +0 -497
  235. package/src/backends/mlx/full-kv-row-append.ts +0 -32
  236. package/src/backends/mlx/full-kv-row-donor.ts +0 -54
  237. package/src/backends/mlx/full-transitioning-kv-rows.ts +0 -65
  238. package/src/backends/mlx/gateway-binding.ts +0 -174
  239. package/src/backends/mlx/graph.ts +0 -38
  240. package/src/backends/mlx/kv-codec.ts +0 -9
  241. package/src/backends/mlx/kv-maintenance.ts +0 -161
  242. package/src/backends/mlx/kv-tensor-rows.ts +0 -212
  243. package/src/backends/mlx/memory-client.ts +0 -189
  244. package/src/backends/mlx/methods.ts +0 -90
  245. package/src/backends/mlx/mixed-iteration.ts +0 -62
  246. package/src/backends/mlx/model-prompt.ts +0 -178
  247. package/src/backends/mlx/model-serving.ts +0 -80
  248. package/src/backends/mlx/paged-cache-codec.ts +0 -27
  249. package/src/backends/mlx/prefill-cohort.ts +0 -100
  250. package/src/backends/mlx/prefill-policy.ts +0 -26
  251. package/src/backends/mlx/prefill-rows.ts +0 -244
  252. package/src/backends/mlx/prefill.ts +0 -33
  253. package/src/backends/mlx/projected-context-rows.ts +0 -72
  254. package/src/backends/mlx/prompt-input.ts +0 -29
  255. package/src/backends/mlx/qwen-prompt-input.ts +0 -40
  256. package/src/backends/mlx/request-policy.ts +0 -20
  257. package/src/backends/mlx/request-state-policy.ts +0 -54
  258. package/src/backends/mlx/rollback.ts +0 -92
  259. package/src/backends/mlx/row-sampling.ts +0 -49
  260. package/src/backends/mlx/serial-executor.ts +0 -251
  261. package/src/backends/mlx/speculative-group.ts +0 -438
  262. package/src/backends/mlx/speculative-round.ts +0 -161
  263. package/src/backends/mlx/speculative.ts +0 -131
  264. package/src/backends/mlx/state-rows.ts +0 -104
  265. package/src/backends/mlx/state-views.ts +0 -46
  266. package/src/backends/mlx/target-layout-capability.ts +0 -35
  267. package/src/backends/mlx/text-engine.ts +0 -73
  268. package/src/backends/mlx/transitioning-kv-rows.ts +0 -173
  269. package/src/chat-template.ts +0 -382
  270. package/src/cli.ts +0 -3490
  271. package/src/config.ts +0 -399
  272. package/src/contracts/completion.ts +0 -16
  273. package/src/contracts/execution.ts +0 -70
  274. package/src/contracts/generation.ts +0 -103
  275. package/src/contracts/host.ts +0 -7
  276. package/src/contracts/object-cache.ts +0 -8
  277. package/src/contracts/pi-provider.ts +0 -30
  278. package/src/contracts/pi.ts +0 -261
  279. package/src/contracts/prefix-cache.ts +0 -33
  280. package/src/contracts/resources.ts +0 -25
  281. package/src/contracts/sampling.ts +0 -23
  282. package/src/contracts/scheduling.ts +0 -54
  283. package/src/contracts/tsconfig.json +0 -14
  284. package/src/dataset/generators.ts +0 -1087
  285. package/src/dataset/index.ts +0 -12
  286. package/src/dataset/job.ts +0 -81
  287. package/src/dataset/llm.ts +0 -71
  288. package/src/dataset/registry.ts +0 -528
  289. package/src/diffusion/diffusion-generate.ts +0 -507
  290. package/src/download.ts +0 -505
  291. package/src/embed.ts +0 -77
  292. package/src/engine/admission.ts +0 -59
  293. package/src/engine/cancellation.ts +0 -38
  294. package/src/engine/engine.ts +0 -56
  295. package/src/engine/execution-coordinator.ts +0 -70
  296. package/src/engine/execution-plan.ts +0 -64
  297. package/src/engine/execution-tasks.ts +0 -44
  298. package/src/engine/namespaced-cache.ts +0 -13
  299. package/src/engine/resources.ts +0 -53
  300. package/src/engine/scheduler.ts +0 -92
  301. package/src/engine/session.ts +0 -247
  302. package/src/eval/README.md +0 -130
  303. package/src/eval/ifeval.ts +0 -81
  304. package/src/eval/kl-prompts.ts +0 -29
  305. package/src/eval/kl.ts +0 -590
  306. package/src/eval/perplexity.ts +0 -164
  307. package/src/eval/quality-db.ts +0 -92
  308. package/src/eval/reference-logits.ts +0 -207
  309. package/src/eval/runner.ts +0 -124
  310. package/src/eval/score.ts +0 -49
  311. package/src/eval/tasks/bfcl.ts +0 -535
  312. package/src/eval/tasks/gsm8k.ts +0 -98
  313. package/src/eval/tasks/hashhop.ts +0 -139
  314. package/src/eval/tasks/humaneval.ts +0 -275
  315. package/src/eval/tasks/ifeval.ts +0 -525
  316. package/src/eval/tasks/mmlu.ts +0 -157
  317. package/src/eval/ultrafeedback.ts +0 -60
  318. package/src/evaldb.ts +0 -199
  319. package/src/expert-io.ts +0 -393
  320. package/src/expert-offload-build.ts +0 -77
  321. package/src/expert-offload.ts +0 -76
  322. package/src/expert-residency.ts +0 -1134
  323. package/src/expert-usage.ts +0 -415
  324. package/src/fill/echo-index.ts +0 -188
  325. package/src/fill/fill-session.ts +0 -463
  326. package/src/fill/proposal.ts +0 -68
  327. package/src/fill/schema-rows.ts +0 -506
  328. package/src/fill/tool-boundary.ts +0 -103
  329. package/src/fit.ts +0 -249
  330. package/src/generate.ts +0 -1352
  331. package/src/grammar.ts +0 -604
  332. package/src/harness-pi.ts +0 -184
  333. package/src/hf-push.ts +0 -628
  334. package/src/hub-rest.ts +0 -242
  335. package/src/index.ts +0 -63
  336. package/src/inference/denoising.ts +0 -17
  337. package/src/inference/draft-acceptance.ts +0 -41
  338. package/src/inference/draft-output.ts +0 -49
  339. package/src/inference/graph.ts +0 -33
  340. package/src/inference/prefill.ts +0 -45
  341. package/src/inference/rollback.ts +0 -7
  342. package/src/jobs/index.ts +0 -31
  343. package/src/jobs/job-entry.ts +0 -107
  344. package/src/jobs/task-client.ts +0 -19
  345. package/src/jobs/types.ts +0 -2
  346. package/src/kv-scheme.ts +0 -279
  347. package/src/kv-store.ts +0 -1135
  348. package/src/lab/README.md +0 -22
  349. package/src/lab/curve/curve-designer.html +0 -303
  350. package/src/lab/curve/curve-sampler.ts +0 -122
  351. package/src/lab/expert-trace/expert-trace.ts +0 -69
  352. package/src/lab/paged-kv/paged-attention.ts +0 -117
  353. package/src/lab/paged-kv/paged-kv-rows.ts +0 -111
  354. package/src/lab/paged-kv/paged-kv.ts +0 -336
  355. package/src/library.ts +0 -40
  356. package/src/lora.ts +0 -408
  357. package/src/md-modules.d.ts +0 -54
  358. package/src/media-fetch.ts +0 -442
  359. package/src/memory/article.ts +0 -558
  360. package/src/memory/chunk-validation.ts +0 -150
  361. package/src/memory/chunk.ts +0 -318
  362. package/src/memory/cluster.ts +0 -351
  363. package/src/memory/coverage.ts +0 -134
  364. package/src/memory/crosslink.ts +0 -0
  365. package/src/memory/db.ts +0 -253
  366. package/src/memory/entity.ts +0 -203
  367. package/src/memory/gate.ts +0 -187
  368. package/src/memory/history.ts +0 -152
  369. package/src/memory/ingest.ts +0 -335
  370. package/src/memory/model.ts +0 -183
  371. package/src/memory/normalize.ts +0 -671
  372. package/src/memory/parse.ts +0 -22
  373. package/src/memory/pipeline.ts +0 -275
  374. package/src/memory/prompts.ts +0 -65
  375. package/src/memory/query.ts +0 -334
  376. package/src/memory/reconcile.ts +0 -734
  377. package/src/memory/redirect.ts +0 -108
  378. package/src/memory/reindex.ts +0 -325
  379. package/src/memory/resolve.ts +0 -307
  380. package/src/memory/rest.ts +0 -245
  381. package/src/memory/route.ts +0 -272
  382. package/src/memory/schedule.ts +0 -165
  383. package/src/memory/stages.ts +0 -777
  384. package/src/memory/synthesize.ts +0 -1638
  385. package/src/memory/tools.ts +0 -749
  386. package/src/memory/vault.ts +0 -1194
  387. package/src/memory/wikify.ts +0 -1064
  388. package/src/mlx/array.ts +0 -425
  389. package/src/mlx/autograd.ts +0 -304
  390. package/src/mlx/checkpoint.ts +0 -149
  391. package/src/mlx/compile.ts +0 -168
  392. package/src/mlx/custom-vjp.ts +0 -188
  393. package/src/mlx/ffi.ts +0 -531
  394. package/src/mlx/materialize.ts +0 -23
  395. package/src/mlx/metal-kernel.ts +0 -159
  396. package/src/mlx/normalized-argmax.ts +0 -116
  397. package/src/mlx/ops.ts +0 -1108
  398. package/src/mlx/quantized-rows.ts +0 -36
  399. package/src/mlx/token-bitmask.ts +0 -52
  400. package/src/mlx/turboquant-kv-decode.ts +0 -82
  401. package/src/mlx/turboquant-kv-inverse.ts +0 -122
  402. package/src/mlx/turboquant-ops.ts +0 -861
  403. package/src/mlx/turboquant-tables.ts +0 -237
  404. package/src/mmap.ts +0 -90
  405. package/src/model/artifact-identity.ts +0 -73
  406. package/src/model/batched-kv.ts +0 -235
  407. package/src/model/batched-mask.ts +0 -279
  408. package/src/model/batched-quant.ts +0 -212
  409. package/src/model/batched-quantized-kv.ts +0 -144
  410. package/src/model/batched-rotating-quant.ts +0 -353
  411. package/src/model/batched-rotating-state.ts +0 -149
  412. package/src/model/batched-rotating.ts +0 -338
  413. package/src/model/batched-row-storage.ts +0 -179
  414. package/src/model/batched-ssm.ts +0 -52
  415. package/src/model/batched-turboquant-kv.ts +0 -94
  416. package/src/model/compiled-decode.ts +0 -712
  417. package/src/model/decoded-kv-donor.ts +0 -12
  418. package/src/model/delayed-quantized-kv.ts +0 -72
  419. package/src/model/delayed-rotating-quantized-kv.ts +0 -93
  420. package/src/model/delayed-turboquant-kv.ts +0 -57
  421. package/src/model/diffusion-gemma.ts +0 -1026
  422. package/src/model/factory.ts +0 -215
  423. package/src/model/fingerprint.ts +0 -45
  424. package/src/model/flash-attention.ts +0 -694
  425. package/src/model/full-prefill-padding.ts +0 -56
  426. package/src/model/full-prefill-row.ts +0 -105
  427. package/src/model/gemma4-base.ts +0 -2370
  428. package/src/model/gemma4.ts +0 -1395
  429. package/src/model/generated/gemma4-12b.ts +0 -429
  430. package/src/model/generated/gemma4-26b.ts +0 -448
  431. package/src/model/generated/gemma4-e4b.ts +0 -717
  432. package/src/model/generated/index.ts +0 -18
  433. package/src/model/glm52-atlas.ts +0 -511
  434. package/src/model/glm52-cache.ts +0 -792
  435. package/src/model/glm52-config.ts +0 -262
  436. package/src/model/glm52-container.ts +0 -305
  437. package/src/model/glm52-coupling.ts +0 -388
  438. package/src/model/glm52-dsa.ts +0 -606
  439. package/src/model/glm52-expert-layout.ts +0 -253
  440. package/src/model/glm52-layout.ts +0 -152
  441. package/src/model/glm52-memory.ts +0 -500
  442. package/src/model/glm52-mla.ts +0 -792
  443. package/src/model/glm52-moe.ts +0 -223
  444. package/src/model/glm52-pilot.ts +0 -537
  445. package/src/model/glm52-reference.ts +0 -445
  446. package/src/model/glm52-residency.ts +0 -557
  447. package/src/model/glm52-resident-weights.ts +0 -135
  448. package/src/model/glm52-streamed-experts.ts +0 -453
  449. package/src/model/glm52-streamed-metal.ts +0 -610
  450. package/src/model/glm52-weights.ts +0 -503
  451. package/src/model/glm52.ts +0 -1132
  452. package/src/model/implementation.ts +0 -69
  453. package/src/model/kv-attention-view.ts +0 -70
  454. package/src/model/minicpm5.ts +0 -376
  455. package/src/model/profile.ts +0 -468
  456. package/src/model/quantized-append-attention.ts +0 -31
  457. package/src/model/qwen-append.ts +0 -12
  458. package/src/model/qwen-conv.ts +0 -52
  459. package/src/model/qwen3-delta-state.ts +0 -74
  460. package/src/model/qwen3-delta.ts +0 -451
  461. package/src/model/qwen3-moe.ts +0 -404
  462. package/src/model/qwen3-mrope.ts +0 -250
  463. package/src/model/qwen3.ts +0 -277
  464. package/src/model/qwen3_5-checkpoint.ts +0 -164
  465. package/src/model/qwen3_5.ts +0 -881
  466. package/src/model/rotating-kv-donor.ts +0 -35
  467. package/src/model/rotating-kv-layout.ts +0 -262
  468. package/src/model/rotating-row-transaction.ts +0 -35
  469. package/src/model/speculative-rotating-kv.ts +0 -101
  470. package/src/model/ssm-prefill-padding.ts +0 -39
  471. package/src/model/support.ts +0 -110
  472. package/src/model/token-groups.ts +0 -66
  473. package/src/model/trellis-balanced-scatter.ts +0 -51
  474. package/src/model/trellis-linear.ts +0 -672
  475. package/src/model/trellis-shared-m.ts +0 -151
  476. package/src/model/trellis-shared-scatter.ts +0 -144
  477. package/src/model/trellis-splitk-prefill.ts +0 -158
  478. package/src/model/trellis-tiled-prefill.ts +0 -136
  479. package/src/model/trellis-vector-expand.ts +0 -62
  480. package/src/model/trellis-wide-prefill.ts +0 -94
  481. package/src/model/turboquant-codec.ts +0 -89
  482. package/src/model/universal/archs.ts +0 -332
  483. package/src/model/universal/dense.ts +0 -612
  484. package/src/model/universal/modules.ts +0 -170
  485. package/src/model/universal/rope.ts +0 -381
  486. package/src/model/whisper.ts +0 -435
  487. package/src/native/expert_io.c +0 -523
  488. package/src/native/frame_extract.swift +0 -140
  489. package/src/native/mic_capture.swift +0 -92
  490. package/src/native-pack.ts +0 -163
  491. package/src/pi-provider.ts +0 -53
  492. package/src/pi-session.ts +0 -81
  493. package/src/pi-terminal.ts +0 -274
  494. package/src/pi-web.ts +0 -1940
  495. package/src/preflight.ts +0 -158
  496. package/src/prompt-cache.ts +0 -682
  497. package/src/quantize/allocator.ts +0 -627
  498. package/src/quantize/atomic-output.ts +0 -38
  499. package/src/quantize/calibration.ts +0 -181
  500. package/src/quantize/config-writer.ts +0 -145
  501. package/src/quantize/index.ts +0 -84
  502. package/src/quantize/job.ts +0 -162
  503. package/src/quantize/quantizer.ts +0 -666
  504. package/src/quantize/rotate.ts +0 -603
  505. package/src/quantize/safetensors-writer.ts +0 -249
  506. package/src/quantize/sensitivity.ts +0 -216
  507. package/src/quantize/trellis.ts +0 -586
  508. package/src/quantize/weight-transform.ts +0 -292
  509. package/src/registry.ts +0 -602
  510. package/src/runtime-config.ts +0 -77
  511. package/src/safetensors.ts +0 -165
  512. package/src/sampler.ts +0 -1012
  513. package/src/serve/admin-routes.ts +0 -184
  514. package/src/serve/assets/curve-terrain.html +0 -105
  515. package/src/serve/assets/training-inference-map.html +0 -575
  516. package/src/serve/audio-routes.ts +0 -323
  517. package/src/serve/aux-routes.ts +0 -132
  518. package/src/serve/batch-scheduler.ts +0 -8
  519. package/src/serve/checkpoint-identity.ts +0 -64
  520. package/src/serve/generation-gateway.ts +0 -537
  521. package/src/serve/isolate.ts +0 -609
  522. package/src/serve/kv-budget.ts +0 -14
  523. package/src/serve/lab-routes.ts +0 -341
  524. package/src/serve/lane-registry.ts +0 -45
  525. package/src/serve/model-admin-routes.ts +0 -155
  526. package/src/serve/model-binding.ts +0 -49
  527. package/src/serve/model-host.ts +0 -511
  528. package/src/serve/parent-application.ts +0 -56
  529. package/src/serve/prompt-response-trace.ts +0 -161
  530. package/src/serve/response-lease.ts +0 -24
  531. package/src/serve/session-search.ts +0 -326
  532. package/src/serve/static-routes.ts +0 -101
  533. package/src/serve/transcription-server.ts +0 -64
  534. package/src/serve/transcription-service.ts +0 -502
  535. package/src/server.ts +0 -1282
  536. package/src/spec/assistant-rows.ts +0 -93
  537. package/src/spec/assistant-source.ts +0 -126
  538. package/src/spec/cache-identity.ts +0 -22
  539. package/src/spec/deepspec-rows.ts +0 -29
  540. package/src/spec/deepspec-source.ts +0 -145
  541. package/src/spec/dflash-source.ts +0 -149
  542. package/src/spec/drafter.ts +0 -304
  543. package/src/spec/dspark/ab-stats.ts +0 -136
  544. package/src/spec/dspark/calibration.ts +0 -112
  545. package/src/spec/dspark/data-dflash.ts +0 -156
  546. package/src/spec/dspark/data.ts +0 -201
  547. package/src/spec/dspark/deepspec-module.ts +0 -776
  548. package/src/spec/dspark/generate-dflash.ts +0 -245
  549. package/src/spec/dspark/generate.ts +0 -290
  550. package/src/spec/dspark/loader.ts +0 -23
  551. package/src/spec/dspark/loss.ts +0 -213
  552. package/src/spec/dspark/module-dflash.ts +0 -560
  553. package/src/spec/dspark/module.ts +0 -540
  554. package/src/spec/dspark/quantize-drafter.ts +0 -91
  555. package/src/spec/dspark/sample.ts +0 -112
  556. package/src/spec/generate.ts +0 -276
  557. package/src/spec/glm52-mtp-graph.ts +0 -29
  558. package/src/spec/glm52-mtp-rows.ts +0 -132
  559. package/src/spec/glm52-mtp-source.ts +0 -318
  560. package/src/spec/glm52-mtp-state.ts +0 -33
  561. package/src/spec/ngram-source.ts +0 -226
  562. package/src/spec/projected-draft-rows.ts +0 -73
  563. package/src/spec/qwen-mtp-module.ts +0 -171
  564. package/src/spec/qwen-mtp-rows.ts +0 -230
  565. package/src/spec/qwen-mtp-source.ts +0 -386
  566. package/src/spec/qwen-mtp-state.ts +0 -30
  567. package/src/spec/serve-loop.ts +0 -587
  568. package/src/spec/source.ts +0 -228
  569. package/src/spec/two-model-rows.ts +0 -62
  570. package/src/spec/two-model.ts +0 -113
  571. package/src/ssd-cache.ts +0 -431
  572. package/src/ssd-durability.ts +0 -209
  573. package/src/storage/host-buffer.ts +0 -24
  574. package/src/storage/kv-writer.ts +0 -83
  575. package/src/storage/kv-writer.worker.js +0 -264
  576. package/src/storage/retention-policy.ts +0 -37
  577. package/src/tiered-prompt-cache.ts +0 -45
  578. package/src/tokenizer.ts +0 -335
  579. package/src/tool-approvals.ts +0 -131
  580. package/src/tool-call.ts +0 -695
  581. package/src/train/dataset.ts +0 -484
  582. package/src/train/diffusion-lora.ts +0 -216
  583. package/src/train/export.ts +0 -32
  584. package/src/train/flash-cce.ts +0 -1234
  585. package/src/train/forward.ts +0 -266
  586. package/src/train/fuse.ts +0 -243
  587. package/src/train/index.ts +0 -46
  588. package/src/train/job.ts +0 -205
  589. package/src/train/lora-params.ts +0 -254
  590. package/src/train/loss.ts +0 -1591
  591. package/src/train/merge.ts +0 -195
  592. package/src/train/optimizer.ts +0 -183
  593. package/src/train/prefix-shared.ts +0 -490
  594. package/src/train/rank.ts +0 -137
  595. package/src/train/segmented.ts +0 -1828
  596. package/src/train/steel-qmm-header.ts +0 -1461
  597. package/src/train/trainer.ts +0 -1221
  598. package/src/train/watch.ts +0 -542
  599. package/src/vision/diffusion-vision.ts +0 -620
  600. package/src/vision/embedder.ts +0 -176
  601. package/src/vision/preprocess.ts +0 -247
  602. package/src/vision/prompt.ts +0 -409
  603. package/src/vision/qwen3vl-preprocess.ts +0 -409
  604. package/src/vision/qwen3vl-prompt.ts +0 -233
  605. package/src/vision/qwen3vl-tower.ts +0 -566
  606. package/src/vision/siglip.ts +0 -607
  607. package/src/vision/video-frames.ts +0 -148
  608. package/src/web/app.html +0 -2155
  609. package/src/web/app.js +0 -5863
  610. package/src/web/skills/memory/SKILL.md +0 -120
  611. package/src/web/skills/web-research/SKILL.md +0 -46
  612. package/src/web/skills.ts +0 -97
  613. package/src/web/src/adapters-panel.ts +0 -288
  614. package/src/web/src/assistant.ts +0 -451
  615. package/src/web/src/chat.ts +0 -1060
  616. package/src/web/src/composer.ts +0 -962
  617. package/src/web/src/dataset.ts +0 -132
  618. package/src/web/src/finetune.ts +0 -267
  619. package/src/web/src/hub.ts +0 -428
  620. package/src/web/src/main.ts +0 -98
  621. package/src/web/src/markdown.ts +0 -0
  622. package/src/web/src/memory-panel.ts +0 -572
  623. package/src/web/src/model-picker.ts +0 -159
  624. package/src/web/src/palette.ts +0 -346
  625. package/src/web/src/protocol.ts +0 -26
  626. package/src/web/src/quantize.ts +0 -167
  627. package/src/web/src/rag.ts +0 -274
  628. package/src/web/src/sessions.ts +0 -469
  629. package/src/web/src/shell.ts +0 -804
  630. package/src/web/src/ui-catalog.ts +0 -78
  631. package/src/web/src/voice.ts +0 -141
  632. package/src/web/vendor/README.md +0 -61
  633. package/src/web-assets.ts +0 -47
  634. package/src/web-tools.ts +0 -478
  635. package/src/weights.ts +0 -255
  636. /package/src/{serve → server}/completion-sink.ts +0 -0
  637. /package/src/{serve → server}/generated-token-history.ts +0 -0
  638. /package/src/web/{icon.svg → public/icon.svg} +0 -0
  639. /package/src/web/{manifest.webmanifest → public/manifest.webmanifest} +0 -0
  640. /package/src/web/{vendor → public/vendor}/hljs-LICENSE +0 -0
@@ -1,126 +0,0 @@
1
- # ORPO-on-UF — results + testing-phase handoff
2
-
3
- **Status:** training done (2026-06-20); **testing phase = next.** This doc is the
4
- "where we are + what to run" so anyone (or a fresh session) can execute the measurements.
5
- Companion: [trainer-validation-experiment.md](trainer-validation-experiment.md) (the
6
- validation that got us here).
7
-
8
- ## The run that just finished
9
-
10
- From-**base** ORPO on UltraFeedback, MiniCPM5-1B.
11
- - **Base:** `mlx-community/MiniCPM5-1B-OptiQ-4bit` (the full post-trained model; optiq quant).
12
- - **Data:** `~/.cache/mlx-bun/eval-data/uf-cpm5` — 14,691 train / 148 val, `{prompt,chosen,rejected}`.
13
- - **Config:** ORPO, **1 epoch (14,691 iters)**, B=1, seq 2048, rank 16, **λ=0.1**, cosine LR
14
- 1e-5, **no-segment**. From base (no warm-start).
15
- - **Command:** `SEQ=2048 EVAL_EVERY=500 RANK=16 SCHED=cosine LAMBDA=0.1
16
- ADAPTER_DIR=./adapters/cpm5-uf-frombase bun scripts/experiments/pref-control.ts orpo
17
- ~/.cache/mlx-bun/eval-data/uf-cpm5 uf-frombase 14691 1e-5`
18
-
19
- ## Key result — the two ORPO halves decoupled
20
-
21
- | half | metric | best | at step | final (14690) |
22
- |---|---|---|---|---|
23
- | **SFT** | loss (NLL+λOR) ↓ | **1.5057** | **14500** (the end) | 1.506 |
24
- | **DPO** | margin ↑ | **0.143** | **6000** | 0.127 |
25
- | — | accuracy | **81/148** | ~5500 | 80/148 |
26
-
27
- - **SFT improved across the *whole* run** (loss bottomed at the end) → **final adapter = best SFT.**
28
- - **DPO peaked at ~6000 and faded** → **step ~6000 = best DPO**, slightly worse SFT (loss 1.5077).
29
- - **No single checkpoint has both.** Honest summary: a **small, early-peaking preference
30
- signal** (~+6 questions, chance 74 → peak 81/148) that **drifted down in the tail**, while
31
- SFT kept inching to its ~1.506 floor. Whether even that small lift **converts** on an
32
- independent test is the open question the testing phase answers.
33
-
34
- ## Artifacts + baselines
35
-
36
- - **Final adapter:** `./adapters/cpm5-uf-frombase/` (mountable: `eval.ts --adapter`).
37
- - **Trajectory:** `runs/uf-frombase.{json,csv}`; **plot:** `runs/uf-frombase.png` via
38
- `scripts/experiments/plot-runs.py` (panels: loss=val+train-EMA; questions-correct/148;
39
- margin — each zoomed to its band).
40
- - **x1 baseline** (base CPM5, full capability suite): **28.69** (in the eval DB; needs the
41
- MMLU-argmax + HumanEval-python fixes — see Gotchas). optiq published is 30.28.
42
- - **⚠ No intermediate checkpoints this run** — `pref-control.ts` lacked `saveCheckpoints`
43
- (now **fixed**; future runs checkpoint every val eval + track best-margin). The ~6k peak
44
- is recoverable by **deterministic replay** (same seed/order → same adapter).
45
-
46
- ## Testing plan
47
-
48
- **PRIMARY — the headline (READY TO RUN):**
49
- - **A. final adapter vs base** on x2 (capability) + Exp 2 (judge win-rate). Answers "did a
50
- full epoch of ORPO-on-UF move a 1B, on an *independent* test?"
51
-
52
- **SWEEP / SYNTHESIS:**
53
- - **B. recover the ~6k peak** — re-run from base to ~7k (checkpoints now on), grab the
54
- step-6000 (and neighbors, pick best-val). The early-stop peak arm.
55
- - **C. four-way** — base / 6k-peak / final / final+6k on x2 + Exp 2 → traces the
56
- early-stopping curve on an independent test.
57
- - **D. DPO-boost (the day's synthesis) — keep best SFT, re-pressure the DPO.** Warm-start
58
- from the **final** adapter (best SFT, NLL at floor), re-apply the **DPO-helpful examples
59
- with HIGH λ** (or DPO-only). = dynamic-λ (ramp preference at SFT-saturation) + data-curation
60
- in one move. Tests the fork: DPO stalled because of a **capacity ceiling** (won't help) or
61
- **dilution / λ-too-gentle** (margin recovers past 0.143 while loss holds ~1.506 → better on
62
- *both* axes than any single checkpoint).
63
- - **E. data-valuation control** — `final + (0–6000)` vs `final + (6000–14691)`, same size.
64
- First-half wins → those examples carry the DPO signal; tie → it's "more preference training,"
65
- not *which* examples. (We control which pairs go in, so this generalizes to **curating** the
66
- data with the model as the probe.)
67
-
68
- ## Commands
69
-
70
- `ORC=/Users/joshrossi/Code/mlx-lm-example/.venv/bin/python` (HumanEval interpreter, this machine).
71
-
72
- ```bash
73
- # A — x2 capability (final vs base; base x1=28.69 already recorded)
74
- MLX_BUN_ORACLE_PYTHON=$ORC bun scripts/eval.ts capability --candidate MiniCPM5 --adapter ./adapters/cpm5-uf-frombase
75
- # A — Exp 2 (gen base+trained responses, then judge head-to-head)
76
- bun scripts/experiments/prefbench.ts gen mtbench ./adapters/cpm5-uf-frombase mtbench-uf # GPU
77
- bun scripts/experiments/prefbench.ts judge mtbench-uf # codex
78
- # B — replay base→7k to recover the ~6k checkpoint (now checkpoints)
79
- SEQ=2048 EVAL_EVERY=500 RANK=16 SCHED=cosine LAMBDA=0.1 ADAPTER_DIR=./adapters/cpm5-uf-replay \
80
- bun scripts/experiments/pref-control.ts orpo ~/.cache/mlx-bun/eval-data/uf-cpm5 uf-replay 7000 1e-5
81
- ```
82
-
83
- ## Harness gaps to close for D / E
84
-
85
- `pref-control.ts` does **not yet** support (needed for the DPO-boost + control arms):
86
- 1. **Warm-start from an adapter** (`--resume` / load a non-zero adapter before training) —
87
- the trainer has `warm_start_adapter` (see `trainer.ts`); just not wired into pref-control.
88
- 2. **Data-subset selection** (feed a chosen subset / order of pairs, e.g. rows 0–6000) —
89
- pref-control feeds the whole `train.jsonl`; needs a row-range / id-list option.
90
- 3. λ is already env-controllable (`LAMBDA=`), so high-λ is ready once 1+2 exist.
91
-
92
- ## Validated infrastructure (all green — see trainer-validation-experiment.md)
93
-
94
- - **Trainer:** positive controls pass — DPO & ORPO drive prefer-uppercase val acc → 1.0;
95
- grads match autograd. `scripts/experiments/pref-control.ts`.
96
- - **Capability harness:** reproduces optiq across 6 tasks after two fixes (below).
97
- `eval.ts capability --adapter` wired.
98
- - **Judge:** `gpt-5.4-mini` via `codex exec`, **keyless**, structured, order-swapped,
99
- 3/3 positive control. `scripts/experiments/llm-judge.ts`.
100
- - **Exp 2 harness:** `scripts/experiments/prefbench.ts` (gen/judge); prompts downloaded
101
- (`mt_bench.jsonl` 80, `alpaca_eval.json` 805).
102
- - **MMLU frozen set:** optiq's exact 969 questions + dev exemplars captured
103
- (`mmlu_optiq_frozen.jsonl` / `mmlu_optiq_dev.jsonl`) for parity work.
104
-
105
- ## Gotchas / load-bearing facts
106
-
107
- - **`AdapterManager.mount` affects the *serving* forward** (eval generation, chat) **but NOT
108
- the *training* `branchLogpMean`.** Measure training metrics via the trainLora emit, not mount.
109
- - **Eval env:** `MLX_BUN_ORACLE_PYTHON=$ORC` (HumanEval code-exec — wrong default path on this
110
- machine); evals default to **non-thinking** (optiq parity; `MLX_BUN_EVAL_THINK=1` to re-enable).
111
- - **MMLU parity:** our number (47.7 old / ~50 argmax) vs optiq 52.4 is **sampling + forward
112
- parity**, not noise (both deterministic argmax). Use the frozen set; remaining gap = our
113
- forward vs `mlx_lm` (logit-diff test on the frozen prompts — **queued, GPU**).
114
- - **Determinism:** same seed/order → same adapter. Replay recovers any checkpoint.
115
- - **Server adapter API** (`POST /v1/adapters` + per-request `"adapter":"id"`) is the clean way
116
- to compare *many* adapters via chat; **raw eval (`--adapter`) is required for capability**
117
- (MMLU is logit-argmax, not chat generation).
118
-
119
- ## Recommended order
120
-
121
- 1. **A** (final vs base) — the headline, READY. Run x2, then Exp 2.
122
- 2. **B** — replay to recover the 6k peak (cheap, ~45 min).
123
- 3. **C** — eval base/6k/final on the suite (four-way needs D for the +6k arm).
124
- 4. Close the **pref-control harness gaps** (warm-start + subset), then **D** (DPO-boost) and
125
- **E** (data-valuation control) — the synthesis experiments.
126
- 5. (Parallel/queued) **MMLU forward-parity** logit-diff to nail x1 ≈ 30.28.
@@ -1,92 +0,0 @@
1
- # Pareto-specialized runtime findings
2
-
3
- ## Question
4
-
5
- Which parts of mlx-bun should converge on shared infrastructure, and which parts should remain deliberately specialized so cleanup does not turn the runtime into a lowest-common-denominator model host?
6
-
7
- This note compares three mature specialization clusters: the Colibri/GLM-5.2 runtime, the Qwen3.8 27B TurboQuant and MTP work, and ORPO training. The evidence says the same thing in all three places: share lifecycle and composition policy, but keep artifact layout and numerical work close to the model or method that owns them.
8
-
9
- ## Shared control-plane infrastructure
10
-
11
- The shared layer decides what runs, owns resources, and records what happened. It does not rewrite the selected computation.
12
-
13
- - **Model construction.** `openModel()` recognizes the direct Colibri artifact before ordinary safetensors loading. `createModel()` prefers dedicated and fingerprint-generated model classes before the universal fallback, and explicitly says the generic path must not shadow a dedicated port. This is shared dispatch with specialized implementations, not one universal graph. [Factory dispatch](../../../src/model/factory.ts#L30-L150)
14
- - **Concurrency and request composition.** The target is one concurrency-driven engine. One active request uses the B=1 pipelined or compiled fast path; concurrent requests use the general step up to `--batch N`. B=1 is an internal specialization, not a permanent public lane. Features are stackable layers, and scheduling must not replace the selected KV scheme, adapter, draft method, grammar, or sampler. [Unified engine decision](../../design/unified-engine-frontier-plan.md#L333-L403) [Composition matrix](../../design/unified-engine-frontier-plan.md#L405-L424)
15
- - **Cache lifecycle and capability.** `Cache` owns update, masks, state, rollback, accounting, and disposal. `BatchableCache` adds row merge, extraction, filtering, and byte projection. The scheduler can depend on those capabilities without knowing whether a row contains ordinary KV, recurrent state, TurboQuant tensors, or compressed GLM state. [Cache interface](../../../src/model/gemma4-base.ts#L264-L303) [Batchable cache interface](../../../src/model/gemma4-base.ts#L347-L357)
16
- - **Resolved KV policy.** `KvScheme` preserves bf16, uniform affine, per-layer affine, and TurboQuant as distinct immutable schemes. It centralizes names, accounting, and current batch capability checks without pretending the schemes have identical storage or kernels. [KV scheme](../../../src/kv-scheme.ts#L84-L169)
17
- - **Draft lifecycle.** `DraftProvider` owns server-lifetime machinery and opens a request-scoped `DraftSource`. The source interface carries prompt mode, target taps, draft, commit, rollback-related cache state, and disposal. Assistant, DSpark, Qwen MTP, and native GLM MTP can share speculative orchestration while retaining different state transitions. [Draft source](../../../src/spec/source.ts#L31-L101) [Draft provider](../../../src/spec/source.ts#L103-L118)
18
- - **Expert residency policy.** The budget equation, stable expert union, lease state, backend contract, telemetry, and pressure correction are reusable. GLM supplies artifact geometry and byte segments to that policy. [Residency planning and union](../../../src/expert-residency.ts#L17-L155) [Residency backend](../../../src/expert-residency.ts#L157-L170)
19
- - **Offline transform orchestration.** `WeightTransform` separates name/config planning from lazy tensor application. Llama, the Qwen3.5 trunk, and Qwen MTP are real adapters over the same conversion seam. [Weight transform interface](../../../src/quantize/weight-transform.ts#L40-L51) [Qwen transform adapters](../../../src/quantize/weight-transform.ts#L244-L268)
20
- - **Training orchestration.** `TrainConfig` names independent techniques such as segmented backward, fused or flash CCE, prefix sharing, regularization, and ORPO semantics. `orpoLoop()` composes the selected techniques and chooses the model-specific backward implementation. [Training configuration](../../../src/train/trainer.ts#L42-L150) [ORPO composition](../../../src/train/trainer.ts#L821-L948)
21
-
22
- ## Deliberately specialized data-plane code
23
-
24
- ### Colibri and GLM-5.2
25
-
26
- GLM-5.2 is not a descriptor-table variation of a dense transformer. Its graph has MLA, DSA, shared plus routed MoE, native MTP, and compressed cache state. Its public artifact also has a dedicated container and streamed expert layout. The design therefore calls for a dedicated `Glm52Model`, direct artifact support, and a one-read routed-expert kernel rather than repacking into generic projection-major tensors. [Dedicated graph and artifact contract](../../design/colibri-glm52-port.md#L323-L357)
27
-
28
- The memory contract is also model and artifact specific. A header-only preflight reads the container, derives expert slot layouts, counts DSA and MTP state, and refuses startup when the exact resident weights, expert slabs, compressed KV, verification transients, allocator reserve, Bun reserve, and safety margin exceed the process limit. [GLM geometry and preflight](../../../src/model/glm52-memory.ts#L340-L500) The runtime then maps Colibri segments into generic residency leases, but retains GLM-specific slot layouts, MTP slabs, signed-int8 requirements, and routed-SwiGLU executors. [GLM residency binding](../../../src/model/glm52-residency.ts#L138-L230) [GLM executor construction](../../../src/model/glm52-residency.ts#L300-L459)
29
-
30
- That split is intentional. Bun owns residency policy and observability; the native helper owns aligned slabs, `pread`, wiring, and completion fences; the GLM model owns tensor semantics and kernels. [Ownership map](../../design/colibri-glm52-port.md#L580-L600)
31
-
32
- ### Qwen3.8 27B, TurboQuant, and MTP
33
-
34
- Qwen3.5/3.8 keeps a dedicated graph because gated DeltaNet recurrence, full attention, MRoPE, output gates, and recurrent speculative rollback are numerical behavior, not configuration decoration. [Qwen graph](../../../src/model/qwen3_5.ts#L128-L322) [Qwen model interface](../../../src/model/qwen3_5.ts#L512-L673)
35
-
36
- Qwen MTP preserves its own artifact and state machine behind `DraftProvider` and `DraftSource`. The provider rejects a non-Qwen target or a hidden-size mismatch. The request source uses tapped pre-final-norm target state, maintains its own KV, samples through the target sampler, and rebuilds accepted rows from verified target hiddens. Those rules must not move into generic speculative orchestration. [Qwen MTP provider](../../../src/spec/qwen-mtp-source.ts#L193-L235) [Qwen MTP state machine](../../../src/spec/qwen-mtp-source.ts#L237-L430)
37
-
38
- TurboQuant KV demonstrates the right form of specialization. `TurboQuantKVCache` implements the shared `Cache` lifecycle, while keeping packed indices, scales, zero points, FWHT-domain values, supported head dimensions, and conversion rules inside the class. [TurboQuant cache](../../../src/model/gemma4-base.ts#L1539-L1800) The weight pipeline follows the same rule. `WeightTransform` is shared, but the Qwen corridor map preserves the output gate, recurrent internals, vision-to-residual seam, untied 27B head, and companion MTP basis. [Qwen transform seam](../../design/turboquant-weights.md#L80-L87) [Qwen corridor map](../../design/turboquant-weights.md#L125-L174)
39
-
40
- ### ORPO training
41
-
42
- ORPO benefits from composition, not one generic backward. The trainer combines prefix sharing, segmented recomputation, fused or flash CCE, LoRA regularization, and objective semantics. The data plane remains specialized where the model topology demands it. Gemma4 segmented ORPO threads per-layer inputs and cross-segment donor KV cotangents; MiniCPM5 uses a simpler segment graph. [Composed ORPO paths](../../design/orpo-training.md#L178-L218) [Gemma4 segmented backward](../../../src/train/segmented.ts#L1137-L1471)
43
-
44
- Flash CCE is a shared quantized-head interface with specialized Metal kernels and explicit shape guards. Its implementation selects Steel, simdgroup, or scalar kernels from actual hidden, vocabulary, group, and tile geometry, and exposes exact-gradient escape hatches. Flattening this into a generic matrix-loss helper would lose the memory and watchdog constraints that justify it. [Flash CCE head](../../../src/train/flash-cce.ts#L42-L64) [Forward dispatch](../../../src/train/flash-cce.ts#L1033-L1132) [Backward dispatch](../../../src/train/flash-cce.ts#L1134-L1234)
45
-
46
- Dynamic lambda is not implemented. Its design belongs in the ORPO control plane: validation metrics update a live lambda source in `orpoLoop()`, while every monolithic and segmented loss reads the same value. It should not create another family of backward classes. [Dynamic-lambda status and signals](../../design/orpo-dynamic-lambda.md#L1-L27) [Proposed wiring](../../design/orpo-dynamic-lambda.md#L163-L180)
47
-
48
- ## Interfaces that already preserve specialization
49
-
50
- | Interface | Shared invariant | Specialization retained behind it |
51
- |---|---|---|
52
- | `RuntimeModel` plus factory dispatch | Construction and serving can hold one model type | Dedicated GLM, Qwen, Gemma, diffusion, MoE, and generated graphs |
53
- | `Cache` / `BatchableCache` | Lifecycle, rollback, row operations, byte projection | Plain, rotating, quantized, TurboQuant, SSM, MLA, and DSA storage |
54
- | `KvScheme` | One resolved KV choice and stable identity | Per-scheme accounting, conversion, persistence, and kernels |
55
- | `DraftProvider` / `DraftSource` | Request lifecycle, target taps, draft and commit | Assistant, DSpark, Qwen MTP, and GLM MTP state machines |
56
- | `ExpertResidencyBackend` | Lease and I/O lifecycle | Colibri container offsets, slot packing, expert kernels, and prediction policy inputs |
57
- | `WeightTransform` | Plan first, apply lazily, record identity | Family-specific exact fold corridors and companion artifacts |
58
- | ORPO trainer configuration | One run composes selected techniques | Model-specific masks, donor topology, VJPs, and Metal kernels |
59
-
60
- ## Declared profile seam (S2, 2026-08-21)
61
-
62
- Model construction now resolves one `ResolvedModelProfile` before opening
63
- weights. An exact artifact declaration binds an immutable external fingerprint,
64
- config fingerprint, fidelity contract, required engine capabilities, and a
65
- loader/graph/loop composition. Exact Qwen3.8 OptiQ and GLM-5.2 Colibri revisions
66
- are pinned; other supported artifacts retain dedicated family resolution and
67
- then the universal dense fallback.
68
-
69
- The factory consumes the resolved composition, and the serving context retains
70
- it for library callers. A matched exact declaration with a config or capability
71
- mismatch refuses rather than taking another route. The profile seam does not
72
- own request methods: MTP, KV schemes, adapters, grammar, and sampling remain
73
- independently resolved inputs to completion execution. This keeps the control
74
- plane declarative without turning a model profile into a feature preset.
75
-
76
- These interfaces preserve specialization because they describe lifecycle or capability, not tensor algebra. They also have multiple real implementations. That is the useful test for whether an abstraction belongs.
77
-
78
- ## Rules for steady-state cleanup
79
-
80
- 1. **Unify control, not math.** Centralize admission, concurrency, cancellation, ownership, accounting, persistence, telemetry, and technique composition. Keep tensor layout, recurrence, cache encoding, model topology, and kernel selection with their owning model, artifact, or method.
81
- 2. **Keep one concurrency-driven engine.** B=1 and B>1 are internal step specializations in one engine. `--batch N` is a concurrency cap. Observed placement may be reported, but serial versus batch must not become a permanent public mode or feature-selection interface. Current feature-specific serial routing is capability debt.
82
- 3. **Never weaken a resolved composition to fit a path.** If batching lacks TurboQuant, MTP, adapters, grammar, or another selected method, close that capability gap or reject the unsupported composition. Do not silently substitute bf16 KV, disable drafting, or change sampling.
83
- 4. **Prefer capability interfaces over family checks.** Scheduling should ask caches whether they can merge or project bytes and draft sources what target state they require. Factory dispatch is the proper place for model identity checks.
84
- 5. **Let dedicated ports outrank generic fallbacks.** The universal model path is valuable for ordinary architectures. It must not absorb GLM MLA/DSA, Qwen recurrence, artifact-specific MTP, or another optimized graph merely to reduce class count.
85
- 6. **Treat artifacts as executable contracts.** Validate manifests, tensor families, layouts, quantization metadata, companion seeds, and memory equations before allocation. Keep artifact-specific loaders and transforms when repacking would add copies, lose reproducibility, or change arithmetic.
86
- 7. **Generalize only after the invariant is visible in two implementations.** Extract lifecycle and capability seams such as `DraftSource` or `WeightTransform`. Do not extract a common tensor algorithm from code that only looks similar but has different masks, state, accumulation order, or oracle.
87
- 8. **Compose optimizations at the orchestrator, then test the cross-product.** ORPO proves that prefix sharing, flash CCE, segmented backward, and regularization can stack while model-specific backward code remains intact. Serving needs the same discipline for model graph, KV scheme, MTP, adapters, grammar, sampling, and concurrency.
88
- 9. **Bind every specialized path to its own oracle and measured purpose.** A specialized module earns its place through parity, memory, quality, or throughput gates on the artifact and hardware it targets. If the benefit disappears, delete the specialization instead of preserving it as architecture folklore.
89
-
90
- ## Strongest conclusion
91
-
92
- The steady state is not a generic engine with scattered exceptions. It is a shared control plane that carries authoritative compositions through one concurrency-driven engine, plus specialized data planes selected by model, artifact, and numerical method. That structure preserves the project's Pareto advantage: common serving and training behavior where sameness is real, and unapologetically specific code where the result depends on it.
@@ -1,308 +0,0 @@
1
- # Investigation: pi as a "built-in" terminal for mlx-bun
2
-
3
- *2026-06-12. Question (PRODUCT_ROADMAP "Harness UX" / PLAN direction A):
4
- can `mlx-bun pi` drop the user into a working pi agent session against
5
- the locally running model — and what's the best mechanism? Sources:
6
- https://pi.dev/docs/latest (sdk, tui, rpc, custom-provider pages) plus
7
- direct inspection of the installed packages
8
- (`~/.bun/install/global/node_modules/@earendil-works/*`, v0.79.1).*
9
-
10
- > **Outcome (2026-06-14, what actually shipped).** This investigation
11
- > proposed shipping the subprocess launcher first and promoting to an
12
- > embedded flagship later. We went straight to the embedded design and
13
- > then **dropped the subprocess path entirely** (Option 2 + the
14
- > `--external-pi` fallback in P4): `mlx-bun pi` runs pi's own
15
- > `InteractiveMode` **in-process** (src/pi-terminal.ts) with a custom
16
- > mlx-bun coding-agent prompt, full coding tools + web tools, and pi's
17
- > native approval prompts — nothing to install. A user who already runs
18
- > pi connects it to the local model with **`mlx-bun harness pi`**
19
- > (Option 1, src/harness-pi.ts) — that's the only "their pi" path, since
20
- > launching a pi they already have was pure duplication. The web-chat
21
- > half (Option 4) ships via src/pi-web.ts. The analysis below is the
22
- > point-in-time reasoning that led here.
23
-
24
- ## TL;DR
25
-
26
- **Yes, and better than hoped.** pi is not just embeddable — it is a
27
- Bun-native, MIT-licensed npm package whose own release binary is built
28
- with `bun build --compile`, the exact toolchain mlx-bun's Phase 5
29
- single-binary bundle already uses. The full interactive TUI (editor,
30
- chat history, all built-in commands) is an exported SDK class
31
- (`InteractiveMode`), not CLI-only internals. Four integration options
32
- exist, they are not mutually exclusive, and the recommended path is:
33
- ship the cheap subprocess launcher now, promote to a true in-binary
34
- embed as the flagship. pi's RPC mode separately gives us the protocol
35
- for the built-in web chat UI, so this investigation pays for direction
36
- A's part 1 as well.
37
-
38
- ## What pi is, technically
39
-
40
- - Four MIT-licensed packages, all v0.79.1, all from
41
- `github.com/earendil-works/pi`:
42
- `pi-coding-agent` (13 MB, the agent + CLI + SDK), `pi-ai` (4.9 MB,
43
- provider/streaming layer), `pi-agent-core` (1.3 MB), `pi-tui`
44
- (1.9 MB, differential-rendering TUI lib). ~21 MB total on disk
45
- before tree-shaking — negligible next to model weights, modest next
46
- to mlx-bun's current binary.
47
- - **Bun-compile native**: `pi-coding-agent`'s `build:binary` script is
48
- literally `bun build --compile ./dist/bun/cli.js ...` — upstream
49
- ships a Bun single-file executable themselves. Embedding it in our
50
- Bun bundle is a supported configuration, not an experiment.
51
- - Engines: node ≥ 22.19 (pi-tui uses `/v`-flag regexes — fails under
52
- node 18, fine under Bun ≥ 1.3.x, which mlx-bun already pins).
53
- - Assets that must ride along in a binary (upstream's
54
- `copy-binary-assets` is the manifest): theme JSONs, a few PNGs,
55
- export-html templates, `photon_rs_bg.wasm` (image ops), and pi-tui's
56
- prebuilt `.node` natives (`darwin-arm64`/`darwin-x64` ship in the
57
- package).
58
- - Local-model support is **already proven on this machine**:
59
- `~/.pi/agent/models.json` has an `mlx` provider
60
- (`api: "openai-completions"`, baseUrl + `sk-optiq-` key, compat
61
- flags) serving Qwen quants. mlx-bun's OpenAI surface is what pi
62
- expects.
63
-
64
- ## The four integration options
65
-
66
- ### Option 1 — `mlx-bun harness pi`: configure the user's existing pi
67
-
68
- Write/merge the provider entry into `~/.pi/agent/models.json` (or drop
69
- a tiny extension that calls `pi.registerProvider(...)` — the
70
- documented programmatic route, which can even discover models
71
- dynamically from our `/v1/models`). Validate with one tiny request,
72
- print the launch command.
73
-
74
- - **Effort**: hours. **Risk**: low (must merge, not clobber, user
75
- config — the docs' extension route avoids touching models.json at
76
- all). **Verdict**: do regardless; this is the harness-adapter
77
- pattern from the roadmap and it's nearly free.
78
-
79
- **Pros**: nearly free; respects the user's pi setup, sessions, themes,
80
- extensions; zero version coupling; the dynamic-discovery extension
81
- keeps the model list in sync with our server automatically.
82
- **Cons**: requires pi to already be installed; not "built-in" — the
83
- appliance story still has two moving parts; config-merge bugs are the
84
- classic way to annoy users (the extension route mostly avoids this).
85
-
86
- ### Option 2 — `mlx-bun pi` (v1): spawn the user's installed pi
87
-
88
- Start our server, then spawn `pi` with a session-scoped provider
89
- config (extension dir or env) pointing at it. If pi isn't installed,
90
- print the install one-liner.
91
-
92
- - **Effort**: a day with polish. **Risk**: version skew with whatever
93
- pi the user has; not "built-in" — two installs.
94
- - **Verdict**: the right v1. Real UX win immediately, zero coupling.
95
- - **Bonus**: unrecognized flags pass straight through, so
96
- `mlx-bun pi -p "summarize @notes.md"` (pi's non-interactive print
97
- mode), `--mode json/rpc`, `--continue`, `--resume` etc. all work on
98
- day one without us implementing anything.
99
-
100
- **Pros**: fast to ship; full pi feature surface via passthrough;
101
- upgrades to pi arrive for free; failure modes are simple (no pi →
102
- print install hint). **Cons**: still two installs; we can't control
103
- the pi version (an upstream flag/behavior change can break our
104
- launcher); per-run provider injection needs care so we don't pollute
105
- the user's global config; process lifecycle (server + child TUI)
106
- needs clean shutdown handling.
107
-
108
- ### Option 3 — SDK embed (the real "built-in"): pi inside the mlx-bun binary
109
-
110
- This is the one the question was really about, and the SDK is
111
- explicitly designed for it:
112
-
113
- - `createAgentSession({...})` builds a session; the
114
- `examples/sdk/12-full-control.ts` example shows **zero-discovery**
115
- embedding: in-memory `SessionManager`/`SettingsManager`/
116
- `ModelRegistry`, custom `ResourceLoader`, explicit tool list,
117
- runtime API keys — nothing leaks from/to `~/.pi` unless we want it
118
- to.
119
- - `InteractiveMode` is exported: "full TUI interactive mode with
120
- editor, chat history, and all built-in commands", constructed from
121
- an `AgentSessionRuntime`. We do not rebuild a chat TUI from pi-tui
122
- primitives (the tui docs are explicit that components are for
123
- extensions, not a full-app kit) — we run *pi's own* TUI in-process.
124
- - Provider wiring: register an `openai-completions` provider at our
125
- own server's baseUrl (loopback HTTP into our already-running
126
- `Bun.serve` — simplest and keeps one code path for external
127
- clients), models listed from our registry with real context-window
128
- numbers per device profile.
129
- - Flow for `mlx-bun pi`: detect profile → ensure model → start server
130
- in-process → `createAgentSession` against `localhost` →
131
- `new InteractiveMode(runtime).run()`.
132
-
133
- Open engineering questions (all look tractable, none look fatal):
134
-
135
- 1. **One process, two workloads**: the TUI event loop and the
136
- server/generation queue share the JS thread; mlx compute happens in
137
- native code but graph-build is JS-side (~ms-scale per decode step).
138
- TUI rendering is differential and cheap; needs a smoke test for
139
- input latency during decode, not a redesign.
140
- 2. **Bundle plumbing**: embed pi's asset list + pi-tui `.node`
141
- prebuilds + photon wasm into the Phase 5 compile. Upstream's own
142
- binary build proves each piece works under `bun build --compile`;
143
- our work is making *their* asset-path resolution find files inside
144
- *our* bundle.
145
- 3. **Version pinning**: pi moves fast (0.79.x); pin exact, upgrade
146
- deliberately, keep Option 2 as the fallback path when upstream
147
- breaks SDK surface.
148
- 4. **Identity**: embedded pi should read/write its own session dir
149
- (`~/.mlx-bun/pi-sessions` or similar) and not fight a user's
150
- standalone pi install. The full-control example shows every knob
151
- needed (`agentDir`, custom storage paths).
152
-
153
- - **Effort**: ~1–2 weeks including bundle work and latency testing.
154
- - **Verdict**: feasible and high-value; this is the appliance moment —
155
- one binary, one command, a real agent on a local model. `-p` and
156
- `--mode rpc/json` remain supported natively: `runPrintMode` and
157
- `runRpcMode` are SDK exports, so the embedded CLI keeps pi's
158
- headless modes.
159
-
160
- **Pros**: the true appliance — one binary, no prior installs; we pin
161
- and test the exact pi version we ship; full control of defaults
162
- (session dir, tools, system prompt, model list per device profile);
163
- in-process events shared with the web UI; offline-clean.
164
- **Cons**: most engineering (asset bundling, latency validation); we
165
- own the upgrade treadmill for a fast-moving 0.x dependency; embedded
166
- pi diverges from the user's own pi config/extensions unless we
167
- deliberately opt into discovery; binary grows ~20 MB.
168
-
169
- ### Option 4 — RPC / JSON event-stream mode (not for the terminal — for the web UI)
170
-
171
- `pi --mode rpc` speaks JSONL over stdin/stdout: `prompt`, `steer`,
172
- `abort`, model control, state/stats queries, plus a streamed event
173
- model (`message_update` deltas, `tool_execution_*`, `turn_*`) and even
174
- an extension-UI sub-protocol. The docs name "custom frontends (web
175
- dashboards…)" as a primary use case.
176
-
177
- - **Verdict**: wrong tool for `mlx-bun pi` (we'd be rebuilding pi's
178
- TUI on top of pi), but the **right backbone for the built-in web
179
- chat UI**: `mlx-bun` serves a page; the server bridges
180
- WebSocket ↔ RPC events (or drives `AgentSession.subscribe()`
181
- in-process — same event shapes, no subprocess). Tool calls,
182
- steering, and progress come for free instead of us re-implementing
183
- an agent loop in the browser.
184
-
185
- **Pros**: documented, versioned JSONL protocol; UI-agnostic (web,
186
- IDE, bots); steering/abort/stats built in; works with either the
187
- subprocess or the embedded session as the engine. **Cons**: not a
188
- terminal UX at all; strict framing rules to honor; the extension-UI
189
- sub-protocol must be bridged if extensions prompt the user.
190
-
191
- ## Does this make sense as a feature?
192
-
193
- Yes — it is arguably the highest-leverage product move available:
194
-
195
- - It converts mlx-bun from "a server you point things at" into a
196
- complete local-AI appliance, which is the PRODUCT_ROADMAP north
197
- star verbatim.
198
- - The marginal cost is small because the hard parts are already done
199
- on both sides: our OpenAI surface is SDK-verified, pi's SDK is
200
- designed for embedding, and both projects compile with the same Bun
201
- toolchain. MIT licensing removes the bundling question.
202
- - One investigation, both deliverables: the same `AgentSession` event
203
- stream powers the embedded TUI *and* the web chat UI, so direction
204
- A's two halves share a core.
205
- - Caveats worth stating: we take on pi's release cadence as a
206
- dependency; the agent quality ceiling is the local model's (12B
207
- OptiQ tool-calling is decent but this becomes the showcase — the
208
- Lucien-direction evals would tell us exactly how good); and the
209
- embedded TUI must not degrade decode throughput (measure, per house
210
- rules).
211
-
212
- ## Implementation plan
213
-
214
- To be explicit about the recommendation: **the locally installed pi is
215
- the v1 stepping stone, not the destination.** Users who have their own
216
- pi always get first-class support (P1); the flagship `mlx-bun pi` ends
217
- as the embedded, single-binary experience (P3/P4).
218
-
219
- ### P1 — `mlx-bun harness pi` (hours–1 day)
220
-
221
- 1. Detect pi (`which pi`, `~/.bun/bin/pi`, npm global); report version.
222
- 2. Generate an extension file (e.g. `~/.pi/agent/extensions/mlx-bun.ts`)
223
- that calls `pi.registerProvider("mlx-bun", ...)` with **dynamic
224
- discovery**: fetch our `/v1/models` at pi startup so the model list
225
- tracks the server. No models.json surgery; trivially reversible
226
- (delete one file).
227
- 3. Validate: tiny completion against the running server through pi's
228
- provider path; print `pi --provider mlx-bun` launch hint.
229
- 4. Failure modes: pi missing → print install one-liner; server down →
230
- offer to start it.
231
-
232
- ### P2 — `mlx-bun pi` v1: subprocess launcher (~1–2 days)
233
-
234
- 1. Ensure server: reuse a running instance if healthy, else start
235
- in-process and wait for readiness.
236
- 2. Resolve the pi binary; if absent, offer the installer.
237
- 3. Spawn pi with stdio inherited and a **session-scoped provider**: a
238
- generated `-e <tmp-extension>.ts` registering the provider for this
239
- run only (no global config writes), plus
240
- `--provider mlx-bun --model <profile default>`.
241
- 4. **Pass through all remaining argv** — this is where `mlx-bun pi -p
242
- "..."`, `--mode rpc`, `--continue`, `@file` args work for free.
243
- 5. Lifecycle: child exit → optionally keep the server warm (flag);
244
- SIGINT goes to the child (pi handles double-ctrl-C), server shuts
245
- down cleanly after.
246
-
247
- ### P3 — embed spike (≤1 week, run via `bun run`, no bundling yet)
248
-
249
- 1. Add pi packages as pinned deps (exact `0.79.x`).
250
- 2. Wire `createAgentSession` full-control style: in-memory
251
- registry/settings, our provider at the loopback baseUrl, session
252
- dir under `~/.mlx-bun/`, default tools, our system prompt.
253
- 3. Run `new InteractiveMode(runtime)` in the same process as the
254
- server.
255
- 4. **Gates** (house rule — numbers on this machine): editor latency
256
- during 12B decode subjectively clean + decode tok/s within noise
257
- of server-only; tool-call round-trip (read/bash/edit) works against
258
- the 12B; clean teardown.
259
- 5. Decide discovery policy: default isolated; `--pi-config` opt-in to
260
- the user's `~/.pi` extensions/skills/themes.
261
-
262
- ### P4 — single binary + shared event plumbing (~1 week)
263
-
264
- 1. Fold pi's asset manifest (theme JSONs, PNGs, export-html templates,
265
- photon wasm, pi-tui darwin `.node` prebuilds) into the Phase 5
266
- `bun build --compile`; patch/verify pi's asset-path resolution
267
- inside the bundle (upstream's own binary build is the existence
268
- proof).
269
- 2. CLI surface: `mlx-bun pi [pi-args]` → embedded `InteractiveMode`;
270
- `-p` → `runPrintMode`; `--mode rpc` → `runRpcMode`. Subprocess
271
- path (P2) remains as `--external-pi` fallback.
272
- 3. Web chat UI rides the same `AgentSession.subscribe()` events over
273
- WebSocket (Option 4 shape, in-process — no subprocess needed).
274
- 4. Upgrade policy: bump pi deliberately per release, re-run the P3
275
- gates as the regression suite.
276
-
277
- ### First-run starter model (folds into P2/P4; model gated on Phase 14)
278
-
279
- The first-run experience must not be "watch a progress bar for 10
280
- minutes." Plan: a sub-gigabyte **starter model** downloads first and is
281
- chatting within ~1 minute — with a docs-grounded "tour guide" system
282
- prompt (README + server-api + pi guide preloaded, so a 1B doesn't
283
- hallucinate about mlx-bun) and a banner: *"the ideal model for your Mac
284
- is downloading in the background."* The profile model streams behind it
285
- (sequenced, not parallel, so downloads don't split bandwidth); swap
286
- when ready.
287
-
288
- Measured sizes (HF tree API, 2026-06-12):
289
-
290
- | Candidate | Download | Note |
291
- |---|---|---|
292
- | gemma-4-e2b-it-OptiQ-4bit | 5.26 GB | smallest Gemma — disqualifies the family for the starter slot |
293
- | gemma-4-e4b / 12B OptiQ-4bit | 7.0 / 8.4 GB | profile models, not starters |
294
- | **Qwen3.5-0.8B-OptiQ-4bit** | **0.89 GB** | **preferred**: rides the Phase 14 Qwen port; doubles as the first tier-a parity target |
295
- | MiniCPM5-1B-OptiQ-4bit | 0.92 GB | strong (52% MMLU, +4.44 OptiQ delta) but a third architecture family — A/B later |
296
-
297
- Decisions: starter is **downloaded, never bundled** (a ~900 MB binary
298
- kills brew install); it stays on disk afterward (future
299
- speculative-decoding draft + always-works fallback). Hot-swap (or
300
- offer-to-swap) when the profile model lands is the only new runtime
301
- work. Dependency: a runnable sub-GB model requires the Phase 14 Qwen
302
- bring-up — the starter feature is the reason the 0.8B goes first there.
303
-
304
- ## Recommended sequence
305
-
306
- P1 + P2 now (days, immediate demo value, zero coupling) → P3 spike
307
- with its latency gate → P4 single-binary flagship, reusing the event
308
- plumbing for the built-in web UI.