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,175 @@
|
|
|
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 { extractLexicalFeatures, computeLexicalScore } from './lexical-features.js';
|
|
8
|
+
export const DEFAULT_WEIGHTS = {
|
|
9
|
+
embedding: 0.5,
|
|
10
|
+
topicShiftMarker: 0.2,
|
|
11
|
+
continuationMarker: 0.15,
|
|
12
|
+
timeGap: 0.05,
|
|
13
|
+
filePathOverlap: 0.05,
|
|
14
|
+
keywordOverlap: 0.05,
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Compute hybrid continuation score from features.
|
|
18
|
+
*/
|
|
19
|
+
export function computeHybridScore(features, weights = DEFAULT_WEIGHTS) {
|
|
20
|
+
let score = 0;
|
|
21
|
+
let totalWeight = 0;
|
|
22
|
+
// Embedding distance (inverted: low distance = high continuation score)
|
|
23
|
+
const embeddingScore = 1 - features.embeddingDistanceMin;
|
|
24
|
+
score += weights.embedding * embeddingScore;
|
|
25
|
+
totalWeight += weights.embedding;
|
|
26
|
+
// Topic shift marker (binary: presence indicates new topic)
|
|
27
|
+
const topicShiftScore = features.hasTopicShiftMarker ? 0 : 1;
|
|
28
|
+
score += weights.topicShiftMarker * topicShiftScore;
|
|
29
|
+
totalWeight += weights.topicShiftMarker;
|
|
30
|
+
// Continuation marker (binary: presence indicates continuation)
|
|
31
|
+
const continuationScore = features.hasContinuationMarker ? 1 : 0.5;
|
|
32
|
+
score += weights.continuationMarker * continuationScore;
|
|
33
|
+
totalWeight += weights.continuationMarker;
|
|
34
|
+
// Time gap (sigmoid decay: longer gap = lower continuation score)
|
|
35
|
+
const timeGapScore = timeGapToScore(features.timeGapMinutes);
|
|
36
|
+
score += weights.timeGap * timeGapScore;
|
|
37
|
+
totalWeight += weights.timeGap;
|
|
38
|
+
// File path overlap (direct: more overlap = higher continuation)
|
|
39
|
+
score += weights.filePathOverlap * features.filePathOverlap;
|
|
40
|
+
totalWeight += weights.filePathOverlap;
|
|
41
|
+
// Keyword overlap (direct: more overlap = higher continuation)
|
|
42
|
+
score += weights.keywordOverlap * features.keywordOverlap;
|
|
43
|
+
totalWeight += weights.keywordOverlap;
|
|
44
|
+
// Normalize by total weight
|
|
45
|
+
return totalWeight > 0 ? score / totalWeight : 0.5;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Convert time gap to a continuation score using sigmoid decay.
|
|
49
|
+
* Short gaps -> high score, long gaps -> low score.
|
|
50
|
+
*/
|
|
51
|
+
function timeGapToScore(timeGapMinutes) {
|
|
52
|
+
// Sigmoid centered at 30 minutes
|
|
53
|
+
const k = 0.1; // Steepness
|
|
54
|
+
const midpoint = 30;
|
|
55
|
+
return 1 / (1 + Math.exp(k * (timeGapMinutes - midpoint)));
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Classify transitions using hybrid approach (requires pre-embedded data).
|
|
59
|
+
*/
|
|
60
|
+
export function classifyWithHybrid(embeddedTransitions, weights = DEFAULT_WEIGHTS) {
|
|
61
|
+
return embeddedTransitions.map((et) => {
|
|
62
|
+
const lexicalFeatures = extractLexicalFeatures(et.transition.prevAssistantText, et.transition.nextUserText, et.transition.timeGapMs);
|
|
63
|
+
const features = {
|
|
64
|
+
...lexicalFeatures,
|
|
65
|
+
embeddingDistanceMin: et.embeddingDistanceMin,
|
|
66
|
+
embeddingDistanceMean: et.embeddingDistanceMean,
|
|
67
|
+
};
|
|
68
|
+
const score = computeHybridScore(features, weights);
|
|
69
|
+
return {
|
|
70
|
+
transitionId: et.transition.id,
|
|
71
|
+
groundTruth: et.transition.label,
|
|
72
|
+
continuationScore: score,
|
|
73
|
+
features,
|
|
74
|
+
};
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Classify using lexical features only (no embedding).
|
|
79
|
+
*/
|
|
80
|
+
export function classifyWithLexicalOnly(transitions) {
|
|
81
|
+
return transitions
|
|
82
|
+
.filter((t) => t.prevAssistantText.trim()) // Skip transitions without prior context
|
|
83
|
+
.map((t) => {
|
|
84
|
+
const lexicalFeatures = extractLexicalFeatures(t.prevAssistantText, t.nextUserText, t.timeGapMs);
|
|
85
|
+
const features = {
|
|
86
|
+
...lexicalFeatures,
|
|
87
|
+
embeddingDistanceMin: 0.5, // Neutral placeholder
|
|
88
|
+
embeddingDistanceMean: 0.5,
|
|
89
|
+
};
|
|
90
|
+
const score = computeLexicalScore(lexicalFeatures);
|
|
91
|
+
return {
|
|
92
|
+
transitionId: t.id,
|
|
93
|
+
groundTruth: t.label,
|
|
94
|
+
continuationScore: score,
|
|
95
|
+
features,
|
|
96
|
+
};
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
export const ALL_FEATURES = {
|
|
100
|
+
useEmbedding: true,
|
|
101
|
+
useTopicShiftMarker: true,
|
|
102
|
+
useContinuationMarker: true,
|
|
103
|
+
useTimeGap: true,
|
|
104
|
+
useFilePathOverlap: true,
|
|
105
|
+
useKeywordOverlap: true,
|
|
106
|
+
};
|
|
107
|
+
export const EMBEDDING_ONLY = {
|
|
108
|
+
useEmbedding: true,
|
|
109
|
+
useTopicShiftMarker: false,
|
|
110
|
+
useContinuationMarker: false,
|
|
111
|
+
useTimeGap: false,
|
|
112
|
+
useFilePathOverlap: false,
|
|
113
|
+
useKeywordOverlap: false,
|
|
114
|
+
};
|
|
115
|
+
export const LEXICAL_ONLY = {
|
|
116
|
+
useEmbedding: false,
|
|
117
|
+
useTopicShiftMarker: true,
|
|
118
|
+
useContinuationMarker: true,
|
|
119
|
+
useTimeGap: true,
|
|
120
|
+
useFilePathOverlap: true,
|
|
121
|
+
useKeywordOverlap: true,
|
|
122
|
+
};
|
|
123
|
+
/**
|
|
124
|
+
* Compute score with specific features enabled/disabled.
|
|
125
|
+
*/
|
|
126
|
+
export function computeAblatedScore(features, flags, baseWeights = DEFAULT_WEIGHTS) {
|
|
127
|
+
// Zero out disabled features
|
|
128
|
+
const weights = {
|
|
129
|
+
embedding: flags.useEmbedding ? baseWeights.embedding : 0,
|
|
130
|
+
topicShiftMarker: flags.useTopicShiftMarker ? baseWeights.topicShiftMarker : 0,
|
|
131
|
+
continuationMarker: flags.useContinuationMarker ? baseWeights.continuationMarker : 0,
|
|
132
|
+
timeGap: flags.useTimeGap ? baseWeights.timeGap : 0,
|
|
133
|
+
filePathOverlap: flags.useFilePathOverlap ? baseWeights.filePathOverlap : 0,
|
|
134
|
+
keywordOverlap: flags.useKeywordOverlap ? baseWeights.keywordOverlap : 0,
|
|
135
|
+
};
|
|
136
|
+
return computeHybridScore(features, weights);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Classify with specific features enabled for ablation study.
|
|
140
|
+
*/
|
|
141
|
+
export function classifyWithAblation(embeddedTransitions, flags) {
|
|
142
|
+
return embeddedTransitions.map((et) => {
|
|
143
|
+
const lexicalFeatures = extractLexicalFeatures(et.transition.prevAssistantText, et.transition.nextUserText, et.transition.timeGapMs);
|
|
144
|
+
const features = {
|
|
145
|
+
...lexicalFeatures,
|
|
146
|
+
embeddingDistanceMin: et.embeddingDistanceMin,
|
|
147
|
+
embeddingDistanceMean: et.embeddingDistanceMean,
|
|
148
|
+
};
|
|
149
|
+
const score = computeAblatedScore(features, flags);
|
|
150
|
+
return {
|
|
151
|
+
transitionId: et.transition.id,
|
|
152
|
+
groundTruth: et.transition.label,
|
|
153
|
+
continuationScore: score,
|
|
154
|
+
features,
|
|
155
|
+
};
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Named ablation configurations for experiment.
|
|
160
|
+
*/
|
|
161
|
+
export const ABLATION_CONFIGS = [
|
|
162
|
+
{ name: 'time-gap-only', flags: { ...LEXICAL_ONLY, useTopicShiftMarker: false, useContinuationMarker: false, useFilePathOverlap: false, useKeywordOverlap: false } },
|
|
163
|
+
{ name: 'shift-markers-only', flags: { ...LEXICAL_ONLY, useTimeGap: false, useContinuationMarker: false, useFilePathOverlap: false, useKeywordOverlap: false } },
|
|
164
|
+
{ name: 'continuation-markers-only', flags: { ...LEXICAL_ONLY, useTimeGap: false, useTopicShiftMarker: false, useFilePathOverlap: false, useKeywordOverlap: false } },
|
|
165
|
+
{ name: 'file-path-overlap-only', flags: { ...LEXICAL_ONLY, useTimeGap: false, useTopicShiftMarker: false, useContinuationMarker: false, useKeywordOverlap: false } },
|
|
166
|
+
{ name: 'keyword-overlap-only', flags: { ...LEXICAL_ONLY, useTimeGap: false, useTopicShiftMarker: false, useContinuationMarker: false, useFilePathOverlap: false } },
|
|
167
|
+
{ name: 'all-lexical', flags: LEXICAL_ONLY },
|
|
168
|
+
{ name: 'embedding-only', flags: EMBEDDING_ONLY },
|
|
169
|
+
{ name: 'embedding+time-gap', flags: { ...EMBEDDING_ONLY, useTimeGap: true } },
|
|
170
|
+
{ name: 'embedding+markers', flags: { ...EMBEDDING_ONLY, useTopicShiftMarker: true, useContinuationMarker: true } },
|
|
171
|
+
{ name: 'embedding+paths', flags: { ...EMBEDDING_ONLY, useFilePathOverlap: true } },
|
|
172
|
+
{ name: 'embedding+keywords', flags: { ...EMBEDDING_ONLY, useKeywordOverlap: true } },
|
|
173
|
+
{ name: 'all-features', flags: ALL_FEATURES },
|
|
174
|
+
];
|
|
175
|
+
//# sourceMappingURL=hybrid-classifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hybrid-classifier.js","sourceRoot":"","sources":["../../../../src/eval/experiments/topic-continuity/hybrid-classifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Topic continuity detection experiment module.
|
|
3
|
+
*
|
|
4
|
+
* Classifies whether a user's message continues the previous topic
|
|
5
|
+
* or starts a new topic, supporting the D-T-D model's edge creation logic.
|
|
6
|
+
*/
|
|
7
|
+
export type { TransitionLabel, Confidence, TurnTransition, TransitionFeatures, ClassificationResult, ClassifierMetrics, ModelResults, FeatureAblation, DatasetStats, ExperimentReport, ThresholdSweepRow, TimeGapSweepRow, } from './types.js';
|
|
8
|
+
export { generateTransitionLabels, generateSessionTransitions, computeDatasetStats, filterHighConfidence, balanceDataset, type SessionSource, type LabelerOptions, } from './labeler.js';
|
|
9
|
+
export { hasTopicShiftMarker, hasContinuationMarker, extractFilePaths, computeFilePathOverlap, extractKeywords, computeKeywordOverlap, extractLexicalFeatures, computeLexicalScore, classifyWithLexicalFeatures, type LexicalClassificationResult, } from './lexical-features.js';
|
|
10
|
+
export { embedTransitions, classifyWithEmbeddings, embeddingDistanceToScore, getEmbeddingDistances, createEmbeddingCache, classifyFromCache, type EmbeddedTransition, type EmbeddingCache, } from './embedding-classifier.js';
|
|
11
|
+
export { computeHybridScore, classifyWithHybrid, classifyWithLexicalOnly, classifyWithAblation, DEFAULT_WEIGHTS, ALL_FEATURES, EMBEDDING_ONLY, LEXICAL_ONLY, ABLATION_CONFIGS, type HybridWeights, type FeatureFlags, } from './hybrid-classifier.js';
|
|
12
|
+
export { runTopicContinuityExperiment, computeRocAuc, computeMetrics, findOptimalThreshold, exportTransitionsDataset, type ExperimentOptions, } from './run-experiment.js';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/eval/experiments/topic-continuity/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EACV,eAAe,EACf,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,GAChB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,mBAAmB,EACnB,oBAAoB,EACpB,cAAc,EACd,KAAK,aAAa,EAClB,KAAK,cAAc,GACpB,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,sBAAsB,EACtB,eAAe,EACf,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,2BAA2B,EAC3B,KAAK,2BAA2B,GACjC,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,wBAAwB,EACxB,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,KAAK,kBAAkB,EACvB,KAAK,cAAc,GACpB,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,eAAe,EACf,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,KAAK,aAAa,EAClB,KAAK,YAAY,GAClB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,4BAA4B,EAC5B,aAAa,EACb,cAAc,EACd,oBAAoB,EACpB,wBAAwB,EACxB,KAAK,iBAAiB,GACvB,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Topic continuity detection experiment module.
|
|
3
|
+
*
|
|
4
|
+
* Classifies whether a user's message continues the previous topic
|
|
5
|
+
* or starts a new topic, supporting the D-T-D model's edge creation logic.
|
|
6
|
+
*/
|
|
7
|
+
// Labeling
|
|
8
|
+
export { generateTransitionLabels, generateSessionTransitions, computeDatasetStats, filterHighConfidence, balanceDataset, } from './labeler.js';
|
|
9
|
+
// Lexical features
|
|
10
|
+
export { hasTopicShiftMarker, hasContinuationMarker, extractFilePaths, computeFilePathOverlap, extractKeywords, computeKeywordOverlap, extractLexicalFeatures, computeLexicalScore, classifyWithLexicalFeatures, } from './lexical-features.js';
|
|
11
|
+
// Embedding classifier
|
|
12
|
+
export { embedTransitions, classifyWithEmbeddings, embeddingDistanceToScore, getEmbeddingDistances, createEmbeddingCache, classifyFromCache, } from './embedding-classifier.js';
|
|
13
|
+
// Hybrid classifier
|
|
14
|
+
export { computeHybridScore, classifyWithHybrid, classifyWithLexicalOnly, classifyWithAblation, DEFAULT_WEIGHTS, ALL_FEATURES, EMBEDDING_ONLY, LEXICAL_ONLY, ABLATION_CONFIGS, } from './hybrid-classifier.js';
|
|
15
|
+
// Experiment runner
|
|
16
|
+
export { runTopicContinuityExperiment, computeRocAuc, computeMetrics, findOptimalThreshold, exportTransitionsDataset, } from './run-experiment.js';
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/eval/experiments/topic-continuity/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAkBH,WAAW;AACX,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,mBAAmB,EACnB,oBAAoB,EACpB,cAAc,GAGf,MAAM,cAAc,CAAC;AAEtB,mBAAmB;AACnB,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,sBAAsB,EACtB,eAAe,EACf,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,2BAA2B,GAE5B,MAAM,uBAAuB,CAAC;AAE/B,uBAAuB;AACvB,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,wBAAwB,EACxB,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,GAGlB,MAAM,2BAA2B,CAAC;AAEnC,oBAAoB;AACpB,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,eAAe,EACf,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,gBAAgB,GAGjB,MAAM,wBAAwB,CAAC;AAEhC,oBAAoB;AACpB,OAAO,EACL,4BAA4B,EAC5B,aAAa,EACb,cAAc,EACd,oBAAoB,EACpB,wBAAwB,GAEzB,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-labeling heuristics for turn transitions.
|
|
3
|
+
*
|
|
4
|
+
* Generates labeled TurnTransition records from session data using
|
|
5
|
+
* structural cues, temporal gaps, and explicit markers.
|
|
6
|
+
*/
|
|
7
|
+
import type { TurnTransition, DatasetStats } from './types.js';
|
|
8
|
+
export interface LabelerOptions {
|
|
9
|
+
/** Time gap threshold in minutes. Default: 30. */
|
|
10
|
+
timeGapMinutes?: number;
|
|
11
|
+
/** Include transitions with low confidence. Default: true. */
|
|
12
|
+
includeLowConfidence?: boolean;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Generate turn transitions from a single session file.
|
|
16
|
+
*/
|
|
17
|
+
export declare function generateSessionTransitions(sessionPath: string, sessionId: string, sessionSlug: string, options?: LabelerOptions): Promise<TurnTransition[]>;
|
|
18
|
+
/**
|
|
19
|
+
* Session info for transition generation.
|
|
20
|
+
*/
|
|
21
|
+
export interface SessionSource {
|
|
22
|
+
path: string;
|
|
23
|
+
sessionId: string;
|
|
24
|
+
sessionSlug: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Generate turn transitions from multiple sessions.
|
|
28
|
+
*/
|
|
29
|
+
export declare function generateTransitionLabels(sessions: SessionSource[], options?: LabelerOptions): Promise<TurnTransition[]>;
|
|
30
|
+
/**
|
|
31
|
+
* Compute dataset statistics from transitions.
|
|
32
|
+
*/
|
|
33
|
+
export declare function computeDatasetStats(transitions: TurnTransition[]): DatasetStats;
|
|
34
|
+
/**
|
|
35
|
+
* Filter transitions to only include high-confidence labels.
|
|
36
|
+
*/
|
|
37
|
+
export declare function filterHighConfidence(transitions: TurnTransition[]): TurnTransition[];
|
|
38
|
+
/**
|
|
39
|
+
* Balance dataset by undersampling the majority class.
|
|
40
|
+
*/
|
|
41
|
+
export declare function balanceDataset(transitions: TurnTransition[], seed?: number): TurnTransition[];
|
|
42
|
+
//# sourceMappingURL=labeler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"labeler.d.ts","sourceRoot":"","sources":["../../../../src/eval/experiments/topic-continuity/labeler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EACV,cAAc,EAGd,YAAY,EACb,MAAM,YAAY,CAAC;AAoCpB,MAAM,WAAW,cAAc;IAC7B,kDAAkD;IAClD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8DAA8D;IAC9D,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAoGD;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,cAAc,EAAE,CAAC,CAwD3B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,aAAa,EAAE,EACzB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,cAAc,EAAE,CAAC,CA8B3B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,cAAc,EAAE,GAAG,YAAY,CA6B/E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAEpF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,WAAW,EAAE,cAAc,EAAE,EAC7B,IAAI,GAAE,MAAW,GAChB,cAAc,EAAE,CAclB"}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-labeling heuristics for turn transitions.
|
|
3
|
+
*
|
|
4
|
+
* Generates labeled TurnTransition records from session data using
|
|
5
|
+
* structural cues, temporal gaps, and explicit markers.
|
|
6
|
+
*/
|
|
7
|
+
import { readSessionMessages } from '../../../parser/session-reader.js';
|
|
8
|
+
import { assembleTurns } from '../../../parser/turn-assembler.js';
|
|
9
|
+
/** Boilerplate prefix indicating a continued session. */
|
|
10
|
+
const CONTINUATION_BOILERPLATE = 'This session is being continued from a previous conversation';
|
|
11
|
+
/** Patterns indicating explicit topic shift. */
|
|
12
|
+
const TOPIC_SHIFT_PATTERNS = [
|
|
13
|
+
/^actually,?\s*(let'?s?|can we|could we)/i,
|
|
14
|
+
/^(new|different|another)\s+(question|topic|issue)/i,
|
|
15
|
+
/^switching\s+(to|gears)/i,
|
|
16
|
+
/^(on|about)\s+a\s+(different|separate)\s+(note|topic)/i,
|
|
17
|
+
/^(ok|okay),?\s*(so|now)\s+/i,
|
|
18
|
+
/^moving\s+on/i,
|
|
19
|
+
/^forget\s+(about\s+)?(that|this)/i,
|
|
20
|
+
/^let'?s\s+(change|switch|move)/i,
|
|
21
|
+
/^(unrelated|separate)\s*(question|topic|issue)?/i,
|
|
22
|
+
/^(btw|by the way)/i,
|
|
23
|
+
];
|
|
24
|
+
/** Patterns indicating continuation of the previous topic. */
|
|
25
|
+
const CONTINUATION_PATTERNS = [
|
|
26
|
+
/^(yes|no|right|correct|exactly)/i,
|
|
27
|
+
/^(it|that|this)\s+(is|was|shows|works|doesn'?t)/i,
|
|
28
|
+
/^(the|your)\s+(error|output|result|fix|solution)/i,
|
|
29
|
+
/^(thanks|thank\s+you)/i,
|
|
30
|
+
/^(ok|okay|got\s+it|makes\s+sense)/i,
|
|
31
|
+
/^(but|however|although|though)/i,
|
|
32
|
+
/^(also|additionally|and\s+also)/i,
|
|
33
|
+
/^(what\s+about|how\s+about)/i,
|
|
34
|
+
/^(can you|could you)\s+(also|explain|show)/i,
|
|
35
|
+
/^(I\s+(see|understand|get\s+it))/i,
|
|
36
|
+
];
|
|
37
|
+
/** Default time gap threshold in minutes for labeling as new topic. */
|
|
38
|
+
const DEFAULT_TIME_GAP_MINUTES = 30;
|
|
39
|
+
/**
|
|
40
|
+
* Extract plain text from assistant content blocks.
|
|
41
|
+
*/
|
|
42
|
+
function extractAssistantText(blocks) {
|
|
43
|
+
return blocks
|
|
44
|
+
.filter((b) => b.type === 'text')
|
|
45
|
+
.map((b) => b.text)
|
|
46
|
+
.join('\n');
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Check if text contains continuation boilerplate (resumed session).
|
|
50
|
+
*/
|
|
51
|
+
function hasContinuationBoilerplate(text) {
|
|
52
|
+
return text.includes(CONTINUATION_BOILERPLATE);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Check if text contains topic-shift markers.
|
|
56
|
+
*/
|
|
57
|
+
function hasTopicShiftMarker(text) {
|
|
58
|
+
const trimmed = text.trim();
|
|
59
|
+
return TOPIC_SHIFT_PATTERNS.some((p) => p.test(trimmed));
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Check if text contains continuation markers.
|
|
63
|
+
*/
|
|
64
|
+
function hasContinuationMarker(text) {
|
|
65
|
+
const trimmed = text.trim();
|
|
66
|
+
return CONTINUATION_PATTERNS.some((p) => p.test(trimmed));
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Parse ISO timestamp to milliseconds.
|
|
70
|
+
*/
|
|
71
|
+
function parseTime(iso) {
|
|
72
|
+
return new Date(iso).getTime();
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Generate a unique transition ID.
|
|
76
|
+
*/
|
|
77
|
+
function makeTransitionId(sessionId, prevIdx, nextIdx) {
|
|
78
|
+
const shortSession = sessionId.slice(0, 8);
|
|
79
|
+
return `tr-${shortSession}-${prevIdx}-${nextIdx}`;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Determine label and confidence for a transition.
|
|
83
|
+
*/
|
|
84
|
+
function labelTransition(prevTurn, nextTurn, isFirstTurn, timeGapMs, timeGapThresholdMinutes) {
|
|
85
|
+
const userText = nextTurn.userText;
|
|
86
|
+
const timeGapMinutes = timeGapMs / (1000 * 60);
|
|
87
|
+
// First turn of a session
|
|
88
|
+
if (isFirstTurn) {
|
|
89
|
+
// Check for continuation boilerplate (resumed session)
|
|
90
|
+
if (hasContinuationBoilerplate(userText)) {
|
|
91
|
+
return { label: 'continuation', confidence: 'high', source: 'continued-session' };
|
|
92
|
+
}
|
|
93
|
+
// Otherwise, definitionally a new topic
|
|
94
|
+
return { label: 'new_topic', confidence: 'high', source: 'session-boundary' };
|
|
95
|
+
}
|
|
96
|
+
// Explicit topic-shift markers (hard negatives - topic shift within session)
|
|
97
|
+
if (hasTopicShiftMarker(userText)) {
|
|
98
|
+
return { label: 'new_topic', confidence: 'high', source: 'explicit-shift-marker' };
|
|
99
|
+
}
|
|
100
|
+
// Explicit continuation markers
|
|
101
|
+
if (hasContinuationMarker(userText)) {
|
|
102
|
+
return { label: 'continuation', confidence: 'high', source: 'explicit-continuation-marker' };
|
|
103
|
+
}
|
|
104
|
+
// Large time gap suggests context switch
|
|
105
|
+
if (timeGapMinutes > timeGapThresholdMinutes) {
|
|
106
|
+
return { label: 'new_topic', confidence: 'medium', source: 'time-gap' };
|
|
107
|
+
}
|
|
108
|
+
// References to tool outputs or file paths suggest continuation
|
|
109
|
+
// (This is a simple heuristic - the lexical features module does more sophisticated detection)
|
|
110
|
+
const hasFileRef = /\.(ts|js|py|json|md|tsx|jsx|css|html|go|rs|java|c|cpp|h)\b/i.test(userText);
|
|
111
|
+
const hasToolRef = /(output|result|error|warning|log|file|path)/i.test(userText);
|
|
112
|
+
if (hasFileRef || hasToolRef) {
|
|
113
|
+
return { label: 'continuation', confidence: 'high', source: 'tool-file-reference' };
|
|
114
|
+
}
|
|
115
|
+
// Default: adjacent same-session turns are assumed to continue
|
|
116
|
+
return { label: 'continuation', confidence: 'medium', source: 'same-session-adjacent' };
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Generate turn transitions from a single session file.
|
|
120
|
+
*/
|
|
121
|
+
export async function generateSessionTransitions(sessionPath, sessionId, sessionSlug, options = {}) {
|
|
122
|
+
const { timeGapMinutes = DEFAULT_TIME_GAP_MINUTES } = options;
|
|
123
|
+
const messages = await readSessionMessages(sessionPath);
|
|
124
|
+
const turns = assembleTurns(messages);
|
|
125
|
+
if (turns.length < 2) {
|
|
126
|
+
return [];
|
|
127
|
+
}
|
|
128
|
+
const transitions = [];
|
|
129
|
+
for (let i = 0; i < turns.length; i++) {
|
|
130
|
+
const nextTurn = turns[i];
|
|
131
|
+
const prevTurn = i > 0 ? turns[i - 1] : null;
|
|
132
|
+
const isFirstTurn = i === 0;
|
|
133
|
+
// Skip if user text is empty
|
|
134
|
+
if (!nextTurn.userText.trim())
|
|
135
|
+
continue;
|
|
136
|
+
// For first turn, we don't have a previous assistant output
|
|
137
|
+
// But we still want to label whether this starts a new topic
|
|
138
|
+
let prevAssistantText = '';
|
|
139
|
+
let timeGapMs = 0;
|
|
140
|
+
if (prevTurn) {
|
|
141
|
+
prevAssistantText = extractAssistantText(prevTurn.assistantBlocks);
|
|
142
|
+
const prevTime = parseTime(prevTurn.startTime);
|
|
143
|
+
const nextTime = parseTime(nextTurn.startTime);
|
|
144
|
+
timeGapMs = Math.max(0, nextTime - prevTime);
|
|
145
|
+
}
|
|
146
|
+
const { label, confidence, source } = labelTransition(prevTurn, nextTurn, isFirstTurn, timeGapMs, timeGapMinutes);
|
|
147
|
+
transitions.push({
|
|
148
|
+
id: makeTransitionId(sessionId, i - 1, i),
|
|
149
|
+
sessionId,
|
|
150
|
+
sessionSlug,
|
|
151
|
+
prevTurnIndex: isFirstTurn ? -1 : i - 1,
|
|
152
|
+
nextTurnIndex: i,
|
|
153
|
+
prevAssistantText,
|
|
154
|
+
nextUserText: nextTurn.userText,
|
|
155
|
+
timeGapMs,
|
|
156
|
+
label,
|
|
157
|
+
confidence,
|
|
158
|
+
labelSource: source,
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
return transitions;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Generate turn transitions from multiple sessions.
|
|
165
|
+
*/
|
|
166
|
+
export async function generateTransitionLabels(sessions, options = {}) {
|
|
167
|
+
const { includeLowConfidence = true } = options;
|
|
168
|
+
const allTransitions = [];
|
|
169
|
+
for (const session of sessions) {
|
|
170
|
+
try {
|
|
171
|
+
const transitions = await generateSessionTransitions(session.path, session.sessionId, session.sessionSlug, options);
|
|
172
|
+
for (const t of transitions) {
|
|
173
|
+
if (!includeLowConfidence && t.confidence === 'low') {
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
allTransitions.push(t);
|
|
177
|
+
}
|
|
178
|
+
console.log(` ${session.sessionSlug}: ${transitions.length} transitions`);
|
|
179
|
+
}
|
|
180
|
+
catch (err) {
|
|
181
|
+
console.warn(` Failed to process ${session.path}: ${err}`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return allTransitions;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Compute dataset statistics from transitions.
|
|
188
|
+
*/
|
|
189
|
+
export function computeDatasetStats(transitions) {
|
|
190
|
+
const byLabelSource = {};
|
|
191
|
+
let continuationCount = 0;
|
|
192
|
+
let newTopicCount = 0;
|
|
193
|
+
let highConfidenceCount = 0;
|
|
194
|
+
let mediumConfidenceCount = 0;
|
|
195
|
+
let lowConfidenceCount = 0;
|
|
196
|
+
for (const t of transitions) {
|
|
197
|
+
if (t.label === 'continuation')
|
|
198
|
+
continuationCount++;
|
|
199
|
+
else
|
|
200
|
+
newTopicCount++;
|
|
201
|
+
if (t.confidence === 'high')
|
|
202
|
+
highConfidenceCount++;
|
|
203
|
+
else if (t.confidence === 'medium')
|
|
204
|
+
mediumConfidenceCount++;
|
|
205
|
+
else
|
|
206
|
+
lowConfidenceCount++;
|
|
207
|
+
byLabelSource[t.labelSource] = (byLabelSource[t.labelSource] ?? 0) + 1;
|
|
208
|
+
}
|
|
209
|
+
return {
|
|
210
|
+
totalTransitions: transitions.length,
|
|
211
|
+
continuationCount,
|
|
212
|
+
newTopicCount,
|
|
213
|
+
highConfidenceCount,
|
|
214
|
+
mediumConfidenceCount,
|
|
215
|
+
lowConfidenceCount,
|
|
216
|
+
byLabelSource,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Filter transitions to only include high-confidence labels.
|
|
221
|
+
*/
|
|
222
|
+
export function filterHighConfidence(transitions) {
|
|
223
|
+
return transitions.filter((t) => t.confidence === 'high');
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Balance dataset by undersampling the majority class.
|
|
227
|
+
*/
|
|
228
|
+
export function balanceDataset(transitions, seed = 42) {
|
|
229
|
+
const continuations = transitions.filter((t) => t.label === 'continuation');
|
|
230
|
+
const newTopics = transitions.filter((t) => t.label === 'new_topic');
|
|
231
|
+
const minCount = Math.min(continuations.length, newTopics.length);
|
|
232
|
+
// Deterministic shuffle
|
|
233
|
+
const shuffledContinuations = seededShuffle(continuations, seed);
|
|
234
|
+
const shuffledNewTopics = seededShuffle(newTopics, seed + 1);
|
|
235
|
+
return [
|
|
236
|
+
...shuffledContinuations.slice(0, minCount),
|
|
237
|
+
...shuffledNewTopics.slice(0, minCount),
|
|
238
|
+
];
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Deterministic seeded shuffle.
|
|
242
|
+
*/
|
|
243
|
+
function seededShuffle(arr, seed) {
|
|
244
|
+
const result = [...arr];
|
|
245
|
+
let s = seed;
|
|
246
|
+
for (let i = result.length - 1; i > 0; i--) {
|
|
247
|
+
s = (s * 1664525 + 1013904223) & 0x7fffffff;
|
|
248
|
+
const j = s % (i + 1);
|
|
249
|
+
[result[i], result[j]] = [result[j], result[i]];
|
|
250
|
+
}
|
|
251
|
+
return result;
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=labeler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"labeler.js","sourceRoot":"","sources":["../../../../src/eval/experiments/topic-continuity/labeler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lexical feature extraction for topic continuity classification.
|
|
3
|
+
*
|
|
4
|
+
* Re-exports shared functions from src/core/lexical-features.ts and adds
|
|
5
|
+
* eval-specific functions that depend on TransitionFeatures.
|
|
6
|
+
*/
|
|
7
|
+
import type { TransitionFeatures } from './types.js';
|
|
8
|
+
export { hasTopicShiftMarker, hasContinuationMarker, extractFilePaths, computeFilePathOverlap, extractKeywords, computeKeywordOverlap, } from '../../../core/lexical-features.js';
|
|
9
|
+
/**
|
|
10
|
+
* Extract all lexical features for a transition.
|
|
11
|
+
*/
|
|
12
|
+
export declare function extractLexicalFeatures(prevAssistantText: string, nextUserText: string, timeGapMs: number): Omit<TransitionFeatures, 'embeddingDistanceMin' | 'embeddingDistanceMean'>;
|
|
13
|
+
/**
|
|
14
|
+
* Compute a lexical-only continuation score.
|
|
15
|
+
* Higher score = more likely to be a continuation.
|
|
16
|
+
*/
|
|
17
|
+
export declare function computeLexicalScore(features: Omit<TransitionFeatures, 'embeddingDistanceMin' | 'embeddingDistanceMean'>): number;
|
|
18
|
+
export interface LexicalClassificationResult {
|
|
19
|
+
score: number;
|
|
20
|
+
features: Omit<TransitionFeatures, 'embeddingDistanceMin' | 'embeddingDistanceMean'>;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Classify a transition using only lexical features.
|
|
24
|
+
*/
|
|
25
|
+
export declare function classifyWithLexicalFeatures(prevAssistantText: string, nextUserText: string, timeGapMs: number): LexicalClassificationResult;
|
|
26
|
+
//# sourceMappingURL=lexical-features.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lexical-features.d.ts","sourceRoot":"","sources":["../../../../src/eval/experiments/topic-continuity/lexical-features.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AASrD,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,sBAAsB,EACtB,eAAe,EACf,qBAAqB,GACtB,MAAM,mCAAmC,CAAC;AAE3C;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,iBAAiB,EAAE,MAAM,EACzB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GAChB,IAAI,CAAC,kBAAkB,EAAE,sBAAsB,GAAG,uBAAuB,CAAC,CAQ5E;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,IAAI,CAAC,kBAAkB,EAAE,sBAAsB,GAAG,uBAAuB,CAAC,GACnF,MAAM,CA4BR;AAED,MAAM,WAAW,2BAA2B;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,IAAI,CAAC,kBAAkB,EAAE,sBAAsB,GAAG,uBAAuB,CAAC,CAAC;CACtF;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,iBAAiB,EAAE,MAAM,EACzB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GAChB,2BAA2B,CAI7B"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lexical feature extraction for topic continuity classification.
|
|
3
|
+
*
|
|
4
|
+
* Re-exports shared functions from src/core/lexical-features.ts and adds
|
|
5
|
+
* eval-specific functions that depend on TransitionFeatures.
|
|
6
|
+
*/
|
|
7
|
+
import { hasTopicShiftMarker as coreHasTopicShiftMarker, hasContinuationMarker as coreHasContinuationMarker, computeFilePathOverlap as coreComputeFilePathOverlap, computeKeywordOverlap as coreComputeKeywordOverlap, } from '../../../core/lexical-features.js';
|
|
8
|
+
// Re-export all shared functions from core
|
|
9
|
+
export { hasTopicShiftMarker, hasContinuationMarker, extractFilePaths, computeFilePathOverlap, extractKeywords, computeKeywordOverlap, } from '../../../core/lexical-features.js';
|
|
10
|
+
/**
|
|
11
|
+
* Extract all lexical features for a transition.
|
|
12
|
+
*/
|
|
13
|
+
export function extractLexicalFeatures(prevAssistantText, nextUserText, timeGapMs) {
|
|
14
|
+
return {
|
|
15
|
+
timeGapMinutes: timeGapMs / (1000 * 60),
|
|
16
|
+
hasTopicShiftMarker: coreHasTopicShiftMarker(nextUserText),
|
|
17
|
+
hasContinuationMarker: coreHasContinuationMarker(nextUserText),
|
|
18
|
+
filePathOverlap: coreComputeFilePathOverlap(prevAssistantText, nextUserText),
|
|
19
|
+
keywordOverlap: coreComputeKeywordOverlap(prevAssistantText, nextUserText),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Compute a lexical-only continuation score.
|
|
24
|
+
* Higher score = more likely to be a continuation.
|
|
25
|
+
*/
|
|
26
|
+
export function computeLexicalScore(features) {
|
|
27
|
+
let score = 0.5; // Start at neutral
|
|
28
|
+
// Topic shift markers strongly indicate new topic
|
|
29
|
+
if (features.hasTopicShiftMarker) {
|
|
30
|
+
score -= 0.4;
|
|
31
|
+
}
|
|
32
|
+
// Continuation markers strongly indicate continuation
|
|
33
|
+
if (features.hasContinuationMarker) {
|
|
34
|
+
score += 0.3;
|
|
35
|
+
}
|
|
36
|
+
// File path overlap suggests continuation
|
|
37
|
+
score += features.filePathOverlap * 0.2;
|
|
38
|
+
// Keyword overlap suggests continuation
|
|
39
|
+
score += features.keywordOverlap * 0.15;
|
|
40
|
+
// Large time gap suggests new topic
|
|
41
|
+
if (features.timeGapMinutes > 30) {
|
|
42
|
+
score -= 0.25;
|
|
43
|
+
}
|
|
44
|
+
else if (features.timeGapMinutes > 10) {
|
|
45
|
+
score -= 0.1;
|
|
46
|
+
}
|
|
47
|
+
// Clamp to [0, 1]
|
|
48
|
+
return Math.max(0, Math.min(1, score));
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Classify a transition using only lexical features.
|
|
52
|
+
*/
|
|
53
|
+
export function classifyWithLexicalFeatures(prevAssistantText, nextUserText, timeGapMs) {
|
|
54
|
+
const features = extractLexicalFeatures(prevAssistantText, nextUserText, timeGapMs);
|
|
55
|
+
const score = computeLexicalScore(features);
|
|
56
|
+
return { score, features };
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=lexical-features.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lexical-features.js","sourceRoot":"","sources":["../../../../src/eval/experiments/topic-continuity/lexical-features.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACL,mBAAmB,IAAI,uBAAuB,EAC9C,qBAAqB,IAAI,yBAAyB,EAClD,sBAAsB,IAAI,0BAA0B,EACpD,qBAAqB,IAAI,yBAAyB,GACnD,MAAM,mCAAmC,CAAC;AAE3C,2CAA2C;AAC3C,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,sBAAsB,EACtB,eAAe,EACf,qBAAqB,GACtB,MAAM,mCAAmC,CAAC;AAE3C;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,iBAAyB,EACzB,YAAoB,EACpB,SAAiB;IAEjB,OAAO;QACL,cAAc,EAAE,SAAS,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;QACvC,mBAAmB,EAAE,uBAAuB,CAAC,YAAY,CAAC;QAC1D,qBAAqB,EAAE,yBAAyB,CAAC,YAAY,CAAC;QAC9D,eAAe,EAAE,0BAA0B,CAAC,iBAAiB,EAAE,YAAY,CAAC;QAC5E,cAAc,EAAE,yBAAyB,CAAC,iBAAiB,EAAE,YAAY,CAAC;KAC3E,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,QAAoF;IAEpF,IAAI,KAAK,GAAG,GAAG,CAAC,CAAC,mBAAmB;IAEpC,kDAAkD;IAClD,IAAI,QAAQ,CAAC,mBAAmB,EAAE,CAAC;QACjC,KAAK,IAAI,GAAG,CAAC;IACf,CAAC;IAED,sDAAsD;IACtD,IAAI,QAAQ,CAAC,qBAAqB,EAAE,CAAC;QACnC,KAAK,IAAI,GAAG,CAAC;IACf,CAAC;IAED,0CAA0C;IAC1C,KAAK,IAAI,QAAQ,CAAC,eAAe,GAAG,GAAG,CAAC;IAExC,wCAAwC;IACxC,KAAK,IAAI,QAAQ,CAAC,cAAc,GAAG,IAAI,CAAC;IAExC,oCAAoC;IACpC,IAAI,QAAQ,CAAC,cAAc,GAAG,EAAE,EAAE,CAAC;QACjC,KAAK,IAAI,IAAI,CAAC;IAChB,CAAC;SAAM,IAAI,QAAQ,CAAC,cAAc,GAAG,EAAE,EAAE,CAAC;QACxC,KAAK,IAAI,GAAG,CAAC;IACf,CAAC;IAED,kBAAkB;IAClB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;AACzC,CAAC;AAOD;;GAEG;AACH,MAAM,UAAU,2BAA2B,CACzC,iBAAyB,EACzB,YAAoB,EACpB,SAAiB;IAEjB,MAAM,QAAQ,GAAG,sBAAsB,CAAC,iBAAiB,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;IACpF,MAAM,KAAK,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC5C,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AAC7B,CAAC"}
|