mlx-bun 0.2.0 → 0.4.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 (433) hide show
  1. package/README.md +71 -588
  2. package/docs/README.md +94 -0
  3. package/docs/{design → archive/investigations}/audio-input-plan.md +4 -4
  4. package/docs/{design → archive/investigations}/diffusion-gemma-port.md +3 -3
  5. package/docs/{design → archive/investigations}/faithful-l1-consolidation.md +4 -4
  6. package/docs/{design → archive/investigations}/minicpm5-decode-megakernel.md +11 -11
  7. package/docs/archive/investigations/openjarvis-fit.md +198 -0
  8. package/docs/{design → archive/investigations}/optimization_plan.md +1 -1
  9. package/docs/{design → archive/investigations}/pre-colibri-stabilization.md +5 -5
  10. package/docs/archive/investigations/qwen38-27b-campaign-log.md +1092 -0
  11. package/docs/{design → archive/investigations}/the-dreaming-handoff.md +2 -2
  12. package/docs/archive/planning/release-notes-v0.3.0.md +35 -0
  13. package/docs/design/batching.md +1841 -0
  14. package/docs/design/decode-speed-program.md +2346 -169
  15. package/docs/design/dreaming-nightly-pipeline.md +675 -282
  16. package/docs/design/generic-model-support.md +655 -334
  17. package/docs/design/kv-cache.md +824 -0
  18. package/docs/design/orpo-training.md +673 -1239
  19. package/docs/design/speculative-decoding.md +1990 -0
  20. package/docs/design/turboquant.md +2212 -0
  21. package/docs/design/unified-engine-frontier-plan.md +1833 -727
  22. package/docs/design/web-chat-redesign.md +666 -1083
  23. package/docs/planning/PRODUCT_ROADMAP.md +50 -1
  24. package/docs/planning/release-notes-v0.4.0.md +45 -0
  25. package/docs/planning/video-series.md +2 -2
  26. package/docs/reference/benchmarks.md +3613 -0
  27. package/docs/reference/cli.md +434 -160
  28. package/docs/reference/distribution.md +328 -182
  29. package/docs/reference/environment.md +398 -0
  30. package/docs/reference/glossary.md +39 -0
  31. package/docs/reference/library-api.md +566 -168
  32. package/docs/reference/memory.md +227 -64
  33. package/docs/reference/models.md +113 -6
  34. package/docs/reference/server-api.md +944 -429
  35. package/docs/reference/server-config.md +740 -338
  36. package/docs/reference/training.md +393 -254
  37. package/docs/reference/troubleshooting.md +158 -0
  38. package/package.json +9 -4
  39. package/src/audio/decode.ts +2 -2
  40. package/src/audio/features.ts +2 -2
  41. package/src/backends/mlx/assistant-target.ts +46 -0
  42. package/src/backends/mlx/autoregressive-draft-rows.ts +120 -0
  43. package/src/backends/mlx/autoregressive.ts +108 -0
  44. package/src/backends/mlx/batch-group.ts +1790 -0
  45. package/src/backends/mlx/cache-attachment.ts +67 -0
  46. package/src/backends/mlx/cache-layout.ts +31 -0
  47. package/src/backends/mlx/checkpoint-state.ts +53 -0
  48. package/src/backends/mlx/continuation-persistence.ts +106 -0
  49. package/src/backends/mlx/continuation-request.ts +43 -0
  50. package/src/backends/mlx/continuation.ts +77 -0
  51. package/src/backends/mlx/diffusion.ts +39 -0
  52. package/src/backends/mlx/draft-target.ts +32 -0
  53. package/src/backends/mlx/evaluation.ts +105 -0
  54. package/src/backends/mlx/fill-append.ts +45 -0
  55. package/src/backends/mlx/full-kv-row-append.ts +32 -0
  56. package/src/backends/mlx/full-kv-row-donor.ts +54 -0
  57. package/src/backends/mlx/full-transitioning-kv-rows.ts +65 -0
  58. package/src/backends/mlx/gateway-binding.ts +130 -0
  59. package/src/backends/mlx/graph.ts +38 -0
  60. package/src/backends/mlx/kv-codec.ts +9 -0
  61. package/src/backends/mlx/kv-maintenance.ts +133 -0
  62. package/src/backends/mlx/kv-tensor-rows.ts +212 -0
  63. package/src/backends/mlx/memory-client.ts +189 -0
  64. package/src/backends/mlx/methods.ts +90 -0
  65. package/src/backends/mlx/model-prompt.ts +164 -0
  66. package/src/backends/mlx/model-serving.ts +79 -0
  67. package/src/backends/mlx/prefill-cohort.ts +89 -0
  68. package/src/backends/mlx/prefill-rows.ts +200 -0
  69. package/src/backends/mlx/prefill.ts +33 -0
  70. package/src/backends/mlx/projected-context-rows.ts +72 -0
  71. package/src/backends/mlx/request-policy.ts +20 -0
  72. package/src/backends/mlx/request-state-policy.ts +41 -0
  73. package/src/backends/mlx/rollback.ts +89 -0
  74. package/src/backends/mlx/row-sampling.ts +49 -0
  75. package/src/backends/mlx/serial-executor.ts +242 -0
  76. package/src/backends/mlx/speculative-group.ts +359 -0
  77. package/src/backends/mlx/speculative-round.ts +161 -0
  78. package/src/backends/mlx/speculative.ts +114 -0
  79. package/src/backends/mlx/state-rows.ts +104 -0
  80. package/src/backends/mlx/state-views.ts +46 -0
  81. package/src/backends/mlx/target-layout-capability.ts +35 -0
  82. package/src/backends/mlx/text-engine.ts +73 -0
  83. package/src/backends/mlx/transitioning-kv-rows.ts +165 -0
  84. package/src/cli.ts +66 -58
  85. package/src/client.ts +66 -0
  86. package/src/config.ts +21 -4
  87. package/src/contracts/completion.ts +16 -0
  88. package/src/contracts/execution.ts +60 -0
  89. package/src/contracts/generation.ts +103 -0
  90. package/src/contracts/host.ts +7 -0
  91. package/src/contracts/jobs.ts +66 -0
  92. package/src/contracts/pi-provider.ts +30 -0
  93. package/src/contracts/pi.ts +259 -0
  94. package/src/contracts/prefix-cache.ts +23 -0
  95. package/src/contracts/resources.ts +25 -0
  96. package/src/contracts/sampling.ts +23 -0
  97. package/src/contracts/scheduling.ts +45 -0
  98. package/src/contracts/tsconfig.json +14 -0
  99. package/src/diffusion/diffusion-generate.ts +218 -153
  100. package/src/embed.ts +1 -1
  101. package/src/engine/admission.ts +59 -0
  102. package/src/engine/cancellation.ts +38 -0
  103. package/src/engine/engine.ts +56 -0
  104. package/src/engine/execution-coordinator.ts +70 -0
  105. package/src/engine/execution-plan.ts +53 -0
  106. package/src/engine/resources.ts +53 -0
  107. package/src/engine/scheduler.ts +72 -0
  108. package/src/engine/session.ts +247 -0
  109. package/src/eval/README.md +44 -1
  110. package/src/eval/kl.ts +236 -3
  111. package/src/eval/reference-logits.ts +207 -0
  112. package/src/eval/runner.ts +8 -96
  113. package/src/fill/echo-index.ts +188 -0
  114. package/src/fill/fill-session.ts +452 -0
  115. package/src/fill/proposal.ts +68 -0
  116. package/src/fill/schema-rows.ts +506 -0
  117. package/src/fill/tool-boundary.ts +103 -0
  118. package/src/fit.ts +30 -16
  119. package/src/generate.ts +709 -417
  120. package/src/grammar.ts +12 -7
  121. package/src/harness-pi.ts +14 -33
  122. package/src/hub-rest.ts +4 -4
  123. package/src/index.ts +7 -0
  124. package/src/inference/denoising.ts +17 -0
  125. package/src/inference/draft-acceptance.ts +41 -0
  126. package/src/inference/draft-output.ts +49 -0
  127. package/src/inference/graph.ts +33 -0
  128. package/src/inference/prefill.ts +39 -0
  129. package/src/inference/rollback.ts +7 -0
  130. package/src/jobs/db.ts +4 -0
  131. package/src/jobs/index.ts +2 -0
  132. package/src/jobs/job-entry.ts +12 -12
  133. package/src/jobs/runner.ts +98 -13
  134. package/src/jobs/task-client.ts +19 -0
  135. package/src/jobs/types.ts +2 -58
  136. package/src/kv-scheme.ts +70 -12
  137. package/src/kv-store.ts +177 -63
  138. package/src/lab/README.md +18 -0
  139. package/src/{assets → lab/curve}/curve-designer.html +2 -2
  140. package/src/{curve-sampler.ts → lab/curve/curve-sampler.ts} +2 -2
  141. package/src/{expert-trace.ts → lab/expert-trace/expert-trace.ts} +5 -5
  142. package/src/lab/paged-kv/paged-kv-rows.ts +83 -0
  143. package/src/{model → lab/paged-kv}/paged-kv.ts +32 -15
  144. package/src/library.ts +40 -0
  145. package/src/lora.ts +18 -0
  146. package/src/media-fetch.ts +1 -1
  147. package/src/memory/article.ts +1 -1
  148. package/src/memory/chunk.ts +1 -1
  149. package/src/memory/model.ts +30 -169
  150. package/src/memory/prompts.ts +1 -1
  151. package/src/memory/rest.ts +1 -1
  152. package/src/memory/schedule.ts +1 -1
  153. package/src/memory/stages.ts +4 -1
  154. package/src/memory/vault.ts +1 -3
  155. package/src/mlx/array.ts +11 -11
  156. package/src/mlx/compile.ts +12 -2
  157. package/src/mlx/ffi.ts +58 -11
  158. package/src/mlx/materialize.ts +23 -0
  159. package/src/mlx/metal-kernel.ts +10 -11
  160. package/src/mlx/ops.ts +33 -13
  161. package/src/mlx/quantized-rows.ts +36 -0
  162. package/src/mlx/token-bitmask.ts +52 -0
  163. package/src/mlx/turboquant-kv-decode.ts +82 -0
  164. package/src/mlx/turboquant-kv-inverse.ts +122 -0
  165. package/src/mlx/turboquant-ops.ts +33 -3
  166. package/src/mlx/turboquant-tables.ts +2 -2
  167. package/src/model/artifact-identity.ts +73 -0
  168. package/src/model/batched-kv.ts +235 -0
  169. package/src/model/batched-mask.ts +20 -6
  170. package/src/model/batched-quant.ts +9 -3
  171. package/src/model/batched-quantized-kv.ts +144 -0
  172. package/src/model/batched-rotating-quant.ts +78 -17
  173. package/src/model/batched-rotating-state.ts +76 -0
  174. package/src/model/batched-rotating.ts +65 -23
  175. package/src/model/batched-row-storage.ts +52 -0
  176. package/src/model/batched-ssm.ts +52 -0
  177. package/src/model/batched-turboquant-kv.ts +93 -0
  178. package/src/model/compiled-decode.ts +8 -2
  179. package/src/model/decoded-kv-donor.ts +12 -0
  180. package/src/model/delayed-quantized-kv.ts +72 -0
  181. package/src/model/delayed-rotating-quantized-kv.ts +93 -0
  182. package/src/model/delayed-turboquant-kv.ts +55 -0
  183. package/src/model/diffusion-gemma.ts +8 -8
  184. package/src/model/factory.ts +76 -33
  185. package/src/model/fingerprint.ts +1 -1
  186. package/src/model/flash-attention.ts +3 -3
  187. package/src/model/full-prefill-padding.ts +56 -0
  188. package/src/model/full-prefill-row.ts +105 -0
  189. package/src/model/gemma4-base.ts +179 -80
  190. package/src/model/gemma4.ts +40 -32
  191. package/src/model/generated/gemma4-12b.ts +6 -3
  192. package/src/model/generated/gemma4-26b.ts +6 -3
  193. package/src/model/generated/gemma4-e4b.ts +6 -3
  194. package/src/model/glm52-cache.ts +80 -4
  195. package/src/model/glm52-dsa.ts +13 -9
  196. package/src/model/glm52-memory.ts +1 -1
  197. package/src/model/glm52-mla.ts +12 -6
  198. package/src/model/glm52.ts +19 -40
  199. package/src/model/implementation.ts +69 -0
  200. package/src/model/kv-attention-view.ts +67 -0
  201. package/src/model/minicpm5.ts +17 -15
  202. package/src/model/profile.ts +12 -2
  203. package/src/model/qwen-append.ts +12 -0
  204. package/src/model/qwen-conv.ts +52 -0
  205. package/src/model/qwen3-delta-state.ts +74 -0
  206. package/src/model/qwen3-delta.ts +59 -36
  207. package/src/model/qwen3_5-checkpoint.ts +164 -0
  208. package/src/model/qwen3_5.ts +202 -78
  209. package/src/model/rotating-kv-donor.ts +35 -0
  210. package/src/model/rotating-kv-layout.ts +262 -0
  211. package/src/model/rotating-row-transaction.ts +35 -0
  212. package/src/model/speculative-rotating-kv.ts +101 -0
  213. package/src/model/ssm-prefill-padding.ts +39 -0
  214. package/src/model/support.ts +1 -1
  215. package/src/model/trellis-balanced-scatter.ts +51 -0
  216. package/src/model/trellis-linear.ts +672 -0
  217. package/src/model/trellis-shared-m.ts +151 -0
  218. package/src/model/trellis-shared-scatter.ts +144 -0
  219. package/src/model/trellis-splitk-prefill.ts +158 -0
  220. package/src/model/trellis-tiled-prefill.ts +136 -0
  221. package/src/model/trellis-vector-expand.ts +62 -0
  222. package/src/model/trellis-wide-prefill.ts +94 -0
  223. package/src/model/turboquant-codec.ts +83 -0
  224. package/src/model/universal/dense.ts +15 -14
  225. package/src/model/universal/modules.ts +8 -1
  226. package/src/native-pack.ts +6 -5
  227. package/src/pi-provider.ts +6 -64
  228. package/src/pi-web.ts +8 -315
  229. package/src/preflight.ts +31 -15
  230. package/src/prompt-cache.ts +110 -69
  231. package/src/quantize/allocator.ts +1 -1
  232. package/src/quantize/config-writer.ts +10 -3
  233. package/src/quantize/rotate.ts +4 -4
  234. package/src/quantize/trellis.ts +586 -0
  235. package/src/responses.ts +28 -1
  236. package/src/runtime-config.ts +18 -4
  237. package/src/sampler.ts +40 -29
  238. package/src/serve/batch-scheduler.ts +8 -1671
  239. package/src/serve/chat-request.ts +391 -0
  240. package/src/serve/chat-stage.ts +195 -0
  241. package/src/serve/checkpoint-identity.ts +64 -0
  242. package/src/serve/completion-executor.ts +15 -7
  243. package/src/serve/discovery-routes.ts +12 -13
  244. package/src/serve/generation-gateway.ts +183 -213
  245. package/src/serve/http.ts +159 -0
  246. package/src/serve/inference-request.ts +79 -0
  247. package/src/serve/isolate.ts +297 -105
  248. package/src/serve/lab-routes.ts +3 -0
  249. package/src/serve/lane-registry.ts +2 -1
  250. package/src/serve/model-admin-routes.ts +7 -5
  251. package/src/serve/model-binding.ts +43 -0
  252. package/src/serve/model-host.ts +511 -0
  253. package/src/serve/openai-wire.ts +103 -0
  254. package/src/serve/parent-application.ts +56 -0
  255. package/src/serve/pipeline.ts +33 -0
  256. package/src/serve/preparation.ts +33 -0
  257. package/src/serve/request-plan.ts +23 -18
  258. package/src/serve/request-prep.ts +344 -0
  259. package/src/serve/response-lease.ts +24 -0
  260. package/src/serve/responses-client.ts +69 -0
  261. package/src/serve/session-completion-engine.ts +110 -0
  262. package/src/serve/session-search.ts +1 -1
  263. package/src/serve/static-routes.ts +5 -5
  264. package/src/serve/text-completion-stage.ts +104 -0
  265. package/src/serve/token-streams.ts +519 -0
  266. package/src/server.ts +335 -2711
  267. package/src/spec/assistant-rows.ts +92 -0
  268. package/src/spec/assistant-source.ts +31 -55
  269. package/src/spec/cache-identity.ts +22 -0
  270. package/src/spec/deepspec-rows.ts +29 -0
  271. package/src/spec/deepspec-source.ts +16 -14
  272. package/src/spec/dflash-source.ts +36 -12
  273. package/src/spec/drafter.ts +153 -142
  274. package/src/spec/dspark/ab-stats.ts +3 -3
  275. package/src/spec/dspark/calibration.ts +2 -2
  276. package/src/spec/dspark/deepspec-module.ts +97 -122
  277. package/src/spec/dspark/generate-dflash.ts +2 -2
  278. package/src/spec/dspark/generate.ts +2 -2
  279. package/src/spec/dspark/loader.ts +1 -1
  280. package/src/spec/dspark/module-dflash.ts +129 -172
  281. package/src/spec/dspark/module.ts +3 -3
  282. package/src/spec/dspark/quantize-drafter.ts +1 -1
  283. package/src/spec/generate.ts +1 -1
  284. package/src/spec/glm52-mtp-graph.ts +29 -0
  285. package/src/spec/glm52-mtp-rows.ts +132 -0
  286. package/src/spec/glm52-mtp-source.ts +54 -137
  287. package/src/spec/glm52-mtp-state.ts +33 -0
  288. package/src/spec/ngram-source.ts +93 -21
  289. package/src/spec/projected-draft-rows.ts +73 -0
  290. package/src/spec/qwen-mtp-module.ts +171 -0
  291. package/src/spec/qwen-mtp-rows.ts +219 -0
  292. package/src/spec/qwen-mtp-source.ts +147 -195
  293. package/src/spec/qwen-mtp-state.ts +30 -0
  294. package/src/spec/serve-loop.ts +201 -201
  295. package/src/spec/source.ts +110 -13
  296. package/src/spec/two-model-rows.ts +61 -0
  297. package/src/spec/two-model.ts +44 -102
  298. package/src/ssd-cache.ts +99 -19
  299. package/src/ssd-durability.ts +36 -20
  300. package/src/tool-call.ts +51 -14
  301. package/src/train/flash-cce.ts +2 -2
  302. package/src/train/forward.ts +6 -0
  303. package/src/train/loss.ts +1 -1
  304. package/src/train/prefix-shared.ts +5 -1
  305. package/src/train/segmented.ts +5 -3
  306. package/src/train/trainer.ts +6 -6
  307. package/src/vision/prompt.ts +1 -1
  308. package/src/vision/qwen3vl-tower.ts +52 -10
  309. package/src/web/app.html +1 -1
  310. package/src/web/app.js +62 -60
  311. package/src/web/src/adapters-panel.ts +3 -3
  312. package/src/web/src/assistant.ts +2 -36
  313. package/src/web/src/chat.ts +4 -4
  314. package/src/web/src/composer.ts +4 -4
  315. package/src/web/src/hub.ts +1 -1
  316. package/src/web/src/markdown.ts +0 -0
  317. package/src/web/src/memory-panel.ts +1 -1
  318. package/src/web/src/model-picker.ts +1 -1
  319. package/src/web/src/palette.ts +1 -1
  320. package/src/web/src/protocol.ts +3 -39
  321. package/src/web/src/sessions.ts +1 -1
  322. package/src/web/src/ui-catalog.ts +4 -18
  323. package/src/web-assets.ts +47 -0
  324. package/src/weights.ts +55 -9
  325. package/docs/archive/investigations/curve-runs/bisector-route.json +0 -98
  326. package/docs/archive/investigations/curve-runs/bisector-trace.json +0 -1393
  327. package/docs/archive/investigations/curve-runs/curve-terrain.json +0 -1179
  328. package/docs/archive/investigations/curve-runs/curve-terrain.svg +0 -42
  329. package/docs/archive/investigations/hlg-ab.html +0 -34
  330. package/docs/archive/investigations/hlg-explorer.html +0 -238
  331. package/docs/archive/investigations/hlg-figs/cliff.svg +0 -1
  332. package/docs/archive/investigations/hlg-figs/cross.svg +0 -1
  333. package/docs/archive/investigations/hlg-figs/edges.svg +0 -1
  334. package/docs/archive/investigations/hlg-figs/k20-grids.svg +0 -1
  335. package/docs/archive/investigations/hlg-figs/k20-peaks.svg +0 -1
  336. package/docs/archive/investigations/hlg-figs/lw-curve.svg +0 -1
  337. package/docs/archive/investigations/hlg-figs/terrain.svg +0 -1
  338. package/docs/archive/investigations/hlg-report.html +0 -262
  339. package/docs/archive/investigations/hlg-runs/hlg-ab.json +0 -149
  340. package/docs/archive/investigations/hlg-runs/hlg-blind-prompts.md +0 -87
  341. package/docs/archive/investigations/hlg-runs/hlg-blind.json +0 -107
  342. package/docs/archive/investigations/hlg-runs/hlg-cliff.json +0 -197
  343. package/docs/archive/investigations/hlg-runs/hlg-cross.json +0 -505
  344. package/docs/archive/investigations/hlg-runs/hlg-edge.json +0 -388
  345. package/docs/archive/investigations/hlg-runs/hlg-eval1.json +0 -25
  346. package/docs/archive/investigations/hlg-runs/hlg-frontier.json +0 -86
  347. package/docs/archive/investigations/hlg-runs/hlg-grid.json +0 -242
  348. package/docs/archive/investigations/hlg-runs/hlg-grid2.json +0 -343
  349. package/docs/archive/investigations/hlg-runs/hlg-lw-coarse.json +0 -110
  350. package/docs/archive/investigations/hlg-runs/hlg-map.json +0 -383
  351. package/docs/archive/investigations/hlg-runs/run0-original.log +0 -159
  352. package/docs/archive/investigations/hlg-runs/runA-recommended.log +0 -131
  353. package/docs/archive/investigations/hlg-runs/runAA-cliff-cpm5.log +0 -26
  354. package/docs/archive/investigations/hlg-runs/runAB-grid2-e4b.log +0 -18
  355. package/docs/archive/investigations/hlg-runs/runAC-peak-e4b-partial.log +0 -25
  356. package/docs/archive/investigations/hlg-runs/runAD-ab-samples.log +0 -8
  357. package/docs/archive/investigations/hlg-runs/runAE-edge-e4b.log +0 -51
  358. package/docs/archive/investigations/hlg-runs/runAF-logit-calibration.log +0 -10
  359. package/docs/archive/investigations/hlg-runs/runAG-eval-config2.log +0 -16
  360. package/docs/archive/investigations/hlg-runs/runB-gain-variants.log +0 -192
  361. package/docs/archive/investigations/hlg-runs/runC-pivots.log +0 -162
  362. package/docs/archive/investigations/hlg-runs/runD-oetf.log +0 -132
  363. package/docs/archive/investigations/hlg-runs/runE-eotf.log +0 -162
  364. package/docs/archive/investigations/hlg-runs/runF-shaper-working.log +0 -86
  365. package/docs/archive/investigations/hlg-runs/runG-shaper-sweep.log +0 -101
  366. package/docs/archive/investigations/hlg-runs/runH-wsweep.log +0 -176
  367. package/docs/archive/investigations/hlg-runs/runI-asweep.log +0 -176
  368. package/docs/archive/investigations/hlg-runs/runJ-knobmap.log +0 -49
  369. package/docs/archive/investigations/hlg-runs/runK-frontier.log +0 -19
  370. package/docs/archive/investigations/hlg-runs/runL-widemap.log +0 -65
  371. package/docs/archive/investigations/hlg-runs/runM-frontier-emb.log +0 -15
  372. package/docs/archive/investigations/hlg-runs/runN-verify.log +0 -116
  373. package/docs/archive/investigations/hlg-runs/runO-frontier-seed5000.log +0 -15
  374. package/docs/archive/investigations/hlg-runs/runP-grid-AxSm.log +0 -15
  375. package/docs/archive/investigations/hlg-runs/runQ-grid-tgW.log +0 -15
  376. package/docs/archive/investigations/hlg-runs/runR-blind-transcript.log +0 -79
  377. package/docs/archive/investigations/hlg-runs/runS-cross-coherence.log +0 -33
  378. package/docs/archive/investigations/hlg-runs/runT-cross-cpm5.log +0 -33
  379. package/docs/archive/investigations/hlg-runs/runU-cross-12b.log +0 -33
  380. package/docs/archive/investigations/hlg-runs/runV-lw-e4b.log +0 -22
  381. package/docs/archive/investigations/hlg-runs/runW-lw-12b.log +0 -22
  382. package/docs/archive/investigations/hlg-runs/runX-lw-cpm5.log +0 -22
  383. package/docs/archive/investigations/hlg-runs/runY-cliff-e4b.log +0 -26
  384. package/docs/archive/investigations/hlg-runs/runZ-cliff-12b.log +0 -26
  385. package/docs/archive/mlx-bun-lab-report.html +0 -275
  386. package/docs/archive/wwdc-mlx-bun.html +0 -848
  387. package/docs/design/adapters-end-to-end.md +0 -205
  388. package/docs/design/batching-perf-path.md +0 -255
  389. package/docs/design/batching-v2-plan.md +0 -529
  390. package/docs/design/bucketing-stage.md +0 -197
  391. package/docs/design/compat-cli-surface-design.md +0 -230
  392. package/docs/design/docs-reorg-plan.md +0 -165
  393. package/docs/design/dspark-serving-program.md +0 -371
  394. package/docs/design/dspark-speculative-decoding.md +0 -318
  395. package/docs/design/grammar-spec-batching-integration.md +0 -301
  396. package/docs/design/memory-inference-path.md +0 -422
  397. package/docs/design/memory-synthesis.md +0 -287
  398. package/docs/design/memory-system.md +0 -237
  399. package/docs/design/mlx-lm-serving-execution-seam.md +0 -81
  400. package/docs/design/mlx-lm-tool-parity-plan.md +0 -545
  401. package/docs/design/omlx-adoption-map.md +0 -98
  402. package/docs/design/orpo-dynamic-lambda.md +0 -220
  403. package/docs/design/orpo-future-enhancements.md +0 -340
  404. package/docs/design/paged-kv-cache.md +0 -214
  405. package/docs/design/parallel-slots.md +0 -567
  406. package/docs/design/parity-tier-dag.md +0 -161
  407. package/docs/design/repo-cleanup-plan.md +0 -231
  408. package/docs/design/runtime-isolation.md +0 -263
  409. package/docs/design/segmented-backward-training.md +0 -543
  410. package/docs/design/spec-decode-larger-targets.md +0 -229
  411. package/docs/design/ssd-kv-cold-tier.md +0 -415
  412. package/docs/design/structured-output.md +0 -484
  413. package/docs/design/tauri-desktop-app.md +0 -127
  414. package/docs/design/the-dreaming-master-plan.md +0 -445
  415. package/docs/design/turboquant-kv.md +0 -235
  416. package/docs/design/turboquant-weights.md +0 -467
  417. package/docs/design/w4a16-compute-precision-spike.md +0 -232
  418. package/docs/design/web-chat-beat-matrix.md +0 -315
  419. package/docs/design/write-pipeline-entity.md +0 -468
  420. package/docs/planning/IDEAS.md +0 -69
  421. package/docs/reference/embedding.md +0 -197
  422. package/docs/reference/features-matrix.md +0 -101
  423. package/docs/reference/orpo-quickstart.md +0 -135
  424. package/src/flags.ts +0 -11
  425. /package/docs/{design → archive/investigations}/colibri-glm52-port.md +0 -0
  426. /package/docs/{planning → archive/planning}/chunk-task-roadmap.md +0 -0
  427. /package/docs/{planning → archive/planning}/curve-sampler-research-plan.md +0 -0
  428. /package/docs/{planning → archive/planning}/memory-docs-and-dag-plan.md +0 -0
  429. /package/docs/{planning → archive/planning}/pi-integration-review.md +0 -0
  430. /package/docs/{planning → archive/planning}/release-notes-v0.2.0.md +0 -0
  431. /package/src/{memory-plan.ts → admission-plan.ts} +0 -0
  432. /package/{docs/archive/investigations → src/serve/assets}/curve-terrain.html +0 -0
  433. /package/{docs/dag → src/serve/assets}/training-inference-map.html +0 -0
