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
package/src/memory/pipeline.ts
DELETED
|
@@ -1,275 +0,0 @@
|
|
|
1
|
-
// mlx-bun memory — synthesis pipeline orchestrator (P6-T4).
|
|
2
|
-
//
|
|
3
|
-
// Ties the stage modules into the cold-start DAG:
|
|
4
|
-
// ingest → SEGMENT → ENTITY-EXTRACT → ROUTE → CREATE → NORMALIZE → commitVault.
|
|
5
|
-
//
|
|
6
|
-
// `ingest` + `SEGMENT` already populated the corpus (conversations / messages /
|
|
7
|
-
// chunks live in the MemoryStore), so for an already-chunked conversation
|
|
8
|
-
// SEGMENT is a no-op and the pipeline operates on the existing chunks. The model
|
|
9
|
-
// stages reuse the existing modules verbatim:
|
|
10
|
-
// - ENTITY-EXTRACT — entity.ts `extractEntities` (one chunk per call, persists
|
|
11
|
-
// chunk_entities + a candidate entities/aliases row via the variant resolver).
|
|
12
|
-
// - ROUTE — route.ts `RouteAccumulator` over the persisted chunk_entities
|
|
13
|
-
// (the deterministic canonical join + the B8/P1-T5 CREATE gate); the optional
|
|
14
|
-
// model substantive-engagement gate promotes thin-but-owned candidates.
|
|
15
|
-
// - CREATE/NORMALIZE/commit — synthesize.ts `synthesizeCreate` (sub-cluster →
|
|
16
|
-
// OUTLINE → per-section DRAFT → INFOBOX → assemble → NORMALIZE → gate → write
|
|
17
|
-
// + ledger), with a single `commitVault` at the end of the run.
|
|
18
|
-
//
|
|
19
|
-
// `runSynthesis` keeps the M1 event/summary contract `src/cli.ts` drives; it now
|
|
20
|
-
// runs the real DAG over the default store + vault. The FULL-corpus bootstrap is
|
|
21
|
-
// USER-ACTION (P6-T5) — the agent never starts it; `scripts/experiments`
|
|
22
|
-
// drives a bounded handful of conversations through `runPipeline` directly.
|
|
23
|
-
|
|
24
|
-
import type { ChunkCall } from "./chunk";
|
|
25
|
-
import type { SectionCall } from "./cluster";
|
|
26
|
-
import { runLinkStage } from "./crosslink";
|
|
27
|
-
import { MemoryStore } from "./db";
|
|
28
|
-
import type { ExtractCall } from "./entity";
|
|
29
|
-
import {
|
|
30
|
-
buildEntityMeta,
|
|
31
|
-
chronoChunkIds,
|
|
32
|
-
runExtractStage,
|
|
33
|
-
runRouteStage,
|
|
34
|
-
runSegmentStage,
|
|
35
|
-
runSynthesizeStage,
|
|
36
|
-
selectCreateTargets,
|
|
37
|
-
type EntityMeta,
|
|
38
|
-
type PipelineCreated,
|
|
39
|
-
type PipelinePatched,
|
|
40
|
-
type RouteDecision,
|
|
41
|
-
} from "./stages";
|
|
42
|
-
import type { SynthesisCall } from "./synthesize";
|
|
43
|
-
import { vaultRoot } from "./vault";
|
|
44
|
-
import { wikifyVault } from "./wikify";
|
|
45
|
-
|
|
46
|
-
// Re-export the factored-out pure helpers + types so existing importers (tests,
|
|
47
|
-
// scripts) keep their `from "./pipeline"` entry points.
|
|
48
|
-
export { buildEntityMeta, selectCreateTargets };
|
|
49
|
-
export type { EntityMeta, PipelineCreated, PipelinePatched, RouteDecision };
|
|
50
|
-
|
|
51
|
-
// ---- stage / event contract (consumed by src/cli.ts) -----------------------
|
|
52
|
-
|
|
53
|
-
export type SynthesisStage =
|
|
54
|
-
| "ingest"
|
|
55
|
-
| "segment"
|
|
56
|
-
| "chunk"
|
|
57
|
-
| "extract"
|
|
58
|
-
| "route"
|
|
59
|
-
| "create"
|
|
60
|
-
| "section-route"
|
|
61
|
-
| "patch"
|
|
62
|
-
| "reconcile"
|
|
63
|
-
| "link"
|
|
64
|
-
| "wikify"
|
|
65
|
-
| "commit";
|
|
66
|
-
|
|
67
|
-
export interface SynthesisEvent {
|
|
68
|
-
type: "stage" | "log" | "done";
|
|
69
|
-
stage?: SynthesisStage;
|
|
70
|
-
message: string;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
export interface SynthesisOptions {
|
|
74
|
-
/** Only synthesize conversations newer than this (ISO date / conv cursor). */
|
|
75
|
-
since?: string;
|
|
76
|
-
/** Override the synthesis model (default e4b). Reserved — the stages resolve
|
|
77
|
-
* their own per-stage adapter via model.ts. */
|
|
78
|
-
model?: string;
|
|
79
|
-
/** Plan only — never write the vault (deterministic, no model). */
|
|
80
|
-
dryRun?: boolean;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
export interface SynthesisSummary {
|
|
84
|
-
implemented: boolean;
|
|
85
|
-
stages: SynthesisStage[];
|
|
86
|
-
note: string;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
const STAGES: SynthesisStage[] = [
|
|
90
|
-
"ingest",
|
|
91
|
-
"segment",
|
|
92
|
-
"extract",
|
|
93
|
-
"route",
|
|
94
|
-
"create",
|
|
95
|
-
"section-route",
|
|
96
|
-
"patch",
|
|
97
|
-
"link",
|
|
98
|
-
"wikify",
|
|
99
|
-
"commit",
|
|
100
|
-
];
|
|
101
|
-
|
|
102
|
-
// ---- pipeline run ----------------------------------------------------------
|
|
103
|
-
|
|
104
|
-
export interface PipelineOptions {
|
|
105
|
-
/** Restrict the run to these conversation ids; default every conversation. */
|
|
106
|
-
convIds?: string[];
|
|
107
|
-
/** Vault root (honors MLX_BUN_WIKI); defaults to `vaultRoot()`. */
|
|
108
|
-
root?: string;
|
|
109
|
-
/** Max articles to CREATE this run (bounds a smoke's GPU cost). */
|
|
110
|
-
articleCap?: number;
|
|
111
|
-
/** Entities to force into the CREATE set when they earn a `create`. */
|
|
112
|
-
mustCreate?: string[];
|
|
113
|
-
/** Model-call seam for SEGMENT (the `chunk` stage — our e4b-chunk-300 /
|
|
114
|
-
* `memory-chunk` adapter). Defaults to `callLocal("chunk", …)` inside
|
|
115
|
-
* chunkConversations; tests inject a fake to avoid a real model load. */
|
|
116
|
-
segmentCall?: ChunkCall;
|
|
117
|
-
/** Model-call seam for the CREATE drafting AND the steady-state PATCH (both run
|
|
118
|
-
* the `synthesis` stage). Tests inject a fake. */
|
|
119
|
-
call?: SynthesisCall;
|
|
120
|
-
/** Model-call seam for ENTITY-EXTRACT (the `entity` stage). Tests inject a fake. */
|
|
121
|
-
extractCall?: ExtractCall;
|
|
122
|
-
/** Model-call seam for SECTION-ROUTE (the `section` stage binary/name calls).
|
|
123
|
-
* Tests inject a fake. */
|
|
124
|
-
sectionCall?: SectionCall;
|
|
125
|
-
/** Run the subject-engagement model gate to promote a thin (single-chunk)
|
|
126
|
-
* genuine-subject candidate to a `create` stub. Off by default (a recurring
|
|
127
|
-
* subject already creates). */
|
|
128
|
-
useSubjectGate?: boolean;
|
|
129
|
-
/** Skip the final git commit (tests). */
|
|
130
|
-
commit?: boolean;
|
|
131
|
-
now?: number;
|
|
132
|
-
onEvent?: (e: SynthesisEvent) => void;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
export interface PipelineResult {
|
|
136
|
-
convs: number;
|
|
137
|
-
chunks: number;
|
|
138
|
-
/** Distinct resolved entities seen across the routed chunks. */
|
|
139
|
-
entities: number;
|
|
140
|
-
created: PipelineCreated[];
|
|
141
|
-
/** Sections of existing articles patched this run (the self-healing folds). */
|
|
142
|
-
patched: PipelinePatched[];
|
|
143
|
-
skippedByGate: string[];
|
|
144
|
-
/** Subjects captured (not yet articled) — still retrievable by search. */
|
|
145
|
-
captured: string[];
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
/**
|
|
149
|
-
* Run the cold-start synthesis DAG over a bounded set of conversations.
|
|
150
|
-
*
|
|
151
|
-
* This is now a thin ORCHESTRATOR: it drives the four INDEPENDENT, chronological,
|
|
152
|
-
* resumable stage workers (`stages.ts`) in sequence — SEGMENT → ENTITY-EXTRACT →
|
|
153
|
-
* ROUTE → SYNTHESIZE (CREATE + SECTION-ROUTE/PATCH) — so the full DAG behaves as
|
|
154
|
-
* before while each stage is also separately runnable (`mlx-bun memory
|
|
155
|
-
* segment|extract|route|synthesize`). Returns a structured report; SYNTHESIZE
|
|
156
|
-
* commits once at the end via `commitVault`.
|
|
157
|
-
*/
|
|
158
|
-
export async function runPipeline(
|
|
159
|
-
store: MemoryStore,
|
|
160
|
-
opts: PipelineOptions = {},
|
|
161
|
-
): Promise<PipelineResult> {
|
|
162
|
-
const root = opts.root ?? vaultRoot();
|
|
163
|
-
const cap = opts.articleCap ?? 20;
|
|
164
|
-
const emit = opts.onEvent ?? (() => {});
|
|
165
|
-
|
|
166
|
-
emit({ type: "stage", stage: "ingest", message: `ingest: corpus already in the store` });
|
|
167
|
-
|
|
168
|
-
// SEGMENT — (re)chunk every in-scope conversation whose chunked_at is NULL or
|
|
169
|
-
// stale, oldest-first, then proceed on the fresh chunks. A re-run is a no-op
|
|
170
|
-
// (watermark). We do NOT reuse any external chunks.
|
|
171
|
-
await runSegmentStage(store, { convIds: opts.convIds, call: opts.segmentCall, onEvent: opts.onEvent });
|
|
172
|
-
|
|
173
|
-
// Chronological run scope (oldest conversation first) for the result counts.
|
|
174
|
-
const { convs, chunkIds } = chronoChunkIds(store, opts.convIds);
|
|
175
|
-
emit({ type: "log", message: `operating on ${convs} conversation(s), ${chunkIds.length} chunk(s)` });
|
|
176
|
-
|
|
177
|
-
// ENTITY-EXTRACT — every not-yet-extracted chunk, chronological + resumable.
|
|
178
|
-
await runExtractStage(store, { convIds: opts.convIds, call: opts.extractCall, onEvent: opts.onEvent });
|
|
179
|
-
|
|
180
|
-
// ROUTE — deterministic create/capture over chunk_entities + CREATE gate;
|
|
181
|
-
// persists notable + captures thin subjects into _captured (still searchable)
|
|
182
|
-
// so SYNTHESIZE reads the decision back.
|
|
183
|
-
const route = await runRouteStage(store, {
|
|
184
|
-
convIds: opts.convIds,
|
|
185
|
-
useSubjectGate: opts.useSubjectGate,
|
|
186
|
-
onEvent: opts.onEvent,
|
|
187
|
-
});
|
|
188
|
-
|
|
189
|
-
// SYNTHESIZE — chronological CREATE (oldest entity first, oldest chunk first so
|
|
190
|
-
// the latest statement dominates) + SECTION-ROUTE → PATCH self-healing fold.
|
|
191
|
-
const synth = await runSynthesizeStage(store, {
|
|
192
|
-
root,
|
|
193
|
-
limit: cap,
|
|
194
|
-
convIds: opts.convIds,
|
|
195
|
-
mustCreate: opts.mustCreate,
|
|
196
|
-
call: opts.call,
|
|
197
|
-
sectionCall: opts.sectionCall,
|
|
198
|
-
commit: opts.commit,
|
|
199
|
-
now: opts.now,
|
|
200
|
-
onEvent: opts.onEvent,
|
|
201
|
-
});
|
|
202
|
-
|
|
203
|
-
// CROSS-LINK — build the EDGES synthesis (bounded to one article) cannot:
|
|
204
|
-
// inline-link first mentions of other articles + rebuild each ## See also from
|
|
205
|
-
// mentions + co-occurrence. Deterministic (no model) and idempotent.
|
|
206
|
-
await runLinkStage(store, { root, commit: opts.commit, onEvent: (e) => emit({ type: e.type, message: e.message }) });
|
|
207
|
-
|
|
208
|
-
emit({
|
|
209
|
-
type: "done",
|
|
210
|
-
message: `synthesis done — ${synth.created.length} created, ${synth.patched.length} patched, ${synth.skippedByGate.length} gated, ${route.captured.length} captured.`,
|
|
211
|
-
});
|
|
212
|
-
|
|
213
|
-
return {
|
|
214
|
-
convs,
|
|
215
|
-
chunks: chunkIds.length,
|
|
216
|
-
entities: route.decisions.length,
|
|
217
|
-
created: synth.created,
|
|
218
|
-
patched: synth.patched,
|
|
219
|
-
skippedByGate: synth.skippedByGate,
|
|
220
|
-
captured: route.captured,
|
|
221
|
-
};
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
// ---- cli entry: the M1 contract src/cli.ts drives --------------------------
|
|
225
|
-
|
|
226
|
-
/**
|
|
227
|
-
* Run the synthesis pipeline over the default store + vault — the `mlx-bun
|
|
228
|
-
* memory synthesize` path. Keeps the {@link SynthesisSummary} shape the CLI
|
|
229
|
-
* prints. The FULL-corpus run is a long GPU job (USER-ACTION, P6-T5); this entry
|
|
230
|
-
* exists so the wiring is complete — the agent never starts it.
|
|
231
|
-
*/
|
|
232
|
-
export async function runSynthesis(
|
|
233
|
-
opts: SynthesisOptions = {},
|
|
234
|
-
onEvent?: (e: SynthesisEvent) => void,
|
|
235
|
-
): Promise<SynthesisSummary> {
|
|
236
|
-
if (opts.dryRun) {
|
|
237
|
-
onEvent?.({ type: "log", message: "dry-run — no model calls, nothing will be written." });
|
|
238
|
-
for (const stage of STAGES) onEvent?.({ type: "stage", stage, message: `${stage}: planned (dry-run)` });
|
|
239
|
-
onEvent?.({ type: "done", message: "dry-run complete — no articles written." });
|
|
240
|
-
return { implemented: true, stages: STAGES, note: "dry-run: DAG wired; no model calls made." };
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
const store = new MemoryStore();
|
|
244
|
-
try {
|
|
245
|
-
// WRITE branch: ingest → segment → extract → route → create → commit.
|
|
246
|
-
const result = await runPipeline(store, { onEvent });
|
|
247
|
-
|
|
248
|
-
// WIKIFY branch: the periodic editorial sweep over EVERY article (P8). Runs
|
|
249
|
-
// after the write branch so freshly-created and patched articles are tightened
|
|
250
|
-
// + infobox-refreshed in the same nightly pass; each article commits its own
|
|
251
|
-
// change (or NO-OPs) behind the same conservative gate. Best-effort: a wikify
|
|
252
|
-
// defect must not lose the create-branch work already committed above.
|
|
253
|
-
onEvent?.({ type: "stage", stage: "wikify", message: "wikify: editorial sweep over every article" });
|
|
254
|
-
let editedCount = 0;
|
|
255
|
-
try {
|
|
256
|
-
const sweep = await wikifyVault({ root: vaultRoot() });
|
|
257
|
-
editedCount = sweep.edited.length;
|
|
258
|
-
onEvent?.({ type: "log", message: ` wikify edited ${editedCount}/${sweep.results.length} article(s)` });
|
|
259
|
-
} catch (err) {
|
|
260
|
-
onEvent?.({ type: "log", message: ` wikify sweep skipped (error: ${String(err)})` });
|
|
261
|
-
}
|
|
262
|
-
onEvent?.({
|
|
263
|
-
type: "done",
|
|
264
|
-
message: `synthesis done — ${result.created.length} created, ${result.patched.length} patched, ${editedCount} wikified.`,
|
|
265
|
-
});
|
|
266
|
-
|
|
267
|
-
return {
|
|
268
|
-
implemented: true,
|
|
269
|
-
stages: STAGES,
|
|
270
|
-
note: `synthesis wired — ${result.created.length} created, ${result.patched.length} patched, ${editedCount} wikified from ${result.convs} conversations.`,
|
|
271
|
-
};
|
|
272
|
-
} finally {
|
|
273
|
-
store.close();
|
|
274
|
-
}
|
|
275
|
-
}
|
package/src/memory/prompts.ts
DELETED
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
// mlx-bun memory — per-stage synthesis prompts. ⚠️ M1 STUBS.
|
|
2
|
-
//
|
|
3
|
-
// Each stage's prompt is the seam where a future specialized memory LoRA plugs
|
|
4
|
-
// in (today: base model + prompt; later: adapterScoped per stage). Editorial
|
|
5
|
-
// conventions are NOT duplicated here — they live in the vault's Meta/ pages
|
|
6
|
-
// (Editorial_Guidelines.md, Article_Conventions.md, Buckets.md,
|
|
7
|
-
// Topics_to_Ignore.md) and are read in at synthesis time so the system governs
|
|
8
|
-
// itself in its own substrate.
|
|
9
|
-
//
|
|
10
|
-
// See docs/design/dreaming-nightly-pipeline.md → "Synthesis runs on the local model".
|
|
11
|
-
|
|
12
|
-
import { readFileSync } from "node:fs";
|
|
13
|
-
import { join } from "node:path";
|
|
14
|
-
|
|
15
|
-
import { vaultRoot } from "./vault";
|
|
16
|
-
|
|
17
|
-
export const CHUNK_PROMPT = `TODO(M1): segment a conversation transcript into topic-coherent chunks.`;
|
|
18
|
-
|
|
19
|
-
export const CLUSTER_PROMPT = `TODO(M1): assign a chunk to an existing bucket from Meta/Buckets.md, or propose a new bucket.`;
|
|
20
|
-
|
|
21
|
-
export const SYNTHESIZE_PROMPT = `TODO(M1): integrate new chunks into the bucket's article. Preserve prose and every conv: citation; integrate, don't overwrite; respect the ≥70% word-count floor and the editorial gate.`;
|
|
22
|
-
|
|
23
|
-
/** Placeholder registry so the pipeline can reference prompts by stage name. */
|
|
24
|
-
export const STAGE_PROMPTS: Record<string, string> = {
|
|
25
|
-
chunk: CHUNK_PROMPT,
|
|
26
|
-
cluster: CLUSTER_PROMPT,
|
|
27
|
-
synthesize: SYNTHESIZE_PROMPT,
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
// ---- meta-policy inlining (ported from lucien scripts/meta-inline.ts) ------
|
|
31
|
-
//
|
|
32
|
-
// Editorial policy lives in the vault's Meta/ pages, not in code. Rather than
|
|
33
|
-
// telling the model to Read those pages at synthesis time (which turns every
|
|
34
|
-
// pipeline call into an agent loop whose context accumulates — a 34k-char
|
|
35
|
-
// conversation was observed ballooning to a 105k-token prefill on the local
|
|
36
|
-
// server), we inline the requested pages directly into the prompt. Calls stay
|
|
37
|
-
// single-turn: one bounded prefill, one bounded generation. The policy is
|
|
38
|
-
// edit-in-the-vault: change a Meta page on disk and the next run reflects it
|
|
39
|
-
// with zero code change.
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Read the named Meta policy pages from the vault's Meta/ dir and concatenate
|
|
43
|
-
* them for inlining into a stage prompt. Each `name` addresses
|
|
44
|
-
* `<vault>/Meta/<name>.md` (a trailing `.md` is accepted and normalized).
|
|
45
|
-
*
|
|
46
|
-
* The vault root honors the MLX_BUN_WIKI override (see {@link vaultRoot}).
|
|
47
|
-
*
|
|
48
|
-
* @throws {Error} If a requested Meta page does not exist on disk, naming it.
|
|
49
|
-
*/
|
|
50
|
-
export function loadMetaPolicy(names: string[]): string {
|
|
51
|
-
const metaDir = join(vaultRoot(), "Meta");
|
|
52
|
-
const sections: string[] = [];
|
|
53
|
-
for (const name of names) {
|
|
54
|
-
const stem = name.trim().endsWith(".md") ? name.trim().slice(0, -3) : name.trim();
|
|
55
|
-
const path = join(metaDir, `${stem}.md`);
|
|
56
|
-
let text: string;
|
|
57
|
-
try {
|
|
58
|
-
text = readFileSync(path, "utf8");
|
|
59
|
-
} catch {
|
|
60
|
-
throw new Error(`Meta policy page not found: ${path}`);
|
|
61
|
-
}
|
|
62
|
-
sections.push(`--- Meta/${stem}.md ---\n\n${text.trim()}`);
|
|
63
|
-
}
|
|
64
|
-
return sections.join("\n\n");
|
|
65
|
-
}
|
package/src/memory/query.ts
DELETED
|
@@ -1,334 +0,0 @@
|
|
|
1
|
-
// mlx-bun memory — the read-side navigation index + primitives.
|
|
2
|
-
//
|
|
3
|
-
// The read path FINDS an article deterministically — by category membership, by
|
|
4
|
-
// name/alias, or by following the [[wikilink]] graph — then hands the agent off
|
|
5
|
-
// to the read tools (TOC → section). It NEVER ranks by a vector and NEVER filters
|
|
6
|
-
// on an infobox field: the infobox is CONTENT the model reads, not a query
|
|
7
|
-
// target. There is deliberately no `byInfoboxField`, no numeric facet, no
|
|
8
|
-
// `gte/lte` here. Every lookup below touches only indexed names/categories/links;
|
|
9
|
-
// the embedding tripwire (src/embed.ts) MUST stay at zero across this module.
|
|
10
|
-
//
|
|
11
|
-
// `buildMemoryIndex` mirrors the same facts the reindex derives into the DB
|
|
12
|
-
// (aliases, categories, series, kind/type, infobox, lead, link graph) into plain
|
|
13
|
-
// in-memory maps, so the primitives are pure functions over a snapshot with no
|
|
14
|
-
// DB round-trip. The build is mtime-incremental: each file is parsed at most once
|
|
15
|
-
// per (path, mtime), so a rebuild after touching one article re-parses only that
|
|
16
|
-
// file and is otherwise byte-identical to the prior build.
|
|
17
|
-
|
|
18
|
-
import { readFileSync, readdirSync, statSync } from "node:fs";
|
|
19
|
-
import { join } from "node:path";
|
|
20
|
-
|
|
21
|
-
import {
|
|
22
|
-
deriveCategories,
|
|
23
|
-
infoboxAliases,
|
|
24
|
-
infoboxFieldValues,
|
|
25
|
-
parseInfobox,
|
|
26
|
-
parseLead,
|
|
27
|
-
parseSeriesBanner,
|
|
28
|
-
type EntityKind,
|
|
29
|
-
type Infobox,
|
|
30
|
-
} from "./article";
|
|
31
|
-
import { EntityResolver, nearNameMatch } from "./resolve";
|
|
32
|
-
import { articlesDir, extractWikilinkTargets, resolveWikilinkToStem, vaultRoot } from "./vault";
|
|
33
|
-
|
|
34
|
-
// ---- normalization (mirrors reindex.ts so resolveName agrees exactly) -
|
|
35
|
-
|
|
36
|
-
/** Casefold + collapse whitespace/underscores so title, stem, and alias forms of
|
|
37
|
-
* the same surface text key the alias index identically. */
|
|
38
|
-
function normalizeAlias(s: string): string {
|
|
39
|
-
return s.trim().toLowerCase().replace(/_/g, " ").replace(/\s+/g, " ").trim();
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const LEADING_ARTICLE_RE = /^(?:the|a|an)\s+/;
|
|
43
|
-
const WIKILINK_RE = /\[\[([^\]]+)\]\]/;
|
|
44
|
-
|
|
45
|
-
/** The inner target of a `[[wikilink]]` value, before any `|alias`/`#anchor`. */
|
|
46
|
-
function wikilinkInner(value: string): string {
|
|
47
|
-
const m = WIKILINK_RE.exec(value);
|
|
48
|
-
if (!m) return "";
|
|
49
|
-
return m[1]!.split("|")[0]!.split("#")[0]!.trim();
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
// ---- per-article parse + the index ------------------------------------
|
|
53
|
-
|
|
54
|
-
/** One article's structured facts, parsed once and cached by (path, mtime). */
|
|
55
|
-
interface IndexedArticle {
|
|
56
|
-
stem: string;
|
|
57
|
-
infobox: Infobox | null;
|
|
58
|
-
lead: string | null;
|
|
59
|
-
categories: string[];
|
|
60
|
-
series: string | null;
|
|
61
|
-
kind: EntityKind;
|
|
62
|
-
type: string | null;
|
|
63
|
-
/** Normalized alias surfaces (stem, spaced stem, infobox aliases). */
|
|
64
|
-
aliases: string[];
|
|
65
|
-
/** Resolved outbound link targets (existing article stems only, deduped). */
|
|
66
|
-
outbound: string[];
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
export interface MemoryIndex {
|
|
70
|
-
root: string;
|
|
71
|
-
/** normalized alias → stem (first writer in sorted-stem order wins). */
|
|
72
|
-
aliasToStem: Map<string, string>;
|
|
73
|
-
/** category name → member stems (sorted). */
|
|
74
|
-
categoryToStems: Map<string, string[]>;
|
|
75
|
-
/** series name → member stems (sorted). */
|
|
76
|
-
seriesToStems: Map<string, string[]>;
|
|
77
|
-
/** entity kind → stems (sorted). */
|
|
78
|
-
kindToStems: Map<string, string[]>;
|
|
79
|
-
/** emergent `type:` label → stems (sorted). */
|
|
80
|
-
typeToStems: Map<string, string[]>;
|
|
81
|
-
/** stem → parsed infobox (null when the article has none). */
|
|
82
|
-
infoboxByStem: Map<string, Infobox | null>;
|
|
83
|
-
/** stem → lead abstract (null when absent). */
|
|
84
|
-
leadByStem: Map<string, string | null>;
|
|
85
|
-
/** stem → resolved outbound article stems (the link graph). */
|
|
86
|
-
outboundByStem: Map<string, string[]>;
|
|
87
|
-
/** Stems (re)parsed on the most recent build (mtime miss). */
|
|
88
|
-
parsed: string[];
|
|
89
|
-
/** Stems served from the parse cache on the most recent build (mtime hit). */
|
|
90
|
-
reused: string[];
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
interface CacheEntry {
|
|
94
|
-
mtimeMs: number;
|
|
95
|
-
article: IndexedArticle;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/** Module-level parse cache keyed by absolute file path. Memoizes per-file
|
|
99
|
-
* PARSING only (keyed by mtime); the aggregate maps are rebuilt every call so
|
|
100
|
-
* they always reflect the current file set. */
|
|
101
|
-
const ARTICLE_CACHE = new Map<string, CacheEntry>();
|
|
102
|
-
|
|
103
|
-
/** Drop the parse cache. A cold rebuild after this yields maps byte-identical to
|
|
104
|
-
* a warm one (the cache is a pure speedup, never a source of truth). */
|
|
105
|
-
export function resetMemoryIndexCache(): void {
|
|
106
|
-
ARTICLE_CACHE.clear();
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/** Sorted article stems under `<root>/articles/` (`*.md`, no hidden files). */
|
|
110
|
-
function listArticleStems(root: string): string[] {
|
|
111
|
-
let names: string[];
|
|
112
|
-
try {
|
|
113
|
-
names = readdirSync(articlesDir(root));
|
|
114
|
-
} catch {
|
|
115
|
-
return [];
|
|
116
|
-
}
|
|
117
|
-
return names
|
|
118
|
-
.filter((n) => n.endsWith(".md") && !n.startsWith("."))
|
|
119
|
-
.map((n) => n.slice(0, -3))
|
|
120
|
-
.sort((a, b) => a.localeCompare(b));
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
/** Parse one article's markdown into its indexed facts (no I/O). */
|
|
124
|
-
function parseArticle(stem: string, md: string, stems: Set<string>): IndexedArticle {
|
|
125
|
-
const box = parseInfobox(md);
|
|
126
|
-
|
|
127
|
-
const aliasSet = new Set<string>();
|
|
128
|
-
for (const a of [stem, stem.replace(/_/g, " "), ...(box ? infoboxAliases(box) : [])]) {
|
|
129
|
-
const norm = normalizeAlias(a);
|
|
130
|
-
if (norm) aliasSet.add(norm);
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
// Outbound graph edges: prose [[links]] + infobox entity-link values + series
|
|
134
|
-
// banner, each resolved to an EXISTING article stem (red links are dropped,
|
|
135
|
-
// matching getArticleLinks). Self-edges excluded.
|
|
136
|
-
const outbound = new Set<string>();
|
|
137
|
-
const addEdge = (raw: string): void => {
|
|
138
|
-
const r = resolveWikilinkToStem(raw, stems);
|
|
139
|
-
if (r && r !== stem) outbound.add(r);
|
|
140
|
-
};
|
|
141
|
-
for (const t of extractWikilinkTargets(md)) addEdge(t);
|
|
142
|
-
if (box) {
|
|
143
|
-
for (const field of box.fields) {
|
|
144
|
-
for (const value of infoboxFieldValues(field)) {
|
|
145
|
-
if (WIKILINK_RE.test(value)) addEdge(wikilinkInner(value));
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
const series = parseSeriesBanner(md);
|
|
150
|
-
if (series) addEdge(series);
|
|
151
|
-
|
|
152
|
-
return {
|
|
153
|
-
stem,
|
|
154
|
-
infobox: box,
|
|
155
|
-
lead: parseLead(md),
|
|
156
|
-
categories: deriveCategories(md, stem).categories,
|
|
157
|
-
series,
|
|
158
|
-
kind: box ? box.entityKind : "thing",
|
|
159
|
-
type: box ? box.type : null,
|
|
160
|
-
aliases: [...aliasSet].sort((a, b) => a.localeCompare(b)),
|
|
161
|
-
outbound: [...outbound].sort((a, b) => a.localeCompare(b)),
|
|
162
|
-
};
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
/**
|
|
166
|
-
* Build the read-side navigation index for a vault. mtime-incremental: each
|
|
167
|
-
* article is parsed at most once per (path, mtime), so a rebuild after touching
|
|
168
|
-
* one file re-parses ONLY that file. Deterministic: stems are visited in sorted
|
|
169
|
-
* order and every map array is sorted, so two builds of the same vault produce
|
|
170
|
-
* byte-identical maps. Makes ZERO embedding calls.
|
|
171
|
-
*/
|
|
172
|
-
export function buildMemoryIndex(root: string = vaultRoot()): MemoryIndex {
|
|
173
|
-
const stems = listArticleStems(root);
|
|
174
|
-
const stemSet = new Set(stems);
|
|
175
|
-
const dir = articlesDir(root);
|
|
176
|
-
|
|
177
|
-
const parsed: string[] = [];
|
|
178
|
-
const reused: string[] = [];
|
|
179
|
-
const articles: IndexedArticle[] = [];
|
|
180
|
-
|
|
181
|
-
for (const stem of stems) {
|
|
182
|
-
const path = join(dir, `${stem}.md`);
|
|
183
|
-
let mtimeMs: number;
|
|
184
|
-
try {
|
|
185
|
-
mtimeMs = statSync(path).mtimeMs;
|
|
186
|
-
} catch {
|
|
187
|
-
continue; // raced/deleted between listing and stat
|
|
188
|
-
}
|
|
189
|
-
const cached = ARTICLE_CACHE.get(path);
|
|
190
|
-
if (cached && cached.mtimeMs === mtimeMs) {
|
|
191
|
-
reused.push(stem);
|
|
192
|
-
articles.push(cached.article);
|
|
193
|
-
continue;
|
|
194
|
-
}
|
|
195
|
-
let md: string;
|
|
196
|
-
try {
|
|
197
|
-
md = readFileSync(path, "utf8");
|
|
198
|
-
} catch {
|
|
199
|
-
continue;
|
|
200
|
-
}
|
|
201
|
-
const article = parseArticle(stem, md, stemSet);
|
|
202
|
-
ARTICLE_CACHE.set(path, { mtimeMs, article });
|
|
203
|
-
parsed.push(stem);
|
|
204
|
-
articles.push(article);
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
const index: MemoryIndex = {
|
|
208
|
-
root,
|
|
209
|
-
aliasToStem: new Map(),
|
|
210
|
-
categoryToStems: new Map(),
|
|
211
|
-
seriesToStems: new Map(),
|
|
212
|
-
kindToStems: new Map(),
|
|
213
|
-
typeToStems: new Map(),
|
|
214
|
-
infoboxByStem: new Map(),
|
|
215
|
-
leadByStem: new Map(),
|
|
216
|
-
outboundByStem: new Map(),
|
|
217
|
-
parsed,
|
|
218
|
-
reused,
|
|
219
|
-
};
|
|
220
|
-
|
|
221
|
-
const pushInto = (map: Map<string, string[]>, key: string, stem: string): void => {
|
|
222
|
-
const list = map.get(key);
|
|
223
|
-
if (list) list.push(stem);
|
|
224
|
-
else map.set(key, [stem]);
|
|
225
|
-
};
|
|
226
|
-
|
|
227
|
-
for (const a of articles) {
|
|
228
|
-
for (const alias of a.aliases) {
|
|
229
|
-
if (!index.aliasToStem.has(alias)) index.aliasToStem.set(alias, a.stem); // first (sorted) writer wins
|
|
230
|
-
}
|
|
231
|
-
for (const cat of a.categories) pushInto(index.categoryToStems, cat, a.stem);
|
|
232
|
-
if (a.series) pushInto(index.seriesToStems, a.series, a.stem);
|
|
233
|
-
pushInto(index.kindToStems, a.kind, a.stem);
|
|
234
|
-
if (a.type) pushInto(index.typeToStems, a.type, a.stem);
|
|
235
|
-
index.infoboxByStem.set(a.stem, a.infobox);
|
|
236
|
-
index.leadByStem.set(a.stem, a.lead);
|
|
237
|
-
index.outboundByStem.set(a.stem, a.outbound);
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
return index;
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
// ---- navigation primitives (find + resolve + links) -------------------
|
|
244
|
-
|
|
245
|
-
/**
|
|
246
|
-
* Article stems that DECLARED `[[Category:<category>]]` — the only "articles
|
|
247
|
-
* about X" mechanism (zero substring false positives). Returns a sorted copy.
|
|
248
|
-
*/
|
|
249
|
-
export function articlesInCategory(index: MemoryIndex, category: string): string[] {
|
|
250
|
-
return [...(index.categoryToStems.get(category) ?? [])];
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
/** Lazily-built near-name resolver per index (token-subset fuzzy over the alias
|
|
254
|
-
* map). Keyed by index identity; a fresh `buildMemoryIndex` yields a new object,
|
|
255
|
-
* so stale resolvers fall out of the WeakMap with their index. */
|
|
256
|
-
const NEAR_RESOLVER = new WeakMap<MemoryIndex, EntityResolver>();
|
|
257
|
-
|
|
258
|
-
function nearResolver(index: MemoryIndex): EntityResolver {
|
|
259
|
-
let r = NEAR_RESOLVER.get(index);
|
|
260
|
-
if (!r) {
|
|
261
|
-
r = EntityResolver.fromAliasMap(index.aliasToStem);
|
|
262
|
-
NEAR_RESOLVER.set(index, r);
|
|
263
|
-
}
|
|
264
|
-
return r;
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
/**
|
|
268
|
-
* Resolve an entity name or alias to its article stem via the alias index.
|
|
269
|
-
* Normalizes the query the same way aliases are stored (casefold, ws-collapse)
|
|
270
|
-
* and also retries with a leading article word ("the"/"a"/"an") stripped, so
|
|
271
|
-
* a "<the brand model>" surface and a "<model>" short form both reach the same stem.
|
|
272
|
-
*
|
|
273
|
-
* On an exact-alias miss, falls back to a conservative NEAR-NAME match
|
|
274
|
-
* ({@link nearNameMatch}) so a discussed sub-concept that is plainly the same
|
|
275
|
-
* subject as an existing article — the article title minus a generic suffix
|
|
276
|
-
* ("<subject>" for an "<subject> Theory" article) — still resolves to it, while a
|
|
277
|
-
* distinct subject or a purely-generic query does not. No model, no embedding.
|
|
278
|
-
*/
|
|
279
|
-
export function resolveName(index: MemoryIndex, nameOrAlias: string): string | null {
|
|
280
|
-
const q = normalizeAlias(nameOrAlias);
|
|
281
|
-
for (const c of [q, q.replace(LEADING_ARTICLE_RE, "")]) {
|
|
282
|
-
if (!c) continue;
|
|
283
|
-
const stem = index.aliasToStem.get(c);
|
|
284
|
-
if (stem) return stem;
|
|
285
|
-
}
|
|
286
|
-
return nearNameMatch(nearResolver(index), q);
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
export interface Neighbors {
|
|
290
|
-
outbound: string[];
|
|
291
|
-
inbound: string[];
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
/**
|
|
295
|
-
* The article's resolved [[wikilink]] neighbors: `outbound` it points at,
|
|
296
|
-
* `inbound` that point at it — including infobox entity-link edges (e.g. an
|
|
297
|
-
* entity's `<entity_key>: [[Linked Entity]]`), which is the navigation hop the read
|
|
298
|
-
* path rides. Both lists are sorted; computed entirely from the in-memory graph.
|
|
299
|
-
*/
|
|
300
|
-
export function neighbors(index: MemoryIndex, stem: string): Neighbors {
|
|
301
|
-
const outbound = [...(index.outboundByStem.get(stem) ?? [])];
|
|
302
|
-
const inbound: string[] = [];
|
|
303
|
-
for (const [from, targets] of index.outboundByStem) {
|
|
304
|
-
if (from !== stem && targets.includes(stem)) inbound.push(from);
|
|
305
|
-
}
|
|
306
|
-
inbound.sort((a, b) => a.localeCompare(b));
|
|
307
|
-
return { outbound, inbound };
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
// ---- deterministic snapshot (for tests / cache-equivalence checks) ----
|
|
311
|
-
|
|
312
|
-
/** A stable JSON serialization of the index maps (sorted keys), so a warm and a
|
|
313
|
-
* cold rebuild can be asserted byte-identical. Excludes the build accounting
|
|
314
|
-
* (`parsed`/`reused`), which is per-build by design. */
|
|
315
|
-
export function serializeMemoryIndex(index: MemoryIndex): string {
|
|
316
|
-
const dumpStringMap = (m: Map<string, string>): [string, string][] =>
|
|
317
|
-
[...m.entries()].sort((a, b) => a[0].localeCompare(b[0]));
|
|
318
|
-
const dumpListMap = (m: Map<string, string[]>): [string, string[]][] =>
|
|
319
|
-
[...m.entries()].sort((a, b) => a[0].localeCompare(b[0]));
|
|
320
|
-
const dumpInfobox = (m: Map<string, Infobox | null>): [string, Infobox | null][] =>
|
|
321
|
-
[...m.entries()].sort((a, b) => a[0].localeCompare(b[0]));
|
|
322
|
-
const dumpLeadMap = (m: Map<string, string | null>): [string, string | null][] =>
|
|
323
|
-
[...m.entries()].sort((a, b) => a[0].localeCompare(b[0]));
|
|
324
|
-
return JSON.stringify({
|
|
325
|
-
aliasToStem: dumpStringMap(index.aliasToStem),
|
|
326
|
-
categoryToStems: dumpListMap(index.categoryToStems),
|
|
327
|
-
seriesToStems: dumpListMap(index.seriesToStems),
|
|
328
|
-
kindToStems: dumpListMap(index.kindToStems),
|
|
329
|
-
typeToStems: dumpListMap(index.typeToStems),
|
|
330
|
-
infoboxByStem: dumpInfobox(index.infoboxByStem),
|
|
331
|
-
leadByStem: dumpLeadMap(index.leadByStem),
|
|
332
|
-
outboundByStem: dumpListMap(index.outboundByStem),
|
|
333
|
-
});
|
|
334
|
-
}
|