causantic 0.2.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/LICENSE +19 -0
- package/README.md +332 -0
- package/config.schema.json +254 -0
- package/dist/cli/commands/archive.d.ts +4 -0
- package/dist/cli/commands/archive.d.ts.map +1 -0
- package/dist/cli/commands/archive.js +76 -0
- package/dist/cli/commands/archive.js.map +1 -0
- package/dist/cli/commands/benchmark-collection.d.ts +8 -0
- package/dist/cli/commands/benchmark-collection.d.ts.map +1 -0
- package/dist/cli/commands/benchmark-collection.js +146 -0
- package/dist/cli/commands/benchmark-collection.js.map +1 -0
- package/dist/cli/commands/config.d.ts +3 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +69 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/dashboard.d.ts +3 -0
- package/dist/cli/commands/dashboard.d.ts.map +1 -0
- package/dist/cli/commands/dashboard.js +12 -0
- package/dist/cli/commands/dashboard.js.map +1 -0
- package/dist/cli/commands/encryption.d.ts +3 -0
- package/dist/cli/commands/encryption.d.ts.map +1 -0
- package/dist/cli/commands/encryption.js +207 -0
- package/dist/cli/commands/encryption.js.map +1 -0
- package/dist/cli/commands/hook.d.ts +3 -0
- package/dist/cli/commands/hook.d.ts.map +1 -0
- package/dist/cli/commands/hook.js +35 -0
- package/dist/cli/commands/hook.js.map +1 -0
- package/dist/cli/commands/ingest.d.ts +4 -0
- package/dist/cli/commands/ingest.d.ts.map +1 -0
- package/dist/cli/commands/ingest.js +31 -0
- package/dist/cli/commands/ingest.js.map +1 -0
- package/dist/cli/commands/init.d.ts +3 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +680 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/maintenance.d.ts +3 -0
- package/dist/cli/commands/maintenance.d.ts.map +1 -0
- package/dist/cli/commands/maintenance.js +67 -0
- package/dist/cli/commands/maintenance.js.map +1 -0
- package/dist/cli/commands/search.d.ts +3 -0
- package/dist/cli/commands/search.d.ts.map +1 -0
- package/dist/cli/commands/search.js +16 -0
- package/dist/cli/commands/search.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +3 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +19 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/stats.d.ts +4 -0
- package/dist/cli/commands/stats.d.ts.map +1 -0
- package/dist/cli/commands/stats.js +49 -0
- package/dist/cli/commands/stats.js.map +1 -0
- package/dist/cli/commands/uninstall.d.ts +3 -0
- package/dist/cli/commands/uninstall.d.ts.map +1 -0
- package/dist/cli/commands/uninstall.js +10 -0
- package/dist/cli/commands/uninstall.js.map +1 -0
- package/dist/cli/index.d.ts +8 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +86 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/skill-templates.d.ts +19 -0
- package/dist/cli/skill-templates.d.ts.map +1 -0
- package/dist/cli/skill-templates.js +1128 -0
- package/dist/cli/skill-templates.js.map +1 -0
- package/dist/cli/types.d.ts +10 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +5 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/cli/uninstall.d.ts +66 -0
- package/dist/cli/uninstall.d.ts.map +1 -0
- package/dist/cli/uninstall.js +490 -0
- package/dist/cli/uninstall.js.map +1 -0
- package/dist/cli/utils.d.ts +26 -0
- package/dist/cli/utils.d.ts.map +1 -0
- package/dist/cli/utils.js +105 -0
- package/dist/cli/utils.js.map +1 -0
- package/dist/clusters/cluster-manager.d.ts +96 -0
- package/dist/clusters/cluster-manager.d.ts.map +1 -0
- package/dist/clusters/cluster-manager.js +321 -0
- package/dist/clusters/cluster-manager.js.map +1 -0
- package/dist/clusters/cluster-refresh.d.ts +56 -0
- package/dist/clusters/cluster-refresh.d.ts.map +1 -0
- package/dist/clusters/cluster-refresh.js +187 -0
- package/dist/clusters/cluster-refresh.js.map +1 -0
- package/dist/clusters/hdbscan/cluster-extraction.d.ts +26 -0
- package/dist/clusters/hdbscan/cluster-extraction.d.ts.map +1 -0
- package/dist/clusters/hdbscan/cluster-extraction.js +232 -0
- package/dist/clusters/hdbscan/cluster-extraction.js.map +1 -0
- package/dist/clusters/hdbscan/core-distance-worker.d.ts +6 -0
- package/dist/clusters/hdbscan/core-distance-worker.d.ts.map +1 -0
- package/dist/clusters/hdbscan/core-distance-worker.js +54 -0
- package/dist/clusters/hdbscan/core-distance-worker.js.map +1 -0
- package/dist/clusters/hdbscan/core-distance.d.ts +26 -0
- package/dist/clusters/hdbscan/core-distance.d.ts.map +1 -0
- package/dist/clusters/hdbscan/core-distance.js +94 -0
- package/dist/clusters/hdbscan/core-distance.js.map +1 -0
- package/dist/clusters/hdbscan/distance-cache.d.ts +46 -0
- package/dist/clusters/hdbscan/distance-cache.d.ts.map +1 -0
- package/dist/clusters/hdbscan/distance-cache.js +84 -0
- package/dist/clusters/hdbscan/distance-cache.js.map +1 -0
- package/dist/clusters/hdbscan/hierarchy.d.ts +34 -0
- package/dist/clusters/hdbscan/hierarchy.d.ts.map +1 -0
- package/dist/clusters/hdbscan/hierarchy.js +442 -0
- package/dist/clusters/hdbscan/hierarchy.js.map +1 -0
- package/dist/clusters/hdbscan/incremental.d.ts +30 -0
- package/dist/clusters/hdbscan/incremental.d.ts.map +1 -0
- package/dist/clusters/hdbscan/incremental.js +130 -0
- package/dist/clusters/hdbscan/incremental.js.map +1 -0
- package/dist/clusters/hdbscan/kd-tree.d.ts +51 -0
- package/dist/clusters/hdbscan/kd-tree.d.ts.map +1 -0
- package/dist/clusters/hdbscan/kd-tree.js +130 -0
- package/dist/clusters/hdbscan/kd-tree.js.map +1 -0
- package/dist/clusters/hdbscan/min-heap.d.ts +62 -0
- package/dist/clusters/hdbscan/min-heap.d.ts.map +1 -0
- package/dist/clusters/hdbscan/min-heap.js +139 -0
- package/dist/clusters/hdbscan/min-heap.js.map +1 -0
- package/dist/clusters/hdbscan/mst.d.ts +20 -0
- package/dist/clusters/hdbscan/mst.d.ts.map +1 -0
- package/dist/clusters/hdbscan/mst.js +77 -0
- package/dist/clusters/hdbscan/mst.js.map +1 -0
- package/dist/clusters/hdbscan/probabilities.d.ts +37 -0
- package/dist/clusters/hdbscan/probabilities.d.ts.map +1 -0
- package/dist/clusters/hdbscan/probabilities.js +149 -0
- package/dist/clusters/hdbscan/probabilities.js.map +1 -0
- package/dist/clusters/hdbscan/types.d.ts +123 -0
- package/dist/clusters/hdbscan/types.d.ts.map +1 -0
- package/dist/clusters/hdbscan/types.js +5 -0
- package/dist/clusters/hdbscan/types.js.map +1 -0
- package/dist/clusters/hdbscan/union-find.d.ts +51 -0
- package/dist/clusters/hdbscan/union-find.d.ts.map +1 -0
- package/dist/clusters/hdbscan/union-find.js +115 -0
- package/dist/clusters/hdbscan/union-find.js.map +1 -0
- package/dist/clusters/hdbscan.d.ts +71 -0
- package/dist/clusters/hdbscan.d.ts.map +1 -0
- package/dist/clusters/hdbscan.js +283 -0
- package/dist/clusters/hdbscan.js.map +1 -0
- package/dist/clusters/index.d.ts +8 -0
- package/dist/clusters/index.d.ts.map +1 -0
- package/dist/clusters/index.js +8 -0
- package/dist/clusters/index.js.map +1 -0
- package/dist/config/index.d.ts +6 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +6 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +105 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +339 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/memory-config.d.ts +109 -0
- package/dist/config/memory-config.d.ts.map +1 -0
- package/dist/config/memory-config.js +182 -0
- package/dist/config/memory-config.js.map +1 -0
- package/dist/core/benchmark-types.d.ts +62 -0
- package/dist/core/benchmark-types.d.ts.map +1 -0
- package/dist/core/benchmark-types.js +11 -0
- package/dist/core/benchmark-types.js.map +1 -0
- package/dist/core/decay-types.d.ts +111 -0
- package/dist/core/decay-types.d.ts.map +1 -0
- package/dist/core/decay-types.js +30 -0
- package/dist/core/decay-types.js.map +1 -0
- package/dist/core/index.d.ts +11 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +9 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/lexical-features.d.ts +34 -0
- package/dist/core/lexical-features.d.ts.map +1 -0
- package/dist/core/lexical-features.js +155 -0
- package/dist/core/lexical-features.js.map +1 -0
- package/dist/dashboard/client/assets/index-CMUKy4f9.css +1 -0
- package/dist/dashboard/client/assets/index-esv8TpCN.js +168 -0
- package/dist/dashboard/client/index.html +14 -0
- package/dist/dashboard/middleware/async-handler.d.ts +11 -0
- package/dist/dashboard/middleware/async-handler.d.ts.map +1 -0
- package/dist/dashboard/middleware/async-handler.js +12 -0
- package/dist/dashboard/middleware/async-handler.js.map +1 -0
- package/dist/dashboard/middleware/error-handler.d.ts +9 -0
- package/dist/dashboard/middleware/error-handler.d.ts.map +1 -0
- package/dist/dashboard/middleware/error-handler.js +14 -0
- package/dist/dashboard/middleware/error-handler.js.map +1 -0
- package/dist/dashboard/routes/benchmark-collection.d.ts +11 -0
- package/dist/dashboard/routes/benchmark-collection.d.ts.map +1 -0
- package/dist/dashboard/routes/benchmark-collection.js +49 -0
- package/dist/dashboard/routes/benchmark-collection.js.map +1 -0
- package/dist/dashboard/routes/chunks.d.ts +3 -0
- package/dist/dashboard/routes/chunks.d.ts.map +1 -0
- package/dist/dashboard/routes/chunks.js +25 -0
- package/dist/dashboard/routes/chunks.js.map +1 -0
- package/dist/dashboard/routes/clusters.d.ts +3 -0
- package/dist/dashboard/routes/clusters.d.ts.map +1 -0
- package/dist/dashboard/routes/clusters.js +28 -0
- package/dist/dashboard/routes/clusters.js.map +1 -0
- package/dist/dashboard/routes/edges.d.ts +3 -0
- package/dist/dashboard/routes/edges.d.ts.map +1 -0
- package/dist/dashboard/routes/edges.js +32 -0
- package/dist/dashboard/routes/edges.js.map +1 -0
- package/dist/dashboard/routes/graph.d.ts +3 -0
- package/dist/dashboard/routes/graph.d.ts.map +1 -0
- package/dist/dashboard/routes/graph.js +158 -0
- package/dist/dashboard/routes/graph.js.map +1 -0
- package/dist/dashboard/routes/projects.d.ts +3 -0
- package/dist/dashboard/routes/projects.d.ts.map +1 -0
- package/dist/dashboard/routes/projects.js +9 -0
- package/dist/dashboard/routes/projects.js.map +1 -0
- package/dist/dashboard/routes/search.d.ts +3 -0
- package/dist/dashboard/routes/search.d.ts.map +1 -0
- package/dist/dashboard/routes/search.js +105 -0
- package/dist/dashboard/routes/search.js.map +1 -0
- package/dist/dashboard/routes/sessions.d.ts +3 -0
- package/dist/dashboard/routes/sessions.d.ts.map +1 -0
- package/dist/dashboard/routes/sessions.js +16 -0
- package/dist/dashboard/routes/sessions.js.map +1 -0
- package/dist/dashboard/routes/stats.d.ts +3 -0
- package/dist/dashboard/routes/stats.d.ts.map +1 -0
- package/dist/dashboard/routes/stats.js +38 -0
- package/dist/dashboard/routes/stats.js.map +1 -0
- package/dist/dashboard/server.d.ts +3 -0
- package/dist/dashboard/server.d.ts.map +1 -0
- package/dist/dashboard/server.js +85 -0
- package/dist/dashboard/server.js.map +1 -0
- package/dist/eval/annotation-schema.d.ts +41 -0
- package/dist/eval/annotation-schema.d.ts.map +1 -0
- package/dist/eval/annotation-schema.js +171 -0
- package/dist/eval/annotation-schema.js.map +1 -0
- package/dist/eval/benchmark-runner.d.ts +15 -0
- package/dist/eval/benchmark-runner.d.ts.map +1 -0
- package/dist/eval/benchmark-runner.js +93 -0
- package/dist/eval/benchmark-runner.js.map +1 -0
- package/dist/eval/cluster-evaluator.d.ts +39 -0
- package/dist/eval/cluster-evaluator.d.ts.map +1 -0
- package/dist/eval/cluster-evaluator.js +51 -0
- package/dist/eval/cluster-evaluator.js.map +1 -0
- package/dist/eval/code-nl-alignment.d.ts +25 -0
- package/dist/eval/code-nl-alignment.d.ts.map +1 -0
- package/dist/eval/code-nl-alignment.js +49 -0
- package/dist/eval/code-nl-alignment.js.map +1 -0
- package/dist/eval/collection-benchmark/graph-value.d.ts +16 -0
- package/dist/eval/collection-benchmark/graph-value.d.ts.map +1 -0
- package/dist/eval/collection-benchmark/graph-value.js +162 -0
- package/dist/eval/collection-benchmark/graph-value.js.map +1 -0
- package/dist/eval/collection-benchmark/health.d.ts +12 -0
- package/dist/eval/collection-benchmark/health.d.ts.map +1 -0
- package/dist/eval/collection-benchmark/health.js +246 -0
- package/dist/eval/collection-benchmark/health.js.map +1 -0
- package/dist/eval/collection-benchmark/history.d.ts +27 -0
- package/dist/eval/collection-benchmark/history.d.ts.map +1 -0
- package/dist/eval/collection-benchmark/history.js +134 -0
- package/dist/eval/collection-benchmark/history.js.map +1 -0
- package/dist/eval/collection-benchmark/latency.d.ts +16 -0
- package/dist/eval/collection-benchmark/latency.d.ts.map +1 -0
- package/dist/eval/collection-benchmark/latency.js +115 -0
- package/dist/eval/collection-benchmark/latency.js.map +1 -0
- package/dist/eval/collection-benchmark/reporter.d.ts +18 -0
- package/dist/eval/collection-benchmark/reporter.d.ts.map +1 -0
- package/dist/eval/collection-benchmark/reporter.js +244 -0
- package/dist/eval/collection-benchmark/reporter.js.map +1 -0
- package/dist/eval/collection-benchmark/retrieval.d.ts +15 -0
- package/dist/eval/collection-benchmark/retrieval.d.ts.map +1 -0
- package/dist/eval/collection-benchmark/retrieval.js +203 -0
- package/dist/eval/collection-benchmark/retrieval.js.map +1 -0
- package/dist/eval/collection-benchmark/runner.d.ts +20 -0
- package/dist/eval/collection-benchmark/runner.d.ts.map +1 -0
- package/dist/eval/collection-benchmark/runner.js +189 -0
- package/dist/eval/collection-benchmark/runner.js.map +1 -0
- package/dist/eval/collection-benchmark/sampler.d.ts +18 -0
- package/dist/eval/collection-benchmark/sampler.d.ts.map +1 -0
- package/dist/eval/collection-benchmark/sampler.js +186 -0
- package/dist/eval/collection-benchmark/sampler.js.map +1 -0
- package/dist/eval/collection-benchmark/tuning.d.ts +12 -0
- package/dist/eval/collection-benchmark/tuning.d.ts.map +1 -0
- package/dist/eval/collection-benchmark/tuning.js +222 -0
- package/dist/eval/collection-benchmark/tuning.js.map +1 -0
- package/dist/eval/collection-benchmark/types.d.ts +183 -0
- package/dist/eval/collection-benchmark/types.d.ts.map +1 -0
- package/dist/eval/collection-benchmark/types.js +7 -0
- package/dist/eval/collection-benchmark/types.js.map +1 -0
- package/dist/eval/context-window-test.d.ts +34 -0
- package/dist/eval/context-window-test.d.ts.map +1 -0
- package/dist/eval/context-window-test.js +59 -0
- package/dist/eval/context-window-test.js.map +1 -0
- package/dist/eval/corpus-builder.d.ts +33 -0
- package/dist/eval/corpus-builder.d.ts.map +1 -0
- package/dist/eval/corpus-builder.js +88 -0
- package/dist/eval/corpus-builder.js.map +1 -0
- package/dist/eval/experiments/boilerplate-filter.d.ts +26 -0
- package/dist/eval/experiments/boilerplate-filter.d.ts.map +1 -0
- package/dist/eval/experiments/boilerplate-filter.js +95 -0
- package/dist/eval/experiments/boilerplate-filter.js.map +1 -0
- package/dist/eval/experiments/cluster-threshold/index.d.ts +6 -0
- package/dist/eval/experiments/cluster-threshold/index.d.ts.map +1 -0
- package/dist/eval/experiments/cluster-threshold/index.js +5 -0
- package/dist/eval/experiments/cluster-threshold/index.js.map +1 -0
- package/dist/eval/experiments/cluster-threshold/run-threshold-sweep.d.ts +58 -0
- package/dist/eval/experiments/cluster-threshold/run-threshold-sweep.d.ts.map +1 -0
- package/dist/eval/experiments/cluster-threshold/run-threshold-sweep.js +246 -0
- package/dist/eval/experiments/cluster-threshold/run-threshold-sweep.js.map +1 -0
- package/dist/eval/experiments/code-focused-mode.d.ts +20 -0
- package/dist/eval/experiments/code-focused-mode.d.ts.map +1 -0
- package/dist/eval/experiments/code-focused-mode.js +66 -0
- package/dist/eval/experiments/code-focused-mode.js.map +1 -0
- package/dist/eval/experiments/edge-decay/decay-curves.d.ts +59 -0
- package/dist/eval/experiments/edge-decay/decay-curves.d.ts.map +1 -0
- package/dist/eval/experiments/edge-decay/decay-curves.js +124 -0
- package/dist/eval/experiments/edge-decay/decay-curves.js.map +1 -0
- package/dist/eval/experiments/edge-decay/index.d.ts +13 -0
- package/dist/eval/experiments/edge-decay/index.d.ts.map +1 -0
- package/dist/eval/experiments/edge-decay/index.js +16 -0
- package/dist/eval/experiments/edge-decay/index.js.map +1 -0
- package/dist/eval/experiments/edge-decay/presets.d.ts +52 -0
- package/dist/eval/experiments/edge-decay/presets.d.ts.map +1 -0
- package/dist/eval/experiments/edge-decay/presets.js +234 -0
- package/dist/eval/experiments/edge-decay/presets.js.map +1 -0
- package/dist/eval/experiments/edge-decay/reference-extractor.d.ts +34 -0
- package/dist/eval/experiments/edge-decay/reference-extractor.d.ts.map +1 -0
- package/dist/eval/experiments/edge-decay/reference-extractor.js +353 -0
- package/dist/eval/experiments/edge-decay/reference-extractor.js.map +1 -0
- package/dist/eval/experiments/edge-decay/reference-types.d.ts +131 -0
- package/dist/eval/experiments/edge-decay/reference-types.d.ts.map +1 -0
- package/dist/eval/experiments/edge-decay/reference-types.js +5 -0
- package/dist/eval/experiments/edge-decay/reference-types.js.map +1 -0
- package/dist/eval/experiments/edge-decay/retrieval-ranking.d.ts +64 -0
- package/dist/eval/experiments/edge-decay/retrieval-ranking.d.ts.map +1 -0
- package/dist/eval/experiments/edge-decay/retrieval-ranking.js +565 -0
- package/dist/eval/experiments/edge-decay/retrieval-ranking.js.map +1 -0
- package/dist/eval/experiments/edge-decay/run-experiments.d.ts +25 -0
- package/dist/eval/experiments/edge-decay/run-experiments.d.ts.map +1 -0
- package/dist/eval/experiments/edge-decay/run-experiments.js +229 -0
- package/dist/eval/experiments/edge-decay/run-experiments.js.map +1 -0
- package/dist/eval/experiments/edge-decay/simulate.d.ts +42 -0
- package/dist/eval/experiments/edge-decay/simulate.d.ts.map +1 -0
- package/dist/eval/experiments/edge-decay/simulate.js +232 -0
- package/dist/eval/experiments/edge-decay/simulate.js.map +1 -0
- package/dist/eval/experiments/edge-decay/types.d.ts +10 -0
- package/dist/eval/experiments/edge-decay/types.d.ts.map +1 -0
- package/dist/eval/experiments/edge-decay/types.js +9 -0
- package/dist/eval/experiments/edge-decay/types.js.map +1 -0
- package/dist/eval/experiments/hdbscan-sweep.d.ts +19 -0
- package/dist/eval/experiments/hdbscan-sweep.d.ts.map +1 -0
- package/dist/eval/experiments/hdbscan-sweep.js +71 -0
- package/dist/eval/experiments/hdbscan-sweep.js.map +1 -0
- package/dist/eval/experiments/single-model-run.d.ts +54 -0
- package/dist/eval/experiments/single-model-run.d.ts.map +1 -0
- package/dist/eval/experiments/single-model-run.js +120 -0
- package/dist/eval/experiments/single-model-run.js.map +1 -0
- package/dist/eval/experiments/thinking-ablation.d.ts +21 -0
- package/dist/eval/experiments/thinking-ablation.d.ts.map +1 -0
- package/dist/eval/experiments/thinking-ablation.js +68 -0
- package/dist/eval/experiments/thinking-ablation.js.map +1 -0
- package/dist/eval/experiments/topic-continuity/embedding-classifier.d.ts +55 -0
- package/dist/eval/experiments/topic-continuity/embedding-classifier.d.ts.map +1 -0
- package/dist/eval/experiments/topic-continuity/embedding-classifier.js +126 -0
- package/dist/eval/experiments/topic-continuity/embedding-classifier.js.map +1 -0
- package/dist/eval/experiments/topic-continuity/hybrid-classifier.d.ts +68 -0
- package/dist/eval/experiments/topic-continuity/hybrid-classifier.d.ts.map +1 -0
- package/dist/eval/experiments/topic-continuity/hybrid-classifier.js +175 -0
- package/dist/eval/experiments/topic-continuity/hybrid-classifier.js.map +1 -0
- package/dist/eval/experiments/topic-continuity/index.d.ts +13 -0
- package/dist/eval/experiments/topic-continuity/index.d.ts.map +1 -0
- package/dist/eval/experiments/topic-continuity/index.js +17 -0
- package/dist/eval/experiments/topic-continuity/index.js.map +1 -0
- package/dist/eval/experiments/topic-continuity/labeler.d.ts +42 -0
- package/dist/eval/experiments/topic-continuity/labeler.d.ts.map +1 -0
- package/dist/eval/experiments/topic-continuity/labeler.js +253 -0
- package/dist/eval/experiments/topic-continuity/labeler.js.map +1 -0
- package/dist/eval/experiments/topic-continuity/lexical-features.d.ts +26 -0
- package/dist/eval/experiments/topic-continuity/lexical-features.d.ts.map +1 -0
- package/dist/eval/experiments/topic-continuity/lexical-features.js +58 -0
- package/dist/eval/experiments/topic-continuity/lexical-features.js.map +1 -0
- package/dist/eval/experiments/topic-continuity/run-experiment.d.ts +40 -0
- package/dist/eval/experiments/topic-continuity/run-experiment.d.ts.map +1 -0
- package/dist/eval/experiments/topic-continuity/run-experiment.js +379 -0
- package/dist/eval/experiments/topic-continuity/run-experiment.js.map +1 -0
- package/dist/eval/experiments/topic-continuity/types.d.ts +146 -0
- package/dist/eval/experiments/topic-continuity/types.d.ts.map +1 -0
- package/dist/eval/experiments/topic-continuity/types.js +9 -0
- package/dist/eval/experiments/topic-continuity/types.js.map +1 -0
- package/dist/eval/experiments/truncation.d.ts +21 -0
- package/dist/eval/experiments/truncation.d.ts.map +1 -0
- package/dist/eval/experiments/truncation.js +59 -0
- package/dist/eval/experiments/truncation.js.map +1 -0
- package/dist/eval/experiments/types.d.ts +37 -0
- package/dist/eval/experiments/types.d.ts.map +1 -0
- package/dist/eval/experiments/types.js +13 -0
- package/dist/eval/experiments/types.js.map +1 -0
- package/dist/eval/experiments/vector-decay-shapes/curve-shapes-experiment.d.ts +10 -0
- package/dist/eval/experiments/vector-decay-shapes/curve-shapes-experiment.d.ts.map +1 -0
- package/dist/eval/experiments/vector-decay-shapes/curve-shapes-experiment.js +229 -0
- package/dist/eval/experiments/vector-decay-shapes/curve-shapes-experiment.js.map +1 -0
- package/dist/eval/experiments/vector-decay-shapes/graph-range-experiment.d.ts +12 -0
- package/dist/eval/experiments/vector-decay-shapes/graph-range-experiment.d.ts.map +1 -0
- package/dist/eval/experiments/vector-decay-shapes/graph-range-experiment.js +316 -0
- package/dist/eval/experiments/vector-decay-shapes/graph-range-experiment.js.map +1 -0
- package/dist/eval/experiments/vector-decay-shapes/hop-decay.d.ts +19 -0
- package/dist/eval/experiments/vector-decay-shapes/hop-decay.d.ts.map +1 -0
- package/dist/eval/experiments/vector-decay-shapes/hop-decay.js +127 -0
- package/dist/eval/experiments/vector-decay-shapes/hop-decay.js.map +1 -0
- package/dist/eval/experiments/vector-decay-shapes/index.d.ts +11 -0
- package/dist/eval/experiments/vector-decay-shapes/index.d.ts.map +1 -0
- package/dist/eval/experiments/vector-decay-shapes/index.js +11 -0
- package/dist/eval/experiments/vector-decay-shapes/index.js.map +1 -0
- package/dist/eval/experiments/vector-decay-shapes/path-traversal-experiment.d.ts +14 -0
- package/dist/eval/experiments/vector-decay-shapes/path-traversal-experiment.d.ts.map +1 -0
- package/dist/eval/experiments/vector-decay-shapes/path-traversal-experiment.js +274 -0
- package/dist/eval/experiments/vector-decay-shapes/path-traversal-experiment.js.map +1 -0
- package/dist/eval/experiments/vector-decay-shapes/presets.d.ts +36 -0
- package/dist/eval/experiments/vector-decay-shapes/presets.d.ts.map +1 -0
- package/dist/eval/experiments/vector-decay-shapes/presets.js +157 -0
- package/dist/eval/experiments/vector-decay-shapes/presets.js.map +1 -0
- package/dist/eval/experiments/vector-decay-shapes/run-experiment.d.ts +20 -0
- package/dist/eval/experiments/vector-decay-shapes/run-experiment.d.ts.map +1 -0
- package/dist/eval/experiments/vector-decay-shapes/run-experiment.js +504 -0
- package/dist/eval/experiments/vector-decay-shapes/run-experiment.js.map +1 -0
- package/dist/eval/experiments/vector-decay-shapes/types.d.ts +111 -0
- package/dist/eval/experiments/vector-decay-shapes/types.d.ts.map +1 -0
- package/dist/eval/experiments/vector-decay-shapes/types.js +15 -0
- package/dist/eval/experiments/vector-decay-shapes/types.js.map +1 -0
- package/dist/eval/experiments/vector-decay-sweep/index.d.ts +7 -0
- package/dist/eval/experiments/vector-decay-sweep/index.d.ts.map +1 -0
- package/dist/eval/experiments/vector-decay-sweep/index.js +7 -0
- package/dist/eval/experiments/vector-decay-sweep/index.js.map +1 -0
- package/dist/eval/experiments/vector-decay-sweep/run-sweep.d.ts +30 -0
- package/dist/eval/experiments/vector-decay-sweep/run-sweep.d.ts.map +1 -0
- package/dist/eval/experiments/vector-decay-sweep/run-sweep.js +378 -0
- package/dist/eval/experiments/vector-decay-sweep/run-sweep.js.map +1 -0
- package/dist/eval/experiments/vector-decay-sweep/types.d.ts +109 -0
- package/dist/eval/experiments/vector-decay-sweep/types.d.ts.map +1 -0
- package/dist/eval/experiments/vector-decay-sweep/types.js +16 -0
- package/dist/eval/experiments/vector-decay-sweep/types.js.map +1 -0
- package/dist/eval/metrics.d.ts +45 -0
- package/dist/eval/metrics.d.ts.map +1 -0
- package/dist/eval/metrics.js +134 -0
- package/dist/eval/metrics.js.map +1 -0
- package/dist/hooks/claudemd-generator.d.ts +62 -0
- package/dist/hooks/claudemd-generator.d.ts.map +1 -0
- package/dist/hooks/claudemd-generator.js +220 -0
- package/dist/hooks/claudemd-generator.js.map +1 -0
- package/dist/hooks/hook-utils.d.ts +84 -0
- package/dist/hooks/hook-utils.d.ts.map +1 -0
- package/dist/hooks/hook-utils.js +187 -0
- package/dist/hooks/hook-utils.js.map +1 -0
- package/dist/hooks/index.d.ts +12 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +12 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/pre-compact.d.ts +58 -0
- package/dist/hooks/pre-compact.d.ts.map +1 -0
- package/dist/hooks/pre-compact.js +127 -0
- package/dist/hooks/pre-compact.js.map +1 -0
- package/dist/hooks/session-start.d.ts +62 -0
- package/dist/hooks/session-start.d.ts.map +1 -0
- package/dist/hooks/session-start.js +249 -0
- package/dist/hooks/session-start.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/ingest/batch-ingest.d.ts +94 -0
- package/dist/ingest/batch-ingest.d.ts.map +1 -0
- package/dist/ingest/batch-ingest.js +167 -0
- package/dist/ingest/batch-ingest.js.map +1 -0
- package/dist/ingest/brief-debrief-detector.d.ts +74 -0
- package/dist/ingest/brief-debrief-detector.d.ts.map +1 -0
- package/dist/ingest/brief-debrief-detector.js +253 -0
- package/dist/ingest/brief-debrief-detector.js.map +1 -0
- package/dist/ingest/cross-session-linker.d.ts +39 -0
- package/dist/ingest/cross-session-linker.d.ts.map +1 -0
- package/dist/ingest/cross-session-linker.js +103 -0
- package/dist/ingest/cross-session-linker.js.map +1 -0
- package/dist/ingest/edge-creator.d.ts +62 -0
- package/dist/ingest/edge-creator.d.ts.map +1 -0
- package/dist/ingest/edge-creator.js +186 -0
- package/dist/ingest/edge-creator.js.map +1 -0
- package/dist/ingest/edge-detector.d.ts +37 -0
- package/dist/ingest/edge-detector.d.ts.map +1 -0
- package/dist/ingest/edge-detector.js +234 -0
- package/dist/ingest/edge-detector.js.map +1 -0
- package/dist/ingest/index.d.ts +14 -0
- package/dist/ingest/index.d.ts.map +1 -0
- package/dist/ingest/index.js +14 -0
- package/dist/ingest/index.js.map +1 -0
- package/dist/ingest/ingest-session.d.ts +83 -0
- package/dist/ingest/ingest-session.d.ts.map +1 -0
- package/dist/ingest/ingest-session.js +415 -0
- package/dist/ingest/ingest-session.js.map +1 -0
- package/dist/maintenance/index.d.ts +5 -0
- package/dist/maintenance/index.d.ts.map +1 -0
- package/dist/maintenance/index.js +5 -0
- package/dist/maintenance/index.js.map +1 -0
- package/dist/maintenance/scheduler.d.ts +79 -0
- package/dist/maintenance/scheduler.d.ts.map +1 -0
- package/dist/maintenance/scheduler.js +362 -0
- package/dist/maintenance/scheduler.js.map +1 -0
- package/dist/maintenance/tasks/cleanup-vectors.d.ts +10 -0
- package/dist/maintenance/tasks/cleanup-vectors.d.ts.map +1 -0
- package/dist/maintenance/tasks/cleanup-vectors.js +23 -0
- package/dist/maintenance/tasks/cleanup-vectors.js.map +1 -0
- package/dist/maintenance/tasks/index.d.ts +9 -0
- package/dist/maintenance/tasks/index.d.ts.map +1 -0
- package/dist/maintenance/tasks/index.js +9 -0
- package/dist/maintenance/tasks/index.js.map +1 -0
- package/dist/maintenance/tasks/prune-graph.d.ts +12 -0
- package/dist/maintenance/tasks/prune-graph.d.ts.map +1 -0
- package/dist/maintenance/tasks/prune-graph.js +23 -0
- package/dist/maintenance/tasks/prune-graph.js.map +1 -0
- package/dist/maintenance/tasks/scan-projects.d.ts +12 -0
- package/dist/maintenance/tasks/scan-projects.d.ts.map +1 -0
- package/dist/maintenance/tasks/scan-projects.js +31 -0
- package/dist/maintenance/tasks/scan-projects.js.map +1 -0
- package/dist/maintenance/tasks/update-clusters.d.ts +12 -0
- package/dist/maintenance/tasks/update-clusters.d.ts.map +1 -0
- package/dist/maintenance/tasks/update-clusters.js +41 -0
- package/dist/maintenance/tasks/update-clusters.js.map +1 -0
- package/dist/maintenance/tasks/vacuum.d.ts +10 -0
- package/dist/maintenance/tasks/vacuum.d.ts.map +1 -0
- package/dist/maintenance/tasks/vacuum.js +23 -0
- package/dist/maintenance/tasks/vacuum.js.map +1 -0
- package/dist/mcp/index.d.ts +7 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +8 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +90 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +395 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +52 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +292 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/models/device-detector.d.ts +32 -0
- package/dist/models/device-detector.d.ts.map +1 -0
- package/dist/models/device-detector.js +123 -0
- package/dist/models/device-detector.js.map +1 -0
- package/dist/models/embedder.d.ts +60 -0
- package/dist/models/embedder.d.ts.map +1 -0
- package/dist/models/embedder.js +171 -0
- package/dist/models/embedder.js.map +1 -0
- package/dist/models/model-registry.d.ts +25 -0
- package/dist/models/model-registry.d.ts.map +1 -0
- package/dist/models/model-registry.js +56 -0
- package/dist/models/model-registry.js.map +1 -0
- package/dist/parser/chunker.d.ts +74 -0
- package/dist/parser/chunker.d.ts.map +1 -0
- package/dist/parser/chunker.js +330 -0
- package/dist/parser/chunker.js.map +1 -0
- package/dist/parser/session-reader.d.ts +75 -0
- package/dist/parser/session-reader.d.ts.map +1 -0
- package/dist/parser/session-reader.js +198 -0
- package/dist/parser/session-reader.js.map +1 -0
- package/dist/parser/turn-assembler.d.ts +18 -0
- package/dist/parser/turn-assembler.d.ts.map +1 -0
- package/dist/parser/turn-assembler.js +150 -0
- package/dist/parser/turn-assembler.js.map +1 -0
- package/dist/parser/types.d.ts +124 -0
- package/dist/parser/types.d.ts.map +1 -0
- package/dist/parser/types.js +8 -0
- package/dist/parser/types.js.map +1 -0
- package/dist/report/reporter.d.ts +18 -0
- package/dist/report/reporter.d.ts.map +1 -0
- package/dist/report/reporter.js +121 -0
- package/dist/report/reporter.js.map +1 -0
- package/dist/retrieval/cluster-expander.d.ts +30 -0
- package/dist/retrieval/cluster-expander.d.ts.map +1 -0
- package/dist/retrieval/cluster-expander.js +87 -0
- package/dist/retrieval/cluster-expander.js.map +1 -0
- package/dist/retrieval/context-assembler.d.ts +89 -0
- package/dist/retrieval/context-assembler.d.ts.map +1 -0
- package/dist/retrieval/context-assembler.js +313 -0
- package/dist/retrieval/context-assembler.js.map +1 -0
- package/dist/retrieval/index.d.ts +12 -0
- package/dist/retrieval/index.d.ts.map +1 -0
- package/dist/retrieval/index.js +12 -0
- package/dist/retrieval/index.js.map +1 -0
- package/dist/retrieval/rrf.d.ts +25 -0
- package/dist/retrieval/rrf.d.ts.map +1 -0
- package/dist/retrieval/rrf.js +56 -0
- package/dist/retrieval/rrf.js.map +1 -0
- package/dist/retrieval/session-reconstructor.d.ts +79 -0
- package/dist/retrieval/session-reconstructor.d.ts.map +1 -0
- package/dist/retrieval/session-reconstructor.js +173 -0
- package/dist/retrieval/session-reconstructor.js.map +1 -0
- package/dist/retrieval/traverser.d.ts +66 -0
- package/dist/retrieval/traverser.d.ts.map +1 -0
- package/dist/retrieval/traverser.js +160 -0
- package/dist/retrieval/traverser.js.map +1 -0
- package/dist/storage/archive.d.ts +81 -0
- package/dist/storage/archive.d.ts.map +1 -0
- package/dist/storage/archive.js +204 -0
- package/dist/storage/archive.js.map +1 -0
- package/dist/storage/audit-log.d.ts +29 -0
- package/dist/storage/audit-log.d.ts.map +1 -0
- package/dist/storage/audit-log.js +69 -0
- package/dist/storage/audit-log.js.map +1 -0
- package/dist/storage/checkpoint-store.d.ts +38 -0
- package/dist/storage/checkpoint-store.d.ts.map +1 -0
- package/dist/storage/checkpoint-store.js +76 -0
- package/dist/storage/checkpoint-store.js.map +1 -0
- package/dist/storage/chunk-store.d.ts +111 -0
- package/dist/storage/chunk-store.d.ts.map +1 -0
- package/dist/storage/chunk-store.js +298 -0
- package/dist/storage/chunk-store.js.map +1 -0
- package/dist/storage/clock-store.d.ts +80 -0
- package/dist/storage/clock-store.d.ts.map +1 -0
- package/dist/storage/clock-store.js +155 -0
- package/dist/storage/clock-store.js.map +1 -0
- package/dist/storage/cluster-store.d.ts +63 -0
- package/dist/storage/cluster-store.d.ts.map +1 -0
- package/dist/storage/cluster-store.js +219 -0
- package/dist/storage/cluster-store.js.map +1 -0
- package/dist/storage/db.d.ts +57 -0
- package/dist/storage/db.d.ts.map +1 -0
- package/dist/storage/db.js +249 -0
- package/dist/storage/db.js.map +1 -0
- package/dist/storage/decay.d.ts +125 -0
- package/dist/storage/decay.d.ts.map +1 -0
- package/dist/storage/decay.js +276 -0
- package/dist/storage/decay.js.map +1 -0
- package/dist/storage/edge-store.d.ts +75 -0
- package/dist/storage/edge-store.d.ts.map +1 -0
- package/dist/storage/edge-store.js +259 -0
- package/dist/storage/edge-store.js.map +1 -0
- package/dist/storage/embedding-cache.d.ts +51 -0
- package/dist/storage/embedding-cache.d.ts.map +1 -0
- package/dist/storage/embedding-cache.js +155 -0
- package/dist/storage/embedding-cache.js.map +1 -0
- package/dist/storage/encryption.d.ts +55 -0
- package/dist/storage/encryption.d.ts.map +1 -0
- package/dist/storage/encryption.js +130 -0
- package/dist/storage/encryption.js.map +1 -0
- package/dist/storage/index.d.ts +15 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +20 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/keyword-store.d.ts +25 -0
- package/dist/storage/keyword-store.d.ts.map +1 -0
- package/dist/storage/keyword-store.js +104 -0
- package/dist/storage/keyword-store.js.map +1 -0
- package/dist/storage/migrations.d.ts +12 -0
- package/dist/storage/migrations.d.ts.map +1 -0
- package/dist/storage/migrations.js +345 -0
- package/dist/storage/migrations.js.map +1 -0
- package/dist/storage/pruner.d.ts +111 -0
- package/dist/storage/pruner.d.ts.map +1 -0
- package/dist/storage/pruner.js +280 -0
- package/dist/storage/pruner.js.map +1 -0
- package/dist/storage/schema-loader.d.ts +18 -0
- package/dist/storage/schema-loader.d.ts.map +1 -0
- package/dist/storage/schema-loader.js +62 -0
- package/dist/storage/schema-loader.js.map +1 -0
- package/dist/storage/schema.sql +133 -0
- package/dist/storage/types.d.ts +278 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +14 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/storage/vector-store.d.ts +213 -0
- package/dist/storage/vector-store.d.ts.map +1 -0
- package/dist/storage/vector-store.js +440 -0
- package/dist/storage/vector-store.js.map +1 -0
- package/dist/temporal/clock-compactor.d.ts +65 -0
- package/dist/temporal/clock-compactor.d.ts.map +1 -0
- package/dist/temporal/clock-compactor.js +157 -0
- package/dist/temporal/clock-compactor.js.map +1 -0
- package/dist/temporal/index.d.ts +6 -0
- package/dist/temporal/index.d.ts.map +1 -0
- package/dist/temporal/index.js +6 -0
- package/dist/temporal/index.js.map +1 -0
- package/dist/temporal/vector-clock.d.ts +143 -0
- package/dist/temporal/vector-clock.d.ts.map +1 -0
- package/dist/temporal/vector-clock.js +231 -0
- package/dist/temporal/vector-clock.js.map +1 -0
- package/dist/utils/angular-distance.d.ts +31 -0
- package/dist/utils/angular-distance.d.ts.map +1 -0
- package/dist/utils/angular-distance.js +61 -0
- package/dist/utils/angular-distance.js.map +1 -0
- package/dist/utils/array-utils.d.ts +28 -0
- package/dist/utils/array-utils.d.ts.map +1 -0
- package/dist/utils/array-utils.js +67 -0
- package/dist/utils/array-utils.js.map +1 -0
- package/dist/utils/embedding-utils.d.ts +25 -0
- package/dist/utils/embedding-utils.d.ts.map +1 -0
- package/dist/utils/embedding-utils.js +30 -0
- package/dist/utils/embedding-utils.js.map +1 -0
- package/dist/utils/errors.d.ts +143 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +220 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/keychain.d.ts +43 -0
- package/dist/utils/keychain.d.ts.map +1 -0
- package/dist/utils/keychain.js +82 -0
- package/dist/utils/keychain.js.map +1 -0
- package/dist/utils/logger.d.ts +50 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +104 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/secret-store.d.ts +110 -0
- package/dist/utils/secret-store.d.ts.map +1 -0
- package/dist/utils/secret-store.js +340 -0
- package/dist/utils/secret-store.js.map +1 -0
- package/dist/utils/secure-buffer.d.ts +66 -0
- package/dist/utils/secure-buffer.d.ts.map +1 -0
- package/dist/utils/secure-buffer.js +104 -0
- package/dist/utils/secure-buffer.js.map +1 -0
- package/dist/utils/token-counter.d.ts +13 -0
- package/dist/utils/token-counter.d.ts.map +1 -0
- package/dist/utils/token-counter.js +18 -0
- package/dist/utils/token-counter.js.map +1 -0
- package/package.json +110 -0
- package/src/dashboard/client/package-lock.json +3045 -0
- package/src/dashboard/client/package.json +30 -0
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Console table + JSON output for benchmark results.
|
|
3
|
+
*/
|
|
4
|
+
import { writeFile } from 'node:fs/promises';
|
|
5
|
+
/**
|
|
6
|
+
* Print a comparison table to the console.
|
|
7
|
+
*/
|
|
8
|
+
export function printComparisonTable(result) {
|
|
9
|
+
console.log('\n' + '='.repeat(100));
|
|
10
|
+
console.log(' EMBEDDING MODEL BENCHMARK RESULTS');
|
|
11
|
+
console.log('='.repeat(100));
|
|
12
|
+
console.log(` Corpus: ${result.corpus.chunkCount} chunks, ${result.corpus.pairCount} labeled pairs`);
|
|
13
|
+
console.log('='.repeat(100));
|
|
14
|
+
// Header
|
|
15
|
+
const cols = [
|
|
16
|
+
pad('Model', 14),
|
|
17
|
+
pad('Dims', 5),
|
|
18
|
+
pad('Context', 8),
|
|
19
|
+
pad('ROC AUC', 8),
|
|
20
|
+
pad('Clusters', 9),
|
|
21
|
+
pad('Noise%', 7),
|
|
22
|
+
pad('Silh.', 7),
|
|
23
|
+
pad('CodeNL', 7),
|
|
24
|
+
pad('ms/chunk', 9),
|
|
25
|
+
pad('Load(s)', 8),
|
|
26
|
+
pad('Heap(MB)', 9),
|
|
27
|
+
];
|
|
28
|
+
console.log(cols.join(' | '));
|
|
29
|
+
console.log('-'.repeat(100));
|
|
30
|
+
// Rows
|
|
31
|
+
for (const m of result.models) {
|
|
32
|
+
const row = [
|
|
33
|
+
pad(m.modelId, 14),
|
|
34
|
+
pad(String(m.modelConfig.dims), 5),
|
|
35
|
+
pad(String(m.modelConfig.contextTokens), 8),
|
|
36
|
+
pad(m.rocAuc.toFixed(3), 8),
|
|
37
|
+
pad(String(m.clusterCount), 9),
|
|
38
|
+
pad((m.noiseRatio * 100).toFixed(1) + '%', 7),
|
|
39
|
+
pad(m.silhouetteScore.toFixed(3), 7),
|
|
40
|
+
pad(m.codeNLAlignment.alignmentRatio.toFixed(3), 7),
|
|
41
|
+
pad(m.meanInferenceMs.toFixed(1), 9),
|
|
42
|
+
pad((m.loadStats.loadTimeMs / 1000).toFixed(1), 8),
|
|
43
|
+
pad(m.loadStats.heapUsedMB.toFixed(0), 9),
|
|
44
|
+
];
|
|
45
|
+
console.log(row.join(' | '));
|
|
46
|
+
}
|
|
47
|
+
console.log('='.repeat(100));
|
|
48
|
+
// Context window comparison
|
|
49
|
+
if (result.contextWindowComparison) {
|
|
50
|
+
const cw = result.contextWindowComparison;
|
|
51
|
+
console.log('\nContext Window Impact:');
|
|
52
|
+
console.log(` Long chunks (>512 tokens): ${cw.longChunks} / ${cw.totalChunks}`);
|
|
53
|
+
console.log(` Mean drift (long chunks): ${cw.meanDriftLongChunks.toFixed(4)}`);
|
|
54
|
+
console.log(` Mean drift (short chunks): ${cw.meanDriftShortChunks.toFixed(4)}`);
|
|
55
|
+
if (cw.longChunkDrifts.length > 0) {
|
|
56
|
+
console.log(' Top 5 drifting chunks:');
|
|
57
|
+
for (const d of cw.longChunkDrifts.slice(0, 5)) {
|
|
58
|
+
console.log(` ${d.chunkId}: ${d.tokens} tokens, drift=${d.drift.toFixed(4)}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Per-model cluster details
|
|
63
|
+
console.log('\nCluster Details:');
|
|
64
|
+
for (const m of result.models) {
|
|
65
|
+
console.log(` ${m.modelId}: ${m.clusterResult.clusterSizes.join(', ')} (${m.clusterResult.numClusters} clusters)`);
|
|
66
|
+
}
|
|
67
|
+
console.log('');
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Print cluster membership with chunk text previews.
|
|
71
|
+
*/
|
|
72
|
+
export function printClusterMembership(modelResult, chunks, maxPreviewChars = 80) {
|
|
73
|
+
console.log(`\n--- Cluster membership for ${modelResult.modelId} ---`);
|
|
74
|
+
for (const [label, indices] of modelResult.clusterMembership) {
|
|
75
|
+
const labelStr = label < 0 ? 'NOISE' : `Cluster ${label}`;
|
|
76
|
+
console.log(`\n ${labelStr} (${indices.length} chunks):`);
|
|
77
|
+
for (const idx of indices.slice(0, 10)) {
|
|
78
|
+
const chunk = chunks[idx];
|
|
79
|
+
const preview = chunk.text
|
|
80
|
+
.replace(/\n/g, ' ')
|
|
81
|
+
.slice(0, maxPreviewChars);
|
|
82
|
+
console.log(` [${chunk.metadata.sessionSlug}] ${preview}...`);
|
|
83
|
+
}
|
|
84
|
+
if (indices.length > 10) {
|
|
85
|
+
console.log(` ... and ${indices.length - 10} more`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Write benchmark results as JSON.
|
|
91
|
+
*/
|
|
92
|
+
export async function writeJsonReport(result, outputPath) {
|
|
93
|
+
// Strip non-serializable data (embeddings, Maps)
|
|
94
|
+
const serializable = {
|
|
95
|
+
...result,
|
|
96
|
+
models: result.models.map((m) => ({
|
|
97
|
+
modelId: m.modelId,
|
|
98
|
+
modelConfig: m.modelConfig,
|
|
99
|
+
loadStats: m.loadStats,
|
|
100
|
+
rocAuc: m.rocAuc,
|
|
101
|
+
clusterCount: m.clusterCount,
|
|
102
|
+
noiseRatio: m.noiseRatio,
|
|
103
|
+
silhouetteScore: m.silhouetteScore,
|
|
104
|
+
codeNLAlignment: m.codeNLAlignment,
|
|
105
|
+
meanInferenceMs: m.meanInferenceMs,
|
|
106
|
+
totalInferenceMs: m.totalInferenceMs,
|
|
107
|
+
clusterResult: {
|
|
108
|
+
numClusters: m.clusterResult.numClusters,
|
|
109
|
+
noiseRatio: m.clusterResult.noiseRatio,
|
|
110
|
+
clusterSizes: m.clusterResult.clusterSizes,
|
|
111
|
+
},
|
|
112
|
+
clusterMembership: Object.fromEntries(m.clusterMembership),
|
|
113
|
+
})),
|
|
114
|
+
};
|
|
115
|
+
await writeFile(outputPath, JSON.stringify(serializable, null, 2));
|
|
116
|
+
console.log(`Report written to ${outputPath}`);
|
|
117
|
+
}
|
|
118
|
+
function pad(str, width) {
|
|
119
|
+
return str.padEnd(width).slice(0, width);
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=reporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../src/report/reporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Post-fusion cluster expansion.
|
|
3
|
+
*
|
|
4
|
+
* Expands search results by finding sibling chunks within the same HDBSCAN clusters.
|
|
5
|
+
* This surfaces topically related chunks that neither vector nor keyword search found.
|
|
6
|
+
*/
|
|
7
|
+
import type { RankedItem } from './rrf.js';
|
|
8
|
+
export interface ClusterExpansionConfig {
|
|
9
|
+
/** Max clusters to expand from (default: 3) */
|
|
10
|
+
maxClusters: number;
|
|
11
|
+
/** Max sibling chunks per cluster (default: 5) */
|
|
12
|
+
maxSiblings: number;
|
|
13
|
+
/** Score multiplier for siblings (default: 0.3) */
|
|
14
|
+
boostFactor: number;
|
|
15
|
+
}
|
|
16
|
+
export declare const DEFAULT_CLUSTER_EXPANSION: ClusterExpansionConfig;
|
|
17
|
+
/**
|
|
18
|
+
* Expand hits with cluster siblings.
|
|
19
|
+
*
|
|
20
|
+
* For each hit, looks up its cluster assignments, then fetches sibling chunks
|
|
21
|
+
* from the top clusters. Siblings get scored based on the hit's score,
|
|
22
|
+
* the boost factor, and their distance to the cluster centroid.
|
|
23
|
+
*
|
|
24
|
+
* @param hits - Ranked items from RRF fusion
|
|
25
|
+
* @param config - Expansion parameters
|
|
26
|
+
* @param projectFilter - Optional project filter to restrict siblings
|
|
27
|
+
* @returns Original hits + cluster sibling items (deduplicated)
|
|
28
|
+
*/
|
|
29
|
+
export declare function expandViaClusters(hits: RankedItem[], config?: ClusterExpansionConfig, projectFilter?: string | string[]): RankedItem[];
|
|
30
|
+
//# sourceMappingURL=cluster-expander.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cluster-expander.d.ts","sourceRoot":"","sources":["../../src/retrieval/cluster-expander.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,MAAM,WAAW,sBAAsB;IACrC,+CAA+C;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,yBAAyB,EAAE,sBAIvC,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,UAAU,EAAE,EAClB,MAAM,GAAE,sBAAkD,EAC1D,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAChC,UAAU,EAAE,CAkEd"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Post-fusion cluster expansion.
|
|
3
|
+
*
|
|
4
|
+
* Expands search results by finding sibling chunks within the same HDBSCAN clusters.
|
|
5
|
+
* This surfaces topically related chunks that neither vector nor keyword search found.
|
|
6
|
+
*/
|
|
7
|
+
import { getChunkClusterAssignments, getClusterChunkIds, } from '../storage/cluster-store.js';
|
|
8
|
+
import { vectorStore } from '../storage/vector-store.js';
|
|
9
|
+
export const DEFAULT_CLUSTER_EXPANSION = {
|
|
10
|
+
maxClusters: 3,
|
|
11
|
+
maxSiblings: 5,
|
|
12
|
+
boostFactor: 0.3,
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Expand hits with cluster siblings.
|
|
16
|
+
*
|
|
17
|
+
* For each hit, looks up its cluster assignments, then fetches sibling chunks
|
|
18
|
+
* from the top clusters. Siblings get scored based on the hit's score,
|
|
19
|
+
* the boost factor, and their distance to the cluster centroid.
|
|
20
|
+
*
|
|
21
|
+
* @param hits - Ranked items from RRF fusion
|
|
22
|
+
* @param config - Expansion parameters
|
|
23
|
+
* @param projectFilter - Optional project filter to restrict siblings
|
|
24
|
+
* @returns Original hits + cluster sibling items (deduplicated)
|
|
25
|
+
*/
|
|
26
|
+
export function expandViaClusters(hits, config = DEFAULT_CLUSTER_EXPANSION, projectFilter) {
|
|
27
|
+
if (hits.length === 0)
|
|
28
|
+
return [];
|
|
29
|
+
const existingIds = new Set(hits.map(h => h.chunkId));
|
|
30
|
+
const siblingItems = [];
|
|
31
|
+
// Build project filter set
|
|
32
|
+
const projectSet = projectFilter
|
|
33
|
+
? new Set(Array.isArray(projectFilter) ? projectFilter : [projectFilter])
|
|
34
|
+
: null;
|
|
35
|
+
// Track clusters we've already expanded to avoid duplicates
|
|
36
|
+
const expandedClusters = new Set();
|
|
37
|
+
let clusterCount = 0;
|
|
38
|
+
for (const hit of hits) {
|
|
39
|
+
if (clusterCount >= config.maxClusters)
|
|
40
|
+
break;
|
|
41
|
+
// Get cluster assignments for this chunk (sorted by distance)
|
|
42
|
+
const assignments = getChunkClusterAssignments(hit.chunkId);
|
|
43
|
+
if (assignments.length === 0)
|
|
44
|
+
continue;
|
|
45
|
+
for (const assignment of assignments) {
|
|
46
|
+
if (clusterCount >= config.maxClusters)
|
|
47
|
+
break;
|
|
48
|
+
if (expandedClusters.has(assignment.clusterId))
|
|
49
|
+
continue;
|
|
50
|
+
expandedClusters.add(assignment.clusterId);
|
|
51
|
+
clusterCount++;
|
|
52
|
+
// Get all chunk IDs in this cluster
|
|
53
|
+
const clusterChunkIds = getClusterChunkIds(assignment.clusterId);
|
|
54
|
+
let addedSiblings = 0;
|
|
55
|
+
for (const siblingId of clusterChunkIds) {
|
|
56
|
+
if (addedSiblings >= config.maxSiblings)
|
|
57
|
+
break;
|
|
58
|
+
if (existingIds.has(siblingId))
|
|
59
|
+
continue;
|
|
60
|
+
// Filter by project if needed
|
|
61
|
+
if (projectSet) {
|
|
62
|
+
const project = vectorStore.getChunkProject(siblingId);
|
|
63
|
+
if (!project || !projectSet.has(project))
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
// Look up this sibling's distance in the cluster for scoring
|
|
67
|
+
const siblingAssignments = getChunkClusterAssignments(siblingId);
|
|
68
|
+
const siblingAssignment = siblingAssignments.find(a => a.clusterId === assignment.clusterId);
|
|
69
|
+
const distance = siblingAssignment?.distance ?? 0.5;
|
|
70
|
+
// Score: best hit score * boost * (1 - distance)
|
|
71
|
+
const score = hit.score * config.boostFactor * (1 - distance);
|
|
72
|
+
if (score > 0) {
|
|
73
|
+
siblingItems.push({
|
|
74
|
+
chunkId: siblingId,
|
|
75
|
+
score,
|
|
76
|
+
source: 'cluster',
|
|
77
|
+
});
|
|
78
|
+
existingIds.add(siblingId);
|
|
79
|
+
addedSiblings++;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// Combine original hits with siblings
|
|
85
|
+
return [...hits, ...siblingItems];
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=cluster-expander.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cluster-expander.js","sourceRoot":"","sources":["../../src/retrieval/cluster-expander.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context assembly for memory retrieval.
|
|
3
|
+
* Combines vector search with graph traversal to assemble relevant context.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Retrieval mode determines traversal direction and ranking.
|
|
7
|
+
*/
|
|
8
|
+
export type RetrievalMode = 'recall' | 'explain' | 'predict';
|
|
9
|
+
/**
|
|
10
|
+
* Range hint for retrieval - lets Claude choose appropriate decay model.
|
|
11
|
+
* - 'short': Recent context (15min hold) - best for immediate follow-ups
|
|
12
|
+
* - 'long': Distant context (60min hold) - best for cross-session/historical
|
|
13
|
+
* - 'auto': System decides based on query characteristics
|
|
14
|
+
*/
|
|
15
|
+
export type RetrievalRange = 'short' | 'long' | 'auto';
|
|
16
|
+
/**
|
|
17
|
+
* Request for context retrieval.
|
|
18
|
+
*/
|
|
19
|
+
export interface RetrievalRequest {
|
|
20
|
+
/** Query text to find relevant context for */
|
|
21
|
+
query: string;
|
|
22
|
+
/** Current session ID (optional, for recency boost) */
|
|
23
|
+
currentSessionId?: string;
|
|
24
|
+
/** Project slug for clock lookup (optional, enables vector clock decay) */
|
|
25
|
+
projectSlug?: string;
|
|
26
|
+
/** Filter results to specific project(s). Omit to search all projects. */
|
|
27
|
+
projectFilter?: string | string[];
|
|
28
|
+
/** Query time for decay calculation (default: now) */
|
|
29
|
+
queryTime?: number;
|
|
30
|
+
/** Maximum tokens in response */
|
|
31
|
+
maxTokens?: number;
|
|
32
|
+
/** Retrieval mode */
|
|
33
|
+
mode: RetrievalMode;
|
|
34
|
+
/** Range hint: 'short' for recent, 'long' for historical, 'auto' to decide */
|
|
35
|
+
range?: RetrievalRange;
|
|
36
|
+
/** Number of vector search results to start from */
|
|
37
|
+
vectorSearchLimit?: number;
|
|
38
|
+
/** Skip graph traversal (for benchmarking vector-only retrieval) */
|
|
39
|
+
skipGraph?: boolean;
|
|
40
|
+
/** Skip cluster expansion (for benchmarking vector-only retrieval) */
|
|
41
|
+
skipClusters?: boolean;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Retrieval response with assembled context.
|
|
45
|
+
*/
|
|
46
|
+
export interface RetrievalResponse {
|
|
47
|
+
/** Assembled context text */
|
|
48
|
+
text: string;
|
|
49
|
+
/** Approximate token count */
|
|
50
|
+
tokenCount: number;
|
|
51
|
+
/** Chunks included in response */
|
|
52
|
+
chunks: Array<{
|
|
53
|
+
id: string;
|
|
54
|
+
sessionSlug: string;
|
|
55
|
+
weight: number;
|
|
56
|
+
preview: string;
|
|
57
|
+
source?: 'vector' | 'keyword' | 'cluster' | 'graph';
|
|
58
|
+
}>;
|
|
59
|
+
/** Total chunks considered */
|
|
60
|
+
totalConsidered: number;
|
|
61
|
+
/** Time taken in milliseconds */
|
|
62
|
+
durationMs: number;
|
|
63
|
+
/** Number of chunks boosted by graph agreement (found by both vector and graph) */
|
|
64
|
+
graphBoosted: number;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Assemble context from memory based on a query.
|
|
68
|
+
*
|
|
69
|
+
* Pipeline: embed → [vector search, keyword search] → RRF fusion → cluster expansion
|
|
70
|
+
* → graph traverse → combine → dedupe → recency → budget
|
|
71
|
+
*/
|
|
72
|
+
export declare function assembleContext(request: RetrievalRequest): Promise<RetrievalResponse>;
|
|
73
|
+
/**
|
|
74
|
+
* Recall: retrieve context relevant to a query.
|
|
75
|
+
*/
|
|
76
|
+
export declare function recall(query: string, options?: Partial<RetrievalRequest>): Promise<RetrievalResponse>;
|
|
77
|
+
/**
|
|
78
|
+
* Explain: retrieve context that explains how we got to current state.
|
|
79
|
+
*/
|
|
80
|
+
export declare function explain(topic: string, options?: Partial<RetrievalRequest>): Promise<RetrievalResponse>;
|
|
81
|
+
/**
|
|
82
|
+
* Predict: retrieve context that might be relevant next.
|
|
83
|
+
*/
|
|
84
|
+
export declare function predict(context: string, options?: Partial<RetrievalRequest>): Promise<RetrievalResponse>;
|
|
85
|
+
/**
|
|
86
|
+
* Cleanup shared resources.
|
|
87
|
+
*/
|
|
88
|
+
export declare function disposeRetrieval(): Promise<void>;
|
|
89
|
+
//# sourceMappingURL=context-assembler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-assembler.d.ts","sourceRoot":"","sources":["../../src/retrieval/context-assembler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAkBH;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AAE7D;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAEvD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,8CAA8C;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAClC,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qBAAqB;IACrB,IAAI,EAAE,aAAa,CAAC;IACpB,8EAA8E;IAC9E,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,oDAAoD;IACpD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oEAAoE;IACpE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,sEAAsE;IACtE,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,MAAM,EAAE,KAAK,CAAC;QACZ,EAAE,EAAE,MAAM,CAAC;QACX,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;KACrD,CAAC,CAAC;IACH,8BAA8B;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,iCAAiC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,mFAAmF;IACnF,YAAY,EAAE,MAAM,CAAC;CACtB;AAiCD;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAgM3F;AAyGD;;GAEG;AACH,wBAAsB,MAAM,CAC1B,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,OAAO,CAAC,gBAAgB,CAAM,GACtC,OAAO,CAAC,iBAAiB,CAAC,CAM5B;AAED;;GAEG;AACH,wBAAsB,OAAO,CAC3B,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,OAAO,CAAC,gBAAgB,CAAM,GACtC,OAAO,CAAC,iBAAiB,CAAC,CAM5B;AAED;;GAEG;AACH,wBAAsB,OAAO,CAC3B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,OAAO,CAAC,gBAAgB,CAAM,GACtC,OAAO,CAAC,iBAAiB,CAAC,CAM5B;AAED;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAKtD"}
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context assembly for memory retrieval.
|
|
3
|
+
* Combines vector search with graph traversal to assemble relevant context.
|
|
4
|
+
*/
|
|
5
|
+
import { vectorStore } from '../storage/vector-store.js';
|
|
6
|
+
import { getChunkById } from '../storage/chunk-store.js';
|
|
7
|
+
import { Embedder } from '../models/embedder.js';
|
|
8
|
+
import { getModel } from '../models/model-registry.js';
|
|
9
|
+
import { getConfig } from '../config/memory-config.js';
|
|
10
|
+
import { approximateTokens } from '../utils/token-counter.js';
|
|
11
|
+
import { traverseMultiple, dedupeAndRank } from './traverser.js';
|
|
12
|
+
import { getReferenceClock } from '../storage/clock-store.js';
|
|
13
|
+
import { KeywordStore } from '../storage/keyword-store.js';
|
|
14
|
+
import { fuseRRF } from './rrf.js';
|
|
15
|
+
import { expandViaClusters } from './cluster-expander.js';
|
|
16
|
+
import { createLogger } from '../utils/logger.js';
|
|
17
|
+
const log = createLogger('context-assembler');
|
|
18
|
+
/**
|
|
19
|
+
* Shared embedder instance for retrieval.
|
|
20
|
+
*/
|
|
21
|
+
let sharedEmbedder = null;
|
|
22
|
+
/**
|
|
23
|
+
* Get or create shared embedder.
|
|
24
|
+
*/
|
|
25
|
+
async function getEmbedder() {
|
|
26
|
+
if (!sharedEmbedder) {
|
|
27
|
+
sharedEmbedder = new Embedder();
|
|
28
|
+
await sharedEmbedder.load(getModel('jina-small'));
|
|
29
|
+
}
|
|
30
|
+
return sharedEmbedder;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Shared keyword store instance for retrieval.
|
|
34
|
+
*/
|
|
35
|
+
let sharedKeywordStore = null;
|
|
36
|
+
/**
|
|
37
|
+
* Get or create shared keyword store.
|
|
38
|
+
*/
|
|
39
|
+
function getKeywordStore() {
|
|
40
|
+
if (!sharedKeywordStore) {
|
|
41
|
+
sharedKeywordStore = new KeywordStore();
|
|
42
|
+
}
|
|
43
|
+
return sharedKeywordStore;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Assemble context from memory based on a query.
|
|
47
|
+
*
|
|
48
|
+
* Pipeline: embed → [vector search, keyword search] → RRF fusion → cluster expansion
|
|
49
|
+
* → graph traverse → combine → dedupe → recency → budget
|
|
50
|
+
*/
|
|
51
|
+
export async function assembleContext(request) {
|
|
52
|
+
const startTime = Date.now();
|
|
53
|
+
const config = getConfig();
|
|
54
|
+
const { query, currentSessionId, projectSlug, projectFilter, queryTime = Date.now(), maxTokens = config.mcpMaxResponseTokens, mode, range = 'auto', vectorSearchLimit = 20, skipGraph = false, skipClusters = false, } = request;
|
|
55
|
+
const { hybridSearch, clusterExpansion } = config;
|
|
56
|
+
// If projectFilter is a single string, also use it for clock lookup
|
|
57
|
+
const effectiveProjectSlug = projectSlug ??
|
|
58
|
+
(typeof projectFilter === 'string' ? projectFilter : undefined);
|
|
59
|
+
// Get reference clock for vector clock-based decay (if project slug provided)
|
|
60
|
+
const referenceClock = effectiveProjectSlug ? getReferenceClock(effectiveProjectSlug) : undefined;
|
|
61
|
+
// 1. Embed query
|
|
62
|
+
const embedder = await getEmbedder();
|
|
63
|
+
const queryResult = await embedder.embed(query, true); // isQuery = true
|
|
64
|
+
// 2. Run vector search and keyword search in parallel
|
|
65
|
+
const vectorSearchPromise = projectFilter
|
|
66
|
+
? vectorStore.searchByProject(queryResult.embedding, projectFilter, vectorSearchLimit)
|
|
67
|
+
: vectorStore.search(queryResult.embedding, vectorSearchLimit);
|
|
68
|
+
let keywordResults = [];
|
|
69
|
+
try {
|
|
70
|
+
const keywordStore = getKeywordStore();
|
|
71
|
+
keywordResults = projectFilter
|
|
72
|
+
? keywordStore.searchByProject(query, projectFilter, hybridSearch.keywordSearchLimit)
|
|
73
|
+
: keywordStore.search(query, hybridSearch.keywordSearchLimit);
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
// Graceful fallback: keyword search unavailable (FTS5 missing, table corrupted, etc.)
|
|
77
|
+
log.warn('Keyword search unavailable, falling back to vector-only', {
|
|
78
|
+
error: error.message,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
const similar = await vectorSearchPromise;
|
|
82
|
+
if (similar.length === 0 && keywordResults.length === 0) {
|
|
83
|
+
return {
|
|
84
|
+
text: '',
|
|
85
|
+
tokenCount: 0,
|
|
86
|
+
chunks: [],
|
|
87
|
+
totalConsidered: 0,
|
|
88
|
+
durationMs: Date.now() - startTime,
|
|
89
|
+
graphBoosted: 0,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
// 3. Convert to RankedItem format and fuse with RRF
|
|
93
|
+
const vectorItems = similar.map(s => ({
|
|
94
|
+
chunkId: s.id,
|
|
95
|
+
score: Math.max(0, 1 - s.distance),
|
|
96
|
+
source: 'vector',
|
|
97
|
+
}));
|
|
98
|
+
const keywordItems = keywordResults.map(r => ({
|
|
99
|
+
chunkId: r.id,
|
|
100
|
+
score: r.score,
|
|
101
|
+
source: 'keyword',
|
|
102
|
+
}));
|
|
103
|
+
const fusedResults = fuseRRF([
|
|
104
|
+
{ items: vectorItems, weight: hybridSearch.vectorWeight },
|
|
105
|
+
...(keywordItems.length > 0
|
|
106
|
+
? [{ items: keywordItems, weight: hybridSearch.keywordWeight }]
|
|
107
|
+
: []),
|
|
108
|
+
], hybridSearch.rrfK);
|
|
109
|
+
// 4. Cluster expansion (skip if requested for benchmarking)
|
|
110
|
+
const expandedResults = skipClusters
|
|
111
|
+
? fusedResults
|
|
112
|
+
: expandViaClusters(fusedResults, clusterExpansion, projectFilter);
|
|
113
|
+
const sourceMap = new Map();
|
|
114
|
+
for (const item of expandedResults) {
|
|
115
|
+
if (item.source && !sourceMap.has(item.chunkId)) {
|
|
116
|
+
sourceMap.set(item.chunkId, item.source);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// 5. Determine traversal direction and decay model based on mode and range
|
|
120
|
+
const direction = mode === 'predict' ? 'forward' : 'backward';
|
|
121
|
+
let decayConfig;
|
|
122
|
+
if (direction === 'forward') {
|
|
123
|
+
decayConfig = config.forwardDecay;
|
|
124
|
+
}
|
|
125
|
+
else if (range === 'short') {
|
|
126
|
+
decayConfig = config.shortRangeDecay;
|
|
127
|
+
}
|
|
128
|
+
else if (range === 'long') {
|
|
129
|
+
decayConfig = config.longRangeDecay;
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
decayConfig = mode === 'explain' ? config.longRangeDecay : config.shortRangeDecay;
|
|
133
|
+
}
|
|
134
|
+
// 6. Traverse graph from fused+expanded seeds (skip if requested for benchmarking)
|
|
135
|
+
let traversalResult;
|
|
136
|
+
if (skipGraph) {
|
|
137
|
+
traversalResult = { chunks: [], visited: 0 };
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
const startIds = expandedResults.map(r => r.chunkId);
|
|
141
|
+
const startWeights = expandedResults.map(r => r.score);
|
|
142
|
+
traversalResult = await traverseMultiple(startIds, startWeights, queryTime, {
|
|
143
|
+
direction,
|
|
144
|
+
decayConfig,
|
|
145
|
+
referenceClock,
|
|
146
|
+
});
|
|
147
|
+
// Tag traversal results with 'graph' source
|
|
148
|
+
for (const tc of traversalResult.chunks) {
|
|
149
|
+
if (!sourceMap.has(tc.chunkId)) {
|
|
150
|
+
sourceMap.set(tc.chunkId, 'graph');
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// 7. Combine direct hits with traversal, boosting intersection
|
|
155
|
+
const allChunks = [];
|
|
156
|
+
let graphBoostedCount = 0;
|
|
157
|
+
// Build graph traversal lookup
|
|
158
|
+
const graphChunkMap = new Map();
|
|
159
|
+
for (const tc of traversalResult.chunks) {
|
|
160
|
+
graphChunkMap.set(tc.chunkId, tc);
|
|
161
|
+
}
|
|
162
|
+
// Direct hits: boost if also found via graph traversal
|
|
163
|
+
const directChunkIds = new Set();
|
|
164
|
+
for (const item of expandedResults) {
|
|
165
|
+
directChunkIds.add(item.chunkId);
|
|
166
|
+
let weight = item.score * config.directHitBoost;
|
|
167
|
+
const graphEntry = graphChunkMap.get(item.chunkId);
|
|
168
|
+
if (graphEntry) {
|
|
169
|
+
weight += graphEntry.weight * config.graphAgreementBoost;
|
|
170
|
+
graphBoostedCount++;
|
|
171
|
+
}
|
|
172
|
+
allChunks.push({ chunkId: item.chunkId, weight, depth: 0 });
|
|
173
|
+
}
|
|
174
|
+
// Graph-only results: add unchanged
|
|
175
|
+
for (const tc of traversalResult.chunks) {
|
|
176
|
+
if (!directChunkIds.has(tc.chunkId)) {
|
|
177
|
+
allChunks.push(tc);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// 8. Dedupe and rank
|
|
181
|
+
const ranked = dedupeAndRank(allChunks);
|
|
182
|
+
// 9. Apply recency boost for current session
|
|
183
|
+
if (currentSessionId) {
|
|
184
|
+
for (const wc of ranked) {
|
|
185
|
+
const chunk = getChunkById(wc.chunkId);
|
|
186
|
+
if (chunk && chunk.sessionId === currentSessionId) {
|
|
187
|
+
wc.weight *= 1.2; // 20% boost for current session
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
ranked.sort((a, b) => b.weight - a.weight);
|
|
191
|
+
}
|
|
192
|
+
// 10. Assemble within token budget
|
|
193
|
+
const assembled = assembleWithinBudget(ranked, maxTokens, sourceMap);
|
|
194
|
+
return {
|
|
195
|
+
text: assembled.text,
|
|
196
|
+
tokenCount: assembled.tokenCount,
|
|
197
|
+
chunks: assembled.includedChunks,
|
|
198
|
+
totalConsidered: ranked.length,
|
|
199
|
+
durationMs: Date.now() - startTime,
|
|
200
|
+
graphBoosted: graphBoostedCount,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Assemble text within token budget.
|
|
205
|
+
*/
|
|
206
|
+
function assembleWithinBudget(ranked, maxTokens, sourceMap) {
|
|
207
|
+
const parts = [];
|
|
208
|
+
const includedChunks = [];
|
|
209
|
+
let totalTokens = 0;
|
|
210
|
+
for (const wc of ranked) {
|
|
211
|
+
const chunk = getChunkById(wc.chunkId);
|
|
212
|
+
if (!chunk)
|
|
213
|
+
continue;
|
|
214
|
+
const chunkTokens = chunk.approxTokens || approximateTokens(chunk.content);
|
|
215
|
+
// Check if adding this chunk would exceed budget
|
|
216
|
+
if (totalTokens + chunkTokens > maxTokens) {
|
|
217
|
+
// Try to fit a truncated version
|
|
218
|
+
const remainingTokens = maxTokens - totalTokens;
|
|
219
|
+
if (remainingTokens > 100) {
|
|
220
|
+
const truncated = truncateChunk(chunk.content, remainingTokens);
|
|
221
|
+
parts.push(formatChunkForOutput(chunk, truncated, wc.weight));
|
|
222
|
+
totalTokens += approximateTokens(truncated);
|
|
223
|
+
includedChunks.push({
|
|
224
|
+
id: chunk.id,
|
|
225
|
+
sessionSlug: chunk.sessionSlug,
|
|
226
|
+
weight: wc.weight,
|
|
227
|
+
preview: truncated.slice(0, 100) + '...',
|
|
228
|
+
source: sourceMap?.get(chunk.id),
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
break;
|
|
232
|
+
}
|
|
233
|
+
parts.push(formatChunkForOutput(chunk, chunk.content, wc.weight));
|
|
234
|
+
totalTokens += chunkTokens;
|
|
235
|
+
includedChunks.push({
|
|
236
|
+
id: chunk.id,
|
|
237
|
+
sessionSlug: chunk.sessionSlug,
|
|
238
|
+
weight: wc.weight,
|
|
239
|
+
preview: chunk.content.slice(0, 100) + (chunk.content.length > 100 ? '...' : ''),
|
|
240
|
+
source: sourceMap?.get(chunk.id),
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
return {
|
|
244
|
+
text: parts.join('\n\n---\n\n'),
|
|
245
|
+
tokenCount: totalTokens,
|
|
246
|
+
includedChunks,
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Format a chunk for output with metadata header.
|
|
251
|
+
*/
|
|
252
|
+
function formatChunkForOutput(chunk, content, weight) {
|
|
253
|
+
const date = new Date(chunk.startTime).toLocaleDateString();
|
|
254
|
+
const relevance = (weight * 100).toFixed(0);
|
|
255
|
+
return `[Session: ${chunk.sessionSlug} | Date: ${date} | Relevance: ${relevance}%]\n${content}`;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Truncate chunk content to fit token budget.
|
|
259
|
+
*/
|
|
260
|
+
function truncateChunk(content, maxTokens) {
|
|
261
|
+
// Rough estimate: 4 chars per token
|
|
262
|
+
const maxChars = maxTokens * 4;
|
|
263
|
+
if (content.length <= maxChars) {
|
|
264
|
+
return content;
|
|
265
|
+
}
|
|
266
|
+
// Try to cut at a paragraph boundary
|
|
267
|
+
const truncated = content.slice(0, maxChars);
|
|
268
|
+
const lastNewline = truncated.lastIndexOf('\n\n');
|
|
269
|
+
if (lastNewline > maxChars * 0.5) {
|
|
270
|
+
return truncated.slice(0, lastNewline) + '\n\n...[truncated]';
|
|
271
|
+
}
|
|
272
|
+
return truncated + '\n...[truncated]';
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Recall: retrieve context relevant to a query.
|
|
276
|
+
*/
|
|
277
|
+
export async function recall(query, options = {}) {
|
|
278
|
+
return assembleContext({
|
|
279
|
+
query,
|
|
280
|
+
mode: 'recall',
|
|
281
|
+
...options,
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Explain: retrieve context that explains how we got to current state.
|
|
286
|
+
*/
|
|
287
|
+
export async function explain(topic, options = {}) {
|
|
288
|
+
return assembleContext({
|
|
289
|
+
query: topic,
|
|
290
|
+
mode: 'explain',
|
|
291
|
+
...options,
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Predict: retrieve context that might be relevant next.
|
|
296
|
+
*/
|
|
297
|
+
export async function predict(context, options = {}) {
|
|
298
|
+
return assembleContext({
|
|
299
|
+
query: context,
|
|
300
|
+
mode: 'predict',
|
|
301
|
+
...options,
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Cleanup shared resources.
|
|
306
|
+
*/
|
|
307
|
+
export async function disposeRetrieval() {
|
|
308
|
+
if (sharedEmbedder) {
|
|
309
|
+
await sharedEmbedder.dispose();
|
|
310
|
+
sharedEmbedder = null;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
//# sourceMappingURL=context-assembler.js.map
|