mlx-bun 0.4.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1453 -88
- 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 +10 -8
- 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 +12 -10
- package/src/{serve → server}/chat-stage.ts +27 -22
- package/src/{client.ts → server/client.ts} +28 -2
- package/src/{serve → server}/completion-executor.ts +42 -42
- 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 +42 -83
- package/src/server/generated-token-history.ts +57 -0
- 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 +8 -8
- package/src/{serve → server}/request-prep.ts +82 -68
- 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 -94
- package/docs/archive/hlg-sampling.md +0 -350
- package/docs/archive/investigations/audio-input-plan.md +0 -356
- 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/web-ui-pass-plan.md +0 -213
- package/docs/archive/planning/website-readme-pass-plan.md +0 -224
- package/docs/design/batching.md +0 -1841
- package/docs/design/decode-speed-program.md +0 -2349
- package/docs/design/dreaming-nightly-pipeline.md +0 -684
- package/docs/design/generic-model-support.md +0 -705
- package/docs/design/kv-cache.md +0 -824
- package/docs/design/orpo-training.md +0 -680
- package/docs/design/speculative-decoding.md +0 -1990
- package/docs/design/turboquant.md +0 -2212
- package/docs/design/unified-engine-frontier-plan.md +0 -1880
- package/docs/design/web-chat-redesign.md +0 -695
- package/docs/planning/PRODUCT_ROADMAP.md +0 -594
- package/docs/planning/ResearchTopics.md +0 -119
- package/docs/planning/release-notes-v0.4.0.md +0 -45
- package/docs/planning/video-series.md +0 -421
- package/docs/reference/benchmarks.md +0 -3613
- package/docs/reference/cli.md +0 -585
- package/docs/reference/distribution.md +0 -355
- package/docs/reference/environment.md +0 -398
- package/docs/reference/glossary.md +0 -39
- package/docs/reference/library-api.md +0 -674
- package/docs/reference/memory.md +0 -260
- package/docs/reference/models.md +0 -334
- package/docs/reference/server-api.md +0 -1775
- package/docs/reference/server-config.md +0 -846
- package/docs/reference/training.md +0 -462
- package/docs/reference/troubleshooting.md +0 -158
- package/src/admission-plan.ts +0 -18
- package/src/audio/conformer.ts +0 -647
- package/src/audio/decode.ts +0 -133
- package/src/audio/features.ts +0 -202
- package/src/audio/transcode.ts +0 -67
- 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 -108
- package/src/backends/mlx/batch-group.ts +0 -1790
- 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 -106
- 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/evaluation.ts +0 -105
- package/src/backends/mlx/fill-append.ts +0 -45
- 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 -130
- 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 -133
- 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/model-prompt.ts +0 -164
- package/src/backends/mlx/model-serving.ts +0 -79
- package/src/backends/mlx/prefill-cohort.ts +0 -89
- package/src/backends/mlx/prefill-rows.ts +0 -200
- package/src/backends/mlx/prefill.ts +0 -33
- package/src/backends/mlx/projected-context-rows.ts +0 -72
- package/src/backends/mlx/request-policy.ts +0 -20
- package/src/backends/mlx/request-state-policy.ts +0 -41
- package/src/backends/mlx/rollback.ts +0 -89
- package/src/backends/mlx/row-sampling.ts +0 -49
- package/src/backends/mlx/serial-executor.ts +0 -242
- package/src/backends/mlx/speculative-group.ts +0 -359
- package/src/backends/mlx/speculative-round.ts +0 -161
- package/src/backends/mlx/speculative.ts +0 -114
- 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 -165
- package/src/chat-template.ts +0 -382
- package/src/cli.ts +0 -3168
- package/src/config.ts +0 -399
- package/src/contracts/completion.ts +0 -16
- package/src/contracts/execution.ts +0 -60
- package/src/contracts/generation.ts +0 -103
- package/src/contracts/host.ts +0 -7
- package/src/contracts/pi-provider.ts +0 -30
- package/src/contracts/pi.ts +0 -259
- package/src/contracts/prefix-cache.ts +0 -23
- package/src/contracts/resources.ts +0 -25
- package/src/contracts/sampling.ts +0 -23
- package/src/contracts/scheduling.ts +0 -45
- 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 -53
- package/src/engine/resources.ts +0 -53
- package/src/engine/scheduler.ts +0 -72
- 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 -452
- 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 -1346
- package/src/grammar.ts +0 -591
- 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 -39
- 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 -257
- package/src/kv-store.ts +0 -1099
- package/src/lab/README.md +0 -18
- 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-kv-rows.ts +0 -83
- package/src/lab/paged-kv/paged-kv.ts +0 -270
- package/src/library.ts +0 -40
- package/src/lora.ts +0 -408
- package/src/md-modules.d.ts +0 -49
- 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 -388
- 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 -512
- package/src/mlx/materialize.ts +0 -23
- package/src/mlx/metal-kernel.ts +0 -159
- package/src/mlx/ops.ts +0 -1021
- 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 -93
- 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 -55
- package/src/model/diffusion-gemma.ts +0 -1026
- package/src/model/factory.ts +0 -189
- package/src/model/fingerprint.ts +0 -33
- 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 -2351
- package/src/model/gemma4.ts +0 -1315
- 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 -67
- package/src/model/minicpm5.ts +0 -376
- package/src/model/profile.ts +0 -443
- 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 -252
- package/src/model/qwen3.ts +0 -277
- package/src/model/qwen3_5-checkpoint.ts +0 -164
- package/src/model/qwen3_5.ts +0 -819
- 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 -102
- 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 -83
- 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/native/expert_io.c +0 -523
- package/src/native/frame_extract.swift +0 -140
- package/src/native-pack.ts +0 -162
- 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 -1932
- package/src/preflight.ts +0 -158
- package/src/prompt-cache.ts +0 -460
- 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 -81
- package/src/safetensors.ts +0 -158
- package/src/sampler.ts +0 -1011
- 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/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 -496
- 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 -43
- package/src/serve/model-host.ts +0 -511
- package/src/serve/parent-application.ts +0 -56
- package/src/serve/prompt-response-trace.ts +0 -147
- 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/server.ts +0 -1314
- package/src/spec/assistant-rows.ts +0 -92
- 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 -317
- package/src/spec/glm52-mtp-state.ts +0 -33
- package/src/spec/ngram-source.ts +0 -204
- 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 -219
- package/src/spec/qwen-mtp-source.ts +0 -383
- package/src/spec/qwen-mtp-state.ts +0 -30
- package/src/spec/serve-loop.ts +0 -585
- package/src/spec/source.ts +0 -215
- package/src/spec/two-model-rows.ts +0 -61
- package/src/spec/two-model.ts +0 -113
- package/src/ssd-cache.ts +0 -372
- package/src/ssd-durability.ts +0 -211
- 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 -168
- package/src/vision/preprocess.ts +0 -247
- package/src/vision/prompt.ts +0 -373
- package/src/vision/qwen3vl-preprocess.ts +0 -409
- package/src/vision/qwen3vl-prompt.ts +0 -196
- package/src/vision/qwen3vl-tower.ts +0 -555
- package/src/vision/siglip.ts +0 -599
- package/src/vision/video-frames.ts +0 -148
- package/src/web/app.html +0 -2143
- package/src/web/app.js +0 -5703
- 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 -1057
- package/src/web/src/composer.ts +0 -959
- 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/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/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/redirect.ts
DELETED
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
// mlx-bun memory — SUB-CONCEPT REDIRECTS ("you already know what I'm talking about").
|
|
2
|
-
//
|
|
3
|
-
// A subject the user discussed should always RESOLVE, even when it never earned
|
|
4
|
-
// its own article: it FOLDED into a broader article (routed/disambiguated to an
|
|
5
|
-
// existing home) or it was CAPTURED (kept in its chunk, not yet articled). Either
|
|
6
|
-
// way we record a redirect edge — a `(surface → home article stem)` row in the
|
|
7
|
-
// `subject_redirects` ledger — so the surface resolves to its home instead of a
|
|
8
|
-
// bare NOT FOUND.
|
|
9
|
-
//
|
|
10
|
-
// `subject_redirects` is LEDGER state (like buckets / chunk_entities): it is NOT
|
|
11
|
-
// reconstructable from the vault, so reindex never deletes it. Instead reindex
|
|
12
|
-
// PROJECTS each edge whose target article still exists into the derived
|
|
13
|
-
// `entity_aliases` table, so `resolveName` finds the surface → its home article
|
|
14
|
-
// with no extra lookup path. Registration is idempotent (INSERT OR IGNORE on the
|
|
15
|
-
// (surface, target_stem) PK); a fold and a later capture of the same surface both
|
|
16
|
-
// just point at the same home.
|
|
17
|
-
|
|
18
|
-
import type { MemoryStore } from "./db";
|
|
19
|
-
|
|
20
|
-
/** How a sub-concept reached its home article: it FOLDED into a broader existing
|
|
21
|
-
* article, or it was CAPTURED (no own article yet) and points at its most-related
|
|
22
|
-
* article. Informational only — both resolve identically. */
|
|
23
|
-
export type RedirectKind = "fold" | "capture";
|
|
24
|
-
|
|
25
|
-
export interface RedirectRow {
|
|
26
|
-
surface: string;
|
|
27
|
-
target_stem: string;
|
|
28
|
-
kind: RedirectKind;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Register a `surface → target_stem` redirect (idempotent). Returns true when a
|
|
33
|
-
* new edge was written. A blank surface, a self-pointing redirect (surface ==
|
|
34
|
-
* stem title), or a blank target is ignored.
|
|
35
|
-
*/
|
|
36
|
-
export function registerRedirect(
|
|
37
|
-
store: MemoryStore,
|
|
38
|
-
surface: string,
|
|
39
|
-
targetStem: string,
|
|
40
|
-
kind: RedirectKind,
|
|
41
|
-
): boolean {
|
|
42
|
-
const s = surface.trim();
|
|
43
|
-
const t = targetStem.trim();
|
|
44
|
-
if (!s || !t) return false;
|
|
45
|
-
if (s === t || s === t.replace(/_/g, " ")) return false; // surface IS the title
|
|
46
|
-
const r = store.db
|
|
47
|
-
.query("INSERT OR IGNORE INTO subject_redirects (surface, target_stem, kind) VALUES (?, ?, ?)")
|
|
48
|
-
.run(s, t, kind);
|
|
49
|
-
return r.changes > 0;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/** Every redirect edge (sorted) — the reindex projection input. */
|
|
53
|
-
export function listRedirects(store: MemoryStore): RedirectRow[] {
|
|
54
|
-
return store.db
|
|
55
|
-
.query("SELECT surface, target_stem, kind FROM subject_redirects ORDER BY surface, target_stem")
|
|
56
|
-
.all() as RedirectRow[];
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* The article a CAPTURED subject most relates to: the article-homed entity that
|
|
61
|
-
* co-occurs with it in the most chunks (deterministic — ties break by name). This
|
|
62
|
-
* is the "surface it via its neighbourhood" signal a captured subject points at,
|
|
63
|
-
* so it resolves to the article it was discussed alongside rather than NOT FOUND.
|
|
64
|
-
* Returns the related entity's `article_stem`, or null when it co-occurs with no
|
|
65
|
-
* homed article (the read path then falls back to memory_search over its chunk).
|
|
66
|
-
* `chunkSet`, when given, restricts co-occurrence to a run's chunks.
|
|
67
|
-
*/
|
|
68
|
-
export function relatedArticleStem(
|
|
69
|
-
store: MemoryStore,
|
|
70
|
-
entity: string,
|
|
71
|
-
chunkSet?: Set<string>,
|
|
72
|
-
): string | null {
|
|
73
|
-
const rows = store.db
|
|
74
|
-
.query(
|
|
75
|
-
"SELECT e.article_stem AS stem, COUNT(*) AS c FROM chunk_entities ce1 " +
|
|
76
|
-
"JOIN chunk_entities ce2 ON ce2.chunk_id = ce1.chunk_id " +
|
|
77
|
-
"JOIN entities e ON e.name = ce2.entity_name " +
|
|
78
|
-
"WHERE ce1.entity_name = ? AND ce2.entity_name <> ? " +
|
|
79
|
-
"AND e.article_stem IS NOT NULL AND e.notable = 1 " +
|
|
80
|
-
"GROUP BY ce2.entity_name ORDER BY c DESC, ce2.entity_name ASC",
|
|
81
|
-
)
|
|
82
|
-
.all(entity, entity) as { stem: string; c: number }[];
|
|
83
|
-
if (!chunkSet) return rows[0]?.stem ?? null;
|
|
84
|
-
// Re-score within the run's chunk set when one is given.
|
|
85
|
-
const scored = new Map<string, number>();
|
|
86
|
-
const co = store.db
|
|
87
|
-
.query(
|
|
88
|
-
"SELECT ce1.chunk_id AS chunk_id, e.article_stem AS stem FROM chunk_entities ce1 " +
|
|
89
|
-
"JOIN chunk_entities ce2 ON ce2.chunk_id = ce1.chunk_id " +
|
|
90
|
-
"JOIN entities e ON e.name = ce2.entity_name " +
|
|
91
|
-
"WHERE ce1.entity_name = ? AND ce2.entity_name <> ? " +
|
|
92
|
-
"AND e.article_stem IS NOT NULL AND e.notable = 1",
|
|
93
|
-
)
|
|
94
|
-
.all(entity, entity) as { chunk_id: string; stem: string }[];
|
|
95
|
-
for (const r of co) {
|
|
96
|
-
if (!chunkSet.has(r.chunk_id)) continue;
|
|
97
|
-
scored.set(r.stem, (scored.get(r.stem) ?? 0) + 1);
|
|
98
|
-
}
|
|
99
|
-
let best: string | null = null;
|
|
100
|
-
let bestC = 0;
|
|
101
|
-
for (const [stem, c] of [...scored].sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))) {
|
|
102
|
-
if (c > bestC) {
|
|
103
|
-
best = stem;
|
|
104
|
-
bestC = c;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
return best;
|
|
108
|
-
}
|
package/src/memory/reindex.ts
DELETED
|
@@ -1,325 +0,0 @@
|
|
|
1
|
-
// mlx-bun memory — reindex the derived cache from the markdown vault.
|
|
2
|
-
//
|
|
3
|
-
// The vault is truth; the DB's derived tables are a cache. `reindex` rebuilds
|
|
4
|
-
// them to MATCH the markdown — never the reverse. It drops and rebuilds exactly
|
|
5
|
-
// six tables purely from the article files via the P0-T2 parser:
|
|
6
|
-
//
|
|
7
|
-
// entities · entity_aliases · categories · article_categories ·
|
|
8
|
-
// infobox_facts · links
|
|
9
|
-
//
|
|
10
|
-
// Pipeline-state tables (messages, chunks, chunk_*, synthesized_*, watermarks,
|
|
11
|
-
// buckets) are the synthesis ledger and are left UNTOUCHED. Foreign keys are
|
|
12
|
-
// disabled across the rebuild so deleting+recreating `entities` does not cascade
|
|
13
|
-
// into the pipeline's `chunk_entities` rows (which reference entities ON DELETE
|
|
14
|
-
// CASCADE) — those are ledger state, not derivable from the vault.
|
|
15
|
-
//
|
|
16
|
-
// Determinism is a contract: reindexing the same vault into a fresh DB twice
|
|
17
|
-
// yields byte-identical derived tables (articles are visited in sorted-stem
|
|
18
|
-
// order; rows are inserted deterministically). See P2-T2.
|
|
19
|
-
|
|
20
|
-
import { readFileSync, readdirSync } from "node:fs";
|
|
21
|
-
import { join } from "node:path";
|
|
22
|
-
|
|
23
|
-
import {
|
|
24
|
-
deriveCategories,
|
|
25
|
-
infoboxFieldValues,
|
|
26
|
-
parseInfobox,
|
|
27
|
-
parseSeriesBanner,
|
|
28
|
-
type InfoboxField,
|
|
29
|
-
} from "./article";
|
|
30
|
-
import type { MemoryStore } from "./db";
|
|
31
|
-
import { listRedirects } from "./redirect";
|
|
32
|
-
import { EntityResolver, nearNameMatch } from "./resolve";
|
|
33
|
-
import { articlesDir, resolveWikilinkToStem, vaultRoot } from "./vault";
|
|
34
|
-
|
|
35
|
-
// ---- normalization helpers -------------------------------------------
|
|
36
|
-
|
|
37
|
-
/** Casefold + collapse whitespace/underscores so title, stem, and alias forms
|
|
38
|
-
* of the same surface text key the entity index identically. */
|
|
39
|
-
function normalizeAlias(s: string): string {
|
|
40
|
-
return s.trim().toLowerCase().replace(/_/g, " ").replace(/\s+/g, " ").trim();
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
const WIKILINK_RE = /\[\[([^\]]+)\]\]/;
|
|
44
|
-
const DATE_RE = /^\d{4}-\d{2}(-\d{2})?$/;
|
|
45
|
-
const MAIN_BANNER_RES = [
|
|
46
|
-
/\{\{\s*Main\s*\|\s*([^}]+)\}\}/i, // {{Main|Target}}
|
|
47
|
-
/^\*?\s*Main article:\s*\[\[([^\]]+)\]\]\s*\.?\*?$/i, // *Main article: [[Target]]*
|
|
48
|
-
];
|
|
49
|
-
|
|
50
|
-
/** The inner target of a `[[wikilink]]` value, before any `|alias`/`#anchor`. */
|
|
51
|
-
function wikilinkInner(value: string): string {
|
|
52
|
-
const m = WIKILINK_RE.exec(value);
|
|
53
|
-
if (!m) return "";
|
|
54
|
-
return m[1]!.split("|")[0]!.split("#")[0]!.trim();
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/** Resolve a wikilink target to an existing article stem, else its underscored
|
|
58
|
-
* form (a not-yet-written "red link" still carries a stable graph key). */
|
|
59
|
-
function linkStem(target: string, stems: Set<string>): string {
|
|
60
|
-
const base = target.split("|")[0]!.split("#")[0]!.trim();
|
|
61
|
-
return resolveWikilinkToStem(base, stems) ?? base.replace(/\s+/g, "_");
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
function elementKind(value: string): string {
|
|
65
|
-
if (WIKILINK_RE.test(value)) return "entity-link";
|
|
66
|
-
if (DATE_RE.test(value.trim())) return "date";
|
|
67
|
-
return "scalar";
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// ---- result ----------------------------------------------------------
|
|
71
|
-
|
|
72
|
-
export interface ReindexResult {
|
|
73
|
-
articles: number;
|
|
74
|
-
entities: number;
|
|
75
|
-
aliases: number;
|
|
76
|
-
categories: number;
|
|
77
|
-
articleCategories: number;
|
|
78
|
-
facts: number;
|
|
79
|
-
links: number;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
// ---- the rebuild ------------------------------------------------------
|
|
83
|
-
|
|
84
|
-
/** Sorted article stems under `<root>/articles/` (`*.md`, no hidden files). */
|
|
85
|
-
function listArticleStems(root: string): string[] {
|
|
86
|
-
let names: string[];
|
|
87
|
-
try {
|
|
88
|
-
names = readdirSync(articlesDir(root));
|
|
89
|
-
} catch {
|
|
90
|
-
return [];
|
|
91
|
-
}
|
|
92
|
-
return names
|
|
93
|
-
.filter((n) => n.endsWith(".md") && !n.startsWith("."))
|
|
94
|
-
.map((n) => n.slice(0, -3))
|
|
95
|
-
.sort((a, b) => a.localeCompare(b));
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Rebuild the derived cache from the markdown vault. Idempotent and
|
|
100
|
-
* deterministic: same vault → byte-identical derived tables.
|
|
101
|
-
*/
|
|
102
|
-
export function reindex(store: MemoryStore, root: string = vaultRoot()): ReindexResult {
|
|
103
|
-
const db = store.db;
|
|
104
|
-
const stems = listArticleStems(root);
|
|
105
|
-
const stemSet = new Set(stems);
|
|
106
|
-
|
|
107
|
-
const result: ReindexResult = {
|
|
108
|
-
articles: stems.length,
|
|
109
|
-
entities: 0,
|
|
110
|
-
aliases: 0,
|
|
111
|
-
categories: 0,
|
|
112
|
-
articleCategories: 0,
|
|
113
|
-
facts: 0,
|
|
114
|
-
links: 0,
|
|
115
|
-
};
|
|
116
|
-
|
|
117
|
-
// FK off so dropping `entities` does not cascade into the pipeline ledger
|
|
118
|
-
// (`chunk_entities`). PRAGMA cannot change inside a transaction, so set it
|
|
119
|
-
// around the transactional rebuild.
|
|
120
|
-
// Sub-concept redirect edges (fold/capture) projected into entity_aliases below,
|
|
121
|
-
// so a discussed subject resolves to its home article. Read before the rebuild
|
|
122
|
-
// transaction; an older DB without the table yields none.
|
|
123
|
-
let redirects: { surface: string; target_stem: string }[] = [];
|
|
124
|
-
try {
|
|
125
|
-
redirects = listRedirects(store);
|
|
126
|
-
} catch {
|
|
127
|
-
redirects = [];
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
db.exec("PRAGMA foreign_keys = OFF");
|
|
131
|
-
try {
|
|
132
|
-
db.transaction(() => {
|
|
133
|
-
// Drop the six derived tables (children first for clarity).
|
|
134
|
-
db.exec("DELETE FROM links");
|
|
135
|
-
db.exec("DELETE FROM infobox_facts");
|
|
136
|
-
db.exec("DELETE FROM article_categories");
|
|
137
|
-
db.exec("DELETE FROM categories");
|
|
138
|
-
db.exec("DELETE FROM entity_aliases");
|
|
139
|
-
db.exec("DELETE FROM entities");
|
|
140
|
-
|
|
141
|
-
const insEntity = db.query(
|
|
142
|
-
"INSERT OR IGNORE INTO entities (name, article_stem, kind, notable) VALUES (?, ?, ?, 0)",
|
|
143
|
-
);
|
|
144
|
-
const insAlias = db.query("INSERT OR IGNORE INTO entity_aliases (alias, entity_name) VALUES (?, ?)");
|
|
145
|
-
const insCategory = db.query("INSERT OR IGNORE INTO categories (name) VALUES (?)");
|
|
146
|
-
const insArtCat = db.query(
|
|
147
|
-
"INSERT OR IGNORE INTO article_categories (article_stem, category, source) VALUES (?, ?, ?)",
|
|
148
|
-
);
|
|
149
|
-
const insFact = db.query(
|
|
150
|
-
"INSERT OR IGNORE INTO infobox_facts (article_stem, key, value, kind, entity_link) VALUES (?, ?, ?, ?, ?)",
|
|
151
|
-
);
|
|
152
|
-
const insLink = db.query("INSERT OR IGNORE INTO links (src_stem, dst_stem, via) VALUES (?, ?, ?)");
|
|
153
|
-
|
|
154
|
-
const addLink = (dst: string, via: string, src: string): void => {
|
|
155
|
-
if (!dst || dst === src) return;
|
|
156
|
-
const r = insLink.run(src, dst, via);
|
|
157
|
-
if (r.changes) result.links++;
|
|
158
|
-
};
|
|
159
|
-
const addAlias = (raw: string, entity: string): void => {
|
|
160
|
-
const a = normalizeAlias(raw);
|
|
161
|
-
if (!a) return;
|
|
162
|
-
const r = insAlias.run(a, entity);
|
|
163
|
-
if (r.changes) result.aliases++;
|
|
164
|
-
};
|
|
165
|
-
|
|
166
|
-
for (const stem of stems) {
|
|
167
|
-
let content: string;
|
|
168
|
-
try {
|
|
169
|
-
content = readFileSync(join(articlesDir(root), `${stem}.md`), "utf8");
|
|
170
|
-
} catch {
|
|
171
|
-
continue;
|
|
172
|
-
}
|
|
173
|
-
const box = parseInfobox(content);
|
|
174
|
-
|
|
175
|
-
// entities: one row per article; kind from the explicit infobox kind:.
|
|
176
|
-
const kind = box ? box.entityKind : "thing";
|
|
177
|
-
if (insEntity.run(stem, stem, kind).changes) result.entities++;
|
|
178
|
-
|
|
179
|
-
// entity_aliases: title (stem→spaces) + the stem itself + infobox aliases.
|
|
180
|
-
addAlias(stem, stem);
|
|
181
|
-
addAlias(stem.replace(/_/g, " "), stem);
|
|
182
|
-
if (box) {
|
|
183
|
-
const aliasField = box.fields.find((f) => f.key === "aliases");
|
|
184
|
-
if (aliasField) for (const a of infoboxFieldValues(aliasField)) addAlias(a, stem);
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
// categories + article_categories: from explicit [[Category:…]] declarations.
|
|
188
|
-
const derived = deriveCategories(content, stem);
|
|
189
|
-
for (const cat of derived.categories) {
|
|
190
|
-
if (insCategory.run(cat).changes) result.categories++;
|
|
191
|
-
}
|
|
192
|
-
for (const row of derived.categoryRows) {
|
|
193
|
-
if (insArtCat.run(row.article_stem, row.category, row.source).changes) result.articleCategories++;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
// infobox_facts: one row per (split) field value, with element kind +
|
|
197
|
-
// resolved entity_link; infobox entity-values also feed the link graph.
|
|
198
|
-
if (box) {
|
|
199
|
-
for (const field of box.fields) emitFieldFacts(field, stem, stemSet, insFact, addLink, result);
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
// links: prose [[links]] (See-also tagged distinctly), series + main banners.
|
|
203
|
-
emitProseLinks(content, stem, stemSet, addLink);
|
|
204
|
-
const series = parseSeriesBanner(content);
|
|
205
|
-
if (series) addLink(linkStem(series, stemSet), "series", stem);
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
// Project the sub-concept redirect ledger into entity_aliases: a fold/capture
|
|
209
|
-
// surface becomes an alias of its home article (only when that article still
|
|
210
|
-
// exists), so resolveName reaches it. Articles are truth — a redirect never
|
|
211
|
-
// overrides a real alias (INSERT OR IGNORE keeps the first writer).
|
|
212
|
-
for (const r of redirects) {
|
|
213
|
-
if (stemSet.has(r.target_stem)) addAlias(r.surface, r.target_stem);
|
|
214
|
-
}
|
|
215
|
-
})();
|
|
216
|
-
} finally {
|
|
217
|
-
db.exec("PRAGMA foreign_keys = ON");
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
return result;
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
function emitFieldFacts(
|
|
224
|
-
field: InfoboxField,
|
|
225
|
-
stem: string,
|
|
226
|
-
stems: Set<string>,
|
|
227
|
-
insFact: ReturnType<MemoryStore["db"]["query"]>,
|
|
228
|
-
addLink: (dst: string, via: string, src: string) => void,
|
|
229
|
-
result: ReindexResult,
|
|
230
|
-
): void {
|
|
231
|
-
for (const value of infoboxFieldValues(field)) {
|
|
232
|
-
const isLink = WIKILINK_RE.test(value);
|
|
233
|
-
const entityLink = isLink ? linkStem(wikilinkInner(value), stems) : null;
|
|
234
|
-
const r = insFact.run(stem, field.key, value, elementKind(value), entityLink);
|
|
235
|
-
if (r.changes) result.facts++;
|
|
236
|
-
if (isLink && entityLink) addLink(entityLink, "infobox", stem);
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
function emitProseLinks(
|
|
241
|
-
content: string,
|
|
242
|
-
stem: string,
|
|
243
|
-
stems: Set<string>,
|
|
244
|
-
addLink: (dst: string, via: string, src: string) => void,
|
|
245
|
-
): void {
|
|
246
|
-
const lines = content.split(/\r?\n/);
|
|
247
|
-
const inner = /\[\[([^\]]+)\]\]/g;
|
|
248
|
-
let inFence = false;
|
|
249
|
-
let section: string | null = null;
|
|
250
|
-
for (const rawLine of lines) {
|
|
251
|
-
const line = rawLine;
|
|
252
|
-
if (/^```/.test(line)) {
|
|
253
|
-
inFence = !inFence;
|
|
254
|
-
continue;
|
|
255
|
-
}
|
|
256
|
-
if (inFence) continue;
|
|
257
|
-
const t = line.trim();
|
|
258
|
-
|
|
259
|
-
const hm = /^(#{1,6})\s+(.+)$/.exec(line);
|
|
260
|
-
if (hm) {
|
|
261
|
-
section = hm[1]!.length >= 2 ? hm[2]!.trim().toLowerCase() : section;
|
|
262
|
-
continue;
|
|
263
|
-
}
|
|
264
|
-
if (/^\*Part of a series on \[\[/.test(t)) continue; // series banner: tagged elsewhere
|
|
265
|
-
if (/^categories:/i.test(t)) continue; // category declaration: not a graph edge
|
|
266
|
-
|
|
267
|
-
// {{Main}} / *Main article: [[X]]* — a parent→child split edge.
|
|
268
|
-
let mainHit = false;
|
|
269
|
-
for (const re of MAIN_BANNER_RES) {
|
|
270
|
-
const m = re.exec(t);
|
|
271
|
-
if (m) {
|
|
272
|
-
addLink(linkStem(m[1]!.trim(), stems), "main", stem);
|
|
273
|
-
mainHit = true;
|
|
274
|
-
break;
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
if (mainHit) continue;
|
|
278
|
-
|
|
279
|
-
const via = section === "see also" ? "seealso" : "prose";
|
|
280
|
-
inner.lastIndex = 0;
|
|
281
|
-
let m: RegExpExecArray | null;
|
|
282
|
-
while ((m = inner.exec(line)) !== null) {
|
|
283
|
-
const base = m[1]!.split("|")[0]!.split("#")[0]!.trim();
|
|
284
|
-
if (!base || /^conv:/i.test(base) || /^Category:/i.test(base)) continue;
|
|
285
|
-
addLink(linkStem(base, stems), via, stem);
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
// ---- name resolution -------------------------------------------------
|
|
291
|
-
|
|
292
|
-
const LEADING_ARTICLE_RE = /^(?:the|a|an)\s+/;
|
|
293
|
-
|
|
294
|
-
/**
|
|
295
|
-
* Resolve an entity name or alias to its article stem via `entity_aliases`.
|
|
296
|
-
* Normalizes the query the same way aliases are stored (casefold, ws-collapse)
|
|
297
|
-
* and also tries with a leading article word ("the"/"a"/"an") stripped, so
|
|
298
|
-
* a "<the brand model>" surface and a "<model>" short form both reach the same stem.
|
|
299
|
-
*/
|
|
300
|
-
export function resolveName(store: MemoryStore, nameOrAlias: string): string | null {
|
|
301
|
-
const q = normalizeAlias(nameOrAlias);
|
|
302
|
-
const candidates = [q, q.replace(LEADING_ARTICLE_RE, "")];
|
|
303
|
-
const stmt = store.db.query("SELECT entity_name FROM entity_aliases WHERE alias = ? LIMIT 1");
|
|
304
|
-
for (const c of candidates) {
|
|
305
|
-
if (!c) continue;
|
|
306
|
-
const row = stmt.get(c) as { entity_name: string } | null;
|
|
307
|
-
if (row) return row.entity_name;
|
|
308
|
-
}
|
|
309
|
-
// NEAR-NAME fallback: a discussed sub-concept that is plainly the same subject
|
|
310
|
-
// as an existing entity — the title minus a generic suffix ("<subject>" for a
|
|
311
|
-
// "<subject> Theory") — resolves via the conservative token-subset fuzzy. A
|
|
312
|
-
// distinct subject or a purely-generic query does not. No model, no embedding.
|
|
313
|
-
return nearNameMatch(EntityResolver.fromStore(store), q);
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
// ---- category lookup -------------------------------------------------
|
|
317
|
-
|
|
318
|
-
/** Article stems that DECLARED `[[Category:<category>]]` — the only "about X"
|
|
319
|
-
* mechanism (zero substring false positives). */
|
|
320
|
-
export function articlesInCategory(store: MemoryStore, category: string): string[] {
|
|
321
|
-
const rows = store.db
|
|
322
|
-
.query("SELECT article_stem FROM article_categories WHERE category = ? ORDER BY article_stem")
|
|
323
|
-
.all(category) as { article_stem: string }[];
|
|
324
|
-
return rows.map((r) => r.article_stem);
|
|
325
|
-
}
|