mlx-bun 0.5.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1449 -109
- package/THIRD_PARTY_NOTICES.md +882 -0
- package/bin/mlx-bun.convert.mjs +4 -0
- package/bin/mlx-bun.fuse.mjs +4 -0
- package/bin/mlx-bun.generate.mjs +4 -0
- package/bin/mlx-bun.lora.mjs +4 -0
- package/bin/mlx-bun.mjs +13 -21
- package/bin/mlx-bun.server.mjs +4 -0
- package/bin/mlx-bun.upload.mjs +4 -0
- package/dist/web/app.js +9584 -0
- package/package.json +50 -53
- package/src/cli/ane-install.ts +76 -0
- package/src/cli/args.ts +179 -0
- package/src/cli/engine-entry.ts +68 -0
- package/src/cli/inference.ts +214 -0
- package/src/cli/job-entry.ts +97 -0
- package/src/cli/library-host.ts +117 -0
- package/src/cli/main.ts +57 -0
- package/src/cli/memory-engine.ts +163 -0
- package/src/cli/memory.ts +36 -0
- package/src/cli/mlx-lm-aliases.ts +309 -0
- package/src/cli/model-choice.ts +33 -0
- package/src/cli/model-selection.ts +84 -0
- package/src/cli/module-host.ts +11 -0
- package/src/cli/module-verbs.ts +50 -0
- package/src/cli/numerical-policy.ts +12 -0
- package/src/cli/perplexity.ts +89 -0
- package/src/cli/serve-host.ts +423 -0
- package/src/cli/serve-isolated.ts +217 -0
- package/src/cli/serve-options.ts +106 -0
- package/src/cli/serve-state.ts +205 -0
- package/src/cli/serve.ts +500 -0
- package/src/cli/served-model-host.ts +102 -0
- package/src/cli/server-entry.ts +148 -0
- package/src/cli/serving-unit.ts +177 -0
- package/src/{tui.ts → cli/terminal.ts} +13 -8
- package/src/cli/worker-adapters.ts +34 -0
- package/src/cli/worker-entry.ts +272 -0
- package/src/cli/worker-unit.ts +179 -0
- package/src/engine/adapter-operation.ts +26 -0
- package/src/engine/cache-services.ts +114 -0
- package/src/engine/completion.ts +39 -0
- package/src/engine/generation-gateway.ts +358 -0
- package/src/engine/index.ts +59 -0
- package/src/engine/kv-budget.ts +120 -0
- package/src/engine/media-preparation.ts +232 -0
- package/src/engine/model-binding.ts +24 -0
- package/src/engine/model-host.ts +513 -0
- package/src/engine/model-serving.ts +89 -0
- package/src/{serve → engine}/preparation.ts +7 -5
- package/src/{serve → engine}/session-completion-engine.ts +6 -6
- package/src/engine/telemetry.ts +109 -0
- package/src/hub/downloads.ts +116 -0
- package/src/jobs/db.ts +16 -7
- package/src/jobs/events.ts +29 -0
- package/src/jobs/executable.ts +5 -0
- package/src/jobs/host.ts +51 -0
- package/src/jobs/in-process.ts +55 -0
- package/src/{contracts/jobs.ts → jobs/protocol.ts} +7 -9
- package/src/jobs/runner.ts +150 -231
- package/src/jobs/service.ts +75 -0
- package/src/jobs/sse.ts +59 -23
- package/src/jobs/worker-memory.ts +46 -0
- package/src/jobs/worker-process.ts +163 -0
- package/src/jobs/worker-supervisor.ts +258 -0
- package/src/modules.ts +58 -0
- package/src/publishing/catalog-hub.ts +18 -0
- package/src/publishing/credentials.ts +31 -0
- package/src/publishing/upload.ts +37 -0
- package/src/residency/leased-adapters.ts +21 -0
- package/src/residency/local-records.ts +16 -0
- package/src/residency/model-residency.ts +405 -0
- package/src/residency/record-index.ts +28 -0
- package/src/residency/resident-estimate.ts +50 -0
- package/src/{anthropic.ts → server/anthropic.ts} +3 -81
- package/src/server/cache-routes.ts +36 -0
- package/src/{serve → server}/chat-request.ts +10 -10
- package/src/{serve → server}/chat-stage.ts +14 -14
- package/src/{client.ts → server/client.ts} +28 -2
- package/src/{serve → server}/completion-executor.ts +33 -41
- package/src/server/decision-body.ts +55 -0
- package/src/server/decision-routes.ts +134 -0
- package/src/server/decision-wire.ts +228 -0
- package/src/{serve → server}/discovery-routes.ts +25 -82
- package/src/{serve → server}/http.ts +25 -13
- package/src/{serve → server}/inference-request.ts +5 -5
- package/src/server/job-routes.ts +20 -0
- package/src/server/media-prompt.ts +63 -0
- package/src/server/memory-completion-client.ts +46 -0
- package/src/server/model-routes.ts +192 -0
- package/src/{serve → server}/openai-wire.ts +3 -2
- package/src/{serve → server}/pipeline.ts +1 -1
- package/src/server/prompt-builder.ts +13 -0
- package/src/server/prompt-contracts.ts +17 -0
- package/src/server/proxy-routes.ts +187 -0
- package/src/server/publishing-routes.ts +41 -0
- package/src/{serve → server}/request-plan.ts +6 -8
- package/src/{serve → server}/request-prep.ts +47 -50
- package/src/{serve → server}/responses-client.ts +30 -13
- package/src/{responses.ts → server/responses.ts} +12 -93
- package/src/server/routes.ts +205 -0
- package/src/server/start.ts +72 -0
- package/src/server/status-routes.ts +108 -0
- package/src/{serve → server}/text-completion-stage.ts +25 -4
- package/src/server/text-prompt.ts +12 -0
- package/src/{serve → server}/token-streams.ts +36 -38
- package/src/server/worker-routes.ts +311 -0
- package/src/storage/paths.ts +61 -0
- package/src/web/assets.ts +37 -0
- package/src/web/{src → browser}/api.ts +5 -23
- package/src/web/browser/chat-host.ts +17 -0
- package/src/web/browser/installed-panels.ts +6 -0
- package/src/web/browser/main.ts +55 -0
- package/src/web/browser/markdown.ts +279 -0
- package/src/web/browser/memory-panel.ts +9 -0
- package/src/web/browser/palette.ts +64 -0
- package/src/web/browser/protocol.ts +13 -0
- package/src/web/browser/shell.ts +467 -0
- package/src/web/{src → browser}/status.ts +32 -36
- package/src/web/build.ts +51 -0
- package/src/web/public/app.html +1054 -0
- package/src/web/{sw.js → public/sw.js} +4 -3
- package/src/web/{vendor → public/vendor}/hljs-theme.css +2 -2
- package/src/web/{vendor → public/vendor}/hljs.js +2 -2
- package/THIRD_PARTY_LICENSES.md +0 -51
- package/docs/README.md +0 -107
- package/docs/archive/hlg-sampling.md +0 -350
- package/docs/archive/investigations/audio-input-plan.md +0 -356
- package/docs/archive/investigations/benchmark-ledger-through-v0.4.0.md +0 -3617
- package/docs/archive/investigations/chunk-finetune-experiment.md +0 -84
- package/docs/archive/investigations/colibri-glm52-port.md +0 -1486
- package/docs/archive/investigations/colibri-oracle-pin.md +0 -1284
- package/docs/archive/investigations/curve-bisector-routing.md +0 -123
- package/docs/archive/investigations/decode-roofline-lookagain.md +0 -348
- package/docs/archive/investigations/diffusion-gemma-port.md +0 -602
- package/docs/archive/investigations/dspark-handoff.md +0 -224
- package/docs/archive/investigations/expert-offload-single-user-moe.md +0 -292
- package/docs/archive/investigations/faithful-l1-consolidation.md +0 -310
- package/docs/archive/investigations/hlg-sampling-investigation.md +0 -970
- package/docs/archive/investigations/indexshare-performance-spike.md +0 -357
- package/docs/archive/investigations/kernel-perf-review-2026-07.md +0 -171
- package/docs/archive/investigations/lab-build-journal.md +0 -157
- package/docs/archive/investigations/minicpm5-decode-megakernel.md +0 -489
- package/docs/archive/investigations/openjarvis-fit.md +0 -198
- package/docs/archive/investigations/openwiki-evaluation.md +0 -249
- package/docs/archive/investigations/optimization_plan.md +0 -346
- package/docs/archive/investigations/orpo-base-uf-experiment-and-directions.md +0 -120
- package/docs/archive/investigations/orpo-flash-cce-pin-leak.md +0 -167
- package/docs/archive/investigations/orpo-uf-testing-handoff.md +0 -126
- package/docs/archive/investigations/pareto-specialized-runtime-findings.md +0 -92
- package/docs/archive/investigations/pi-builtin-investigation.md +0 -308
- package/docs/archive/investigations/pre-colibri-stabilization.md +0 -329
- package/docs/archive/investigations/qwen38-27b-campaign-log.md +0 -1092
- package/docs/archive/investigations/segmented-backward-handoff.md +0 -148
- package/docs/archive/investigations/starter-model-port-handoff.md +0 -342
- package/docs/archive/investigations/steel-flash-cce-handoff.md +0 -489
- package/docs/archive/investigations/the-dreaming-handoff.md +0 -141
- package/docs/archive/investigations/trainer-validation-experiment.md +0 -173
- package/docs/archive/planning/chat-ui-vision-memory-first.md +0 -199
- package/docs/archive/planning/chat-ui-vision.md +0 -50
- package/docs/archive/planning/chunk-task-roadmap.md +0 -77
- package/docs/archive/planning/curve-sampler-research-plan.md +0 -331
- package/docs/archive/planning/journal.md +0 -316
- package/docs/archive/planning/memory-docs-and-dag-plan.md +0 -194
- package/docs/archive/planning/pi-integration-review.md +0 -178
- package/docs/archive/planning/release-notes-v0.0.10.md +0 -57
- package/docs/archive/planning/release-notes-v0.0.11.md +0 -239
- package/docs/archive/planning/release-notes-v0.0.12.md +0 -80
- package/docs/archive/planning/release-notes-v0.0.13.md +0 -77
- package/docs/archive/planning/release-notes-v0.0.9.md +0 -122
- package/docs/archive/planning/release-notes-v0.2.0.md +0 -49
- package/docs/archive/planning/release-notes-v0.3.0.md +0 -35
- package/docs/archive/planning/release-notes-v0.4.0.md +0 -45
- package/docs/archive/planning/release-notes-v0.5.0.md +0 -37
- package/docs/archive/planning/web-ui-pass-plan.md +0 -213
- package/docs/archive/planning/website-readme-pass-plan.md +0 -224
- package/docs/design/batching.md +0 -2054
- package/docs/design/decode-speed-program.md +0 -2404
- package/docs/design/dreaming-nightly-pipeline.md +0 -684
- package/docs/design/generic-model-support.md +0 -821
- package/docs/design/kv-cache.md +0 -993
- package/docs/design/orpo-training.md +0 -680
- package/docs/design/speculative-decoding.md +0 -2129
- package/docs/design/turboquant.md +0 -2225
- package/docs/design/unified-engine-frontier-plan.md +0 -1987
- package/docs/design/web-chat-redesign.md +0 -695
- package/docs/planning/PRODUCT_ROADMAP.md +0 -593
- package/docs/planning/ResearchTopics.md +0 -119
- package/docs/planning/public-readiness-handoff.md +0 -244
- package/docs/planning/public-readiness.md +0 -149
- package/docs/planning/video-series.md +0 -421
- package/docs/reference/benchmarks.md +0 -3587
- package/docs/reference/cli.md +0 -646
- package/docs/reference/distribution.md +0 -380
- package/docs/reference/environment.md +0 -494
- package/docs/reference/glossary.md +0 -39
- package/docs/reference/library-api.md +0 -688
- package/docs/reference/memory.md +0 -260
- package/docs/reference/models.md +0 -346
- package/docs/reference/server-api.md +0 -1945
- package/docs/reference/server-config.md +0 -973
- package/docs/reference/training.md +0 -462
- package/docs/reference/troubleshooting.md +0 -158
- package/src/admission-plan.ts +0 -18
- package/src/audio/audiotoolbox.ts +0 -112
- package/src/audio/conformer.ts +0 -655
- package/src/audio/decode.ts +0 -133
- package/src/audio/features.ts +0 -202
- package/src/audio/mic-capture.ts +0 -98
- package/src/audio/silero-vad.ts +0 -379
- package/src/audio/transcode.ts +0 -67
- package/src/audio/whisper-decode.ts +0 -774
- package/src/audio/whisper-fast.ts +0 -732
- package/src/audio/whisper-format.ts +0 -73
- package/src/audio/whisper-mel.ts +0 -185
- package/src/audio/whisper-timing.ts +0 -274
- package/src/audio/whisper-tokenizer.ts +0 -239
- package/src/audio/whisper-transcribe.ts +0 -410
- package/src/backends/mlx/assistant-target.ts +0 -46
- package/src/backends/mlx/autoregressive-draft-rows.ts +0 -120
- package/src/backends/mlx/autoregressive.ts +0 -129
- package/src/backends/mlx/batch-group.ts +0 -1874
- package/src/backends/mlx/cache-attachment.ts +0 -67
- package/src/backends/mlx/cache-layout.ts +0 -31
- package/src/backends/mlx/checkpoint-state.ts +0 -53
- package/src/backends/mlx/continuation-persistence.ts +0 -107
- package/src/backends/mlx/continuation-request.ts +0 -43
- package/src/backends/mlx/continuation.ts +0 -77
- package/src/backends/mlx/diffusion.ts +0 -39
- package/src/backends/mlx/draft-target.ts +0 -32
- package/src/backends/mlx/encoder-cache.ts +0 -25
- package/src/backends/mlx/evaluation.ts +0 -105
- package/src/backends/mlx/fill-append.ts +0 -58
- package/src/backends/mlx/fill-group.ts +0 -497
- package/src/backends/mlx/full-kv-row-append.ts +0 -32
- package/src/backends/mlx/full-kv-row-donor.ts +0 -54
- package/src/backends/mlx/full-transitioning-kv-rows.ts +0 -65
- package/src/backends/mlx/gateway-binding.ts +0 -174
- package/src/backends/mlx/graph.ts +0 -38
- package/src/backends/mlx/kv-codec.ts +0 -9
- package/src/backends/mlx/kv-maintenance.ts +0 -161
- package/src/backends/mlx/kv-tensor-rows.ts +0 -212
- package/src/backends/mlx/memory-client.ts +0 -189
- package/src/backends/mlx/methods.ts +0 -90
- package/src/backends/mlx/mixed-iteration.ts +0 -62
- package/src/backends/mlx/model-prompt.ts +0 -178
- package/src/backends/mlx/model-serving.ts +0 -80
- package/src/backends/mlx/paged-cache-codec.ts +0 -27
- package/src/backends/mlx/prefill-cohort.ts +0 -100
- package/src/backends/mlx/prefill-policy.ts +0 -26
- package/src/backends/mlx/prefill-rows.ts +0 -244
- package/src/backends/mlx/prefill.ts +0 -33
- package/src/backends/mlx/projected-context-rows.ts +0 -72
- package/src/backends/mlx/prompt-input.ts +0 -29
- package/src/backends/mlx/qwen-prompt-input.ts +0 -40
- package/src/backends/mlx/request-policy.ts +0 -20
- package/src/backends/mlx/request-state-policy.ts +0 -54
- package/src/backends/mlx/rollback.ts +0 -92
- package/src/backends/mlx/row-sampling.ts +0 -49
- package/src/backends/mlx/serial-executor.ts +0 -251
- package/src/backends/mlx/speculative-group.ts +0 -438
- package/src/backends/mlx/speculative-round.ts +0 -161
- package/src/backends/mlx/speculative.ts +0 -131
- package/src/backends/mlx/state-rows.ts +0 -104
- package/src/backends/mlx/state-views.ts +0 -46
- package/src/backends/mlx/target-layout-capability.ts +0 -35
- package/src/backends/mlx/text-engine.ts +0 -73
- package/src/backends/mlx/transitioning-kv-rows.ts +0 -173
- package/src/chat-template.ts +0 -382
- package/src/cli.ts +0 -3490
- package/src/config.ts +0 -399
- package/src/contracts/completion.ts +0 -16
- package/src/contracts/execution.ts +0 -70
- package/src/contracts/generation.ts +0 -103
- package/src/contracts/host.ts +0 -7
- package/src/contracts/object-cache.ts +0 -8
- package/src/contracts/pi-provider.ts +0 -30
- package/src/contracts/pi.ts +0 -261
- package/src/contracts/prefix-cache.ts +0 -33
- package/src/contracts/resources.ts +0 -25
- package/src/contracts/sampling.ts +0 -23
- package/src/contracts/scheduling.ts +0 -54
- package/src/contracts/tsconfig.json +0 -14
- package/src/dataset/generators.ts +0 -1087
- package/src/dataset/index.ts +0 -12
- package/src/dataset/job.ts +0 -81
- package/src/dataset/llm.ts +0 -71
- package/src/dataset/registry.ts +0 -528
- package/src/diffusion/diffusion-generate.ts +0 -507
- package/src/download.ts +0 -505
- package/src/embed.ts +0 -77
- package/src/engine/admission.ts +0 -59
- package/src/engine/cancellation.ts +0 -38
- package/src/engine/engine.ts +0 -56
- package/src/engine/execution-coordinator.ts +0 -70
- package/src/engine/execution-plan.ts +0 -64
- package/src/engine/execution-tasks.ts +0 -44
- package/src/engine/namespaced-cache.ts +0 -13
- package/src/engine/resources.ts +0 -53
- package/src/engine/scheduler.ts +0 -92
- package/src/engine/session.ts +0 -247
- package/src/eval/README.md +0 -130
- package/src/eval/ifeval.ts +0 -81
- package/src/eval/kl-prompts.ts +0 -29
- package/src/eval/kl.ts +0 -590
- package/src/eval/perplexity.ts +0 -164
- package/src/eval/quality-db.ts +0 -92
- package/src/eval/reference-logits.ts +0 -207
- package/src/eval/runner.ts +0 -124
- package/src/eval/score.ts +0 -49
- package/src/eval/tasks/bfcl.ts +0 -535
- package/src/eval/tasks/gsm8k.ts +0 -98
- package/src/eval/tasks/hashhop.ts +0 -139
- package/src/eval/tasks/humaneval.ts +0 -275
- package/src/eval/tasks/ifeval.ts +0 -525
- package/src/eval/tasks/mmlu.ts +0 -157
- package/src/eval/ultrafeedback.ts +0 -60
- package/src/evaldb.ts +0 -199
- package/src/expert-io.ts +0 -393
- package/src/expert-offload-build.ts +0 -77
- package/src/expert-offload.ts +0 -76
- package/src/expert-residency.ts +0 -1134
- package/src/expert-usage.ts +0 -415
- package/src/fill/echo-index.ts +0 -188
- package/src/fill/fill-session.ts +0 -463
- package/src/fill/proposal.ts +0 -68
- package/src/fill/schema-rows.ts +0 -506
- package/src/fill/tool-boundary.ts +0 -103
- package/src/fit.ts +0 -249
- package/src/generate.ts +0 -1352
- package/src/grammar.ts +0 -604
- package/src/harness-pi.ts +0 -184
- package/src/hf-push.ts +0 -628
- package/src/hub-rest.ts +0 -242
- package/src/index.ts +0 -63
- package/src/inference/denoising.ts +0 -17
- package/src/inference/draft-acceptance.ts +0 -41
- package/src/inference/draft-output.ts +0 -49
- package/src/inference/graph.ts +0 -33
- package/src/inference/prefill.ts +0 -45
- package/src/inference/rollback.ts +0 -7
- package/src/jobs/index.ts +0 -31
- package/src/jobs/job-entry.ts +0 -107
- package/src/jobs/task-client.ts +0 -19
- package/src/jobs/types.ts +0 -2
- package/src/kv-scheme.ts +0 -279
- package/src/kv-store.ts +0 -1135
- package/src/lab/README.md +0 -22
- package/src/lab/curve/curve-designer.html +0 -303
- package/src/lab/curve/curve-sampler.ts +0 -122
- package/src/lab/expert-trace/expert-trace.ts +0 -69
- package/src/lab/paged-kv/paged-attention.ts +0 -117
- package/src/lab/paged-kv/paged-kv-rows.ts +0 -111
- package/src/lab/paged-kv/paged-kv.ts +0 -336
- package/src/library.ts +0 -40
- package/src/lora.ts +0 -408
- package/src/md-modules.d.ts +0 -54
- package/src/media-fetch.ts +0 -442
- package/src/memory/article.ts +0 -558
- package/src/memory/chunk-validation.ts +0 -150
- package/src/memory/chunk.ts +0 -318
- package/src/memory/cluster.ts +0 -351
- package/src/memory/coverage.ts +0 -134
- package/src/memory/crosslink.ts +0 -0
- package/src/memory/db.ts +0 -253
- package/src/memory/entity.ts +0 -203
- package/src/memory/gate.ts +0 -187
- package/src/memory/history.ts +0 -152
- package/src/memory/ingest.ts +0 -335
- package/src/memory/model.ts +0 -183
- package/src/memory/normalize.ts +0 -671
- package/src/memory/parse.ts +0 -22
- package/src/memory/pipeline.ts +0 -275
- package/src/memory/prompts.ts +0 -65
- package/src/memory/query.ts +0 -334
- package/src/memory/reconcile.ts +0 -734
- package/src/memory/redirect.ts +0 -108
- package/src/memory/reindex.ts +0 -325
- package/src/memory/resolve.ts +0 -307
- package/src/memory/rest.ts +0 -245
- package/src/memory/route.ts +0 -272
- package/src/memory/schedule.ts +0 -165
- package/src/memory/stages.ts +0 -777
- package/src/memory/synthesize.ts +0 -1638
- package/src/memory/tools.ts +0 -749
- package/src/memory/vault.ts +0 -1194
- package/src/memory/wikify.ts +0 -1064
- package/src/mlx/array.ts +0 -425
- package/src/mlx/autograd.ts +0 -304
- package/src/mlx/checkpoint.ts +0 -149
- package/src/mlx/compile.ts +0 -168
- package/src/mlx/custom-vjp.ts +0 -188
- package/src/mlx/ffi.ts +0 -531
- package/src/mlx/materialize.ts +0 -23
- package/src/mlx/metal-kernel.ts +0 -159
- package/src/mlx/normalized-argmax.ts +0 -116
- package/src/mlx/ops.ts +0 -1108
- package/src/mlx/quantized-rows.ts +0 -36
- package/src/mlx/token-bitmask.ts +0 -52
- package/src/mlx/turboquant-kv-decode.ts +0 -82
- package/src/mlx/turboquant-kv-inverse.ts +0 -122
- package/src/mlx/turboquant-ops.ts +0 -861
- package/src/mlx/turboquant-tables.ts +0 -237
- package/src/mmap.ts +0 -90
- package/src/model/artifact-identity.ts +0 -73
- package/src/model/batched-kv.ts +0 -235
- package/src/model/batched-mask.ts +0 -279
- package/src/model/batched-quant.ts +0 -212
- package/src/model/batched-quantized-kv.ts +0 -144
- package/src/model/batched-rotating-quant.ts +0 -353
- package/src/model/batched-rotating-state.ts +0 -149
- package/src/model/batched-rotating.ts +0 -338
- package/src/model/batched-row-storage.ts +0 -179
- package/src/model/batched-ssm.ts +0 -52
- package/src/model/batched-turboquant-kv.ts +0 -94
- package/src/model/compiled-decode.ts +0 -712
- package/src/model/decoded-kv-donor.ts +0 -12
- package/src/model/delayed-quantized-kv.ts +0 -72
- package/src/model/delayed-rotating-quantized-kv.ts +0 -93
- package/src/model/delayed-turboquant-kv.ts +0 -57
- package/src/model/diffusion-gemma.ts +0 -1026
- package/src/model/factory.ts +0 -215
- package/src/model/fingerprint.ts +0 -45
- package/src/model/flash-attention.ts +0 -694
- package/src/model/full-prefill-padding.ts +0 -56
- package/src/model/full-prefill-row.ts +0 -105
- package/src/model/gemma4-base.ts +0 -2370
- package/src/model/gemma4.ts +0 -1395
- package/src/model/generated/gemma4-12b.ts +0 -429
- package/src/model/generated/gemma4-26b.ts +0 -448
- package/src/model/generated/gemma4-e4b.ts +0 -717
- package/src/model/generated/index.ts +0 -18
- package/src/model/glm52-atlas.ts +0 -511
- package/src/model/glm52-cache.ts +0 -792
- package/src/model/glm52-config.ts +0 -262
- package/src/model/glm52-container.ts +0 -305
- package/src/model/glm52-coupling.ts +0 -388
- package/src/model/glm52-dsa.ts +0 -606
- package/src/model/glm52-expert-layout.ts +0 -253
- package/src/model/glm52-layout.ts +0 -152
- package/src/model/glm52-memory.ts +0 -500
- package/src/model/glm52-mla.ts +0 -792
- package/src/model/glm52-moe.ts +0 -223
- package/src/model/glm52-pilot.ts +0 -537
- package/src/model/glm52-reference.ts +0 -445
- package/src/model/glm52-residency.ts +0 -557
- package/src/model/glm52-resident-weights.ts +0 -135
- package/src/model/glm52-streamed-experts.ts +0 -453
- package/src/model/glm52-streamed-metal.ts +0 -610
- package/src/model/glm52-weights.ts +0 -503
- package/src/model/glm52.ts +0 -1132
- package/src/model/implementation.ts +0 -69
- package/src/model/kv-attention-view.ts +0 -70
- package/src/model/minicpm5.ts +0 -376
- package/src/model/profile.ts +0 -468
- package/src/model/quantized-append-attention.ts +0 -31
- package/src/model/qwen-append.ts +0 -12
- package/src/model/qwen-conv.ts +0 -52
- package/src/model/qwen3-delta-state.ts +0 -74
- package/src/model/qwen3-delta.ts +0 -451
- package/src/model/qwen3-moe.ts +0 -404
- package/src/model/qwen3-mrope.ts +0 -250
- package/src/model/qwen3.ts +0 -277
- package/src/model/qwen3_5-checkpoint.ts +0 -164
- package/src/model/qwen3_5.ts +0 -881
- package/src/model/rotating-kv-donor.ts +0 -35
- package/src/model/rotating-kv-layout.ts +0 -262
- package/src/model/rotating-row-transaction.ts +0 -35
- package/src/model/speculative-rotating-kv.ts +0 -101
- package/src/model/ssm-prefill-padding.ts +0 -39
- package/src/model/support.ts +0 -110
- package/src/model/token-groups.ts +0 -66
- package/src/model/trellis-balanced-scatter.ts +0 -51
- package/src/model/trellis-linear.ts +0 -672
- package/src/model/trellis-shared-m.ts +0 -151
- package/src/model/trellis-shared-scatter.ts +0 -144
- package/src/model/trellis-splitk-prefill.ts +0 -158
- package/src/model/trellis-tiled-prefill.ts +0 -136
- package/src/model/trellis-vector-expand.ts +0 -62
- package/src/model/trellis-wide-prefill.ts +0 -94
- package/src/model/turboquant-codec.ts +0 -89
- package/src/model/universal/archs.ts +0 -332
- package/src/model/universal/dense.ts +0 -612
- package/src/model/universal/modules.ts +0 -170
- package/src/model/universal/rope.ts +0 -381
- package/src/model/whisper.ts +0 -435
- package/src/native/expert_io.c +0 -523
- package/src/native/frame_extract.swift +0 -140
- package/src/native/mic_capture.swift +0 -92
- package/src/native-pack.ts +0 -163
- package/src/pi-provider.ts +0 -53
- package/src/pi-session.ts +0 -81
- package/src/pi-terminal.ts +0 -274
- package/src/pi-web.ts +0 -1940
- package/src/preflight.ts +0 -158
- package/src/prompt-cache.ts +0 -682
- package/src/quantize/allocator.ts +0 -627
- package/src/quantize/atomic-output.ts +0 -38
- package/src/quantize/calibration.ts +0 -181
- package/src/quantize/config-writer.ts +0 -145
- package/src/quantize/index.ts +0 -84
- package/src/quantize/job.ts +0 -162
- package/src/quantize/quantizer.ts +0 -666
- package/src/quantize/rotate.ts +0 -603
- package/src/quantize/safetensors-writer.ts +0 -249
- package/src/quantize/sensitivity.ts +0 -216
- package/src/quantize/trellis.ts +0 -586
- package/src/quantize/weight-transform.ts +0 -292
- package/src/registry.ts +0 -602
- package/src/runtime-config.ts +0 -77
- package/src/safetensors.ts +0 -165
- package/src/sampler.ts +0 -1012
- package/src/serve/admin-routes.ts +0 -184
- package/src/serve/assets/curve-terrain.html +0 -105
- package/src/serve/assets/training-inference-map.html +0 -575
- package/src/serve/audio-routes.ts +0 -323
- package/src/serve/aux-routes.ts +0 -132
- package/src/serve/batch-scheduler.ts +0 -8
- package/src/serve/checkpoint-identity.ts +0 -64
- package/src/serve/generation-gateway.ts +0 -537
- package/src/serve/isolate.ts +0 -609
- package/src/serve/kv-budget.ts +0 -14
- package/src/serve/lab-routes.ts +0 -341
- package/src/serve/lane-registry.ts +0 -45
- package/src/serve/model-admin-routes.ts +0 -155
- package/src/serve/model-binding.ts +0 -49
- package/src/serve/model-host.ts +0 -511
- package/src/serve/parent-application.ts +0 -56
- package/src/serve/prompt-response-trace.ts +0 -161
- package/src/serve/response-lease.ts +0 -24
- package/src/serve/session-search.ts +0 -326
- package/src/serve/static-routes.ts +0 -101
- package/src/serve/transcription-server.ts +0 -64
- package/src/serve/transcription-service.ts +0 -502
- package/src/server.ts +0 -1282
- package/src/spec/assistant-rows.ts +0 -93
- package/src/spec/assistant-source.ts +0 -126
- package/src/spec/cache-identity.ts +0 -22
- package/src/spec/deepspec-rows.ts +0 -29
- package/src/spec/deepspec-source.ts +0 -145
- package/src/spec/dflash-source.ts +0 -149
- package/src/spec/drafter.ts +0 -304
- package/src/spec/dspark/ab-stats.ts +0 -136
- package/src/spec/dspark/calibration.ts +0 -112
- package/src/spec/dspark/data-dflash.ts +0 -156
- package/src/spec/dspark/data.ts +0 -201
- package/src/spec/dspark/deepspec-module.ts +0 -776
- package/src/spec/dspark/generate-dflash.ts +0 -245
- package/src/spec/dspark/generate.ts +0 -290
- package/src/spec/dspark/loader.ts +0 -23
- package/src/spec/dspark/loss.ts +0 -213
- package/src/spec/dspark/module-dflash.ts +0 -560
- package/src/spec/dspark/module.ts +0 -540
- package/src/spec/dspark/quantize-drafter.ts +0 -91
- package/src/spec/dspark/sample.ts +0 -112
- package/src/spec/generate.ts +0 -276
- package/src/spec/glm52-mtp-graph.ts +0 -29
- package/src/spec/glm52-mtp-rows.ts +0 -132
- package/src/spec/glm52-mtp-source.ts +0 -318
- package/src/spec/glm52-mtp-state.ts +0 -33
- package/src/spec/ngram-source.ts +0 -226
- package/src/spec/projected-draft-rows.ts +0 -73
- package/src/spec/qwen-mtp-module.ts +0 -171
- package/src/spec/qwen-mtp-rows.ts +0 -230
- package/src/spec/qwen-mtp-source.ts +0 -386
- package/src/spec/qwen-mtp-state.ts +0 -30
- package/src/spec/serve-loop.ts +0 -587
- package/src/spec/source.ts +0 -228
- package/src/spec/two-model-rows.ts +0 -62
- package/src/spec/two-model.ts +0 -113
- package/src/ssd-cache.ts +0 -431
- package/src/ssd-durability.ts +0 -209
- package/src/storage/host-buffer.ts +0 -24
- package/src/storage/kv-writer.ts +0 -83
- package/src/storage/kv-writer.worker.js +0 -264
- package/src/storage/retention-policy.ts +0 -37
- package/src/tiered-prompt-cache.ts +0 -45
- package/src/tokenizer.ts +0 -335
- package/src/tool-approvals.ts +0 -131
- package/src/tool-call.ts +0 -695
- package/src/train/dataset.ts +0 -484
- package/src/train/diffusion-lora.ts +0 -216
- package/src/train/export.ts +0 -32
- package/src/train/flash-cce.ts +0 -1234
- package/src/train/forward.ts +0 -266
- package/src/train/fuse.ts +0 -243
- package/src/train/index.ts +0 -46
- package/src/train/job.ts +0 -205
- package/src/train/lora-params.ts +0 -254
- package/src/train/loss.ts +0 -1591
- package/src/train/merge.ts +0 -195
- package/src/train/optimizer.ts +0 -183
- package/src/train/prefix-shared.ts +0 -490
- package/src/train/rank.ts +0 -137
- package/src/train/segmented.ts +0 -1828
- package/src/train/steel-qmm-header.ts +0 -1461
- package/src/train/trainer.ts +0 -1221
- package/src/train/watch.ts +0 -542
- package/src/vision/diffusion-vision.ts +0 -620
- package/src/vision/embedder.ts +0 -176
- package/src/vision/preprocess.ts +0 -247
- package/src/vision/prompt.ts +0 -409
- package/src/vision/qwen3vl-preprocess.ts +0 -409
- package/src/vision/qwen3vl-prompt.ts +0 -233
- package/src/vision/qwen3vl-tower.ts +0 -566
- package/src/vision/siglip.ts +0 -607
- package/src/vision/video-frames.ts +0 -148
- package/src/web/app.html +0 -2155
- package/src/web/app.js +0 -5863
- package/src/web/skills/memory/SKILL.md +0 -120
- package/src/web/skills/web-research/SKILL.md +0 -46
- package/src/web/skills.ts +0 -97
- package/src/web/src/adapters-panel.ts +0 -288
- package/src/web/src/assistant.ts +0 -451
- package/src/web/src/chat.ts +0 -1060
- package/src/web/src/composer.ts +0 -962
- package/src/web/src/dataset.ts +0 -132
- package/src/web/src/finetune.ts +0 -267
- package/src/web/src/hub.ts +0 -428
- package/src/web/src/main.ts +0 -98
- package/src/web/src/markdown.ts +0 -0
- package/src/web/src/memory-panel.ts +0 -572
- package/src/web/src/model-picker.ts +0 -159
- package/src/web/src/palette.ts +0 -346
- package/src/web/src/protocol.ts +0 -26
- package/src/web/src/quantize.ts +0 -167
- package/src/web/src/rag.ts +0 -274
- package/src/web/src/sessions.ts +0 -469
- package/src/web/src/shell.ts +0 -804
- package/src/web/src/ui-catalog.ts +0 -78
- package/src/web/src/voice.ts +0 -141
- package/src/web/vendor/README.md +0 -61
- package/src/web-assets.ts +0 -47
- package/src/web-tools.ts +0 -478
- package/src/weights.ts +0 -255
- /package/src/{serve → server}/completion-sink.ts +0 -0
- /package/src/{serve → server}/generated-token-history.ts +0 -0
- /package/src/web/{icon.svg → public/icon.svg} +0 -0
- /package/src/web/{manifest.webmanifest → public/manifest.webmanifest} +0 -0
- /package/src/web/{vendor → public/vendor}/hljs-LICENSE +0 -0
|
@@ -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) => ({ "&": "&", "<": "<", ">": ">", '"': """ } 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+"[^)]*")?\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 "<h1>" 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">→</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
|
+
}
|