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,92 +0,0 @@
1
- // Microphone capture sidecar for `mlx-bun dictate`: AVAudioEngine input
2
- // → 16 kHz mono float32 little-endian PCM on stdout, continuously, in
3
- // 20 ms buffers. Control lines go to stderr: "ready", and with --hotkey
4
- // <keycode>, "hotkey down" / "hotkey up" from a CGEvent listen-only tap
5
- // (needs the terminal app to have Input Monitoring; the mic needs
6
- // Microphone permission — macOS prompts on first use).
7
- //
8
- // mic-capture [--rate 16000] [--hotkey 61] (61 = Right Option)
9
-
10
- import AVFoundation
11
- import CoreGraphics
12
- import Foundation
13
-
14
- var rate: Double = 16000
15
- var hotkey: Int64? = nil
16
- var args = Array(CommandLine.arguments.dropFirst())
17
- while !args.isEmpty {
18
- let a = args.removeFirst()
19
- switch a {
20
- case "--rate": rate = Double(args.removeFirst()) ?? 16000
21
- case "--hotkey": hotkey = Int64(args.removeFirst())
22
- default:
23
- FileHandle.standardError.write("usage: mic-capture [--rate 16000] [--hotkey <keycode>]\n".data(using: .utf8)!)
24
- exit(2)
25
- }
26
- }
27
-
28
- let err = FileHandle.standardError
29
- let out = FileHandle.standardOutput
30
- let writeLock = NSLock()
31
- func note(_ s: String) { err.write((s + "\n").data(using: .utf8)!) }
32
-
33
- var hotkeyDown = false
34
- let engine = AVAudioEngine()
35
- let input = engine.inputNode
36
- let inFormat = input.outputFormat(forBus: 0)
37
- guard let outFormat = AVAudioFormat(commonFormat: .pcmFormatFloat32, sampleRate: rate, channels: 1, interleaved: true),
38
- let converter = AVAudioConverter(from: inFormat, to: outFormat) else {
39
- note("error: cannot build audio converter"); exit(1)
40
- }
41
- input.installTap(onBus: 0, bufferSize: AVAudioFrameCount(inFormat.sampleRate * 0.02), format: inFormat) { buffer, _ in
42
- let ratio = rate / inFormat.sampleRate
43
- let capacity = AVAudioFrameCount(Double(buffer.frameLength) * ratio) + 32
44
- guard let outBuf = AVAudioPCMBuffer(pcmFormat: outFormat, frameCapacity: capacity) else { return }
45
- var consumed = false
46
- var convError: NSError? = nil
47
- converter.convert(to: outBuf, error: &convError) { _, status in
48
- if consumed { status.pointee = .noDataNow; return nil }
49
- consumed = true
50
- status.pointee = .haveData
51
- return buffer
52
- }
53
- if convError != nil || outBuf.frameLength == 0 { return }
54
- let bytes = Data(bytes: outBuf.floatChannelData![0], count: Int(outBuf.frameLength) * 4)
55
- writeLock.lock(); out.write(bytes); writeLock.unlock()
56
- }
57
- do { try engine.start() } catch { note("error: audio engine failed: \(error)"); exit(1) }
58
- note("ready rate=\(Int(rate)) input=\(Int(inFormat.sampleRate))Hz/\(inFormat.channelCount)ch")
59
-
60
- if let key = hotkey {
61
- let mask: CGEventMask = (1 << CGEventType.flagsChanged.rawValue) | (1 << CGEventType.keyDown.rawValue) | (1 << CGEventType.keyUp.rawValue)
62
- let callback: CGEventTapCallBack = { _, type, event, _ in
63
- let code = event.getIntegerValueField(.keyboardEventKeycode)
64
- if code == hotkey! {
65
- var isDown = false
66
- switch type {
67
- case .keyDown: isDown = true
68
- case .keyUp: isDown = false
69
- case .flagsChanged:
70
- let f = event.flags
71
- isDown = f.contains(.maskAlternate) || f.contains(.maskCommand) || f.contains(.maskControl) || f.contains(.maskShift) || f.contains(.maskSecondaryFn)
72
- default: return Unmanaged.passUnretained(event)
73
- }
74
- if isDown != hotkeyDown { hotkeyDown = isDown; note(isDown ? "hotkey down" : "hotkey up") }
75
- }
76
- return Unmanaged.passUnretained(event)
77
- }
78
- guard let tap = CGEvent.tapCreate(tap: .cgSessionEventTap, place: .headInsertEventTap, options: .listenOnly, eventsOfInterest: mask, callback: callback, userInfo: nil) else {
79
- note("error: cannot create event tap — grant Input Monitoring to your terminal (System Settings → Privacy & Security)")
80
- exit(3)
81
- }
82
- let source = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, tap, 0)
83
- CFRunLoopAddSource(CFRunLoopGetCurrent(), source, .commonModes)
84
- CGEvent.tapEnable(tap: tap, enable: true)
85
- note("hotkey \(key) armed")
86
- }
87
- // stdin EOF (parent gone) ends the helper
88
- DispatchQueue.global().async {
89
- _ = FileHandle.standardInput.readDataToEndOfFile()
90
- exit(0)
91
- }
92
- CFRunLoopRun()
@@ -1,163 +0,0 @@
1
- // Native runtime pack (decision 2026-06-12, "one binary" discussion):
2
- // the mlx-bun executable ships alone (~61 MB, 100% our code + Bun); the
3
- // MLX native runtime (libmlx, libmlxc, libjaccl, mlx.metallib) is a
4
- // separate versioned tarball downloaded ON FIRST RUN into
5
- // ~/Library/Caches/mlx-bun/native-v<ver>-<arch>/ — resumable and
6
- // sha256-verified through the same downloadOne machinery as model
7
- // downloads, visible on the status page /downloads tracker.
8
- //
9
- // Resolution order for the libs (mirrored in src/mlx/ffi.ts):
10
- // MLX_BUN_LIBMLXC env > beside the executable (sidecar dist/ layout,
11
- // docs/reference/distribution.md) > the native-pack cache dir > homebrew.
12
- // Dev trees and embedders therefore never download anything.
13
-
14
- import { existsSync, mkdirSync, renameSync, rmSync } from "node:fs";
15
- import { homedir, tmpdir } from "node:os";
16
- import { dirname, join } from "node:path";
17
- import { downloadOne } from "./download";
18
- import { runtimeValue } from "./runtime-config";
19
-
20
- export const NATIVE_PACK_VERSION = "0.5.0";
21
- export const MLX_CORE_VERSION = "0.32.2";
22
- export const NATIVE_PACK_FILES = [
23
- "libmlxc.dylib", "libmlx.dylib", "libjaccl.dylib", "mlx.metallib",
24
- "libmlx_bun_expert_io.dylib", "mlx-bun-frame-extract", "mlx-bun-mic-capture",
25
- ] as const;
26
-
27
- // RELEASE-TIME BAKE: scripts/build-native-pack.sh prints the sha256/size for
28
- // the freshly built tarball — publish `native-v0.4.0` with both assets and
29
- // paste the values here BEFORE tagging the package release (0.5.0 adds the
30
- // mlx-bun-mic-capture dictation sidecar) (the download
31
- // 404s until the GitHub release exists; dev trees resolve via homebrew/env
32
- // and never hit this path).
33
- const SHA256: Record<string, string> = {
34
- arm64: "6ff825499ca48bd4e9adebeefac78108cc4328971011c233210d65a0aa78b427",
35
- };
36
- const SIZE: Record<string, number> = {
37
- arm64: 41945454,
38
- };
39
-
40
- export function nativePackName(arch = process.arch): string {
41
- return `mlx-bun-native-v${NATIVE_PACK_VERSION}-${arch}.tar.gz`;
42
- }
43
-
44
- /** GitHub release asset; override with MLX_BUN_NATIVE_PACK_URL. While
45
- * the repo is private the download needs a token (GITHUB_TOKEN or
46
- * `gh auth token`); once public it works anonymously. */
47
- export function nativePackUrl(arch = process.arch): string {
48
- return runtimeValue("MLX_BUN_NATIVE_PACK_URL") ??
49
- `https://github.com/joshuarossi/mlx-bun/releases/download/native-v${NATIVE_PACK_VERSION}/${nativePackName(arch)}`;
50
- }
51
-
52
- export function nativePackDir(arch = process.arch): string {
53
- return join(homedir(), "Library", "Caches", "mlx-bun", `native-v${NATIVE_PACK_VERSION}-${arch}`);
54
- }
55
-
56
- /** Where the native runtime currently resolves from, or null if absent
57
- * everywhere (= a fresh machine that needs the pack). */
58
- export function nativeRuntimeDir(): string | null {
59
- const explicit = runtimeValue("MLX_BUN_LIBMLXC");
60
- if (explicit) return dirname(explicit);
61
- const candidates = [
62
- dirname(process.execPath),
63
- nativePackDir(),
64
- "/opt/homebrew/lib",
65
- "/usr/local/lib",
66
- ];
67
- for (const dir of candidates)
68
- if (existsSync(join(dir, "libmlxc.dylib"))) return dir;
69
- return null;
70
- }
71
-
72
- async function githubToken(): Promise<string | null> {
73
- if (process.env.GITHUB_TOKEN) return process.env.GITHUB_TOKEN;
74
- try {
75
- const proc = Bun.spawn(["gh", "auth", "token"], { stdout: "pipe", stderr: "ignore" });
76
- const out = (await new Response(proc.stdout).text()).trim();
77
- return (await proc.exited) === 0 && out ? out : null;
78
- } catch {
79
- return null;
80
- }
81
- }
82
-
83
- /** Map a github.com/<o>/<r>/releases/download/<tag>/<name> URL to a
84
- * presigned asset URL via the API. Returns null when no token is
85
- * available or the lookup fails (caller falls back to the plain URL,
86
- * which works for public repos). */
87
- async function resolveGithubAssetUrl(url: string): Promise<string | null> {
88
- const m = /^https:\/\/github\.com\/([^/]+)\/([^/]+)\/releases\/download\/([^/]+)\/(.+)$/.exec(url);
89
- const token = await githubToken();
90
- if (!m || !token) return null;
91
- try {
92
- const [, owner, repo, tag, name] = m;
93
- const rel = await fetch(`https://api.github.com/repos/${owner}/${repo}/releases/tags/${tag}`, {
94
- headers: { authorization: `Bearer ${token}`, accept: "application/vnd.github+json" },
95
- });
96
- if (!rel.ok) return null;
97
- const assets = ((await rel.json()) as { assets: Array<{ name: string; url: string }> }).assets;
98
- const asset = assets.find((a) => a.name === name);
99
- if (!asset) return null;
100
- const head = await fetch(asset.url, {
101
- redirect: "manual",
102
- headers: { authorization: `Bearer ${token}`, accept: "application/octet-stream" },
103
- });
104
- return head.headers.get("location"); // presigned; no auth needed past here
105
- } catch {
106
- return null;
107
- }
108
- }
109
-
110
- export interface EnsureNativeOptions {
111
- url?: string;
112
- sha256?: string;
113
- sizeBytes?: number;
114
- destDir?: string;
115
- onProgress?: (received: number, total: number) => void;
116
- }
117
-
118
- /** Make the native runtime available; returns its directory. No-op when
119
- * any resolution candidate already has it. */
120
- export async function ensureNativeRuntime(opts: EnsureNativeOptions = {}): Promise<string> {
121
- const existing = nativeRuntimeDir();
122
- if (existing && !opts.destDir) return existing;
123
-
124
- const arch = process.arch;
125
- const url = opts.url ?? nativePackUrl(arch);
126
- const sha256 = opts.sha256 ?? SHA256[arch];
127
- const sizeBytes = opts.sizeBytes ?? SIZE[arch];
128
- const destDir = opts.destDir ?? nativePackDir(arch);
129
- if (NATIVE_PACK_FILES.every((file) => existsSync(join(destDir, file))))
130
- return destDir;
131
- if (!sha256 || !sizeBytes)
132
- throw new Error(`no native pack published for ${arch} — set MLX_BUN_LIBMLXC or install mlx via homebrew`);
133
-
134
- const tarPath = join(tmpdir(), `mlx-bun-native-${sha256.slice(0, 12)}.tar.gz`);
135
- let fetchUrl = url;
136
- let token: string | null = null;
137
- if (url.startsWith("https://github.com/")) {
138
- // Public repo: the releases/download URL works anonymously. Private
139
- // repo: it 404s — resolve the asset's signed URL via the API
140
- // (Accept: octet-stream + token → 302 with a presigned location).
141
- const resolved = await resolveGithubAssetUrl(url);
142
- if (resolved) fetchUrl = resolved;
143
- else token = await githubToken(); // public-repo path; token unused but harmless
144
- }
145
- await downloadOne(fetchUrl, token, tarPath, { size: sizeBytes, sha256, name: nativePackName(arch) },
146
- (_file, received, total) => opts.onProgress?.(received, total));
147
-
148
- // Extract to a staging dir, then rename into place (atomic-ish: a
149
- // crashed extract never leaves a half-populated cache dir).
150
- const staging = `${destDir}.staging-${process.pid}`;
151
- rmSync(staging, { recursive: true, force: true });
152
- mkdirSync(staging, { recursive: true });
153
- const untar = Bun.spawn(["tar", "-xzf", tarPath, "-C", staging], { stderr: "pipe" });
154
- if ((await untar.exited) !== 0)
155
- throw new Error(`native pack extract failed: ${await new Response(untar.stderr).text()}`);
156
- for (const f of NATIVE_PACK_FILES)
157
- if (!existsSync(join(staging, f))) throw new Error(`native pack missing ${f}`);
158
- rmSync(destDir, { recursive: true, force: true });
159
- mkdirSync(dirname(destDir), { recursive: true });
160
- renameSync(staging, destDir);
161
- rmSync(tarPath, { force: true });
162
- return destDir;
163
- }
@@ -1,53 +0,0 @@
1
- // mlx-bun pi-provider — the in-memory pi provider/registry/auth wiring that
2
- // points a pi AgentSession at the local mlx-bun server's loopback /v1.
3
- //
4
- // Shared by BOTH embed paths so the wiring can't drift:
5
- // - src/pi-web.ts (headless web-chat session over a WebSocket)
6
- // - src/pi-terminal.ts (pi's own interactive TUI, in-process)
7
- //
8
- // The provider advertises a single, stable model id ("local"); the server
9
- // runs exactly one model at a time and which one varies run-to-run, so a
10
- // fixed id resolves to "whatever is loaded" and never goes stale. The real
11
- // repo id rides in the model `name` and is still reported by /v1/models.
12
- // This mirrors src/harness-pi.ts (the external-provider path).
13
-
14
- import { AuthStorage, ModelRegistry } from "@earendil-works/pi-coding-agent";
15
-
16
- /** A resolved pi model handle. Not re-exported from the package index, so we
17
- * derive it from the registry's `find()` return type. */
18
- export type PiModel = NonNullable<ReturnType<ModelRegistry["find"]>>;
19
-
20
- import { PI_PROVIDER_ID, PI_API_KEY, PI_API, PI_LOCAL_MODEL_ID, piModelDefinition,
21
- type PiModelOptions } from "./contracts/pi-provider";
22
- export { PI_PROVIDER_ID, PI_API_KEY, PI_API, PI_LOCAL_MODEL_ID,
23
- DEFAULT_CONTEXT_WINDOW, DEFAULT_MAX_TOKENS } from "./contracts/pi-provider";
24
- export interface PiProviderOptions extends PiModelOptions {}
25
-
26
- export interface PiProviderWiring {
27
- authStorage: AuthStorage;
28
- modelRegistry: ModelRegistry;
29
- model: PiModel;
30
- }
31
-
32
- /**
33
- * Build the in-memory auth + registry and resolve the local model for a pi
34
- * session pointed at `baseUrl` (e.g. "http://127.0.0.1:8080/v1"). The runtime
35
- * key satisfies pi's auth check for our zero-cost local provider; no disk
36
- * (no models.json, no ~/.pi cross-talk).
37
- */
38
- export function buildPiProvider(baseUrl: string, opts: PiProviderOptions = {}): PiProviderWiring {
39
- const authStorage = AuthStorage.inMemory();
40
- authStorage.setRuntimeApiKey(PI_PROVIDER_ID, PI_API_KEY);
41
-
42
- const modelRegistry = ModelRegistry.inMemory(authStorage);
43
- modelRegistry.registerProvider(PI_PROVIDER_ID, {
44
- baseUrl,
45
- apiKey: PI_API_KEY,
46
- api: PI_API,
47
- models: [piModelDefinition(opts)],
48
- });
49
-
50
- const model = modelRegistry.find(PI_PROVIDER_ID, PI_LOCAL_MODEL_ID);
51
- if (!model) throw new Error("failed to register mlx-bun/local model");
52
- return { authStorage, modelRegistry, model };
53
- }
package/src/pi-session.ts DELETED
@@ -1,81 +0,0 @@
1
- // Shared pi front-door assembly for mlx-bun's embedded web + terminal agents.
2
- //
3
- // This is the single place that decides which custom tools and bundled skills
4
- // are visible to pi. Keeping that policy here prevents the browser and TUI from
5
- // drifting — especially for personal memory, whose prompt surface must be
6
- // relevant-but-not-dominant.
7
-
8
- import type { ToolDefinition } from "@earendil-works/pi-coding-agent";
9
- import { createWebTools, WEB_TOOL_NAMES } from "./web-tools";
10
- import { materializeBundledSkillPaths } from "./web/skills";
11
- import {
12
- createMemoryTools,
13
- MEMORY_TOOL_NAMES,
14
- memoryIndexHint,
15
- isMemoryEnabled,
16
- createReferenceTools,
17
- REFERENCE_TOOL_NAMES,
18
- } from "./memory/tools";
19
-
20
- /** Built-in pi coding tools plus mlx-bun's non-mutating web tools. */
21
- export const PI_BASE_TOOL_NAMES = ["read", "bash", "edit", "write", "grep", "find", "ls", ...WEB_TOOL_NAMES] as const;
22
-
23
- export interface PiAgentSurfaceOptions {
24
- /** Force memory on/off for tests. Default: auto-detect vault existence. */
25
- memory?: "auto" | "on" | "off";
26
- /** Include web_search/web_fetch/weather. Default true. */
27
- webTools?: boolean;
28
- /** Include read/bash/edit/write/grep/find/ls. Default true. */
29
- codingTools?: boolean;
30
- }
31
-
32
- export interface PiAgentSurface {
33
- memoryEnabled: boolean;
34
- /** Tool allowlist to pass to createAgentSession/createAgentSessionFromServices. */
35
- tools: string[];
36
- /** Custom tools to pass to pi. Built-ins are selected by name in `tools`. */
37
- customTools: ToolDefinition[];
38
- /** Skill paths for DefaultResourceLoader.additionalSkillPaths. */
39
- skillPaths: string[];
40
- /** Short prompt addendum. Empty unless memory is enabled. */
41
- memoryHint: string;
42
- }
43
-
44
- async function resolveMemoryEnabled(mode: PiAgentSurfaceOptions["memory"]): Promise<boolean> {
45
- if (mode === "on") return true;
46
- if (mode === "off") return false;
47
- return isMemoryEnabled();
48
- }
49
-
50
- /**
51
- * Build the shared tool + skill surface for both pi front doors.
52
- *
53
- * Memory policy: if the user enabled memory (vault exists), memory is available.
54
- * It is still a scoped retrieval capability, not a default first step for every
55
- * prompt. If memory is absent, no memory skill/tool schemas are exposed at all.
56
- */
57
- export async function buildPiAgentSurface(opts: PiAgentSurfaceOptions = {}): Promise<PiAgentSurface> {
58
- const memoryEnabled = await resolveMemoryEnabled(opts.memory ?? "auto");
59
- const includeWeb = opts.webTools ?? true;
60
- const includeCoding = opts.codingTools ?? true;
61
-
62
- const tools: string[] = [];
63
- if (includeCoding) tools.push("read", "bash", "edit", "write", "grep", "find", "ls");
64
- const customTools: ToolDefinition[] = [];
65
- if (includeWeb) {
66
- tools.push(...WEB_TOOL_NAMES);
67
- customTools.push(...createWebTools());
68
- }
69
- if (memoryEnabled) {
70
- tools.push(...MEMORY_TOOL_NAMES, ...REFERENCE_TOOL_NAMES);
71
- customTools.push(...createMemoryTools(), ...createReferenceTools());
72
- }
73
-
74
- return {
75
- memoryEnabled,
76
- tools,
77
- customTools,
78
- skillPaths: materializeBundledSkillPaths({ includeMemory: memoryEnabled }),
79
- memoryHint: memoryEnabled ? await memoryIndexHint() : "",
80
- };
81
- }
@@ -1,274 +0,0 @@
1
- // mlx-bun pi-terminal — drive pi's OWN interactive TUI in-process against the
2
- // local mlx-bun server (Phase 16 P3/P4). No subprocess, no requirement that
3
- // the user install pi: pi is a bundled dependency, so we build an
4
- // AgentSessionRuntime with the SDK and hand it to pi's exported InteractiveMode.
5
- //
6
- // This is the terminal twin of src/pi-web.ts (the headless web embed). They
7
- // share the provider wiring (src/pi-provider.ts) and the curated skills
8
- // (src/web/skills.ts); the differences are:
9
- // - we build an AgentSessionRuntime (InteractiveMode needs the runtime, not
10
- // the bare session createAgentSession returns), via the same
11
- // createAgentSessionServices + createAgentSessionFromServices the pi CLI
12
- // uses (dist/main.js) — see examples/sdk/13-session-runtime.ts;
13
- // - tool approval is pi's own built-in TUI prompt, so there's no custom
14
- // approval gate here (the web path needs one only because the browser
15
- // drives approvals over a WebSocket);
16
- // - the system prompt is a custom mlx-bun CODING-agent persona (the web
17
- // path is a general chat assistant);
18
- // - sessions persist (~/.mlx-bun/pi) so /resume and history work.
19
- //
20
- // Modes mirror pi's CLI: interactive (InteractiveMode), one-shot print
21
- // (`-p` / `--mode json` → runPrintMode), and JSONL RPC (`--mode rpc` →
22
- // runRpcMode). All three are SDK exports, so the embedded CLI keeps pi's
23
- // headless surface.
24
-
25
- import { homedir } from "node:os";
26
- import { join } from "node:path";
27
- import {
28
- InteractiveMode,
29
- SessionManager,
30
- createAgentSessionFromServices,
31
- createAgentSessionRuntime,
32
- createAgentSessionServices,
33
- initTheme,
34
- runPrintMode,
35
- runRpcMode,
36
- type CreateAgentSessionRuntimeFactory,
37
- } from "@earendil-works/pi-coding-agent";
38
- import { buildPiAgentSurface } from "./pi-session";
39
- import { buildPiProvider, DEFAULT_CONTEXT_WINDOW } from "./pi-provider";
40
-
41
- /** How the embedded agent runs. Mirrors pi's CLI appMode. */
42
- export type PiTerminalMode = "interactive" | "print" | "rpc";
43
-
44
- /**
45
- * Full toolset the terminal agent is offered: pi's built-in coding tools plus
46
- * our outward-facing web tools. pi treats this list as an allowlist, so a
47
- * custom tool's name MUST appear here or it's filtered out before the model
48
- * sees it. Mutating tools (bash/edit/write) surface pi's own TUI approval
49
- * prompt at call time — we don't add a gate.
50
- */
51
- /**
52
- * System prompt for the embedded terminal coding agent.
53
- *
54
- * This fully REPLACES pi's default coding-agent prompt (it flows to
55
- * buildSystemPrompt's `customPrompt` via the resource loader's `systemPrompt`).
56
- * We replace rather than append so the agent's identity is mlx-bun's, not
57
- * "operating inside pi, a coding agent harness", and so pi's block of internal
58
- * documentation paths is dropped. pi still auto-appends the current date and
59
- * working directory, so we don't repeat them here.
60
- *
61
- * Unlike the web chat (a general assistant), this is a true terminal CODING
62
- * agent: it lives in the user's project directory with real read/run/edit
63
- * tools. The capability list stays honest about which tools ask for approval
64
- * so the model never promises an action the user must still confirm.
65
- */
66
- export function buildTerminalSystemPrompt(modelLabel?: string): string {
67
- const model = modelLabel ? `the local model \`${modelLabel}\`` : "a local model";
68
- return `You are mlx-bun's terminal coding agent — a capable, hands-on pair programmer working alongside the user in their terminal. You run on ${model} entirely on the user's own Apple-silicon Mac via mlx-bun, so the whole session stays local and private; nothing leaves the machine except the explicit web tools below.
69
-
70
- You operate inside the user's current project directory. Available capabilities when relevant: read-only file inspection (read, ls, find, grep), web search/fetch (web_search, web_fetch), weather, and user-approved local actions (bash, edit, write).
71
-
72
- Use tools in service of helping the user, not as a performance. For ordinary social conversation, answer naturally yourself. For real-world facts, current events, schedules, releases, local information, recommendations, restaurants, movies, prices, travel, docs, or anything likely to have changed, look it up with web_search/web_fetch or weather instead of relying on memory or guessing. For coding tasks, inspect the files, investigate before you answer, and follow through to a working result. When you need to change code or run something, propose the concrete edit or command and let the approval prompt handle consent — don't ask permission in prose first.
73
-
74
- Environment metadata such as current date, working directory, model name, and available tools may be provided for context; do not report or summarize that metadata unless the user asks for it or it is directly relevant. Do not narrate tool policies or internal workflows.
75
-
76
- Be honest about what you did and what you found, including mistakes, dead ends, and anything you couldn't do. Keep responses tight and skimmable: format with Markdown, show file paths and commands plainly, and cite links when you used the web.`;
77
- }
78
-
79
- export interface RunEmbeddedPiOptions {
80
- /** mlx-bun server base URL, e.g. "http://localhost:8080/v1". */
81
- baseUrl: string;
82
- /** Real served model id, used to label the model in the prompt + registry. */
83
- modelLabel?: string;
84
- /** Context window advertised to pi. Default: DEFAULT_CONTEXT_WINDOW. */
85
- contextWindow?: number;
86
- /** Whether the served model has a switchable thinking channel. */
87
- reasoning?: boolean;
88
- /** Whether the served model accepts images (server's vision capability —
89
- * /v1/models `vision`). MUST match the real model: see PiProviderOptions. */
90
- vision?: boolean;
91
- /** Run mode. Default: "interactive". */
92
- mode?: PiTerminalMode;
93
- /** Print mode output format ("text" final-only, "json" event stream). */
94
- printFormat?: "text" | "json";
95
- /** First message to send (print: the prompt; interactive: pre-filled turn). */
96
- initialMessage?: string;
97
- /** Additional messages to send after initialMessage. */
98
- messages?: string[];
99
- /** Force pi's verbose startup banner (interactive only). */
100
- verbose?: boolean;
101
- }
102
-
103
- /**
104
- * Build an AgentSessionRuntime against the local server and run pi in the
105
- * requested mode. Returns the process exit code. Disposes the runtime on the
106
- * way out. Runs in the SAME process as the server when the CLI started one —
107
- * pi's TUI event loop and the generation queue share the JS thread (mlx
108
- * compute is native); pi's rendering is differential and cheap.
109
- */
110
- export async function runEmbeddedPi(opts: RunEmbeddedPiOptions): Promise<number> {
111
- const mode = opts.mode ?? "interactive";
112
- const cwd = process.cwd();
113
- // Own session/settings dir, isolated from any standalone pi install.
114
- const agentDir = join(homedir(), ".mlx-bun", "pi");
115
- const sessionDir = join(agentDir, "sessions", `--${cwd.replace(/^[/\\]/, "").replace(/[/\\:]/g, "-")}--`);
116
-
117
- const { authStorage, modelRegistry, model } = buildPiProvider(opts.baseUrl, {
118
- contextWindow: opts.contextWindow ?? DEFAULT_CONTEXT_WINDOW,
119
- name: opts.modelLabel ? `${opts.modelLabel} (mlx-bun local)` : undefined,
120
- reasoning: opts.reasoning ?? false,
121
- vision: opts.vision ?? false,
122
- });
123
-
124
- // Shared pi tool/skill surface. Memory is included only when the user has
125
- // enabled a vault; if present it remains scoped to user-specific continuity.
126
- const surface = await buildPiAgentSurface();
127
- const systemPrompt = buildTerminalSystemPrompt(opts.modelLabel) + surface.memoryHint;
128
-
129
- // The runtime factory: same shape as pi's own CLI (dist/main.js) and the
130
- // shipped examples/sdk/13-session-runtime.ts. The same factory is reused by
131
- // pi for /new, /resume, /fork — so the provider/prompt/tools are stable
132
- // across session switches within the TUI.
133
- const createRuntime: CreateAgentSessionRuntimeFactory = async ({ cwd: rcwd, sessionManager, sessionStartEvent }) => {
134
- const services = await createAgentSessionServices({
135
- cwd: rcwd,
136
- agentDir,
137
- authStorage,
138
- modelRegistry,
139
- resourceLoaderOptions: {
140
- // Isolated from the user's own ~/.pi: don't inherit their extensions,
141
- // prompt templates, themes, or auto-discovered skills.
142
- noExtensions: true,
143
- noSkills: true,
144
- noPromptTemplates: true,
145
- noThemes: true,
146
- // A coding agent in a project dir SHOULD read the project's own
147
- // AGENTS.md / CLAUDE.md context files (unlike the web chat).
148
- noContextFiles: false,
149
- // Our curated skills on top (noSkills above only disables discovery).
150
- additionalSkillPaths: surface.skillPaths,
151
- // Replace pi's default coding-agent prompt with our mlx-bun persona.
152
- systemPrompt,
153
- },
154
- });
155
- return {
156
- ...(await createAgentSessionFromServices({
157
- services,
158
- sessionManager,
159
- sessionStartEvent,
160
- model,
161
- tools: surface.tools,
162
- customTools: surface.customTools,
163
- })),
164
- services,
165
- diagnostics: services.diagnostics,
166
- };
167
- };
168
-
169
- const sessionManager = SessionManager.create(cwd, sessionDir);
170
- const runtime = await createAgentSessionRuntime(createRuntime, { cwd, agentDir, sessionManager });
171
-
172
- try {
173
- if (mode === "rpc") {
174
- // runRpcMode never returns (Promise<never>); it owns stdin/stdout.
175
- await runRpcMode(runtime);
176
- return 0;
177
- }
178
- if (mode === "print") {
179
- return await runPrintMode(runtime, {
180
- mode: opts.printFormat ?? "text",
181
- messages: opts.messages,
182
- initialMessage: opts.initialMessage,
183
- });
184
- }
185
- // interactive — initialize the theme (pi's CLI does this before the TUI)
186
- // then run pi's own full interactive mode.
187
- initTheme(runtime.services.settingsManager.getTheme(), true);
188
- await new InteractiveMode(runtime, {
189
- initialMessage: opts.initialMessage,
190
- initialMessages: opts.messages,
191
- verbose: opts.verbose,
192
- }).run();
193
- return 0;
194
- } finally {
195
- try {
196
- await runtime.dispose();
197
- } catch {
198
- // Best-effort teardown; never mask the real exit path.
199
- }
200
- }
201
- }
202
-
203
- /** Result of parsing the pi passthrough argv into an embedded run config. */
204
- export interface ParsedPiArgs {
205
- mode: PiTerminalMode;
206
- printFormat: "text" | "json";
207
- /** Joined free-text message (the trailing words / `-p <text>`). */
208
- message?: string;
209
- /** pi's verbose startup banner (interactive only). */
210
- verbose: boolean;
211
- /** Unknown flags that were dropped (with their values) — callers should
212
- * warn so `--resume`-style pi flags don't fail silently. */
213
- ignored: string[];
214
- }
215
-
216
- /**
217
- * Parse the argv left over after mlx-bun's own flags are stripped into a
218
- * mode + message for runEmbeddedPi. Pure (takes `isStdinPiped`) so it's
219
- * unit-testable. Covers the headline pi modes:
220
- * - `-p` / `--print` → print (text), prompt from -p value / words / stdin
221
- * - `--mode json` / `-p --json` → print (json)
222
- * - `--mode rpc` → rpc
223
- * - piped stdin (non-TTY) → print (text), like pi's own CLI
224
- * - anything else → interactive (trailing words pre-fill turn 1)
225
- * The built-in agent is deliberately scoped to these modes. The full pi
226
- * flag surface (--continue, --resume, @file expansion, extensions, themes)
227
- * belongs to the user's OWN pi — point it at this server with
228
- * `mlx-bun harness pi`.
229
- */
230
- export function parsePiArgs(passthrough: string[], isStdinPiped: boolean): ParsedPiArgs {
231
- let print = false;
232
- let rpc = false;
233
- let json = false;
234
- let verbose = false;
235
- const words: string[] = [];
236
- const ignored: string[] = [];
237
- for (let i = 0; i < passthrough.length; i++) {
238
- const a = passthrough[i]!;
239
- if (a === "-p" || a === "--print") {
240
- print = true;
241
- } else if (a === "--json") {
242
- json = true;
243
- } else if (a === "--verbose") {
244
- verbose = true;
245
- } else if (a === "--mode") {
246
- const m = passthrough[++i];
247
- if (m === "rpc") rpc = true;
248
- else if (m === "json") { print = true; json = true; }
249
- else if (m === "text") print = true;
250
- } else if (a.startsWith("-")) {
251
- // Unknown flag for the built-in agent: drop it AND its value (the full
252
- // pi flag surface lives in the user's own pi via `mlx-bun harness pi`).
253
- // Without the value-swallow, `mlx-bun pi --resume abc123` started a
254
- // chat with the message "abc123". A following token that looks like
255
- // another flag is not a value, so it isn't consumed.
256
- const next = passthrough[i + 1];
257
- if (next !== undefined && !next.startsWith("-")) {
258
- ignored.push(`${a} ${next}`);
259
- i++;
260
- } else {
261
- ignored.push(a);
262
- }
263
- } else {
264
- words.push(a);
265
- }
266
- }
267
- const message = words.length > 0 ? words.join(" ") : undefined;
268
- const printFormat = json ? "json" : "text";
269
- if (rpc) return { mode: "rpc", printFormat: "text", message, verbose, ignored };
270
- // `-p`/`--mode` request print; piped stdin makes a bare invocation one-shot
271
- // too, matching pi's own CLI (it reads stdin → switches to print mode).
272
- if (print || isStdinPiped) return { mode: "print", printFormat, message, verbose, ignored };
273
- return { mode: "interactive", printFormat, message, verbose, ignored };
274
- }