@opencodereview/core 1.9.1
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/dist/ai/anthropic-provider.d.ts +41 -0
- package/dist/ai/anthropic-provider.d.ts.map +1 -0
- package/dist/ai/anthropic-provider.js +139 -0
- package/dist/ai/anthropic-provider.js.map +1 -0
- package/dist/ai/index.d.ts +39 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +41 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/ollama-provider.d.ts +46 -0
- package/dist/ai/ollama-provider.d.ts.map +1 -0
- package/dist/ai/ollama-provider.js +149 -0
- package/dist/ai/ollama-provider.js.map +1 -0
- package/dist/ai/openai-provider.d.ts +44 -0
- package/dist/ai/openai-provider.d.ts.map +1 -0
- package/dist/ai/openai-provider.js +137 -0
- package/dist/ai/openai-provider.js.map +1 -0
- package/dist/ai/orchestrator.d.ts +60 -0
- package/dist/ai/orchestrator.d.ts.map +1 -0
- package/dist/ai/orchestrator.js +188 -0
- package/dist/ai/orchestrator.js.map +1 -0
- package/dist/ai/prompts.d.ts +27 -0
- package/dist/ai/prompts.d.ts.map +1 -0
- package/dist/ai/prompts.js +112 -0
- package/dist/ai/prompts.js.map +1 -0
- package/dist/ai/types.d.ts +75 -0
- package/dist/ai/types.d.ts.map +1 -0
- package/dist/ai/types.js +10 -0
- package/dist/ai/types.js.map +1 -0
- package/dist/ai/v4/embedding/index.d.ts +10 -0
- package/dist/ai/v4/embedding/index.d.ts.map +1 -0
- package/dist/ai/v4/embedding/index.js +10 -0
- package/dist/ai/v4/embedding/index.js.map +1 -0
- package/dist/ai/v4/embedding/local.d.ts +68 -0
- package/dist/ai/v4/embedding/local.d.ts.map +1 -0
- package/dist/ai/v4/embedding/local.js +167 -0
- package/dist/ai/v4/embedding/local.js.map +1 -0
- package/dist/ai/v4/embedding/ollama.d.ts +58 -0
- package/dist/ai/v4/embedding/ollama.d.ts.map +1 -0
- package/dist/ai/v4/embedding/ollama.js +101 -0
- package/dist/ai/v4/embedding/ollama.js.map +1 -0
- package/dist/ai/v4/embedding/openai.d.ts +36 -0
- package/dist/ai/v4/embedding/openai.d.ts.map +1 -0
- package/dist/ai/v4/embedding/openai.js +76 -0
- package/dist/ai/v4/embedding/openai.js.map +1 -0
- package/dist/ai/v4/embedding/similarity.d.ts +36 -0
- package/dist/ai/v4/embedding/similarity.d.ts.map +1 -0
- package/dist/ai/v4/embedding/similarity.js +60 -0
- package/dist/ai/v4/embedding/similarity.js.map +1 -0
- package/dist/ai/v4/index.d.ts +51 -0
- package/dist/ai/v4/index.d.ts.map +1 -0
- package/dist/ai/v4/index.js +54 -0
- package/dist/ai/v4/index.js.map +1 -0
- package/dist/ai/v4/llm/anthropic.d.ts +38 -0
- package/dist/ai/v4/llm/anthropic.d.ts.map +1 -0
- package/dist/ai/v4/llm/anthropic.js +86 -0
- package/dist/ai/v4/llm/anthropic.js.map +1 -0
- package/dist/ai/v4/llm/index.d.ts +9 -0
- package/dist/ai/v4/llm/index.d.ts.map +1 -0
- package/dist/ai/v4/llm/index.js +9 -0
- package/dist/ai/v4/llm/index.js.map +1 -0
- package/dist/ai/v4/llm/ollama.d.ts +39 -0
- package/dist/ai/v4/llm/ollama.d.ts.map +1 -0
- package/dist/ai/v4/llm/ollama.js +95 -0
- package/dist/ai/v4/llm/ollama.js.map +1 -0
- package/dist/ai/v4/llm/openai.d.ts +38 -0
- package/dist/ai/v4/llm/openai.d.ts.map +1 -0
- package/dist/ai/v4/llm/openai.js +88 -0
- package/dist/ai/v4/llm/openai.js.map +1 -0
- package/dist/ai/v4/patterns/defect-patterns.d.ts +57 -0
- package/dist/ai/v4/patterns/defect-patterns.d.ts.map +1 -0
- package/dist/ai/v4/patterns/defect-patterns.js +331 -0
- package/dist/ai/v4/patterns/defect-patterns.js.map +1 -0
- package/dist/ai/v4/patterns/index.d.ts +8 -0
- package/dist/ai/v4/patterns/index.d.ts.map +1 -0
- package/dist/ai/v4/patterns/index.js +7 -0
- package/dist/ai/v4/patterns/index.js.map +1 -0
- package/dist/ai/v4/pipeline.d.ts +74 -0
- package/dist/ai/v4/pipeline.d.ts.map +1 -0
- package/dist/ai/v4/pipeline.js +381 -0
- package/dist/ai/v4/pipeline.js.map +1 -0
- package/dist/ai/v4/sla.d.ts +62 -0
- package/dist/ai/v4/sla.d.ts.map +1 -0
- package/dist/ai/v4/sla.js +136 -0
- package/dist/ai/v4/sla.js.map +1 -0
- package/dist/ai/v4/types.d.ts +117 -0
- package/dist/ai/v4/types.d.ts.map +1 -0
- package/dist/ai/v4/types.js +16 -0
- package/dist/ai/v4/types.js.map +1 -0
- package/dist/ai-healer/prompt-builder.d.ts +33 -0
- package/dist/ai-healer/prompt-builder.d.ts.map +1 -0
- package/dist/ai-healer/prompt-builder.js +89 -0
- package/dist/ai-healer/prompt-builder.js.map +1 -0
- package/dist/config/defaults.d.ts +14 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +57 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +8 -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 +33 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +245 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/types.d.ts +58 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +7 -0
- package/dist/config/types.js.map +1 -0
- package/dist/config/v4-config.d.ts +77 -0
- package/dist/config/v4-config.d.ts.map +1 -0
- package/dist/config/v4-config.js +336 -0
- package/dist/config/v4-config.js.map +1 -0
- package/dist/detectors/ai-detector.d.ts +38 -0
- package/dist/detectors/ai-detector.d.ts.map +1 -0
- package/dist/detectors/ai-detector.js +62 -0
- package/dist/detectors/ai-detector.js.map +1 -0
- package/dist/detectors/context-break.d.ts +57 -0
- package/dist/detectors/context-break.d.ts.map +1 -0
- package/dist/detectors/context-break.js +199 -0
- package/dist/detectors/context-break.js.map +1 -0
- package/dist/detectors/deep-hallucination.d.ts +42 -0
- package/dist/detectors/deep-hallucination.d.ts.map +1 -0
- package/dist/detectors/deep-hallucination.js +297 -0
- package/dist/detectors/deep-hallucination.js.map +1 -0
- package/dist/detectors/duplication.d.ts +61 -0
- package/dist/detectors/duplication.d.ts.map +1 -0
- package/dist/detectors/duplication.js +204 -0
- package/dist/detectors/duplication.js.map +1 -0
- package/dist/detectors/hallucination.d.ts +80 -0
- package/dist/detectors/hallucination.d.ts.map +1 -0
- package/dist/detectors/hallucination.js +350 -0
- package/dist/detectors/hallucination.js.map +1 -0
- package/dist/detectors/index.d.ts +35 -0
- package/dist/detectors/index.d.ts.map +1 -0
- package/dist/detectors/index.js +33 -0
- package/dist/detectors/index.js.map +1 -0
- package/dist/detectors/logic-gap.d.ts +58 -0
- package/dist/detectors/logic-gap.d.ts.map +1 -0
- package/dist/detectors/logic-gap.js +284 -0
- package/dist/detectors/logic-gap.js.map +1 -0
- package/dist/detectors/over-engineering.d.ts +44 -0
- package/dist/detectors/over-engineering.d.ts.map +1 -0
- package/dist/detectors/over-engineering.js +257 -0
- package/dist/detectors/over-engineering.js.map +1 -0
- package/dist/detectors/security-pattern.d.ts +43 -0
- package/dist/detectors/security-pattern.d.ts.map +1 -0
- package/dist/detectors/security-pattern.js +235 -0
- package/dist/detectors/security-pattern.js.map +1 -0
- package/dist/detectors/stale-api.d.ts +44 -0
- package/dist/detectors/stale-api.d.ts.map +1 -0
- package/dist/detectors/stale-api.js +160 -0
- package/dist/detectors/stale-api.js.map +1 -0
- package/dist/detectors/type-safety.d.ts +41 -0
- package/dist/detectors/type-safety.d.ts.map +1 -0
- package/dist/detectors/type-safety.js +306 -0
- package/dist/detectors/type-safety.js.map +1 -0
- package/dist/detectors/v4/context-coherence.d.ts +67 -0
- package/dist/detectors/v4/context-coherence.d.ts.map +1 -0
- package/dist/detectors/v4/context-coherence.js +319 -0
- package/dist/detectors/v4/context-coherence.js.map +1 -0
- package/dist/detectors/v4/hallucinated-import.d.ts +52 -0
- package/dist/detectors/v4/hallucinated-import.d.ts.map +1 -0
- package/dist/detectors/v4/hallucinated-import.js +206 -0
- package/dist/detectors/v4/hallucinated-import.js.map +1 -0
- package/dist/detectors/v4/index.d.ts +28 -0
- package/dist/detectors/v4/index.d.ts.map +1 -0
- package/dist/detectors/v4/index.js +40 -0
- package/dist/detectors/v4/index.js.map +1 -0
- package/dist/detectors/v4/over-engineering.d.ts +69 -0
- package/dist/detectors/v4/over-engineering.d.ts.map +1 -0
- package/dist/detectors/v4/over-engineering.js +234 -0
- package/dist/detectors/v4/over-engineering.js.map +1 -0
- package/dist/detectors/v4/security-pattern.d.ts +46 -0
- package/dist/detectors/v4/security-pattern.d.ts.map +1 -0
- package/dist/detectors/v4/security-pattern.js +233 -0
- package/dist/detectors/v4/security-pattern.js.map +1 -0
- package/dist/detectors/v4/stale-api.d.ts +59 -0
- package/dist/detectors/v4/stale-api.d.ts.map +1 -0
- package/dist/detectors/v4/stale-api.js +470 -0
- package/dist/detectors/v4/stale-api.js.map +1 -0
- package/dist/detectors/v4/types.d.ts +74 -0
- package/dist/detectors/v4/types.d.ts.map +1 -0
- package/dist/detectors/v4/types.js +10 -0
- package/dist/detectors/v4/types.js.map +1 -0
- package/dist/diff/filter.d.ts +35 -0
- package/dist/diff/filter.d.ts.map +1 -0
- package/dist/diff/filter.js +65 -0
- package/dist/diff/filter.js.map +1 -0
- package/dist/diff/index.d.ts +9 -0
- package/dist/diff/index.d.ts.map +1 -0
- package/dist/diff/index.js +8 -0
- package/dist/diff/index.js.map +1 -0
- package/dist/diff/parser.d.ts +61 -0
- package/dist/diff/parser.d.ts.map +1 -0
- package/dist/diff/parser.js +203 -0
- package/dist/diff/parser.js.map +1 -0
- package/dist/i18n/en.d.ts +18 -0
- package/dist/i18n/en.d.ts.map +1 -0
- package/dist/i18n/en.js +83 -0
- package/dist/i18n/en.js.map +1 -0
- package/dist/i18n/index.d.ts +13 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +14 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/provider.d.ts +54 -0
- package/dist/i18n/provider.d.ts.map +1 -0
- package/dist/i18n/provider.js +88 -0
- package/dist/i18n/provider.js.map +1 -0
- package/dist/i18n/types.d.ts +37 -0
- package/dist/i18n/types.d.ts.map +1 -0
- package/dist/i18n/types.js +10 -0
- package/dist/i18n/types.js.map +1 -0
- package/dist/i18n/zh.d.ts +14 -0
- package/dist/i18n/zh.d.ts.map +1 -0
- package/dist/i18n/zh.js +83 -0
- package/dist/i18n/zh.js.map +1 -0
- package/dist/index.d.ts +113 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +106 -0
- package/dist/index.js.map +1 -0
- package/dist/ir/index.d.ts +10 -0
- package/dist/ir/index.d.ts.map +1 -0
- package/dist/ir/index.js +9 -0
- package/dist/ir/index.js.map +1 -0
- package/dist/ir/types.d.ts +126 -0
- package/dist/ir/types.d.ts.map +1 -0
- package/dist/ir/types.js +33 -0
- package/dist/ir/types.js.map +1 -0
- package/dist/languages/go/index.d.ts +7 -0
- package/dist/languages/go/index.d.ts.map +1 -0
- package/dist/languages/go/index.js +7 -0
- package/dist/languages/go/index.js.map +1 -0
- package/dist/languages/go/parser.d.ts +89 -0
- package/dist/languages/go/parser.d.ts.map +1 -0
- package/dist/languages/go/parser.js +509 -0
- package/dist/languages/go/parser.js.map +1 -0
- package/dist/languages/index.d.ts +13 -0
- package/dist/languages/index.d.ts.map +1 -0
- package/dist/languages/index.js +14 -0
- package/dist/languages/index.js.map +1 -0
- package/dist/languages/java/index.d.ts +7 -0
- package/dist/languages/java/index.d.ts.map +1 -0
- package/dist/languages/java/index.js +7 -0
- package/dist/languages/java/index.js.map +1 -0
- package/dist/languages/java/parser.d.ts +82 -0
- package/dist/languages/java/parser.d.ts.map +1 -0
- package/dist/languages/java/parser.js +492 -0
- package/dist/languages/java/parser.js.map +1 -0
- package/dist/languages/kotlin/index.d.ts +7 -0
- package/dist/languages/kotlin/index.d.ts.map +1 -0
- package/dist/languages/kotlin/index.js +7 -0
- package/dist/languages/kotlin/index.js.map +1 -0
- package/dist/languages/kotlin/parser.d.ts +84 -0
- package/dist/languages/kotlin/parser.d.ts.map +1 -0
- package/dist/languages/kotlin/parser.js +507 -0
- package/dist/languages/kotlin/parser.js.map +1 -0
- package/dist/languages/python/index.d.ts +7 -0
- package/dist/languages/python/index.d.ts.map +1 -0
- package/dist/languages/python/index.js +7 -0
- package/dist/languages/python/index.js.map +1 -0
- package/dist/languages/python/parser.d.ts +91 -0
- package/dist/languages/python/parser.d.ts.map +1 -0
- package/dist/languages/python/parser.js +375 -0
- package/dist/languages/python/parser.js.map +1 -0
- package/dist/languages/registry.d.ts +81 -0
- package/dist/languages/registry.d.ts.map +1 -0
- package/dist/languages/registry.js +150 -0
- package/dist/languages/registry.js.map +1 -0
- package/dist/languages/types.d.ts +137 -0
- package/dist/languages/types.d.ts.map +1 -0
- package/dist/languages/types.js +10 -0
- package/dist/languages/types.js.map +1 -0
- package/dist/languages/typescript/index.d.ts +7 -0
- package/dist/languages/typescript/index.d.ts.map +1 -0
- package/dist/languages/typescript/index.js +7 -0
- package/dist/languages/typescript/index.js.map +1 -0
- package/dist/languages/typescript/parser.d.ts +51 -0
- package/dist/languages/typescript/parser.d.ts.map +1 -0
- package/dist/languages/typescript/parser.js +286 -0
- package/dist/languages/typescript/parser.js.map +1 -0
- package/dist/license/generator.d.ts +43 -0
- package/dist/license/generator.d.ts.map +1 -0
- package/dist/license/generator.js +72 -0
- package/dist/license/generator.js.map +1 -0
- package/dist/license/index.d.ts +11 -0
- package/dist/license/index.d.ts.map +1 -0
- package/dist/license/index.js +12 -0
- package/dist/license/index.js.map +1 -0
- package/dist/license/types.d.ts +85 -0
- package/dist/license/types.d.ts.map +1 -0
- package/dist/license/types.js +10 -0
- package/dist/license/types.js.map +1 -0
- package/dist/license/validator.d.ts +77 -0
- package/dist/license/validator.d.ts.map +1 -0
- package/dist/license/validator.js +275 -0
- package/dist/license/validator.js.map +1 -0
- package/dist/parser/extractor.d.ts +31 -0
- package/dist/parser/extractor.d.ts.map +1 -0
- package/dist/parser/extractor.js +10 -0
- package/dist/parser/extractor.js.map +1 -0
- package/dist/parser/extractors/go.d.ts +21 -0
- package/dist/parser/extractors/go.d.ts.map +1 -0
- package/dist/parser/extractors/go.js +569 -0
- package/dist/parser/extractors/go.js.map +1 -0
- package/dist/parser/extractors/index.d.ts +13 -0
- package/dist/parser/extractors/index.d.ts.map +1 -0
- package/dist/parser/extractors/index.js +13 -0
- package/dist/parser/extractors/index.js.map +1 -0
- package/dist/parser/extractors/java.d.ts +24 -0
- package/dist/parser/extractors/java.d.ts.map +1 -0
- package/dist/parser/extractors/java.js +611 -0
- package/dist/parser/extractors/java.js.map +1 -0
- package/dist/parser/extractors/kotlin.d.ts +25 -0
- package/dist/parser/extractors/kotlin.d.ts.map +1 -0
- package/dist/parser/extractors/kotlin.js +665 -0
- package/dist/parser/extractors/kotlin.js.map +1 -0
- package/dist/parser/extractors/python.d.ts +21 -0
- package/dist/parser/extractors/python.d.ts.map +1 -0
- package/dist/parser/extractors/python.js +514 -0
- package/dist/parser/extractors/python.js.map +1 -0
- package/dist/parser/extractors/typescript.d.ts +23 -0
- package/dist/parser/extractors/typescript.d.ts.map +1 -0
- package/dist/parser/extractors/typescript.js +664 -0
- package/dist/parser/extractors/typescript.js.map +1 -0
- package/dist/parser/index.d.ts +15 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +14 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/manager.d.ts +50 -0
- package/dist/parser/manager.d.ts.map +1 -0
- package/dist/parser/manager.js +159 -0
- package/dist/parser/manager.js.map +1 -0
- package/dist/registry/builtins/go-builtins.d.ts +13 -0
- package/dist/registry/builtins/go-builtins.d.ts.map +1 -0
- package/dist/registry/builtins/go-builtins.js +63 -0
- package/dist/registry/builtins/go-builtins.js.map +1 -0
- package/dist/registry/builtins/java-builtins.d.ts +10 -0
- package/dist/registry/builtins/java-builtins.d.ts.map +1 -0
- package/dist/registry/builtins/java-builtins.js +59 -0
- package/dist/registry/builtins/java-builtins.js.map +1 -0
- package/dist/registry/builtins/kotlin-builtins.d.ts +10 -0
- package/dist/registry/builtins/kotlin-builtins.d.ts.map +1 -0
- package/dist/registry/builtins/kotlin-builtins.js +38 -0
- package/dist/registry/builtins/kotlin-builtins.js.map +1 -0
- package/dist/registry/builtins/node-builtins.d.ts +10 -0
- package/dist/registry/builtins/node-builtins.d.ts.map +1 -0
- package/dist/registry/builtins/node-builtins.js +36 -0
- package/dist/registry/builtins/node-builtins.js.map +1 -0
- package/dist/registry/builtins/python-builtins.d.ts +10 -0
- package/dist/registry/builtins/python-builtins.d.ts.map +1 -0
- package/dist/registry/builtins/python-builtins.js +43 -0
- package/dist/registry/builtins/python-builtins.js.map +1 -0
- package/dist/registry/cache.d.ts +53 -0
- package/dist/registry/cache.d.ts.map +1 -0
- package/dist/registry/cache.js +147 -0
- package/dist/registry/cache.js.map +1 -0
- package/dist/registry/go-registry.d.ts +52 -0
- package/dist/registry/go-registry.d.ts.map +1 -0
- package/dist/registry/go-registry.js +148 -0
- package/dist/registry/go-registry.js.map +1 -0
- package/dist/registry/index.d.ts +18 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +21 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/maven-registry.d.ts +57 -0
- package/dist/registry/maven-registry.d.ts.map +1 -0
- package/dist/registry/maven-registry.js +155 -0
- package/dist/registry/maven-registry.js.map +1 -0
- package/dist/registry/npm-registry.d.ts +40 -0
- package/dist/registry/npm-registry.d.ts.map +1 -0
- package/dist/registry/npm-registry.js +155 -0
- package/dist/registry/npm-registry.js.map +1 -0
- package/dist/registry/pypi-registry.d.ts +49 -0
- package/dist/registry/pypi-registry.d.ts.map +1 -0
- package/dist/registry/pypi-registry.js +175 -0
- package/dist/registry/pypi-registry.js.map +1 -0
- package/dist/registry/registry-manager.d.ts +45 -0
- package/dist/registry/registry-manager.d.ts.map +1 -0
- package/dist/registry/registry-manager.js +107 -0
- package/dist/registry/registry-manager.js.map +1 -0
- package/dist/registry/types.d.ts +83 -0
- package/dist/registry/types.d.ts.map +1 -0
- package/dist/registry/types.js +12 -0
- package/dist/registry/types.js.map +1 -0
- package/dist/reporter/html-reporter.d.ts +20 -0
- package/dist/reporter/html-reporter.d.ts.map +1 -0
- package/dist/reporter/html-reporter.js +612 -0
- package/dist/reporter/html-reporter.js.map +1 -0
- package/dist/reporter/index.d.ts +28 -0
- package/dist/reporter/index.d.ts.map +1 -0
- package/dist/reporter/index.js +48 -0
- package/dist/reporter/index.js.map +1 -0
- package/dist/reporter/markdown-reporter.d.ts +16 -0
- package/dist/reporter/markdown-reporter.d.ts.map +1 -0
- package/dist/reporter/markdown-reporter.js +182 -0
- package/dist/reporter/markdown-reporter.js.map +1 -0
- package/dist/reporter/sarif-reporter.d.ts +67 -0
- package/dist/reporter/sarif-reporter.d.ts.map +1 -0
- package/dist/reporter/sarif-reporter.js +73 -0
- package/dist/reporter/sarif-reporter.js.map +1 -0
- package/dist/reporter/terminal-reporter.d.ts +14 -0
- package/dist/reporter/terminal-reporter.d.ts.map +1 -0
- package/dist/reporter/terminal-reporter.js +126 -0
- package/dist/reporter/terminal-reporter.js.map +1 -0
- package/dist/reporter/types.d.ts +43 -0
- package/dist/reporter/types.d.ts.map +1 -0
- package/dist/reporter/types.js +10 -0
- package/dist/reporter/types.js.map +1 -0
- package/dist/reporter/v4-html.d.ts +24 -0
- package/dist/reporter/v4-html.d.ts.map +1 -0
- package/dist/reporter/v4-html.js +359 -0
- package/dist/reporter/v4-html.js.map +1 -0
- package/dist/reporter/v4-terminal.d.ts +55 -0
- package/dist/reporter/v4-terminal.d.ts.map +1 -0
- package/dist/reporter/v4-terminal.js +199 -0
- package/dist/reporter/v4-terminal.js.map +1 -0
- package/dist/scanner/index.d.ts +9 -0
- package/dist/scanner/index.d.ts.map +1 -0
- package/dist/scanner/index.js +9 -0
- package/dist/scanner/index.js.map +1 -0
- package/dist/scanner/v4-scanner.d.ts +162 -0
- package/dist/scanner/v4-scanner.d.ts.map +1 -0
- package/dist/scanner/v4-scanner.js +327 -0
- package/dist/scanner/v4-scanner.js.map +1 -0
- package/dist/scorer/report.d.ts +52 -0
- package/dist/scorer/report.d.ts.map +1 -0
- package/dist/scorer/report.js +347 -0
- package/dist/scorer/report.js.map +1 -0
- package/dist/scorer/scoring-engine.d.ts +170 -0
- package/dist/scorer/scoring-engine.d.ts.map +1 -0
- package/dist/scorer/scoring-engine.js +308 -0
- package/dist/scorer/scoring-engine.js.map +1 -0
- package/dist/scorer/v4-adapter.d.ts +87 -0
- package/dist/scorer/v4-adapter.d.ts.map +1 -0
- package/dist/scorer/v4-adapter.js +145 -0
- package/dist/scorer/v4-adapter.js.map +1 -0
- package/dist/sla/index.d.ts +7 -0
- package/dist/sla/index.d.ts.map +1 -0
- package/dist/sla/index.js +6 -0
- package/dist/sla/index.js.map +1 -0
- package/dist/sla/tracker.d.ts +70 -0
- package/dist/sla/tracker.d.ts.map +1 -0
- package/dist/sla/tracker.js +151 -0
- package/dist/sla/tracker.js.map +1 -0
- package/dist/sla/types.d.ts +67 -0
- package/dist/sla/types.d.ts.map +1 -0
- package/dist/sla/types.js +42 -0
- package/dist/sla/types.js.map +1 -0
- package/dist/types.d.ts +172 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +69 -0
- package/dist/types.js.map +1 -0
- package/package.json +97 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Break Detector (V3)
|
|
3
|
+
*
|
|
4
|
+
* Detects architectural inconsistencies in AI-generated code:
|
|
5
|
+
* 1. Mixed coding styles (camelCase vs snake_case)
|
|
6
|
+
* 2. Inconsistent error handling patterns
|
|
7
|
+
* 3. Mixed module systems (import vs require in same file)
|
|
8
|
+
* 4. Inconsistent async patterns (callbacks vs promises vs async/await)
|
|
9
|
+
* 5. Style breaks that indicate context window switches
|
|
10
|
+
*
|
|
11
|
+
* Implements the unified Detector interface.
|
|
12
|
+
*
|
|
13
|
+
* @since 0.2.0 (original)
|
|
14
|
+
* @since 0.3.0 (V3 unified interface)
|
|
15
|
+
*/
|
|
16
|
+
import type { Detector, UnifiedIssue, FileAnalysis } from '../types.js';
|
|
17
|
+
/**
|
|
18
|
+
* @deprecated Use UnifiedIssue instead. Will be removed in v0.4.0.
|
|
19
|
+
*/
|
|
20
|
+
export interface ContextBreakIssue {
|
|
21
|
+
type: 'naming-inconsistency' | 'module-system-mix' | 'async-pattern-mix' | 'style-break' | 'error-handling-inconsistency';
|
|
22
|
+
severity: 'warning' | 'error';
|
|
23
|
+
file: string;
|
|
24
|
+
line: number;
|
|
25
|
+
message: string;
|
|
26
|
+
suggestion?: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* @deprecated Use UnifiedIssue[] instead. Will be removed in v0.4.0.
|
|
30
|
+
*/
|
|
31
|
+
export interface ContextBreakResult {
|
|
32
|
+
file: string;
|
|
33
|
+
issues: ContextBreakIssue[];
|
|
34
|
+
score: number;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* ContextBreakDetector — detects AI context window inconsistencies.
|
|
38
|
+
*
|
|
39
|
+
* V3: Implements the unified Detector interface.
|
|
40
|
+
* V2 (deprecated): Old analyze() signature still works.
|
|
41
|
+
*/
|
|
42
|
+
export declare class ContextBreakDetector implements Detector {
|
|
43
|
+
readonly name = "context-break";
|
|
44
|
+
readonly version = "2.0.0";
|
|
45
|
+
readonly tier: 1;
|
|
46
|
+
/**
|
|
47
|
+
* V3 unified detect method.
|
|
48
|
+
*/
|
|
49
|
+
detect(files: FileAnalysis[]): Promise<UnifiedIssue[]>;
|
|
50
|
+
/**
|
|
51
|
+
* Analyze a single file.
|
|
52
|
+
* @deprecated Use detect(files) instead. Will be removed in v0.4.0.
|
|
53
|
+
*/
|
|
54
|
+
analyze(filePath: string, source: string): ContextBreakResult;
|
|
55
|
+
}
|
|
56
|
+
export default ContextBreakDetector;
|
|
57
|
+
//# sourceMappingURL=context-break.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-break.d.ts","sourceRoot":"","sources":["../../src/detectors/context-break.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAY,MAAM,aAAa,CAAC;AAKlF;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EACA,sBAAsB,GACtB,mBAAmB,GACnB,mBAAmB,GACnB,aAAa,GACb,8BAA8B,CAAC;IACnC,QAAQ,EAAE,SAAS,GAAG,OAAO,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;CACf;AAkJD;;;;;GAKG;AACH,qBAAa,oBAAqB,YAAW,QAAQ;IACnD,QAAQ,CAAC,IAAI,mBAAmB;IAChC,QAAQ,CAAC,OAAO,WAAW;IAC3B,QAAQ,CAAC,IAAI,EAAG,CAAC,CAAU;IAI3B;;OAEG;IACG,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAgB5D;;;OAGG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,kBAAkB;CAqB9D;AAED,eAAe,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Break Detector (V3)
|
|
3
|
+
*
|
|
4
|
+
* Detects architectural inconsistencies in AI-generated code:
|
|
5
|
+
* 1. Mixed coding styles (camelCase vs snake_case)
|
|
6
|
+
* 2. Inconsistent error handling patterns
|
|
7
|
+
* 3. Mixed module systems (import vs require in same file)
|
|
8
|
+
* 4. Inconsistent async patterns (callbacks vs promises vs async/await)
|
|
9
|
+
* 5. Style breaks that indicate context window switches
|
|
10
|
+
*
|
|
11
|
+
* Implements the unified Detector interface.
|
|
12
|
+
*
|
|
13
|
+
* @since 0.2.0 (original)
|
|
14
|
+
* @since 0.3.0 (V3 unified interface)
|
|
15
|
+
*/
|
|
16
|
+
import { AIDefectCategory } from '../types.js';
|
|
17
|
+
// ─── Internal Detection Functions ───
|
|
18
|
+
function detectNamingInconsistency(lines, filePath) {
|
|
19
|
+
const issues = [];
|
|
20
|
+
let camelCaseCount = 0;
|
|
21
|
+
let snakeCaseCount = 0;
|
|
22
|
+
const snakeCaseLines = [];
|
|
23
|
+
const camelCaseLines = [];
|
|
24
|
+
for (let i = 0; i < lines.length; i++) {
|
|
25
|
+
const line = lines[i];
|
|
26
|
+
const declMatch = line.match(/(?:const|let|var|function)\s+(\w+)/);
|
|
27
|
+
if (declMatch) {
|
|
28
|
+
const name = declMatch[1];
|
|
29
|
+
if (name.includes('_') && name !== name.toUpperCase()) {
|
|
30
|
+
snakeCaseCount++;
|
|
31
|
+
snakeCaseLines.push(i + 1);
|
|
32
|
+
}
|
|
33
|
+
else if (/[a-z][A-Z]/.test(name)) {
|
|
34
|
+
camelCaseCount++;
|
|
35
|
+
camelCaseLines.push(i + 1);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (camelCaseCount > 0 && snakeCaseCount > 0) {
|
|
40
|
+
const minority = camelCaseCount < snakeCaseCount ? camelCaseLines : snakeCaseLines;
|
|
41
|
+
const majorStyle = camelCaseCount >= snakeCaseCount ? 'camelCase' : 'snake_case';
|
|
42
|
+
for (const lineNum of minority.slice(0, 5)) {
|
|
43
|
+
issues.push({
|
|
44
|
+
type: 'naming-inconsistency',
|
|
45
|
+
severity: 'warning',
|
|
46
|
+
file: filePath,
|
|
47
|
+
line: lineNum,
|
|
48
|
+
message: `Naming convention inconsistency: file predominantly uses ${majorStyle}`,
|
|
49
|
+
suggestion: 'AI context switches often cause naming style changes. Standardize to one convention.',
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return issues;
|
|
54
|
+
}
|
|
55
|
+
function detectModuleSystemMix(lines, filePath) {
|
|
56
|
+
const issues = [];
|
|
57
|
+
let hasESMImport = false;
|
|
58
|
+
let hasCJSRequire = false;
|
|
59
|
+
let esmLine = 0;
|
|
60
|
+
let cjsLine = 0;
|
|
61
|
+
for (let i = 0; i < lines.length; i++) {
|
|
62
|
+
const line = lines[i].trim();
|
|
63
|
+
if (/^import\s/.test(line) && !line.includes('import(')) {
|
|
64
|
+
if (!hasESMImport) {
|
|
65
|
+
hasESMImport = true;
|
|
66
|
+
esmLine = i + 1;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (/\brequire\s*\(/.test(line) && !line.includes('// eslint')) {
|
|
70
|
+
if (!hasCJSRequire) {
|
|
71
|
+
hasCJSRequire = true;
|
|
72
|
+
cjsLine = i + 1;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (hasESMImport && hasCJSRequire) {
|
|
77
|
+
issues.push({
|
|
78
|
+
type: 'module-system-mix',
|
|
79
|
+
severity: 'warning',
|
|
80
|
+
file: filePath,
|
|
81
|
+
line: cjsLine,
|
|
82
|
+
message: 'Mixed module systems: both ESM import and CommonJS require() found',
|
|
83
|
+
suggestion: 'Standardize to one module system. AI often mixes import and require in the same file.',
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
return issues;
|
|
87
|
+
}
|
|
88
|
+
function detectAsyncPatternMix(lines, filePath) {
|
|
89
|
+
const issues = [];
|
|
90
|
+
const source = lines.join('\n');
|
|
91
|
+
let hasAsyncAwait = false;
|
|
92
|
+
let hasThenChain = false;
|
|
93
|
+
let hasCallback = false;
|
|
94
|
+
if (/\bawait\s/.test(source))
|
|
95
|
+
hasAsyncAwait = true;
|
|
96
|
+
if (/\.then\s*\(/.test(source))
|
|
97
|
+
hasThenChain = true;
|
|
98
|
+
const callbackPattern = /function\s*\(\s*err(?:or)?\s*,/g;
|
|
99
|
+
if (callbackPattern.test(source))
|
|
100
|
+
hasCallback = true;
|
|
101
|
+
const patterns = [hasAsyncAwait && 'async/await', hasThenChain && '.then()', hasCallback && 'callbacks']
|
|
102
|
+
.filter(Boolean);
|
|
103
|
+
if (patterns.length >= 2) {
|
|
104
|
+
issues.push({
|
|
105
|
+
type: 'async-pattern-mix',
|
|
106
|
+
severity: 'warning',
|
|
107
|
+
file: filePath,
|
|
108
|
+
line: 1,
|
|
109
|
+
message: `Mixed async patterns detected: ${patterns.join(', ')}`,
|
|
110
|
+
suggestion: 'Standardize to async/await for consistency. AI-generated code often mixes patterns.',
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
return issues;
|
|
114
|
+
}
|
|
115
|
+
// ─── Severity & Category Mapping ───
|
|
116
|
+
function mapSeverity(type) {
|
|
117
|
+
switch (type) {
|
|
118
|
+
case 'naming-inconsistency':
|
|
119
|
+
return 'low';
|
|
120
|
+
case 'module-system-mix':
|
|
121
|
+
return 'medium';
|
|
122
|
+
case 'async-pattern-mix':
|
|
123
|
+
return 'low';
|
|
124
|
+
case 'style-break':
|
|
125
|
+
return 'low';
|
|
126
|
+
case 'error-handling-inconsistency':
|
|
127
|
+
return 'medium';
|
|
128
|
+
default:
|
|
129
|
+
return 'low';
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
function toUnifiedIssue(issue, index) {
|
|
133
|
+
return {
|
|
134
|
+
id: `context-break:${index}`,
|
|
135
|
+
detector: 'context-break',
|
|
136
|
+
category: AIDefectCategory.CONTEXT_LOSS,
|
|
137
|
+
severity: mapSeverity(issue.type),
|
|
138
|
+
message: issue.message,
|
|
139
|
+
file: issue.file,
|
|
140
|
+
line: issue.line,
|
|
141
|
+
fix: issue.suggestion ? {
|
|
142
|
+
description: issue.suggestion,
|
|
143
|
+
autoFixable: false,
|
|
144
|
+
} : undefined,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
// ─── Main Detector ───
|
|
148
|
+
/**
|
|
149
|
+
* ContextBreakDetector — detects AI context window inconsistencies.
|
|
150
|
+
*
|
|
151
|
+
* V3: Implements the unified Detector interface.
|
|
152
|
+
* V2 (deprecated): Old analyze() signature still works.
|
|
153
|
+
*/
|
|
154
|
+
export class ContextBreakDetector {
|
|
155
|
+
name = 'context-break';
|
|
156
|
+
version = '2.0.0';
|
|
157
|
+
tier = 1;
|
|
158
|
+
// ─── V3 Unified Interface ───
|
|
159
|
+
/**
|
|
160
|
+
* V3 unified detect method.
|
|
161
|
+
*/
|
|
162
|
+
async detect(files) {
|
|
163
|
+
const allIssues = [];
|
|
164
|
+
let globalIndex = 0;
|
|
165
|
+
for (const file of files) {
|
|
166
|
+
const result = this.analyze(file.path, file.content);
|
|
167
|
+
for (const issue of result.issues) {
|
|
168
|
+
allIssues.push(toUnifiedIssue(issue, globalIndex++));
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return allIssues;
|
|
172
|
+
}
|
|
173
|
+
// ─── V2 Legacy Interface (Deprecated) ───
|
|
174
|
+
/**
|
|
175
|
+
* Analyze a single file.
|
|
176
|
+
* @deprecated Use detect(files) instead. Will be removed in v0.4.0.
|
|
177
|
+
*/
|
|
178
|
+
analyze(filePath, source) {
|
|
179
|
+
const lines = source.split('\n');
|
|
180
|
+
const rawIssues = [
|
|
181
|
+
...detectNamingInconsistency(lines, filePath),
|
|
182
|
+
...detectModuleSystemMix(lines, filePath),
|
|
183
|
+
...detectAsyncPatternMix(lines, filePath),
|
|
184
|
+
];
|
|
185
|
+
const issues = rawIssues.filter(issue => {
|
|
186
|
+
if (issue.line <= 0)
|
|
187
|
+
return true;
|
|
188
|
+
const prevLine = lines[issue.line - 2] || '';
|
|
189
|
+
return !prevLine.includes('// ai-validator-ignore') && !prevLine.includes('// ai-validator-disable');
|
|
190
|
+
});
|
|
191
|
+
const errorCount = issues.filter(i => i.severity === 'error').length;
|
|
192
|
+
const warningCount = issues.filter(i => i.severity === 'warning').length;
|
|
193
|
+
const deductions = (errorCount * 15) + (warningCount * 5);
|
|
194
|
+
const score = Math.max(0, 100 - deductions);
|
|
195
|
+
return { file: filePath, issues, score };
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
export default ContextBreakDetector;
|
|
199
|
+
//# sourceMappingURL=context-break.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-break.js","sourceRoot":"","sources":["../../src/detectors/context-break.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AA8B/C,uCAAuC;AAEvC,SAAS,yBAAyB,CAAC,KAAe,EAAE,QAAgB;IAClE,MAAM,MAAM,GAAwB,EAAE,CAAC;IAEvC,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,MAAM,cAAc,GAAa,EAAE,CAAC;IAEpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACnE,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACtD,cAAc,EAAE,CAAC;gBACjB,cAAc,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7B,CAAC;iBAAM,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnC,cAAc,EAAE,CAAC;gBACjB,cAAc,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,cAAc,GAAG,CAAC,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;QAC7C,MAAM,QAAQ,GAAG,cAAc,GAAG,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC;QACnF,MAAM,UAAU,GAAG,cAAc,IAAI,cAAc,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC;QAEjF,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAC3C,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,sBAAsB;gBAC5B,QAAQ,EAAE,SAAS;gBACnB,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,4DAA4D,UAAU,EAAE;gBACjF,UAAU,EAAE,sFAAsF;aACnG,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAe,EAAE,QAAgB;IAC9D,MAAM,MAAM,GAAwB,EAAE,CAAC;IACvC,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAE7B,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACxD,IAAI,CAAC,YAAY,EAAE,CAAC;gBAAC,YAAY,GAAG,IAAI,CAAC;gBAAC,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;YAAC,CAAC;QAC9D,CAAC;QACD,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/D,IAAI,CAAC,aAAa,EAAE,CAAC;gBAAC,aAAa,GAAG,IAAI,CAAC;gBAAC,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;YAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,IAAI,YAAY,IAAI,aAAa,EAAE,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,mBAAmB;YACzB,QAAQ,EAAE,SAAS;YACnB,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,oEAAoE;YAC7E,UAAU,EAAE,uFAAuF;SACpG,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAe,EAAE,QAAgB;IAC9D,MAAM,MAAM,GAAwB,EAAE,CAAC;IACvC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEhC,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,WAAW,GAAG,KAAK,CAAC;IAExB,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,aAAa,GAAG,IAAI,CAAC;IACnD,IAAI,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,YAAY,GAAG,IAAI,CAAC;IAEpD,MAAM,eAAe,GAAG,iCAAiC,CAAC;IAC1D,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,WAAW,GAAG,IAAI,CAAC;IAErD,MAAM,QAAQ,GAAG,CAAC,aAAa,IAAI,aAAa,EAAE,YAAY,IAAI,SAAS,EAAE,WAAW,IAAI,WAAW,CAAC;SACrG,MAAM,CAAC,OAAO,CAAC,CAAC;IAEnB,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,mBAAmB;YACzB,QAAQ,EAAE,SAAS;YACnB,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,CAAC;YACP,OAAO,EAAE,kCAAkC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAChE,UAAU,EAAE,qFAAqF;SAClG,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,sCAAsC;AAEtC,SAAS,WAAW,CAAC,IAA+B;IAClD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,sBAAsB;YACzB,OAAO,KAAK,CAAC;QACf,KAAK,mBAAmB;YACtB,OAAO,QAAQ,CAAC;QAClB,KAAK,mBAAmB;YACtB,OAAO,KAAK,CAAC;QACf,KAAK,aAAa;YAChB,OAAO,KAAK,CAAC;QACf,KAAK,8BAA8B;YACjC,OAAO,QAAQ,CAAC;QAClB;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,KAAwB,EAAE,KAAa;IAC7D,OAAO;QACL,EAAE,EAAE,iBAAiB,KAAK,EAAE;QAC5B,QAAQ,EAAE,eAAe;QACzB,QAAQ,EAAE,gBAAgB,CAAC,YAAY;QACvC,QAAQ,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC;QACjC,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,GAAG,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;YACtB,WAAW,EAAE,KAAK,CAAC,UAAU;YAC7B,WAAW,EAAE,KAAK;SACnB,CAAC,CAAC,CAAC,SAAS;KACd,CAAC;AACJ,CAAC;AAED,wBAAwB;AAExB;;;;;GAKG;AACH,MAAM,OAAO,oBAAoB;IACtB,IAAI,GAAG,eAAe,CAAC;IACvB,OAAO,GAAG,OAAO,CAAC;IAClB,IAAI,GAAG,CAAU,CAAC;IAE3B,+BAA+B;IAE/B;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,KAAqB;QAChC,MAAM,SAAS,GAAmB,EAAE,CAAC;QACrC,IAAI,WAAW,GAAG,CAAC,CAAC;QAEpB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACrD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,2CAA2C;IAE3C;;;OAGG;IACH,OAAO,CAAC,QAAgB,EAAE,MAAc;QACtC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,SAAS,GAAwB;YACrC,GAAG,yBAAyB,CAAC,KAAK,EAAE,QAAQ,CAAC;YAC7C,GAAG,qBAAqB,CAAC,KAAK,EAAE,QAAQ,CAAC;YACzC,GAAG,qBAAqB,CAAC,KAAK,EAAE,QAAQ,CAAC;SAC1C,CAAC;QAEF,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;YACtC,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;YACjC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YAC7C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,wBAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC;QACvG,CAAC,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;QACrE,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;QACzE,MAAM,UAAU,GAAG,CAAC,UAAU,GAAG,EAAE,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;QAC1D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,UAAU,CAAC,CAAC;QAE5C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC3C,CAAC;CACF;AAED,eAAe,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deep Hallucination Detector (V3)
|
|
3
|
+
*
|
|
4
|
+
* Validates that imported packages actually exist by checking:
|
|
5
|
+
* 1. Whether the package is in node_modules/
|
|
6
|
+
* 2. Whether the package is listed in package.json dependencies
|
|
7
|
+
*
|
|
8
|
+
* This goes beyond the basic HallucinationDetector by focusing specifically
|
|
9
|
+
* on package existence verification (without network requests).
|
|
10
|
+
*
|
|
11
|
+
* AI models frequently hallucinate package names that sound plausible
|
|
12
|
+
* but don't actually exist on npm.
|
|
13
|
+
*
|
|
14
|
+
* Implements the unified Detector interface.
|
|
15
|
+
*
|
|
16
|
+
* @since 0.3.0
|
|
17
|
+
*/
|
|
18
|
+
import type { Detector, UnifiedIssue, FileAnalysis } from '../types.js';
|
|
19
|
+
/**
|
|
20
|
+
* DeepHallucinationDetector — verifies imported packages actually exist.
|
|
21
|
+
*
|
|
22
|
+
* Checks imports against:
|
|
23
|
+
* 1. Node.js built-in modules whitelist
|
|
24
|
+
* 2. Well-known packages whitelist (50+ common packages)
|
|
25
|
+
* 3. package.json dependencies
|
|
26
|
+
* 4. node_modules/ directory
|
|
27
|
+
*
|
|
28
|
+
* Does NOT make network requests (kept for speed; npm registry checks
|
|
29
|
+
* can be added in AI Tier or future versions).
|
|
30
|
+
*/
|
|
31
|
+
export declare class DeepHallucinationDetector implements Detector {
|
|
32
|
+
readonly name = "deep-hallucination";
|
|
33
|
+
readonly version = "1.0.0";
|
|
34
|
+
readonly tier: 1;
|
|
35
|
+
private projectRoot;
|
|
36
|
+
private projectDeps;
|
|
37
|
+
constructor(projectRoot?: string);
|
|
38
|
+
detect(files: FileAnalysis[]): Promise<UnifiedIssue[]>;
|
|
39
|
+
private analyzeFile;
|
|
40
|
+
}
|
|
41
|
+
export default DeepHallucinationDetector;
|
|
42
|
+
//# sourceMappingURL=deep-hallucination.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deep-hallucination.d.ts","sourceRoot":"","sources":["../../src/detectors/deep-hallucination.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAsNxE;;;;;;;;;;;GAWG;AACH,qBAAa,yBAA0B,YAAW,QAAQ;IACxD,QAAQ,CAAC,IAAI,wBAAwB;IACrC,QAAQ,CAAC,OAAO,WAAW;IAC3B,QAAQ,CAAC,IAAI,EAAG,CAAC,CAAU;IAE3B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAc;gBAErB,WAAW,GAAE,MAAsB;IAOzC,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAiB5D,OAAO,CAAC,WAAW;CAqDpB;AAED,eAAe,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deep Hallucination Detector (V3)
|
|
3
|
+
*
|
|
4
|
+
* Validates that imported packages actually exist by checking:
|
|
5
|
+
* 1. Whether the package is in node_modules/
|
|
6
|
+
* 2. Whether the package is listed in package.json dependencies
|
|
7
|
+
*
|
|
8
|
+
* This goes beyond the basic HallucinationDetector by focusing specifically
|
|
9
|
+
* on package existence verification (without network requests).
|
|
10
|
+
*
|
|
11
|
+
* AI models frequently hallucinate package names that sound plausible
|
|
12
|
+
* but don't actually exist on npm.
|
|
13
|
+
*
|
|
14
|
+
* Implements the unified Detector interface.
|
|
15
|
+
*
|
|
16
|
+
* @since 0.3.0
|
|
17
|
+
*/
|
|
18
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
19
|
+
import { join, dirname } from 'node:path';
|
|
20
|
+
import { AIDefectCategory } from '../types.js';
|
|
21
|
+
// ─── Built-in Module Whitelist ───
|
|
22
|
+
const NODE_BUILTINS = new Set([
|
|
23
|
+
'fs', 'path', 'os', 'crypto', 'http', 'https', 'url', 'util',
|
|
24
|
+
'stream', 'events', 'child_process', 'cluster', 'dns', 'net',
|
|
25
|
+
'tls', 'zlib', 'readline', 'querystring', 'assert', 'buffer',
|
|
26
|
+
'console', 'process', 'timers', 'worker_threads', 'perf_hooks',
|
|
27
|
+
'async_hooks', 'v8', 'vm', 'string_decoder', 'punycode', 'dgram',
|
|
28
|
+
'http2', 'inspector', 'module', 'repl', 'constants', 'sys',
|
|
29
|
+
'domain', 'wasi', 'diagnostics_channel', 'trace_events', 'test',
|
|
30
|
+
// node: prefixed
|
|
31
|
+
'node:fs', 'node:path', 'node:os', 'node:crypto', 'node:http',
|
|
32
|
+
'node:https', 'node:url', 'node:util', 'node:stream', 'node:events',
|
|
33
|
+
'node:child_process', 'node:cluster', 'node:dns', 'node:net',
|
|
34
|
+
'node:tls', 'node:zlib', 'node:readline', 'node:querystring',
|
|
35
|
+
'node:assert', 'node:buffer', 'node:console', 'node:process',
|
|
36
|
+
'node:timers', 'node:worker_threads', 'node:perf_hooks',
|
|
37
|
+
'node:async_hooks', 'node:v8', 'node:vm', 'node:test',
|
|
38
|
+
'node:string_decoder', 'node:punycode', 'node:dgram', 'node:http2',
|
|
39
|
+
'node:inspector', 'node:module', 'node:repl',
|
|
40
|
+
// Sub-paths
|
|
41
|
+
'fs/promises', 'timers/promises', 'stream/promises', 'stream/web',
|
|
42
|
+
'stream/consumers', 'node:fs/promises', 'node:timers/promises',
|
|
43
|
+
'node:stream/promises', 'node:stream/web',
|
|
44
|
+
]);
|
|
45
|
+
// ─── Well-known Package Whitelist ───
|
|
46
|
+
const WELL_KNOWN_PACKAGES = new Set([
|
|
47
|
+
// Frameworks
|
|
48
|
+
'react', 'react-dom', 'react-native', 'vue', 'angular', 'svelte',
|
|
49
|
+
'next', 'nuxt', 'gatsby', 'remix', 'astro', 'solid-js', 'preact',
|
|
50
|
+
'express', 'fastify', 'koa', 'hapi', 'nest', '@nestjs/core',
|
|
51
|
+
'@nestjs/common', '@nestjs/platform-express', '@nestjs/testing',
|
|
52
|
+
// Build tools
|
|
53
|
+
'typescript', 'webpack', 'vite', 'rollup', 'esbuild', 'swc',
|
|
54
|
+
'parcel', 'turbo', 'tsup', 'unbuild', 'tsc', 'babel',
|
|
55
|
+
'@swc/core', '@swc/cli',
|
|
56
|
+
// Testing
|
|
57
|
+
'jest', 'vitest', 'mocha', 'chai', 'jasmine', 'cypress',
|
|
58
|
+
'playwright', '@playwright/test', 'puppeteer', 'supertest',
|
|
59
|
+
'@testing-library/react', '@testing-library/jest-dom',
|
|
60
|
+
'@testing-library/user-event', 'sinon', 'nock', 'msw', 'ava',
|
|
61
|
+
'tap', 'nyc', 'c8', 'istanbul',
|
|
62
|
+
// Linting & Formatting
|
|
63
|
+
'eslint', 'prettier', 'stylelint', 'markdownlint',
|
|
64
|
+
'@typescript-eslint/parser', '@typescript-eslint/eslint-plugin',
|
|
65
|
+
'eslint-config-prettier', 'eslint-plugin-import',
|
|
66
|
+
// Database
|
|
67
|
+
'prisma', '@prisma/client', 'typeorm', 'sequelize', 'knex',
|
|
68
|
+
'mongoose', 'mongodb', 'pg', 'mysql', 'mysql2', 'sqlite3',
|
|
69
|
+
'better-sqlite3', 'redis', 'ioredis', 'drizzle-orm',
|
|
70
|
+
// Utilities
|
|
71
|
+
'lodash', 'underscore', 'ramda', 'rxjs', 'date-fns', 'dayjs',
|
|
72
|
+
'moment', 'uuid', 'nanoid', 'chalk', 'debug', 'dotenv',
|
|
73
|
+
'commander', 'yargs', 'inquirer', 'ora', 'glob', 'minimatch',
|
|
74
|
+
'semver', 'yaml', 'toml', 'ini', 'ajv', 'joi', 'zod',
|
|
75
|
+
'class-validator', 'class-transformer',
|
|
76
|
+
// HTTP
|
|
77
|
+
'axios', 'node-fetch', 'got', 'undici', 'ky', 'cross-fetch',
|
|
78
|
+
'superagent', 'request',
|
|
79
|
+
// Auth
|
|
80
|
+
'jsonwebtoken', 'passport', 'bcrypt', 'bcryptjs', 'argon2',
|
|
81
|
+
'helmet', 'cors', 'csurf', 'express-rate-limit',
|
|
82
|
+
// File/Process
|
|
83
|
+
'fs-extra', 'chokidar', 'rimraf', 'mkdirp', 'execa', 'cross-env',
|
|
84
|
+
'concurrently', 'pm2', 'nodemon', 'ts-node', 'tsx',
|
|
85
|
+
// UI libraries
|
|
86
|
+
'@mui/material', '@chakra-ui/react', 'antd', 'tailwindcss',
|
|
87
|
+
'@tailwindcss/forms', '@headlessui/react', '@radix-ui/react-dialog',
|
|
88
|
+
'styled-components', '@emotion/react', '@emotion/styled',
|
|
89
|
+
'framer-motion', 'clsx', 'classnames',
|
|
90
|
+
// State management
|
|
91
|
+
'zustand', 'jotai', 'recoil', 'mobx', 'redux', '@reduxjs/toolkit',
|
|
92
|
+
'react-redux', 'vuex', 'pinia',
|
|
93
|
+
// Types
|
|
94
|
+
'@types/node', '@types/react', '@types/react-dom', '@types/express',
|
|
95
|
+
'@types/jest', '@types/lodash', '@types/uuid',
|
|
96
|
+
// Monorepo
|
|
97
|
+
'lerna', 'changesets', '@changesets/cli', 'nx',
|
|
98
|
+
// Cloud / Infra
|
|
99
|
+
'aws-sdk', '@aws-sdk/client-s3', 'firebase', 'firebase-admin',
|
|
100
|
+
'@google-cloud/storage', 'azure-storage',
|
|
101
|
+
// Logging
|
|
102
|
+
'winston', 'pino', 'bunyan', 'morgan', 'log4js',
|
|
103
|
+
// Misc
|
|
104
|
+
'sharp', 'jimp', 'multer', 'formidable', 'busboy',
|
|
105
|
+
'socket.io', 'ws', 'graphql', '@apollo/server', '@apollo/client',
|
|
106
|
+
'openai', '@anthropic-ai/sdk', 'langchain',
|
|
107
|
+
'puppeteer-core', 'cheerio', 'jsdom',
|
|
108
|
+
]);
|
|
109
|
+
function extractImports(source) {
|
|
110
|
+
const imports = [];
|
|
111
|
+
const lines = source.split('\n');
|
|
112
|
+
for (let i = 0; i < lines.length; i++) {
|
|
113
|
+
const line = lines[i];
|
|
114
|
+
const lineNum = i + 1;
|
|
115
|
+
// ES module imports
|
|
116
|
+
const esMatch = line.match(/import\s+.*?\s+from\s+['"]([^'"]+)['"]/);
|
|
117
|
+
if (esMatch) {
|
|
118
|
+
imports.push({ module: esMatch[1], line: lineNum });
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
// Side-effect imports
|
|
122
|
+
const sideEffectMatch = line.match(/import\s+['"]([^'"]+)['"]/);
|
|
123
|
+
if (sideEffectMatch) {
|
|
124
|
+
imports.push({ module: sideEffectMatch[1], line: lineNum });
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
// Dynamic imports
|
|
128
|
+
const dynamicMatch = line.match(/import\s*\(\s*['"]([^'"]+)['"]\s*\)/);
|
|
129
|
+
if (dynamicMatch) {
|
|
130
|
+
imports.push({ module: dynamicMatch[1], line: lineNum });
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
// CommonJS require
|
|
134
|
+
const requireMatch = line.match(/require\s*\(\s*['"]([^'"]+)['"]\s*\)/);
|
|
135
|
+
if (requireMatch) {
|
|
136
|
+
imports.push({ module: requireMatch[1], line: lineNum });
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return imports;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Extract the base package name from an import specifier.
|
|
143
|
+
* Returns null for relative imports.
|
|
144
|
+
*/
|
|
145
|
+
function getPackageName(specifier) {
|
|
146
|
+
// Skip relative imports
|
|
147
|
+
if (specifier.startsWith('.') || specifier.startsWith('/'))
|
|
148
|
+
return null;
|
|
149
|
+
// Skip path aliases
|
|
150
|
+
if (specifier.startsWith('@/') || specifier.startsWith('~/') || specifier.startsWith('#'))
|
|
151
|
+
return null;
|
|
152
|
+
// Scoped packages: @scope/pkg
|
|
153
|
+
if (specifier.startsWith('@')) {
|
|
154
|
+
const parts = specifier.split('/');
|
|
155
|
+
if (parts.length >= 2)
|
|
156
|
+
return `${parts[0]}/${parts[1]}`;
|
|
157
|
+
return specifier;
|
|
158
|
+
}
|
|
159
|
+
// Regular packages
|
|
160
|
+
return specifier.split('/')[0];
|
|
161
|
+
}
|
|
162
|
+
// ─── Package Verification ───
|
|
163
|
+
function loadProjectDependencies(projectRoot) {
|
|
164
|
+
const deps = new Set();
|
|
165
|
+
let dir = projectRoot;
|
|
166
|
+
while (dir !== dirname(dir)) {
|
|
167
|
+
const pkgPath = join(dir, 'package.json');
|
|
168
|
+
if (existsSync(pkgPath)) {
|
|
169
|
+
try {
|
|
170
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
171
|
+
const allDeps = {
|
|
172
|
+
...pkg.dependencies,
|
|
173
|
+
...pkg.devDependencies,
|
|
174
|
+
...pkg.peerDependencies,
|
|
175
|
+
...pkg.optionalDependencies,
|
|
176
|
+
};
|
|
177
|
+
for (const name of Object.keys(allDeps)) {
|
|
178
|
+
deps.add(name);
|
|
179
|
+
}
|
|
180
|
+
// Check for workspace root
|
|
181
|
+
if (pkg.workspaces) {
|
|
182
|
+
break; // Found workspace root, stop
|
|
183
|
+
}
|
|
184
|
+
// If inside packages/, also check parent
|
|
185
|
+
if (dir.includes('/packages/') || dir.includes('/apps/')) {
|
|
186
|
+
dir = dirname(dir);
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
catch { /* ignore */ }
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
193
|
+
dir = dirname(dir);
|
|
194
|
+
}
|
|
195
|
+
return deps;
|
|
196
|
+
}
|
|
197
|
+
function packageExistsInNodeModules(packageName, projectRoot) {
|
|
198
|
+
// Check in project's node_modules
|
|
199
|
+
let dir = projectRoot;
|
|
200
|
+
while (dir !== dirname(dir)) {
|
|
201
|
+
const nmPath = join(dir, 'node_modules', packageName);
|
|
202
|
+
if (existsSync(nmPath))
|
|
203
|
+
return true;
|
|
204
|
+
dir = dirname(dir);
|
|
205
|
+
}
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
// ─── Main Detector ───
|
|
209
|
+
/**
|
|
210
|
+
* DeepHallucinationDetector — verifies imported packages actually exist.
|
|
211
|
+
*
|
|
212
|
+
* Checks imports against:
|
|
213
|
+
* 1. Node.js built-in modules whitelist
|
|
214
|
+
* 2. Well-known packages whitelist (50+ common packages)
|
|
215
|
+
* 3. package.json dependencies
|
|
216
|
+
* 4. node_modules/ directory
|
|
217
|
+
*
|
|
218
|
+
* Does NOT make network requests (kept for speed; npm registry checks
|
|
219
|
+
* can be added in AI Tier or future versions).
|
|
220
|
+
*/
|
|
221
|
+
export class DeepHallucinationDetector {
|
|
222
|
+
name = 'deep-hallucination';
|
|
223
|
+
version = '1.0.0';
|
|
224
|
+
tier = 1;
|
|
225
|
+
projectRoot;
|
|
226
|
+
projectDeps;
|
|
227
|
+
constructor(projectRoot = process.cwd()) {
|
|
228
|
+
this.projectRoot = projectRoot;
|
|
229
|
+
this.projectDeps = loadProjectDependencies(projectRoot);
|
|
230
|
+
}
|
|
231
|
+
// ─── V3 Unified Interface ───
|
|
232
|
+
async detect(files) {
|
|
233
|
+
const allIssues = [];
|
|
234
|
+
let globalIndex = 0;
|
|
235
|
+
for (const file of files) {
|
|
236
|
+
const issues = this.analyzeFile(file.path, file.content);
|
|
237
|
+
for (const issue of issues) {
|
|
238
|
+
issue.id = `deep-hallucination:${globalIndex++}`;
|
|
239
|
+
allIssues.push(issue);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return allIssues;
|
|
243
|
+
}
|
|
244
|
+
// ─── Internal Analysis ───
|
|
245
|
+
analyzeFile(filePath, source) {
|
|
246
|
+
const issues = [];
|
|
247
|
+
const imports = extractImports(source);
|
|
248
|
+
const lines = source.split('\n');
|
|
249
|
+
for (const imp of imports) {
|
|
250
|
+
const pkgName = getPackageName(imp.module);
|
|
251
|
+
if (!pkgName)
|
|
252
|
+
continue; // relative import
|
|
253
|
+
// Skip suppressed lines
|
|
254
|
+
const prevLine = imp.line > 1 ? lines[imp.line - 2] : '';
|
|
255
|
+
if (prevLine.includes('// ai-validator-ignore') || prevLine.includes('// ai-validator-disable')) {
|
|
256
|
+
continue;
|
|
257
|
+
}
|
|
258
|
+
// Skip builtins
|
|
259
|
+
if (NODE_BUILTINS.has(imp.module) || NODE_BUILTINS.has(pkgName))
|
|
260
|
+
continue;
|
|
261
|
+
// Skip well-known packages
|
|
262
|
+
if (WELL_KNOWN_PACKAGES.has(pkgName))
|
|
263
|
+
continue;
|
|
264
|
+
// Check project dependencies
|
|
265
|
+
if (this.projectDeps.has(pkgName))
|
|
266
|
+
continue;
|
|
267
|
+
// Check node_modules
|
|
268
|
+
if (packageExistsInNodeModules(pkgName, this.projectRoot))
|
|
269
|
+
continue;
|
|
270
|
+
// Package not found — potential hallucination
|
|
271
|
+
issues.push({
|
|
272
|
+
id: '', // set in detect()
|
|
273
|
+
detector: this.name,
|
|
274
|
+
type: 'phantom-package',
|
|
275
|
+
category: AIDefectCategory.HALLUCINATION,
|
|
276
|
+
severity: 'critical',
|
|
277
|
+
message: `Potentially hallucinated package: '${pkgName}' is not found in dependencies or node_modules`,
|
|
278
|
+
file: filePath,
|
|
279
|
+
line: imp.line,
|
|
280
|
+
suggestion: `Verify that '${pkgName}' is a real npm package. If it exists, run 'npm install ${pkgName}'. If not, it may be an AI hallucination.`,
|
|
281
|
+
fix: {
|
|
282
|
+
description: `Install the package or replace with a real alternative`,
|
|
283
|
+
autoFixable: false,
|
|
284
|
+
},
|
|
285
|
+
confidence: 0.8,
|
|
286
|
+
detectionSource: 'static',
|
|
287
|
+
attribution: {
|
|
288
|
+
rootCause: 'AI models sometimes generate imports for packages that sound plausible but do not exist on npm',
|
|
289
|
+
frequency: 'occasional',
|
|
290
|
+
},
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
return issues;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
export default DeepHallucinationDetector;
|
|
297
|
+
//# sourceMappingURL=deep-hallucination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deep-hallucination.js","sourceRoot":"","sources":["../../src/detectors/deep-hallucination.ts"],"names":[],"mappings":"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"}
|