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,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Experiment 2: HDBSCAN minClusterSize Sweep
|
|
3
|
+
*
|
|
4
|
+
* Question: Is minClusterSize=3 optimal, or are we leaving structure on the table?
|
|
5
|
+
*
|
|
6
|
+
* Reuses jina-small embeddings and sweeps minClusterSize from 2 to 10,
|
|
7
|
+
* recording cluster count, noise ratio, and silhouette score for each.
|
|
8
|
+
*/
|
|
9
|
+
import { clusterEmbeddings } from '../cluster-evaluator.js';
|
|
10
|
+
import { silhouetteScore } from '../metrics.js';
|
|
11
|
+
import { singleModelRun } from './single-model-run.js';
|
|
12
|
+
const MODEL_ID = 'jina-small';
|
|
13
|
+
const MIN_CLUSTER_SIZES = [2, 3, 4, 5, 6, 7, 8, 9, 10];
|
|
14
|
+
/**
|
|
15
|
+
* Run the HDBSCAN parameter sweep.
|
|
16
|
+
*
|
|
17
|
+
* If baselineResult is provided (with embeddings), reuses them to avoid re-embedding.
|
|
18
|
+
*/
|
|
19
|
+
export async function runHdbscanSweep(chunks, pairs, baselineResult) {
|
|
20
|
+
console.log('\n=== Experiment 2: HDBSCAN minClusterSize Sweep ===');
|
|
21
|
+
// Get embeddings (reuse or compute)
|
|
22
|
+
let embeddingsMap;
|
|
23
|
+
if (baselineResult) {
|
|
24
|
+
console.log(' Reusing cached embeddings');
|
|
25
|
+
embeddingsMap = baselineResult.embeddings;
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
console.log(' Computing embeddings...');
|
|
29
|
+
const result = await singleModelRun(MODEL_ID, chunks, pairs);
|
|
30
|
+
embeddingsMap = result.embeddings;
|
|
31
|
+
}
|
|
32
|
+
// Build ordered embedding array
|
|
33
|
+
const embeddingArray = chunks.map((c) => embeddingsMap.get(c.id)).filter(Boolean);
|
|
34
|
+
// Sweep
|
|
35
|
+
const rows = [];
|
|
36
|
+
console.log('');
|
|
37
|
+
console.log(' ' +
|
|
38
|
+
pad('minSize', 8) +
|
|
39
|
+
pad('Clusters', 10) +
|
|
40
|
+
pad('Noise%', 10) +
|
|
41
|
+
pad('Silhouette', 12));
|
|
42
|
+
console.log(' ' + '-'.repeat(40));
|
|
43
|
+
for (const minClusterSize of MIN_CLUSTER_SIZES) {
|
|
44
|
+
const clusterResult = clusterEmbeddings(embeddingArray, { minClusterSize });
|
|
45
|
+
const silhouette = silhouetteScore(embeddingArray, clusterResult.labels);
|
|
46
|
+
const row = {
|
|
47
|
+
minClusterSize,
|
|
48
|
+
clusterCount: clusterResult.numClusters,
|
|
49
|
+
noiseRatio: clusterResult.noiseRatio,
|
|
50
|
+
silhouetteScore: silhouette,
|
|
51
|
+
};
|
|
52
|
+
rows.push(row);
|
|
53
|
+
console.log(' ' +
|
|
54
|
+
pad(String(minClusterSize), 8) +
|
|
55
|
+
pad(String(clusterResult.numClusters), 10) +
|
|
56
|
+
pad((clusterResult.noiseRatio * 100).toFixed(1) + '%', 10) +
|
|
57
|
+
pad(silhouette.toFixed(3), 12));
|
|
58
|
+
}
|
|
59
|
+
// Find optimal
|
|
60
|
+
const best = rows.reduce((a, b) => b.silhouetteScore > a.silhouetteScore ? b : a);
|
|
61
|
+
console.log(`\n Best silhouette: minClusterSize=${best.minClusterSize} (silhouette=${best.silhouetteScore.toFixed(3)})`);
|
|
62
|
+
return {
|
|
63
|
+
name: 'hdbscan-sweep',
|
|
64
|
+
description: `HDBSCAN minClusterSize sweep from ${MIN_CLUSTER_SIZES[0]} to ${MIN_CLUSTER_SIZES[MIN_CLUSTER_SIZES.length - 1]}. Best silhouette at minClusterSize=${best.minClusterSize}.`,
|
|
65
|
+
rows,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function pad(str, width) {
|
|
69
|
+
return str.padEnd(width);
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=hdbscan-sweep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hdbscan-sweep.js","sourceRoot":"","sources":["../../../src/eval/experiments/hdbscan-sweep.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reusable single-model embedding + scoring + clustering pipeline.
|
|
3
|
+
*
|
|
4
|
+
* Extracts the per-model logic from benchmark-runner.ts so each
|
|
5
|
+
* experiment can run it without duplicating the pipeline.
|
|
6
|
+
*/
|
|
7
|
+
import { type ClusterResult } from '../cluster-evaluator.js';
|
|
8
|
+
import { type AlignmentResult } from '../code-nl-alignment.js';
|
|
9
|
+
import type { LabeledPair } from '../annotation-schema.js';
|
|
10
|
+
import type { Chunk } from '../../parser/types.js';
|
|
11
|
+
import type { MetricSnapshot } from './types.js';
|
|
12
|
+
export interface SingleModelResult {
|
|
13
|
+
rocAuc: number;
|
|
14
|
+
silhouetteScore: number;
|
|
15
|
+
clusterCount: number;
|
|
16
|
+
noiseRatio: number;
|
|
17
|
+
clusterResult: ClusterResult;
|
|
18
|
+
clusterMembership: Map<number, number[]>;
|
|
19
|
+
embeddings: Map<string, number[]>;
|
|
20
|
+
codeNLAlignment: AlignmentResult;
|
|
21
|
+
meanInferenceMs: number;
|
|
22
|
+
}
|
|
23
|
+
export interface SingleModelRunOptions {
|
|
24
|
+
minClusterSize?: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Embed chunks with a model, score pairs, and cluster.
|
|
28
|
+
*
|
|
29
|
+
* Loads the model, embeds all chunks, scores labeled pairs,
|
|
30
|
+
* runs HDBSCAN clustering, computes silhouette, and returns
|
|
31
|
+
* a complete result.
|
|
32
|
+
*/
|
|
33
|
+
export declare function singleModelRun(modelId: string, chunks: Chunk[], pairs: LabeledPair[], options?: SingleModelRunOptions): Promise<SingleModelResult>;
|
|
34
|
+
/**
|
|
35
|
+
* Embed chunk texts directly (for experiments that modify text before embedding).
|
|
36
|
+
*
|
|
37
|
+
* Takes an array of {id, text} instead of Chunk objects, allowing experiments
|
|
38
|
+
* to pass modified text (e.g. truncated, filtered) while keeping original chunk IDs.
|
|
39
|
+
*/
|
|
40
|
+
export declare function embedTextsAndScore(modelId: string, texts: {
|
|
41
|
+
id: string;
|
|
42
|
+
text: string;
|
|
43
|
+
}[], pairs: LabeledPair[], options?: SingleModelRunOptions): Promise<SingleModelResult>;
|
|
44
|
+
/**
|
|
45
|
+
* Score and cluster from pre-computed embeddings (no model loading needed).
|
|
46
|
+
*/
|
|
47
|
+
export declare function scoreFromEmbeddings(chunks: Chunk[], pairs: LabeledPair[], embeddings: Map<string, number[]>, options?: SingleModelRunOptions): Omit<SingleModelResult, 'meanInferenceMs'> & {
|
|
48
|
+
meanInferenceMs: number;
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Extract a MetricSnapshot from a SingleModelResult.
|
|
52
|
+
*/
|
|
53
|
+
export declare function toSnapshot(result: SingleModelResult, chunkCount: number): MetricSnapshot;
|
|
54
|
+
//# sourceMappingURL=single-model-run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"single-model-run.d.ts","sourceRoot":"","sources":["../../../src/eval/experiments/single-model-run.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAA2C,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACtG,OAAO,EAA2B,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAMxF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,aAAa,CAAC;IAC7B,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACzC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAClC,eAAe,EAAE,eAAe,CAAC;IACjC,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,KAAK,EAAE,EACf,KAAK,EAAE,WAAW,EAAE,EACpB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,iBAAiB,CAAC,CA4B5B;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,EACrC,KAAK,EAAE,WAAW,EAAE,EACpB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,iBAAiB,CAAC,CA6B5B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,KAAK,EAAE,EACf,KAAK,EAAE,WAAW,EAAE,EACpB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EACjC,OAAO,GAAE,qBAA0B,GAClC,IAAI,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,GAAG;IAAE,eAAe,EAAE,MAAM,CAAA;CAAE,CAE1E;AAwCD;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,GAAG,cAAc,CAQxF"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reusable single-model embedding + scoring + clustering pipeline.
|
|
3
|
+
*
|
|
4
|
+
* Extracts the per-model logic from benchmark-runner.ts so each
|
|
5
|
+
* experiment can run it without duplicating the pipeline.
|
|
6
|
+
*/
|
|
7
|
+
import { Embedder } from '../../models/embedder.js';
|
|
8
|
+
import { getModel } from '../../models/model-registry.js';
|
|
9
|
+
import { clusterEmbeddings, getClusterMembership } from '../cluster-evaluator.js';
|
|
10
|
+
import { evaluateCodeNLAlignment } from '../code-nl-alignment.js';
|
|
11
|
+
import { scorePairs, rocAuc, silhouetteScore, } from '../metrics.js';
|
|
12
|
+
/**
|
|
13
|
+
* Embed chunks with a model, score pairs, and cluster.
|
|
14
|
+
*
|
|
15
|
+
* Loads the model, embeds all chunks, scores labeled pairs,
|
|
16
|
+
* runs HDBSCAN clustering, computes silhouette, and returns
|
|
17
|
+
* a complete result.
|
|
18
|
+
*/
|
|
19
|
+
export async function singleModelRun(modelId, chunks, pairs, options = {}) {
|
|
20
|
+
const { minClusterSize = 3 } = options;
|
|
21
|
+
const config = getModel(modelId);
|
|
22
|
+
const embedder = new Embedder();
|
|
23
|
+
try {
|
|
24
|
+
console.log(` Loading ${modelId}...`);
|
|
25
|
+
await embedder.load(config);
|
|
26
|
+
// Embed all chunks
|
|
27
|
+
console.log(` Embedding ${chunks.length} chunks...`);
|
|
28
|
+
const embeddings = new Map();
|
|
29
|
+
let totalInferenceMs = 0;
|
|
30
|
+
for (let i = 0; i < chunks.length; i++) {
|
|
31
|
+
const result = await embedder.embed(chunks[i].text);
|
|
32
|
+
embeddings.set(chunks[i].id, result.embedding);
|
|
33
|
+
totalInferenceMs += result.inferenceMs;
|
|
34
|
+
if ((i + 1) % 50 === 0 || i === chunks.length - 1) {
|
|
35
|
+
console.log(` ${i + 1}/${chunks.length} chunks embedded`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return buildResult(chunks, pairs, embeddings, totalInferenceMs, minClusterSize);
|
|
39
|
+
}
|
|
40
|
+
finally {
|
|
41
|
+
await embedder.dispose();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Embed chunk texts directly (for experiments that modify text before embedding).
|
|
46
|
+
*
|
|
47
|
+
* Takes an array of {id, text} instead of Chunk objects, allowing experiments
|
|
48
|
+
* to pass modified text (e.g. truncated, filtered) while keeping original chunk IDs.
|
|
49
|
+
*/
|
|
50
|
+
export async function embedTextsAndScore(modelId, texts, pairs, options = {}) {
|
|
51
|
+
const { minClusterSize = 3 } = options;
|
|
52
|
+
const config = getModel(modelId);
|
|
53
|
+
const embedder = new Embedder();
|
|
54
|
+
try {
|
|
55
|
+
console.log(` Loading ${modelId}...`);
|
|
56
|
+
await embedder.load(config);
|
|
57
|
+
console.log(` Embedding ${texts.length} texts...`);
|
|
58
|
+
const embeddings = new Map();
|
|
59
|
+
let totalInferenceMs = 0;
|
|
60
|
+
for (let i = 0; i < texts.length; i++) {
|
|
61
|
+
const result = await embedder.embed(texts[i].text);
|
|
62
|
+
embeddings.set(texts[i].id, result.embedding);
|
|
63
|
+
totalInferenceMs += result.inferenceMs;
|
|
64
|
+
if ((i + 1) % 50 === 0 || i === texts.length - 1) {
|
|
65
|
+
console.log(` ${i + 1}/${texts.length} texts embedded`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Build fake chunks array for clustering (just needs id ordering)
|
|
69
|
+
const fakeChunks = texts.map((t) => ({ id: t.id }));
|
|
70
|
+
return buildResult(fakeChunks, pairs, embeddings, totalInferenceMs, minClusterSize);
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
await embedder.dispose();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Score and cluster from pre-computed embeddings (no model loading needed).
|
|
78
|
+
*/
|
|
79
|
+
export function scoreFromEmbeddings(chunks, pairs, embeddings, options = {}) {
|
|
80
|
+
return buildResult(chunks, pairs, embeddings, 0, options.minClusterSize ?? 3);
|
|
81
|
+
}
|
|
82
|
+
function buildResult(chunks, pairs, embeddings, totalInferenceMs, minClusterSize) {
|
|
83
|
+
// Score labeled pairs
|
|
84
|
+
const scored = scorePairs(pairs, embeddings);
|
|
85
|
+
const auc = rocAuc(scored);
|
|
86
|
+
// Cluster
|
|
87
|
+
const orderedIds = chunks.map((c) => c.id);
|
|
88
|
+
const embeddingArray = orderedIds.map((id) => embeddings.get(id)).filter(Boolean);
|
|
89
|
+
const clusterResult = clusterEmbeddings(embeddingArray, { minClusterSize });
|
|
90
|
+
const membership = getClusterMembership(clusterResult.labels);
|
|
91
|
+
// Silhouette
|
|
92
|
+
const silhouette = silhouetteScore(embeddingArray, clusterResult.labels);
|
|
93
|
+
// Code-NL alignment
|
|
94
|
+
const alignment = evaluateCodeNLAlignment(pairs, embeddings);
|
|
95
|
+
const count = chunks.length;
|
|
96
|
+
return {
|
|
97
|
+
rocAuc: auc,
|
|
98
|
+
silhouetteScore: silhouette,
|
|
99
|
+
clusterCount: clusterResult.numClusters,
|
|
100
|
+
noiseRatio: clusterResult.noiseRatio,
|
|
101
|
+
clusterResult,
|
|
102
|
+
clusterMembership: membership,
|
|
103
|
+
embeddings,
|
|
104
|
+
codeNLAlignment: alignment,
|
|
105
|
+
meanInferenceMs: count > 0 ? totalInferenceMs / count : 0,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Extract a MetricSnapshot from a SingleModelResult.
|
|
110
|
+
*/
|
|
111
|
+
export function toSnapshot(result, chunkCount) {
|
|
112
|
+
return {
|
|
113
|
+
rocAuc: result.rocAuc,
|
|
114
|
+
silhouetteScore: result.silhouetteScore,
|
|
115
|
+
clusterCount: result.clusterCount,
|
|
116
|
+
noiseRatio: result.noiseRatio,
|
|
117
|
+
chunkCount,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=single-model-run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"single-model-run.js","sourceRoot":"","sources":["../../../src/eval/experiments/single-model-run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Experiment 4: Thinking Block Ablation
|
|
3
|
+
*
|
|
4
|
+
* Question: Do thinking blocks help or hurt embedding quality?
|
|
5
|
+
*
|
|
6
|
+
* Re-chunks the corpus with includeThinking:false (default is true),
|
|
7
|
+
* re-embeds with jina-small, and compares ROC AUC and silhouette
|
|
8
|
+
* against the default (thinking included).
|
|
9
|
+
*/
|
|
10
|
+
import type { LabeledPair } from '../annotation-schema.js';
|
|
11
|
+
import type { Corpus } from '../corpus-builder.js';
|
|
12
|
+
import { type SingleModelResult } from './single-model-run.js';
|
|
13
|
+
import { type ExperimentResult } from './types.js';
|
|
14
|
+
/**
|
|
15
|
+
* Run the thinking ablation experiment.
|
|
16
|
+
*
|
|
17
|
+
* Requires the original corpus config to rebuild with different settings.
|
|
18
|
+
* The original corpus should have been built with includeThinking:true.
|
|
19
|
+
*/
|
|
20
|
+
export declare function runThinkingAblation(originalCorpus: Corpus, originalPairs: LabeledPair[], baselineResult?: SingleModelResult): Promise<ExperimentResult>;
|
|
21
|
+
//# sourceMappingURL=thinking-ablation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thinking-ablation.d.ts","sourceRoot":"","sources":["../../../src/eval/experiments/thinking-ablation.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAGnD,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAgB,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAIjE;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,cAAc,EAAE,MAAM,EACtB,aAAa,EAAE,WAAW,EAAE,EAC5B,cAAc,CAAC,EAAE,iBAAiB,GACjC,OAAO,CAAC,gBAAgB,CAAC,CAwD3B"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Experiment 4: Thinking Block Ablation
|
|
3
|
+
*
|
|
4
|
+
* Question: Do thinking blocks help or hurt embedding quality?
|
|
5
|
+
*
|
|
6
|
+
* Re-chunks the corpus with includeThinking:false (default is true),
|
|
7
|
+
* re-embeds with jina-small, and compares ROC AUC and silhouette
|
|
8
|
+
* against the default (thinking included).
|
|
9
|
+
*/
|
|
10
|
+
import { buildCorpus } from '../corpus-builder.js';
|
|
11
|
+
import { generateLabeledPairs } from '../annotation-schema.js';
|
|
12
|
+
import { singleModelRun, toSnapshot, } from './single-model-run.js';
|
|
13
|
+
import { computeDelta } from './types.js';
|
|
14
|
+
const MODEL_ID = 'jina-small';
|
|
15
|
+
/**
|
|
16
|
+
* Run the thinking ablation experiment.
|
|
17
|
+
*
|
|
18
|
+
* Requires the original corpus config to rebuild with different settings.
|
|
19
|
+
* The original corpus should have been built with includeThinking:true.
|
|
20
|
+
*/
|
|
21
|
+
export async function runThinkingAblation(originalCorpus, originalPairs, baselineResult) {
|
|
22
|
+
console.log('\n=== Experiment 4: Thinking Block Ablation ===');
|
|
23
|
+
// Baseline: thinking included (original corpus)
|
|
24
|
+
let baseline;
|
|
25
|
+
if (baselineResult) {
|
|
26
|
+
console.log(' Reusing cached baseline embeddings');
|
|
27
|
+
baseline = baselineResult;
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
console.log(' Running baseline (thinking included)...');
|
|
31
|
+
baseline = await singleModelRun(MODEL_ID, originalCorpus.chunks, originalPairs);
|
|
32
|
+
}
|
|
33
|
+
// Variant: rebuild corpus without thinking blocks
|
|
34
|
+
console.log(' Rebuilding corpus with includeThinking=false...');
|
|
35
|
+
const variantCorpus = await buildCorpus({
|
|
36
|
+
...originalCorpus.config,
|
|
37
|
+
includeThinking: false,
|
|
38
|
+
});
|
|
39
|
+
console.log(` Variant corpus: ${variantCorpus.chunks.length} chunks ` +
|
|
40
|
+
`(original: ${originalCorpus.chunks.length})`);
|
|
41
|
+
// Generate new labeled pairs for the variant corpus
|
|
42
|
+
// (chunk IDs will differ, so we need fresh pairs)
|
|
43
|
+
const variantAnnotations = generateLabeledPairs(variantCorpus.chunks, {
|
|
44
|
+
adjacentPairs: 60,
|
|
45
|
+
crossSessionPairs: 40,
|
|
46
|
+
crossProjectPairs: 80,
|
|
47
|
+
codeNLPairs: 20,
|
|
48
|
+
});
|
|
49
|
+
console.log(` Variant pairs: ${variantAnnotations.pairs.length}`);
|
|
50
|
+
// Embed and score variant
|
|
51
|
+
console.log(' Running variant (no thinking)...');
|
|
52
|
+
const variant = await singleModelRun(MODEL_ID, variantCorpus.chunks, variantAnnotations.pairs);
|
|
53
|
+
const baselineSnap = toSnapshot(baseline, originalCorpus.chunks.length);
|
|
54
|
+
const variantSnap = toSnapshot(variant, variantCorpus.chunks.length);
|
|
55
|
+
const delta = computeDelta(baselineSnap, variantSnap);
|
|
56
|
+
console.log(` Baseline ROC AUC: ${baselineSnap.rocAuc.toFixed(3)} (${baselineSnap.chunkCount} chunks)`);
|
|
57
|
+
console.log(` No-thinking ROC AUC: ${variantSnap.rocAuc.toFixed(3)} (${variantSnap.chunkCount} chunks) (delta: ${delta.rocAuc >= 0 ? '+' : ''}${delta.rocAuc.toFixed(3)})`);
|
|
58
|
+
console.log(` Baseline Silhouette: ${baselineSnap.silhouetteScore.toFixed(3)}`);
|
|
59
|
+
console.log(` No-thinking Silhouette: ${variantSnap.silhouetteScore.toFixed(3)} (delta: ${delta.silhouetteScore >= 0 ? '+' : ''}${delta.silhouetteScore.toFixed(3)})`);
|
|
60
|
+
return {
|
|
61
|
+
name: 'thinking-ablation',
|
|
62
|
+
description: `Rebuilt corpus with includeThinking=false. Baseline: ${originalCorpus.chunks.length} chunks, variant: ${variantCorpus.chunks.length} chunks.`,
|
|
63
|
+
baseline: baselineSnap,
|
|
64
|
+
variant: variantSnap,
|
|
65
|
+
delta,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=thinking-ablation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thinking-ablation.js","sourceRoot":"","sources":["../../../src/eval/experiments/thinking-ablation.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EACL,cAAc,EACd,UAAU,GAEX,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAyB,MAAM,YAAY,CAAC;AAEjE,MAAM,QAAQ,GAAG,YAAY,CAAC;AAE9B;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,cAAsB,EACtB,aAA4B,EAC5B,cAAkC;IAElC,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;IAE/D,gDAAgD;IAChD,IAAI,QAA2B,CAAC;IAChC,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACpD,QAAQ,GAAG,cAAc,CAAC;IAC5B,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;QACzD,QAAQ,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,cAAc,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAClF,CAAC;IAED,kDAAkD;IAClD,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;IACjE,MAAM,aAAa,GAAG,MAAM,WAAW,CAAC;QACtC,GAAG,cAAc,CAAC,MAAM;QACxB,eAAe,EAAE,KAAK;KACvB,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CACT,qBAAqB,aAAa,CAAC,MAAM,CAAC,MAAM,UAAU;QAC1D,cAAc,cAAc,CAAC,MAAM,CAAC,MAAM,GAAG,CAC9C,CAAC;IAEF,oDAAoD;IACpD,kDAAkD;IAClD,MAAM,kBAAkB,GAAG,oBAAoB,CAAC,aAAa,CAAC,MAAM,EAAE;QACpE,aAAa,EAAE,EAAE;QACjB,iBAAiB,EAAE,EAAE;QACrB,iBAAiB,EAAE,EAAE;QACrB,WAAW,EAAE,EAAE;KAChB,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,oBAAoB,kBAAkB,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAEnE,0BAA0B;IAC1B,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,aAAa,CAAC,MAAM,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAE/F,MAAM,YAAY,GAAG,UAAU,CAAC,QAAQ,EAAE,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACxE,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrE,MAAM,KAAK,GAAG,YAAY,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IAEtD,OAAO,CAAC,GAAG,CAAC,uBAAuB,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,UAAU,UAAU,CAAC,CAAC;IACzG,OAAO,CAAC,GAAG,CAAC,0BAA0B,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,UAAU,oBAAoB,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC7K,OAAO,CAAC,GAAG,CAAC,0BAA0B,YAAY,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACjF,OAAO,CAAC,GAAG,CAAC,6BAA6B,WAAW,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC,eAAe,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAExK,OAAO;QACL,IAAI,EAAE,mBAAmB;QACzB,WAAW,EAAE,wDAAwD,cAAc,CAAC,MAAM,CAAC,MAAM,qBAAqB,aAAa,CAAC,MAAM,CAAC,MAAM,UAAU;QAC3J,QAAQ,EAAE,YAAY;QACtB,OAAO,EAAE,WAAW;QACpB,KAAK;KACN,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedding-based classifier for topic continuity.
|
|
3
|
+
*
|
|
4
|
+
* Uses angular distance between user text embedding and previous
|
|
5
|
+
* assistant output embedding to predict topic continuation.
|
|
6
|
+
*/
|
|
7
|
+
import type { TurnTransition, ClassificationResult } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Result of embedding a single transition.
|
|
10
|
+
*/
|
|
11
|
+
export interface EmbeddedTransition {
|
|
12
|
+
transition: TurnTransition;
|
|
13
|
+
userEmbedding: number[];
|
|
14
|
+
assistantEmbedding: number[];
|
|
15
|
+
embeddingDistanceMin: number;
|
|
16
|
+
embeddingDistanceMean: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Embed all transitions using a specified model.
|
|
20
|
+
*/
|
|
21
|
+
export declare function embedTransitions(modelId: string, transitions: TurnTransition[]): Promise<EmbeddedTransition[]>;
|
|
22
|
+
/**
|
|
23
|
+
* Compute continuation score from embedding distance.
|
|
24
|
+
* Lower distance = more similar = more likely continuation.
|
|
25
|
+
* Returns score in [0, 1] where 1 = continuation.
|
|
26
|
+
*/
|
|
27
|
+
export declare function embeddingDistanceToScore(distance: number): number;
|
|
28
|
+
/**
|
|
29
|
+
* Classify transitions using only embedding distance.
|
|
30
|
+
*/
|
|
31
|
+
export declare function classifyWithEmbeddings(embeddedTransitions: EmbeddedTransition[]): ClassificationResult[];
|
|
32
|
+
/**
|
|
33
|
+
* Get just the embedding distances for a model without full classification.
|
|
34
|
+
* Useful for feature ablation where we want to test embedding contribution.
|
|
35
|
+
*/
|
|
36
|
+
export declare function getEmbeddingDistances(modelId: string, transitions: TurnTransition[]): Promise<Map<string, {
|
|
37
|
+
min: number;
|
|
38
|
+
mean: number;
|
|
39
|
+
}>>;
|
|
40
|
+
/**
|
|
41
|
+
* Pre-computed embeddings cache for reuse across experiments.
|
|
42
|
+
*/
|
|
43
|
+
export interface EmbeddingCache {
|
|
44
|
+
modelId: string;
|
|
45
|
+
transitions: Map<string, EmbeddedTransition>;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Create an embedding cache from embedded transitions.
|
|
49
|
+
*/
|
|
50
|
+
export declare function createEmbeddingCache(modelId: string, embeddedTransitions: EmbeddedTransition[]): EmbeddingCache;
|
|
51
|
+
/**
|
|
52
|
+
* Classify from cache without re-embedding.
|
|
53
|
+
*/
|
|
54
|
+
export declare function classifyFromCache(cache: EmbeddingCache): ClassificationResult[];
|
|
55
|
+
//# sourceMappingURL=embedding-classifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding-classifier.d.ts","sourceRoot":"","sources":["../../../../src/eval/experiments/topic-continuity/embedding-classifier.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,oBAAoB,EAAsB,MAAM,YAAY,CAAC;AAG3F;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,cAAc,CAAC;IAC3B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,cAAc,EAAE,GAC5B,OAAO,CAAC,kBAAkB,EAAE,CAAC,CA6C/B;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAIjE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,mBAAmB,EAAE,kBAAkB,EAAE,GACxC,oBAAoB,EAAE,CAqBxB;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,cAAc,EAAE,GAC5B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAYrD;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;CAC9C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,mBAAmB,EAAE,kBAAkB,EAAE,GACxC,cAAc,CAMhB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,cAAc,GAAG,oBAAoB,EAAE,CAyB/E"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedding-based classifier for topic continuity.
|
|
3
|
+
*
|
|
4
|
+
* Uses angular distance between user text embedding and previous
|
|
5
|
+
* assistant output embedding to predict topic continuation.
|
|
6
|
+
*/
|
|
7
|
+
import { Embedder } from '../../../models/embedder.js';
|
|
8
|
+
import { getModel } from '../../../models/model-registry.js';
|
|
9
|
+
import { angularDistance } from '../../../utils/angular-distance.js';
|
|
10
|
+
import { extractLexicalFeatures } from './lexical-features.js';
|
|
11
|
+
/**
|
|
12
|
+
* Embed all transitions using a specified model.
|
|
13
|
+
*/
|
|
14
|
+
export async function embedTransitions(modelId, transitions) {
|
|
15
|
+
const config = getModel(modelId);
|
|
16
|
+
const embedder = new Embedder();
|
|
17
|
+
try {
|
|
18
|
+
console.log(` Loading ${modelId}...`);
|
|
19
|
+
await embedder.load(config);
|
|
20
|
+
const results = [];
|
|
21
|
+
for (let i = 0; i < transitions.length; i++) {
|
|
22
|
+
const t = transitions[i];
|
|
23
|
+
// Skip transitions without previous assistant text
|
|
24
|
+
if (!t.prevAssistantText.trim()) {
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
// Embed user text (as query since it's seeking information)
|
|
28
|
+
const userResult = await embedder.embed(t.nextUserText, true);
|
|
29
|
+
// Embed assistant text (as document since it's providing information)
|
|
30
|
+
const assistantResult = await embedder.embed(t.prevAssistantText, false);
|
|
31
|
+
// For now, we treat the entire assistant text as one chunk
|
|
32
|
+
// In a more sophisticated version, we could chunk it and compute min/mean
|
|
33
|
+
const distance = angularDistance(userResult.embedding, assistantResult.embedding);
|
|
34
|
+
results.push({
|
|
35
|
+
transition: t,
|
|
36
|
+
userEmbedding: userResult.embedding,
|
|
37
|
+
assistantEmbedding: assistantResult.embedding,
|
|
38
|
+
embeddingDistanceMin: distance,
|
|
39
|
+
embeddingDistanceMean: distance,
|
|
40
|
+
});
|
|
41
|
+
if ((i + 1) % 50 === 0 || i === transitions.length - 1) {
|
|
42
|
+
console.log(` ${i + 1}/${transitions.length} transitions embedded`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return results;
|
|
46
|
+
}
|
|
47
|
+
finally {
|
|
48
|
+
await embedder.dispose();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Compute continuation score from embedding distance.
|
|
53
|
+
* Lower distance = more similar = more likely continuation.
|
|
54
|
+
* Returns score in [0, 1] where 1 = continuation.
|
|
55
|
+
*/
|
|
56
|
+
export function embeddingDistanceToScore(distance) {
|
|
57
|
+
// Angular distance is in [0, 1], with 0 = identical
|
|
58
|
+
// Invert so higher score = more likely continuation
|
|
59
|
+
return 1 - distance;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Classify transitions using only embedding distance.
|
|
63
|
+
*/
|
|
64
|
+
export function classifyWithEmbeddings(embeddedTransitions) {
|
|
65
|
+
return embeddedTransitions.map((et) => {
|
|
66
|
+
const lexicalFeatures = extractLexicalFeatures(et.transition.prevAssistantText, et.transition.nextUserText, et.transition.timeGapMs);
|
|
67
|
+
const features = {
|
|
68
|
+
...lexicalFeatures,
|
|
69
|
+
embeddingDistanceMin: et.embeddingDistanceMin,
|
|
70
|
+
embeddingDistanceMean: et.embeddingDistanceMean,
|
|
71
|
+
};
|
|
72
|
+
return {
|
|
73
|
+
transitionId: et.transition.id,
|
|
74
|
+
groundTruth: et.transition.label,
|
|
75
|
+
continuationScore: embeddingDistanceToScore(et.embeddingDistanceMin),
|
|
76
|
+
features,
|
|
77
|
+
};
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Get just the embedding distances for a model without full classification.
|
|
82
|
+
* Useful for feature ablation where we want to test embedding contribution.
|
|
83
|
+
*/
|
|
84
|
+
export async function getEmbeddingDistances(modelId, transitions) {
|
|
85
|
+
const embedded = await embedTransitions(modelId, transitions);
|
|
86
|
+
const distances = new Map();
|
|
87
|
+
for (const et of embedded) {
|
|
88
|
+
distances.set(et.transition.id, {
|
|
89
|
+
min: et.embeddingDistanceMin,
|
|
90
|
+
mean: et.embeddingDistanceMean,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
return distances;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Create an embedding cache from embedded transitions.
|
|
97
|
+
*/
|
|
98
|
+
export function createEmbeddingCache(modelId, embeddedTransitions) {
|
|
99
|
+
const transitions = new Map();
|
|
100
|
+
for (const et of embeddedTransitions) {
|
|
101
|
+
transitions.set(et.transition.id, et);
|
|
102
|
+
}
|
|
103
|
+
return { modelId, transitions };
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Classify from cache without re-embedding.
|
|
107
|
+
*/
|
|
108
|
+
export function classifyFromCache(cache) {
|
|
109
|
+
const results = [];
|
|
110
|
+
for (const et of cache.transitions.values()) {
|
|
111
|
+
const lexicalFeatures = extractLexicalFeatures(et.transition.prevAssistantText, et.transition.nextUserText, et.transition.timeGapMs);
|
|
112
|
+
const features = {
|
|
113
|
+
...lexicalFeatures,
|
|
114
|
+
embeddingDistanceMin: et.embeddingDistanceMin,
|
|
115
|
+
embeddingDistanceMean: et.embeddingDistanceMean,
|
|
116
|
+
};
|
|
117
|
+
results.push({
|
|
118
|
+
transitionId: et.transition.id,
|
|
119
|
+
groundTruth: et.transition.label,
|
|
120
|
+
continuationScore: embeddingDistanceToScore(et.embeddingDistanceMin),
|
|
121
|
+
features,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
return results;
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=embedding-classifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding-classifier.js","sourceRoot":"","sources":["../../../../src/eval/experiments/topic-continuity/embedding-classifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hybrid classifier combining embedding distance with lexical features.
|
|
3
|
+
*
|
|
4
|
+
* Uses tunable weights to combine multiple signals for topic continuity
|
|
5
|
+
* prediction.
|
|
6
|
+
*/
|
|
7
|
+
import type { TurnTransition, TransitionFeatures, ClassificationResult } from './types.js';
|
|
8
|
+
import { type EmbeddedTransition } from './embedding-classifier.js';
|
|
9
|
+
/**
|
|
10
|
+
* Weight configuration for hybrid classifier.
|
|
11
|
+
*/
|
|
12
|
+
export interface HybridWeights {
|
|
13
|
+
/** Weight for embedding distance signal. Default: 0.5 */
|
|
14
|
+
embedding: number;
|
|
15
|
+
/** Weight for topic shift marker. Default: 0.2 */
|
|
16
|
+
topicShiftMarker: number;
|
|
17
|
+
/** Weight for continuation marker. Default: 0.15 */
|
|
18
|
+
continuationMarker: number;
|
|
19
|
+
/** Weight for time gap signal. Default: 0.05 */
|
|
20
|
+
timeGap: number;
|
|
21
|
+
/** Weight for file path overlap. Default: 0.05 */
|
|
22
|
+
filePathOverlap: number;
|
|
23
|
+
/** Weight for keyword overlap. Default: 0.05 */
|
|
24
|
+
keywordOverlap: number;
|
|
25
|
+
}
|
|
26
|
+
export declare const DEFAULT_WEIGHTS: HybridWeights;
|
|
27
|
+
/**
|
|
28
|
+
* Compute hybrid continuation score from features.
|
|
29
|
+
*/
|
|
30
|
+
export declare function computeHybridScore(features: TransitionFeatures, weights?: HybridWeights): number;
|
|
31
|
+
/**
|
|
32
|
+
* Classify transitions using hybrid approach (requires pre-embedded data).
|
|
33
|
+
*/
|
|
34
|
+
export declare function classifyWithHybrid(embeddedTransitions: EmbeddedTransition[], weights?: HybridWeights): ClassificationResult[];
|
|
35
|
+
/**
|
|
36
|
+
* Classify using lexical features only (no embedding).
|
|
37
|
+
*/
|
|
38
|
+
export declare function classifyWithLexicalOnly(transitions: TurnTransition[]): ClassificationResult[];
|
|
39
|
+
/**
|
|
40
|
+
* Feature ablation: classify with only a subset of features enabled.
|
|
41
|
+
*/
|
|
42
|
+
export interface FeatureFlags {
|
|
43
|
+
useEmbedding: boolean;
|
|
44
|
+
useTopicShiftMarker: boolean;
|
|
45
|
+
useContinuationMarker: boolean;
|
|
46
|
+
useTimeGap: boolean;
|
|
47
|
+
useFilePathOverlap: boolean;
|
|
48
|
+
useKeywordOverlap: boolean;
|
|
49
|
+
}
|
|
50
|
+
export declare const ALL_FEATURES: FeatureFlags;
|
|
51
|
+
export declare const EMBEDDING_ONLY: FeatureFlags;
|
|
52
|
+
export declare const LEXICAL_ONLY: FeatureFlags;
|
|
53
|
+
/**
|
|
54
|
+
* Compute score with specific features enabled/disabled.
|
|
55
|
+
*/
|
|
56
|
+
export declare function computeAblatedScore(features: TransitionFeatures, flags: FeatureFlags, baseWeights?: HybridWeights): number;
|
|
57
|
+
/**
|
|
58
|
+
* Classify with specific features enabled for ablation study.
|
|
59
|
+
*/
|
|
60
|
+
export declare function classifyWithAblation(embeddedTransitions: EmbeddedTransition[], flags: FeatureFlags): ClassificationResult[];
|
|
61
|
+
/**
|
|
62
|
+
* Named ablation configurations for experiment.
|
|
63
|
+
*/
|
|
64
|
+
export declare const ABLATION_CONFIGS: {
|
|
65
|
+
name: string;
|
|
66
|
+
flags: FeatureFlags;
|
|
67
|
+
}[];
|
|
68
|
+
//# sourceMappingURL=hybrid-classifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hybrid-classifier.d.ts","sourceRoot":"","sources":["../../../../src/eval/experiments/topic-continuity/hybrid-classifier.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,kBAAkB,EAClB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,KAAK,kBAAkB,EAExB,MAAM,2BAA2B,CAAC;AAEnC;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,yDAAyD;IACzD,SAAS,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,gBAAgB,EAAE,MAAM,CAAC;IACzB,oDAAoD;IACpD,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gDAAgD;IAChD,OAAO,EAAE,MAAM,CAAC;IAChB,kDAAkD;IAClD,eAAe,EAAE,MAAM,CAAC;IACxB,gDAAgD;IAChD,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,eAAe,EAAE,aAO7B,CAAC;AAEF;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,GAAE,aAA+B,GACvC,MAAM,CAkCR;AAaD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,mBAAmB,EAAE,kBAAkB,EAAE,EACzC,OAAO,GAAE,aAA+B,GACvC,oBAAoB,EAAE,CAuBxB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,cAAc,EAAE,GAC5B,oBAAoB,EAAE,CAyBxB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,OAAO,CAAC;IACtB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,UAAU,EAAE,OAAO,CAAC;IACpB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED,eAAO,MAAM,YAAY,EAAE,YAO1B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,YAO5B,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,YAO1B,CAAC;AAEF;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,kBAAkB,EAC5B,KAAK,EAAE,YAAY,EACnB,WAAW,GAAE,aAA+B,GAC3C,MAAM,CAYR;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,mBAAmB,EAAE,kBAAkB,EAAE,EACzC,KAAK,EAAE,YAAY,GAClB,oBAAoB,EAAE,CAuBxB;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,YAAY,CAAA;CAAE,EAanE,CAAC"}
|