@dotsetlabs/bellwether 0.10.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/CHANGELOG.md +291 -0
- package/LICENSE +21 -0
- package/README.md +739 -0
- package/dist/auth/credentials.d.ts +64 -0
- package/dist/auth/credentials.js +218 -0
- package/dist/auth/index.d.ts +6 -0
- package/dist/auth/index.js +6 -0
- package/dist/auth/keychain.d.ts +64 -0
- package/dist/auth/keychain.js +268 -0
- package/dist/baseline/ab-testing.d.ts +80 -0
- package/dist/baseline/ab-testing.js +236 -0
- package/dist/baseline/ai-compatibility-scorer.d.ts +95 -0
- package/dist/baseline/ai-compatibility-scorer.js +606 -0
- package/dist/baseline/calibration.d.ts +77 -0
- package/dist/baseline/calibration.js +136 -0
- package/dist/baseline/category-matching.d.ts +85 -0
- package/dist/baseline/category-matching.js +289 -0
- package/dist/baseline/change-impact-analyzer.d.ts +98 -0
- package/dist/baseline/change-impact-analyzer.js +592 -0
- package/dist/baseline/comparator.d.ts +64 -0
- package/dist/baseline/comparator.js +916 -0
- package/dist/baseline/confidence.d.ts +55 -0
- package/dist/baseline/confidence.js +122 -0
- package/dist/baseline/converter.d.ts +61 -0
- package/dist/baseline/converter.js +585 -0
- package/dist/baseline/dependency-analyzer.d.ts +89 -0
- package/dist/baseline/dependency-analyzer.js +567 -0
- package/dist/baseline/deprecation-tracker.d.ts +133 -0
- package/dist/baseline/deprecation-tracker.js +322 -0
- package/dist/baseline/diff.d.ts +55 -0
- package/dist/baseline/diff.js +1584 -0
- package/dist/baseline/documentation-scorer.d.ts +205 -0
- package/dist/baseline/documentation-scorer.js +466 -0
- package/dist/baseline/embeddings.d.ts +118 -0
- package/dist/baseline/embeddings.js +251 -0
- package/dist/baseline/error-analyzer.d.ts +198 -0
- package/dist/baseline/error-analyzer.js +721 -0
- package/dist/baseline/evaluation/evaluator.d.ts +42 -0
- package/dist/baseline/evaluation/evaluator.js +323 -0
- package/dist/baseline/evaluation/expanded-dataset.d.ts +45 -0
- package/dist/baseline/evaluation/expanded-dataset.js +1164 -0
- package/dist/baseline/evaluation/golden-dataset.d.ts +58 -0
- package/dist/baseline/evaluation/golden-dataset.js +717 -0
- package/dist/baseline/evaluation/index.d.ts +15 -0
- package/dist/baseline/evaluation/index.js +15 -0
- package/dist/baseline/evaluation/types.d.ts +186 -0
- package/dist/baseline/evaluation/types.js +8 -0
- package/dist/baseline/external-dependency-detector.d.ts +181 -0
- package/dist/baseline/external-dependency-detector.js +524 -0
- package/dist/baseline/golden-output.d.ts +162 -0
- package/dist/baseline/golden-output.js +636 -0
- package/dist/baseline/health-scorer.d.ts +174 -0
- package/dist/baseline/health-scorer.js +451 -0
- package/dist/baseline/incremental-checker.d.ts +97 -0
- package/dist/baseline/incremental-checker.js +174 -0
- package/dist/baseline/index.d.ts +31 -0
- package/dist/baseline/index.js +42 -0
- package/dist/baseline/migration-generator.d.ts +137 -0
- package/dist/baseline/migration-generator.js +554 -0
- package/dist/baseline/migrations.d.ts +60 -0
- package/dist/baseline/migrations.js +197 -0
- package/dist/baseline/performance-tracker.d.ts +214 -0
- package/dist/baseline/performance-tracker.js +577 -0
- package/dist/baseline/pr-comment-generator.d.ts +117 -0
- package/dist/baseline/pr-comment-generator.js +546 -0
- package/dist/baseline/response-fingerprint.d.ts +127 -0
- package/dist/baseline/response-fingerprint.js +728 -0
- package/dist/baseline/response-schema-tracker.d.ts +129 -0
- package/dist/baseline/response-schema-tracker.js +420 -0
- package/dist/baseline/risk-scorer.d.ts +54 -0
- package/dist/baseline/risk-scorer.js +434 -0
- package/dist/baseline/saver.d.ts +89 -0
- package/dist/baseline/saver.js +554 -0
- package/dist/baseline/scenario-generator.d.ts +151 -0
- package/dist/baseline/scenario-generator.js +905 -0
- package/dist/baseline/schema-compare.d.ts +86 -0
- package/dist/baseline/schema-compare.js +557 -0
- package/dist/baseline/schema-evolution.d.ts +189 -0
- package/dist/baseline/schema-evolution.js +467 -0
- package/dist/baseline/semantic.d.ts +203 -0
- package/dist/baseline/semantic.js +908 -0
- package/dist/baseline/synonyms.d.ts +60 -0
- package/dist/baseline/synonyms.js +386 -0
- package/dist/baseline/telemetry.d.ts +165 -0
- package/dist/baseline/telemetry.js +294 -0
- package/dist/baseline/test-pruner.d.ts +120 -0
- package/dist/baseline/test-pruner.js +387 -0
- package/dist/baseline/types.d.ts +449 -0
- package/dist/baseline/types.js +5 -0
- package/dist/baseline/version.d.ts +138 -0
- package/dist/baseline/version.js +206 -0
- package/dist/cache/index.d.ts +5 -0
- package/dist/cache/index.js +5 -0
- package/dist/cache/response-cache.d.ts +151 -0
- package/dist/cache/response-cache.js +287 -0
- package/dist/ci/index.d.ts +60 -0
- package/dist/ci/index.js +342 -0
- package/dist/cli/commands/auth.d.ts +12 -0
- package/dist/cli/commands/auth.js +352 -0
- package/dist/cli/commands/badge.d.ts +3 -0
- package/dist/cli/commands/badge.js +74 -0
- package/dist/cli/commands/baseline-accept.d.ts +15 -0
- package/dist/cli/commands/baseline-accept.js +178 -0
- package/dist/cli/commands/baseline-migrate.d.ts +12 -0
- package/dist/cli/commands/baseline-migrate.js +164 -0
- package/dist/cli/commands/baseline.d.ts +14 -0
- package/dist/cli/commands/baseline.js +449 -0
- package/dist/cli/commands/beta.d.ts +10 -0
- package/dist/cli/commands/beta.js +231 -0
- package/dist/cli/commands/check.d.ts +11 -0
- package/dist/cli/commands/check.js +820 -0
- package/dist/cli/commands/cloud/badge.d.ts +3 -0
- package/dist/cli/commands/cloud/badge.js +74 -0
- package/dist/cli/commands/cloud/diff.d.ts +6 -0
- package/dist/cli/commands/cloud/diff.js +79 -0
- package/dist/cli/commands/cloud/history.d.ts +6 -0
- package/dist/cli/commands/cloud/history.js +102 -0
- package/dist/cli/commands/cloud/link.d.ts +9 -0
- package/dist/cli/commands/cloud/link.js +119 -0
- package/dist/cli/commands/cloud/login.d.ts +7 -0
- package/dist/cli/commands/cloud/login.js +499 -0
- package/dist/cli/commands/cloud/projects.d.ts +6 -0
- package/dist/cli/commands/cloud/projects.js +44 -0
- package/dist/cli/commands/cloud/shared.d.ts +7 -0
- package/dist/cli/commands/cloud/shared.js +42 -0
- package/dist/cli/commands/cloud/teams.d.ts +8 -0
- package/dist/cli/commands/cloud/teams.js +169 -0
- package/dist/cli/commands/cloud/upload.d.ts +8 -0
- package/dist/cli/commands/cloud/upload.js +181 -0
- package/dist/cli/commands/contract.d.ts +11 -0
- package/dist/cli/commands/contract.js +280 -0
- package/dist/cli/commands/discover.d.ts +3 -0
- package/dist/cli/commands/discover.js +82 -0
- package/dist/cli/commands/eval.d.ts +9 -0
- package/dist/cli/commands/eval.js +187 -0
- package/dist/cli/commands/explore.d.ts +11 -0
- package/dist/cli/commands/explore.js +437 -0
- package/dist/cli/commands/feedback.d.ts +9 -0
- package/dist/cli/commands/feedback.js +174 -0
- package/dist/cli/commands/golden.d.ts +12 -0
- package/dist/cli/commands/golden.js +407 -0
- package/dist/cli/commands/history.d.ts +10 -0
- package/dist/cli/commands/history.js +202 -0
- package/dist/cli/commands/init.d.ts +9 -0
- package/dist/cli/commands/init.js +219 -0
- package/dist/cli/commands/interview.d.ts +3 -0
- package/dist/cli/commands/interview.js +903 -0
- package/dist/cli/commands/link.d.ts +10 -0
- package/dist/cli/commands/link.js +169 -0
- package/dist/cli/commands/login.d.ts +7 -0
- package/dist/cli/commands/login.js +499 -0
- package/dist/cli/commands/preset.d.ts +33 -0
- package/dist/cli/commands/preset.js +297 -0
- package/dist/cli/commands/profile.d.ts +33 -0
- package/dist/cli/commands/profile.js +286 -0
- package/dist/cli/commands/registry.d.ts +11 -0
- package/dist/cli/commands/registry.js +146 -0
- package/dist/cli/commands/shared.d.ts +79 -0
- package/dist/cli/commands/shared.js +196 -0
- package/dist/cli/commands/teams.d.ts +8 -0
- package/dist/cli/commands/teams.js +169 -0
- package/dist/cli/commands/test.d.ts +9 -0
- package/dist/cli/commands/test.js +500 -0
- package/dist/cli/commands/upload.d.ts +8 -0
- package/dist/cli/commands/upload.js +223 -0
- package/dist/cli/commands/validate-config.d.ts +6 -0
- package/dist/cli/commands/validate-config.js +35 -0
- package/dist/cli/commands/verify.d.ts +11 -0
- package/dist/cli/commands/verify.js +283 -0
- package/dist/cli/commands/watch.d.ts +12 -0
- package/dist/cli/commands/watch.js +253 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.js +178 -0
- package/dist/cli/interactive.d.ts +47 -0
- package/dist/cli/interactive.js +216 -0
- package/dist/cli/output/terminal-reporter.d.ts +19 -0
- package/dist/cli/output/terminal-reporter.js +104 -0
- package/dist/cli/output.d.ts +226 -0
- package/dist/cli/output.js +438 -0
- package/dist/cli/utils/env.d.ts +5 -0
- package/dist/cli/utils/env.js +14 -0
- package/dist/cli/utils/progress.d.ts +59 -0
- package/dist/cli/utils/progress.js +206 -0
- package/dist/cli/utils/server-context.d.ts +10 -0
- package/dist/cli/utils/server-context.js +36 -0
- package/dist/cloud/auth.d.ts +144 -0
- package/dist/cloud/auth.js +374 -0
- package/dist/cloud/client.d.ts +24 -0
- package/dist/cloud/client.js +65 -0
- package/dist/cloud/http-client.d.ts +38 -0
- package/dist/cloud/http-client.js +215 -0
- package/dist/cloud/index.d.ts +23 -0
- package/dist/cloud/index.js +25 -0
- package/dist/cloud/mock-client.d.ts +107 -0
- package/dist/cloud/mock-client.js +545 -0
- package/dist/cloud/types.d.ts +515 -0
- package/dist/cloud/types.js +15 -0
- package/dist/config/defaults.d.ts +160 -0
- package/dist/config/defaults.js +169 -0
- package/dist/config/loader.d.ts +24 -0
- package/dist/config/loader.js +122 -0
- package/dist/config/template.d.ts +42 -0
- package/dist/config/template.js +647 -0
- package/dist/config/validator.d.ts +2112 -0
- package/dist/config/validator.js +658 -0
- package/dist/constants/cloud.d.ts +107 -0
- package/dist/constants/cloud.js +110 -0
- package/dist/constants/core.d.ts +521 -0
- package/dist/constants/core.js +556 -0
- package/dist/constants/testing.d.ts +1283 -0
- package/dist/constants/testing.js +1568 -0
- package/dist/constants.d.ts +10 -0
- package/dist/constants.js +10 -0
- package/dist/contract/index.d.ts +6 -0
- package/dist/contract/index.js +5 -0
- package/dist/contract/validator.d.ts +177 -0
- package/dist/contract/validator.js +574 -0
- package/dist/cost/index.d.ts +6 -0
- package/dist/cost/index.js +5 -0
- package/dist/cost/tracker.d.ts +134 -0
- package/dist/cost/tracker.js +313 -0
- package/dist/discovery/discovery.d.ts +16 -0
- package/dist/discovery/discovery.js +173 -0
- package/dist/discovery/types.d.ts +51 -0
- package/dist/discovery/types.js +2 -0
- package/dist/docs/agents.d.ts +3 -0
- package/dist/docs/agents.js +995 -0
- package/dist/docs/contract.d.ts +51 -0
- package/dist/docs/contract.js +1681 -0
- package/dist/docs/generator.d.ts +4 -0
- package/dist/docs/generator.js +4 -0
- package/dist/docs/html-reporter.d.ts +9 -0
- package/dist/docs/html-reporter.js +757 -0
- package/dist/docs/index.d.ts +10 -0
- package/dist/docs/index.js +11 -0
- package/dist/docs/junit-reporter.d.ts +18 -0
- package/dist/docs/junit-reporter.js +210 -0
- package/dist/docs/report.d.ts +14 -0
- package/dist/docs/report.js +44 -0
- package/dist/docs/sarif-reporter.d.ts +19 -0
- package/dist/docs/sarif-reporter.js +335 -0
- package/dist/docs/shared.d.ts +35 -0
- package/dist/docs/shared.js +162 -0
- package/dist/docs/templates.d.ts +12 -0
- package/dist/docs/templates.js +76 -0
- package/dist/errors/index.d.ts +6 -0
- package/dist/errors/index.js +6 -0
- package/dist/errors/retry.d.ts +92 -0
- package/dist/errors/retry.js +323 -0
- package/dist/errors/types.d.ts +321 -0
- package/dist/errors/types.js +584 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.js +32 -0
- package/dist/interview/dependency-resolver.d.ts +11 -0
- package/dist/interview/dependency-resolver.js +32 -0
- package/dist/interview/interviewer.d.ts +232 -0
- package/dist/interview/interviewer.js +1939 -0
- package/dist/interview/mock-response-generator.d.ts +7 -0
- package/dist/interview/mock-response-generator.js +102 -0
- package/dist/interview/orchestrator.d.ts +237 -0
- package/dist/interview/orchestrator.js +1296 -0
- package/dist/interview/rate-limiter.d.ts +15 -0
- package/dist/interview/rate-limiter.js +55 -0
- package/dist/interview/response-validator.d.ts +10 -0
- package/dist/interview/response-validator.js +132 -0
- package/dist/interview/schema-inferrer.d.ts +8 -0
- package/dist/interview/schema-inferrer.js +71 -0
- package/dist/interview/schema-test-generator.d.ts +71 -0
- package/dist/interview/schema-test-generator.js +834 -0
- package/dist/interview/smart-value-generator.d.ts +155 -0
- package/dist/interview/smart-value-generator.js +554 -0
- package/dist/interview/stateful-test-runner.d.ts +19 -0
- package/dist/interview/stateful-test-runner.js +106 -0
- package/dist/interview/types.d.ts +561 -0
- package/dist/interview/types.js +2 -0
- package/dist/llm/anthropic.d.ts +41 -0
- package/dist/llm/anthropic.js +355 -0
- package/dist/llm/client.d.ts +123 -0
- package/dist/llm/client.js +42 -0
- package/dist/llm/factory.d.ts +38 -0
- package/dist/llm/factory.js +145 -0
- package/dist/llm/fallback.d.ts +140 -0
- package/dist/llm/fallback.js +379 -0
- package/dist/llm/index.d.ts +18 -0
- package/dist/llm/index.js +15 -0
- package/dist/llm/ollama.d.ts +37 -0
- package/dist/llm/ollama.js +330 -0
- package/dist/llm/openai.d.ts +25 -0
- package/dist/llm/openai.js +320 -0
- package/dist/llm/token-budget.d.ts +161 -0
- package/dist/llm/token-budget.js +395 -0
- package/dist/logging/logger.d.ts +70 -0
- package/dist/logging/logger.js +130 -0
- package/dist/metrics/collector.d.ts +106 -0
- package/dist/metrics/collector.js +547 -0
- package/dist/metrics/index.d.ts +7 -0
- package/dist/metrics/index.js +7 -0
- package/dist/metrics/prometheus.d.ts +20 -0
- package/dist/metrics/prometheus.js +241 -0
- package/dist/metrics/types.d.ts +209 -0
- package/dist/metrics/types.js +5 -0
- package/dist/persona/builtins.d.ts +54 -0
- package/dist/persona/builtins.js +219 -0
- package/dist/persona/index.d.ts +8 -0
- package/dist/persona/index.js +8 -0
- package/dist/persona/loader.d.ts +30 -0
- package/dist/persona/loader.js +190 -0
- package/dist/persona/types.d.ts +144 -0
- package/dist/persona/types.js +5 -0
- package/dist/persona/validation.d.ts +94 -0
- package/dist/persona/validation.js +332 -0
- package/dist/prompts/index.d.ts +5 -0
- package/dist/prompts/index.js +5 -0
- package/dist/prompts/templates.d.ts +180 -0
- package/dist/prompts/templates.js +431 -0
- package/dist/registry/client.d.ts +49 -0
- package/dist/registry/client.js +191 -0
- package/dist/registry/index.d.ts +7 -0
- package/dist/registry/index.js +6 -0
- package/dist/registry/types.d.ts +140 -0
- package/dist/registry/types.js +6 -0
- package/dist/scenarios/evaluator.d.ts +43 -0
- package/dist/scenarios/evaluator.js +206 -0
- package/dist/scenarios/index.d.ts +10 -0
- package/dist/scenarios/index.js +9 -0
- package/dist/scenarios/loader.d.ts +20 -0
- package/dist/scenarios/loader.js +285 -0
- package/dist/scenarios/types.d.ts +153 -0
- package/dist/scenarios/types.js +8 -0
- package/dist/security/index.d.ts +17 -0
- package/dist/security/index.js +18 -0
- package/dist/security/payloads.d.ts +61 -0
- package/dist/security/payloads.js +268 -0
- package/dist/security/security-tester.d.ts +42 -0
- package/dist/security/security-tester.js +582 -0
- package/dist/security/types.d.ts +166 -0
- package/dist/security/types.js +8 -0
- package/dist/transport/base-transport.d.ts +59 -0
- package/dist/transport/base-transport.js +38 -0
- package/dist/transport/http-transport.d.ts +67 -0
- package/dist/transport/http-transport.js +238 -0
- package/dist/transport/mcp-client.d.ts +141 -0
- package/dist/transport/mcp-client.js +496 -0
- package/dist/transport/sse-transport.d.ts +88 -0
- package/dist/transport/sse-transport.js +316 -0
- package/dist/transport/stdio-transport.d.ts +43 -0
- package/dist/transport/stdio-transport.js +238 -0
- package/dist/transport/types.d.ts +125 -0
- package/dist/transport/types.js +16 -0
- package/dist/utils/concurrency.d.ts +123 -0
- package/dist/utils/concurrency.js +213 -0
- package/dist/utils/formatters.d.ts +16 -0
- package/dist/utils/formatters.js +37 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/jsonpath.d.ts +87 -0
- package/dist/utils/jsonpath.js +326 -0
- package/dist/utils/markdown.d.ts +113 -0
- package/dist/utils/markdown.js +265 -0
- package/dist/utils/network.d.ts +14 -0
- package/dist/utils/network.js +17 -0
- package/dist/utils/sanitize.d.ts +92 -0
- package/dist/utils/sanitize.js +191 -0
- package/dist/utils/semantic.d.ts +194 -0
- package/dist/utils/semantic.js +1051 -0
- package/dist/utils/smart-truncate.d.ts +94 -0
- package/dist/utils/smart-truncate.js +361 -0
- package/dist/utils/timeout.d.ts +153 -0
- package/dist/utils/timeout.js +205 -0
- package/dist/utils/yaml-parser.d.ts +58 -0
- package/dist/utils/yaml-parser.js +86 -0
- package/dist/validation/index.d.ts +32 -0
- package/dist/validation/index.js +32 -0
- package/dist/validation/semantic-test-generator.d.ts +50 -0
- package/dist/validation/semantic-test-generator.js +176 -0
- package/dist/validation/semantic-types.d.ts +66 -0
- package/dist/validation/semantic-types.js +94 -0
- package/dist/validation/semantic-validator.d.ts +38 -0
- package/dist/validation/semantic-validator.js +340 -0
- package/dist/verification/index.d.ts +6 -0
- package/dist/verification/index.js +5 -0
- package/dist/verification/types.d.ts +133 -0
- package/dist/verification/types.js +5 -0
- package/dist/verification/verifier.d.ts +30 -0
- package/dist/verification/verifier.js +309 -0
- package/dist/version.d.ts +19 -0
- package/dist/version.js +48 -0
- package/dist/workflow/auto-generator.d.ts +27 -0
- package/dist/workflow/auto-generator.js +513 -0
- package/dist/workflow/discovery.d.ts +40 -0
- package/dist/workflow/discovery.js +195 -0
- package/dist/workflow/executor.d.ts +82 -0
- package/dist/workflow/executor.js +611 -0
- package/dist/workflow/index.d.ts +10 -0
- package/dist/workflow/index.js +10 -0
- package/dist/workflow/loader.d.ts +24 -0
- package/dist/workflow/loader.js +194 -0
- package/dist/workflow/state-tracker.d.ts +98 -0
- package/dist/workflow/state-tracker.js +424 -0
- package/dist/workflow/types.d.ts +337 -0
- package/dist/workflow/types.js +5 -0
- package/package.json +94 -0
- package/schemas/bellwether-check.schema.json +651 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security and Technical Term Synonyms for Improved Recall
|
|
3
|
+
*
|
|
4
|
+
* This module provides comprehensive synonym mappings to improve
|
|
5
|
+
* paraphrase detection in drift detection. Synonyms are bidirectional
|
|
6
|
+
* and include abbreviations, alternative phrasings, and related terms.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Security vulnerability synonyms.
|
|
10
|
+
* Each entry maps a canonical term to all equivalent expressions.
|
|
11
|
+
*/
|
|
12
|
+
export declare const SECURITY_SYNONYMS: Record<string, string[]>;
|
|
13
|
+
/**
|
|
14
|
+
* Limitation/constraint synonyms.
|
|
15
|
+
*/
|
|
16
|
+
export declare const LIMITATION_SYNONYMS: Record<string, string[]>;
|
|
17
|
+
/**
|
|
18
|
+
* Behavioral assertion synonyms.
|
|
19
|
+
*/
|
|
20
|
+
export declare const BEHAVIOR_SYNONYMS: Record<string, string[]>;
|
|
21
|
+
/**
|
|
22
|
+
* Build a reverse lookup map from any synonym to its canonical term.
|
|
23
|
+
*/
|
|
24
|
+
export declare function buildSynonymLookup(synonymMap: Record<string, string[]>): Map<string, string>;
|
|
25
|
+
/**
|
|
26
|
+
* Expand a text by adding canonical terms for any synonyms found.
|
|
27
|
+
* This improves keyword overlap for paraphrases.
|
|
28
|
+
*/
|
|
29
|
+
export declare function expandWithSynonyms(text: string, type?: 'security' | 'limitation' | 'behavior'): string;
|
|
30
|
+
/**
|
|
31
|
+
* Check if two texts share a canonical security term.
|
|
32
|
+
* Returns the matching term(s) or empty array if no match.
|
|
33
|
+
*
|
|
34
|
+
* NOTE: Generic terms like "vulnerability" are excluded since they would
|
|
35
|
+
* cause false matches between completely different vulnerability types.
|
|
36
|
+
*/
|
|
37
|
+
export declare function findSharedSecurityTerms(text1: string, text2: string): string[];
|
|
38
|
+
/**
|
|
39
|
+
* Calculate semantic similarity boost from synonyms.
|
|
40
|
+
* Returns 0-100 indicating how much two texts share canonical terms.
|
|
41
|
+
*/
|
|
42
|
+
export declare function calculateSynonymSimilarity(text1: string, text2: string, type?: 'security' | 'limitation' | 'behavior'): number;
|
|
43
|
+
/**
|
|
44
|
+
* Time unit normalization for comparing timeouts.
|
|
45
|
+
* Converts all time expressions to milliseconds.
|
|
46
|
+
*/
|
|
47
|
+
export declare function normalizeTimeToMs(text: string): number | null;
|
|
48
|
+
/**
|
|
49
|
+
* Check if two time expressions are equivalent.
|
|
50
|
+
*/
|
|
51
|
+
export declare function timeExpressionsEqual(text1: string, text2: string): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Abbreviation expansions for common security terms.
|
|
54
|
+
*/
|
|
55
|
+
export declare const ABBREVIATIONS: Record<string, string>;
|
|
56
|
+
/**
|
|
57
|
+
* Expand abbreviations in text.
|
|
58
|
+
*/
|
|
59
|
+
export declare function expandAbbreviations(text: string): string;
|
|
60
|
+
//# sourceMappingURL=synonyms.d.ts.map
|
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security and Technical Term Synonyms for Improved Recall
|
|
3
|
+
*
|
|
4
|
+
* This module provides comprehensive synonym mappings to improve
|
|
5
|
+
* paraphrase detection in drift detection. Synonyms are bidirectional
|
|
6
|
+
* and include abbreviations, alternative phrasings, and related terms.
|
|
7
|
+
*/
|
|
8
|
+
import { MATH_FACTORS } from '../constants.js';
|
|
9
|
+
/**
|
|
10
|
+
* Security vulnerability synonyms.
|
|
11
|
+
* Each entry maps a canonical term to all equivalent expressions.
|
|
12
|
+
*/
|
|
13
|
+
export const SECURITY_SYNONYMS = {
|
|
14
|
+
// Path Traversal
|
|
15
|
+
path_traversal: [
|
|
16
|
+
'path traversal', 'directory traversal', 'file path traversal',
|
|
17
|
+
'lfi', 'local file inclusion', 'file inclusion',
|
|
18
|
+
'arbitrary file', 'file access', 'path manipulation',
|
|
19
|
+
'dotdot', '../', 'parent directory', 'directory escape',
|
|
20
|
+
'path injection', 'file path injection', 'traverse',
|
|
21
|
+
],
|
|
22
|
+
// SQL Injection
|
|
23
|
+
sql_injection: [
|
|
24
|
+
'sql injection', 'sqli', 'sql attack', 'database injection',
|
|
25
|
+
'query injection', 'sql vulnerability', 'inject sql',
|
|
26
|
+
'unsanitized sql', 'raw sql', 'dynamic sql',
|
|
27
|
+
'parameterized', 'prepared statement', 'query construction',
|
|
28
|
+
'string interpolation', 'f-string', 'concatenat',
|
|
29
|
+
'blind injection', 'boolean-based', 'time-based',
|
|
30
|
+
'second order', 'union-based', 'error-based',
|
|
31
|
+
],
|
|
32
|
+
// Cross-Site Scripting
|
|
33
|
+
xss: [
|
|
34
|
+
'xss', 'cross-site scripting', 'cross site scripting',
|
|
35
|
+
'script injection', 'html injection', 'javascript injection',
|
|
36
|
+
'reflected xss', 'stored xss', 'dom xss', 'dom-based',
|
|
37
|
+
'unsanitized output', 'unescaped', 'encoding', 'escaping',
|
|
38
|
+
'html entity', 'script tag', 'onclick', 'onerror',
|
|
39
|
+
'rendered', 'reflected', 'user input',
|
|
40
|
+
],
|
|
41
|
+
// Command Injection
|
|
42
|
+
command_injection: [
|
|
43
|
+
'command injection', 'os injection', 'shell injection',
|
|
44
|
+
'code injection', 'rce', 'remote code execution',
|
|
45
|
+
'system()', 'exec()', 'eval()', 'popen',
|
|
46
|
+
'subprocess', 'shell command', 'execute command',
|
|
47
|
+
'os command', 'operating system', 'shell',
|
|
48
|
+
],
|
|
49
|
+
// SSRF
|
|
50
|
+
ssrf: [
|
|
51
|
+
'ssrf', 'server-side request forgery', 'server side request forgery',
|
|
52
|
+
'internal network', 'internal service', 'localhost',
|
|
53
|
+
'127.0.0.1', 'metadata service', 'cloud metadata',
|
|
54
|
+
'url fetch', 'url redirect', 'request to internal',
|
|
55
|
+
],
|
|
56
|
+
// Authentication/Authorization
|
|
57
|
+
authentication: [
|
|
58
|
+
'authentication', 'auth', 'login', 'credential',
|
|
59
|
+
'password', 'session', 'token', 'jwt',
|
|
60
|
+
'bearer', 'api key', 'secret', 'identity',
|
|
61
|
+
'sign in', 'sign-in', 'signin', 'logged in',
|
|
62
|
+
],
|
|
63
|
+
authorization: [
|
|
64
|
+
'authorization', 'access control', 'permission',
|
|
65
|
+
'privilege', 'role', 'rbac', 'acl',
|
|
66
|
+
'forbidden', 'denied', 'allowed', 'grant',
|
|
67
|
+
'elevated', 'escalation', 'bypass',
|
|
68
|
+
],
|
|
69
|
+
// Information Disclosure
|
|
70
|
+
information_disclosure: [
|
|
71
|
+
'information disclosure', 'data leak', 'data exposure',
|
|
72
|
+
'sensitive data', 'sensitive information', 'pii',
|
|
73
|
+
'personally identifiable', 'credit card', 'ssn',
|
|
74
|
+
'secret', 'private', 'confidential', 'expose',
|
|
75
|
+
'leak', 'disclose', 'reveal',
|
|
76
|
+
],
|
|
77
|
+
// Input Validation
|
|
78
|
+
input_validation: [
|
|
79
|
+
'input validation', 'validate input', 'sanitize',
|
|
80
|
+
'user input', 'user-controlled', 'user controlled',
|
|
81
|
+
'untrusted input', 'external input', 'tainted',
|
|
82
|
+
'whitelist', 'blacklist', 'filter', 'cleanse',
|
|
83
|
+
],
|
|
84
|
+
// Generic vulnerability terms
|
|
85
|
+
vulnerability: [
|
|
86
|
+
'vulnerability', 'vuln', 'flaw', 'weakness',
|
|
87
|
+
'security issue', 'security bug', 'security hole',
|
|
88
|
+
'exploit', 'exploitable', 'attack', 'malicious',
|
|
89
|
+
'threat', 'risk', 'unsafe', 'insecure',
|
|
90
|
+
],
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* Limitation/constraint synonyms.
|
|
94
|
+
*/
|
|
95
|
+
export const LIMITATION_SYNONYMS = {
|
|
96
|
+
// Size limits
|
|
97
|
+
size_limit: [
|
|
98
|
+
'size limit', 'file size', 'max size', 'maximum size',
|
|
99
|
+
'too large', 'exceeds', 'bytes', 'kb', 'mb', 'gb',
|
|
100
|
+
'kilobyte', 'megabyte', 'gigabyte', 'byte',
|
|
101
|
+
'upload limit', 'download limit',
|
|
102
|
+
],
|
|
103
|
+
// Rate limits
|
|
104
|
+
rate_limit: [
|
|
105
|
+
'rate limit', 'throttle', 'throttling', 'quota',
|
|
106
|
+
'requests per', 'per second', 'per minute', 'per hour',
|
|
107
|
+
'too many requests', '429', 'rate-limit', 'rate limiting',
|
|
108
|
+
'burst', 'capacity', 'allowance',
|
|
109
|
+
],
|
|
110
|
+
// Timeouts
|
|
111
|
+
timeout: [
|
|
112
|
+
'timeout', 'time out', 'timed out', 'time limit',
|
|
113
|
+
'deadline', 'expir', 'seconds', 'milliseconds', 'ms',
|
|
114
|
+
'connection timeout', 'read timeout', 'write timeout',
|
|
115
|
+
'execution time', 'max time', 'time exceeded',
|
|
116
|
+
],
|
|
117
|
+
// Format/encoding
|
|
118
|
+
format: [
|
|
119
|
+
'format', 'encoding', 'charset', 'content-type',
|
|
120
|
+
'mime', 'json', 'xml', 'csv', 'yaml',
|
|
121
|
+
'utf-8', 'utf8', 'ascii', 'binary',
|
|
122
|
+
'schema', 'structure', 'type',
|
|
123
|
+
],
|
|
124
|
+
};
|
|
125
|
+
/**
|
|
126
|
+
* Behavioral assertion synonyms.
|
|
127
|
+
*/
|
|
128
|
+
export const BEHAVIOR_SYNONYMS = {
|
|
129
|
+
// Error handling
|
|
130
|
+
error: [
|
|
131
|
+
'error', 'exception', 'throw', 'raise', 'fail',
|
|
132
|
+
'invalid', 'reject', 'deny', 'refuse',
|
|
133
|
+
'not found', 'missing', 'absent', 'null',
|
|
134
|
+
'undefined', 'empty', 'blank',
|
|
135
|
+
],
|
|
136
|
+
// Success
|
|
137
|
+
success: [
|
|
138
|
+
'success', 'succeed', 'return', 'result',
|
|
139
|
+
'complete', 'finish', 'done', 'ok',
|
|
140
|
+
'valid', 'accept', 'allow', 'permit',
|
|
141
|
+
'found', 'exist', 'present', 'create',
|
|
142
|
+
],
|
|
143
|
+
// Validation
|
|
144
|
+
validate: [
|
|
145
|
+
'validate', 'check', 'verify', 'ensure',
|
|
146
|
+
'confirm', 'assert', 'require', 'expect',
|
|
147
|
+
'must', 'should', 'need',
|
|
148
|
+
],
|
|
149
|
+
// Data handling
|
|
150
|
+
handle: [
|
|
151
|
+
'handle', 'process', 'parse', 'convert',
|
|
152
|
+
'transform', 'modify', 'change', 'update',
|
|
153
|
+
'read', 'write', 'save', 'load',
|
|
154
|
+
],
|
|
155
|
+
};
|
|
156
|
+
/**
|
|
157
|
+
* Build a reverse lookup map from any synonym to its canonical term.
|
|
158
|
+
*/
|
|
159
|
+
export function buildSynonymLookup(synonymMap) {
|
|
160
|
+
const lookup = new Map();
|
|
161
|
+
for (const [canonical, synonyms] of Object.entries(synonymMap)) {
|
|
162
|
+
// Map the canonical term to itself
|
|
163
|
+
lookup.set(canonical, canonical);
|
|
164
|
+
// Map all synonyms to the canonical term
|
|
165
|
+
for (const synonym of synonyms) {
|
|
166
|
+
// Normalize the synonym
|
|
167
|
+
const normalized = synonym.toLowerCase().replace(/[^a-z0-9]+/g, '_');
|
|
168
|
+
lookup.set(normalized, canonical);
|
|
169
|
+
// Also add without underscores for flexible matching
|
|
170
|
+
const noUnderscore = synonym.toLowerCase().replace(/[^a-z0-9]/g, '');
|
|
171
|
+
lookup.set(noUnderscore, canonical);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return lookup;
|
|
175
|
+
}
|
|
176
|
+
// Pre-built lookup maps
|
|
177
|
+
const securityLookup = buildSynonymLookup(SECURITY_SYNONYMS);
|
|
178
|
+
const limitationLookup = buildSynonymLookup(LIMITATION_SYNONYMS);
|
|
179
|
+
const behaviorLookup = buildSynonymLookup(BEHAVIOR_SYNONYMS);
|
|
180
|
+
/**
|
|
181
|
+
* Expand a text by adding canonical terms for any synonyms found.
|
|
182
|
+
* This improves keyword overlap for paraphrases.
|
|
183
|
+
*/
|
|
184
|
+
export function expandWithSynonyms(text, type = 'security') {
|
|
185
|
+
const lookup = type === 'security' ? securityLookup
|
|
186
|
+
: type === 'limitation' ? limitationLookup
|
|
187
|
+
: behaviorLookup;
|
|
188
|
+
const words = text.toLowerCase().split(/\s+/);
|
|
189
|
+
const expanded = [...words];
|
|
190
|
+
// Check individual words
|
|
191
|
+
for (const word of words) {
|
|
192
|
+
const normalized = word.replace(/[^a-z0-9]/g, '');
|
|
193
|
+
const canonical = lookup.get(normalized);
|
|
194
|
+
if (canonical && !expanded.includes(canonical)) {
|
|
195
|
+
expanded.push(canonical);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// Check 2-word phrases
|
|
199
|
+
for (let i = 0; i < words.length - 1; i++) {
|
|
200
|
+
const phrase = words[i] + '_' + words[i + 1];
|
|
201
|
+
const phraseCleaned = phrase.replace(/[^a-z0-9_]/g, '');
|
|
202
|
+
const canonical = lookup.get(phraseCleaned);
|
|
203
|
+
if (canonical && !expanded.includes(canonical)) {
|
|
204
|
+
expanded.push(canonical);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
// Check 3-word phrases
|
|
208
|
+
for (let i = 0; i < words.length - 2; i++) {
|
|
209
|
+
const phrase = words[i] + '_' + words[i + 1] + '_' + words[i + 2];
|
|
210
|
+
const phraseCleaned = phrase.replace(/[^a-z0-9_]/g, '');
|
|
211
|
+
const canonical = lookup.get(phraseCleaned);
|
|
212
|
+
if (canonical && !expanded.includes(canonical)) {
|
|
213
|
+
expanded.push(canonical);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return expanded.join(' ');
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Generic terms that are too broad to use for similarity matching.
|
|
220
|
+
* These terms are common across many vulnerability types and would cause false matches.
|
|
221
|
+
*/
|
|
222
|
+
const GENERIC_SECURITY_TERMS = new Set([
|
|
223
|
+
'vulnerability', // Too broad - appears in all security findings
|
|
224
|
+
'authentication', // Too broad - auth bypass vs missing auth are different
|
|
225
|
+
'authorization', // Too broad - authz flaw vs missing authz are different
|
|
226
|
+
'input_validation', // Too broad - many issues involve input
|
|
227
|
+
]);
|
|
228
|
+
/**
|
|
229
|
+
* Check if two texts share a canonical security term.
|
|
230
|
+
* Returns the matching term(s) or empty array if no match.
|
|
231
|
+
*
|
|
232
|
+
* NOTE: Generic terms like "vulnerability" are excluded since they would
|
|
233
|
+
* cause false matches between completely different vulnerability types.
|
|
234
|
+
*/
|
|
235
|
+
export function findSharedSecurityTerms(text1, text2) {
|
|
236
|
+
const terms1 = new Set();
|
|
237
|
+
const terms2 = new Set();
|
|
238
|
+
const words1 = text1.toLowerCase().split(/\s+/);
|
|
239
|
+
const words2 = text2.toLowerCase().split(/\s+/);
|
|
240
|
+
// Extract canonical terms from text1 (excluding generic terms)
|
|
241
|
+
for (const word of words1) {
|
|
242
|
+
const normalized = word.replace(/[^a-z0-9]/g, '');
|
|
243
|
+
const canonical = securityLookup.get(normalized);
|
|
244
|
+
if (canonical && !GENERIC_SECURITY_TERMS.has(canonical)) {
|
|
245
|
+
terms1.add(canonical);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
// Check phrases in text1
|
|
249
|
+
for (let i = 0; i < words1.length - 1; i++) {
|
|
250
|
+
const phrase = (words1[i] + '_' + words1[i + 1]).replace(/[^a-z0-9_]/g, '');
|
|
251
|
+
const canonical = securityLookup.get(phrase);
|
|
252
|
+
if (canonical && !GENERIC_SECURITY_TERMS.has(canonical)) {
|
|
253
|
+
terms1.add(canonical);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
// Extract canonical terms from text2 (excluding generic terms)
|
|
257
|
+
for (const word of words2) {
|
|
258
|
+
const normalized = word.replace(/[^a-z0-9]/g, '');
|
|
259
|
+
const canonical = securityLookup.get(normalized);
|
|
260
|
+
if (canonical && !GENERIC_SECURITY_TERMS.has(canonical)) {
|
|
261
|
+
terms2.add(canonical);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
// Check phrases in text2
|
|
265
|
+
for (let i = 0; i < words2.length - 1; i++) {
|
|
266
|
+
const phrase = (words2[i] + '_' + words2[i + 1]).replace(/[^a-z0-9_]/g, '');
|
|
267
|
+
const canonical = securityLookup.get(phrase);
|
|
268
|
+
if (canonical && !GENERIC_SECURITY_TERMS.has(canonical)) {
|
|
269
|
+
terms2.add(canonical);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
// Find intersection
|
|
273
|
+
const shared = [];
|
|
274
|
+
for (const term of terms1) {
|
|
275
|
+
if (terms2.has(term)) {
|
|
276
|
+
shared.push(term);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
return shared;
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Calculate semantic similarity boost from synonyms.
|
|
283
|
+
* Returns 0-100 indicating how much two texts share canonical terms.
|
|
284
|
+
*/
|
|
285
|
+
export function calculateSynonymSimilarity(text1, text2, type = 'security') {
|
|
286
|
+
const expanded1 = expandWithSynonyms(text1, type);
|
|
287
|
+
const expanded2 = expandWithSynonyms(text2, type);
|
|
288
|
+
// Extract canonical terms only
|
|
289
|
+
const lookup = type === 'security' ? securityLookup
|
|
290
|
+
: type === 'limitation' ? limitationLookup
|
|
291
|
+
: behaviorLookup;
|
|
292
|
+
const canonicalSet = new Set(lookup.values());
|
|
293
|
+
const terms1 = new Set(expanded1.split(/\s+/).filter(w => canonicalSet.has(w)));
|
|
294
|
+
const terms2 = new Set(expanded2.split(/\s+/).filter(w => canonicalSet.has(w)));
|
|
295
|
+
if (terms1.size === 0 && terms2.size === 0) {
|
|
296
|
+
return 0;
|
|
297
|
+
}
|
|
298
|
+
// Calculate Jaccard-like similarity
|
|
299
|
+
let intersection = 0;
|
|
300
|
+
for (const term of terms1) {
|
|
301
|
+
if (terms2.has(term)) {
|
|
302
|
+
intersection++;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
const union = new Set([...terms1, ...terms2]).size;
|
|
306
|
+
if (union === 0)
|
|
307
|
+
return 0;
|
|
308
|
+
return Math.round((intersection / union) * 100);
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Time unit normalization for comparing timeouts.
|
|
312
|
+
* Converts all time expressions to milliseconds.
|
|
313
|
+
*/
|
|
314
|
+
export function normalizeTimeToMs(text) {
|
|
315
|
+
const patterns = [
|
|
316
|
+
// Milliseconds
|
|
317
|
+
{ regex: /(\d+(?:\.\d+)?)\s*(?:ms|milliseconds?)/i, multiplier: 1 },
|
|
318
|
+
// Seconds
|
|
319
|
+
{ regex: /(\d+(?:\.\d+)?)\s*(?:s|sec|seconds?)/i, multiplier: 1000 },
|
|
320
|
+
// Minutes
|
|
321
|
+
{ regex: /(\d+(?:\.\d+)?)\s*(?:m|min|minutes?)/i, multiplier: 60000 },
|
|
322
|
+
// Hours
|
|
323
|
+
{ regex: /(\d+(?:\.\d+)?)\s*(?:h|hr|hours?)/i, multiplier: 3600000 },
|
|
324
|
+
];
|
|
325
|
+
for (const { regex, multiplier } of patterns) {
|
|
326
|
+
const match = text.match(regex);
|
|
327
|
+
if (match) {
|
|
328
|
+
return parseFloat(match[1]) * multiplier;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
return null;
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Check if two time expressions are equivalent.
|
|
335
|
+
*/
|
|
336
|
+
export function timeExpressionsEqual(text1, text2) {
|
|
337
|
+
const ms1 = normalizeTimeToMs(text1);
|
|
338
|
+
const ms2 = normalizeTimeToMs(text2);
|
|
339
|
+
if (ms1 === null || ms2 === null) {
|
|
340
|
+
return false;
|
|
341
|
+
}
|
|
342
|
+
// Allow 1% tolerance for floating point
|
|
343
|
+
const ratio = ms1 / ms2;
|
|
344
|
+
return ratio >= MATH_FACTORS.RATIO_TOLERANCE_MIN && ratio <= MATH_FACTORS.RATIO_TOLERANCE_MAX;
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Abbreviation expansions for common security terms.
|
|
348
|
+
*/
|
|
349
|
+
export const ABBREVIATIONS = {
|
|
350
|
+
sqli: 'sql injection',
|
|
351
|
+
xss: 'cross-site scripting',
|
|
352
|
+
ssrf: 'server-side request forgery',
|
|
353
|
+
csrf: 'cross-site request forgery',
|
|
354
|
+
lfi: 'local file inclusion',
|
|
355
|
+
rfi: 'remote file inclusion',
|
|
356
|
+
rce: 'remote code execution',
|
|
357
|
+
idor: 'insecure direct object reference',
|
|
358
|
+
xxe: 'xml external entity',
|
|
359
|
+
jwt: 'json web token',
|
|
360
|
+
api: 'application programming interface',
|
|
361
|
+
dos: 'denial of service',
|
|
362
|
+
ddos: 'distributed denial of service',
|
|
363
|
+
mitm: 'man in the middle',
|
|
364
|
+
tls: 'transport layer security',
|
|
365
|
+
ssl: 'secure sockets layer',
|
|
366
|
+
pii: 'personally identifiable information',
|
|
367
|
+
rbac: 'role-based access control',
|
|
368
|
+
acl: 'access control list',
|
|
369
|
+
otp: 'one-time password',
|
|
370
|
+
mfa: 'multi-factor authentication',
|
|
371
|
+
};
|
|
372
|
+
/**
|
|
373
|
+
* Expand abbreviations in text.
|
|
374
|
+
*/
|
|
375
|
+
export function expandAbbreviations(text) {
|
|
376
|
+
let expanded = text.toLowerCase();
|
|
377
|
+
for (const [abbrev, full] of Object.entries(ABBREVIATIONS)) {
|
|
378
|
+
// Match abbreviation as whole word
|
|
379
|
+
const regex = new RegExp(`\\b${abbrev}\\b`, 'gi');
|
|
380
|
+
if (regex.test(expanded)) {
|
|
381
|
+
expanded = expanded + ' ' + full;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
return expanded;
|
|
385
|
+
}
|
|
386
|
+
//# sourceMappingURL=synonyms.js.map
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telemetry and Decision Logging for Drift Detection
|
|
3
|
+
*
|
|
4
|
+
* Records comparison decisions for post-hoc analysis and algorithm improvement.
|
|
5
|
+
* Decisions are logged locally and can be exported for feedback or A/B testing.
|
|
6
|
+
*/
|
|
7
|
+
import type { ConfidenceFactor } from './types.js';
|
|
8
|
+
import type { SecurityCategory, LimitationCategory } from './semantic.js';
|
|
9
|
+
/**
|
|
10
|
+
* Category match extracted from text during comparison.
|
|
11
|
+
*/
|
|
12
|
+
export interface CategoryMatch {
|
|
13
|
+
category: SecurityCategory | LimitationCategory | string;
|
|
14
|
+
confidence: number;
|
|
15
|
+
matchedKeywords: string[];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* A recorded comparison decision.
|
|
19
|
+
*/
|
|
20
|
+
export interface ComparisonDecision {
|
|
21
|
+
/** Unique ID for this decision */
|
|
22
|
+
id: string;
|
|
23
|
+
/** When the decision was made */
|
|
24
|
+
timestamp: Date;
|
|
25
|
+
/** Type of comparison */
|
|
26
|
+
type: 'security' | 'limitation' | 'assertion';
|
|
27
|
+
/** First text being compared */
|
|
28
|
+
text1: string;
|
|
29
|
+
/** Second text being compared */
|
|
30
|
+
text2: string;
|
|
31
|
+
/** Categories extracted from text1 */
|
|
32
|
+
categories1: CategoryMatch[];
|
|
33
|
+
/** Categories extracted from text2 */
|
|
34
|
+
categories2: CategoryMatch[];
|
|
35
|
+
/** Keyword overlap score (0-100) */
|
|
36
|
+
keywordOverlap: number;
|
|
37
|
+
/** The match decision made */
|
|
38
|
+
matchDecision: boolean;
|
|
39
|
+
/** Raw confidence score before calibration */
|
|
40
|
+
rawConfidence: number;
|
|
41
|
+
/** Calibrated confidence score */
|
|
42
|
+
calibratedConfidence: number;
|
|
43
|
+
/** Individual confidence factors */
|
|
44
|
+
factors: ConfidenceFactor[];
|
|
45
|
+
/** Tool name context */
|
|
46
|
+
toolName: string;
|
|
47
|
+
/** Server command being interviewed */
|
|
48
|
+
serverCommand?: string;
|
|
49
|
+
/** Bellwether version */
|
|
50
|
+
bellwetherVersion: string;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* User feedback on a comparison decision.
|
|
54
|
+
*/
|
|
55
|
+
export interface FeedbackReport {
|
|
56
|
+
/** ID of the decision being reported */
|
|
57
|
+
decisionId: string;
|
|
58
|
+
/** Type of feedback */
|
|
59
|
+
feedbackType: 'false_positive' | 'false_negative' | 'confidence_wrong';
|
|
60
|
+
/** Optional user comment explaining the issue */
|
|
61
|
+
userComment?: string;
|
|
62
|
+
/** What the correct answer should have been */
|
|
63
|
+
correctAnswer?: boolean;
|
|
64
|
+
/** When feedback was submitted */
|
|
65
|
+
timestamp: Date;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Analysis of aggregated feedback.
|
|
69
|
+
*/
|
|
70
|
+
export interface FeedbackAnalysis {
|
|
71
|
+
totalReports: number;
|
|
72
|
+
falsePositiveRate: number;
|
|
73
|
+
falseNegativeRate: number;
|
|
74
|
+
confidenceIssueRate: number;
|
|
75
|
+
commonPatterns: Array<{
|
|
76
|
+
pattern: string;
|
|
77
|
+
count: number;
|
|
78
|
+
feedbackType: string;
|
|
79
|
+
}>;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Decision logger for recording and analyzing comparison decisions.
|
|
83
|
+
*/
|
|
84
|
+
export declare class DecisionLogger {
|
|
85
|
+
private decisions;
|
|
86
|
+
private logPath;
|
|
87
|
+
private enabled;
|
|
88
|
+
constructor(options?: {
|
|
89
|
+
enabled?: boolean;
|
|
90
|
+
logPath?: string;
|
|
91
|
+
});
|
|
92
|
+
/**
|
|
93
|
+
* Log a comparison decision.
|
|
94
|
+
*/
|
|
95
|
+
log(decision: Omit<ComparisonDecision, 'id' | 'timestamp' | 'bellwetherVersion'>): string;
|
|
96
|
+
/**
|
|
97
|
+
* Get all logged decisions from this session.
|
|
98
|
+
*/
|
|
99
|
+
getSessionDecisions(): ComparisonDecision[];
|
|
100
|
+
/**
|
|
101
|
+
* Load all decisions from the log file.
|
|
102
|
+
*/
|
|
103
|
+
loadAllDecisions(): ComparisonDecision[];
|
|
104
|
+
/**
|
|
105
|
+
* Get a specific decision by ID.
|
|
106
|
+
*/
|
|
107
|
+
getDecision(id: string): ComparisonDecision | undefined;
|
|
108
|
+
/**
|
|
109
|
+
* Export decisions to a JSON file.
|
|
110
|
+
*/
|
|
111
|
+
exportToFile(filePath: string): void;
|
|
112
|
+
/**
|
|
113
|
+
* Get statistics about logged decisions.
|
|
114
|
+
*/
|
|
115
|
+
getStatistics(): {
|
|
116
|
+
totalDecisions: number;
|
|
117
|
+
byType: Record<string, number>;
|
|
118
|
+
averageConfidence: number;
|
|
119
|
+
matchRate: number;
|
|
120
|
+
};
|
|
121
|
+
/**
|
|
122
|
+
* Clear all logged decisions.
|
|
123
|
+
*/
|
|
124
|
+
clear(): void;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Feedback manager for recording and analyzing user feedback.
|
|
128
|
+
*/
|
|
129
|
+
export declare class FeedbackManager {
|
|
130
|
+
private feedbackPath;
|
|
131
|
+
constructor(options?: {
|
|
132
|
+
feedbackPath?: string;
|
|
133
|
+
});
|
|
134
|
+
/**
|
|
135
|
+
* Submit feedback on a comparison decision.
|
|
136
|
+
*/
|
|
137
|
+
submit(feedback: Omit<FeedbackReport, 'timestamp'>): void;
|
|
138
|
+
/**
|
|
139
|
+
* Load all feedback reports.
|
|
140
|
+
*/
|
|
141
|
+
loadAll(): FeedbackReport[];
|
|
142
|
+
/**
|
|
143
|
+
* Analyze all feedback to identify patterns.
|
|
144
|
+
*/
|
|
145
|
+
analyze(): FeedbackAnalysis;
|
|
146
|
+
/**
|
|
147
|
+
* Clear all feedback.
|
|
148
|
+
*/
|
|
149
|
+
clear(): void;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Get the global decision logger instance.
|
|
153
|
+
*/
|
|
154
|
+
export declare function getDecisionLogger(options?: {
|
|
155
|
+
enabled?: boolean;
|
|
156
|
+
}): DecisionLogger;
|
|
157
|
+
/**
|
|
158
|
+
* Get the global feedback manager instance.
|
|
159
|
+
*/
|
|
160
|
+
export declare function getFeedbackManager(): FeedbackManager;
|
|
161
|
+
/**
|
|
162
|
+
* Reset global instances (for testing).
|
|
163
|
+
*/
|
|
164
|
+
export declare function resetTelemetry(): void;
|
|
165
|
+
//# sourceMappingURL=telemetry.d.ts.map
|