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,440 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory vector store with SQLite persistence.
|
|
3
|
+
*
|
|
4
|
+
* Provides vector similarity search for chunk embeddings using angular distance.
|
|
5
|
+
* Embeddings are stored as Float32Array blobs in SQLite and loaded into memory
|
|
6
|
+
* on first access for fast brute-force search.
|
|
7
|
+
*
|
|
8
|
+
* ## Architecture
|
|
9
|
+
*
|
|
10
|
+
* ```
|
|
11
|
+
* ┌─────────────────────────────────────────────────────────────┐
|
|
12
|
+
* │ VectorStore │
|
|
13
|
+
* │ ┌─────────────────────┐ ┌─────────────────────────────┐ │
|
|
14
|
+
* │ │ In-Memory Index │ │ SQLite Persistence │ │
|
|
15
|
+
* │ │ Map<id, number[]> │ ◄──┤ vectors (id, embedding, │ │
|
|
16
|
+
* │ └─────────────────────┘ │ last_accessed) │ │
|
|
17
|
+
* │ └─────────────────────────────┘ │
|
|
18
|
+
* └─────────────────────────────────────────────────────────────┘
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* ## TTL (Time To Live)
|
|
22
|
+
*
|
|
23
|
+
* Vectors have a `last_accessed` timestamp that is updated when they are
|
|
24
|
+
* returned from search. Vectors that haven't been accessed within the TTL
|
|
25
|
+
* period can be cleaned up by the maintenance task.
|
|
26
|
+
*
|
|
27
|
+
* This allows vectors to persist for semantic search even after their
|
|
28
|
+
* associated chunks are pruned from the causal graph, while still eventually
|
|
29
|
+
* cleaning up truly stale vectors.
|
|
30
|
+
*
|
|
31
|
+
* ## Usage
|
|
32
|
+
*
|
|
33
|
+
* ```typescript
|
|
34
|
+
* import { vectorStore } from './vector-store.js';
|
|
35
|
+
*
|
|
36
|
+
* // Insert an embedding
|
|
37
|
+
* await vectorStore.insert('chunk-123', embedding);
|
|
38
|
+
*
|
|
39
|
+
* // Search for similar vectors
|
|
40
|
+
* const results = await vectorStore.search(queryEmbedding, 10);
|
|
41
|
+
* // Returns: [{ id: 'chunk-456', distance: 0.15 }, ...]
|
|
42
|
+
* // (also updates last_accessed for returned vectors)
|
|
43
|
+
* ```
|
|
44
|
+
*
|
|
45
|
+
* ## Distance Metric
|
|
46
|
+
*
|
|
47
|
+
* Uses angular distance (0 = identical, 2 = opposite):
|
|
48
|
+
* - `0.0`: Identical vectors
|
|
49
|
+
* - `0.5`: ~60° angle
|
|
50
|
+
* - `1.0`: Orthogonal (90°)
|
|
51
|
+
* - `2.0`: Opposite vectors
|
|
52
|
+
*
|
|
53
|
+
* ## Performance Notes
|
|
54
|
+
*
|
|
55
|
+
* - Initial load: O(n) to deserialize all vectors from SQLite
|
|
56
|
+
* - Insert: O(1) amortized (memory + single row insert)
|
|
57
|
+
* - Search: O(n) brute-force (sufficient for <100k vectors)
|
|
58
|
+
* - Memory: ~4KB per vector (1024 dimensions × 4 bytes)
|
|
59
|
+
*
|
|
60
|
+
* For larger scale, consider upgrading to LanceDB or FAISS.
|
|
61
|
+
*
|
|
62
|
+
* @module storage/vector-store
|
|
63
|
+
*/
|
|
64
|
+
import { getDb } from './db.js';
|
|
65
|
+
import { angularDistance } from '../utils/angular-distance.js';
|
|
66
|
+
import { createLogger } from '../utils/logger.js';
|
|
67
|
+
import { serializeEmbedding, deserializeEmbedding } from '../utils/embedding-utils.js';
|
|
68
|
+
const log = createLogger('vector-store');
|
|
69
|
+
/**
|
|
70
|
+
* In-memory vector index backed by SQLite for persistence.
|
|
71
|
+
*
|
|
72
|
+
* Uses lazy loading — vectors are loaded from SQLite on first operation.
|
|
73
|
+
* All operations are async to support future migration to async storage backends.
|
|
74
|
+
*
|
|
75
|
+
* Thread safety: Single-threaded (Node.js). For concurrent access, use
|
|
76
|
+
* the singleton `vectorStore` export which ensures consistent state.
|
|
77
|
+
*/
|
|
78
|
+
// Export class for testing (allows creating fresh instances)
|
|
79
|
+
export class VectorStore {
|
|
80
|
+
vectors = new Map();
|
|
81
|
+
loaded = false;
|
|
82
|
+
/** chunkId → projectSlug index for project-filtered search */
|
|
83
|
+
chunkProjectIndex = new Map();
|
|
84
|
+
/**
|
|
85
|
+
* Load vectors from database into memory.
|
|
86
|
+
*/
|
|
87
|
+
async load() {
|
|
88
|
+
if (this.loaded)
|
|
89
|
+
return;
|
|
90
|
+
const db = getDb();
|
|
91
|
+
// Ensure vectors table exists with TTL columns
|
|
92
|
+
db.exec(`
|
|
93
|
+
CREATE TABLE IF NOT EXISTS vectors (
|
|
94
|
+
id TEXT PRIMARY KEY,
|
|
95
|
+
embedding BLOB NOT NULL,
|
|
96
|
+
orphaned_at TEXT DEFAULT NULL,
|
|
97
|
+
last_accessed TEXT DEFAULT CURRENT_TIMESTAMP
|
|
98
|
+
)
|
|
99
|
+
`);
|
|
100
|
+
// Migrate existing tables
|
|
101
|
+
const columns = db.prepare("PRAGMA table_info(vectors)").all();
|
|
102
|
+
const hasOrphanedAt = columns.some((c) => c.name === 'orphaned_at');
|
|
103
|
+
const hasLastAccessed = columns.some((c) => c.name === 'last_accessed');
|
|
104
|
+
if (!hasOrphanedAt) {
|
|
105
|
+
db.exec("ALTER TABLE vectors ADD COLUMN orphaned_at TEXT DEFAULT NULL");
|
|
106
|
+
}
|
|
107
|
+
if (!hasLastAccessed) {
|
|
108
|
+
db.exec("ALTER TABLE vectors ADD COLUMN last_accessed TEXT DEFAULT CURRENT_TIMESTAMP");
|
|
109
|
+
db.exec("UPDATE vectors SET last_accessed = CURRENT_TIMESTAMP WHERE last_accessed IS NULL");
|
|
110
|
+
}
|
|
111
|
+
const rows = db.prepare('SELECT id, embedding FROM vectors').all();
|
|
112
|
+
for (const row of rows) {
|
|
113
|
+
const embedding = deserializeEmbedding(row.embedding);
|
|
114
|
+
this.vectors.set(row.id, embedding);
|
|
115
|
+
}
|
|
116
|
+
// Populate chunk→project index from chunks table
|
|
117
|
+
try {
|
|
118
|
+
const chunkRows = db.prepare("SELECT id, session_slug FROM chunks WHERE session_slug != ''").all();
|
|
119
|
+
for (const row of chunkRows) {
|
|
120
|
+
this.chunkProjectIndex.set(row.id, row.session_slug);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
// chunks table may not exist yet (e.g., during migrations)
|
|
125
|
+
}
|
|
126
|
+
this.loaded = true;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Insert a vector.
|
|
130
|
+
*/
|
|
131
|
+
async insert(id, embedding) {
|
|
132
|
+
await this.load();
|
|
133
|
+
const db = getDb();
|
|
134
|
+
const blob = serializeEmbedding(embedding);
|
|
135
|
+
db.prepare('INSERT OR REPLACE INTO vectors (id, embedding, orphaned_at, last_accessed) VALUES (?, ?, NULL, CURRENT_TIMESTAMP)').run(id, blob);
|
|
136
|
+
this.vectors.set(id, embedding);
|
|
137
|
+
// Update project index
|
|
138
|
+
try {
|
|
139
|
+
const row = db.prepare('SELECT session_slug FROM chunks WHERE id = ?').get(id);
|
|
140
|
+
if (row?.session_slug) {
|
|
141
|
+
this.chunkProjectIndex.set(id, row.session_slug);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
// chunks table may not exist
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Insert multiple vectors in a transaction.
|
|
150
|
+
*/
|
|
151
|
+
async insertBatch(items) {
|
|
152
|
+
await this.load();
|
|
153
|
+
const db = getDb();
|
|
154
|
+
const stmt = db.prepare('INSERT OR REPLACE INTO vectors (id, embedding, orphaned_at, last_accessed) VALUES (?, ?, NULL, CURRENT_TIMESTAMP)');
|
|
155
|
+
const insertMany = db.transaction((items) => {
|
|
156
|
+
for (const item of items) {
|
|
157
|
+
const blob = serializeEmbedding(item.embedding);
|
|
158
|
+
stmt.run(item.id, blob);
|
|
159
|
+
this.vectors.set(item.id, item.embedding);
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
insertMany(items);
|
|
163
|
+
// Update project index for batch
|
|
164
|
+
try {
|
|
165
|
+
const ids = items.map(i => i.id);
|
|
166
|
+
if (ids.length > 0) {
|
|
167
|
+
const placeholders = ids.map(() => '?').join(',');
|
|
168
|
+
const rows = db.prepare(`SELECT id, session_slug FROM chunks WHERE id IN (${placeholders}) AND session_slug != ''`).all(...ids);
|
|
169
|
+
for (const row of rows) {
|
|
170
|
+
this.chunkProjectIndex.set(row.id, row.session_slug);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
// chunks table may not exist
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Get a vector by ID.
|
|
180
|
+
*/
|
|
181
|
+
async get(id) {
|
|
182
|
+
await this.load();
|
|
183
|
+
return this.vectors.get(id) ?? null;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Search for similar vectors using angular distance.
|
|
187
|
+
*
|
|
188
|
+
* Uses brute-force search over all vectors in memory. For small to medium
|
|
189
|
+
* datasets (<100k vectors), this is fast enough. For larger datasets,
|
|
190
|
+
* consider approximate nearest neighbor (ANN) algorithms.
|
|
191
|
+
*
|
|
192
|
+
* Also updates `last_accessed` timestamp for returned vectors, keeping
|
|
193
|
+
* them alive for TTL purposes.
|
|
194
|
+
*
|
|
195
|
+
* @param query - Query embedding vector (must match stored dimensionality)
|
|
196
|
+
* @param limit - Maximum number of results to return
|
|
197
|
+
* @returns Results sorted by distance ascending (closest first)
|
|
198
|
+
*
|
|
199
|
+
* @example
|
|
200
|
+
* ```typescript
|
|
201
|
+
* const results = await vectorStore.search(queryEmbedding, 10);
|
|
202
|
+
* for (const { id, distance } of results) {
|
|
203
|
+
* console.log(`${id}: distance=${distance.toFixed(3)}`);
|
|
204
|
+
* }
|
|
205
|
+
* ```
|
|
206
|
+
*/
|
|
207
|
+
async search(query, limit) {
|
|
208
|
+
await this.load();
|
|
209
|
+
const results = [];
|
|
210
|
+
for (const [id, embedding] of this.vectors) {
|
|
211
|
+
const distance = angularDistance(query, embedding);
|
|
212
|
+
results.push({ id, distance });
|
|
213
|
+
}
|
|
214
|
+
// Sort by distance and take top k
|
|
215
|
+
results.sort((a, b) => a.distance - b.distance);
|
|
216
|
+
const topResults = results.slice(0, limit);
|
|
217
|
+
// Touch last_accessed for returned vectors (async, non-blocking)
|
|
218
|
+
if (topResults.length > 0) {
|
|
219
|
+
this.touchLastAccessed(topResults.map((r) => r.id));
|
|
220
|
+
}
|
|
221
|
+
return topResults;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Search within a subset of IDs.
|
|
225
|
+
* Also updates last_accessed for returned vectors.
|
|
226
|
+
*/
|
|
227
|
+
async searchWithinIds(query, candidateIds, limit) {
|
|
228
|
+
await this.load();
|
|
229
|
+
const results = [];
|
|
230
|
+
const idSet = new Set(candidateIds);
|
|
231
|
+
for (const [id, embedding] of this.vectors) {
|
|
232
|
+
if (!idSet.has(id))
|
|
233
|
+
continue;
|
|
234
|
+
const distance = angularDistance(query, embedding);
|
|
235
|
+
results.push({ id, distance });
|
|
236
|
+
}
|
|
237
|
+
results.sort((a, b) => a.distance - b.distance);
|
|
238
|
+
const topResults = results.slice(0, limit);
|
|
239
|
+
// Touch last_accessed for returned vectors
|
|
240
|
+
if (topResults.length > 0) {
|
|
241
|
+
this.touchLastAccessed(topResults.map((r) => r.id));
|
|
242
|
+
}
|
|
243
|
+
return topResults;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Search for similar vectors filtered to specific project(s).
|
|
247
|
+
*
|
|
248
|
+
* Skips vectors not belonging to the specified project(s) during
|
|
249
|
+
* distance computation (more efficient than post-filtering).
|
|
250
|
+
*
|
|
251
|
+
* @param query - Query embedding vector
|
|
252
|
+
* @param projects - Single project slug or array of project slugs
|
|
253
|
+
* @param limit - Maximum results
|
|
254
|
+
* @returns Results sorted by distance ascending
|
|
255
|
+
*/
|
|
256
|
+
async searchByProject(query, projects, limit) {
|
|
257
|
+
await this.load();
|
|
258
|
+
const projectSet = new Set(Array.isArray(projects) ? projects : [projects]);
|
|
259
|
+
const results = [];
|
|
260
|
+
for (const [id, embedding] of this.vectors) {
|
|
261
|
+
const project = this.chunkProjectIndex.get(id);
|
|
262
|
+
if (!project || !projectSet.has(project))
|
|
263
|
+
continue;
|
|
264
|
+
const distance = angularDistance(query, embedding);
|
|
265
|
+
results.push({ id, distance });
|
|
266
|
+
}
|
|
267
|
+
results.sort((a, b) => a.distance - b.distance);
|
|
268
|
+
const topResults = results.slice(0, limit);
|
|
269
|
+
if (topResults.length > 0) {
|
|
270
|
+
this.touchLastAccessed(topResults.map((r) => r.id));
|
|
271
|
+
}
|
|
272
|
+
return topResults;
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Get the project slug for a chunk ID.
|
|
276
|
+
*/
|
|
277
|
+
getChunkProject(id) {
|
|
278
|
+
return this.chunkProjectIndex.get(id);
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Delete a vector.
|
|
282
|
+
*/
|
|
283
|
+
async delete(id) {
|
|
284
|
+
await this.load();
|
|
285
|
+
const db = getDb();
|
|
286
|
+
const result = db.prepare('DELETE FROM vectors WHERE id = ?').run(id);
|
|
287
|
+
this.vectors.delete(id);
|
|
288
|
+
return result.changes > 0;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Delete multiple vectors.
|
|
292
|
+
*/
|
|
293
|
+
async deleteBatch(ids) {
|
|
294
|
+
if (ids.length === 0)
|
|
295
|
+
return 0;
|
|
296
|
+
await this.load();
|
|
297
|
+
const db = getDb();
|
|
298
|
+
const placeholders = ids.map(() => '?').join(',');
|
|
299
|
+
const result = db.prepare(`DELETE FROM vectors WHERE id IN (${placeholders})`).run(...ids);
|
|
300
|
+
for (const id of ids) {
|
|
301
|
+
this.vectors.delete(id);
|
|
302
|
+
}
|
|
303
|
+
return result.changes;
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Get vector count.
|
|
307
|
+
*/
|
|
308
|
+
async count() {
|
|
309
|
+
await this.load();
|
|
310
|
+
return this.vectors.size;
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Check if a vector exists.
|
|
314
|
+
*/
|
|
315
|
+
async has(id) {
|
|
316
|
+
await this.load();
|
|
317
|
+
return this.vectors.has(id);
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Clear all vectors (for testing).
|
|
321
|
+
*/
|
|
322
|
+
async clear() {
|
|
323
|
+
const db = getDb();
|
|
324
|
+
db.exec('DELETE FROM vectors');
|
|
325
|
+
this.vectors.clear();
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Get all vector IDs.
|
|
329
|
+
*/
|
|
330
|
+
async getAllIds() {
|
|
331
|
+
await this.load();
|
|
332
|
+
return Array.from(this.vectors.keys());
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Get all vectors as an array (for clustering).
|
|
336
|
+
*/
|
|
337
|
+
async getAllVectors() {
|
|
338
|
+
await this.load();
|
|
339
|
+
return Array.from(this.vectors.entries()).map(([id, embedding]) => ({
|
|
340
|
+
id,
|
|
341
|
+
embedding,
|
|
342
|
+
}));
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Reset loaded state (for testing).
|
|
346
|
+
*/
|
|
347
|
+
reset() {
|
|
348
|
+
this.vectors.clear();
|
|
349
|
+
this.chunkProjectIndex.clear();
|
|
350
|
+
this.loaded = false;
|
|
351
|
+
}
|
|
352
|
+
// ─── TTL Management ─────────────────────────────────────────────────────────
|
|
353
|
+
/**
|
|
354
|
+
* Update last_accessed timestamp for vectors.
|
|
355
|
+
* Called when vectors are returned from search to keep them alive.
|
|
356
|
+
*/
|
|
357
|
+
touchLastAccessed(ids) {
|
|
358
|
+
if (ids.length === 0)
|
|
359
|
+
return;
|
|
360
|
+
const db = getDb();
|
|
361
|
+
const placeholders = ids.map(() => '?').join(',');
|
|
362
|
+
db.prepare(`UPDATE vectors SET last_accessed = CURRENT_TIMESTAMP WHERE id IN (${placeholders})`).run(...ids);
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Mark a vector as orphaned (its associated chunk was deleted).
|
|
366
|
+
* The vector will be subject to TTL cleanup after this.
|
|
367
|
+
* Called by pruner when deleting orphaned chunks.
|
|
368
|
+
*/
|
|
369
|
+
async markOrphaned(id) {
|
|
370
|
+
await this.load();
|
|
371
|
+
const db = getDb();
|
|
372
|
+
db.prepare('UPDATE vectors SET orphaned_at = CURRENT_TIMESTAMP, last_accessed = CURRENT_TIMESTAMP WHERE id = ?').run(id);
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Mark multiple vectors as orphaned.
|
|
376
|
+
*/
|
|
377
|
+
async markOrphanedBatch(ids) {
|
|
378
|
+
if (ids.length === 0)
|
|
379
|
+
return;
|
|
380
|
+
await this.load();
|
|
381
|
+
const db = getDb();
|
|
382
|
+
const placeholders = ids.map(() => '?').join(',');
|
|
383
|
+
db.prepare(`UPDATE vectors SET orphaned_at = CURRENT_TIMESTAMP, last_accessed = CURRENT_TIMESTAMP WHERE id IN (${placeholders})`).run(...ids);
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Clean up expired orphaned vectors and their corresponding chunks.
|
|
387
|
+
* Removes vectors that are orphaned AND haven't been accessed within the TTL period.
|
|
388
|
+
* Also deletes the corresponding chunks (FK cascades handle cluster assignments and edges).
|
|
389
|
+
*
|
|
390
|
+
* @param ttlDays - Number of days after which orphaned vectors expire
|
|
391
|
+
* @returns Number of vectors deleted
|
|
392
|
+
*/
|
|
393
|
+
async cleanupExpired(ttlDays) {
|
|
394
|
+
await this.load();
|
|
395
|
+
const db = getDb();
|
|
396
|
+
// Find expired orphaned vectors
|
|
397
|
+
const expiredRows = db.prepare(`
|
|
398
|
+
SELECT id FROM vectors
|
|
399
|
+
WHERE orphaned_at IS NOT NULL
|
|
400
|
+
AND last_accessed < datetime('now', '-' || ? || ' days')
|
|
401
|
+
`).all(ttlDays);
|
|
402
|
+
if (expiredRows.length === 0) {
|
|
403
|
+
return 0;
|
|
404
|
+
}
|
|
405
|
+
const expiredIds = expiredRows.map((r) => r.id);
|
|
406
|
+
const placeholders = expiredIds.map(() => '?').join(',');
|
|
407
|
+
// Delete chunks first (FK cascades handle chunk_clusters and edges)
|
|
408
|
+
db.prepare(`DELETE FROM chunks WHERE id IN (${placeholders})`).run(...expiredIds);
|
|
409
|
+
// Delete vectors
|
|
410
|
+
const result = db.prepare(`DELETE FROM vectors WHERE id IN (${placeholders})`).run(...expiredIds);
|
|
411
|
+
// Remove empty clusters (no remaining members after chunk deletion)
|
|
412
|
+
db.prepare(`
|
|
413
|
+
DELETE FROM clusters WHERE id NOT IN (
|
|
414
|
+
SELECT DISTINCT cluster_id FROM chunk_clusters
|
|
415
|
+
)
|
|
416
|
+
`).run();
|
|
417
|
+
// Remove from memory
|
|
418
|
+
for (const id of expiredIds) {
|
|
419
|
+
this.vectors.delete(id);
|
|
420
|
+
}
|
|
421
|
+
return result.changes;
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* Get count of orphaned vectors.
|
|
425
|
+
*/
|
|
426
|
+
async getOrphanedCount() {
|
|
427
|
+
await this.load();
|
|
428
|
+
const db = getDb();
|
|
429
|
+
const row = db.prepare('SELECT COUNT(*) as count FROM vectors WHERE orphaned_at IS NOT NULL').get();
|
|
430
|
+
return row.count;
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* Singleton vector store instance.
|
|
435
|
+
*
|
|
436
|
+
* Use this for all vector operations to ensure consistent state.
|
|
437
|
+
* The instance lazy-loads vectors from SQLite on first operation.
|
|
438
|
+
*/
|
|
439
|
+
export const vectorStore = new VectorStore();
|
|
440
|
+
//# sourceMappingURL=vector-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vector-store.js","sourceRoot":"","sources":["../../src/storage/vector-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Clock compaction for reference clocks.
|
|
3
|
+
*
|
|
4
|
+
* Reference clocks accumulate agent entries over time. This module provides
|
|
5
|
+
* compaction to prune entries only when ALL edges referencing that agent
|
|
6
|
+
* have fully decayed.
|
|
7
|
+
*
|
|
8
|
+
* Why not prune by tick recency:
|
|
9
|
+
* An agent may not tick for a long time, but edges referencing it could still
|
|
10
|
+
* be queried. Pruning based on tick recency would break hop count calculation
|
|
11
|
+
* for those edges.
|
|
12
|
+
*/
|
|
13
|
+
import { type VectorClock } from './vector-clock.js';
|
|
14
|
+
import { type VectorDecayConfig } from '../storage/decay.js';
|
|
15
|
+
/**
|
|
16
|
+
* Result of clock compaction.
|
|
17
|
+
*/
|
|
18
|
+
export interface CompactionResult {
|
|
19
|
+
/** Agent IDs that were pruned */
|
|
20
|
+
prunedAgents: string[];
|
|
21
|
+
/** Number of agent entries remaining */
|
|
22
|
+
remainingAgents: number;
|
|
23
|
+
/** Duration of compaction in milliseconds */
|
|
24
|
+
durationMs: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Compact the reference clock for a project by removing agent entries
|
|
28
|
+
* that no longer have any live edges referencing them.
|
|
29
|
+
*
|
|
30
|
+
* @param projectSlug - Project identifier
|
|
31
|
+
* @param vectorConfig - Vector decay configuration (optional)
|
|
32
|
+
* @returns Compaction result
|
|
33
|
+
*/
|
|
34
|
+
export declare function compactReferenceClock(projectSlug: string, vectorConfig?: VectorDecayConfig): Promise<CompactionResult>;
|
|
35
|
+
/**
|
|
36
|
+
* Get statistics about clock entries for a project.
|
|
37
|
+
*
|
|
38
|
+
* @param projectSlug - Project identifier
|
|
39
|
+
* @returns Clock statistics
|
|
40
|
+
*/
|
|
41
|
+
export declare function getClockStats(projectSlug: string): {
|
|
42
|
+
agentCount: number;
|
|
43
|
+
totalTicks: number;
|
|
44
|
+
agents: Array<{
|
|
45
|
+
agentId: string;
|
|
46
|
+
ticks: number;
|
|
47
|
+
}>;
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Estimate the "age" of edges in hop count terms.
|
|
51
|
+
* Returns distribution of edges by hop count.
|
|
52
|
+
*
|
|
53
|
+
* @param projectSlug - Project identifier
|
|
54
|
+
* @returns Histogram of hop counts
|
|
55
|
+
*/
|
|
56
|
+
export declare function getHopCountDistribution(projectSlug: string): Promise<Map<number, number>>;
|
|
57
|
+
/**
|
|
58
|
+
* Force refresh the reference clock by merging all agent clocks.
|
|
59
|
+
* Useful after data recovery or manual edits.
|
|
60
|
+
*
|
|
61
|
+
* @param projectSlug - Project identifier
|
|
62
|
+
* @returns The refreshed reference clock
|
|
63
|
+
*/
|
|
64
|
+
export declare function refreshReferenceClock(projectSlug: string): VectorClock;
|
|
65
|
+
//# sourceMappingURL=clock-compactor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clock-compactor.d.ts","sourceRoot":"","sources":["../../src/temporal/clock-compactor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAQH,OAAO,EACL,KAAK,WAAW,EAGjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,KAAK,iBAAiB,EAAwB,MAAM,qBAAqB,CAAC;AAGnF;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iCAAiC;IACjC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,wCAAwC;IACxC,eAAe,EAAE,MAAM,CAAC;IACxB,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,YAAY,CAAC,EAAE,iBAAiB,GAC/B,OAAO,CAAC,gBAAgB,CAAC,CAyC3B;AA8CD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG;IAClD,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnD,CAYA;AAED;;;;;;GAMG;AACH,wBAAsB,uBAAuB,CAC3C,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAsB9B;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,CAYtE"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Clock compaction for reference clocks.
|
|
3
|
+
*
|
|
4
|
+
* Reference clocks accumulate agent entries over time. This module provides
|
|
5
|
+
* compaction to prune entries only when ALL edges referencing that agent
|
|
6
|
+
* have fully decayed.
|
|
7
|
+
*
|
|
8
|
+
* Why not prune by tick recency:
|
|
9
|
+
* An agent may not tick for a long time, but edges referencing it could still
|
|
10
|
+
* be queried. Pruning based on tick recency would break hop count calculation
|
|
11
|
+
* for those edges.
|
|
12
|
+
*/
|
|
13
|
+
import { getDb } from '../storage/db.js';
|
|
14
|
+
import { getReferenceClock, setReferenceClock, getAllAgentClocks, } from '../storage/clock-store.js';
|
|
15
|
+
import { hopCount, deserialize, } from './vector-clock.js';
|
|
16
|
+
import { DEFAULT_VECTOR_DECAY } from '../storage/decay.js';
|
|
17
|
+
import { getConfig } from '../config/memory-config.js';
|
|
18
|
+
/**
|
|
19
|
+
* Compact the reference clock for a project by removing agent entries
|
|
20
|
+
* that no longer have any live edges referencing them.
|
|
21
|
+
*
|
|
22
|
+
* @param projectSlug - Project identifier
|
|
23
|
+
* @param vectorConfig - Vector decay configuration (optional)
|
|
24
|
+
* @returns Compaction result
|
|
25
|
+
*/
|
|
26
|
+
export async function compactReferenceClock(projectSlug, vectorConfig) {
|
|
27
|
+
const startTime = Date.now();
|
|
28
|
+
const config = vectorConfig ?? getConfig().vectorDecay ?? DEFAULT_VECTOR_DECAY;
|
|
29
|
+
const refClock = getReferenceClock(projectSlug);
|
|
30
|
+
const agentIds = Object.keys(refClock);
|
|
31
|
+
if (agentIds.length === 0) {
|
|
32
|
+
return {
|
|
33
|
+
prunedAgents: [],
|
|
34
|
+
remainingAgents: 0,
|
|
35
|
+
durationMs: Date.now() - startTime,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
const prunedAgents = [];
|
|
39
|
+
for (const agentId of agentIds) {
|
|
40
|
+
const hasLiveEdges = await hasEdgesReferencingAgent(projectSlug, agentId, refClock, config);
|
|
41
|
+
if (!hasLiveEdges) {
|
|
42
|
+
prunedAgents.push(agentId);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (prunedAgents.length > 0) {
|
|
46
|
+
// Remove pruned agents from reference clock
|
|
47
|
+
const newClock = {};
|
|
48
|
+
for (const [id, ticks] of Object.entries(refClock)) {
|
|
49
|
+
if (!prunedAgents.includes(id)) {
|
|
50
|
+
newClock[id] = ticks;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
setReferenceClock(projectSlug, newClock);
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
prunedAgents,
|
|
57
|
+
remainingAgents: agentIds.length - prunedAgents.length,
|
|
58
|
+
durationMs: Date.now() - startTime,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Check if any live edges reference a specific agent in their vector clock.
|
|
63
|
+
*
|
|
64
|
+
* @param projectSlug - Project identifier
|
|
65
|
+
* @param agentId - Agent ID to check
|
|
66
|
+
* @param refClock - Current reference clock
|
|
67
|
+
* @param config - Vector decay configuration
|
|
68
|
+
* @returns true if at least one live edge references this agent
|
|
69
|
+
*/
|
|
70
|
+
async function hasEdgesReferencingAgent(projectSlug, agentId, refClock, config) {
|
|
71
|
+
const db = getDb();
|
|
72
|
+
// Find edges in this project whose vector_clock contains this agentId
|
|
73
|
+
// We use LIKE to find JSON containing the agent ID
|
|
74
|
+
const rows = db.prepare(`
|
|
75
|
+
SELECT e.vector_clock FROM edges e
|
|
76
|
+
JOIN chunks c ON e.source_chunk_id = c.id
|
|
77
|
+
WHERE c.session_slug = ?
|
|
78
|
+
AND e.vector_clock LIKE ?
|
|
79
|
+
`).all(projectSlug, `%"${agentId}":%`);
|
|
80
|
+
for (const row of rows) {
|
|
81
|
+
if (!row.vector_clock)
|
|
82
|
+
continue;
|
|
83
|
+
const edgeClock = deserialize(row.vector_clock);
|
|
84
|
+
if (!(agentId in edgeClock))
|
|
85
|
+
continue;
|
|
86
|
+
// Calculate if edge is still alive
|
|
87
|
+
const hops = hopCount(edgeClock, refClock);
|
|
88
|
+
const weight = Math.pow(config.weightPerHop, hops);
|
|
89
|
+
if (weight >= config.minWeight) {
|
|
90
|
+
return true; // At least one live edge references this agent
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return false; // No live edges reference this agent
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Get statistics about clock entries for a project.
|
|
97
|
+
*
|
|
98
|
+
* @param projectSlug - Project identifier
|
|
99
|
+
* @returns Clock statistics
|
|
100
|
+
*/
|
|
101
|
+
export function getClockStats(projectSlug) {
|
|
102
|
+
const refClock = getReferenceClock(projectSlug);
|
|
103
|
+
const agents = Object.entries(refClock).map(([agentId, ticks]) => ({
|
|
104
|
+
agentId,
|
|
105
|
+
ticks,
|
|
106
|
+
}));
|
|
107
|
+
return {
|
|
108
|
+
agentCount: agents.length,
|
|
109
|
+
totalTicks: agents.reduce((sum, a) => sum + a.ticks, 0),
|
|
110
|
+
agents: agents.sort((a, b) => b.ticks - a.ticks),
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Estimate the "age" of edges in hop count terms.
|
|
115
|
+
* Returns distribution of edges by hop count.
|
|
116
|
+
*
|
|
117
|
+
* @param projectSlug - Project identifier
|
|
118
|
+
* @returns Histogram of hop counts
|
|
119
|
+
*/
|
|
120
|
+
export async function getHopCountDistribution(projectSlug) {
|
|
121
|
+
const db = getDb();
|
|
122
|
+
const refClock = getReferenceClock(projectSlug);
|
|
123
|
+
const distribution = new Map();
|
|
124
|
+
const rows = db.prepare(`
|
|
125
|
+
SELECT e.vector_clock FROM edges e
|
|
126
|
+
JOIN chunks c ON e.source_chunk_id = c.id
|
|
127
|
+
WHERE c.session_slug = ?
|
|
128
|
+
AND e.vector_clock IS NOT NULL
|
|
129
|
+
`).all(projectSlug);
|
|
130
|
+
for (const row of rows) {
|
|
131
|
+
if (!row.vector_clock)
|
|
132
|
+
continue;
|
|
133
|
+
const edgeClock = deserialize(row.vector_clock);
|
|
134
|
+
const hops = hopCount(edgeClock, refClock);
|
|
135
|
+
distribution.set(hops, (distribution.get(hops) ?? 0) + 1);
|
|
136
|
+
}
|
|
137
|
+
return distribution;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Force refresh the reference clock by merging all agent clocks.
|
|
141
|
+
* Useful after data recovery or manual edits.
|
|
142
|
+
*
|
|
143
|
+
* @param projectSlug - Project identifier
|
|
144
|
+
* @returns The refreshed reference clock
|
|
145
|
+
*/
|
|
146
|
+
export function refreshReferenceClock(projectSlug) {
|
|
147
|
+
const agentClocks = getAllAgentClocks(projectSlug);
|
|
148
|
+
const refClock = {};
|
|
149
|
+
for (const [, clock] of agentClocks) {
|
|
150
|
+
for (const [agentId, ticks] of Object.entries(clock)) {
|
|
151
|
+
refClock[agentId] = Math.max(refClock[agentId] ?? 0, ticks);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
setReferenceClock(projectSlug, refClock);
|
|
155
|
+
return refClock;
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=clock-compactor.js.map
|