mlx-bun 0.4.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (601) hide show
  1. package/README.md +1453 -88
  2. package/THIRD_PARTY_NOTICES.md +882 -0
  3. package/bin/mlx-bun.convert.mjs +4 -0
  4. package/bin/mlx-bun.fuse.mjs +4 -0
  5. package/bin/mlx-bun.generate.mjs +4 -0
  6. package/bin/mlx-bun.lora.mjs +4 -0
  7. package/bin/mlx-bun.mjs +13 -21
  8. package/bin/mlx-bun.server.mjs +4 -0
  9. package/bin/mlx-bun.upload.mjs +4 -0
  10. package/dist/web/app.js +9584 -0
  11. package/package.json +50 -53
  12. package/src/cli/ane-install.ts +76 -0
  13. package/src/cli/args.ts +179 -0
  14. package/src/cli/engine-entry.ts +68 -0
  15. package/src/cli/inference.ts +214 -0
  16. package/src/cli/job-entry.ts +97 -0
  17. package/src/cli/library-host.ts +117 -0
  18. package/src/cli/main.ts +57 -0
  19. package/src/cli/memory-engine.ts +163 -0
  20. package/src/cli/memory.ts +36 -0
  21. package/src/cli/mlx-lm-aliases.ts +309 -0
  22. package/src/cli/model-choice.ts +33 -0
  23. package/src/cli/model-selection.ts +84 -0
  24. package/src/cli/module-host.ts +11 -0
  25. package/src/cli/module-verbs.ts +50 -0
  26. package/src/cli/numerical-policy.ts +12 -0
  27. package/src/cli/perplexity.ts +89 -0
  28. package/src/cli/serve-host.ts +423 -0
  29. package/src/cli/serve-isolated.ts +217 -0
  30. package/src/cli/serve-options.ts +106 -0
  31. package/src/cli/serve-state.ts +205 -0
  32. package/src/cli/serve.ts +500 -0
  33. package/src/cli/served-model-host.ts +102 -0
  34. package/src/cli/server-entry.ts +148 -0
  35. package/src/cli/serving-unit.ts +177 -0
  36. package/src/{tui.ts → cli/terminal.ts} +13 -8
  37. package/src/cli/worker-adapters.ts +34 -0
  38. package/src/cli/worker-entry.ts +272 -0
  39. package/src/cli/worker-unit.ts +179 -0
  40. package/src/engine/adapter-operation.ts +26 -0
  41. package/src/engine/cache-services.ts +114 -0
  42. package/src/engine/completion.ts +39 -0
  43. package/src/engine/generation-gateway.ts +358 -0
  44. package/src/engine/index.ts +59 -0
  45. package/src/engine/kv-budget.ts +120 -0
  46. package/src/engine/media-preparation.ts +232 -0
  47. package/src/engine/model-binding.ts +24 -0
  48. package/src/engine/model-host.ts +513 -0
  49. package/src/engine/model-serving.ts +89 -0
  50. package/src/{serve → engine}/preparation.ts +10 -8
  51. package/src/{serve → engine}/session-completion-engine.ts +6 -6
  52. package/src/engine/telemetry.ts +109 -0
  53. package/src/hub/downloads.ts +116 -0
  54. package/src/jobs/db.ts +16 -7
  55. package/src/jobs/events.ts +29 -0
  56. package/src/jobs/executable.ts +5 -0
  57. package/src/jobs/host.ts +51 -0
  58. package/src/jobs/in-process.ts +55 -0
  59. package/src/{contracts/jobs.ts → jobs/protocol.ts} +7 -9
  60. package/src/jobs/runner.ts +150 -231
  61. package/src/jobs/service.ts +75 -0
  62. package/src/jobs/sse.ts +59 -23
  63. package/src/jobs/worker-memory.ts +46 -0
  64. package/src/jobs/worker-process.ts +163 -0
  65. package/src/jobs/worker-supervisor.ts +258 -0
  66. package/src/modules.ts +58 -0
  67. package/src/publishing/catalog-hub.ts +18 -0
  68. package/src/publishing/credentials.ts +31 -0
  69. package/src/publishing/upload.ts +37 -0
  70. package/src/residency/leased-adapters.ts +21 -0
  71. package/src/residency/local-records.ts +16 -0
  72. package/src/residency/model-residency.ts +405 -0
  73. package/src/residency/record-index.ts +28 -0
  74. package/src/residency/resident-estimate.ts +50 -0
  75. package/src/{anthropic.ts → server/anthropic.ts} +3 -81
  76. package/src/server/cache-routes.ts +36 -0
  77. package/src/{serve → server}/chat-request.ts +12 -10
  78. package/src/{serve → server}/chat-stage.ts +27 -22
  79. package/src/{client.ts → server/client.ts} +28 -2
  80. package/src/{serve → server}/completion-executor.ts +42 -42
  81. package/src/server/decision-body.ts +55 -0
  82. package/src/server/decision-routes.ts +134 -0
  83. package/src/server/decision-wire.ts +228 -0
  84. package/src/{serve → server}/discovery-routes.ts +42 -83
  85. package/src/server/generated-token-history.ts +57 -0
  86. package/src/{serve → server}/http.ts +25 -13
  87. package/src/{serve → server}/inference-request.ts +5 -5
  88. package/src/server/job-routes.ts +20 -0
  89. package/src/server/media-prompt.ts +63 -0
  90. package/src/server/memory-completion-client.ts +46 -0
  91. package/src/server/model-routes.ts +192 -0
  92. package/src/{serve → server}/openai-wire.ts +3 -2
  93. package/src/{serve → server}/pipeline.ts +1 -1
  94. package/src/server/prompt-builder.ts +13 -0
  95. package/src/server/prompt-contracts.ts +17 -0
  96. package/src/server/proxy-routes.ts +187 -0
  97. package/src/server/publishing-routes.ts +41 -0
  98. package/src/{serve → server}/request-plan.ts +8 -8
  99. package/src/{serve → server}/request-prep.ts +82 -68
  100. package/src/{serve → server}/responses-client.ts +30 -13
  101. package/src/{responses.ts → server/responses.ts} +12 -93
  102. package/src/server/routes.ts +205 -0
  103. package/src/server/start.ts +72 -0
  104. package/src/server/status-routes.ts +108 -0
  105. package/src/{serve → server}/text-completion-stage.ts +25 -4
  106. package/src/server/text-prompt.ts +12 -0
  107. package/src/{serve → server}/token-streams.ts +36 -38
  108. package/src/server/worker-routes.ts +311 -0
  109. package/src/storage/paths.ts +61 -0
  110. package/src/web/assets.ts +37 -0
  111. package/src/web/{src → browser}/api.ts +5 -23
  112. package/src/web/browser/chat-host.ts +17 -0
  113. package/src/web/browser/installed-panels.ts +6 -0
  114. package/src/web/browser/main.ts +55 -0
  115. package/src/web/browser/markdown.ts +279 -0
  116. package/src/web/browser/memory-panel.ts +9 -0
  117. package/src/web/browser/palette.ts +64 -0
  118. package/src/web/browser/protocol.ts +13 -0
  119. package/src/web/browser/shell.ts +467 -0
  120. package/src/web/{src → browser}/status.ts +32 -36
  121. package/src/web/build.ts +51 -0
  122. package/src/web/public/app.html +1054 -0
  123. package/src/web/{sw.js → public/sw.js} +4 -3
  124. package/src/web/{vendor → public/vendor}/hljs-theme.css +2 -2
  125. package/src/web/{vendor → public/vendor}/hljs.js +2 -2
  126. package/THIRD_PARTY_LICENSES.md +0 -51
  127. package/docs/README.md +0 -94
  128. package/docs/archive/hlg-sampling.md +0 -350
  129. package/docs/archive/investigations/audio-input-plan.md +0 -356
  130. package/docs/archive/investigations/chunk-finetune-experiment.md +0 -84
  131. package/docs/archive/investigations/colibri-glm52-port.md +0 -1486
  132. package/docs/archive/investigations/colibri-oracle-pin.md +0 -1284
  133. package/docs/archive/investigations/curve-bisector-routing.md +0 -123
  134. package/docs/archive/investigations/decode-roofline-lookagain.md +0 -348
  135. package/docs/archive/investigations/diffusion-gemma-port.md +0 -602
  136. package/docs/archive/investigations/dspark-handoff.md +0 -224
  137. package/docs/archive/investigations/expert-offload-single-user-moe.md +0 -292
  138. package/docs/archive/investigations/faithful-l1-consolidation.md +0 -310
  139. package/docs/archive/investigations/hlg-sampling-investigation.md +0 -970
  140. package/docs/archive/investigations/indexshare-performance-spike.md +0 -357
  141. package/docs/archive/investigations/kernel-perf-review-2026-07.md +0 -171
  142. package/docs/archive/investigations/lab-build-journal.md +0 -157
  143. package/docs/archive/investigations/minicpm5-decode-megakernel.md +0 -489
  144. package/docs/archive/investigations/openjarvis-fit.md +0 -198
  145. package/docs/archive/investigations/openwiki-evaluation.md +0 -249
  146. package/docs/archive/investigations/optimization_plan.md +0 -346
  147. package/docs/archive/investigations/orpo-base-uf-experiment-and-directions.md +0 -120
  148. package/docs/archive/investigations/orpo-flash-cce-pin-leak.md +0 -167
  149. package/docs/archive/investigations/orpo-uf-testing-handoff.md +0 -126
  150. package/docs/archive/investigations/pareto-specialized-runtime-findings.md +0 -92
  151. package/docs/archive/investigations/pi-builtin-investigation.md +0 -308
  152. package/docs/archive/investigations/pre-colibri-stabilization.md +0 -329
  153. package/docs/archive/investigations/qwen38-27b-campaign-log.md +0 -1092
  154. package/docs/archive/investigations/segmented-backward-handoff.md +0 -148
  155. package/docs/archive/investigations/starter-model-port-handoff.md +0 -342
  156. package/docs/archive/investigations/steel-flash-cce-handoff.md +0 -489
  157. package/docs/archive/investigations/the-dreaming-handoff.md +0 -141
  158. package/docs/archive/investigations/trainer-validation-experiment.md +0 -173
  159. package/docs/archive/planning/chat-ui-vision-memory-first.md +0 -199
  160. package/docs/archive/planning/chat-ui-vision.md +0 -50
  161. package/docs/archive/planning/chunk-task-roadmap.md +0 -77
  162. package/docs/archive/planning/curve-sampler-research-plan.md +0 -331
  163. package/docs/archive/planning/journal.md +0 -316
  164. package/docs/archive/planning/memory-docs-and-dag-plan.md +0 -194
  165. package/docs/archive/planning/pi-integration-review.md +0 -178
  166. package/docs/archive/planning/release-notes-v0.0.10.md +0 -57
  167. package/docs/archive/planning/release-notes-v0.0.11.md +0 -239
  168. package/docs/archive/planning/release-notes-v0.0.12.md +0 -80
  169. package/docs/archive/planning/release-notes-v0.0.13.md +0 -77
  170. package/docs/archive/planning/release-notes-v0.0.9.md +0 -122
  171. package/docs/archive/planning/release-notes-v0.2.0.md +0 -49
  172. package/docs/archive/planning/release-notes-v0.3.0.md +0 -35
  173. package/docs/archive/planning/web-ui-pass-plan.md +0 -213
  174. package/docs/archive/planning/website-readme-pass-plan.md +0 -224
  175. package/docs/design/batching.md +0 -1841
  176. package/docs/design/decode-speed-program.md +0 -2349
  177. package/docs/design/dreaming-nightly-pipeline.md +0 -684
  178. package/docs/design/generic-model-support.md +0 -705
  179. package/docs/design/kv-cache.md +0 -824
  180. package/docs/design/orpo-training.md +0 -680
  181. package/docs/design/speculative-decoding.md +0 -1990
  182. package/docs/design/turboquant.md +0 -2212
  183. package/docs/design/unified-engine-frontier-plan.md +0 -1880
  184. package/docs/design/web-chat-redesign.md +0 -695
  185. package/docs/planning/PRODUCT_ROADMAP.md +0 -594
  186. package/docs/planning/ResearchTopics.md +0 -119
  187. package/docs/planning/release-notes-v0.4.0.md +0 -45
  188. package/docs/planning/video-series.md +0 -421
  189. package/docs/reference/benchmarks.md +0 -3613
  190. package/docs/reference/cli.md +0 -585
  191. package/docs/reference/distribution.md +0 -355
  192. package/docs/reference/environment.md +0 -398
  193. package/docs/reference/glossary.md +0 -39
  194. package/docs/reference/library-api.md +0 -674
  195. package/docs/reference/memory.md +0 -260
  196. package/docs/reference/models.md +0 -334
  197. package/docs/reference/server-api.md +0 -1775
  198. package/docs/reference/server-config.md +0 -846
  199. package/docs/reference/training.md +0 -462
  200. package/docs/reference/troubleshooting.md +0 -158
  201. package/src/admission-plan.ts +0 -18
  202. package/src/audio/conformer.ts +0 -647
  203. package/src/audio/decode.ts +0 -133
  204. package/src/audio/features.ts +0 -202
  205. package/src/audio/transcode.ts +0 -67
  206. package/src/backends/mlx/assistant-target.ts +0 -46
  207. package/src/backends/mlx/autoregressive-draft-rows.ts +0 -120
  208. package/src/backends/mlx/autoregressive.ts +0 -108
  209. package/src/backends/mlx/batch-group.ts +0 -1790
  210. package/src/backends/mlx/cache-attachment.ts +0 -67
  211. package/src/backends/mlx/cache-layout.ts +0 -31
  212. package/src/backends/mlx/checkpoint-state.ts +0 -53
  213. package/src/backends/mlx/continuation-persistence.ts +0 -106
  214. package/src/backends/mlx/continuation-request.ts +0 -43
  215. package/src/backends/mlx/continuation.ts +0 -77
  216. package/src/backends/mlx/diffusion.ts +0 -39
  217. package/src/backends/mlx/draft-target.ts +0 -32
  218. package/src/backends/mlx/evaluation.ts +0 -105
  219. package/src/backends/mlx/fill-append.ts +0 -45
  220. package/src/backends/mlx/full-kv-row-append.ts +0 -32
  221. package/src/backends/mlx/full-kv-row-donor.ts +0 -54
  222. package/src/backends/mlx/full-transitioning-kv-rows.ts +0 -65
  223. package/src/backends/mlx/gateway-binding.ts +0 -130
  224. package/src/backends/mlx/graph.ts +0 -38
  225. package/src/backends/mlx/kv-codec.ts +0 -9
  226. package/src/backends/mlx/kv-maintenance.ts +0 -133
  227. package/src/backends/mlx/kv-tensor-rows.ts +0 -212
  228. package/src/backends/mlx/memory-client.ts +0 -189
  229. package/src/backends/mlx/methods.ts +0 -90
  230. package/src/backends/mlx/model-prompt.ts +0 -164
  231. package/src/backends/mlx/model-serving.ts +0 -79
  232. package/src/backends/mlx/prefill-cohort.ts +0 -89
  233. package/src/backends/mlx/prefill-rows.ts +0 -200
  234. package/src/backends/mlx/prefill.ts +0 -33
  235. package/src/backends/mlx/projected-context-rows.ts +0 -72
  236. package/src/backends/mlx/request-policy.ts +0 -20
  237. package/src/backends/mlx/request-state-policy.ts +0 -41
  238. package/src/backends/mlx/rollback.ts +0 -89
  239. package/src/backends/mlx/row-sampling.ts +0 -49
  240. package/src/backends/mlx/serial-executor.ts +0 -242
  241. package/src/backends/mlx/speculative-group.ts +0 -359
  242. package/src/backends/mlx/speculative-round.ts +0 -161
  243. package/src/backends/mlx/speculative.ts +0 -114
  244. package/src/backends/mlx/state-rows.ts +0 -104
  245. package/src/backends/mlx/state-views.ts +0 -46
  246. package/src/backends/mlx/target-layout-capability.ts +0 -35
  247. package/src/backends/mlx/text-engine.ts +0 -73
  248. package/src/backends/mlx/transitioning-kv-rows.ts +0 -165
  249. package/src/chat-template.ts +0 -382
  250. package/src/cli.ts +0 -3168
  251. package/src/config.ts +0 -399
  252. package/src/contracts/completion.ts +0 -16
  253. package/src/contracts/execution.ts +0 -60
  254. package/src/contracts/generation.ts +0 -103
  255. package/src/contracts/host.ts +0 -7
  256. package/src/contracts/pi-provider.ts +0 -30
  257. package/src/contracts/pi.ts +0 -259
  258. package/src/contracts/prefix-cache.ts +0 -23
  259. package/src/contracts/resources.ts +0 -25
  260. package/src/contracts/sampling.ts +0 -23
  261. package/src/contracts/scheduling.ts +0 -45
  262. package/src/contracts/tsconfig.json +0 -14
  263. package/src/dataset/generators.ts +0 -1087
  264. package/src/dataset/index.ts +0 -12
  265. package/src/dataset/job.ts +0 -81
  266. package/src/dataset/llm.ts +0 -71
  267. package/src/dataset/registry.ts +0 -528
  268. package/src/diffusion/diffusion-generate.ts +0 -507
  269. package/src/download.ts +0 -505
  270. package/src/embed.ts +0 -77
  271. package/src/engine/admission.ts +0 -59
  272. package/src/engine/cancellation.ts +0 -38
  273. package/src/engine/engine.ts +0 -56
  274. package/src/engine/execution-coordinator.ts +0 -70
  275. package/src/engine/execution-plan.ts +0 -53
  276. package/src/engine/resources.ts +0 -53
  277. package/src/engine/scheduler.ts +0 -72
  278. package/src/engine/session.ts +0 -247
  279. package/src/eval/README.md +0 -130
  280. package/src/eval/ifeval.ts +0 -81
  281. package/src/eval/kl-prompts.ts +0 -29
  282. package/src/eval/kl.ts +0 -590
  283. package/src/eval/perplexity.ts +0 -164
  284. package/src/eval/quality-db.ts +0 -92
  285. package/src/eval/reference-logits.ts +0 -207
  286. package/src/eval/runner.ts +0 -124
  287. package/src/eval/score.ts +0 -49
  288. package/src/eval/tasks/bfcl.ts +0 -535
  289. package/src/eval/tasks/gsm8k.ts +0 -98
  290. package/src/eval/tasks/hashhop.ts +0 -139
  291. package/src/eval/tasks/humaneval.ts +0 -275
  292. package/src/eval/tasks/ifeval.ts +0 -525
  293. package/src/eval/tasks/mmlu.ts +0 -157
  294. package/src/eval/ultrafeedback.ts +0 -60
  295. package/src/evaldb.ts +0 -199
  296. package/src/expert-io.ts +0 -393
  297. package/src/expert-offload-build.ts +0 -77
  298. package/src/expert-offload.ts +0 -76
  299. package/src/expert-residency.ts +0 -1134
  300. package/src/expert-usage.ts +0 -415
  301. package/src/fill/echo-index.ts +0 -188
  302. package/src/fill/fill-session.ts +0 -452
  303. package/src/fill/proposal.ts +0 -68
  304. package/src/fill/schema-rows.ts +0 -506
  305. package/src/fill/tool-boundary.ts +0 -103
  306. package/src/fit.ts +0 -249
  307. package/src/generate.ts +0 -1346
  308. package/src/grammar.ts +0 -591
  309. package/src/harness-pi.ts +0 -184
  310. package/src/hf-push.ts +0 -628
  311. package/src/hub-rest.ts +0 -242
  312. package/src/index.ts +0 -63
  313. package/src/inference/denoising.ts +0 -17
  314. package/src/inference/draft-acceptance.ts +0 -41
  315. package/src/inference/draft-output.ts +0 -49
  316. package/src/inference/graph.ts +0 -33
  317. package/src/inference/prefill.ts +0 -39
  318. package/src/inference/rollback.ts +0 -7
  319. package/src/jobs/index.ts +0 -31
  320. package/src/jobs/job-entry.ts +0 -107
  321. package/src/jobs/task-client.ts +0 -19
  322. package/src/jobs/types.ts +0 -2
  323. package/src/kv-scheme.ts +0 -257
  324. package/src/kv-store.ts +0 -1099
  325. package/src/lab/README.md +0 -18
  326. package/src/lab/curve/curve-designer.html +0 -303
  327. package/src/lab/curve/curve-sampler.ts +0 -122
  328. package/src/lab/expert-trace/expert-trace.ts +0 -69
  329. package/src/lab/paged-kv/paged-kv-rows.ts +0 -83
  330. package/src/lab/paged-kv/paged-kv.ts +0 -270
  331. package/src/library.ts +0 -40
  332. package/src/lora.ts +0 -408
  333. package/src/md-modules.d.ts +0 -49
  334. package/src/media-fetch.ts +0 -442
  335. package/src/memory/article.ts +0 -558
  336. package/src/memory/chunk-validation.ts +0 -150
  337. package/src/memory/chunk.ts +0 -318
  338. package/src/memory/cluster.ts +0 -351
  339. package/src/memory/coverage.ts +0 -134
  340. package/src/memory/crosslink.ts +0 -0
  341. package/src/memory/db.ts +0 -253
  342. package/src/memory/entity.ts +0 -203
  343. package/src/memory/gate.ts +0 -187
  344. package/src/memory/history.ts +0 -152
  345. package/src/memory/ingest.ts +0 -335
  346. package/src/memory/model.ts +0 -183
  347. package/src/memory/normalize.ts +0 -671
  348. package/src/memory/parse.ts +0 -22
  349. package/src/memory/pipeline.ts +0 -275
  350. package/src/memory/prompts.ts +0 -65
  351. package/src/memory/query.ts +0 -334
  352. package/src/memory/reconcile.ts +0 -734
  353. package/src/memory/redirect.ts +0 -108
  354. package/src/memory/reindex.ts +0 -325
  355. package/src/memory/resolve.ts +0 -307
  356. package/src/memory/rest.ts +0 -245
  357. package/src/memory/route.ts +0 -272
  358. package/src/memory/schedule.ts +0 -165
  359. package/src/memory/stages.ts +0 -777
  360. package/src/memory/synthesize.ts +0 -1638
  361. package/src/memory/tools.ts +0 -749
  362. package/src/memory/vault.ts +0 -1194
  363. package/src/memory/wikify.ts +0 -1064
  364. package/src/mlx/array.ts +0 -388
  365. package/src/mlx/autograd.ts +0 -304
  366. package/src/mlx/checkpoint.ts +0 -149
  367. package/src/mlx/compile.ts +0 -168
  368. package/src/mlx/custom-vjp.ts +0 -188
  369. package/src/mlx/ffi.ts +0 -512
  370. package/src/mlx/materialize.ts +0 -23
  371. package/src/mlx/metal-kernel.ts +0 -159
  372. package/src/mlx/ops.ts +0 -1021
  373. package/src/mlx/quantized-rows.ts +0 -36
  374. package/src/mlx/token-bitmask.ts +0 -52
  375. package/src/mlx/turboquant-kv-decode.ts +0 -82
  376. package/src/mlx/turboquant-kv-inverse.ts +0 -122
  377. package/src/mlx/turboquant-ops.ts +0 -861
  378. package/src/mlx/turboquant-tables.ts +0 -237
  379. package/src/mmap.ts +0 -90
  380. package/src/model/artifact-identity.ts +0 -73
  381. package/src/model/batched-kv.ts +0 -235
  382. package/src/model/batched-mask.ts +0 -279
  383. package/src/model/batched-quant.ts +0 -212
  384. package/src/model/batched-quantized-kv.ts +0 -144
  385. package/src/model/batched-rotating-quant.ts +0 -353
  386. package/src/model/batched-rotating-state.ts +0 -149
  387. package/src/model/batched-rotating.ts +0 -338
  388. package/src/model/batched-row-storage.ts +0 -179
  389. package/src/model/batched-ssm.ts +0 -52
  390. package/src/model/batched-turboquant-kv.ts +0 -93
  391. package/src/model/compiled-decode.ts +0 -712
  392. package/src/model/decoded-kv-donor.ts +0 -12
  393. package/src/model/delayed-quantized-kv.ts +0 -72
  394. package/src/model/delayed-rotating-quantized-kv.ts +0 -93
  395. package/src/model/delayed-turboquant-kv.ts +0 -55
  396. package/src/model/diffusion-gemma.ts +0 -1026
  397. package/src/model/factory.ts +0 -189
  398. package/src/model/fingerprint.ts +0 -33
  399. package/src/model/flash-attention.ts +0 -694
  400. package/src/model/full-prefill-padding.ts +0 -56
  401. package/src/model/full-prefill-row.ts +0 -105
  402. package/src/model/gemma4-base.ts +0 -2351
  403. package/src/model/gemma4.ts +0 -1315
  404. package/src/model/generated/gemma4-12b.ts +0 -429
  405. package/src/model/generated/gemma4-26b.ts +0 -448
  406. package/src/model/generated/gemma4-e4b.ts +0 -717
  407. package/src/model/generated/index.ts +0 -18
  408. package/src/model/glm52-atlas.ts +0 -511
  409. package/src/model/glm52-cache.ts +0 -792
  410. package/src/model/glm52-config.ts +0 -262
  411. package/src/model/glm52-container.ts +0 -305
  412. package/src/model/glm52-coupling.ts +0 -388
  413. package/src/model/glm52-dsa.ts +0 -606
  414. package/src/model/glm52-expert-layout.ts +0 -253
  415. package/src/model/glm52-layout.ts +0 -152
  416. package/src/model/glm52-memory.ts +0 -500
  417. package/src/model/glm52-mla.ts +0 -792
  418. package/src/model/glm52-moe.ts +0 -223
  419. package/src/model/glm52-pilot.ts +0 -537
  420. package/src/model/glm52-reference.ts +0 -445
  421. package/src/model/glm52-residency.ts +0 -557
  422. package/src/model/glm52-resident-weights.ts +0 -135
  423. package/src/model/glm52-streamed-experts.ts +0 -453
  424. package/src/model/glm52-streamed-metal.ts +0 -610
  425. package/src/model/glm52-weights.ts +0 -503
  426. package/src/model/glm52.ts +0 -1132
  427. package/src/model/implementation.ts +0 -69
  428. package/src/model/kv-attention-view.ts +0 -67
  429. package/src/model/minicpm5.ts +0 -376
  430. package/src/model/profile.ts +0 -443
  431. package/src/model/qwen-append.ts +0 -12
  432. package/src/model/qwen-conv.ts +0 -52
  433. package/src/model/qwen3-delta-state.ts +0 -74
  434. package/src/model/qwen3-delta.ts +0 -451
  435. package/src/model/qwen3-moe.ts +0 -404
  436. package/src/model/qwen3-mrope.ts +0 -252
  437. package/src/model/qwen3.ts +0 -277
  438. package/src/model/qwen3_5-checkpoint.ts +0 -164
  439. package/src/model/qwen3_5.ts +0 -819
  440. package/src/model/rotating-kv-donor.ts +0 -35
  441. package/src/model/rotating-kv-layout.ts +0 -262
  442. package/src/model/rotating-row-transaction.ts +0 -35
  443. package/src/model/speculative-rotating-kv.ts +0 -101
  444. package/src/model/ssm-prefill-padding.ts +0 -39
  445. package/src/model/support.ts +0 -102
  446. package/src/model/trellis-balanced-scatter.ts +0 -51
  447. package/src/model/trellis-linear.ts +0 -672
  448. package/src/model/trellis-shared-m.ts +0 -151
  449. package/src/model/trellis-shared-scatter.ts +0 -144
  450. package/src/model/trellis-splitk-prefill.ts +0 -158
  451. package/src/model/trellis-tiled-prefill.ts +0 -136
  452. package/src/model/trellis-vector-expand.ts +0 -62
  453. package/src/model/trellis-wide-prefill.ts +0 -94
  454. package/src/model/turboquant-codec.ts +0 -83
  455. package/src/model/universal/archs.ts +0 -332
  456. package/src/model/universal/dense.ts +0 -612
  457. package/src/model/universal/modules.ts +0 -170
  458. package/src/model/universal/rope.ts +0 -381
  459. package/src/native/expert_io.c +0 -523
  460. package/src/native/frame_extract.swift +0 -140
  461. package/src/native-pack.ts +0 -162
  462. package/src/pi-provider.ts +0 -53
  463. package/src/pi-session.ts +0 -81
  464. package/src/pi-terminal.ts +0 -274
  465. package/src/pi-web.ts +0 -1932
  466. package/src/preflight.ts +0 -158
  467. package/src/prompt-cache.ts +0 -460
  468. package/src/quantize/allocator.ts +0 -627
  469. package/src/quantize/atomic-output.ts +0 -38
  470. package/src/quantize/calibration.ts +0 -181
  471. package/src/quantize/config-writer.ts +0 -145
  472. package/src/quantize/index.ts +0 -84
  473. package/src/quantize/job.ts +0 -162
  474. package/src/quantize/quantizer.ts +0 -666
  475. package/src/quantize/rotate.ts +0 -603
  476. package/src/quantize/safetensors-writer.ts +0 -249
  477. package/src/quantize/sensitivity.ts +0 -216
  478. package/src/quantize/trellis.ts +0 -586
  479. package/src/quantize/weight-transform.ts +0 -292
  480. package/src/registry.ts +0 -602
  481. package/src/runtime-config.ts +0 -81
  482. package/src/safetensors.ts +0 -158
  483. package/src/sampler.ts +0 -1011
  484. package/src/serve/admin-routes.ts +0 -184
  485. package/src/serve/assets/curve-terrain.html +0 -105
  486. package/src/serve/assets/training-inference-map.html +0 -575
  487. package/src/serve/aux-routes.ts +0 -132
  488. package/src/serve/batch-scheduler.ts +0 -8
  489. package/src/serve/checkpoint-identity.ts +0 -64
  490. package/src/serve/generation-gateway.ts +0 -496
  491. package/src/serve/isolate.ts +0 -609
  492. package/src/serve/kv-budget.ts +0 -14
  493. package/src/serve/lab-routes.ts +0 -341
  494. package/src/serve/lane-registry.ts +0 -45
  495. package/src/serve/model-admin-routes.ts +0 -155
  496. package/src/serve/model-binding.ts +0 -43
  497. package/src/serve/model-host.ts +0 -511
  498. package/src/serve/parent-application.ts +0 -56
  499. package/src/serve/prompt-response-trace.ts +0 -147
  500. package/src/serve/response-lease.ts +0 -24
  501. package/src/serve/session-search.ts +0 -326
  502. package/src/serve/static-routes.ts +0 -101
  503. package/src/server.ts +0 -1314
  504. package/src/spec/assistant-rows.ts +0 -92
  505. package/src/spec/assistant-source.ts +0 -126
  506. package/src/spec/cache-identity.ts +0 -22
  507. package/src/spec/deepspec-rows.ts +0 -29
  508. package/src/spec/deepspec-source.ts +0 -145
  509. package/src/spec/dflash-source.ts +0 -149
  510. package/src/spec/drafter.ts +0 -304
  511. package/src/spec/dspark/ab-stats.ts +0 -136
  512. package/src/spec/dspark/calibration.ts +0 -112
  513. package/src/spec/dspark/data-dflash.ts +0 -156
  514. package/src/spec/dspark/data.ts +0 -201
  515. package/src/spec/dspark/deepspec-module.ts +0 -776
  516. package/src/spec/dspark/generate-dflash.ts +0 -245
  517. package/src/spec/dspark/generate.ts +0 -290
  518. package/src/spec/dspark/loader.ts +0 -23
  519. package/src/spec/dspark/loss.ts +0 -213
  520. package/src/spec/dspark/module-dflash.ts +0 -560
  521. package/src/spec/dspark/module.ts +0 -540
  522. package/src/spec/dspark/quantize-drafter.ts +0 -91
  523. package/src/spec/dspark/sample.ts +0 -112
  524. package/src/spec/generate.ts +0 -276
  525. package/src/spec/glm52-mtp-graph.ts +0 -29
  526. package/src/spec/glm52-mtp-rows.ts +0 -132
  527. package/src/spec/glm52-mtp-source.ts +0 -317
  528. package/src/spec/glm52-mtp-state.ts +0 -33
  529. package/src/spec/ngram-source.ts +0 -204
  530. package/src/spec/projected-draft-rows.ts +0 -73
  531. package/src/spec/qwen-mtp-module.ts +0 -171
  532. package/src/spec/qwen-mtp-rows.ts +0 -219
  533. package/src/spec/qwen-mtp-source.ts +0 -383
  534. package/src/spec/qwen-mtp-state.ts +0 -30
  535. package/src/spec/serve-loop.ts +0 -585
  536. package/src/spec/source.ts +0 -215
  537. package/src/spec/two-model-rows.ts +0 -61
  538. package/src/spec/two-model.ts +0 -113
  539. package/src/ssd-cache.ts +0 -372
  540. package/src/ssd-durability.ts +0 -211
  541. package/src/tokenizer.ts +0 -335
  542. package/src/tool-approvals.ts +0 -131
  543. package/src/tool-call.ts +0 -695
  544. package/src/train/dataset.ts +0 -484
  545. package/src/train/diffusion-lora.ts +0 -216
  546. package/src/train/export.ts +0 -32
  547. package/src/train/flash-cce.ts +0 -1234
  548. package/src/train/forward.ts +0 -266
  549. package/src/train/fuse.ts +0 -243
  550. package/src/train/index.ts +0 -46
  551. package/src/train/job.ts +0 -205
  552. package/src/train/lora-params.ts +0 -254
  553. package/src/train/loss.ts +0 -1591
  554. package/src/train/merge.ts +0 -195
  555. package/src/train/optimizer.ts +0 -183
  556. package/src/train/prefix-shared.ts +0 -490
  557. package/src/train/rank.ts +0 -137
  558. package/src/train/segmented.ts +0 -1828
  559. package/src/train/steel-qmm-header.ts +0 -1461
  560. package/src/train/trainer.ts +0 -1221
  561. package/src/train/watch.ts +0 -542
  562. package/src/vision/diffusion-vision.ts +0 -620
  563. package/src/vision/embedder.ts +0 -168
  564. package/src/vision/preprocess.ts +0 -247
  565. package/src/vision/prompt.ts +0 -373
  566. package/src/vision/qwen3vl-preprocess.ts +0 -409
  567. package/src/vision/qwen3vl-prompt.ts +0 -196
  568. package/src/vision/qwen3vl-tower.ts +0 -555
  569. package/src/vision/siglip.ts +0 -599
  570. package/src/vision/video-frames.ts +0 -148
  571. package/src/web/app.html +0 -2143
  572. package/src/web/app.js +0 -5703
  573. package/src/web/skills/memory/SKILL.md +0 -120
  574. package/src/web/skills/web-research/SKILL.md +0 -46
  575. package/src/web/skills.ts +0 -97
  576. package/src/web/src/adapters-panel.ts +0 -288
  577. package/src/web/src/assistant.ts +0 -451
  578. package/src/web/src/chat.ts +0 -1057
  579. package/src/web/src/composer.ts +0 -959
  580. package/src/web/src/dataset.ts +0 -132
  581. package/src/web/src/finetune.ts +0 -267
  582. package/src/web/src/hub.ts +0 -428
  583. package/src/web/src/main.ts +0 -98
  584. package/src/web/src/markdown.ts +0 -0
  585. package/src/web/src/memory-panel.ts +0 -572
  586. package/src/web/src/model-picker.ts +0 -159
  587. package/src/web/src/palette.ts +0 -346
  588. package/src/web/src/protocol.ts +0 -26
  589. package/src/web/src/quantize.ts +0 -167
  590. package/src/web/src/rag.ts +0 -274
  591. package/src/web/src/sessions.ts +0 -469
  592. package/src/web/src/shell.ts +0 -804
  593. package/src/web/src/ui-catalog.ts +0 -78
  594. package/src/web/vendor/README.md +0 -61
  595. package/src/web-assets.ts +0 -47
  596. package/src/web-tools.ts +0 -478
  597. package/src/weights.ts +0 -255
  598. /package/src/{serve → server}/completion-sink.ts +0 -0
  599. /package/src/web/{icon.svg → public/icon.svg} +0 -0
  600. /package/src/web/{manifest.webmanifest → public/manifest.webmanifest} +0 -0
  601. /package/src/web/{vendor → public/vendor}/hljs-LICENSE +0 -0
