mlx-bun 0.5.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (640) hide show
  1. package/README.md +1449 -109
  2. package/THIRD_PARTY_NOTICES.md +882 -0
  3. package/bin/mlx-bun.convert.mjs +4 -0
  4. package/bin/mlx-bun.fuse.mjs +4 -0
  5. package/bin/mlx-bun.generate.mjs +4 -0
  6. package/bin/mlx-bun.lora.mjs +4 -0
  7. package/bin/mlx-bun.mjs +13 -21
  8. package/bin/mlx-bun.server.mjs +4 -0
  9. package/bin/mlx-bun.upload.mjs +4 -0
  10. package/dist/web/app.js +9584 -0
  11. package/package.json +50 -53
  12. package/src/cli/ane-install.ts +76 -0
  13. package/src/cli/args.ts +179 -0
  14. package/src/cli/engine-entry.ts +68 -0
  15. package/src/cli/inference.ts +214 -0
  16. package/src/cli/job-entry.ts +97 -0
  17. package/src/cli/library-host.ts +117 -0
  18. package/src/cli/main.ts +57 -0
  19. package/src/cli/memory-engine.ts +163 -0
  20. package/src/cli/memory.ts +36 -0
  21. package/src/cli/mlx-lm-aliases.ts +309 -0
  22. package/src/cli/model-choice.ts +33 -0
  23. package/src/cli/model-selection.ts +84 -0
  24. package/src/cli/module-host.ts +11 -0
  25. package/src/cli/module-verbs.ts +50 -0
  26. package/src/cli/numerical-policy.ts +12 -0
  27. package/src/cli/perplexity.ts +89 -0
  28. package/src/cli/serve-host.ts +423 -0
  29. package/src/cli/serve-isolated.ts +217 -0
  30. package/src/cli/serve-options.ts +106 -0
  31. package/src/cli/serve-state.ts +205 -0
  32. package/src/cli/serve.ts +500 -0
  33. package/src/cli/served-model-host.ts +102 -0
  34. package/src/cli/server-entry.ts +148 -0
  35. package/src/cli/serving-unit.ts +177 -0
  36. package/src/{tui.ts → cli/terminal.ts} +13 -8
  37. package/src/cli/worker-adapters.ts +34 -0
  38. package/src/cli/worker-entry.ts +272 -0
  39. package/src/cli/worker-unit.ts +179 -0
  40. package/src/engine/adapter-operation.ts +26 -0
  41. package/src/engine/cache-services.ts +114 -0
  42. package/src/engine/completion.ts +39 -0
  43. package/src/engine/generation-gateway.ts +358 -0
  44. package/src/engine/index.ts +59 -0
  45. package/src/engine/kv-budget.ts +120 -0
  46. package/src/engine/media-preparation.ts +232 -0
  47. package/src/engine/model-binding.ts +24 -0
  48. package/src/engine/model-host.ts +513 -0
  49. package/src/engine/model-serving.ts +89 -0
  50. package/src/{serve → engine}/preparation.ts +7 -5
  51. package/src/{serve → engine}/session-completion-engine.ts +6 -6
  52. package/src/engine/telemetry.ts +109 -0
  53. package/src/hub/downloads.ts +116 -0
  54. package/src/jobs/db.ts +16 -7
  55. package/src/jobs/events.ts +29 -0
  56. package/src/jobs/executable.ts +5 -0
  57. package/src/jobs/host.ts +51 -0
  58. package/src/jobs/in-process.ts +55 -0
  59. package/src/{contracts/jobs.ts → jobs/protocol.ts} +7 -9
  60. package/src/jobs/runner.ts +150 -231
  61. package/src/jobs/service.ts +75 -0
  62. package/src/jobs/sse.ts +59 -23
  63. package/src/jobs/worker-memory.ts +46 -0
  64. package/src/jobs/worker-process.ts +163 -0
  65. package/src/jobs/worker-supervisor.ts +258 -0
  66. package/src/modules.ts +58 -0
  67. package/src/publishing/catalog-hub.ts +18 -0
  68. package/src/publishing/credentials.ts +31 -0
  69. package/src/publishing/upload.ts +37 -0
  70. package/src/residency/leased-adapters.ts +21 -0
  71. package/src/residency/local-records.ts +16 -0
  72. package/src/residency/model-residency.ts +405 -0
  73. package/src/residency/record-index.ts +28 -0
  74. package/src/residency/resident-estimate.ts +50 -0
  75. package/src/{anthropic.ts → server/anthropic.ts} +3 -81
  76. package/src/server/cache-routes.ts +36 -0
  77. package/src/{serve → server}/chat-request.ts +10 -10
  78. package/src/{serve → server}/chat-stage.ts +14 -14
  79. package/src/{client.ts → server/client.ts} +28 -2
  80. package/src/{serve → server}/completion-executor.ts +33 -41
  81. package/src/server/decision-body.ts +55 -0
  82. package/src/server/decision-routes.ts +134 -0
  83. package/src/server/decision-wire.ts +228 -0
  84. package/src/{serve → server}/discovery-routes.ts +25 -82
  85. package/src/{serve → server}/http.ts +25 -13
  86. package/src/{serve → server}/inference-request.ts +5 -5
  87. package/src/server/job-routes.ts +20 -0
  88. package/src/server/media-prompt.ts +63 -0
  89. package/src/server/memory-completion-client.ts +46 -0
  90. package/src/server/model-routes.ts +192 -0
  91. package/src/{serve → server}/openai-wire.ts +3 -2
  92. package/src/{serve → server}/pipeline.ts +1 -1
  93. package/src/server/prompt-builder.ts +13 -0
  94. package/src/server/prompt-contracts.ts +17 -0
  95. package/src/server/proxy-routes.ts +187 -0
  96. package/src/server/publishing-routes.ts +41 -0
  97. package/src/{serve → server}/request-plan.ts +6 -8
  98. package/src/{serve → server}/request-prep.ts +47 -50
  99. package/src/{serve → server}/responses-client.ts +30 -13
  100. package/src/{responses.ts → server/responses.ts} +12 -93
  101. package/src/server/routes.ts +205 -0
  102. package/src/server/start.ts +72 -0
  103. package/src/server/status-routes.ts +108 -0
  104. package/src/{serve → server}/text-completion-stage.ts +25 -4
  105. package/src/server/text-prompt.ts +12 -0
  106. package/src/{serve → server}/token-streams.ts +36 -38
  107. package/src/server/worker-routes.ts +311 -0
  108. package/src/storage/paths.ts +61 -0
  109. package/src/web/assets.ts +37 -0
  110. package/src/web/{src → browser}/api.ts +5 -23
  111. package/src/web/browser/chat-host.ts +17 -0
  112. package/src/web/browser/installed-panels.ts +6 -0
  113. package/src/web/browser/main.ts +55 -0
  114. package/src/web/browser/markdown.ts +279 -0
  115. package/src/web/browser/memory-panel.ts +9 -0
  116. package/src/web/browser/palette.ts +64 -0
  117. package/src/web/browser/protocol.ts +13 -0
  118. package/src/web/browser/shell.ts +467 -0
  119. package/src/web/{src → browser}/status.ts +32 -36
  120. package/src/web/build.ts +51 -0
  121. package/src/web/public/app.html +1054 -0
  122. package/src/web/{sw.js → public/sw.js} +4 -3
  123. package/src/web/{vendor → public/vendor}/hljs-theme.css +2 -2
  124. package/src/web/{vendor → public/vendor}/hljs.js +2 -2
  125. package/THIRD_PARTY_LICENSES.md +0 -51
  126. package/docs/README.md +0 -107
  127. package/docs/archive/hlg-sampling.md +0 -350
  128. package/docs/archive/investigations/audio-input-plan.md +0 -356
  129. package/docs/archive/investigations/benchmark-ledger-through-v0.4.0.md +0 -3617
  130. package/docs/archive/investigations/chunk-finetune-experiment.md +0 -84
  131. package/docs/archive/investigations/colibri-glm52-port.md +0 -1486
  132. package/docs/archive/investigations/colibri-oracle-pin.md +0 -1284
  133. package/docs/archive/investigations/curve-bisector-routing.md +0 -123
  134. package/docs/archive/investigations/decode-roofline-lookagain.md +0 -348
  135. package/docs/archive/investigations/diffusion-gemma-port.md +0 -602
  136. package/docs/archive/investigations/dspark-handoff.md +0 -224
  137. package/docs/archive/investigations/expert-offload-single-user-moe.md +0 -292
  138. package/docs/archive/investigations/faithful-l1-consolidation.md +0 -310
  139. package/docs/archive/investigations/hlg-sampling-investigation.md +0 -970
  140. package/docs/archive/investigations/indexshare-performance-spike.md +0 -357
  141. package/docs/archive/investigations/kernel-perf-review-2026-07.md +0 -171
  142. package/docs/archive/investigations/lab-build-journal.md +0 -157
  143. package/docs/archive/investigations/minicpm5-decode-megakernel.md +0 -489
  144. package/docs/archive/investigations/openjarvis-fit.md +0 -198
  145. package/docs/archive/investigations/openwiki-evaluation.md +0 -249
  146. package/docs/archive/investigations/optimization_plan.md +0 -346
  147. package/docs/archive/investigations/orpo-base-uf-experiment-and-directions.md +0 -120
  148. package/docs/archive/investigations/orpo-flash-cce-pin-leak.md +0 -167
  149. package/docs/archive/investigations/orpo-uf-testing-handoff.md +0 -126
  150. package/docs/archive/investigations/pareto-specialized-runtime-findings.md +0 -92
  151. package/docs/archive/investigations/pi-builtin-investigation.md +0 -308
  152. package/docs/archive/investigations/pre-colibri-stabilization.md +0 -329
  153. package/docs/archive/investigations/qwen38-27b-campaign-log.md +0 -1092
  154. package/docs/archive/investigations/segmented-backward-handoff.md +0 -148
  155. package/docs/archive/investigations/starter-model-port-handoff.md +0 -342
  156. package/docs/archive/investigations/steel-flash-cce-handoff.md +0 -489
  157. package/docs/archive/investigations/the-dreaming-handoff.md +0 -141
  158. package/docs/archive/investigations/trainer-validation-experiment.md +0 -173
  159. package/docs/archive/planning/chat-ui-vision-memory-first.md +0 -199
  160. package/docs/archive/planning/chat-ui-vision.md +0 -50
  161. package/docs/archive/planning/chunk-task-roadmap.md +0 -77
  162. package/docs/archive/planning/curve-sampler-research-plan.md +0 -331
  163. package/docs/archive/planning/journal.md +0 -316
  164. package/docs/archive/planning/memory-docs-and-dag-plan.md +0 -194
  165. package/docs/archive/planning/pi-integration-review.md +0 -178
  166. package/docs/archive/planning/release-notes-v0.0.10.md +0 -57
  167. package/docs/archive/planning/release-notes-v0.0.11.md +0 -239
  168. package/docs/archive/planning/release-notes-v0.0.12.md +0 -80
  169. package/docs/archive/planning/release-notes-v0.0.13.md +0 -77
  170. package/docs/archive/planning/release-notes-v0.0.9.md +0 -122
  171. package/docs/archive/planning/release-notes-v0.2.0.md +0 -49
  172. package/docs/archive/planning/release-notes-v0.3.0.md +0 -35
  173. package/docs/archive/planning/release-notes-v0.4.0.md +0 -45
  174. package/docs/archive/planning/release-notes-v0.5.0.md +0 -37
  175. package/docs/archive/planning/web-ui-pass-plan.md +0 -213
  176. package/docs/archive/planning/website-readme-pass-plan.md +0 -224
  177. package/docs/design/batching.md +0 -2054
  178. package/docs/design/decode-speed-program.md +0 -2404
  179. package/docs/design/dreaming-nightly-pipeline.md +0 -684
  180. package/docs/design/generic-model-support.md +0 -821
  181. package/docs/design/kv-cache.md +0 -993
  182. package/docs/design/orpo-training.md +0 -680
  183. package/docs/design/speculative-decoding.md +0 -2129
  184. package/docs/design/turboquant.md +0 -2225
  185. package/docs/design/unified-engine-frontier-plan.md +0 -1987
  186. package/docs/design/web-chat-redesign.md +0 -695
  187. package/docs/planning/PRODUCT_ROADMAP.md +0 -593
  188. package/docs/planning/ResearchTopics.md +0 -119
  189. package/docs/planning/public-readiness-handoff.md +0 -244
  190. package/docs/planning/public-readiness.md +0 -149
  191. package/docs/planning/video-series.md +0 -421
  192. package/docs/reference/benchmarks.md +0 -3587
  193. package/docs/reference/cli.md +0 -646
  194. package/docs/reference/distribution.md +0 -380
  195. package/docs/reference/environment.md +0 -494
  196. package/docs/reference/glossary.md +0 -39
  197. package/docs/reference/library-api.md +0 -688
  198. package/docs/reference/memory.md +0 -260
  199. package/docs/reference/models.md +0 -346
  200. package/docs/reference/server-api.md +0 -1945
  201. package/docs/reference/server-config.md +0 -973
  202. package/docs/reference/training.md +0 -462
  203. package/docs/reference/troubleshooting.md +0 -158
  204. package/src/admission-plan.ts +0 -18
  205. package/src/audio/audiotoolbox.ts +0 -112
  206. package/src/audio/conformer.ts +0 -655
  207. package/src/audio/decode.ts +0 -133
  208. package/src/audio/features.ts +0 -202
  209. package/src/audio/mic-capture.ts +0 -98
  210. package/src/audio/silero-vad.ts +0 -379
  211. package/src/audio/transcode.ts +0 -67
  212. package/src/audio/whisper-decode.ts +0 -774
  213. package/src/audio/whisper-fast.ts +0 -732
  214. package/src/audio/whisper-format.ts +0 -73
  215. package/src/audio/whisper-mel.ts +0 -185
  216. package/src/audio/whisper-timing.ts +0 -274
  217. package/src/audio/whisper-tokenizer.ts +0 -239
  218. package/src/audio/whisper-transcribe.ts +0 -410
  219. package/src/backends/mlx/assistant-target.ts +0 -46
  220. package/src/backends/mlx/autoregressive-draft-rows.ts +0 -120
  221. package/src/backends/mlx/autoregressive.ts +0 -129
  222. package/src/backends/mlx/batch-group.ts +0 -1874
  223. package/src/backends/mlx/cache-attachment.ts +0 -67
  224. package/src/backends/mlx/cache-layout.ts +0 -31
  225. package/src/backends/mlx/checkpoint-state.ts +0 -53
  226. package/src/backends/mlx/continuation-persistence.ts +0 -107
  227. package/src/backends/mlx/continuation-request.ts +0 -43
  228. package/src/backends/mlx/continuation.ts +0 -77
  229. package/src/backends/mlx/diffusion.ts +0 -39
  230. package/src/backends/mlx/draft-target.ts +0 -32
  231. package/src/backends/mlx/encoder-cache.ts +0 -25
  232. package/src/backends/mlx/evaluation.ts +0 -105
  233. package/src/backends/mlx/fill-append.ts +0 -58
  234. package/src/backends/mlx/fill-group.ts +0 -497
  235. package/src/backends/mlx/full-kv-row-append.ts +0 -32
  236. package/src/backends/mlx/full-kv-row-donor.ts +0 -54
  237. package/src/backends/mlx/full-transitioning-kv-rows.ts +0 -65
  238. package/src/backends/mlx/gateway-binding.ts +0 -174
  239. package/src/backends/mlx/graph.ts +0 -38
  240. package/src/backends/mlx/kv-codec.ts +0 -9
  241. package/src/backends/mlx/kv-maintenance.ts +0 -161
  242. package/src/backends/mlx/kv-tensor-rows.ts +0 -212
  243. package/src/backends/mlx/memory-client.ts +0 -189
  244. package/src/backends/mlx/methods.ts +0 -90
  245. package/src/backends/mlx/mixed-iteration.ts +0 -62
  246. package/src/backends/mlx/model-prompt.ts +0 -178
  247. package/src/backends/mlx/model-serving.ts +0 -80
  248. package/src/backends/mlx/paged-cache-codec.ts +0 -27
  249. package/src/backends/mlx/prefill-cohort.ts +0 -100
  250. package/src/backends/mlx/prefill-policy.ts +0 -26
  251. package/src/backends/mlx/prefill-rows.ts +0 -244
  252. package/src/backends/mlx/prefill.ts +0 -33
  253. package/src/backends/mlx/projected-context-rows.ts +0 -72
  254. package/src/backends/mlx/prompt-input.ts +0 -29
  255. package/src/backends/mlx/qwen-prompt-input.ts +0 -40
  256. package/src/backends/mlx/request-policy.ts +0 -20
  257. package/src/backends/mlx/request-state-policy.ts +0 -54
  258. package/src/backends/mlx/rollback.ts +0 -92
  259. package/src/backends/mlx/row-sampling.ts +0 -49
  260. package/src/backends/mlx/serial-executor.ts +0 -251
  261. package/src/backends/mlx/speculative-group.ts +0 -438
  262. package/src/backends/mlx/speculative-round.ts +0 -161
  263. package/src/backends/mlx/speculative.ts +0 -131
  264. package/src/backends/mlx/state-rows.ts +0 -104
  265. package/src/backends/mlx/state-views.ts +0 -46
  266. package/src/backends/mlx/target-layout-capability.ts +0 -35
  267. package/src/backends/mlx/text-engine.ts +0 -73
  268. package/src/backends/mlx/transitioning-kv-rows.ts +0 -173
  269. package/src/chat-template.ts +0 -382
  270. package/src/cli.ts +0 -3490
  271. package/src/config.ts +0 -399
  272. package/src/contracts/completion.ts +0 -16
  273. package/src/contracts/execution.ts +0 -70
  274. package/src/contracts/generation.ts +0 -103
  275. package/src/contracts/host.ts +0 -7
  276. package/src/contracts/object-cache.ts +0 -8
  277. package/src/contracts/pi-provider.ts +0 -30
  278. package/src/contracts/pi.ts +0 -261
  279. package/src/contracts/prefix-cache.ts +0 -33
  280. package/src/contracts/resources.ts +0 -25
  281. package/src/contracts/sampling.ts +0 -23
  282. package/src/contracts/scheduling.ts +0 -54
  283. package/src/contracts/tsconfig.json +0 -14
  284. package/src/dataset/generators.ts +0 -1087
  285. package/src/dataset/index.ts +0 -12
  286. package/src/dataset/job.ts +0 -81
  287. package/src/dataset/llm.ts +0 -71
  288. package/src/dataset/registry.ts +0 -528
  289. package/src/diffusion/diffusion-generate.ts +0 -507
  290. package/src/download.ts +0 -505
  291. package/src/embed.ts +0 -77
  292. package/src/engine/admission.ts +0 -59
  293. package/src/engine/cancellation.ts +0 -38
  294. package/src/engine/engine.ts +0 -56
  295. package/src/engine/execution-coordinator.ts +0 -70
  296. package/src/engine/execution-plan.ts +0 -64
  297. package/src/engine/execution-tasks.ts +0 -44
  298. package/src/engine/namespaced-cache.ts +0 -13
  299. package/src/engine/resources.ts +0 -53
  300. package/src/engine/scheduler.ts +0 -92
  301. package/src/engine/session.ts +0 -247
  302. package/src/eval/README.md +0 -130
  303. package/src/eval/ifeval.ts +0 -81
  304. package/src/eval/kl-prompts.ts +0 -29
  305. package/src/eval/kl.ts +0 -590
  306. package/src/eval/perplexity.ts +0 -164
  307. package/src/eval/quality-db.ts +0 -92
  308. package/src/eval/reference-logits.ts +0 -207
  309. package/src/eval/runner.ts +0 -124
  310. package/src/eval/score.ts +0 -49
  311. package/src/eval/tasks/bfcl.ts +0 -535
  312. package/src/eval/tasks/gsm8k.ts +0 -98
  313. package/src/eval/tasks/hashhop.ts +0 -139
  314. package/src/eval/tasks/humaneval.ts +0 -275
  315. package/src/eval/tasks/ifeval.ts +0 -525
  316. package/src/eval/tasks/mmlu.ts +0 -157
  317. package/src/eval/ultrafeedback.ts +0 -60
  318. package/src/evaldb.ts +0 -199
  319. package/src/expert-io.ts +0 -393
  320. package/src/expert-offload-build.ts +0 -77
  321. package/src/expert-offload.ts +0 -76
  322. package/src/expert-residency.ts +0 -1134
  323. package/src/expert-usage.ts +0 -415
  324. package/src/fill/echo-index.ts +0 -188
  325. package/src/fill/fill-session.ts +0 -463
  326. package/src/fill/proposal.ts +0 -68
  327. package/src/fill/schema-rows.ts +0 -506
  328. package/src/fill/tool-boundary.ts +0 -103
  329. package/src/fit.ts +0 -249
  330. package/src/generate.ts +0 -1352
  331. package/src/grammar.ts +0 -604
  332. package/src/harness-pi.ts +0 -184
  333. package/src/hf-push.ts +0 -628
  334. package/src/hub-rest.ts +0 -242
  335. package/src/index.ts +0 -63
  336. package/src/inference/denoising.ts +0 -17
  337. package/src/inference/draft-acceptance.ts +0 -41
  338. package/src/inference/draft-output.ts +0 -49
  339. package/src/inference/graph.ts +0 -33
  340. package/src/inference/prefill.ts +0 -45
  341. package/src/inference/rollback.ts +0 -7
  342. package/src/jobs/index.ts +0 -31
  343. package/src/jobs/job-entry.ts +0 -107
  344. package/src/jobs/task-client.ts +0 -19
  345. package/src/jobs/types.ts +0 -2
  346. package/src/kv-scheme.ts +0 -279
  347. package/src/kv-store.ts +0 -1135
  348. package/src/lab/README.md +0 -22
  349. package/src/lab/curve/curve-designer.html +0 -303
  350. package/src/lab/curve/curve-sampler.ts +0 -122
  351. package/src/lab/expert-trace/expert-trace.ts +0 -69
  352. package/src/lab/paged-kv/paged-attention.ts +0 -117
  353. package/src/lab/paged-kv/paged-kv-rows.ts +0 -111
  354. package/src/lab/paged-kv/paged-kv.ts +0 -336
  355. package/src/library.ts +0 -40
  356. package/src/lora.ts +0 -408
  357. package/src/md-modules.d.ts +0 -54
  358. package/src/media-fetch.ts +0 -442
  359. package/src/memory/article.ts +0 -558
  360. package/src/memory/chunk-validation.ts +0 -150
  361. package/src/memory/chunk.ts +0 -318
  362. package/src/memory/cluster.ts +0 -351
  363. package/src/memory/coverage.ts +0 -134
  364. package/src/memory/crosslink.ts +0 -0
  365. package/src/memory/db.ts +0 -253
  366. package/src/memory/entity.ts +0 -203
  367. package/src/memory/gate.ts +0 -187
  368. package/src/memory/history.ts +0 -152
  369. package/src/memory/ingest.ts +0 -335
  370. package/src/memory/model.ts +0 -183
  371. package/src/memory/normalize.ts +0 -671
  372. package/src/memory/parse.ts +0 -22
  373. package/src/memory/pipeline.ts +0 -275
  374. package/src/memory/prompts.ts +0 -65
  375. package/src/memory/query.ts +0 -334
  376. package/src/memory/reconcile.ts +0 -734
  377. package/src/memory/redirect.ts +0 -108
  378. package/src/memory/reindex.ts +0 -325
  379. package/src/memory/resolve.ts +0 -307
  380. package/src/memory/rest.ts +0 -245
  381. package/src/memory/route.ts +0 -272
  382. package/src/memory/schedule.ts +0 -165
  383. package/src/memory/stages.ts +0 -777
  384. package/src/memory/synthesize.ts +0 -1638
  385. package/src/memory/tools.ts +0 -749
  386. package/src/memory/vault.ts +0 -1194
  387. package/src/memory/wikify.ts +0 -1064
  388. package/src/mlx/array.ts +0 -425
  389. package/src/mlx/autograd.ts +0 -304
  390. package/src/mlx/checkpoint.ts +0 -149
  391. package/src/mlx/compile.ts +0 -168
  392. package/src/mlx/custom-vjp.ts +0 -188
  393. package/src/mlx/ffi.ts +0 -531
  394. package/src/mlx/materialize.ts +0 -23
  395. package/src/mlx/metal-kernel.ts +0 -159
  396. package/src/mlx/normalized-argmax.ts +0 -116
  397. package/src/mlx/ops.ts +0 -1108
  398. package/src/mlx/quantized-rows.ts +0 -36
  399. package/src/mlx/token-bitmask.ts +0 -52
  400. package/src/mlx/turboquant-kv-decode.ts +0 -82
  401. package/src/mlx/turboquant-kv-inverse.ts +0 -122
  402. package/src/mlx/turboquant-ops.ts +0 -861
  403. package/src/mlx/turboquant-tables.ts +0 -237
  404. package/src/mmap.ts +0 -90
  405. package/src/model/artifact-identity.ts +0 -73
  406. package/src/model/batched-kv.ts +0 -235
  407. package/src/model/batched-mask.ts +0 -279
  408. package/src/model/batched-quant.ts +0 -212
  409. package/src/model/batched-quantized-kv.ts +0 -144
  410. package/src/model/batched-rotating-quant.ts +0 -353
  411. package/src/model/batched-rotating-state.ts +0 -149
  412. package/src/model/batched-rotating.ts +0 -338
  413. package/src/model/batched-row-storage.ts +0 -179
  414. package/src/model/batched-ssm.ts +0 -52
  415. package/src/model/batched-turboquant-kv.ts +0 -94
  416. package/src/model/compiled-decode.ts +0 -712
  417. package/src/model/decoded-kv-donor.ts +0 -12
  418. package/src/model/delayed-quantized-kv.ts +0 -72
  419. package/src/model/delayed-rotating-quantized-kv.ts +0 -93
  420. package/src/model/delayed-turboquant-kv.ts +0 -57
  421. package/src/model/diffusion-gemma.ts +0 -1026
  422. package/src/model/factory.ts +0 -215
  423. package/src/model/fingerprint.ts +0 -45
  424. package/src/model/flash-attention.ts +0 -694
  425. package/src/model/full-prefill-padding.ts +0 -56
  426. package/src/model/full-prefill-row.ts +0 -105
  427. package/src/model/gemma4-base.ts +0 -2370
  428. package/src/model/gemma4.ts +0 -1395
  429. package/src/model/generated/gemma4-12b.ts +0 -429
  430. package/src/model/generated/gemma4-26b.ts +0 -448
  431. package/src/model/generated/gemma4-e4b.ts +0 -717
  432. package/src/model/generated/index.ts +0 -18
  433. package/src/model/glm52-atlas.ts +0 -511
  434. package/src/model/glm52-cache.ts +0 -792
  435. package/src/model/glm52-config.ts +0 -262
  436. package/src/model/glm52-container.ts +0 -305
  437. package/src/model/glm52-coupling.ts +0 -388
  438. package/src/model/glm52-dsa.ts +0 -606
  439. package/src/model/glm52-expert-layout.ts +0 -253
  440. package/src/model/glm52-layout.ts +0 -152
  441. package/src/model/glm52-memory.ts +0 -500
  442. package/src/model/glm52-mla.ts +0 -792
  443. package/src/model/glm52-moe.ts +0 -223
  444. package/src/model/glm52-pilot.ts +0 -537
  445. package/src/model/glm52-reference.ts +0 -445
  446. package/src/model/glm52-residency.ts +0 -557
  447. package/src/model/glm52-resident-weights.ts +0 -135
  448. package/src/model/glm52-streamed-experts.ts +0 -453
  449. package/src/model/glm52-streamed-metal.ts +0 -610
  450. package/src/model/glm52-weights.ts +0 -503
  451. package/src/model/glm52.ts +0 -1132
  452. package/src/model/implementation.ts +0 -69
  453. package/src/model/kv-attention-view.ts +0 -70
  454. package/src/model/minicpm5.ts +0 -376
  455. package/src/model/profile.ts +0 -468
  456. package/src/model/quantized-append-attention.ts +0 -31
  457. package/src/model/qwen-append.ts +0 -12
  458. package/src/model/qwen-conv.ts +0 -52
  459. package/src/model/qwen3-delta-state.ts +0 -74
  460. package/src/model/qwen3-delta.ts +0 -451
  461. package/src/model/qwen3-moe.ts +0 -404
  462. package/src/model/qwen3-mrope.ts +0 -250
  463. package/src/model/qwen3.ts +0 -277
  464. package/src/model/qwen3_5-checkpoint.ts +0 -164
  465. package/src/model/qwen3_5.ts +0 -881
  466. package/src/model/rotating-kv-donor.ts +0 -35
  467. package/src/model/rotating-kv-layout.ts +0 -262
  468. package/src/model/rotating-row-transaction.ts +0 -35
  469. package/src/model/speculative-rotating-kv.ts +0 -101
  470. package/src/model/ssm-prefill-padding.ts +0 -39
  471. package/src/model/support.ts +0 -110
  472. package/src/model/token-groups.ts +0 -66
  473. package/src/model/trellis-balanced-scatter.ts +0 -51
  474. package/src/model/trellis-linear.ts +0 -672
  475. package/src/model/trellis-shared-m.ts +0 -151
  476. package/src/model/trellis-shared-scatter.ts +0 -144
  477. package/src/model/trellis-splitk-prefill.ts +0 -158
  478. package/src/model/trellis-tiled-prefill.ts +0 -136
  479. package/src/model/trellis-vector-expand.ts +0 -62
  480. package/src/model/trellis-wide-prefill.ts +0 -94
  481. package/src/model/turboquant-codec.ts +0 -89
  482. package/src/model/universal/archs.ts +0 -332
  483. package/src/model/universal/dense.ts +0 -612
  484. package/src/model/universal/modules.ts +0 -170
  485. package/src/model/universal/rope.ts +0 -381
  486. package/src/model/whisper.ts +0 -435
  487. package/src/native/expert_io.c +0 -523
  488. package/src/native/frame_extract.swift +0 -140
  489. package/src/native/mic_capture.swift +0 -92
  490. package/src/native-pack.ts +0 -163
  491. package/src/pi-provider.ts +0 -53
  492. package/src/pi-session.ts +0 -81
  493. package/src/pi-terminal.ts +0 -274
  494. package/src/pi-web.ts +0 -1940
  495. package/src/preflight.ts +0 -158
  496. package/src/prompt-cache.ts +0 -682
  497. package/src/quantize/allocator.ts +0 -627
  498. package/src/quantize/atomic-output.ts +0 -38
  499. package/src/quantize/calibration.ts +0 -181
  500. package/src/quantize/config-writer.ts +0 -145
  501. package/src/quantize/index.ts +0 -84
  502. package/src/quantize/job.ts +0 -162
  503. package/src/quantize/quantizer.ts +0 -666
  504. package/src/quantize/rotate.ts +0 -603
  505. package/src/quantize/safetensors-writer.ts +0 -249
  506. package/src/quantize/sensitivity.ts +0 -216
  507. package/src/quantize/trellis.ts +0 -586
  508. package/src/quantize/weight-transform.ts +0 -292
  509. package/src/registry.ts +0 -602
  510. package/src/runtime-config.ts +0 -77
  511. package/src/safetensors.ts +0 -165
  512. package/src/sampler.ts +0 -1012
  513. package/src/serve/admin-routes.ts +0 -184
  514. package/src/serve/assets/curve-terrain.html +0 -105
  515. package/src/serve/assets/training-inference-map.html +0 -575
  516. package/src/serve/audio-routes.ts +0 -323
  517. package/src/serve/aux-routes.ts +0 -132
  518. package/src/serve/batch-scheduler.ts +0 -8
  519. package/src/serve/checkpoint-identity.ts +0 -64
  520. package/src/serve/generation-gateway.ts +0 -537
  521. package/src/serve/isolate.ts +0 -609
  522. package/src/serve/kv-budget.ts +0 -14
  523. package/src/serve/lab-routes.ts +0 -341
  524. package/src/serve/lane-registry.ts +0 -45
  525. package/src/serve/model-admin-routes.ts +0 -155
  526. package/src/serve/model-binding.ts +0 -49
  527. package/src/serve/model-host.ts +0 -511
  528. package/src/serve/parent-application.ts +0 -56
  529. package/src/serve/prompt-response-trace.ts +0 -161
  530. package/src/serve/response-lease.ts +0 -24
  531. package/src/serve/session-search.ts +0 -326
  532. package/src/serve/static-routes.ts +0 -101
  533. package/src/serve/transcription-server.ts +0 -64
  534. package/src/serve/transcription-service.ts +0 -502
  535. package/src/server.ts +0 -1282
  536. package/src/spec/assistant-rows.ts +0 -93
  537. package/src/spec/assistant-source.ts +0 -126
  538. package/src/spec/cache-identity.ts +0 -22
  539. package/src/spec/deepspec-rows.ts +0 -29
  540. package/src/spec/deepspec-source.ts +0 -145
  541. package/src/spec/dflash-source.ts +0 -149
  542. package/src/spec/drafter.ts +0 -304
  543. package/src/spec/dspark/ab-stats.ts +0 -136
  544. package/src/spec/dspark/calibration.ts +0 -112
  545. package/src/spec/dspark/data-dflash.ts +0 -156
  546. package/src/spec/dspark/data.ts +0 -201
  547. package/src/spec/dspark/deepspec-module.ts +0 -776
  548. package/src/spec/dspark/generate-dflash.ts +0 -245
  549. package/src/spec/dspark/generate.ts +0 -290
  550. package/src/spec/dspark/loader.ts +0 -23
  551. package/src/spec/dspark/loss.ts +0 -213
  552. package/src/spec/dspark/module-dflash.ts +0 -560
  553. package/src/spec/dspark/module.ts +0 -540
  554. package/src/spec/dspark/quantize-drafter.ts +0 -91
  555. package/src/spec/dspark/sample.ts +0 -112
  556. package/src/spec/generate.ts +0 -276
  557. package/src/spec/glm52-mtp-graph.ts +0 -29
  558. package/src/spec/glm52-mtp-rows.ts +0 -132
  559. package/src/spec/glm52-mtp-source.ts +0 -318
  560. package/src/spec/glm52-mtp-state.ts +0 -33
  561. package/src/spec/ngram-source.ts +0 -226
  562. package/src/spec/projected-draft-rows.ts +0 -73
  563. package/src/spec/qwen-mtp-module.ts +0 -171
  564. package/src/spec/qwen-mtp-rows.ts +0 -230
  565. package/src/spec/qwen-mtp-source.ts +0 -386
  566. package/src/spec/qwen-mtp-state.ts +0 -30
  567. package/src/spec/serve-loop.ts +0 -587
  568. package/src/spec/source.ts +0 -228
  569. package/src/spec/two-model-rows.ts +0 -62
  570. package/src/spec/two-model.ts +0 -113
  571. package/src/ssd-cache.ts +0 -431
  572. package/src/ssd-durability.ts +0 -209
  573. package/src/storage/host-buffer.ts +0 -24
  574. package/src/storage/kv-writer.ts +0 -83
  575. package/src/storage/kv-writer.worker.js +0 -264
  576. package/src/storage/retention-policy.ts +0 -37
  577. package/src/tiered-prompt-cache.ts +0 -45
  578. package/src/tokenizer.ts +0 -335
  579. package/src/tool-approvals.ts +0 -131
  580. package/src/tool-call.ts +0 -695
  581. package/src/train/dataset.ts +0 -484
  582. package/src/train/diffusion-lora.ts +0 -216
  583. package/src/train/export.ts +0 -32
  584. package/src/train/flash-cce.ts +0 -1234
  585. package/src/train/forward.ts +0 -266
  586. package/src/train/fuse.ts +0 -243
  587. package/src/train/index.ts +0 -46
  588. package/src/train/job.ts +0 -205
  589. package/src/train/lora-params.ts +0 -254
  590. package/src/train/loss.ts +0 -1591
  591. package/src/train/merge.ts +0 -195
  592. package/src/train/optimizer.ts +0 -183
  593. package/src/train/prefix-shared.ts +0 -490
  594. package/src/train/rank.ts +0 -137
  595. package/src/train/segmented.ts +0 -1828
  596. package/src/train/steel-qmm-header.ts +0 -1461
  597. package/src/train/trainer.ts +0 -1221
  598. package/src/train/watch.ts +0 -542
  599. package/src/vision/diffusion-vision.ts +0 -620
  600. package/src/vision/embedder.ts +0 -176
  601. package/src/vision/preprocess.ts +0 -247
  602. package/src/vision/prompt.ts +0 -409
  603. package/src/vision/qwen3vl-preprocess.ts +0 -409
  604. package/src/vision/qwen3vl-prompt.ts +0 -233
  605. package/src/vision/qwen3vl-tower.ts +0 -566
  606. package/src/vision/siglip.ts +0 -607
  607. package/src/vision/video-frames.ts +0 -148
  608. package/src/web/app.html +0 -2155
  609. package/src/web/app.js +0 -5863
  610. package/src/web/skills/memory/SKILL.md +0 -120
  611. package/src/web/skills/web-research/SKILL.md +0 -46
  612. package/src/web/skills.ts +0 -97
  613. package/src/web/src/adapters-panel.ts +0 -288
  614. package/src/web/src/assistant.ts +0 -451
  615. package/src/web/src/chat.ts +0 -1060
  616. package/src/web/src/composer.ts +0 -962
  617. package/src/web/src/dataset.ts +0 -132
  618. package/src/web/src/finetune.ts +0 -267
  619. package/src/web/src/hub.ts +0 -428
  620. package/src/web/src/main.ts +0 -98
  621. package/src/web/src/markdown.ts +0 -0
  622. package/src/web/src/memory-panel.ts +0 -572
  623. package/src/web/src/model-picker.ts +0 -159
  624. package/src/web/src/palette.ts +0 -346
  625. package/src/web/src/protocol.ts +0 -26
  626. package/src/web/src/quantize.ts +0 -167
  627. package/src/web/src/rag.ts +0 -274
  628. package/src/web/src/sessions.ts +0 -469
  629. package/src/web/src/shell.ts +0 -804
  630. package/src/web/src/ui-catalog.ts +0 -78
  631. package/src/web/src/voice.ts +0 -141
  632. package/src/web/vendor/README.md +0 -61
  633. package/src/web-assets.ts +0 -47
  634. package/src/web-tools.ts +0 -478
  635. package/src/weights.ts +0 -255
  636. /package/src/{serve → server}/completion-sink.ts +0 -0
  637. /package/src/{serve → server}/generated-token-history.ts +0 -0
  638. /package/src/web/{icon.svg → public/icon.svg} +0 -0
  639. /package/src/web/{manifest.webmanifest → public/manifest.webmanifest} +0 -0
  640. /package/src/web/{vendor → public/vendor}/hljs-LICENSE +0 -0
