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
@@ -0,0 +1,6 @@
1
+ import type { ShellPanel } from "@mlx-bun/web-shell";
2
+
3
+ /** The panels of the modules this host installs, for the shell to mount. The browser build replaces this file's
4
+ * source (`web/build.ts`): it imports the panel entry (which defines the custom element) and manifest of every
5
+ * module the host's package.json lists that exports a panel. Loaded any other way it lists none. */
6
+ export const panels: readonly ShellPanel[] = [];
@@ -0,0 +1,55 @@
1
+ // Browser entry, built by scripts/build-web.ts into apps/mlx-bun/dist/web/app.js, which apps/mlx-bun/src/web/assets.ts
2
+ // serves at GET /assets/app.js and app.html loads via <script defer src="/assets/app.js">.
3
+ //
4
+ // It composes the web shell (`@mlx-bun/web-shell`: navigation, routing, theme, palette chrome, panel mounting), the
5
+ // panels of the installed modules (installed-panels.ts, generated from the host's module list at build time: the chat
6
+ // is one, the workspace the shell opens on) and the legacy pages that have not moved into modules yet (quantize,
7
+ // fine-tune, dataset, status and memory overlays), mounted as they always were. The order below is load-bearing: controllers must be populated before
8
+ // the first navigation can dispatch to them, and the tab row's fades are computed once at start so a row that already
9
+ // overflows on load gets its mask immediately.
10
+
11
+ import {
12
+ appKeys, mountPanels, initDrawer, initHfSettings, initModelLink, initRoutesProbe, pollIdentity, registerOverlays, shell,
13
+ } from "./shell";
14
+ import { registerMemoryOverlay } from "./memory-panel";
15
+ import { chatHost } from "./chat-host";
16
+ import { createStatusController } from "./status";
17
+ import { createAppPalette } from "./palette";
18
+ import { panels } from "./installed-panels";
19
+
20
+ // Hugging Face nav gear + push-to-hub modal.
21
+ initHfSettings();
22
+
23
+ // One tab and one page per installed module panel, before the shell starts so the Developer switch sees the tabs. The
24
+ // chat panel is handed its host side (chat-host.ts): memory's chips and sidebar entry, the agent-tools settings.
25
+ mountPanels(panels.map(panel => panel.tag === "mlx-chat-panel" ? { ...panel, properties: { host: chatHost } } : panel));
26
+
27
+ registerMemoryOverlay();
28
+
29
+ // The mobile drawer delegates to chat; the model label opens the Models panel.
30
+ initDrawer();
31
+ initModelLink();
32
+
33
+ // Command palette and the Escape overlay sweep, in priority order.
34
+ const palette = createAppPalette();
35
+ registerOverlays(palette);
36
+
37
+ // Theme, PWA service worker, shortcut sheet, global keys (Cmd/Ctrl+K, Cmd/Ctrl+/, the chat's bindings, Escape),
38
+ // hash routing and the Developer switch.
39
+ shell.start({ palette, keys: appKeys });
40
+
41
+ // Page controllers, in the original declaration order. Each init() is lazy (run on first visit to that route); only
42
+ // the factory call happens here. The chat is not one: its panel initializes itself when the shell first shows it.
43
+ shell.controllers.status = createStatusController();
44
+
45
+ /* ════════════════════════════════════════════════════════════════════
46
+ BOOT
47
+ ════════════════════════════════════════════════════════════════════ */
48
+ if (!location.hash) location.replace("#/chat");
49
+ shell.navigate();
50
+ pollIdentity();
51
+ setInterval(pollIdentity, 4000);
52
+
53
+ // Routes tab feature-detection: probe /dag once; hides the tab (and bounces off #/routes if already there) on 404.
54
+ // Runs after the first navigation so a direct deep link to #/routes has already rendered its section.
55
+ initRoutesProbe();
@@ -0,0 +1,279 @@
1
+ // Built into apps/mlx-bun/dist/web/app.js by scripts/build-web.ts.
2
+ //
3
+ // What the app's own pages need from the hand-rolled markdown renderer: `esc`, the memory panel's article rendering
4
+ // (mdToHtml with its Canvas toggle) and the wizards' step indicator. The chat panel (`@mlx-bun/module-chat`) carries
5
+ // its own full renderer (streaming, citations, highlighting), as a self-contained panel does; the memory panel
6
+ // carries this one until memory becomes a module.
7
+
8
+ /** Escape the four HTML-significant characters. Used on every interpolation
9
+ * site across the app — the single discipline that keeps user/model text
10
+ * from ever being interpreted as markup. */
11
+ export const esc = (s: unknown): string =>
12
+ String(s ?? "").replace(/[&<>"]/g, (c) => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;" } as Record<string, string>)[c]!);
13
+
14
+ /** Allow only safe link targets (http/https/mailto/anchor/relative). */
15
+ export function mdSafeUrl(u: unknown): string | null {
16
+ const s = String(u).trim();
17
+ return /^(https?:\/\/|mailto:|#|\/|\.{1,2}\/)/i.test(s) ? s : null;
18
+ }
19
+
20
+ /** Inline markdown -> HTML. Escapes first, then shields code spans from
21
+ * further markup so backticked text is never mangled or unsafe. */
22
+ export function mdInline(t: unknown): string {
23
+ const codes: string[] = [];
24
+ // Pull code spans out first (any run of backticks), then escape the rest.
25
+ let src = String(t).replace(/(`+)([\s\S]+?)\1/g, (_m, _ticks, c: string) => {
26
+ codes.push(c.replace(/^ | $/g, ""));
27
+ return "\0C" + (codes.length - 1) + "\0";
28
+ });
29
+ let s = esc(src);
30
+ // [text](url "title") — title optional and ignored.
31
+ s = s.replace(/\[([^\]]+)\]\(\s*([^)\s]+)(?:\s+&quot;[^)]*&quot;)?\s*\)/g, (m, text: string, url: string) => {
32
+ const safe = mdSafeUrl(url);
33
+ return safe ? '<a href="' + safe + '" target="_blank" rel="noopener noreferrer">' + text + "</a>" : m;
34
+ });
35
+ s = s
36
+ .replace(/\*\*\*([^*]+)\*\*\*/g, "<strong><em>$1</em></strong>")
37
+ .replace(/\*\*([^*]+?)\*\*/g, "<strong>$1</strong>")
38
+ .replace(/(^|[^_\w])__([^_]+?)__(?![\w])/g, "$1<strong>$2</strong>")
39
+ .replace(/(^|[^*\w])\*([^*\s][^*]*?)\*/g, "$1<em>$2</em>")
40
+ .replace(/(^|[^_\w])_([^_\s][^_]*?)_(?![\w])/g, "$1<em>$2</em>")
41
+ .replace(/~~([^~]+?)~~/g, "<del>$1</del>");
42
+ // Autolink bare URLs that markdown didn't already wrap.
43
+ s = s.replace(/(^|[\s(])(https?:\/\/[^\s<)]+[^\s<).,;:!?'"])/g,
44
+ (_m, pre: string, url: string) => pre + '<a href="' + url + '" target="_blank" rel="noopener noreferrer">' + url + "</a>");
45
+ return s.replace(/\0C(\d+)\0/g, (_m, i: string) => "<code>" + esc(codes[+i]) + "</code>");
46
+ }
47
+
48
+ /** Pure: does this fence's language tag qualify for the Canvas v1
49
+ * Preview|Source toggle? Only html/svg — js/ts/etc. fences never get a
50
+ * toggle (running arbitrary script output isn't the feature; rendering a
51
+ * markup/vector document is). Exported so apps/mlx-bun/tests/web/browser.test.ts can check
52
+ * the detection logic directly without a DOM. */
53
+ export function isCanvasFence(lang: string): boolean {
54
+ return /^(html?|svg)$/i.test(lang.trim());
55
+ }
56
+
57
+ export function mdCodeBlock(lang: string, code: string): string {
58
+ // language-<lang> on <code> is the de-facto convention hljs's own
59
+ // language-detection-from-class reads (see highlightIn() below); an empty
60
+ // fence info string just omits the class and highlightIn() skips it.
61
+ const langClass = lang ? ' class="language-' + esc(lang) + '"' : "";
62
+ const canvas = isCanvasFence(lang);
63
+ // Canvas v1 (`02d723a:docs/design/web-chat-redesign.md` Appendix A,
64
+ // beat-matrix Axis 2): a Preview|Source toggle
65
+ // next to Copy for completed html/svg fences. The toggle markup is always
66
+ // emitted for a qualifying fence (even while the block is still streaming
67
+ // — mdCodeBlock only ever runs on a CLOSED fence per mdToHtml/splitBlocks,
68
+ // so "qualifying" already implies "complete"); the iframe itself is never
69
+ // created here — see wireCanvasToggle's lazy srcdoc creation below, so an
70
+ // unopened Preview never executes model-generated script.
71
+ const toggleHtml = canvas
72
+ ? '<span class="cbtoggle" role="group" aria-label="View">' +
73
+ '<button class="cbview cbview-source active" type="button" aria-pressed="true">Source</button>' +
74
+ '<button class="cbview cbview-preview" type="button" aria-pressed="false">Preview</button>' +
75
+ "</span>"
76
+ : "";
77
+ // The raw fence text (pre-escape) is stashed verbatim in a hidden <div>
78
+ // sibling so wireCanvasToggle can read it back via .textContent (the
79
+ // browser does entity-decoding for .textContent on ordinary elements, so
80
+ // no manual unescape needed) without re-parsing the highlighted/escaped
81
+ // <code> body. NOT a <script> tag: script/style are HTML "raw text"
82
+ // elements whose content the parser does NOT entity-decode (textContent
83
+ // would come back as the literal "&lt;h1&gt;" instead of "<h1>") — a plain
84
+ // element sidesteps that without needing any special-case unescaping, and
85
+ // `hidden` (not display:none, matching convention elsewhere in this file)
86
+ // keeps it out of layout and never executed either way.
87
+ const srcStash = canvas ? '<div class="cbsrc" hidden>' + esc(code) + "</div>" : "";
88
+ return '<div class="codeblock' + (canvas ? " has-canvas" : "") + '"><div class="cbhead"><span class="cblang">' + esc(lang || "") +
89
+ "</span>" + toggleHtml + '<button class="cbcopy" type="button">Copy</button></div>' +
90
+ "<pre><code" + langClass + ">" + esc(code) + "</code></pre>" + srcStash +
91
+ (canvas ? '<div class="cbcanvas" hidden></div>' : "") + "</div>";
92
+ }
93
+
94
+ /* ────────────────────────────────────────────────────────────────────
95
+ CANVAS V1 (`02d723a:docs/design/web-chat-redesign.md` Appendix A,
96
+ beat-matrix Axis 2 — "I miss optiq's Canvas"
97
+ is a disallowed outcome): completed html/svg fenced code blocks get a
98
+ Preview|Source toggle in the existing .cbhead bar. Preview renders the
99
+ fence content in a sandboxed <iframe>.
100
+
101
+ SECURITY: the iframe sandbox is `allow-scripts` ONLY — never
102
+ `allow-same-origin` together with `allow-scripts`. Combining them would
103
+ let a model-generated <script> read this iframe's effective origin,
104
+ which the browser resolves to the PARENT document's origin for a
105
+ srcdoc/about:blank frame with allow-same-origin — i.e. the sandboxed
106
+ content could reach window.parent's DOM, localStorage, and the live
107
+ WebSocket. allow-scripts alone keeps the frame in a unique opaque
108
+ origin: scripts run, but same-origin-gated APIs (parent access,
109
+ storage, cookies) are denied by the browser regardless of what the
110
+ content tries. This is the one non-negotiable line in this feature.
111
+
112
+ Lazy: the iframe element is only created on the first "Preview" click
113
+ (never auto-run) — a model that emits an html fence should not get a
114
+ free script execution just because a message rendered.
115
+ ──────────────────────────────────────────────────────────────────── */
116
+
117
+ /** Wire the Preview/Source toggle + Copy button for every codeblock inside
118
+ * `container` via ONE delegated click listener — safe to call once on a
119
+ * stable ancestor (chat's `thread()` element, the memory panel's
120
+ * `mem-body`) whose innerHTML gets replaced/extended repeatedly; delegation
121
+ * means newly rendered codeblocks are wired for free, no per-render
122
+ * re-attachment needed. Copy-button wiring already lives inline in
123
+ * chat.ts's own delegated listener — this function only owns the Canvas
124
+ * toggle so it can be shared between chat.ts and memory-panel.ts without
125
+ * duplicating the Copy logic in two places. */
126
+ export function wireCanvasToggle(container: HTMLElement): void {
127
+ container.addEventListener("click", (e) => {
128
+ const btn = (e.target as HTMLElement).closest?.(".cbview") as HTMLElement | null;
129
+ if (!btn || !container.contains(btn)) return;
130
+ const block = btn.closest(".codeblock");
131
+ if (!block) return;
132
+ const showPreview = btn.classList.contains("cbview-preview");
133
+ setCanvasView(block as HTMLElement, showPreview ? "preview" : "source");
134
+ });
135
+ }
136
+
137
+ function setCanvasView(block: HTMLElement, view: "preview" | "source"): void {
138
+ const sourceBtn = block.querySelector(".cbview-source");
139
+ const previewBtn = block.querySelector(".cbview-preview");
140
+ const pre = block.querySelector("pre");
141
+ const canvasEl = block.querySelector(".cbcanvas") as HTMLElement | null;
142
+ if (!sourceBtn || !previewBtn || !pre || !canvasEl) return;
143
+ sourceBtn.classList.toggle("active", view === "source");
144
+ sourceBtn.setAttribute("aria-pressed", String(view === "source"));
145
+ previewBtn.classList.toggle("active", view === "preview");
146
+ previewBtn.setAttribute("aria-pressed", String(view === "preview"));
147
+ if (view === "source") {
148
+ canvasEl.hidden = true;
149
+ (pre as HTMLElement).hidden = false;
150
+ return;
151
+ }
152
+ (pre as HTMLElement).hidden = true;
153
+ canvasEl.hidden = false;
154
+ // Lazy iframe creation: only build it the first time Preview is opened,
155
+ // never on render. srcdoc (not src=data:) keeps everything same-tab, no
156
+ // network hop, and no history entry.
157
+ if (!canvasEl.querySelector("iframe")) {
158
+ const srcEl = block.querySelector(".cbsrc");
159
+ const code = srcEl ? srcEl.textContent || "" : "";
160
+ const frame = document.createElement("iframe");
161
+ frame.className = "cbframe";
162
+ // allow-scripts ONLY — see the file-level comment above this section.
163
+ frame.setAttribute("sandbox", "allow-scripts");
164
+ frame.setAttribute("loading", "lazy");
165
+ frame.title = "Canvas preview";
166
+ // A neutral light background regardless of app theme: model-authored
167
+ // HTML/SVG rarely sets its own background, and an unstyled fragment on
168
+ // a dark app background reads as broken; a plain white canvas is the
169
+ // one assumption that's safe for both arbitrary markup and dark/light
170
+ // app themes alike (this iframe is content the model wrote, not app
171
+ // chrome, so it doesn't need to follow the app's theme toggle).
172
+ frame.srcdoc = code;
173
+ canvasEl.appendChild(frame);
174
+ }
175
+ }
176
+
177
+ function mdTableSep(s: string): boolean { return /^[\s|:-]+$/.test(s) && /-/.test(s) && /\|/.test(s); }
178
+ function mdSplitRow(s: string): string[] { return s.trim().replace(/^\|/, "").replace(/\|$/, "").split("|").map((c) => c.trim()); }
179
+ function mdBlockStart(s: string): boolean {
180
+ return /^\s*(`{3,}|~{3,})/.test(s) || /^(#{1,6})\s/.test(s) || /^\s*>/.test(s) ||
181
+ /^\s*[-*+]\s+/.test(s) || /^\s*\d+[.)]\s+/.test(s) || /^\s*([-*_])\s*(\1\s*){2,}$/.test(s);
182
+ }
183
+
184
+ /** Safe markdown renderer: code fences (w/ copy), headings, lists, task
185
+ * lists, tables, blockquotes, rules, links, emphasis, inline code. */
186
+ export function mdToHtml(src: unknown): string {
187
+ const lines = String(src).replace(/\r\n?/g, "\n").split("\n");
188
+ let html = "", i = 0, list: string | null = null;
189
+ const closeList = () => { if (list) { html += "</" + list + ">"; list = null; } };
190
+
191
+ while (i < lines.length) {
192
+ const ln = lines[i]!;
193
+
194
+ // fenced code block
195
+ const fence = ln.match(/^\s*(`{3,}|~{3,})\s*([\w+#.-]*)/);
196
+ if (fence) {
197
+ closeList();
198
+ const tick = fence[1]![0], lang = fence[2] || "", buf: string[] = [];
199
+ const closeRe = new RegExp("^\\s*" + (tick === "`" ? "`{3,}" : "~{3,}") + "\\s*$");
200
+ i++;
201
+ while (i < lines.length && !closeRe.test(lines[i]!)) { buf.push(lines[i]!); i++; }
202
+ i++; // consume closing fence (or run off the end mid-stream)
203
+ html += mdCodeBlock(lang, buf.join("\n"));
204
+ continue;
205
+ }
206
+
207
+ // GFM table: a row with pipes followed by a separator row
208
+ if (ln.includes("|") && i + 1 < lines.length && mdTableSep(lines[i + 1]!)) {
209
+ closeList();
210
+ const header = mdSplitRow(ln);
211
+ const aligns = mdSplitRow(lines[i + 1]!).map((c) => {
212
+ const l = c.startsWith(":"), r = c.endsWith(":");
213
+ return l && r ? "center" : r ? "right" : l ? "left" : "";
214
+ });
215
+ i += 2;
216
+ const rows: string[][] = [];
217
+ while (i < lines.length && lines[i]!.includes("|") && lines[i]!.trim() !== "") { rows.push(mdSplitRow(lines[i]!)); i++; }
218
+ const al = (k: number) => (aligns[k] ? ' style="text-align:' + aligns[k] + '"' : "");
219
+ let tbl = '<div class="md-tablewrap"><table class="md-table"><thead><tr>';
220
+ header.forEach((c, k) => { tbl += "<th" + al(k) + ">" + mdInline(c) + "</th>"; });
221
+ tbl += "</tr></thead><tbody>";
222
+ rows.forEach((r) => {
223
+ tbl += "<tr>";
224
+ for (let k = 0; k < header.length; k++) tbl += "<td" + al(k) + ">" + mdInline(r[k] || "") + "</td>";
225
+ tbl += "</tr>";
226
+ });
227
+ html += tbl + "</tbody></table></div>";
228
+ continue;
229
+ }
230
+
231
+ // heading
232
+ const h = ln.match(/^(#{1,6})\s+(.*)$/);
233
+ if (h) { closeList(); const n = h[1]!.length; html += "<h" + n + ">" + mdInline(h[2]!.replace(/\s+#+\s*$/, "")) + "</h" + n + ">"; i++; continue; }
234
+
235
+ // horizontal rule
236
+ if (/^\s*([-*_])\s*(\1\s*){2,}$/.test(ln)) { closeList(); html += "<hr>"; i++; continue; }
237
+
238
+ // blockquote (consecutive '>' lines, rendered recursively)
239
+ if (/^\s*>/.test(ln)) {
240
+ closeList();
241
+ const buf: string[] = [];
242
+ while (i < lines.length && /^\s*>/.test(lines[i]!)) { buf.push(lines[i]!.replace(/^\s*>\s?/, "")); i++; }
243
+ html += "<blockquote>" + mdToHtml(buf.join("\n")) + "</blockquote>";
244
+ continue;
245
+ }
246
+
247
+ // task list / unordered / ordered list items
248
+ const task = ln.match(/^\s*[-*+]\s+\[([ xX])\]\s+(.*)$/);
249
+ const ul = ln.match(/^\s*[-*+]\s+(.*)$/);
250
+ const ol = ln.match(/^\s*\d+[.)]\s+(.*)$/);
251
+ if (task) {
252
+ if (list !== "ul") { closeList(); html += "<ul>"; list = "ul"; }
253
+ html += '<li class="task"><input type="checkbox" disabled' + (task[1]!.toLowerCase() === "x" ? " checked" : "") + "> " + mdInline(task[2]!) + "</li>";
254
+ i++; continue;
255
+ }
256
+ if (ul) { if (list !== "ul") { closeList(); html += "<ul>"; list = "ul"; } html += "<li>" + mdInline(ul[1]!) + "</li>"; i++; continue; }
257
+ if (ol) { if (list !== "ol") { closeList(); html += "<ol>"; list = "ol"; } html += "<li>" + mdInline(ol[1]!) + "</li>"; i++; continue; }
258
+
259
+ if (ln.trim() === "") { closeList(); i++; continue; }
260
+
261
+ // paragraph: merge following plain lines (soft breaks -> <br>)
262
+ closeList();
263
+ const para = [ln];
264
+ i++;
265
+ while (i < lines.length && lines[i]!.trim() !== "" && !mdBlockStart(lines[i]!)) { para.push(lines[i]!); i++; }
266
+ html += "<p>" + para.map(mdInline).join("<br>") + "</p>";
267
+ }
268
+ closeList();
269
+ return html;
270
+ }
271
+
272
+ /** Render a step indicator into a container. names[], current index. */
273
+ export function renderSteps(container: HTMLElement, names: string[], cur: number): void {
274
+ container.innerHTML = names.map((n, i) => {
275
+ const cls = i === cur ? "cur" : (i < cur ? "done" : "");
276
+ const arrow = i < names.length - 1 ? '<span class="arrow">&#8594;</span>' : "";
277
+ return '<span class="s ' + cls + '"><span class="n">' + (i + 1) + "</span>" + esc(n) + "</span>" + arrow;
278
+ }).join("");
279
+ }
@@ -0,0 +1,9 @@
1
+ // App host adapter for the installed memory panel. Its controller, markup and article renderer belong to the module.
2
+ import { setMemPanelClose } from "./shell";
3
+ type MemChipHandle = { wrap: HTMLElement; setResult(result: unknown): void };
4
+ type MemoryPanel = HTMLElement & { attachChat(): void; open(article?: string): Promise<void>; close(): void; isOpen(): boolean; toolCard(parent: HTMLElement, tool: string, args: unknown): MemChipHandle | null };
5
+ const panel = () => document.querySelector<MemoryPanel>("mlx-memory-panel");
6
+ export function registerMemoryOverlay(): void { setMemPanelClose(() => panel()?.close()); }
7
+ export function initMemoryPanel(): void { panel()?.attachChat(); registerMemoryOverlay(); }
8
+ export function openMemPanel(article?: string): Promise<void> { return panel()?.open(article) ?? Promise.resolve(); }
9
+ export function memoryToolChip(parent: HTMLElement, tool: string, args: unknown): MemChipHandle | null { return panel()?.toolCard(parent, tool, args) ?? null; }
@@ -0,0 +1,64 @@
1
+ // The app's command palette (Cmd/Ctrl+K): the shell's palette chrome (`@mlx-bun/web-shell`) over the app's
2
+ // searchable things. Commands call the chat panel's methods (new chat, thinking, export) and exported functions of the
3
+ // modules that own the behavior (openMemPanel, the shell's theme, developer and shortcut controls).
4
+ // "Chats" lists the sidebar's rows and "In messages" delegates to the same GET /api/sessions/search endpoint the
5
+ // sidebar's search uses (`@mlx-bun/module-chat`'s session search): one server-side implementation, two presentations.
6
+ import { actionSection, createPalette, cycleTheme, fuzzyMatch, type Palette, type PaletteAction, type PaletteRow, type PaletteSection } from "@mlx-bun/web-shell";
7
+ import { chatPanel, currentRoute, isDeveloperMode, setDeveloperMode, shell } from "./shell";
8
+ import { openMemPanel } from "./memory-panel";
9
+ import { api } from "./api";
10
+
11
+ /** The command list, independent of any live session data. Session rows and message-search hits are their own
12
+ * sections. Commands that only make sense on the chat page hide elsewhere (matching the Cmd/Ctrl+Shift+O/C guards). */
13
+ export function commands(): PaletteAction[] {
14
+ const onChat = () => currentRoute() === "chat";
15
+ return [
16
+ {
17
+ label: "New chat", hint: "⌘⇧O", when: onChat,
18
+ run() { chatPanel()?.newChat(); },
19
+ },
20
+ {
21
+ label: "Toggle thinking", when: onChat,
22
+ run() { chatPanel()?.toggleThinking(); },
23
+ },
24
+ { label: "Toggle theme", run() { cycleTheme(); } },
25
+ { label: "Toggle Developer mode", run() { setDeveloperMode(!isDeveloperMode()); } },
26
+ { label: "Open Memory panel", run() { openMemPanel(); } },
27
+ { label: "Browse models (Hub)", run() { location.hash = "#/models"; } },
28
+ { label: "Open shortcut sheet", run() { shell.shortcuts.toggle(); } },
29
+ {
30
+ label: "Export this chat", when: onChat,
31
+ async run() { await chatPanel()?.exportActiveChat("md"); },
32
+ },
33
+ // One entry per module panel the shell mounted.
34
+ ...shell.panelTargets().map(({ id, title }): PaletteAction => ({ label: `Open ${title}`, run() { location.hash = "#/" + id; } })),
35
+ ];
36
+ }
37
+
38
+ const sessions: PaletteSection = {
39
+ title: "Chats",
40
+ rows(query) {
41
+ if (!query) return [];
42
+ const out: PaletteRow[] = [];
43
+ for (const { title, path } of chatPanel()?.recentChats() ?? [])
44
+ if (fuzzyMatch(query, title)) out.push({ label: title, run() { chatPanel()?.openSession(path); } });
45
+ return out.slice(0, 6);
46
+ },
47
+ };
48
+
49
+ const messages: PaletteSection = {
50
+ title: "In messages",
51
+ rows: () => [],
52
+ async remote(query) {
53
+ const d = await api("/api/sessions/search?q=" + encodeURIComponent(query)).catch(() => ({ ok: false } as { ok: boolean }));
54
+ const body = d as { ok: boolean; results?: Array<{ sessionPath: string; sessionTitle: string; matches: Array<{ snippet: string }> }> };
55
+ if (!body.ok || !body.results) return [];
56
+ return body.results.slice(0, 6).map((r): PaletteRow => ({
57
+ label: r.sessionTitle, snippet: r.matches[0]?.snippet || "", run() { chatPanel()?.openSession(r.sessionPath); },
58
+ }));
59
+ },
60
+ };
61
+
62
+ export function createAppPalette(): Palette {
63
+ return createPalette({ sections: [actionSection("Commands", commands), sessions, messages] });
64
+ }
@@ -0,0 +1,13 @@
1
+ import type { JobEvent } from "../../jobs/protocol";
2
+ export type { JobEvent } from "../../jobs/protocol";
3
+
4
+ /** Generic envelope every /api/* JSON endpoint returns on success or
5
+ * failure (api() in api.ts unwraps {error:{message}} to a plain string —
6
+ * see the doc-comment there). Individual endpoints add their own fields
7
+ * on top via intersection at the call site; this is just the shared base. */
8
+ export interface ApiEnvelope {
9
+ ok?: boolean;
10
+ error?: string;
11
+ message?: string;
12
+ [key: string]: unknown;
13
+ }