@@ -1,452 +0,0 @@
1
- // Token fast-forwarding (K3) — the per-request proposal table.
2
- //
3
- // DOCTRINE. This is PURE CONTEXT EXTENSION, not speculation. A transformer is
4
- // a next-token function over a token sequence; it has no memory of who wrote
5
- // which token, so an APPENDED token is indistinguishable from a sampled one.
6
- // When the engine already knows the next m tokens (a chat template's tool-call
7
- // scaffold is a deterministic function of the request's `tools`), it appends
8
- // them itself in one append and resumes sampling after them. The append can
9
- // use several execution chunks while retaining the complete span. No
10
- // draft, no verify, no rollback, and no comparison against what the model
11
- // "would have" produced — nothing here routes through src/spec/.
12
- //
13
- // The echo tier (K3c) adds a weaker claim over the SAME mechanism: a span
14
- // copied from earlier in the session, held under policy "verify" — the engine
15
- // keeps the prefix the model agrees with (read from the free logits of the
16
- // very same forward) and rewinds the rest. See ./proposal.ts for the two
17
- // policies and ./echo-index.ts for the branch-point rule.
18
- //
19
- // This module is bookkeeping only: it owns the running history, runs the
20
- // sources in priority order, clamps what they return, and counts. It never
21
- // touches MLX, the tokenizer, or the template. Row COMPILATION is
22
- // ./schema-rows.ts.
23
- import { flagOn, runtimeNumber, runtimeValue } from "../runtime-config";
24
- import { EchoSource, type EchoConfig } from "./echo-index";
25
- import type {
26
- Proposal, ProposalOrigin, ProposalPolicy, ProposalSource, TokenView,
27
- } from "./proposal";
28
-
29
- export type { Proposal, ProposalPolicy, ProposalSource, TokenView };
30
-
31
- /** Which producer a strict row came from (telemetry + the mismatch policy). */
32
- export type FillKind = "scaffold" | "name" | "key" | "close" | "turn-end";
33
-
34
- export interface FillRow {
35
- /** Token ids that must be the TAIL of the generated history for this row to
36
- * fire (matched as an exact suffix ending at the token just pushed). */
37
- trigger: number[];
38
- /** Ids appended immediately after the trigger. Sliced out of a full
39
- * template rendering — never `encode(fragment)` in isolation. */
40
- emit: number[];
41
- kind: FillKind;
42
- /** Template-derived rows need a parser-owned context before asserting. */
43
- requiresContext?: true;
44
- }
45
-
46
- export interface StrictFillContext {
47
- observe(ids: readonly number[]): void;
48
- allows(row: FillRow): boolean;
49
- }
50
-
51
- /** Echo-tier (K3c) configuration; null disables the source entirely. */
52
- export interface FillEchoConfig {
53
- k: number;
54
- maxSpan: number;
55
- maxCandidates: number;
56
- indexMax: number;
57
- }
58
-
59
- export interface FillPlan {
60
- rows: FillRow[];
61
- /** Echo tier: null = strict rows only (MLX_BUN_FILL=strict). */
62
- echo: FillEchoConfig | null;
63
- /** Token ids that legitimately END an injected span — the closing quote /
64
- * markup that follows an argument value, derived from the template by the
65
- * strict-row compiler. A span is cut so it ends AT the first delimiter it
66
- * contains, never past one. */
67
- delimiters?: ReadonlySet<number>;
68
- /** EOS ids. An injected span is cut BEFORE the first one: end-of-generation
69
- * is the model's decision, never ours. (The grammar jump burst yields its
70
- * ids with NO eos check — that bug is deliberately not inherited.) */
71
- eos: number[];
72
- }
73
-
74
- export interface FillStats {
75
- /** Fills that put at least one token into the stream. */
76
- events: number;
77
- /** Total injected tokens (billed as generated). */
78
- injected: number;
79
- /** …from strict schema/template rows (always policy "assert"). */
80
- strict: number;
81
- /** …from the echo index. */
82
- echo: number;
83
- /** Length of each injected span, in event order. */
84
- spanLens: number[];
85
- /** In-flight sampled tokens dropped unexamined at an ASSERT fill — a
86
- * discarded pipeline dispatch, NOT a rejected draft. */
87
- wastedSamples: number;
88
- /** Tool-call parses that failed after strict rows had fired. */
89
- parseFallback: number;
90
- /** Spans shortened by a clamp (EOS / delimiter / max span / budget). */
91
- indexTruncated: number;
92
- /** Tokens the model actually sampled (the real decode steps). */
93
- decodeSteps: number;
94
- /** Verify-policy proposals that reached the forward. */
95
- verifyEvents: number;
96
- /** Tokens accepted under verify (the model's own argmax agreed). */
97
- verifyAccepted: number;
98
- /** Tokens proposed under verify and dropped (incl. rejected-at-position-0,
99
- * which costs nothing — that check happens before the forward). */
100
- verifyRejected: number;
101
- /** Verify proposals dropped because this model's caches cannot rewind. */
102
- verifyUnsupported: number;
103
- /** Wall time in cache checkpoint / rollback / commit (verify only). */
104
- checkpointMs: number;
105
- /** Echo spans that stopped because the session history forked. */
106
- branchStops: number;
107
- }
108
-
109
- const emptyStats = (): FillStats => ({
110
- events: 0, injected: 0, strict: 0, echo: 0, spanLens: [],
111
- wastedSamples: 0, parseFallback: 0, indexTruncated: 0, decodeSteps: 0,
112
- verifyEvents: 0, verifyAccepted: 0, verifyRejected: 0, verifyUnsupported: 0,
113
- checkpointMs: 0, branchStops: 0,
114
- });
115
-
116
- export type FillMode = "off" | "strict" | "echo";
117
-
118
- /** MLX_BUN_FILL=off|strict|echo (default off). `echo` is additive: the strict
119
- * rows still apply (and stay policy "assert"); the echo index joins as a
120
- * second, weaker source. Lab tier — default off, A/B before any default. */
121
- export function resolveFillMode(raw = runtimeValue("MLX_BUN_FILL")): FillMode {
122
- if (raw === undefined || raw === "" || raw === "off" || raw === "0") return "off";
123
- if (raw === "strict" || raw === "1") return "strict";
124
- if (raw === "echo") return "echo";
125
- throw new Error(`MLX_BUN_FILL=${raw}: expected off|strict|echo`);
126
- }
127
-
128
- /** Hard cap on one injected span (MLX_BUN_FILL_MAX_SPAN, default 32). */
129
- export function fillMaxSpan(): number {
130
- const n = Math.floor(runtimeNumber("MLX_BUN_FILL_MAX_SPAN", 32));
131
- return n >= 2 ? n : 2;
132
- }
133
-
134
- /** Assert-append chunk cap; zero selects the model's qualified limit. */
135
- export function fillAppendChunkSize(): number {
136
- return Math.max(0, Math.floor(runtimeNumber("MLX_BUN_FILL_APPEND_CHUNK_SIZE", 0)));
137
- }
138
-
139
- /** Echo-tier knobs. k: anchor length (MLX_BUN_FILL_K, default 8 — the corpus
140
- * study's token-level threshold). candidates: nearest-occurrence bucket cap
141
- * (MLX_BUN_FILL_CANDIDATES, default 24). indexMax: token cap on the growing
142
- * index (MLX_BUN_FILL_INDEX_MAX, default 131072). */
143
- export function fillEchoConfig(): FillEchoConfig {
144
- return {
145
- k: Math.max(2, Math.floor(runtimeNumber("MLX_BUN_FILL_K", 8))),
146
- maxSpan: fillMaxSpan(),
147
- maxCandidates: Math.max(1, Math.floor(runtimeNumber("MLX_BUN_FILL_CANDIDATES", 24))),
148
- indexMax: Math.max(1024, Math.floor(runtimeNumber("MLX_BUN_FILL_INDEX_MAX", 131072))),
149
- };
150
- }
151
-
152
- /** MLX_BUN_FILL_TRACE=1 — cache-alignment assertions + per-event logging on
153
- * the engine's fill path. Off by default (the invariant it checks is the
154
- * easiest bug in the feature, and the check costs a JS compare). */
155
- export function fillTraceEnabled(): boolean {
156
- return flagOn("MLX_BUN_FILL_TRACE", false) || fillTracePath() !== null;
157
- }
158
-
159
- /** MLX_BUN_FILL_TRACE=<file.jsonl> — additionally append one record per
160
- * proposal: the proposed ids/text next to what the model's OWN logits said
161
- * at every span position (position 0 = the in-flight sample, j>0 = argmax
162
- * after ids[j-1]), for BOTH policies. Under `assert` the readback is
163
- * trace-only (one lm_head over the span) — the served path never pays it.
164
- * This is the list that answers "would the model have produced this span?"
165
- * without a verify pass in production. */
166
- export function fillTracePath(): string | null {
167
- const raw = runtimeValue("MLX_BUN_FILL_TRACE");
168
- if (raw === undefined || raw === "" || raw === "0" || raw === "1" || raw === "true") return null;
169
- return raw;
170
- }
171
-
172
- export interface FillTraceRecord {
173
- ts: string;
174
- origin: string;
175
- policy: string;
176
- generated: number;
177
- proposedLen: number;
178
- accepted: number;
179
- /** Index of the first position where the model disagreed, or -1. */
180
- firstMismatch: number;
181
- proposed: number[];
182
- actual: number[];
183
- proposedText?: string;
184
- actualText?: string;
185
- }
186
-
187
- /** Strict schema/template rows as a ProposalSource. Always policy "assert":
188
- * the spans are sliced out of the model's own chat template, so they are
189
- * determined by construction, not guessed. */
190
- export class StrictRowSource implements ProposalSource {
191
- readonly name = "strict";
192
- readonly #byLastTrigger = new Map<number, FillRow[]>();
193
- /** Longest trigger — the tail this source needs to match against. */
194
- readonly maxTrigger: number = 1;
195
- get windowNeeded(): number { return this.maxTrigger; }
196
- #enabled = true;
197
-
198
- constructor(rows: readonly FillRow[], readonly context?: StrictFillContext) {
199
- for (const row of rows) {
200
- if (row.trigger.length === 0 || row.emit.length === 0) continue;
201
- this.maxTrigger = Math.max(this.maxTrigger, row.trigger.length);
202
- const last = row.trigger[row.trigger.length - 1]!;
203
- const bucket = this.#byLastTrigger.get(last);
204
- if (bucket) bucket.push(row);
205
- else this.#byLastTrigger.set(last, [row]);
206
- }
207
- // Longest trigger wins (most specific row); plan order breaks ties.
208
- for (const bucket of this.#byLastTrigger.values())
209
- bucket.sort((a, b) => b.trigger.length - a.trigger.length);
210
- }
211
-
212
- get enabled(): boolean { return this.#enabled; }
213
- disable(): void { this.#enabled = false; }
214
-
215
- observe(ids: readonly number[]): void { this.context?.observe(ids); }
216
-
217
- propose(view: TokenView): Proposal | null {
218
- if (!this.#enabled) return null;
219
- const tail = view.tail(this.maxTrigger);
220
- const last = tail[tail.length - 1];
221
- if (last === undefined) return null;
222
- const bucket = this.#byLastTrigger.get(last);
223
- if (!bucket) return null;
224
- for (const row of bucket) {
225
- const t = row.trigger;
226
- if (t.length > tail.length) continue;
227
- const base = tail.length - t.length;
228
- let ok = true;
229
- for (let i = 0; i < t.length; i++) {
230
- if (tail[base + i] !== t[i]) { ok = false; break; }
231
- }
232
- if (ok && (!row.requiresContext || this.context?.allows(row))) {
233
- return {
234
- ids: [...row.emit],
235
- policy: "assert",
236
- // The scaffold and the close come from the TEMPLATE; the name and
237
- // key spans are what the request's SCHEMA determines.
238
- origin: row.kind === "name" || row.kind === "key" ? "schema" : "template",
239
- };
240
- }
241
- }
242
- return null;
243
- }
244
- }
245
-
246
- /** One request's proposal sources plus the running match state.
247
- *
248
- * CONTRACT. push() returns a proposal; the caller MUST then call commit()
249
- * exactly once with the number of ids it actually emitted (all of them for an
250
- * assert, the accepted prefix for a verify, 0 when it declined). Nothing
251
- * enters the session's history until commit — so a partial accept needs no
252
- * rollback here. */
253
- export class FillSession {
254
- readonly stats: FillStats = emptyStats();
255
- /** Execution chunk size, independent of the number of tokens injected. */
256
- readonly appendChunkSize: number;
257
- readonly #sources: ProposalSource[];
258
- readonly #strict: StrictRowSource;
259
- readonly #eos: Set<number>;
260
- readonly #delimiters: ReadonlySet<number>;
261
- readonly #maxSpan: number;
262
- readonly #window: number;
263
- /** Bounded tail of the token history — all a source can see directly (the
264
- * echo index keeps its own full copy via observe()). */
265
- #tail: number[] = [];
266
- #length = 0;
267
- #budget = Number.POSITIVE_INFINITY;
268
-
269
- /** Optional token→text decoder for the proposal trace (set by the serve
270
- * layer, which owns the tokenizer). */
271
- readonly decode: ((ids: readonly number[]) => string) | null;
272
-
273
- constructor(
274
- readonly plan: FillPlan,
275
- promptIds: readonly number[],
276
- options: {
277
- maxSpan?: number;
278
- appendChunkSize?: number;
279
- sources?: ProposalSource[];
280
- decode?: (ids: readonly number[]) => string;
281
- strictContext?: StrictFillContext;
282
- } = {},
283
- ) {
284
- this.decode = options.decode ?? null;
285
- this.appendChunkSize = options.appendChunkSize ?? fillAppendChunkSize();
286
- if (!Number.isSafeInteger(this.appendChunkSize) || this.appendChunkSize < 0)
287
- throw new Error("fill appendChunkSize must be a nonnegative safe integer");
288
- this.#eos = new Set(plan.eos);
289
- this.#delimiters = plan.delimiters ?? new Set<number>();
290
- this.#maxSpan = Math.max(2, Math.floor(options.maxSpan ?? fillMaxSpan()));
291
- this.#strict = new StrictRowSource(plan.rows, options.strictContext);
292
- const echo = plan.echo
293
- ? new EchoSource(
294
- { ...plan.echo, maxSpan: this.#maxSpan, delimiters: this.#delimiters } as EchoConfig,
295
- promptIds,
296
- )
297
- : null;
298
- // Priority: determined before guessed, then anything the caller injected
299
- // (the seam the spec lane's DraftSources would adapt onto — see
300
- // proposal.ts MIGRATION NOTE).
301
- this.#sources = [
302
- this.#strict,
303
- ...(echo ? [echo] : []),
304
- ...(options.sources ?? []),
305
- ];
306
- // Every source declares the tail it needs; the session retains the max.
307
- this.#window = Math.max(
308
- 1, ...this.#sources.map((s) => s.windowNeeded ?? 1),
309
- );
310
- // A row may be triggered by the prompt's own tail (a re-rendered turn that
311
- // ends mid-scaffold), so the history starts seeded.
312
- this.#tail = promptIds.slice(Math.max(0, promptIds.length - this.#window));
313
- this.#length = promptIds.length;
314
- }
315
-
316
- /** Are strict rows still armed? (Cleared by noteParseFailure.) */
317
- get strictEnabled(): boolean { return this.#strict.enabled; }
318
-
319
- /** Feed one SAMPLED token, then ask the sources what follows. `budget` is
320
- * the caller's remaining allowance (max_tokens − generated). */
321
- push(tokenId: number, budget: number = Number.POSITIVE_INFINITY): Proposal | null {
322
- this.stats.decodeSteps++;
323
- this.#append([tokenId]);
324
- this.#budget = budget;
325
- for (const source of this.#sources) {
326
- const proposal = source.propose(this);
327
- if (!proposal) continue;
328
- if (proposal.branchStop) this.stats.branchStops++;
329
- const clamped = this.#clamp(proposal.ids, budget, proposal.origin === "echo");
330
- if (!clamped) continue;
331
- // An assert claim that a clamp cut short for any reason OTHER than
332
- // ending at a delimiter is no longer the claim the source made. Strict
333
- // rows are exempt: they are determined by construction, and a budget
334
- // clamp shortens the span without weakening it.
335
- const weakened = proposal.origin === "echo" &&
336
- clamped.ids.length !== proposal.ids.length &&
337
- !this.#delimiters.has(clamped.ids[clamped.ids.length - 1]!);
338
- return {
339
- ...proposal,
340
- ids: clamped.ids,
341
- policy: weakened ? "verify" : proposal.policy,
342
- };
343
- }
344
- return null;
345
- }
346
-
347
- /** Record what the engine actually emitted from `proposal` (all of it for an
348
- * assert; the accepted prefix for a verify; 0 when the engine declined).
349
- * MUST be called exactly once per proposal returned by push(). */
350
- commit(proposal: Proposal, accepted: number): void {
351
- const n = Math.max(0, Math.min(accepted, proposal.ids.length));
352
- const rejected = proposal.ids.length - n;
353
- if (proposal.policy === "verify") {
354
- this.stats.verifyAccepted += n;
355
- this.stats.verifyRejected += rejected;
356
- }
357
- if (n === 0) return;
358
- const ids = proposal.ids.slice(0, n);
359
- this.#append(ids);
360
- this.stats.events++;
361
- this.stats.injected += n;
362
- if (proposal.origin === "echo") this.stats.echo += n;
363
- else this.stats.strict += n;
364
- this.stats.spanLens.push(n);
365
- }
366
-
367
- /** A verify proposal reached the forward (the checkpoint was taken). */
368
- noteVerifyEvent(checkpointMs: number): void {
369
- this.stats.verifyEvents++;
370
- this.stats.checkpointMs += checkpointMs;
371
- }
372
-
373
- /** A verify proposal was dropped: this model's caches cannot rewind. */
374
- noteVerifyUnsupported(): void {
375
- this.stats.verifyUnsupported++;
376
- }
377
-
378
- /** The engine dropped an in-flight sampled token to take an ASSERT fill. */
379
- noteWastedSample(): void {
380
- this.stats.wastedSamples++;
381
- }
382
-
383
- /** The tool-call parser rejected this request's markup. Strict rows are
384
- * disarmed for the rest of the request — the template's own rendering
385
- * disagreed with what the model actually emits, so every further row is
386
- * suspect. (Echo rows are unaffected: they never claimed to be schema.)
387
- *
388
- * REALITY NOTE: the served parse (ToolAwareStream.toolCalls →
389
- * parseGeneratedToolCalls) runs at sink FLUSH, i.e. after the generation
390
- * has ended, so within one request this is telemetry and the disarm has no
391
- * remaining tokens to act on. The seam is here so a future incremental
392
- * parse (or a plan cached across requests) disarms for real. */
393
- noteParseFailure(): void {
394
- if (this.stats.strict === 0) return; // no strict row armed this request
395
- this.stats.parseFallback++;
396
- this.#strict.disable();
397
- }
398
-
399
- // --- TokenView ---------------------------------------------------------
400
- get length(): number { return this.#length; }
401
- get budget(): number { return this.#budget; }
402
- tail(n: number): readonly number[] {
403
- return n >= this.#tail.length ? this.#tail : this.#tail.slice(this.#tail.length - n);
404
- }
405
-
406
- #append(ids: readonly number[]): void {
407
- this.#length += ids.length;
408
- for (const source of this.#sources) source.observe?.(ids);
409
- this.#tail.push(...ids);
410
- if (this.#tail.length > this.#window)
411
- this.#tail.splice(0, this.#tail.length - this.#window);
412
- }
413
-
414
- /** Clamp order: EOS → delimiter → max span / caller budget → reject <2.
415
- * A one-token span saves no forward (the engine already had that token's
416
- * successor in flight), so it is never worth the discarded dispatch.
417
- *
418
- * `applyDelimiters` is ECHO-ONLY. A delimiter marks where an argument VALUE
419
- * ends, which is exactly where a copied span must stop — but a template
420
- * scaffold legitimately contains the same tokens as structure (`{"name": "`
421
- * is three quotes deep), and it is determined by construction. Clamping
422
- * strict rows on delimiters would cut every scaffold at its first quote. */
423
- #clamp(
424
- emit: readonly number[], budget: number, applyDelimiters: boolean,
425
- ): { ids: number[]; truncated: boolean } | null {
426
- let ids = emit as number[];
427
- let truncated = false;
428
- for (let i = 0; i < ids.length; i++) {
429
- if (this.#eos.has(ids[i]!)) { ids = ids.slice(0, i); truncated = true; break; }
430
- }
431
- if (applyDelimiters && this.#delimiters.size) {
432
- for (let i = 0; i < ids.length; i++) {
433
- // A span may END at a delimiter — injecting the closing quote is the
434
- // point — but never continue past one.
435
- if (this.#delimiters.has(ids[i]!)) {
436
- if (i + 1 < ids.length) { ids = ids.slice(0, i + 1); truncated = true; }
437
- break;
438
- }
439
- }
440
- }
441
- const cap = Math.min(
442
- this.#maxSpan,
443
- Number.isFinite(budget) ? Math.max(0, Math.floor(budget)) : this.#maxSpan,
444
- );
445
- if (ids.length > cap) { ids = ids.slice(0, cap); truncated = true; }
446
- if (ids.length < 2) return null;
447
- if (truncated) this.stats.indexTruncated++;
448
- return { ids: ids === emit ? [...ids] : ids, truncated };
449
- }
450
- }
451
-
452
- export type { ProposalOrigin };
@@ -1,68 +0,0 @@
1
- // One interface for every source that can propose the next tokens.
2
- //
3
- // A proposal is a claim about the sequence, plus how strongly it is held:
4
- //
5
- // assert — the tokens are DETERMINED (a chat template's tool-call scaffold
6
- // is a function of the request's `tools`). The engine appends them
7
- // and moves on: no readback, no rewind, no checkpoint. This is
8
- // context extension, not speculation.
9
- // verify — the tokens are LIKELY (a span copied from earlier in the same
10
- // session). The engine appends them in the same single forward,
11
- // then reads the argmax already sitting in that forward's logits
12
- // at every span position — free, no extra pass — keeps the agreed
13
- // prefix, rewinds the rest, and resumes decode at the first
14
- // disagreement.
15
- //
16
- // Both policies share the expensive half: ONE chunked forward that advances
17
- // the KV (and recurrent SSM state) over the whole span. That shared primitive
18
- // lives in generate.ts; everything here is bookkeeping.
19
- //
20
- // MIGRATION NOTE. The shipped speculative lane (src/spec/) has its own
21
- // `DraftSource` seam with a verify/rollback executor of its own (ngram, MTP,
22
- // two-model, DSpark). Those are NOT rewired onto this interface in this phase
23
- // — the adapter (a DraftSource wrapped as a `verify`-policy ProposalSource, so
24
- // one apply primitive serves both lanes) is future work, deliberately deferred
25
- // so the spec lane's oracles stay untouched.
26
-
27
- /** What a source can see of the sequence so far. */
28
- export interface TokenView {
29
- /** Tokens seen: prompt + everything emitted (injected tokens included). */
30
- readonly length: number;
31
- /** The last `n` ids, oldest first. Shorter near the start of a request, and
32
- * bounded by the session's retained window — a source that needs more
33
- * history keeps its own copy (see observe()). */
34
- tail(n: number): readonly number[];
35
- /** Tokens the caller may still emit (max_tokens − generated). */
36
- readonly budget: number;
37
- }
38
-
39
- /** How strongly a proposal is held — see the file header. */
40
- export type ProposalPolicy = "assert" | "verify";
41
-
42
- /** Where a proposal came from. `ngram`/`mtp` are reserved for the spec-lane
43
- * adapter that does not exist yet (see MIGRATION NOTE). */
44
- export type ProposalOrigin = "schema" | "template" | "echo" | "ngram" | "mtp";
45
-
46
- export interface Proposal {
47
- ids: number[];
48
- policy: ProposalPolicy;
49
- origin: ProposalOrigin;
50
- /** Echo only: the span stopped because the session history forked here
51
- * (multiple distinct continuations). Telemetry + policy input. */
52
- branchStop?: boolean;
53
- }
54
-
55
- export interface ProposalSource {
56
- readonly name: string;
57
- /** How many trailing tokens this source needs to see in `TokenView.tail`.
58
- * The session retains the maximum across its sources; a source that needs
59
- * more history than that keeps its own copy (see observe()). */
60
- readonly windowNeeded?: number;
61
- /** Propose the tokens that follow `tail`, or null. The caller clamps
62
- * (EOS / delimiter / max span / budget), so a source may return more than
63
- * the budget allows. */
64
- propose(tail: TokenView): Proposal | null;
65
- /** Every token that actually entered the sequence — sampled or injected —
66
- * in order. Sources that maintain an index grow it here. */
67
- observe?(ids: readonly number[]): void;
68
- }