mlx-bun 0.4.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (601) hide show
  1. package/README.md +1453 -88
  2. package/THIRD_PARTY_NOTICES.md +882 -0
  3. package/bin/mlx-bun.convert.mjs +4 -0
  4. package/bin/mlx-bun.fuse.mjs +4 -0
  5. package/bin/mlx-bun.generate.mjs +4 -0
  6. package/bin/mlx-bun.lora.mjs +4 -0
  7. package/bin/mlx-bun.mjs +13 -21
  8. package/bin/mlx-bun.server.mjs +4 -0
  9. package/bin/mlx-bun.upload.mjs +4 -0
  10. package/dist/web/app.js +9584 -0
  11. package/package.json +50 -53
  12. package/src/cli/ane-install.ts +76 -0
  13. package/src/cli/args.ts +179 -0
  14. package/src/cli/engine-entry.ts +68 -0
  15. package/src/cli/inference.ts +214 -0
  16. package/src/cli/job-entry.ts +97 -0
  17. package/src/cli/library-host.ts +117 -0
  18. package/src/cli/main.ts +57 -0
  19. package/src/cli/memory-engine.ts +163 -0
  20. package/src/cli/memory.ts +36 -0
  21. package/src/cli/mlx-lm-aliases.ts +309 -0
  22. package/src/cli/model-choice.ts +33 -0
  23. package/src/cli/model-selection.ts +84 -0
  24. package/src/cli/module-host.ts +11 -0
  25. package/src/cli/module-verbs.ts +50 -0
  26. package/src/cli/numerical-policy.ts +12 -0
  27. package/src/cli/perplexity.ts +89 -0
  28. package/src/cli/serve-host.ts +423 -0
  29. package/src/cli/serve-isolated.ts +217 -0
  30. package/src/cli/serve-options.ts +106 -0
  31. package/src/cli/serve-state.ts +205 -0
  32. package/src/cli/serve.ts +500 -0
  33. package/src/cli/served-model-host.ts +102 -0
  34. package/src/cli/server-entry.ts +148 -0
  35. package/src/cli/serving-unit.ts +177 -0
  36. package/src/{tui.ts → cli/terminal.ts} +13 -8
  37. package/src/cli/worker-adapters.ts +34 -0
  38. package/src/cli/worker-entry.ts +272 -0
  39. package/src/cli/worker-unit.ts +179 -0
  40. package/src/engine/adapter-operation.ts +26 -0
  41. package/src/engine/cache-services.ts +114 -0
  42. package/src/engine/completion.ts +39 -0
  43. package/src/engine/generation-gateway.ts +358 -0
  44. package/src/engine/index.ts +59 -0
  45. package/src/engine/kv-budget.ts +120 -0
  46. package/src/engine/media-preparation.ts +232 -0
  47. package/src/engine/model-binding.ts +24 -0
  48. package/src/engine/model-host.ts +513 -0
  49. package/src/engine/model-serving.ts +89 -0
  50. package/src/{serve → engine}/preparation.ts +10 -8
  51. package/src/{serve → engine}/session-completion-engine.ts +6 -6
  52. package/src/engine/telemetry.ts +109 -0
  53. package/src/hub/downloads.ts +116 -0
  54. package/src/jobs/db.ts +16 -7
  55. package/src/jobs/events.ts +29 -0
  56. package/src/jobs/executable.ts +5 -0
  57. package/src/jobs/host.ts +51 -0
  58. package/src/jobs/in-process.ts +55 -0
  59. package/src/{contracts/jobs.ts → jobs/protocol.ts} +7 -9
  60. package/src/jobs/runner.ts +150 -231
  61. package/src/jobs/service.ts +75 -0
  62. package/src/jobs/sse.ts +59 -23
  63. package/src/jobs/worker-memory.ts +46 -0
  64. package/src/jobs/worker-process.ts +163 -0
  65. package/src/jobs/worker-supervisor.ts +258 -0
  66. package/src/modules.ts +58 -0
  67. package/src/publishing/catalog-hub.ts +18 -0
  68. package/src/publishing/credentials.ts +31 -0
  69. package/src/publishing/upload.ts +37 -0
  70. package/src/residency/leased-adapters.ts +21 -0
  71. package/src/residency/local-records.ts +16 -0
  72. package/src/residency/model-residency.ts +405 -0
  73. package/src/residency/record-index.ts +28 -0
  74. package/src/residency/resident-estimate.ts +50 -0
  75. package/src/{anthropic.ts → server/anthropic.ts} +3 -81
  76. package/src/server/cache-routes.ts +36 -0
  77. package/src/{serve → server}/chat-request.ts +12 -10
  78. package/src/{serve → server}/chat-stage.ts +27 -22
  79. package/src/{client.ts → server/client.ts} +28 -2
  80. package/src/{serve → server}/completion-executor.ts +42 -42
  81. package/src/server/decision-body.ts +55 -0
  82. package/src/server/decision-routes.ts +134 -0
  83. package/src/server/decision-wire.ts +228 -0
  84. package/src/{serve → server}/discovery-routes.ts +42 -83
  85. package/src/server/generated-token-history.ts +57 -0
  86. package/src/{serve → server}/http.ts +25 -13
  87. package/src/{serve → server}/inference-request.ts +5 -5
  88. package/src/server/job-routes.ts +20 -0
  89. package/src/server/media-prompt.ts +63 -0
  90. package/src/server/memory-completion-client.ts +46 -0
  91. package/src/server/model-routes.ts +192 -0
  92. package/src/{serve → server}/openai-wire.ts +3 -2
  93. package/src/{serve → server}/pipeline.ts +1 -1
  94. package/src/server/prompt-builder.ts +13 -0
  95. package/src/server/prompt-contracts.ts +17 -0
  96. package/src/server/proxy-routes.ts +187 -0
  97. package/src/server/publishing-routes.ts +41 -0
  98. package/src/{serve → server}/request-plan.ts +8 -8
  99. package/src/{serve → server}/request-prep.ts +82 -68
  100. package/src/{serve → server}/responses-client.ts +30 -13
  101. package/src/{responses.ts → server/responses.ts} +12 -93
  102. package/src/server/routes.ts +205 -0
  103. package/src/server/start.ts +72 -0
  104. package/src/server/status-routes.ts +108 -0
  105. package/src/{serve → server}/text-completion-stage.ts +25 -4
  106. package/src/server/text-prompt.ts +12 -0
  107. package/src/{serve → server}/token-streams.ts +36 -38
  108. package/src/server/worker-routes.ts +311 -0
  109. package/src/storage/paths.ts +61 -0
  110. package/src/web/assets.ts +37 -0
  111. package/src/web/{src → browser}/api.ts +5 -23
  112. package/src/web/browser/chat-host.ts +17 -0
  113. package/src/web/browser/installed-panels.ts +6 -0
  114. package/src/web/browser/main.ts +55 -0
  115. package/src/web/browser/markdown.ts +279 -0
  116. package/src/web/browser/memory-panel.ts +9 -0
  117. package/src/web/browser/palette.ts +64 -0
  118. package/src/web/browser/protocol.ts +13 -0
  119. package/src/web/browser/shell.ts +467 -0
  120. package/src/web/{src → browser}/status.ts +32 -36
  121. package/src/web/build.ts +51 -0
  122. package/src/web/public/app.html +1054 -0
  123. package/src/web/{sw.js → public/sw.js} +4 -3
  124. package/src/web/{vendor → public/vendor}/hljs-theme.css +2 -2
  125. package/src/web/{vendor → public/vendor}/hljs.js +2 -2
  126. package/THIRD_PARTY_LICENSES.md +0 -51
  127. package/docs/README.md +0 -94
  128. package/docs/archive/hlg-sampling.md +0 -350
  129. package/docs/archive/investigations/audio-input-plan.md +0 -356
  130. package/docs/archive/investigations/chunk-finetune-experiment.md +0 -84
  131. package/docs/archive/investigations/colibri-glm52-port.md +0 -1486
  132. package/docs/archive/investigations/colibri-oracle-pin.md +0 -1284
  133. package/docs/archive/investigations/curve-bisector-routing.md +0 -123
  134. package/docs/archive/investigations/decode-roofline-lookagain.md +0 -348
  135. package/docs/archive/investigations/diffusion-gemma-port.md +0 -602
  136. package/docs/archive/investigations/dspark-handoff.md +0 -224
  137. package/docs/archive/investigations/expert-offload-single-user-moe.md +0 -292
  138. package/docs/archive/investigations/faithful-l1-consolidation.md +0 -310
  139. package/docs/archive/investigations/hlg-sampling-investigation.md +0 -970
  140. package/docs/archive/investigations/indexshare-performance-spike.md +0 -357
  141. package/docs/archive/investigations/kernel-perf-review-2026-07.md +0 -171
  142. package/docs/archive/investigations/lab-build-journal.md +0 -157
  143. package/docs/archive/investigations/minicpm5-decode-megakernel.md +0 -489
  144. package/docs/archive/investigations/openjarvis-fit.md +0 -198
  145. package/docs/archive/investigations/openwiki-evaluation.md +0 -249
  146. package/docs/archive/investigations/optimization_plan.md +0 -346
  147. package/docs/archive/investigations/orpo-base-uf-experiment-and-directions.md +0 -120
  148. package/docs/archive/investigations/orpo-flash-cce-pin-leak.md +0 -167
  149. package/docs/archive/investigations/orpo-uf-testing-handoff.md +0 -126
  150. package/docs/archive/investigations/pareto-specialized-runtime-findings.md +0 -92
  151. package/docs/archive/investigations/pi-builtin-investigation.md +0 -308
  152. package/docs/archive/investigations/pre-colibri-stabilization.md +0 -329
  153. package/docs/archive/investigations/qwen38-27b-campaign-log.md +0 -1092
  154. package/docs/archive/investigations/segmented-backward-handoff.md +0 -148
  155. package/docs/archive/investigations/starter-model-port-handoff.md +0 -342
  156. package/docs/archive/investigations/steel-flash-cce-handoff.md +0 -489
  157. package/docs/archive/investigations/the-dreaming-handoff.md +0 -141
  158. package/docs/archive/investigations/trainer-validation-experiment.md +0 -173
  159. package/docs/archive/planning/chat-ui-vision-memory-first.md +0 -199
  160. package/docs/archive/planning/chat-ui-vision.md +0 -50
  161. package/docs/archive/planning/chunk-task-roadmap.md +0 -77
  162. package/docs/archive/planning/curve-sampler-research-plan.md +0 -331
  163. package/docs/archive/planning/journal.md +0 -316
  164. package/docs/archive/planning/memory-docs-and-dag-plan.md +0 -194
  165. package/docs/archive/planning/pi-integration-review.md +0 -178
  166. package/docs/archive/planning/release-notes-v0.0.10.md +0 -57
  167. package/docs/archive/planning/release-notes-v0.0.11.md +0 -239
  168. package/docs/archive/planning/release-notes-v0.0.12.md +0 -80
  169. package/docs/archive/planning/release-notes-v0.0.13.md +0 -77
  170. package/docs/archive/planning/release-notes-v0.0.9.md +0 -122
  171. package/docs/archive/planning/release-notes-v0.2.0.md +0 -49
  172. package/docs/archive/planning/release-notes-v0.3.0.md +0 -35
  173. package/docs/archive/planning/web-ui-pass-plan.md +0 -213
  174. package/docs/archive/planning/website-readme-pass-plan.md +0 -224
  175. package/docs/design/batching.md +0 -1841
  176. package/docs/design/decode-speed-program.md +0 -2349
  177. package/docs/design/dreaming-nightly-pipeline.md +0 -684
  178. package/docs/design/generic-model-support.md +0 -705
  179. package/docs/design/kv-cache.md +0 -824
  180. package/docs/design/orpo-training.md +0 -680
  181. package/docs/design/speculative-decoding.md +0 -1990
  182. package/docs/design/turboquant.md +0 -2212
  183. package/docs/design/unified-engine-frontier-plan.md +0 -1880
  184. package/docs/design/web-chat-redesign.md +0 -695
  185. package/docs/planning/PRODUCT_ROADMAP.md +0 -594
  186. package/docs/planning/ResearchTopics.md +0 -119
  187. package/docs/planning/release-notes-v0.4.0.md +0 -45
  188. package/docs/planning/video-series.md +0 -421
  189. package/docs/reference/benchmarks.md +0 -3613
  190. package/docs/reference/cli.md +0 -585
  191. package/docs/reference/distribution.md +0 -355
  192. package/docs/reference/environment.md +0 -398
  193. package/docs/reference/glossary.md +0 -39
  194. package/docs/reference/library-api.md +0 -674
  195. package/docs/reference/memory.md +0 -260
  196. package/docs/reference/models.md +0 -334
  197. package/docs/reference/server-api.md +0 -1775
  198. package/docs/reference/server-config.md +0 -846
  199. package/docs/reference/training.md +0 -462
  200. package/docs/reference/troubleshooting.md +0 -158
  201. package/src/admission-plan.ts +0 -18
  202. package/src/audio/conformer.ts +0 -647
  203. package/src/audio/decode.ts +0 -133
  204. package/src/audio/features.ts +0 -202
  205. package/src/audio/transcode.ts +0 -67
  206. package/src/backends/mlx/assistant-target.ts +0 -46
  207. package/src/backends/mlx/autoregressive-draft-rows.ts +0 -120
  208. package/src/backends/mlx/autoregressive.ts +0 -108
  209. package/src/backends/mlx/batch-group.ts +0 -1790
  210. package/src/backends/mlx/cache-attachment.ts +0 -67
  211. package/src/backends/mlx/cache-layout.ts +0 -31
  212. package/src/backends/mlx/checkpoint-state.ts +0 -53
  213. package/src/backends/mlx/continuation-persistence.ts +0 -106
  214. package/src/backends/mlx/continuation-request.ts +0 -43
  215. package/src/backends/mlx/continuation.ts +0 -77
  216. package/src/backends/mlx/diffusion.ts +0 -39
  217. package/src/backends/mlx/draft-target.ts +0 -32
  218. package/src/backends/mlx/evaluation.ts +0 -105
  219. package/src/backends/mlx/fill-append.ts +0 -45
  220. package/src/backends/mlx/full-kv-row-append.ts +0 -32
  221. package/src/backends/mlx/full-kv-row-donor.ts +0 -54
  222. package/src/backends/mlx/full-transitioning-kv-rows.ts +0 -65
  223. package/src/backends/mlx/gateway-binding.ts +0 -130
  224. package/src/backends/mlx/graph.ts +0 -38
  225. package/src/backends/mlx/kv-codec.ts +0 -9
  226. package/src/backends/mlx/kv-maintenance.ts +0 -133
  227. package/src/backends/mlx/kv-tensor-rows.ts +0 -212
  228. package/src/backends/mlx/memory-client.ts +0 -189
  229. package/src/backends/mlx/methods.ts +0 -90
  230. package/src/backends/mlx/model-prompt.ts +0 -164
  231. package/src/backends/mlx/model-serving.ts +0 -79
  232. package/src/backends/mlx/prefill-cohort.ts +0 -89
  233. package/src/backends/mlx/prefill-rows.ts +0 -200
  234. package/src/backends/mlx/prefill.ts +0 -33
  235. package/src/backends/mlx/projected-context-rows.ts +0 -72
  236. package/src/backends/mlx/request-policy.ts +0 -20
  237. package/src/backends/mlx/request-state-policy.ts +0 -41
  238. package/src/backends/mlx/rollback.ts +0 -89
  239. package/src/backends/mlx/row-sampling.ts +0 -49
  240. package/src/backends/mlx/serial-executor.ts +0 -242
  241. package/src/backends/mlx/speculative-group.ts +0 -359
  242. package/src/backends/mlx/speculative-round.ts +0 -161
  243. package/src/backends/mlx/speculative.ts +0 -114
  244. package/src/backends/mlx/state-rows.ts +0 -104
  245. package/src/backends/mlx/state-views.ts +0 -46
  246. package/src/backends/mlx/target-layout-capability.ts +0 -35
  247. package/src/backends/mlx/text-engine.ts +0 -73
  248. package/src/backends/mlx/transitioning-kv-rows.ts +0 -165
  249. package/src/chat-template.ts +0 -382
  250. package/src/cli.ts +0 -3168
  251. package/src/config.ts +0 -399
  252. package/src/contracts/completion.ts +0 -16
  253. package/src/contracts/execution.ts +0 -60
  254. package/src/contracts/generation.ts +0 -103
  255. package/src/contracts/host.ts +0 -7
  256. package/src/contracts/pi-provider.ts +0 -30
  257. package/src/contracts/pi.ts +0 -259
  258. package/src/contracts/prefix-cache.ts +0 -23
  259. package/src/contracts/resources.ts +0 -25
  260. package/src/contracts/sampling.ts +0 -23
  261. package/src/contracts/scheduling.ts +0 -45
  262. package/src/contracts/tsconfig.json +0 -14
  263. package/src/dataset/generators.ts +0 -1087
  264. package/src/dataset/index.ts +0 -12
  265. package/src/dataset/job.ts +0 -81
  266. package/src/dataset/llm.ts +0 -71
  267. package/src/dataset/registry.ts +0 -528
  268. package/src/diffusion/diffusion-generate.ts +0 -507
  269. package/src/download.ts +0 -505
  270. package/src/embed.ts +0 -77
  271. package/src/engine/admission.ts +0 -59
  272. package/src/engine/cancellation.ts +0 -38
  273. package/src/engine/engine.ts +0 -56
  274. package/src/engine/execution-coordinator.ts +0 -70
  275. package/src/engine/execution-plan.ts +0 -53
  276. package/src/engine/resources.ts +0 -53
  277. package/src/engine/scheduler.ts +0 -72
  278. package/src/engine/session.ts +0 -247
  279. package/src/eval/README.md +0 -130
  280. package/src/eval/ifeval.ts +0 -81
  281. package/src/eval/kl-prompts.ts +0 -29
  282. package/src/eval/kl.ts +0 -590
  283. package/src/eval/perplexity.ts +0 -164
  284. package/src/eval/quality-db.ts +0 -92
  285. package/src/eval/reference-logits.ts +0 -207
  286. package/src/eval/runner.ts +0 -124
  287. package/src/eval/score.ts +0 -49
  288. package/src/eval/tasks/bfcl.ts +0 -535
  289. package/src/eval/tasks/gsm8k.ts +0 -98
  290. package/src/eval/tasks/hashhop.ts +0 -139
  291. package/src/eval/tasks/humaneval.ts +0 -275
  292. package/src/eval/tasks/ifeval.ts +0 -525
  293. package/src/eval/tasks/mmlu.ts +0 -157
  294. package/src/eval/ultrafeedback.ts +0 -60
  295. package/src/evaldb.ts +0 -199
  296. package/src/expert-io.ts +0 -393
  297. package/src/expert-offload-build.ts +0 -77
  298. package/src/expert-offload.ts +0 -76
  299. package/src/expert-residency.ts +0 -1134
  300. package/src/expert-usage.ts +0 -415
  301. package/src/fill/echo-index.ts +0 -188
  302. package/src/fill/fill-session.ts +0 -452
  303. package/src/fill/proposal.ts +0 -68
  304. package/src/fill/schema-rows.ts +0 -506
  305. package/src/fill/tool-boundary.ts +0 -103
  306. package/src/fit.ts +0 -249
  307. package/src/generate.ts +0 -1346
  308. package/src/grammar.ts +0 -591
  309. package/src/harness-pi.ts +0 -184
  310. package/src/hf-push.ts +0 -628
  311. package/src/hub-rest.ts +0 -242
  312. package/src/index.ts +0 -63
  313. package/src/inference/denoising.ts +0 -17
  314. package/src/inference/draft-acceptance.ts +0 -41
  315. package/src/inference/draft-output.ts +0 -49
  316. package/src/inference/graph.ts +0 -33
  317. package/src/inference/prefill.ts +0 -39
  318. package/src/inference/rollback.ts +0 -7
  319. package/src/jobs/index.ts +0 -31
  320. package/src/jobs/job-entry.ts +0 -107
  321. package/src/jobs/task-client.ts +0 -19
  322. package/src/jobs/types.ts +0 -2
  323. package/src/kv-scheme.ts +0 -257
  324. package/src/kv-store.ts +0 -1099
  325. package/src/lab/README.md +0 -18
  326. package/src/lab/curve/curve-designer.html +0 -303
  327. package/src/lab/curve/curve-sampler.ts +0 -122
  328. package/src/lab/expert-trace/expert-trace.ts +0 -69
  329. package/src/lab/paged-kv/paged-kv-rows.ts +0 -83
  330. package/src/lab/paged-kv/paged-kv.ts +0 -270
  331. package/src/library.ts +0 -40
  332. package/src/lora.ts +0 -408
  333. package/src/md-modules.d.ts +0 -49
  334. package/src/media-fetch.ts +0 -442
  335. package/src/memory/article.ts +0 -558
  336. package/src/memory/chunk-validation.ts +0 -150
  337. package/src/memory/chunk.ts +0 -318
  338. package/src/memory/cluster.ts +0 -351
  339. package/src/memory/coverage.ts +0 -134
  340. package/src/memory/crosslink.ts +0 -0
  341. package/src/memory/db.ts +0 -253
  342. package/src/memory/entity.ts +0 -203
  343. package/src/memory/gate.ts +0 -187
  344. package/src/memory/history.ts +0 -152
  345. package/src/memory/ingest.ts +0 -335
  346. package/src/memory/model.ts +0 -183
  347. package/src/memory/normalize.ts +0 -671
  348. package/src/memory/parse.ts +0 -22
  349. package/src/memory/pipeline.ts +0 -275
  350. package/src/memory/prompts.ts +0 -65
  351. package/src/memory/query.ts +0 -334
  352. package/src/memory/reconcile.ts +0 -734
  353. package/src/memory/redirect.ts +0 -108
  354. package/src/memory/reindex.ts +0 -325
  355. package/src/memory/resolve.ts +0 -307
  356. package/src/memory/rest.ts +0 -245
  357. package/src/memory/route.ts +0 -272
  358. package/src/memory/schedule.ts +0 -165
  359. package/src/memory/stages.ts +0 -777
  360. package/src/memory/synthesize.ts +0 -1638
  361. package/src/memory/tools.ts +0 -749
  362. package/src/memory/vault.ts +0 -1194
  363. package/src/memory/wikify.ts +0 -1064
  364. package/src/mlx/array.ts +0 -388
  365. package/src/mlx/autograd.ts +0 -304
  366. package/src/mlx/checkpoint.ts +0 -149
  367. package/src/mlx/compile.ts +0 -168
  368. package/src/mlx/custom-vjp.ts +0 -188
  369. package/src/mlx/ffi.ts +0 -512
  370. package/src/mlx/materialize.ts +0 -23
  371. package/src/mlx/metal-kernel.ts +0 -159
  372. package/src/mlx/ops.ts +0 -1021
  373. package/src/mlx/quantized-rows.ts +0 -36
  374. package/src/mlx/token-bitmask.ts +0 -52
  375. package/src/mlx/turboquant-kv-decode.ts +0 -82
  376. package/src/mlx/turboquant-kv-inverse.ts +0 -122
  377. package/src/mlx/turboquant-ops.ts +0 -861
  378. package/src/mlx/turboquant-tables.ts +0 -237
  379. package/src/mmap.ts +0 -90
  380. package/src/model/artifact-identity.ts +0 -73
  381. package/src/model/batched-kv.ts +0 -235
  382. package/src/model/batched-mask.ts +0 -279
  383. package/src/model/batched-quant.ts +0 -212
  384. package/src/model/batched-quantized-kv.ts +0 -144
  385. package/src/model/batched-rotating-quant.ts +0 -353
  386. package/src/model/batched-rotating-state.ts +0 -149
  387. package/src/model/batched-rotating.ts +0 -338
  388. package/src/model/batched-row-storage.ts +0 -179
  389. package/src/model/batched-ssm.ts +0 -52
  390. package/src/model/batched-turboquant-kv.ts +0 -93
  391. package/src/model/compiled-decode.ts +0 -712
  392. package/src/model/decoded-kv-donor.ts +0 -12
  393. package/src/model/delayed-quantized-kv.ts +0 -72
  394. package/src/model/delayed-rotating-quantized-kv.ts +0 -93
  395. package/src/model/delayed-turboquant-kv.ts +0 -55
  396. package/src/model/diffusion-gemma.ts +0 -1026
  397. package/src/model/factory.ts +0 -189
  398. package/src/model/fingerprint.ts +0 -33
  399. package/src/model/flash-attention.ts +0 -694
  400. package/src/model/full-prefill-padding.ts +0 -56
  401. package/src/model/full-prefill-row.ts +0 -105
  402. package/src/model/gemma4-base.ts +0 -2351
  403. package/src/model/gemma4.ts +0 -1315
  404. package/src/model/generated/gemma4-12b.ts +0 -429
  405. package/src/model/generated/gemma4-26b.ts +0 -448
  406. package/src/model/generated/gemma4-e4b.ts +0 -717
  407. package/src/model/generated/index.ts +0 -18
  408. package/src/model/glm52-atlas.ts +0 -511
  409. package/src/model/glm52-cache.ts +0 -792
  410. package/src/model/glm52-config.ts +0 -262
  411. package/src/model/glm52-container.ts +0 -305
  412. package/src/model/glm52-coupling.ts +0 -388
  413. package/src/model/glm52-dsa.ts +0 -606
  414. package/src/model/glm52-expert-layout.ts +0 -253
  415. package/src/model/glm52-layout.ts +0 -152
  416. package/src/model/glm52-memory.ts +0 -500
  417. package/src/model/glm52-mla.ts +0 -792
  418. package/src/model/glm52-moe.ts +0 -223
  419. package/src/model/glm52-pilot.ts +0 -537
  420. package/src/model/glm52-reference.ts +0 -445
  421. package/src/model/glm52-residency.ts +0 -557
  422. package/src/model/glm52-resident-weights.ts +0 -135
  423. package/src/model/glm52-streamed-experts.ts +0 -453
  424. package/src/model/glm52-streamed-metal.ts +0 -610
  425. package/src/model/glm52-weights.ts +0 -503
  426. package/src/model/glm52.ts +0 -1132
  427. package/src/model/implementation.ts +0 -69
  428. package/src/model/kv-attention-view.ts +0 -67
  429. package/src/model/minicpm5.ts +0 -376
  430. package/src/model/profile.ts +0 -443
  431. package/src/model/qwen-append.ts +0 -12
  432. package/src/model/qwen-conv.ts +0 -52
  433. package/src/model/qwen3-delta-state.ts +0 -74
  434. package/src/model/qwen3-delta.ts +0 -451
  435. package/src/model/qwen3-moe.ts +0 -404
  436. package/src/model/qwen3-mrope.ts +0 -252
  437. package/src/model/qwen3.ts +0 -277
  438. package/src/model/qwen3_5-checkpoint.ts +0 -164
  439. package/src/model/qwen3_5.ts +0 -819
  440. package/src/model/rotating-kv-donor.ts +0 -35
  441. package/src/model/rotating-kv-layout.ts +0 -262
  442. package/src/model/rotating-row-transaction.ts +0 -35
  443. package/src/model/speculative-rotating-kv.ts +0 -101
  444. package/src/model/ssm-prefill-padding.ts +0 -39
  445. package/src/model/support.ts +0 -102
  446. package/src/model/trellis-balanced-scatter.ts +0 -51
  447. package/src/model/trellis-linear.ts +0 -672
  448. package/src/model/trellis-shared-m.ts +0 -151
  449. package/src/model/trellis-shared-scatter.ts +0 -144
  450. package/src/model/trellis-splitk-prefill.ts +0 -158
  451. package/src/model/trellis-tiled-prefill.ts +0 -136
  452. package/src/model/trellis-vector-expand.ts +0 -62
  453. package/src/model/trellis-wide-prefill.ts +0 -94
  454. package/src/model/turboquant-codec.ts +0 -83
  455. package/src/model/universal/archs.ts +0 -332
  456. package/src/model/universal/dense.ts +0 -612
  457. package/src/model/universal/modules.ts +0 -170
  458. package/src/model/universal/rope.ts +0 -381
  459. package/src/native/expert_io.c +0 -523
  460. package/src/native/frame_extract.swift +0 -140
  461. package/src/native-pack.ts +0 -162
  462. package/src/pi-provider.ts +0 -53
  463. package/src/pi-session.ts +0 -81
  464. package/src/pi-terminal.ts +0 -274
  465. package/src/pi-web.ts +0 -1932
  466. package/src/preflight.ts +0 -158
  467. package/src/prompt-cache.ts +0 -460
  468. package/src/quantize/allocator.ts +0 -627
  469. package/src/quantize/atomic-output.ts +0 -38
  470. package/src/quantize/calibration.ts +0 -181
  471. package/src/quantize/config-writer.ts +0 -145
  472. package/src/quantize/index.ts +0 -84
  473. package/src/quantize/job.ts +0 -162
  474. package/src/quantize/quantizer.ts +0 -666
  475. package/src/quantize/rotate.ts +0 -603
  476. package/src/quantize/safetensors-writer.ts +0 -249
  477. package/src/quantize/sensitivity.ts +0 -216
  478. package/src/quantize/trellis.ts +0 -586
  479. package/src/quantize/weight-transform.ts +0 -292
  480. package/src/registry.ts +0 -602
  481. package/src/runtime-config.ts +0 -81
  482. package/src/safetensors.ts +0 -158
  483. package/src/sampler.ts +0 -1011
  484. package/src/serve/admin-routes.ts +0 -184
  485. package/src/serve/assets/curve-terrain.html +0 -105
  486. package/src/serve/assets/training-inference-map.html +0 -575
  487. package/src/serve/aux-routes.ts +0 -132
  488. package/src/serve/batch-scheduler.ts +0 -8
  489. package/src/serve/checkpoint-identity.ts +0 -64
  490. package/src/serve/generation-gateway.ts +0 -496
  491. package/src/serve/isolate.ts +0 -609
  492. package/src/serve/kv-budget.ts +0 -14
  493. package/src/serve/lab-routes.ts +0 -341
  494. package/src/serve/lane-registry.ts +0 -45
  495. package/src/serve/model-admin-routes.ts +0 -155
  496. package/src/serve/model-binding.ts +0 -43
  497. package/src/serve/model-host.ts +0 -511
  498. package/src/serve/parent-application.ts +0 -56
  499. package/src/serve/prompt-response-trace.ts +0 -147
  500. package/src/serve/response-lease.ts +0 -24
  501. package/src/serve/session-search.ts +0 -326
  502. package/src/serve/static-routes.ts +0 -101
  503. package/src/server.ts +0 -1314
  504. package/src/spec/assistant-rows.ts +0 -92
  505. package/src/spec/assistant-source.ts +0 -126
  506. package/src/spec/cache-identity.ts +0 -22
  507. package/src/spec/deepspec-rows.ts +0 -29
  508. package/src/spec/deepspec-source.ts +0 -145
  509. package/src/spec/dflash-source.ts +0 -149
  510. package/src/spec/drafter.ts +0 -304
  511. package/src/spec/dspark/ab-stats.ts +0 -136
  512. package/src/spec/dspark/calibration.ts +0 -112
  513. package/src/spec/dspark/data-dflash.ts +0 -156
  514. package/src/spec/dspark/data.ts +0 -201
  515. package/src/spec/dspark/deepspec-module.ts +0 -776
  516. package/src/spec/dspark/generate-dflash.ts +0 -245
  517. package/src/spec/dspark/generate.ts +0 -290
  518. package/src/spec/dspark/loader.ts +0 -23
  519. package/src/spec/dspark/loss.ts +0 -213
  520. package/src/spec/dspark/module-dflash.ts +0 -560
  521. package/src/spec/dspark/module.ts +0 -540
  522. package/src/spec/dspark/quantize-drafter.ts +0 -91
  523. package/src/spec/dspark/sample.ts +0 -112
  524. package/src/spec/generate.ts +0 -276
  525. package/src/spec/glm52-mtp-graph.ts +0 -29
  526. package/src/spec/glm52-mtp-rows.ts +0 -132
  527. package/src/spec/glm52-mtp-source.ts +0 -317
  528. package/src/spec/glm52-mtp-state.ts +0 -33
  529. package/src/spec/ngram-source.ts +0 -204
  530. package/src/spec/projected-draft-rows.ts +0 -73
  531. package/src/spec/qwen-mtp-module.ts +0 -171
  532. package/src/spec/qwen-mtp-rows.ts +0 -219
  533. package/src/spec/qwen-mtp-source.ts +0 -383
  534. package/src/spec/qwen-mtp-state.ts +0 -30
  535. package/src/spec/serve-loop.ts +0 -585
  536. package/src/spec/source.ts +0 -215
  537. package/src/spec/two-model-rows.ts +0 -61
  538. package/src/spec/two-model.ts +0 -113
  539. package/src/ssd-cache.ts +0 -372
  540. package/src/ssd-durability.ts +0 -211
  541. package/src/tokenizer.ts +0 -335
  542. package/src/tool-approvals.ts +0 -131
  543. package/src/tool-call.ts +0 -695
  544. package/src/train/dataset.ts +0 -484
  545. package/src/train/diffusion-lora.ts +0 -216
  546. package/src/train/export.ts +0 -32
  547. package/src/train/flash-cce.ts +0 -1234
  548. package/src/train/forward.ts +0 -266
  549. package/src/train/fuse.ts +0 -243
  550. package/src/train/index.ts +0 -46
  551. package/src/train/job.ts +0 -205
  552. package/src/train/lora-params.ts +0 -254
  553. package/src/train/loss.ts +0 -1591
  554. package/src/train/merge.ts +0 -195
  555. package/src/train/optimizer.ts +0 -183
  556. package/src/train/prefix-shared.ts +0 -490
  557. package/src/train/rank.ts +0 -137
  558. package/src/train/segmented.ts +0 -1828
  559. package/src/train/steel-qmm-header.ts +0 -1461
  560. package/src/train/trainer.ts +0 -1221
  561. package/src/train/watch.ts +0 -542
  562. package/src/vision/diffusion-vision.ts +0 -620
  563. package/src/vision/embedder.ts +0 -168
  564. package/src/vision/preprocess.ts +0 -247
  565. package/src/vision/prompt.ts +0 -373
  566. package/src/vision/qwen3vl-preprocess.ts +0 -409
  567. package/src/vision/qwen3vl-prompt.ts +0 -196
  568. package/src/vision/qwen3vl-tower.ts +0 -555
  569. package/src/vision/siglip.ts +0 -599
  570. package/src/vision/video-frames.ts +0 -148
  571. package/src/web/app.html +0 -2143
  572. package/src/web/app.js +0 -5703
  573. package/src/web/skills/memory/SKILL.md +0 -120
  574. package/src/web/skills/web-research/SKILL.md +0 -46
  575. package/src/web/skills.ts +0 -97
  576. package/src/web/src/adapters-panel.ts +0 -288
  577. package/src/web/src/assistant.ts +0 -451
  578. package/src/web/src/chat.ts +0 -1057
  579. package/src/web/src/composer.ts +0 -959
  580. package/src/web/src/dataset.ts +0 -132
  581. package/src/web/src/finetune.ts +0 -267
  582. package/src/web/src/hub.ts +0 -428
  583. package/src/web/src/main.ts +0 -98
  584. package/src/web/src/markdown.ts +0 -0
  585. package/src/web/src/memory-panel.ts +0 -572
  586. package/src/web/src/model-picker.ts +0 -159
  587. package/src/web/src/palette.ts +0 -346
  588. package/src/web/src/protocol.ts +0 -26
  589. package/src/web/src/quantize.ts +0 -167
  590. package/src/web/src/rag.ts +0 -274
  591. package/src/web/src/sessions.ts +0 -469
  592. package/src/web/src/shell.ts +0 -804
  593. package/src/web/src/ui-catalog.ts +0 -78
  594. package/src/web/vendor/README.md +0 -61
  595. package/src/web-assets.ts +0 -47
  596. package/src/web-tools.ts +0 -478
  597. package/src/weights.ts +0 -255
  598. /package/src/{serve → server}/completion-sink.ts +0 -0
  599. /package/src/web/{icon.svg → public/icon.svg} +0 -0
  600. /package/src/web/{manifest.webmanifest → public/manifest.webmanifest} +0 -0
  601. /package/src/web/{vendor → public/vendor}/hljs-LICENSE +0 -0
@@ -1,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
- }