@@ -1,307 +0,0 @@
1
- // mlx-bun memory — surface-variant RESOLUTION (the dedup fix for P5-T3/T4).
2
- //
3
- // canonicalize() in entity.ts is a *pure string normal form*: casefold, collapse
4
- // whitespace, strip articles/possessives. That is necessary but NOT sufficient —
5
- // the self-check turned the spacing, brand-only, and possessive surfaces of ONE
6
- // product name into several different stems:
7
- // - "<name>" vs "<na me>" (internal spacing the normal form keeps)
8
- // - "<brand>" / "<brand> <model>" (brand-only and compositional surfaces that
9
- // no purely-lexical normalizer can fold onto one canonical)
10
- //
11
- // The resolver adds three layers on top of canonicalize():
12
- // 1. SQUEEZE — strip ALL non-alphanumerics so "<na me>" / "<name>" / "<nam e>"
13
- // collapse to one key deterministically (fixes the spacing split).
14
- // 2. ALIAS SEED — a known-entity index (entities + entity_aliases in the store,
15
- // seeded from goldens/dreaming-entities-gold.json) so brand-only / nickname
16
- // surfaces (a "<the brand>", a "<the role>") resolve by exact alias hit.
17
- // 3. TOKEN-SUBSET FUZZY — a conservative compositional match: a surface folds
18
- // onto an entity iff its content tokens are a SUBSET of that entity's tokens
19
- // AND the overlap carries at least one DISTINCTIVE token (a token unique to
20
- // that entity among all known entities). This merges "<my brand model>" → the
21
- // entity via the distinctive model token while REFUSING to merge
22
- // "<brand A>" into "<brand B>" (a shared brand token is not distinctive;
23
- // the model-number tokens differ) — the over-merge guard.
24
- //
25
- // Resolution is conservative by construction: when in doubt it MINTS a new
26
- // canonical rather than fusing two distinct things. ROUTE (route.ts) escalates
27
- // the genuine misses to the model for binary disambiguation.
28
-
29
- import { readFileSync } from "node:fs";
30
- import { join } from "node:path";
31
-
32
- import { canonicalize } from "./entity";
33
- import type { MemoryStore } from "./db";
34
-
35
- /** Tokens that carry no disambiguating signal on their own (articles, glue, and
36
- * generic gear nouns shared across many entities). Used only for the fuzzy
37
- * token-subset layer — never for the exact alias index. */
38
- const STOP = new Set([
39
- "the", "a", "an", "and", "or", "of", "to", "for", "in", "on", "with", "is",
40
- "as", "my", "your", "his", "her", "its", "our", "their",
41
- ]);
42
-
43
- /** Strip ALL non-alphanumerics and casefold: the spacing/punct-insensitive key.
44
- * A name's spacing and punctuation variants all collapse here. */
45
- export function squeeze(surface: string): string {
46
- return surface.toLowerCase().replace(/[^a-z0-9]+/g, "");
47
- }
48
-
49
- /** Content tokens of a surface (casefold, split on non-alphanumerics, drop
50
- * stopwords and single characters). Order-insensitive set. */
51
- export function contentTokens(surface: string): Set<string> {
52
- const out = new Set<string>();
53
- for (const t of surface.toLowerCase().split(/[^a-z0-9]+/)) {
54
- if (t.length > 1 && !STOP.has(t)) out.add(t);
55
- }
56
- return out;
57
- }
58
-
59
- /** How a surface resolved (for instrumentation + the deterministic gates). */
60
- export type MatchKind = "stem" | "squeeze" | "alias" | "fuzzy" | "new";
61
-
62
- export interface ResolveResult {
63
- /** The canonical entity name the surface resolved to (or was minted as). */
64
- name: string;
65
- /** Which layer produced the resolution. "new" ⇒ a canonical was minted. */
66
- matched: MatchKind;
67
- /** True iff this call minted a NEW canonical (no existing entity matched). */
68
- created: boolean;
69
- }
70
-
71
- interface Seed {
72
- canonical: string;
73
- aliases: string[];
74
- }
75
-
76
- /**
77
- * In-memory variant resolver over a KNOWN-ENTITY set. Indexes each canonical by
78
- * its normal-form stem, its squeeze key, and its content tokens, then resolves a
79
- * surface through stem → squeeze → alias → token-subset-fuzzy, minting a new
80
- * canonical only when every layer misses.
81
- *
82
- * Construct from a seed list, from a {@link MemoryStore} (entities +
83
- * entity_aliases), or from the curated gold — and compose them (store first,
84
- * gold to backfill notable brand-only aliases).
85
- */
86
- export class EntityResolver {
87
- /** normal-form stem → canonical. */
88
- private byStem = new Map<string, string>();
89
- /** squeeze key → canonical. */
90
- private bySqueeze = new Map<string, string>();
91
- /** canonical → union of content tokens across its name + aliases. */
92
- private tokensOf = new Map<string, Set<string>>();
93
- /** content token → set of canonicals carrying it (distinctiveness check). */
94
- private tokenOwners = new Map<string, Set<string>>();
95
-
96
- constructor(seeds: Seed[] = []) {
97
- for (const s of seeds) this.register(s.canonical, s.aliases);
98
- }
99
-
100
- /** All known canonical names (registration order is not guaranteed). */
101
- canonicals(): string[] {
102
- return [...this.tokensOf.keys()];
103
- }
104
-
105
- /** Is `name` an already-known canonical entity? */
106
- has(name: string): boolean {
107
- return this.tokensOf.has(name);
108
- }
109
-
110
- /** Register a canonical and its aliases into every index. Idempotent; adding
111
- * aliases to an existing canonical merges them. The canonical's own surface is
112
- * always indexed as an alias of itself. */
113
- register(canonical: string, aliases: string[] = []): void {
114
- if (!this.tokensOf.has(canonical)) this.tokensOf.set(canonical, new Set());
115
- const tokset = this.tokensOf.get(canonical)!;
116
- for (const surface of [canonical, ...aliases]) {
117
- const stem = canonicalize(surface);
118
- const sq = squeeze(surface);
119
- if (stem && !this.byStem.has(stem)) this.byStem.set(stem, canonical);
120
- if (sq && !this.bySqueeze.has(sq)) this.bySqueeze.set(sq, canonical);
121
- for (const t of contentTokens(surface)) {
122
- tokset.add(t);
123
- let owners = this.tokenOwners.get(t);
124
- if (!owners) this.tokenOwners.set(t, (owners = new Set()));
125
- owners.add(canonical);
126
- }
127
- }
128
- }
129
-
130
- /** A token is DISTINCTIVE iff exactly one known canonical carries it — the
131
- * signal the fuzzy layer requires to merge a compositional surface. */
132
- private distinctive(token: string): string | null {
133
- const owners = this.tokenOwners.get(token);
134
- if (!owners || owners.size !== 1) return null;
135
- return [...owners][0]!;
136
- }
137
-
138
- /**
139
- * Conservative token-subset fuzzy match: the surface's content tokens must be a
140
- * non-empty SUBSET of some entity's tokens, and at least one of them must be
141
- * distinctive to that same entity. Returns the canonical, or null if no
142
- * unambiguous owner (zero or conflicting distinctive owners ⇒ refuse to merge).
143
- */
144
- private fuzzy(surface: string): string | null {
145
- const toks = contentTokens(surface);
146
- if (toks.size === 0) return null;
147
- // The distinctive tokens present in the surface, and who owns them.
148
- const owners = new Set<string>();
149
- for (const t of toks) {
150
- const owner = this.distinctive(t);
151
- if (owner) owners.add(owner);
152
- }
153
- if (owners.size !== 1) return null; // none, or a tie across entities → no merge
154
- const cand = [...owners][0]!;
155
- // Subset guard: every surface token must belong to the candidate, else the
156
- // surface names something MORE than (a variant of) the candidate.
157
- const ets = this.tokensOf.get(cand)!;
158
- for (const t of toks) if (!ets.has(t)) return null;
159
- return cand;
160
- }
161
-
162
- /** Resolve a surface to an EXISTING canonical, or null if every layer misses.
163
- * Pure: never mutates the index. */
164
- match(surface: string): { name: string; matched: MatchKind } | null {
165
- const stem = canonicalize(surface);
166
- if (stem) {
167
- const byStem = this.byStem.get(stem);
168
- if (byStem) return { name: byStem, matched: "stem" };
169
- }
170
- const sq = squeeze(surface);
171
- if (sq) {
172
- const bySq = this.bySqueeze.get(sq);
173
- if (bySq) return { name: bySq, matched: "squeeze" };
174
- }
175
- const fz = this.fuzzy(surface);
176
- if (fz) return { name: fz, matched: "fuzzy" };
177
- return null;
178
- }
179
-
180
- /**
181
- * Resolve a surface, MINTING a new canonical when nothing matches. The minted
182
- * canonical is the cleaned surface; it is registered so later variants of the
183
- * same thing fold onto it. Brand-only nicknames still need a gold/store seed —
184
- * fuzzy cannot invent a "<the brand>" ≡ "<brand model>" link from lexis alone.
185
- */
186
- resolve(surface: string, mintName?: string): ResolveResult {
187
- const hit = this.match(surface);
188
- if (hit) return { name: hit.name, matched: hit.matched, created: false };
189
- const canonical = (mintName ?? surface).trim();
190
- this.register(canonical, surface === canonical ? [] : [surface]);
191
- return { name: canonical, matched: "new", created: true };
192
- }
193
-
194
- /** Register one canonical per stem with its alias surfaces, grouped from a
195
- * normalized `alias → stem` map (the read-index's `aliasToStem`). The stem is
196
- * the canonical; its surfaces become aliases. */
197
- static fromAliasMap(aliasToStem: Iterable<readonly [string, string]>): EntityResolver {
198
- const byStem = new Map<string, string[]>();
199
- for (const [alias, stem] of aliasToStem) {
200
- let list = byStem.get(stem);
201
- if (!list) byStem.set(stem, (list = []));
202
- list.push(alias);
203
- }
204
- const r = new EntityResolver();
205
- for (const [stem, aliases] of byStem) r.register(stem, aliases);
206
- return r;
207
- }
208
-
209
- /** Load the known-entity index from a store's entities + entity_aliases. */
210
- static fromStore(store: MemoryStore): EntityResolver {
211
- const r = new EntityResolver();
212
- const ents = store.db.query("SELECT name FROM entities").all() as { name: string }[];
213
- for (const e of ents) r.register(e.name, []);
214
- const aliases = store.db
215
- .query("SELECT alias, entity_name FROM entity_aliases")
216
- .all() as { alias: string; entity_name: string }[];
217
- for (const a of aliases) {
218
- if (!r.has(a.entity_name)) r.register(a.entity_name, [a.alias]);
219
- else r.register(a.entity_name, [a.alias]);
220
- }
221
- return r;
222
- }
223
- }
224
-
225
- // ---- near-name resolution (sub-concept → its home article) -----------------
226
-
227
- /** Generic "kind-of-thing" suffix words a discussed sub-concept drops when it is
228
- * the SAME subject as an existing article (a query that is the article title
229
- * minus a generic tail — "<subject>" for "<subject> Theory"). They carry no
230
- * disambiguating signal alone, so a query made ONLY of these never redirects. */
231
- const GENERIC_SUFFIX = new Set([
232
- "theory", "framework", "system", "model", "method", "methodology", "approach",
233
- "principle", "principles", "technique", "concept", "paradigm", "effect", "law",
234
- "hypothesis", "problem", "process", "pattern", "practice",
235
- ]);
236
-
237
- /**
238
- * NEAR-NAME match: resolve a surface to an EXISTING article when it is clearly the
239
- * SAME subject — the conservative token-subset fuzzy (a query whose content tokens
240
- * are a distinctive subset of an article's, e.g. the title minus a generic suffix).
241
- * Reuses {@link EntityResolver.match} (stem → squeeze → token-subset fuzzy) but
242
- * REFUSES a query made only of generic suffix words (just "Theory"/"Framework"),
243
- * which would over-merge onto an arbitrary article. Returns the canonical (== the
244
- * article stem the resolver was seeded with), or null. Pure.
245
- */
246
- export function nearNameMatch(resolver: EntityResolver, surface: string): string | null {
247
- const toks = contentTokens(surface);
248
- if (toks.size === 0) return null;
249
- let hasContentToken = false;
250
- for (const t of toks) {
251
- if (!GENERIC_SUFFIX.has(t)) {
252
- hasContentToken = true;
253
- break;
254
- }
255
- }
256
- if (!hasContentToken) return null; // a purely-generic query must not redirect
257
- const hit = resolver.match(surface);
258
- return hit ? hit.name : null;
259
- }
260
-
261
- // ---- gold seed -------------------------------------------------------------
262
-
263
- export interface VariantGroup {
264
- canonical: string;
265
- kind: string;
266
- domain: string;
267
- variants: string[];
268
- }
269
- export interface NotableEntity {
270
- name: string;
271
- kind: string;
272
- domain: string;
273
- aliases: string[];
274
- whyNotable: string;
275
- }
276
- export interface DreamingGold {
277
- variantGroups: VariantGroup[];
278
- notableEntities: NotableEntity[];
279
- }
280
-
281
- const GOLD_PATH = join(import.meta.dir, "..", "..", "goldens", "dreaming-entities-gold.json");
282
-
283
- /** Read the curated entity gold (variantGroups + notableEntities). */
284
- export function loadDreamingGold(path: string = GOLD_PATH): DreamingGold {
285
- return JSON.parse(readFileSync(path, "utf8")) as DreamingGold;
286
- }
287
-
288
- /** Seeds derived from the gold: every variant group AND every notable entity
289
- * becomes a (canonical, aliases) seed. Notable entries that share a canonical
290
- * with a variant group merge their aliases. */
291
- export function goldSeeds(gold: DreamingGold = loadDreamingGold()): Seed[] {
292
- const byName = new Map<string, Set<string>>();
293
- const add = (canonical: string, aliases: string[]): void => {
294
- let set = byName.get(canonical);
295
- if (!set) byName.set(canonical, (set = new Set()));
296
- for (const a of aliases) set.add(a);
297
- };
298
- for (const g of gold.variantGroups) add(g.canonical, g.variants);
299
- for (const n of gold.notableEntities) add(n.name, n.aliases);
300
- return [...byName].map(([canonical, aliases]) => ({ canonical, aliases: [...aliases] }));
301
- }
302
-
303
- /** A resolver pre-seeded with the curated gold — the production seed for the
304
- * notable brand-only aliases the model/lexis cannot derive on its own. */
305
- export function goldResolver(gold?: DreamingGold): EntityResolver {
306
- return new EntityResolver(goldSeeds(gold));
307
- }
@@ -1,245 +0,0 @@
1
- // Memory REST wrappers — thin loopback JSON routes over src/memory/vault.ts
2
- // for the web chat's Memory panel (docs/design/web-chat-redesign.md §5.5,
3
- // §9 Phase 2). These are HTTP-only conveniences for the frontend: the
4
- // agent-tool surface (src/memory/tools.ts) stays read-only and unchanged,
5
- // and every route here is itself read-only except /init, which delegates to
6
- // the same `setupVault` the CLI's `mlx-bun memory init` calls (never
7
- // duplicated logic).
8
- //
9
- // Every handler returns a Response and never throws — a missing vault or a
10
- // bad param degrades to `{ ok: false, error }` (never a 500), matching the
11
- // rest of server.ts's /api/* conventions. Route dispatch (matching
12
- // url.pathname + method) lives in server.ts; this file is the pure handler
13
- // bodies so they're unit-testable without booting a model context (see
14
- // tests/using/memory-rest.test.ts).
15
-
16
- import { realpath } from "node:fs/promises";
17
- import { tmpdir } from "node:os";
18
- import { dirname, resolve, sep } from "node:path";
19
- import {
20
- vaultRoot, vaultStatus, listArticles, listReferenceDocs, readArticle,
21
- searchArticles, getArticleLinks, resolveArticleRelPath, articleHistory, articleDiff,
22
- setupVault, type VaultStatus,
23
- } from "./vault";
24
- import { parseInfobox, parseLead, parseSeriesBanner, articleStructure } from "./article";
25
-
26
- function jsonOk<T extends object>(body: T, init?: ResponseInit): Response {
27
- return Response.json({ ok: true, ...body }, init);
28
- }
29
-
30
- function jsonErr(error: string, status = 400): Response {
31
- return Response.json({ ok: false, error }, { status });
32
- }
33
-
34
- /** `{ ok:false, enabled:false }` shape shared by every route when no vault
35
- * exists yet — never a throw, never a 404: the frontend uses this to
36
- * render the first-run consent card instead of an error toast. */
37
- function noVault(root: string): Response {
38
- return Response.json({ ok: false, enabled: false, error: "no memory vault yet", root });
39
- }
40
-
41
- // ---- GET /api/memory/status -------------------------------------------
42
-
43
- export async function handleMemoryStatus(): Promise<Response> {
44
- const st = await vaultStatus();
45
- if (!st.exists) return noVault(st.root);
46
- return jsonOk({ enabled: true, status: st satisfies VaultStatus });
47
- }
48
-
49
- // ---- GET /api/memory/list ----------------------------------------------
50
-
51
- export async function handleMemoryList(): Promise<Response> {
52
- const root = vaultRoot();
53
- const st = await vaultStatus(root);
54
- if (!st.exists) return noVault(root);
55
- const [articles, reference] = await Promise.all([listArticles(root), listReferenceDocs(root)]);
56
- return jsonOk({ articles, reference });
57
- }
58
-
59
- // ---- GET /api/memory/search?q=&scope= -----------------------------------
60
-
61
- export async function handleMemorySearch(url: URL): Promise<Response> {
62
- const root = vaultRoot();
63
- const st = await vaultStatus(root);
64
- if (!st.exists) return noVault(root);
65
- const q = (url.searchParams.get("q") ?? "").trim();
66
- if (!q) return jsonErr("q is required");
67
- const scopeParam = url.searchParams.get("scope");
68
- const scope = scopeParam === "articles" || scopeParam === "reference" ? scopeParam : "all";
69
- const limitParam = Number(url.searchParams.get("limit") ?? "50");
70
- const limit = Number.isFinite(limitParam) && limitParam > 0 ? Math.min(limitParam, 200) : 50;
71
- try {
72
- const { summaries, hits } = await searchArticles(root, q, { limit, scope });
73
- return jsonOk({ summaries, hits });
74
- } catch (e) {
75
- return jsonErr((e as Error).message);
76
- }
77
- }
78
-
79
- // ---- GET /api/memory/article?name= --------------------------------------
80
- //
81
- // Rendered source + metadata: the article's raw Markdown plus the
82
- // deterministic structure the panel needs to render it without re-parsing
83
- // client-side (infobox, lead, series banner, section skeleton).
84
-
85
- export async function handleMemoryArticle(url: URL): Promise<Response> {
86
- const root = vaultRoot();
87
- const st = await vaultStatus(root);
88
- if (!st.exists) return noVault(root);
89
- const name = (url.searchParams.get("name") ?? "").trim();
90
- if (!name) return jsonErr("name is required");
91
- try {
92
- const { path, content } = await readArticle(root, name);
93
- return jsonOk({
94
- name,
95
- path,
96
- content,
97
- infobox: parseInfobox(content),
98
- lead: parseLead(content),
99
- series: parseSeriesBanner(content),
100
- structure: articleStructure(content),
101
- });
102
- } catch (e) {
103
- return jsonErr((e as Error).message, 404);
104
- }
105
- }
106
-
107
- // ---- GET /api/memory/links?name= -----------------------------------------
108
-
109
- export async function handleMemoryLinks(url: URL): Promise<Response> {
110
- const root = vaultRoot();
111
- const st = await vaultStatus(root);
112
- if (!st.exists) return noVault(root);
113
- const name = (url.searchParams.get("name") ?? "").trim();
114
- if (!name) return jsonErr("name is required");
115
- try {
116
- const links = await getArticleLinks(root, name);
117
- return jsonOk({ name, ...links });
118
- } catch (e) {
119
- return jsonErr((e as Error).message, 404);
120
- }
121
- }
122
-
123
- // ---- GET /api/memory/history?name= ---------------------------------------
124
-
125
- export async function handleMemoryHistory(url: URL): Promise<Response> {
126
- const root = vaultRoot();
127
- const st = await vaultStatus(root);
128
- if (!st.exists) return noVault(root);
129
- const name = (url.searchParams.get("name") ?? "").trim();
130
- if (!name) return jsonErr("name is required");
131
- const limitParam = Number(url.searchParams.get("limit") ?? "50");
132
- const limit = Number.isFinite(limitParam) && limitParam > 0 ? Math.min(limitParam, 200) : 50;
133
- try {
134
- const relPath = await resolveArticleRelPath(root, name); // throws if not found — validates `name`
135
- const entries = await articleHistory(root, relPath, limit);
136
- return jsonOk({ name, isGitRepo: st.isGitRepo, entries });
137
- } catch (e) {
138
- return jsonErr((e as Error).message, 404);
139
- }
140
- }
141
-
142
- // ---- GET /api/memory/diff?name=&rev= -------------------------------------
143
-
144
- /** Full 40-hex or an abbreviated (≥4 hex) commit hash — never a ref
145
- * expression (`HEAD~1`, `main^`, `refs/...`), which could otherwise be
146
- * abused to walk outside the intended commit or (in principle) smuggle
147
- * option-like text into the argv. `rev` is passed to Bun.spawn as its own
148
- * argv element (never through a shell), but this check is the defense
149
- * against a caller trying to pass anything other than a bare commit id. */
150
- const REV_RE = /^[0-9a-f]{4,40}$/;
151
-
152
- export async function handleMemoryDiff(url: URL): Promise<Response> {
153
- const root = vaultRoot();
154
- const st = await vaultStatus(root);
155
- if (!st.exists) return noVault(root);
156
- const name = (url.searchParams.get("name") ?? "").trim();
157
- const rev = (url.searchParams.get("rev") ?? "").trim();
158
- if (!name) return jsonErr("name is required");
159
- if (!rev) return jsonErr("rev is required");
160
- if (!REV_RE.test(rev)) return jsonErr("rev must be a commit hash (4-40 hex chars)");
161
- try {
162
- const relPath = await resolveArticleRelPath(root, name); // throws if not found — validates `name`
163
- const diff = await articleDiff(root, rev, relPath);
164
- if (diff === null) return jsonErr("commit not found or no diff for this article at that revision", 404);
165
- return jsonOk({ name, rev, diff });
166
- } catch (e) {
167
- return jsonErr((e as Error).message, 404);
168
- }
169
- }
170
-
171
- // ---- POST /api/memory/init { path?: string } -----------------------------
172
- //
173
- // The consent-card backend: wraps the exact same `setupVault` the CLI's
174
- // `mlx-bun memory init` calls (src/cli.ts, `case "memory":` → `sub === "init"`)
175
- // — same idempotent create-dirs/README/Meta-pages/git-init behavior, minus
176
- // the CLI's interactive extras (seed-from-existing-vault prompt, nightly
177
- // schedule prompt), which stay CLI-only/TTY-gated and are out of scope here.
178
- //
179
- // Unlike the CLI (which only ever calls setupVault(vaultRoot()) — a
180
- // user-supplied path there is a read-only *seed source*, never the
181
- // setupVault target), this route takes `path` straight from an untrusted
182
- // loopback caller. setupVault() mkdir -p's subdirectories into it and, if
183
- // it isn't already a git repo, runs `git init && git add . && git commit`
184
- // there — pointed at an arbitrary directory that's a destructive foot-gun
185
- // (force-commits whatever's already there into a fresh history). There is
186
- // no product reason for the web panel to redirect the vault root outside
187
- // the machine's own tmp/vault trees, so `path` is confined to those before
188
- // it ever reaches setupVault; anything else 400s instead of writing files.
189
-
190
- /** realpath() of the deepest existing ancestor of `path`, with the
191
- * non-existent tail (e.g. a not-yet-created vault dir) re-appended
192
- * literally. Needed because macOS resolves `/var/folders/...` (os.tmpdir())
193
- * through a `/private` symlink: a brand-new mkdtemp path under it won't
194
- * literal-prefix-match the realpath'd tmpdir unless we walk up to a real
195
- * segment the same way. */
196
- async function realpathNearest(path: string): Promise<string> {
197
- let cur = resolve(path);
198
- const tail: string[] = [];
199
- while (true) {
200
- try {
201
- return [await realpath(cur), ...tail.reverse()].join(sep);
202
- } catch {
203
- const parent = dirname(cur);
204
- if (parent === cur) return resolve(path); // hit the fs root without finding anything real
205
- tail.push(cur.slice(parent.length + 1));
206
- cur = parent;
207
- }
208
- }
209
- }
210
-
211
- /** Is `candidate` equal to or a descendant of `ancestor`, after resolving
212
- * symlinks on both sides? */
213
- async function isUnder(candidate: string, ancestor: string): Promise<boolean> {
214
- const realAncestor = await realpathNearest(ancestor);
215
- const realCandidate = await realpathNearest(candidate);
216
- return realCandidate === realAncestor || realCandidate.startsWith(realAncestor + sep);
217
- }
218
-
219
- /** Confine an init target to the machine's own vault/tmp trees — the only
220
- * legitimate destinations for this route (default vault root, or a tmp dir
221
- * for tests). Rejects anything else rather than handing setupVault() an
222
- * arbitrary, possibly pre-existing directory to mkdir/git-init into. */
223
- async function isAllowedVaultTarget(path: string): Promise<boolean> {
224
- return (await isUnder(path, vaultRoot())) || (await isUnder(path, tmpdir()));
225
- }
226
-
227
- export async function handleMemoryInit(request: Request): Promise<Response> {
228
- let body: { path?: string } = {};
229
- try {
230
- body = (await request.json()) as { path?: string };
231
- } catch {
232
- // empty body is fine — defaults to vaultRoot()
233
- }
234
- const root = body.path && body.path.trim() ? body.path.trim() : vaultRoot();
235
- if (!(await isAllowedVaultTarget(root))) {
236
- return jsonErr("path must be under the memory vault root or a temp directory", 400);
237
- }
238
- try {
239
- const res = await setupVault(root);
240
- const st = await vaultStatus(res.root);
241
- return jsonOk({ result: res, status: st });
242
- } catch (e) {
243
- return jsonErr((e as Error).message, 500);
244
- }
245
- }