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
@@ -0,0 +1,60 @@
1
+ /** Request facts only. Native resources remain with the preparation owner. */
2
+ export interface ExecutionRequirements {
3
+ readonly hasVision: boolean;
4
+ readonly hasAdapters: boolean;
5
+ readonly hasRepetitionPenalty: boolean;
6
+ readonly userSeed: boolean;
7
+ readonly kvQuant: boolean;
8
+ readonly turboQuant: boolean;
9
+ readonly hasLogitsExtras: boolean;
10
+ readonly hasGrammar: boolean;
11
+ readonly wantsLogprobs: boolean;
12
+ readonly hasDraft: boolean;
13
+ }
14
+
15
+ export interface ExecutionCapabilities {
16
+ readonly method: "autoregressive" | "denoising";
17
+ readonly continuous: boolean;
18
+ readonly quantizedBatch: boolean;
19
+ readonly grammarBatch: boolean;
20
+ readonly adapterBatch?: boolean;
21
+ readonly pagedBatch?: boolean;
22
+ readonly checkpoints: boolean;
23
+ /** Bound ordinary driver can restore/capture this request configuration. */
24
+ readonly sharedCheckpoints?: boolean;
25
+ /** Model-qualified speculative execution can retain this request's KV codec. */
26
+ readonly speculativeKvQuant?: boolean;
27
+ readonly speculativeTurboQuant?: boolean;
28
+ readonly turboQuantBatch?: boolean;
29
+ readonly speculativeLogprobs?: boolean;
30
+ /** The grouped provider supports the target's mounted adapter context. */
31
+ readonly sharedSpeculativeAdapters?: boolean;
32
+ /** Methods supplied by the model's shared execution binding. */
33
+ readonly groupedMethods?: readonly string[];
34
+ /** A graph-owned compiled step exists; cache geometry can still decline it. */
35
+ readonly compiledDecode?: boolean;
36
+ }
37
+
38
+ export interface ExecutionFeatures {
39
+ readonly pagedKv: boolean;
40
+ readonly fill: boolean;
41
+ readonly compiledDecode?: boolean;
42
+ readonly grammarJump?: boolean;
43
+ }
44
+
45
+ /** Selected once; consumers execute/report these values without reselecting. */
46
+ export interface ResolvedExecution {
47
+ /** Implementation-owned method ID. The built-in planner retains its known
48
+ * methods; another model may register a different set without editing this contract. */
49
+ readonly method: string;
50
+ readonly mechanism: "serial" | "continuous";
51
+ readonly pagedKv: boolean;
52
+ readonly promptCache: boolean;
53
+ readonly checkpoint: boolean;
54
+ readonly fill: boolean;
55
+ /** Permission to attempt the bound compiled step, never a promise that
56
+ * every dynamic row/state shape supports replay. */
57
+ readonly compiledDecode: boolean;
58
+ readonly grammarJump: boolean;
59
+ readonly reasons: readonly string[];
60
+ }
@@ -0,0 +1,103 @@
1
+ /** Portable execution contracts. No transport, model, tensor, or runtime imports. */
2
+ export type CancelReason = "requested" | "consumer_closed" | "consumer_idle" | "engine_closed";
3
+
4
+ export interface Cancellation {
5
+ readonly reason: CancelReason | undefined;
6
+ /** Invoked immediately when already cancelled. Returns an idempotent unsubscribe. */
7
+ subscribe(listener: (reason: CancelReason) => void): () => void;
8
+ }
9
+
10
+ export interface TokenLogprobs {
11
+ /** Selected-token logprob, before sampler truncation. */
12
+ logprob?: number;
13
+ /** Top-k pairs, sorted by descending logprob. */
14
+ top?: { id: number; logprob: number }[];
15
+ }
16
+
17
+ export type GenerationEvent =
18
+ | { readonly type: "committed"; readonly sequence: number;
19
+ readonly tokenIds: readonly number[]; readonly logprobs?: readonly (TokenLogprobs | undefined)[] }
20
+ | { readonly type: "progress"; readonly completed: number; readonly total?: number };
21
+
22
+ /** Methods publish in order and await each publication before publishing again.
23
+ * Only committed tokens cross this boundary. Tentative canvases/drafts stay private. */
24
+ export interface GenerationOutput {
25
+ /** False requests a normal stop. The method must stop publishing and settle
26
+ * its metrics after releasing its private execution state. */
27
+ commit(tokenIds: readonly number[], logprobs?: readonly (TokenLogprobs | undefined)[]): Promise<void | false>;
28
+ progress(completed: number, total?: number): Promise<void>;
29
+ }
30
+
31
+ export interface MethodResult<Metrics> {
32
+ readonly finishReason: "stop" | "length";
33
+ readonly metrics: Metrics;
34
+ }
35
+
36
+ /** One attempt's private state, including any pending device work.
37
+ * close must await safe resource release, including on execute failure. */
38
+ export interface MethodRun<Metrics> {
39
+ execute(output: GenerationOutput, cancellation: Cancellation): Promise<MethodResult<Metrics>>;
40
+ close(): Promise<void>;
41
+ }
42
+
43
+ export interface InferenceMethod<Metrics> {
44
+ readonly id: string;
45
+ /** A rejected creation must release its own partial allocations. */
46
+ createRun(cancellation: Cancellation): Promise<MethodRun<Metrics>>;
47
+ }
48
+
49
+ export interface ExecutionPlan<Metrics> {
50
+ readonly id: string;
51
+ readonly outputTokenLimit: number;
52
+ readonly method: InferenceMethod<Metrics>;
53
+ }
54
+
55
+ export interface ExecutionPlanner<Request, Metrics> {
56
+ /** Planning selects a bound implementation; it does not allocate device state. */
57
+ plan(request: Request, cancellation: Cancellation): Promise<ExecutionPlan<Metrics>>;
58
+ }
59
+
60
+ export type GenerationOutcome<Metrics> =
61
+ | { readonly status: "completed"; readonly committedTokens: number;
62
+ readonly output?: Uint32Array; readonly result: MethodResult<Metrics> }
63
+ | { readonly status: "cancelled"; readonly committedTokens: number;
64
+ readonly output?: Uint32Array; readonly reason: CancelReason }
65
+ | { readonly status: "failed"; readonly committedTokens: number;
66
+ readonly output?: Uint32Array; readonly error: { readonly code: string; readonly message: string;
67
+ readonly cleanupError?: string } };
68
+
69
+ export type SessionState = "created" | "preparing" | "running" | "settling" | "terminal";
70
+
71
+ export type RunControl = {
72
+ /** collect returns token IDs; per-token logprobs require stream consumption. */
73
+ readonly output: "stream" | "collect";
74
+ readonly cancellation?: Cancellation;
75
+ } | {
76
+ /** Direct delivery for consumers that already own bounded output storage.
77
+ * The callback is awaited before execution continues; false is a normal
78
+ * token stop. Borrowed arrays are valid until the callback settles. */
79
+ readonly output: "callback";
80
+ readonly onTokens: GenerationOutput["commit"];
81
+ readonly cancellation?: Cancellation;
82
+ };
83
+
84
+ export interface GenerationSession<Metrics> {
85
+ readonly id: string;
86
+ readonly state: SessionState;
87
+ /** Single consumer. Stream mode starts on first next(); collect mode has no events. */
88
+ readonly events: AsyncIterable<GenerationEvent>;
89
+ /** Always resolves with one terminal outcome, after native resources are released. */
90
+ readonly result: Promise<GenerationOutcome<Metrics>>;
91
+ cancel(reason?: CancelReason): Promise<void>;
92
+ close(): Promise<void>;
93
+ }
94
+
95
+ export interface InferenceEngine<Request, Metrics> {
96
+ open(request: Request, control: RunControl): Promise<GenerationSession<Metrics>>;
97
+ close(): Promise<void>;
98
+ }
99
+
100
+ /** Injected host timer. The portable engine has no DOM/Node/Bun dependency. */
101
+ export interface Timer {
102
+ after(milliseconds: number, callback: () => void): () => void;
103
+ }
@@ -0,0 +1,7 @@
1
+ /** Transport-specific request/response values stay outside portable policy. */
2
+ export interface EngineHost<Request, Response> {
3
+ readonly ready: Promise<void>;
4
+ forward(request: Request): Promise<Response>;
5
+ /** Stop accepting work and wait until the owned worker has exited. */
6
+ close(): Promise<void>;
7
+ }
@@ -0,0 +1,66 @@
1
+ // Shared job-system contract. Both the job runner (src/jobs/*) and every
2
+ // job producer (src/dataset/*, src/quantize/*, src/train/*) speak this
3
+ // vocabulary. Mirrors the optiq lab SSE event grammar so the web wizards
4
+ // port over mechanically (started → log/stage/metric → done|failed).
5
+
6
+ /** A single streamed job event, serialized one-per-line into the job's
7
+ * NDJSON log and re-emitted to the browser as SSE `data:` frames. */
8
+ export type JobEvent =
9
+ | { type: "started"; ts: number }
10
+ | { type: "log"; line: string }
11
+ | {
12
+ type: "stage";
13
+ stage: string;
14
+ progress?: number; // 0..1
15
+ message?: string;
16
+ output_dir?: string;
17
+ adapter_path?: string;
18
+ n_train?: number;
19
+ n_valid?: number;
20
+ [k: string]: unknown;
21
+ }
22
+ | {
23
+ type: "metric";
24
+ kind: "train" | "val";
25
+ step: number;
26
+ loss: number;
27
+ learning_rate?: number;
28
+ tokens_per_sec?: number;
29
+ progress?: number;
30
+ message?: string;
31
+ [k: string]: unknown; // grad_norm, learning_rate, tokens_per_sec, accuracy, margin, progress, message
32
+ }
33
+ | { type: "done"; ts: number; output_dir?: string; summary?: unknown; n_train?: number; n_valid?: number; [k: string]: unknown }
34
+ | { type: "failed"; error: string; ts: number };
35
+
36
+ /** Sink a job calls to report progress. Implementations append to the log
37
+ * file and (for stage/metric events carrying `progress`/`message`) update
38
+ * the SQLite row. Never throws — a logging failure must not kill a job. */
39
+ export type Emit = (e: JobEvent) => void;
40
+
41
+ /** The unit of work. Returns an optional output path recorded on the row.
42
+ * Receives the parsed `config` from the submit request. */
43
+ export type JobRunner = (
44
+ emit: Emit,
45
+ config: Record<string, unknown>,
46
+ ) => Promise<{ outputPath?: string } | void>;
47
+
48
+ /** Job kinds in the system. */
49
+ export type JobKind = "quantize" | "finetune" | "dataset" | "noop" | "crash";
50
+
51
+ export type JobStatus = "queued" | "running" | "done" | "failed" | "zombie";
52
+
53
+ /** A persisted job row (shape returned by the HTTP `GET /api/jobs/:id`). */
54
+ export interface JobRow {
55
+ id: string;
56
+ kind: string;
57
+ status: JobStatus;
58
+ config_json: string;
59
+ progress: number;
60
+ message: string | null;
61
+ log_path: string;
62
+ output_path: string | null;
63
+ error: string | null;
64
+ started_at: string;
65
+ ended_at: string | null;
66
+ }
@@ -0,0 +1,30 @@
1
+ export interface PiModelOptions {
2
+ name?: string;
3
+ contextWindow?: number;
4
+ maxTokens?: number;
5
+ reasoning?: boolean;
6
+ vision?: boolean;
7
+ }
8
+
9
+ /** Self-contained so the standalone Pi extension can embed the same builder. */
10
+ export function piModelDefinition(options: PiModelOptions = {}) {
11
+ return {
12
+ id: "local",
13
+ name: options.name ?? "mlx-bun (local)",
14
+ api: "openai-completions" as const,
15
+ reasoning: options.reasoning ?? false,
16
+ compat: { supportsDeveloperRole: false,
17
+ ...(options.reasoning ? { thinkingFormat: "qwen-chat-template" as const } : {}) },
18
+ input: (options.vision ? ["text", "image"] : ["text"]) as ("text" | "image")[],
19
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
20
+ contextWindow: options.contextWindow ?? 32768,
21
+ maxTokens: options.maxTokens ?? 8192,
22
+ };
23
+ }
24
+
25
+ export const PI_PROVIDER_ID = "mlx-bun";
26
+ export const PI_API_KEY = "sk-mlx-bun-local";
27
+ export const PI_LOCAL_MODEL_ID = piModelDefinition().id;
28
+ export const PI_API = piModelDefinition().api;
29
+ export const DEFAULT_CONTEXT_WINDOW = piModelDefinition().contextWindow;
30
+ export const DEFAULT_MAX_TOKENS = piModelDefinition().maxTokens;
@@ -0,0 +1,259 @@
1
+ /** Shared browser/server protocol. Data only; no SDK, DOM, or native imports. */
2
+ export type Lane = "serial" | "serial+spec" | "batched";
3
+ export const APP_ROUTE_IDS = ["chat", "quantize", "finetune", "dataset", "status"] as const;
4
+
5
+ export type ApprovalDecision = "allow" | "deny";
6
+
7
+ export interface ImageAttachment {
8
+ data: string;
9
+ mimeType: string;
10
+ }
11
+
12
+ export type ClientMessage =
13
+ | { type: "prompt"; text: string; images?: ImageAttachment[] }
14
+ | { type: "abort" }
15
+ // `editedArgs`: when the user edited the proposed arguments in the
16
+ // approval card's textarea before approving, the (re-parsed) JSON object
17
+ // to substitute for the tool's original input — mutated onto the pi SDK's
18
+ // ToolCallEvent.input in place (the SDK's documented mutation contract;
19
+ // see installApprovalGate). Ignored on "deny". `alwaysAllow`: persist this
20
+ // tool to the durable always-allow config (src/tool-approvals.ts) so
21
+ // future calls to the SAME TOOL NAME skip the card entirely, on this and
22
+ // every other session.
23
+ | { type: "approval"; callId: string; decision: ApprovalDecision; editedArgs?: Record<string, unknown>; alwaysAllow?: boolean }
24
+ // Toggle the model's reasoning channel on/off (only meaningful when the
25
+ // model supports thinking — ready.thinking). Maps to Pi's session thinking
26
+ // level: "medium" (on) ↔ "off". Pi sends it as enable_thinking to the server.
27
+ | { type: "set_thinking"; enabled: boolean }
28
+ // Opt-in toggle (plan §5.4/§6.5/§9 Phase 2, default OFF): "let the agent
29
+ // touch files on this machine". Persisted per-browser by the client
30
+ // (localStorage `mlxbun.codingTools`); the ALLOWLIST decision is enforced
31
+ // here, server-side. buildPiAgentSurface's tool list is fixed for the
32
+ // life of an AgentSession (pi's DefaultResourceLoader config is baked in
33
+ // at createAgentSessionServices time), so this can't rewire an
34
+ // in-progress session — it takes effect starting with the next
35
+ // new_session/open_session/fork_session (createRuntimeFactory reads
36
+ // this.codingToolsRequested fresh every time the SDK calls it, including
37
+ // from AgentSessionRuntime.newSession()'s internal re-invocation). The
38
+ // `coding_tools` ServerMessage below reports the honest current-vs-pending
39
+ // state so the UI can say so instead of implying it applies immediately.
40
+ | { type: "set_coding_tools"; enabled: boolean }
41
+ // Select the active LoRA adapter for subsequent turns (null = none/base).
42
+ // app.html mounts it (POST /v1/adapters) before sending this; the
43
+ // before_provider_request hook injects it into the provider payload.
44
+ | { type: "set_adapter"; id: string | null }
45
+ // Per-request sampling overrides. Each field is optional; null/undefined
46
+ // means "leave it to the server default" (the mode-aware recommended
47
+ // value resolved in toOptions). A present numeric value is injected into
48
+ // the provider payload and always wins. The before_provider_request hook
49
+ // injects whatever is set here.
50
+ //
51
+ // `scope` (plan §9 Phase 3 / beat matrix Axis 4 "per-message sampling
52
+ // scope"): "session" (default, omitting the field means this too) persists
53
+ // the override on the connection until changed — today's behavior,
54
+ // unchanged. "next_turn" stores a ONE-SHOT override applied to exactly
55
+ // the next prompt's injection, then cleared automatically — it never
56
+ // touches the session-level values (a later plain set_sampling with
57
+ // scope:"session" or omitted still sees whatever was there before this
58
+ // message). Composition when both are present: next_turn's SET fields
59
+ // win over session's for that one request; anything next_turn leaves
60
+ // null/unset falls back to the session-level override for that field
61
+ // (composeSampling — session-level itself falls back to the server's
62
+ // mode-aware default per injectSampling's existing contract).
63
+ | {
64
+ type: "set_sampling";
65
+ scope?: "session" | "next_turn";
66
+ temperature?: number | null;
67
+ top_p?: number | null;
68
+ top_k?: number | null;
69
+ min_p?: number | null;
70
+ xtc_probability?: number | null;
71
+ xtc_threshold?: number | null;
72
+ repetition_penalty?: number | null;
73
+ repetition_context_size?: number | null;
74
+ presence_penalty?: number | null;
75
+ frequency_penalty?: number | null;
76
+ seed?: number | null;
77
+ }
78
+ // Per-session USER system prompt, layered ON TOP OF (not replacing) the
79
+ // built-in surface prompt (buildWebChatSystemPrompt + memoryHint). null
80
+ // clears it. Applied by the before_agent_start hook on the NEXT turn (pi
81
+ // calls it fresh inside every session.prompt(), so this is a true
82
+ // per-turn injection, not a session-creation-only setting — see
83
+ // installSystemPromptHook). Presets v1 (composer.ts) send this alongside
84
+ // set_sampling to apply a saved bundle.
85
+ | { type: "set_system_prompt"; text: string | null }
86
+ // Session management (recent-chats sidebar + new chat).
87
+ | { type: "new_session" }
88
+ | { type: "list_sessions" }
89
+ | { type: "open_session"; path: string }
90
+ | { type: "fork_session"; path: string }
91
+ | { type: "delete_session"; path: string }
92
+ // Message actions (plan §5.2). All three navigate the session's leaf
93
+ // pointer via AgentSession.navigateTree() then re-prompt — a sibling
94
+ // branch in the SAME session file, never a new one (see the helpers above
95
+ // findLastUserMessageEntry for the full rationale). Regenerate re-sends the
96
+ // last user message's original content verbatim; edit_resend re-sends it
97
+ // with edited text (images preserved); switch_sibling moves the active
98
+ // leaf to a previously-created sibling (an earlier edit/regeneration)
99
+ // without sending anything new.
100
+ | { type: "regenerate" }
101
+ | { type: "edit_resend"; text: string }
102
+ | { type: "switch_sibling"; entryId: string }
103
+ // App-aware assistant (plan §6.6, §9 Phase 3, beat matrix Axis 12): pushed
104
+ // by chat.ts on every route change AND on wizard-step change (quantize/
105
+ // finetune/dataset), never on a timer. `context` is opaque here (the
106
+ // browser's AppContext shape, src/web/src/assistant.ts) — stored verbatim
107
+ // as the connection's currentAppContext and returned by the
108
+ // get_current_app_context tool, plus mined for the compact one-line
109
+ // ambient context auto-prepended to the NEXT prompt (see
110
+ // installAppContextHook / ambientContextLine). This is a DIFFERENT frame
111
+ // from the server->client `context` ServerMessage (context-window usage,
112
+ // above) — same name, opposite direction, disambiguated by which type
113
+ // union it's a member of; the two are never in scope at the same call
114
+ // site (ClientMessage here vs. ServerMessage below).
115
+ | { type: "context"; context: AppUiContext };
116
+
117
+ export interface UiSnapshotElement {
118
+ ref: string;
119
+ tag: string;
120
+ label: string;
121
+ kind: "interactive" | "region";
122
+ role?: string;
123
+ selector: string;
124
+ spotlightId?: string;
125
+ }
126
+
127
+ export interface UiSnapshot {
128
+ route: string;
129
+ capturedAt: string;
130
+ elements: UiSnapshotElement[];
131
+ }
132
+
133
+ export interface WizardStep {
134
+ index: number;
135
+ count: number;
136
+ label: string;
137
+ }
138
+
139
+ export interface AppUiContext {
140
+ route: string;
141
+ view?: string;
142
+ step?: WizardStep;
143
+ snapshot: UiSnapshot;
144
+ }
145
+
146
+ export type AppRouteId = (typeof APP_ROUTE_IDS)[number];
147
+
148
+ export interface ReadyGenDefaults {
149
+ temperature: number | null;
150
+ topP: number | null;
151
+ topK: number | null;
152
+ }
153
+
154
+ export type ServerMessage =
155
+ // `vision`: whether the loaded model can accept images (drives the UI's
156
+ // image-attach affordance — false on e4b until the SigLIP sidecar lands).
157
+ // `audio`: whether the loaded model can accept `input_audio` parts (audio
158
+ // tower loaded or loadable). Discovery-only for now: pi's Model.input type
159
+ // has no "audio" modality, so unlike `vision` this flag never feeds the
160
+ // provider declaration — clients use it instead of probing for a 400.
161
+ // `thinking`: whether the model has a switchable reasoning channel (drives
162
+ // the UI's thinking on/off toggle; false hides it).
163
+ | { type: "ready"; model: string; vision: boolean; audio: boolean; thinking: boolean; genDefaults: ReadyGenDefaults }
164
+ | { type: "turn_start" }
165
+ | { type: "text_delta"; delta: string }
166
+ | { type: "thinking_delta"; delta: string }
167
+ | { type: "tool_start"; callId: string; tool: string; args: unknown }
168
+ | { type: "tool_approval_request"; callId: string; tool: string; args: unknown }
169
+ | { type: "tool_update"; callId: string; chunk: unknown }
170
+ | { type: "tool_end"; callId: string; ok: boolean; result: unknown }
171
+ // `lane`: the serving lane the just-finished turn ran on (serial /
172
+ // serial+spec / batched), correlated via the lane registry keyed by the
173
+ // AssistantMessage's responseId (the pi SDK's own usage parsing drops
174
+ // custom fields — see src/serve/lane-registry.ts). Absent when the turn
175
+ // produced no assistant message with a responseId (e.g. an aborted turn
176
+ // before any model call) — never guessed client-side (risk #5).
177
+ | { type: "turn_end"; lane?: Lane }
178
+ | { type: "queue_update"; steering: readonly string[]; followUp: readonly string[] }
179
+ // Replay a session's transcript (rebuilds the thread); and the sidebar list.
180
+ | { type: "history"; items: HistoryItem[] }
181
+ | { type: "sessions"; items: SessionListItem[]; activePath?: string }
182
+ // Sibling group for the LAST user message (edit-and-resend's `< i/n >`
183
+ // toggle, plan §5.2). Sent after every history rebuild and after a
184
+ // completed turn. `count` <= 1 means no toggle to show (the common case:
185
+ // no edits/regenerations yet). `entryId` is the currently-active sibling's
186
+ // id; `siblingIds` is the full ordered group so the client can resolve
187
+ // "previous/next" locally and send switch_sibling with a concrete id
188
+ // (never inferred/guessed — the server is the source of truth for order).
189
+ | { type: "siblings"; entryId?: string; index: number; count: number; siblingIds: string[] }
190
+ // Context-window usage indicator. tokens/percent are null right after a
191
+ // compaction until the next assistant reply (pi can't estimate yet).
192
+ | { type: "context"; tokens: number | null; contextWindow: number; percent: number | null }
193
+ // Effective vs. pending codingTools state (set_coding_tools above).
194
+ // `active` is what the CURRENT session actually built with (gates
195
+ // whether the approval card can ever fire); `pending` is the browser's
196
+ // most recent request, which only takes effect on the next
197
+ // new/opened/forked session — surfaced so the settings copy can say
198
+ // "will apply to your next new chat" instead of lying about immediacy.
199
+ | { type: "coding_tools"; active: boolean; pending: boolean }
200
+ // Full always-allow set for THIS machine (src/tool-approvals.ts), sent on
201
+ // `ready` and after any change, so the settings panel can list/forget
202
+ // durable per-tool approvals without a separate REST round-trip.
203
+ | { type: "tool_approvals"; alwaysAllow: string[] }
204
+ // App-aware assistant (plan §6.6): the navigate_app / spotlight_ui tools'
205
+ // side-channel notifications, mapped 1:1 from the tool call's params —
206
+ // never guessed or re-derived, so chat.ts's router/spotlight get exactly
207
+ // what the model asked for. `route` here is always a validated
208
+ // AppRouteId (isAppRouteId already ran server-side before this frame is
209
+ // ever sent — see navigate_app's execute). ui_spotlight's fields mirror
210
+ // SpotlightRequest 1:1 (assistant.ts resolves ref/label/selector/target
211
+ // client-side, in that precedence order, against its last snapshot).
212
+ | { type: "ui_navigate"; route: AppRouteId }
213
+ | { type: "ui_spotlight"; ref?: string; label?: string; selector?: string; target?: string; message?: string; route?: AppRouteId }
214
+ | { type: "error"; message: string };
215
+
216
+ export interface HistoryToolItem {
217
+ callId: string;
218
+ name: string;
219
+ args: unknown;
220
+ /** Tool result text, filled from the matching toolResult message. */
221
+ result: string;
222
+ }
223
+
224
+ export interface HistoryItem {
225
+ role: "user" | "assistant";
226
+ text: string;
227
+ /** Model reasoning/thinking, kept separate from the final answer. */
228
+ thinking?: string;
229
+ tools: HistoryToolItem[];
230
+ /** Session entry id (user items only). Lets the browser correlate "the
231
+ * last user message" in the replayed thread with the `siblings` frame's
232
+ * entryId, so it knows which DOM node gets the edit/sibling-toggle UI
233
+ * (plan §5.2). Undefined for assistant items — they aren't fork targets. */
234
+ entryId?: string;
235
+ }
236
+
237
+ export interface SessionListItem {
238
+ path: string;
239
+ id: string;
240
+ title: string;
241
+ /** Last-modified epoch ms (newest first). */
242
+ modified: number;
243
+ messageCount: number;
244
+ forked: boolean;
245
+ }
246
+
247
+ export interface SamplingOverrides {
248
+ temperature?: number | null;
249
+ top_p?: number | null;
250
+ top_k?: number | null;
251
+ min_p?: number | null;
252
+ xtc_probability?: number | null;
253
+ xtc_threshold?: number | null;
254
+ repetition_penalty?: number | null;
255
+ repetition_context_size?: number | null;
256
+ presence_penalty?: number | null;
257
+ frequency_penalty?: number | null;
258
+ seed?: number | null;
259
+ }
@@ -0,0 +1,23 @@
1
+ /** A reusable prefix and the backend/method state that covers its tokens.
2
+ * The caller owns a returned hit. After releasing or returning its state,
3
+ * it must release any retained backing through retain. */
4
+ export interface PrefixCacheHit<State, Attachment = never> {
5
+ tokens: number[];
6
+ caches: State;
7
+ attachments?: Attachment;
8
+ retain?: () => void;
9
+ }
10
+
11
+ /** Storage is independent of request scheduling and the method producing
12
+ * state. Both prefill and decode can publish processed-token prefixes.
13
+ * State is opaque here; its backend/method defines layout and alignment.
14
+ * Implementations own prefix selection, retention and storage tiers. */
15
+ export interface PrefixCache<State, Attachment = never> {
16
+ /** Return owned state for the longest usable prefix, or null on a miss.
17
+ * Namespace distinguishes incompatible artifacts, methods and adapters. */
18
+ take(prompt: number[], ns?: string): PrefixCacheHit<State, Attachment> | null;
19
+ /** Transfer state and its optional backing release to storage. If this
20
+ * throws, ownership stays with the caller; successful return transfers
21
+ * ownership even when storage immediately spills or disposes the entry. */
22
+ put(tokens: number[], caches: State, ns?: string, retain?: () => void, attachments?: Attachment): void;
23
+ }
@@ -0,0 +1,25 @@
1
+ /** A single owner. Borrowing does not extend lifetime; transfer invalidates
2
+ * the old owner. close is idempotent, including when release throws. */
3
+ export interface ResourceOwner<T> {
4
+ borrow(): T;
5
+ transfer(): T;
6
+ close(): void;
7
+ }
8
+
9
+ /** State views may own temporary handles or borrow live state. Consumers
10
+ * always close the lease; only the provider knows which handles to release. */
11
+ export interface StateView<T> {
12
+ borrow(): readonly T[];
13
+ close(): void;
14
+ }
15
+
16
+ export interface DisposableResource {
17
+ dispose(): void;
18
+ }
19
+
20
+ /** A prepared replacement for live state. Commit once between method rounds;
21
+ * it publishes already-built state without graph work or validation. Dispose
22
+ * releases the unpublished replacement, or the superseded state after commit. */
23
+ export interface PreparedStateChange extends DisposableResource {
24
+ commit(): void;
25
+ }
@@ -0,0 +1,23 @@
1
+ /** Sampling owns score processing, token selection, and request-local history.
2
+ * Score/token representations and sync/device execution belong to the backend;
3
+ * this contract has no scheduling, cache, or tensor-runtime dependency. */
4
+ export interface SampledToken<Token, Metadata> {
5
+ token: Token;
6
+ extras: Metadata | null;
7
+ }
8
+
9
+ export interface SamplingSession<Scores, DeviceToken, Result> {
10
+ /** Optional stateless operation shared across compatible rows and positions.
11
+ * It borrows scores and returns owned device tokens, without advancing history. */
12
+ readonly independent?: { sample(scores: Scores): DeviceToken };
13
+ readonly isPlainGreedy: boolean;
14
+ readonly capturesLogprobs: boolean;
15
+ readonly needsHistory: boolean;
16
+ /** Borrows scores; transfers ownership of the result to the caller. */
17
+ sample(logits: Scores, step: number): Result;
18
+ seedHistory(tokens: readonly number[]): void;
19
+ /** Commit accepted tokens when configured for manual history updates. */
20
+ commitDevice(token: DeviceToken): void;
21
+ commitNumbers(tokens: readonly number[]): void;
22
+ dispose(): void;
23
+ }
@@ -0,0 +1,45 @@
1
+ /** Backend-owned context shared by compatible requests. A key identifies
2
+ * equivalent execution state; enter returns its scoped release. Scheduling
3
+ * observes group readiness without inspecting this context. */
4
+ export interface ExecutionContext {
5
+ readonly key: string;
6
+ enter(): () => void;
7
+ }
8
+
9
+ /** A backend execution group exposes bounded work units and readiness. Queue
10
+ * payloads, tensors, cache merging and sampling remain inside its adapter. */
11
+ export interface ExecutionGroup {
12
+ readonly active: number;
13
+ readonly queued: number;
14
+ readonly preparing: boolean;
15
+ readonly preparingRows?: number;
16
+ /** The preparation owner can accept another row before its next work unit. */
17
+ readonly canPrepareMore?: boolean;
18
+ /** Work estimates affect grouping only. A request larger than this budget
19
+ * still runs alone; it is never rejected or sent to another executor. */
20
+ readonly preparingTokens?: number;
21
+ readonly nextPreparationTokens?: number;
22
+ readonly maxPreparationTokens?: number;
23
+ /** The latest preparation published output that can be flushed by yielding. */
24
+ readonly preparationPublishedOutput?: boolean;
25
+ readonly maxActive: number;
26
+ readonly admissionHeld: boolean;
27
+ readonly closed: boolean;
28
+ pruneCancelled(): void;
29
+ /** May reject/remove an impossible queued request before returning false. */
30
+ admitNext(): boolean;
31
+ /** Read-only budget check used to preserve admission before decode. */
32
+ canBurst(): boolean;
33
+ advancePreparation(): Promise<void>;
34
+ advance(): Promise<void>;
35
+ failActive(error: unknown): void;
36
+ failAll(error: unknown): void;
37
+ reserveResidency(): () => void;
38
+ acquireExecution?(): Promise<() => void>;
39
+ waitForWork(): Promise<void>;
40
+ }
41
+
42
+ export interface SchedulingClock {
43
+ now(): number;
44
+ yield(): Promise<void>;
45
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "compilerOptions": {
3
+ "lib": ["ES2022"],
4
+ "target": "ES2022",
5
+ "module": "Preserve",
6
+ "moduleResolution": "bundler",
7
+ "types": [],
8
+ "strict": true,
9
+ "skipLibCheck": false,
10
+ "noUncheckedIndexedAccess": true,
11
+ "noEmit": true
12
+ },
13
+ "include": ["./*.ts", "../engine/**/*.ts", "../inference/**/*.ts"]
14
+ }