@@ -38,7 +38,7 @@ function disposing(old: MlxArray, next: MlxArray): MlxArray {
38
38
  // ---------------------------------------------------------------------------
39
39
  // Weight representation: every matmul weight and gather table loads as either
40
40
  // bf16 (the released checkpoint) or affine-quantized (a
41
- // scripts/dspark-quantize-drafter.ts sibling). Detection is the house
41
+ // scripts/dspark.ts quantize sibling). Detection is the house
42
42
  // pattern — a `.scales` sibling key marks a quantized module; bits/group_size
43
43
  // come from the config's `quantization` block (per-module overrides + the
44
44
  // mlx `false` = kept-full-precision convention). Both formats flow through
@@ -215,6 +215,23 @@ export interface ContextKV {
215
215
  v: MlxArray; // [1, nKvHeads, ctxLen, headDim] (v ≡ k when attention_k_eq_v)
216
216
  }
217
217
 
218
+ /** Storage owns context validity; the graph supplies only Q and new block KV. */
219
+ export interface DeepspecContextAttention {
220
+ attend(layer: number, query: MlxArray, blockKeys: MlxArray, blockValues: MlxArray): MlxArray;
221
+ }
222
+ export function plainDeepspecContext(context: readonly ContextKV[]): DeepspecContextAttention {
223
+ return { attend(layer, query, blockKeys, blockValues) {
224
+ using keys = ops.concatAxis([context[layer]!.k, blockKeys], 2);
225
+ using values = ops.concatAxis([context[layer]!.v, blockValues], 2);
226
+ return ops.sdpa(query, keys, values, 1, "", null);
227
+ } };
228
+ }
229
+ export interface DraftRowsResult {
230
+ tokens: number[][];
231
+ conf: number[][];
232
+ baseLogits?: MlxArray;
233
+ }
234
+
218
235
  export interface DraftBlockResult {
219
236
  /** Sequentially-sampled draft tokens, length 0..gamma (0 iff confidence
220
237
  * truncation fires at the very first position — EMPTY proposal). */
@@ -273,8 +290,8 @@ export class DeepspecDrafter {
273
290
  this.embedScale = Math.sqrt(cfg.hidden_size);
274
291
 
275
292
  const T = (name: string) => w.tensor(name);
276
- // Lazy transpose VIEW — no contiguous copy. The src/spec/drafter.ts
277
- // pattern (contiguous + eval) would materialize every matmul weight a
293
+ // Lazy transpose VIEW — no contiguous copy. Materializing would store
294
+ // every matmul weight a
278
295
  // second time: on the real 6.86 GB checkpoint that's ~+4.8 GB resident
279
296
  // (lm_head alone ~2 GB), decisive on a 24 GB box. mlx's steel GEMM
280
297
  // dispatches a transposed-B operand natively, so the view costs nothing
@@ -366,7 +383,7 @@ export class DeepspecDrafter {
366
383
  static async load(dir: string): Promise<DeepspecDrafter> {
367
384
  const raw = (await Bun.file(`${dir}/config.json`).json()) as Record<string, any>;
368
385
  const cfg = readConfig(raw);
369
- // Quantized siblings (scripts/dspark-quantize-drafter.ts) carry the house
386
+ // Quantized siblings (scripts/dspark.ts quantize) carry the house
370
387
  // quantization block; the released bf16 checkpoint has none → null.
371
388
  const quant = parseQuantization(raw.quantization ?? raw.quantization_config);
372
389
  const w = await Weights.open(dir);
@@ -450,13 +467,18 @@ export class DeepspecDrafter {
450
467
  * concat-then-scale-less-norm, over k_proj's output — v gets NO rope).
451
468
  */
452
469
  projectContextKV(contextHidden: MlxArray, positions: number[]): ContextKV[] {
453
- const L = contextHidden.shape[1]!;
454
- if (positions.length !== L)
455
- throw new Error(`projectContextKV: ${positions.length} positions for ${L} context rows`);
470
+ if (positions.length !== contextHidden.shape[1])
471
+ throw new Error(`projectContextKV: ${positions.length} positions for ${contextHidden.shape[1]} context rows`);
472
+ assertContiguous(positions);
473
+ return this.projectContextKVRows(contextHidden, positions[0]!);
474
+ }
475
+
476
+ projectContextKVRows(contextHidden: MlxArray, position: number | MlxArray): ContextKV[] {
477
+ const B = contextHidden.shape[0]!, L = contextHidden.shape[1]!;
456
478
  const out: ContextKV[] = [];
457
479
  for (const layer of this.#layers) {
458
480
  const kFlat = matmulW(contextHidden, layer.kProj); // [1,L,nKvHeads*headDim]
459
- const k4 = ops.reshape(kFlat, [1, L, this.nKvHeads, this.headDim]);
481
+ const k4 = ops.reshape(kFlat, [B, L, this.nKvHeads, this.headDim]);
460
482
  kFlat.dispose();
461
483
  // v ≡ k pre-norm (attention_k_eq_v: v_ctx = k_ctx, same tensor before
462
484
  // the two norms diverge — v_norm has no weight).
@@ -469,14 +491,9 @@ export class DeepspecDrafter {
469
491
  const vT = ops.transposeAxes(vNormed, [0, 2, 1, 3]);
470
492
  vNormed.dispose();
471
493
 
472
- // RoPE over context rows at their absolute positions. mx.fast.rope's
473
- // static `offset` assumes contiguous positions starting at offset; our
474
- // context rows ARE contiguous (0..L-1 by construction — the taps are
475
- // read at the same prompt/verified positions every round), so a single
476
- // rope(offset=positions[0]) call matches apply_gemma4_rotary_pos_emb
477
- // row-for-row. Guard the assumption explicitly.
478
- assertContiguous(positions);
479
- const kRoped = ops.rope(kT, this.headDim, null, positions[0]!, this.ropeFreqs);
494
+ const kRoped = typeof position === "number"
495
+ ? ops.rope(kT, this.headDim, null, position, this.ropeFreqs)
496
+ : ops.ropeDynamic(kT, this.headDim, null, position, this.ropeFreqs);
480
497
  kT.dispose();
481
498
  out.push({ k: kRoped, v: vT });
482
499
  }
@@ -489,22 +506,19 @@ export class DeepspecDrafter {
489
506
  * transcribed inline per-layer below. Non-causal SDPA (scale=1.0) over
490
507
  * [ctx rows ++ block rows]; q uses only the block's own positions.
491
508
  *
492
- * blockIds: token ids for the noise block, length gamma — [anchor, MASK,
509
+ * blockIds: token ids for each noise block, shape [B, gamma] — [anchor, MASK,
493
510
  * MASK, ..., MASK] (create_noise_embed: only position 0 gets the real
494
511
  * anchor token when block_keep_mask; MASK elsewhere — at inference every
495
512
  * anchor is "kept" so this is always [anchor, mask_token_id × (γ-1)]).
496
- * blockPositions: absolute positions for the γ block rows (contiguous,
497
- * anchorPos..anchorPos+γ-1 — create_position_ids's per-block arange).
513
+ * position: each row's initial absolute position. RoPE advances contiguous
514
+ * positions within the block.
498
515
  */
499
- #forwardBackbone(ctxKV: ContextKV[], blockIds: number[], blockPositions: number[]): MlxArray {
500
- const G = blockIds.length;
501
- assertContiguous(blockPositions);
502
- const idsArr = ops.fromInt32(blockIds, [1, G]);
503
- const idsU32 = idsArr.astype(Dtype.uint32);
504
- idsArr.dispose();
516
+ #forwardBackbone(context: DeepspecContextAttention, blockIds: MlxArray, position: number | MlxArray): MlxArray {
517
+ const B = blockIds.shape[0]!, G = blockIds.shape[1]!;
518
+ const idsU32 = blockIds.astype(Dtype.uint32);
505
519
  const embRaw = gatherW(this.#embed, idsU32); // [1,G,hidden] (gather over vocab axis)
506
520
  idsU32.dispose();
507
- const embFlat = ops.reshape(embRaw, [1, G, this.hidden]);
521
+ const embFlat = ops.reshape(embRaw, [B, G, this.hidden]);
508
522
  embRaw.dispose();
509
523
  // Gemma4TextScaledWordEmbedding.forward: embed(ids) * embed_scale
510
524
  let h = ops.mulScalar(embFlat, this.embedScale);
@@ -512,31 +526,30 @@ export class DeepspecDrafter {
512
526
 
513
527
  for (let li = 0; li < this.#layers.length; li++) {
514
528
  const layer = this.#layers[li]!;
515
- const { k: kCtx, v: vCtx } = ctxKV[li]!;
516
- const ctxLen = kCtx.shape[2]!;
517
529
 
518
530
  const residual = h;
519
531
  const x = this.#rms(h, layer.inputNorm);
520
532
 
521
533
  // q = q_norm(q_proj(x).view(B,q_len,nHeads,headDim)).transpose(1,2)
522
534
  const qFlat = matmulW(x, layer.qProj); // [1,G,nHeads*headDim]
523
- const q4 = ops.reshape(qFlat, [1, G, this.nHeads, this.headDim]);
535
+ const q4 = ops.reshape(qFlat, [B, G, this.nHeads, this.headDim]);
524
536
  qFlat.dispose();
525
537
  const qNormed = this.#rms(q4, layer.qNorm);
526
538
  q4.dispose();
527
539
  const qT = ops.transposeAxes(qNormed, [0, 2, 1, 3]); // [1,nHeads,G,headDim]
528
540
  qNormed.dispose();
529
541
  // rope on q uses the LAST q_len positions (cos[:, -q_len:, :]) — here
530
- // q_len == G == the whole block, so "last q_len" is just the block's
531
- // own positions, contiguous from blockPositions[0].
532
- const qRoped = ops.rope(qT, this.headDim, null, blockPositions[0]!, this.ropeFreqs);
542
+ // q_len == G == the whole block, starting at each row's position.
543
+ const qRoped = typeof position === "number"
544
+ ? ops.rope(qT, this.headDim, null, position, this.ropeFreqs)
545
+ : ops.ropeDynamic(qT, this.headDim, null, position, this.ropeFreqs);
533
546
  qT.dispose();
534
547
 
535
548
  // k_noise = k_proj(x); norm+rope IDENTICALLY to the cached context
536
549
  // rows (concat-then-norm == norm-then-concat per the RMSNorm argument
537
550
  // in projectContextKV's doc comment).
538
551
  const kNoiseFlat = matmulW(x, layer.kProj);
539
- const kNoise4 = ops.reshape(kNoiseFlat, [1, G, this.nKvHeads, this.headDim]);
552
+ const kNoise4 = ops.reshape(kNoiseFlat, [B, G, this.nKvHeads, this.headDim]);
540
553
  kNoiseFlat.dispose();
541
554
  const vNoiseNormed = this.#rms(kNoise4, null);
542
555
  const kNoiseNormed = this.#rms(kNoise4, layer.kNorm);
@@ -545,26 +558,18 @@ export class DeepspecDrafter {
545
558
  kNoiseNormed.dispose();
546
559
  const vNoiseT = ops.transposeAxes(vNoiseNormed, [0, 2, 1, 3]);
547
560
  vNoiseNormed.dispose();
548
- const kNoiseRoped = ops.rope(kNoiseT, this.headDim, null, blockPositions[0]!, this.ropeFreqs);
561
+ const kNoiseRoped = typeof position === "number"
562
+ ? ops.rope(kNoiseT, this.headDim, null, position, this.ropeFreqs)
563
+ : ops.ropeDynamic(kNoiseT, this.headDim, null, position, this.ropeFreqs);
549
564
  kNoiseT.dispose();
550
565
  x.dispose();
551
566
 
552
- // k = cat([k_ctx, k_noise], dim=seq); v = cat([v_ctx, v_noise], dim=seq)
553
- const kFull = ops.concatAxis([kCtx, kNoiseRoped], 2); // [1,nKvHeads,ctxLen+G,headDim]
554
- kNoiseRoped.dispose();
555
- const vFull = ops.concatAxis([vCtx, vNoiseT], 2);
556
- vNoiseT.dispose();
557
-
558
- // non-causal SDPA, scale=1.0 (QK-norm replaces the usual 1/sqrt(d))
559
- const attnOut = ops.sdpa(qRoped, kFull, vFull, 1.0, "", null);
560
- qRoped.dispose();
561
- kFull.dispose();
562
- vFull.dispose();
563
- void ctxLen;
567
+ const attnOut = context.attend(li, qRoped, kNoiseRoped, vNoiseT);
568
+ qRoped.dispose(); kNoiseRoped.dispose(); vNoiseT.dispose();
564
569
 
565
570
  const attnT = ops.transposeAxes(attnOut, [0, 2, 1, 3]); // [1,G,nHeads,headDim]
566
571
  attnOut.dispose();
567
- const attnFlat = ops.reshape(attnT, [1, G, this.nHeads * this.headDim]);
572
+ const attnFlat = ops.reshape(attnT, [B, G, this.nHeads * this.headDim]);
568
573
  attnT.dispose();
569
574
  let attn = matmulW(attnFlat, layer.oProj);
570
575
  attnFlat.dispose();
@@ -613,12 +618,10 @@ export class DeepspecDrafter {
613
618
  * bf16 `logits + bias` sum, and softcapped logits in [-30,30] have bf16
614
619
  * steps ~0.125-0.25, so an f32 sum here reorders near-ties vs torch and
615
620
  * derails the sequential block (2026-07-06 port review, fidelity fix). */
616
- #markovStepBias(prevTok: number): MlxArray {
621
+ #markovStepBias(previous: MlxArray): MlxArray {
617
622
  if (!this.#markovW1 || !this.#markovW2)
618
623
  throw new Error("markovStepBias: markov_rank == 0 (no markov head)");
619
- const idxArr = ops.fromInt32([prevTok], [1]);
620
- const idxU32 = idxArr.astype(Dtype.uint32);
621
- idxArr.dispose();
624
+ const idxU32 = previous.astype(Dtype.uint32);
622
625
  const e1 = gatherW(this.#markovW1, idxU32); // [1,rank]
623
626
  idxU32.dispose();
624
627
  const bias = matmulW(e1, this.#markovW2); // [1,vocab], model dtype
@@ -631,16 +634,14 @@ export class DeepspecDrafter {
631
634
  * is nn.Linear(confDim,1) — proj.weight is [1,confDim]; we compute
632
635
  * features @ proj.weight^T + bias without transposing storage (row-vector
633
636
  * dot via matmul against a [confDim,1] view). */
634
- #confidence(h1: MlxArray, prevTok: number): number {
637
+ #confidence(h1: MlxArray, previous: MlxArray): MlxArray {
635
638
  if (!this.#confProj || !this.#confB)
636
639
  throw new Error("confidence: confidence head disabled");
637
640
  let feat = h1;
638
641
  let ownFeat = false;
639
642
  if (this.cfg.confidence_head_with_markov) {
640
643
  if (!this.#markovW1) throw new Error("confidence_head_with_markov requires markov_rank > 0");
641
- const idxArr = ops.fromInt32([prevTok], [1]);
642
- const idxU32 = idxArr.astype(Dtype.uint32);
643
- idxArr.dispose();
644
+ const idxU32 = previous.astype(Dtype.uint32);
644
645
  const e1 = gatherW(this.#markovW1, idxU32); // [1,rank]
645
646
  idxU32.dispose();
646
647
  const e1f = e1.dtype === h1.dtype ? e1 : disposing(e1, e1.astype(h1.dtype));
@@ -659,9 +660,7 @@ export class DeepspecDrafter {
659
660
  z = disposing(z, ops.add(z, this.#confB));
660
661
  if (z.dtype !== Dtype.float32) z = disposing(z, z.astype(Dtype.float32));
661
662
  z = disposing(z, ops.sigmoid(z));
662
- const v = z.toFloat32()[0]!;
663
- z.dispose();
664
- return v;
663
+ return z;
665
664
  }
666
665
 
667
666
  /**
@@ -701,73 +700,49 @@ export class DeepspecDrafter {
701
700
  * anchorPos: its absolute sequence position (blockPositions[0]).
702
701
  */
703
702
  draftBlock(ctxKV: ContextKV[], anchorTok: number, anchorPos: number): DraftBlockResult {
704
- const G = this.gamma;
705
- const V = this.cfg.vocab_size;
706
- const blockIds = [anchorTok, ...Array(G - 1).fill(this.cfg.mask_token_id)];
707
- const blockPositions = Array.from({ length: G }, (_, i) => anchorPos + i);
708
-
709
- const h = this.#forwardBackbone(ctxKV, blockIds, blockPositions); // [1,G,hidden]
710
- const baseLogitsRaw = this.#computeLogits(h); // [1,G,vocab], softcapped, model dtype
711
-
712
- // Pass 1: sequential Markov-biased argmax sampling over the FULL block —
713
- // in MODEL dtype end to end (reference precision: modeling.py
714
- // compute_logits → apply_step_logits → sample_tokens all run bf16; the
715
- // argmax is over the bf16 sum. f32 here reordered near-ties vs torch —
716
- // 2026-07-06 port review, fidelity fix).
717
- const sampledTokens: number[] = [];
718
- let prevTok = anchorTok;
719
- for (let k = 0; k < G; k++) {
720
- const base1 = baseLogitsRaw.slice([0, k, 0], [1, k + 1, V]);
721
- const baseFlat = ops.reshape(base1, [1, V]);
722
- base1.dispose();
723
- let stepLogits = baseFlat;
724
- if (this.#markovW1) {
725
- const bias = this.#markovStepBias(prevTok); // [1,V], model dtype
726
- stepLogits = ops.add(baseFlat, bias);
727
- baseFlat.dispose();
728
- bias.dispose();
729
- }
730
- const am = ops.argmaxAxis(stepLogits, -1);
731
- const tok = ops.itemUint32(am);
732
- am.dispose();
733
- stepLogits.dispose();
734
- sampledTokens.push(tok);
735
- prevTok = tok;
736
- }
703
+ const result = this.draftRows(plainDeepspecContext(ctxKV), [anchorTok], anchorPos, true);
704
+ return { tokens: result.tokens[0]!, conf: result.conf[0]!, baseLogits: result.baseLogits! };
705
+ }
737
706
 
738
- // The returned artifact is an f32 COPY (callers read/compare host-side);
739
- // sampling above never touches it.
740
- const baseLogits =
741
- baseLogitsRaw.dtype === Dtype.float32 ? baseLogitsRaw : disposing(baseLogitsRaw, baseLogitsRaw.astype(Dtype.float32));
742
-
743
- // Pass 2: confidence over the full block, prev_token_ids = [anchor,
744
- // sampled[:-1]] (_predict_confidence_logits) — independent of pass 1's
745
- // truncation decision, computed for every position.
746
- let proposalLen = G;
747
- if (this.#confProj) {
748
- const confVals: number[] = [];
749
- let confPrev = anchorTok;
750
- for (let k = 0; k < G; k++) {
751
- const h1 = h.slice([0, k, 0], [1, k + 1, this.hidden]);
752
- const h1Flat = ops.reshape(h1, [1, this.hidden]);
753
- h1.dispose();
754
- const cVal = this.#confidence(h1Flat, confPrev);
755
- h1Flat.dispose();
756
- confVals.push(cVal);
757
- confPrev = sampledTokens[k]!;
707
+ /** The graph and sequential proposal head run at the active row count.
708
+ * Confidence selects each row's length after the full device chain. */
709
+ draftRows(context: DeepspecContextAttention, anchors: readonly number[], position: number | MlxArray,
710
+ collectLogits = false): DraftRowsResult {
711
+ const B = anchors.length, G = this.gamma, V = this.cfg.vocab_size;
712
+ using ids = ops.fromInt32(anchors.flatMap(anchor => [anchor, ...Array(G - 1).fill(this.cfg.mask_token_id)]), [B, G]);
713
+ using hidden = this.#forwardBackbone(context, ids, position);
714
+ using base = this.#computeLogits(hidden);
715
+ using anchorIds = ops.fromInt32([...anchors], [B]);
716
+ const sampled: MlxArray[] = [], confidence: MlxArray[] = [];
717
+ let previous = anchorIds;
718
+ try {
719
+ for (let step = 0; step < G; step++) {
720
+ using row = base.slice([0, step, 0], [B, step + 1, V]);
721
+ using logits = ops.reshape(row, [B, V]);
722
+ using bias = this.#markovW1 ? this.#markovStepBias(previous) : null;
723
+ using corrected = bias ? ops.add(logits, bias) : null;
724
+ const token = ops.argmaxAxis(corrected ?? logits, -1);
725
+ sampled.push(token); previous = token;
758
726
  }
759
- if (this.cfg.confidence_threshold > 0) {
760
- const idx = confVals.findIndex((c) => c < this.cfg.confidence_threshold);
761
- proposalLen = idx === -1 ? G : idx;
727
+ // Serving does not consume confidence when truncation is disabled.
728
+ if (this.#confProj && (collectLogits || this.cfg.confidence_threshold > 0)) for (let step = 0; step < G; step++) {
729
+ using row = hidden.slice([0, step, 0], [B, step + 1, this.hidden]);
730
+ using flat = ops.reshape(row, [B, this.hidden]);
731
+ confidence.push(this.#confidence(flat, step ? sampled[step - 1]! : anchorIds));
762
732
  }
763
- const tokens = sampledTokens.slice(0, proposalLen);
764
- const conf = confVals.slice(0, proposalLen);
765
- h.dispose();
766
- return { tokens, conf, baseLogits };
767
- }
768
-
769
- h.dispose();
770
- return { tokens: sampledTokens, conf: [], baseLogits };
733
+ using packed = ops.concatAxis(sampled, 0);
734
+ const tokens = packed.toIntTokens();
735
+ using packedConfidence = confidence.length ? ops.concatAxis(confidence, 0) : null;
736
+ const conf = packedConfidence?.toFloat32();
737
+ const rows = anchors.map((_, row) => {
738
+ const values = conf ? Array.from({ length: G }, (_, step) => conf[step * B + row]!) : [];
739
+ const below = this.cfg.confidence_threshold > 0 ? values.findIndex(value => value < this.cfg.confidence_threshold) : -1;
740
+ const length = below < 0 ? G : below;
741
+ return { tokens: Array.from({ length }, (_, step) => tokens[step * B + row]!), conf: values.slice(0, length) };
742
+ });
743
+ return { tokens: rows.map(row => row.tokens), conf: rows.map(row => row.conf),
744
+ ...(collectLogits ? { baseLogits: base.astype(Dtype.float32) } : {}) };
745
+ } finally { for (const array of [...sampled, ...confidence]) array.dispose(); }
771
746
  }
772
747
 
773
748
  dispose(): void {
@@ -27,7 +27,7 @@ export interface DflashGenOptions {
27
27
  * minConf for a uniform manual override; pass thresholds:[] to disable. */
28
28
  thresholds?: number[];
29
29
  minConf?: number;
30
- /** Calibration hook (scripts/dspark-calibrate.ts): called once per draft
30
+ /** Calibration hook (scripts/dspark.ts calibrate): called once per draft
31
31
  * round with that round's per-position (confidence, accepted) samples,
32
32
  * AFTER kAccept is known. Not used by ordinary decode. */
33
33
  onRound?: (samples: ConfSample[]) => void;
@@ -192,7 +192,7 @@ export function dflashGenerate(model: Gemma4Model, drafter: DflashDrafter, promp
192
192
  blockLogits = null;
193
193
  stats.accepted += kAccept; rounds++; acceptLenSum += kAccept + 1;
194
194
 
195
- // Calibration hook (scripts/dspark-calibrate.ts): report this round's
195
+ // Calibration hook (scripts/dspark.ts calibrate): report this round's
196
196
  // per-position (confidence, accepted) outcomes now that kAccept is known.
197
197
  if (options.onRound) {
198
198
  const roundSamples: ConfSample[] = [];
@@ -17,9 +17,9 @@
17
17
  // (sample.ts), so the emitted stream is distributed exactly as if e4b
18
18
  // sampled token-by-token at that temperature — independent of draft quality.
19
19
  //
20
- // Verify the corresponding gate before chasing τ (scripts/dspark-ab.ts): greedy
20
+ // Verify the corresponding gate before chasing τ (dspark-ab.ts (deleted 2026-08-23; git history)): greedy
21
21
  // output must match model.generate; the sampling rule's correctness is the
22
- // statistical "emit distribution == target" check in scripts/dspark-smoke.ts.
22
+ // statistical "emit distribution == target" check in dspark-smoke.ts (deleted 2026-08-23; git history).
23
23
  // If a gate fails, the accept/reject or KV rollback is wrong — fix that first.
24
24
 
25
25
  import { MlxArray } from "../../mlx/array";
@@ -18,6 +18,6 @@ export function loadDsparkDrafter(dir: string): DflashDrafter {
18
18
  if (meta.variant === "dspark" || meta.variant === "dflash") return DflashDrafter.load(dir);
19
19
  throw new Error(
20
20
  `${dir} is a v1 single-vector DSpark checkpoint (variant=${meta.variant ?? "none"}) — ` +
21
- `superseded, not serveable; retrain with scripts/dspark-train-dflash.ts`,
21
+ `superseded, not serveable; retrain with scripts/dspark.ts train`,
22
22
  );
23
23
  }