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,272 +0,0 @@
1
- // mlx-bun memory — ROUTE: chunk-entities → subject articles.
2
- //
3
- // Routing is the deterministic-first join from a chunk's extracted entity
4
- // surfaces to subject articles, with the model used ONLY to break genuine ties.
5
- // It is the routing thesis under test: read the subjects a chunk is *about* and
6
- // fan it out to EVERY article it touches (a single chunk routes to many).
7
- //
8
- // The policy here is Lucien's `Bucketing.md` / `Editorial_Guidelines.md`, ported
9
- // faithfully: SURFACE EVERYTHING (nothing is dropped as trivia), STRONGLY PREFER
10
- // EXISTING articles (existing wins ties), and mint a NEW article only for a
11
- // substantive subject with no existing home. There is NO ownership/usefulness
12
- // test — "anything that recurs in your thinking is notable enough."
13
- //
14
- // Per surface, in order:
15
- // 1. RESOLVE — squeeze/alias/token-subset against the known-entity index
16
- // (resolve.ts). A hit routes deterministically (folds into that existing
17
- // article), no model call.
18
- // 2. DISAMBIGUATE — a miss gets a trigram shortlist of existing entities; each
19
- // candidate is put to the model as a bounded binary "is {surface} the same
20
- // thing as {candidate}?" (callLocal("route"), 4 tokens, parseBinary). The
21
- // first yes routes (existing wins).
22
- // 3. CREATE / CAPTURE — a surface that matches nothing runs the CREATE gate: a
23
- // subject earns its OWN article when it RECURS (≥ RECURRENCE_THRESHOLD
24
- // routed chunks) OR the chunk engages it as a genuine subject (stubs are
25
- // encouraged for emerging topics). A thin single fleeting mention with no
26
- // existing home is CAPTURED — left in its chunk, retrievable by search,
27
- // never dropped and never forced into a junk article. It earns an article
28
- // later if it recurs.
29
- //
30
- // The deterministic pieces (resolve-to-one, trigram shortlist, fan-out, the
31
- // CREATE gate arithmetic) are pure and unit-tested; only disambiguate() and
32
- // engagesAsSubject() touch the GPU.
33
-
34
- import type { MemoryStore } from "./db";
35
- import { callLocal, MAX_OUTPUT_TOKENS } from "./model";
36
- import { parseBinary } from "./parse";
37
- import { EntityResolver, type MatchKind } from "./resolve";
38
-
39
- /** Reserved bucket for subjects captured (not yet articled) — still retrievable
40
- * by search, NOT a trivia graveyard. The leading underscore keeps it out of the
41
- * emergent bucket namespace. */
42
- export const CAPTURED_BUCKET = "_captured";
43
-
44
- /** A subject RECURS (and so is notable enough for its own article) once it has
45
- * routed this many distinct chunks. Tunable (Bucketing.md: lower = more/smaller
46
- * articles, raise = fewer/larger); ≥2 == "recurs in your thinking." */
47
- export const RECURRENCE_THRESHOLD = 2;
48
-
49
- // ---- trigram shortlist -----------------------------------------------------
50
-
51
- /** Character trigrams of a casefolded, space-collapsed surface (padded so short
52
- * names still yield boundary grams). */
53
- function trigrams(surface: string): Set<string> {
54
- const s = ` ${surface.toLowerCase().replace(/[^a-z0-9]+/g, " ").replace(/\s+/g, " ").trim()} `;
55
- const out = new Set<string>();
56
- for (let i = 0; i + 3 <= s.length; i++) out.add(s.slice(i, i + 3));
57
- return out;
58
- }
59
-
60
- /** Overlap coefficient |A∩B| / min(|A|,|B|) — credits a short name CONTAINED in
61
- * a longer one rather than penalizing the length gap a Jaccard would. */
62
- function overlap(a: Set<string>, b: Set<string>): number {
63
- const m = Math.min(a.size, b.size);
64
- if (m === 0) return 0;
65
- const [small, big] = a.size <= b.size ? [a, b] : [b, a];
66
- let inter = 0;
67
- for (const x of small) if (big.has(x)) inter++;
68
- return inter / m;
69
- }
70
-
71
- /**
72
- * Trigram-ranked shortlist of existing canonicals for a surface that the
73
- * resolver missed — the candidate set handed to the model for disambiguation.
74
- * Returns up to `k` canonicals with nonzero overlap, best first.
75
- */
76
- export function trigramShortlist(
77
- resolver: EntityResolver,
78
- surface: string,
79
- k = 5,
80
- ): string[] {
81
- const q = trigrams(surface);
82
- const scored: { name: string; score: number }[] = [];
83
- for (const name of resolver.canonicals()) {
84
- const s = overlap(q, trigrams(name));
85
- if (s > 0) scored.push({ name, score: s });
86
- }
87
- scored.sort((a, b) => b.score - a.score || a.name.localeCompare(b.name));
88
- return scored.slice(0, k).map((c) => c.name);
89
- }
90
-
91
- // ---- model gates -----------------------------------------------------------
92
-
93
- /**
94
- * Bounded binary disambiguation: is `surface` (in the chunk's `label` context)
95
- * the same thing as the candidate `entity` (one-line `lead`)? One short call,
96
- * parsed by parseBinary.
97
- */
98
- export async function disambiguate(
99
- surface: string,
100
- label: string | null,
101
- entity: string,
102
- lead: string,
103
- ): Promise<boolean> {
104
- const prompt =
105
- `Is "${surface}" (context: ${label ?? "—"}) the same thing as ` +
106
- `"${entity}" — ${lead}? Answer yes or no.`;
107
- return parseBinary(await callLocal("route", { user: prompt }, { maxTokens: MAX_OUTPUT_TOKENS }));
108
- }
109
-
110
- /**
111
- * Bounded subject-engagement gate: does this chunk engage with `entity` as a
112
- * genuine SUBJECT — a topic/idea/person/project/thing the user is actually
113
- * thinking about and discussing — rather than mentioning it only in passing?
114
- * Feeds the CREATE gate's single-chunk stub path (NOT an ownership test).
115
- */
116
- export async function engagesAsSubject(
117
- entity: string,
118
- chunkText: string,
119
- ): Promise<boolean> {
120
- const prompt =
121
- `${chunkText}\n\n---\n` +
122
- `Based on the note above, does it engage with "${entity}" as a genuine ` +
123
- `SUBJECT — a topic, idea, person, project, or thing the user is actually ` +
124
- `thinking about and discussing — rather than mentioning it only in passing? ` +
125
- `Answer yes or no.`;
126
- return parseBinary(await callLocal("route", { user: prompt }, { maxTokens: MAX_OUTPUT_TOKENS }));
127
- }
128
-
129
- // ---- CREATE gate (pure) ----------------------------------------------------
130
-
131
- export interface CreateStats {
132
- /** Distinct chunks that routed to this candidate entity. */
133
- routedChunks: number;
134
- /** At least one routed chunk engages this entity as a genuine subject. */
135
- subjectEngagement: boolean;
136
- }
137
-
138
- /**
139
- * CREATE gate (Bucketing.md / Editorial_Guidelines.md): a subject earns its own
140
- * article when it RECURS (≥ RECURRENCE_THRESHOLD routed chunks — "recurs in your
141
- * thinking is notable enough") OR a chunk engages it as a genuine subject (stubs
142
- * are encouraged for emerging topics). Otherwise it is CAPTURED — kept in its
143
- * chunk, retrievable by search, never dropped. Pure — the model fills
144
- * `subjectEngagement` upstream. NO ownership/usefulness test.
145
- */
146
- export function createGate(stats: CreateStats): "create" | "capture" {
147
- if (stats.routedChunks >= RECURRENCE_THRESHOLD) return "create";
148
- if (stats.subjectEngagement) return "create";
149
- return "capture";
150
- }
151
-
152
- // ---- fan-out accumulation --------------------------------------------------
153
-
154
- export type RouteAction = "routed" | "create" | "capture";
155
-
156
- export interface SurfaceRoute {
157
- surface: string;
158
- /** Resolved/candidate canonical, or null when no entity could be assigned. */
159
- entity: string | null;
160
- matched: MatchKind | "disambig" | "none";
161
- }
162
-
163
- /**
164
- * Accumulates the chunk→entity fan-out across a run so the CREATE gate can see
165
- * each candidate's full chunk count + subject-engagement signal before deciding
166
- * create-vs-capture. Deterministic and model-free: callers route surfaces (via
167
- * the resolver + optional model disambig) and `enqueue` the resolved canonicals.
168
- */
169
- export class RouteAccumulator {
170
- /** canonical → set of chunk ids routed to it (fan-in). */
171
- private chunks = new Map<string, Set<string>>();
172
- /** canonical → at least one chunk engages it as a genuine subject. */
173
- private engaged = new Map<string, boolean>();
174
- /** canonicals that already exist as known entities (resolver hits) vs minted. */
175
- private known = new Set<string>();
176
-
177
- constructor(knownCanonicals: Iterable<string> = []) {
178
- for (const c of knownCanonicals) this.known.add(c);
179
- }
180
-
181
- /** Record that `chunkId` routes to `entity` (idempotent per chunk). */
182
- enqueue(entity: string, chunkId: string, opts?: { subjectEngagement?: boolean }): void {
183
- let set = this.chunks.get(entity);
184
- if (!set) this.chunks.set(entity, (set = new Set()));
185
- set.add(chunkId);
186
- if (opts?.subjectEngagement) this.engaged.set(entity, true);
187
- else if (!this.engaged.has(entity)) this.engaged.set(entity, false);
188
- }
189
-
190
- /** Stats for an entity (for the CREATE gate). */
191
- stats(entity: string): CreateStats {
192
- return {
193
- routedChunks: this.chunks.get(entity)?.size ?? 0,
194
- subjectEngagement: this.engaged.get(entity) ?? false,
195
- };
196
- }
197
-
198
- /**
199
- * Final decision per accumulated entity. Existing known entities are always
200
- * `routed` (they already have a home — existing wins); minted candidates run
201
- * the CREATE gate (create vs capture). Returns a stable, name-sorted report.
202
- */
203
- decisions(): { entity: string; action: RouteAction; stats: CreateStats }[] {
204
- const out: { entity: string; action: RouteAction; stats: CreateStats }[] = [];
205
- for (const entity of [...this.chunks.keys()].sort((a, b) => a.localeCompare(b))) {
206
- const stats = this.stats(entity);
207
- const action: RouteAction = this.known.has(entity) ? "routed" : createGate(stats);
208
- out.push({ entity, action, stats });
209
- }
210
- return out;
211
- }
212
- }
213
-
214
- // ---- chunk routing (deterministic resolve; model only on misses) -----------
215
-
216
- export interface RouteChunkOpts {
217
- /** Shortlist width for the model disambiguation fallback. */
218
- shortlistK?: number;
219
- /** One-line lead per canonical, for the disambiguation prompt. */
220
- leads?: Map<string, string>;
221
- /** Disable the model fallback (deterministic-only routing) — misses become
222
- * `none`. Used by the pure tests + dry runs. */
223
- noModel?: boolean;
224
- }
225
-
226
- /**
227
- * Route ONE chunk's surfaces to canonicals, fanning out to every entity it
228
- * touches. Resolver hits route deterministically; misses get a trigram shortlist
229
- * disambiguated by the model (unless `noModel`). Returns one {@link SurfaceRoute}
230
- * per surface (entity null when nothing matched — a CREATE candidate upstream).
231
- */
232
- export async function routeChunkSurfaces(
233
- resolver: EntityResolver,
234
- surfaces: { surface: string }[],
235
- label: string | null,
236
- opts: RouteChunkOpts = {},
237
- ): Promise<SurfaceRoute[]> {
238
- const out: SurfaceRoute[] = [];
239
- for (const { surface } of surfaces) {
240
- const hit = resolver.match(surface);
241
- if (hit) {
242
- out.push({ surface, entity: hit.name, matched: hit.matched });
243
- continue;
244
- }
245
- if (opts.noModel) {
246
- out.push({ surface, entity: null, matched: "none" });
247
- continue;
248
- }
249
- let routed: string | null = null;
250
- for (const cand of trigramShortlist(resolver, surface, opts.shortlistK ?? 5)) {
251
- const lead = opts.leads?.get(cand) ?? cand;
252
- if (await disambiguate(surface, label, cand, lead)) {
253
- routed = cand;
254
- break;
255
- }
256
- }
257
- out.push({ surface, entity: routed, matched: routed ? "disambig" : "none" });
258
- }
259
- return out;
260
- }
261
-
262
- /**
263
- * Read a chunk's persisted entity surfaces (chunk_entities.surface_form). The
264
- * routing input when extraction has already run; surfaces preserve their raw
265
- * form so the resolver/model see what the user actually typed.
266
- */
267
- export function chunkSurfaces(store: MemoryStore, chunkId: string): { surface: string }[] {
268
- const rows = store.db
269
- .query("SELECT surface_form FROM chunk_entities WHERE chunk_id = ? ORDER BY surface_form")
270
- .all(chunkId) as { surface_form: string }[];
271
- return rows.map((r) => ({ surface: r.surface_form }));
272
- }
@@ -1,165 +0,0 @@
1
- // mlx-bun memory — nightly scheduling via launchd. ✅ REAL — install/remove/
2
- // status here are fully functional, and the job they run (`mlx-bun memory
3
- // synthesize`) now drives the real synthesis DAG (create + editorial wikify
4
- // sweep), not a stub.
5
- //
6
- // mlx-bun is macOS/Apple-silicon-only by identity, so launchd is the native
7
- // choice over crontab: it survives reboot, runs jobs missed while asleep on
8
- // next wake, and gives clean install/uninstall. `memory schedule` writes
9
- // ~/Library/LaunchAgents/com.mlx-bun.memory.plist (a StartCalendarInterval that
10
- // runs `mlx-bun memory synthesize`) and loads it; `unschedule` unloads + removes
11
- // it. That job runs the full synthesis DAG and produces/updates articles on the
12
- // schedule with no further configuration.
13
- //
14
- // See docs/design/dreaming-nightly-pipeline.md → "Scheduling (launchd)".
15
-
16
- import { spawn } from "node:child_process";
17
- import { mkdir, rm, writeFile } from "node:fs/promises";
18
- import { existsSync } from "node:fs";
19
- import { homedir } from "node:os";
20
- import { join } from "node:path";
21
-
22
- export const LAUNCHD_LABEL = "com.mlx-bun.memory";
23
-
24
- export function plistPath(): string {
25
- return join(homedir(), "Library", "LaunchAgents", `${LAUNCHD_LABEL}.plist`);
26
- }
27
-
28
- function logsDir(): string {
29
- return join(homedir(), ".mlx-bun", "logs");
30
- }
31
-
32
- /**
33
- * Resolve how to invoke mlx-bun from launchd's minimal environment. Prefer the
34
- * installed binary on PATH; fall back to the current dev invocation
35
- * (`<bun> <cli.ts>`). Wrapped in a login shell at call time so PATH/bun resolve.
36
- */
37
- function mlxBunCommand(): string {
38
- const onPath = Bun.which("mlx-bun");
39
- if (onPath) return shQuote(onPath);
40
- // Dev: process.execPath is bun, argv[1] is .../src/cli.ts.
41
- return `${shQuote(process.execPath)} ${shQuote(process.argv[1] ?? "")}`.trim();
42
- }
43
-
44
- function shQuote(s: string): string {
45
- return `'${s.replace(/'/g, "'\\''")}'`;
46
- }
47
-
48
- function xmlEscape(s: string): string {
49
- return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
50
- }
51
-
52
- export interface ScheduleOptions {
53
- /** Local wall-clock time, "HH:MM" 24h. Default 03:00. */
54
- at?: string;
55
- }
56
-
57
- /** Parse "HH:MM" → {hour, minute}; defaults to 03:00 on bad/empty input. */
58
- export function parseAt(at?: string): { hour: number; minute: number } {
59
- const m = /^(\d{1,2}):(\d{2})$/.exec((at ?? "").trim());
60
- if (!m) return { hour: 3, minute: 0 };
61
- const hour = Math.min(23, Math.max(0, Number(m[1])));
62
- const minute = Math.min(59, Math.max(0, Number(m[2])));
63
- return { hour, minute };
64
- }
65
-
66
- /** Pure: build the launchd plist XML for the nightly synthesis job. */
67
- export function buildPlist(opts: ScheduleOptions = {}): string {
68
- const { hour, minute } = parseAt(opts.at);
69
- // Login shell so the user's PATH (bun, mlx-bun) resolves under launchd.
70
- const cmd = `exec ${mlxBunCommand()} memory synthesize`;
71
- const out = join(logsDir(), "memory-synthesis.out.log");
72
- const err = join(logsDir(), "memory-synthesis.err.log");
73
- return `<?xml version="1.0" encoding="UTF-8"?>
74
- <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
75
- <plist version="1.0">
76
- <dict>
77
- <key>Label</key>
78
- <string>${LAUNCHD_LABEL}</string>
79
-
80
- <key>ProgramArguments</key>
81
- <array>
82
- <string>/bin/zsh</string>
83
- <string>-lc</string>
84
- <string>${xmlEscape(cmd)}</string>
85
- </array>
86
-
87
- <!-- Local wall-clock; if asleep at the time, launchd runs on next wake. -->
88
- <key>StartCalendarInterval</key>
89
- <dict>
90
- <key>Hour</key>
91
- <integer>${hour}</integer>
92
- <key>Minute</key>
93
- <integer>${minute}</integer>
94
- </dict>
95
-
96
- <key>RunAtLoad</key>
97
- <false/>
98
-
99
- <key>StandardOutPath</key>
100
- <string>${xmlEscape(out)}</string>
101
- <key>StandardErrorPath</key>
102
- <string>${xmlEscape(err)}</string>
103
-
104
- <key>ProcessType</key>
105
- <string>Background</string>
106
- </dict>
107
- </plist>
108
- `;
109
- }
110
-
111
- function launchctl(args: string[]): Promise<boolean> {
112
- return new Promise((resolve) => {
113
- const proc = spawn("launchctl", args, { stdio: "ignore" });
114
- proc.on("exit", (code) => resolve(code === 0));
115
- proc.on("error", () => resolve(false));
116
- });
117
- }
118
-
119
- export interface InstallResult {
120
- plistPath: string;
121
- at: { hour: number; minute: number };
122
- loaded: boolean;
123
- }
124
-
125
- /** Write the plist and (re)load it into launchd. */
126
- export async function installSchedule(opts: ScheduleOptions = {}): Promise<InstallResult> {
127
- const path = plistPath();
128
- await mkdir(join(homedir(), "Library", "LaunchAgents"), { recursive: true });
129
- await mkdir(logsDir(), { recursive: true });
130
- await writeFile(path, buildPlist(opts));
131
- // Reload: unload first (ignore failure if not loaded), then load -w.
132
- await launchctl(["unload", path]);
133
- const loaded = await launchctl(["load", "-w", path]);
134
- return { plistPath: path, at: parseAt(opts.at), loaded };
135
- }
136
-
137
- /** Unload and remove the launchd agent. Returns true if a plist was removed. */
138
- export async function removeSchedule(): Promise<boolean> {
139
- const path = plistPath();
140
- if (!existsSync(path)) return false;
141
- await launchctl(["unload", "-w", path]);
142
- await rm(path, { force: true });
143
- return true;
144
- }
145
-
146
- export interface ScheduleStatus {
147
- installed: boolean;
148
- plistPath: string;
149
- /** Whether launchctl currently lists the agent (best-effort). */
150
- loaded: boolean;
151
- }
152
-
153
- export async function scheduleStatus(): Promise<ScheduleStatus> {
154
- const path = plistPath();
155
- const installed = existsSync(path);
156
- let loaded = false;
157
- if (installed) {
158
- loaded = await new Promise<boolean>((resolve) => {
159
- const proc = spawn("launchctl", ["list", LAUNCHD_LABEL], { stdio: "ignore" });
160
- proc.on("exit", (code) => resolve(code === 0));
161
- proc.on("error", () => resolve(false));
162
- });
163
- }
164
- return { installed, plistPath: path, loaded };
165
- }