@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,319 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ContextCoherenceDetector — V4 detector for AI context window issues.
|
|
3
|
+
*
|
|
4
|
+
* Detects logic inconsistencies that arise from AI context window limitations.
|
|
5
|
+
* When AI models generate long code, they lose track of what they've already
|
|
6
|
+
* defined, used, or imported — leading to coherence issues.
|
|
7
|
+
*
|
|
8
|
+
* V4 improvements over V3:
|
|
9
|
+
* - Operates on CodeUnit IR (definitions, references, imports) instead of regex
|
|
10
|
+
* - Cross-unit analysis for referenced-but-undefined symbols
|
|
11
|
+
* - Structural analysis using definitions/references instead of source text
|
|
12
|
+
* - Dramatically reduced false positives
|
|
13
|
+
*
|
|
14
|
+
* @since 0.4.0
|
|
15
|
+
*/
|
|
16
|
+
// ─── Detector ──────────────────────────────────────────────────────
|
|
17
|
+
export class ContextCoherenceDetector {
|
|
18
|
+
id = 'context-coherence';
|
|
19
|
+
name = 'Context Coherence Detector';
|
|
20
|
+
category = 'context-coherence';
|
|
21
|
+
supportedLanguages = [];
|
|
22
|
+
async detect(units, context) {
|
|
23
|
+
const results = [];
|
|
24
|
+
// Analysis 1: Unused non-exported definitions
|
|
25
|
+
this.detectUnusedDefinitions(units, results);
|
|
26
|
+
// Analysis 2: Inconsistent import patterns within same file
|
|
27
|
+
this.detectInconsistentImports(units, results);
|
|
28
|
+
// Analysis 3: Duplicate function names in same scope
|
|
29
|
+
this.detectDuplicateFunctionNames(units, results);
|
|
30
|
+
// Analysis 4: Referenced but undefined symbols (cross-unit)
|
|
31
|
+
this.detectUndefinedReferences(units, results);
|
|
32
|
+
return results;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Analysis 1: Detect functions/classes/types defined but never used and not exported.
|
|
36
|
+
*
|
|
37
|
+
* AI models sometimes define helper functions that are never called,
|
|
38
|
+
* or define types/interfaces that are never used — a sign of context loss.
|
|
39
|
+
*/
|
|
40
|
+
detectUnusedDefinitions(units, results) {
|
|
41
|
+
// Build a set of all referenced symbol names across all units
|
|
42
|
+
const allReferencedNames = new Set();
|
|
43
|
+
const allCalledNames = new Set();
|
|
44
|
+
for (const unit of units) {
|
|
45
|
+
for (const ref of unit.references) {
|
|
46
|
+
allReferencedNames.add(ref.name);
|
|
47
|
+
}
|
|
48
|
+
for (const call of unit.calls) {
|
|
49
|
+
allCalledNames.add(call.method);
|
|
50
|
+
if (call.callee) {
|
|
51
|
+
allCalledNames.add(call.callee);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// Also count imports as usage context
|
|
55
|
+
for (const imp of unit.imports) {
|
|
56
|
+
for (const sym of imp.symbols) {
|
|
57
|
+
allReferencedNames.add(sym);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Check each definition
|
|
62
|
+
for (const unit of units) {
|
|
63
|
+
for (const def of unit.definitions) {
|
|
64
|
+
// Skip exported definitions — they're intended for external use
|
|
65
|
+
if (def.exported)
|
|
66
|
+
continue;
|
|
67
|
+
// Only flag functions, classes, types, interfaces
|
|
68
|
+
if (!['function', 'class', 'type', 'interface'].includes(def.kind))
|
|
69
|
+
continue;
|
|
70
|
+
// Check if the symbol is referenced anywhere
|
|
71
|
+
const isReferenced = allReferencedNames.has(def.name) || allCalledNames.has(def.name);
|
|
72
|
+
if (!isReferenced) {
|
|
73
|
+
results.push({
|
|
74
|
+
detectorId: this.id,
|
|
75
|
+
severity: 'info',
|
|
76
|
+
category: this.category,
|
|
77
|
+
messageKey: 'context-coherence.unused-definition',
|
|
78
|
+
message: `${this.capitalizeKind(def.kind)} "${def.name}" is defined but never used and not exported. This may indicate a context window issue.`,
|
|
79
|
+
file: unit.file,
|
|
80
|
+
line: def.line + 1, // 0-based to 1-based
|
|
81
|
+
confidence: 0.6,
|
|
82
|
+
metadata: {
|
|
83
|
+
symbolName: def.name,
|
|
84
|
+
symbolKind: def.kind,
|
|
85
|
+
analysisType: 'unused-definition',
|
|
86
|
+
},
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Analysis 2: Detect inconsistent import patterns within the same file.
|
|
94
|
+
*
|
|
95
|
+
* When AI loses context mid-generation, it may import the same functionality
|
|
96
|
+
* from different modules in different parts of the file. For example:
|
|
97
|
+
* - import { readFile } from 'fs' AND import { readFile } from 'fs/promises'
|
|
98
|
+
* - import lodash AND import underscore (same purpose)
|
|
99
|
+
*/
|
|
100
|
+
detectInconsistentImports(units, results) {
|
|
101
|
+
for (const unit of units) {
|
|
102
|
+
if (unit.kind !== 'file')
|
|
103
|
+
continue;
|
|
104
|
+
if (unit.imports.length < 2)
|
|
105
|
+
continue;
|
|
106
|
+
// Check for duplicate symbol imports from different modules
|
|
107
|
+
const symbolToModules = new Map();
|
|
108
|
+
for (const imp of unit.imports) {
|
|
109
|
+
for (const sym of imp.symbols) {
|
|
110
|
+
if (!symbolToModules.has(sym)) {
|
|
111
|
+
symbolToModules.set(sym, []);
|
|
112
|
+
}
|
|
113
|
+
symbolToModules.get(sym).push({ module: imp.module, line: imp.line });
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
for (const [symbol, sources] of symbolToModules.entries()) {
|
|
117
|
+
// Get unique modules importing the same symbol
|
|
118
|
+
const uniqueModules = [...new Set(sources.map(s => s.module))];
|
|
119
|
+
if (uniqueModules.length > 1) {
|
|
120
|
+
results.push({
|
|
121
|
+
detectorId: this.id,
|
|
122
|
+
severity: 'warning',
|
|
123
|
+
category: this.category,
|
|
124
|
+
messageKey: 'context-coherence.inconsistent-import',
|
|
125
|
+
message: `Symbol "${symbol}" is imported from multiple modules: ${uniqueModules.map(m => `"${m}"`).join(', ')}. This may indicate a context window inconsistency.`,
|
|
126
|
+
file: unit.file,
|
|
127
|
+
line: sources[1].line + 1, // Report on the second occurrence
|
|
128
|
+
confidence: 0.75,
|
|
129
|
+
metadata: {
|
|
130
|
+
symbol,
|
|
131
|
+
modules: uniqueModules,
|
|
132
|
+
analysisType: 'inconsistent-import',
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Analysis 3: Detect duplicate function names in the same scope.
|
|
141
|
+
*
|
|
142
|
+
* AI may re-define the same function name multiple times in a file
|
|
143
|
+
* when it loses track of what it has already generated.
|
|
144
|
+
*/
|
|
145
|
+
detectDuplicateFunctionNames(units, results) {
|
|
146
|
+
// Group units by parent (same scope) and file
|
|
147
|
+
const scopeMap = new Map();
|
|
148
|
+
for (const unit of units) {
|
|
149
|
+
// Group functions/methods by their parent scope
|
|
150
|
+
if (unit.kind === 'function' || unit.kind === 'method') {
|
|
151
|
+
const scopeKey = `${unit.file}:${unit.parentId || 'file'}`;
|
|
152
|
+
if (!scopeMap.has(scopeKey)) {
|
|
153
|
+
scopeMap.set(scopeKey, []);
|
|
154
|
+
}
|
|
155
|
+
scopeMap.get(scopeKey).push(unit);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
for (const [, scopeUnits] of scopeMap) {
|
|
159
|
+
const nameToUnits = this.groupByFunctionName(scopeUnits);
|
|
160
|
+
this.reportDuplicates(nameToUnits, results);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/** Group code units by their function/method definition names. */
|
|
164
|
+
groupByFunctionName(scopeUnits) {
|
|
165
|
+
const nameToUnits = new Map();
|
|
166
|
+
for (const unit of scopeUnits) {
|
|
167
|
+
for (const def of unit.definitions) {
|
|
168
|
+
if (def.kind !== 'function' && def.kind !== 'method')
|
|
169
|
+
continue;
|
|
170
|
+
if (!nameToUnits.has(def.name))
|
|
171
|
+
nameToUnits.set(def.name, []);
|
|
172
|
+
nameToUnits.get(def.name).push(unit);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return nameToUnits;
|
|
176
|
+
}
|
|
177
|
+
/** Report duplicate function definitions within the same scope. */
|
|
178
|
+
reportDuplicates(nameToUnits, results) {
|
|
179
|
+
for (const [name, duplicateUnits] of nameToUnits) {
|
|
180
|
+
if (duplicateUnits.length <= 1)
|
|
181
|
+
continue;
|
|
182
|
+
for (let i = 1; i < duplicateUnits.length; i++) {
|
|
183
|
+
const unit = duplicateUnits[i];
|
|
184
|
+
results.push({
|
|
185
|
+
detectorId: this.id,
|
|
186
|
+
severity: 'warning',
|
|
187
|
+
category: this.category,
|
|
188
|
+
messageKey: 'context-coherence.duplicate-function',
|
|
189
|
+
message: `Function "${name}" is defined ${duplicateUnits.length} times in the same scope. This likely indicates an AI context window issue.`,
|
|
190
|
+
file: unit.file,
|
|
191
|
+
line: unit.location.startLine + 1,
|
|
192
|
+
confidence: 0.85,
|
|
193
|
+
metadata: {
|
|
194
|
+
functionName: name,
|
|
195
|
+
occurrences: duplicateUnits.length,
|
|
196
|
+
analysisType: 'duplicate-function',
|
|
197
|
+
},
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Analysis 4: Detect referenced but undefined symbols across units within a file.
|
|
204
|
+
*
|
|
205
|
+
* If a symbol is referenced but never defined (and not imported),
|
|
206
|
+
* the AI may have "forgotten" to include the definition.
|
|
207
|
+
*/
|
|
208
|
+
detectUndefinedReferences(units, results) {
|
|
209
|
+
// Group units by file
|
|
210
|
+
const fileUnits = new Map();
|
|
211
|
+
for (const unit of units) {
|
|
212
|
+
if (!fileUnits.has(unit.file)) {
|
|
213
|
+
fileUnits.set(unit.file, []);
|
|
214
|
+
}
|
|
215
|
+
fileUnits.get(unit.file).push(unit);
|
|
216
|
+
}
|
|
217
|
+
for (const [file, fileUnitList] of fileUnits) {
|
|
218
|
+
// Collect all definitions and imports in this file
|
|
219
|
+
const definedNames = new Set();
|
|
220
|
+
const importedNames = new Set();
|
|
221
|
+
for (const unit of fileUnitList) {
|
|
222
|
+
for (const def of unit.definitions) {
|
|
223
|
+
definedNames.add(def.name);
|
|
224
|
+
}
|
|
225
|
+
for (const imp of unit.imports) {
|
|
226
|
+
for (const sym of imp.symbols) {
|
|
227
|
+
importedNames.add(sym);
|
|
228
|
+
}
|
|
229
|
+
// Whole module imports
|
|
230
|
+
if (imp.symbols.length === 0) {
|
|
231
|
+
// The module name itself is available
|
|
232
|
+
const parts = imp.module.split(/[./]/);
|
|
233
|
+
importedNames.add(parts[parts.length - 1]);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
// Check for unresolved references
|
|
238
|
+
for (const unit of fileUnitList) {
|
|
239
|
+
for (const ref of unit.references) {
|
|
240
|
+
if (ref.resolved)
|
|
241
|
+
continue; // Already resolved by the parser
|
|
242
|
+
if (definedNames.has(ref.name))
|
|
243
|
+
continue;
|
|
244
|
+
if (importedNames.has(ref.name))
|
|
245
|
+
continue;
|
|
246
|
+
// Common globals that should not be flagged
|
|
247
|
+
if (this.isWellKnownGlobal(ref.name, unit.language))
|
|
248
|
+
continue;
|
|
249
|
+
results.push({
|
|
250
|
+
detectorId: this.id,
|
|
251
|
+
severity: 'warning',
|
|
252
|
+
category: this.category,
|
|
253
|
+
messageKey: 'context-coherence.undefined-reference',
|
|
254
|
+
message: `Symbol "${ref.name}" is referenced but never defined or imported in file "${file}". The AI may have lost context.`,
|
|
255
|
+
file,
|
|
256
|
+
line: ref.line + 1, // 0-based to 1-based
|
|
257
|
+
confidence: 0.7,
|
|
258
|
+
metadata: {
|
|
259
|
+
symbolName: ref.name,
|
|
260
|
+
analysisType: 'undefined-reference',
|
|
261
|
+
},
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Check if a name is a well-known global (e.g., console, window, process).
|
|
269
|
+
*/
|
|
270
|
+
isWellKnownGlobal(name, language) {
|
|
271
|
+
const globals = {
|
|
272
|
+
typescript: new Set([
|
|
273
|
+
'console', 'window', 'document', 'process', 'global', 'globalThis',
|
|
274
|
+
'setTimeout', 'setInterval', 'clearTimeout', 'clearInterval',
|
|
275
|
+
'Promise', 'Map', 'Set', 'Array', 'Object', 'String', 'Number',
|
|
276
|
+
'Boolean', 'Error', 'JSON', 'Math', 'Date', 'RegExp', 'Symbol',
|
|
277
|
+
'undefined', 'null', 'NaN', 'Infinity', 'Buffer', 'require',
|
|
278
|
+
'module', 'exports', '__dirname', '__filename',
|
|
279
|
+
]),
|
|
280
|
+
javascript: new Set([
|
|
281
|
+
'console', 'window', 'document', 'process', 'global', 'globalThis',
|
|
282
|
+
'setTimeout', 'setInterval', 'clearTimeout', 'clearInterval',
|
|
283
|
+
'Promise', 'Map', 'Set', 'Array', 'Object', 'String', 'Number',
|
|
284
|
+
'Boolean', 'Error', 'JSON', 'Math', 'Date', 'RegExp', 'Symbol',
|
|
285
|
+
'undefined', 'null', 'NaN', 'Infinity', 'Buffer', 'require',
|
|
286
|
+
'module', 'exports', '__dirname', '__filename',
|
|
287
|
+
]),
|
|
288
|
+
python: new Set([
|
|
289
|
+
'print', 'len', 'range', 'type', 'str', 'int', 'float', 'list',
|
|
290
|
+
'dict', 'set', 'tuple', 'bool', 'None', 'True', 'False',
|
|
291
|
+
'isinstance', 'issubclass', 'super', 'self', 'cls',
|
|
292
|
+
'Exception', 'ValueError', 'TypeError', 'KeyError',
|
|
293
|
+
]),
|
|
294
|
+
java: new Set([
|
|
295
|
+
'System', 'String', 'Integer', 'Long', 'Double', 'Float',
|
|
296
|
+
'Object', 'Class', 'Exception', 'RuntimeException',
|
|
297
|
+
'this', 'super', 'null', 'true', 'false',
|
|
298
|
+
]),
|
|
299
|
+
go: new Set([
|
|
300
|
+
'fmt', 'error', 'nil', 'true', 'false', 'make', 'len', 'cap',
|
|
301
|
+
'append', 'copy', 'delete', 'new', 'panic', 'recover', 'close',
|
|
302
|
+
'string', 'int', 'int64', 'float64', 'bool', 'byte', 'rune',
|
|
303
|
+
]),
|
|
304
|
+
kotlin: new Set([
|
|
305
|
+
'println', 'print', 'this', 'super', 'null', 'true', 'false',
|
|
306
|
+
'String', 'Int', 'Long', 'Double', 'Float', 'Boolean',
|
|
307
|
+
'Any', 'Unit', 'Nothing', 'it', 'listOf', 'mapOf', 'setOf',
|
|
308
|
+
]),
|
|
309
|
+
};
|
|
310
|
+
return globals[language]?.has(name) ?? false;
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Capitalize a symbol kind for display.
|
|
314
|
+
*/
|
|
315
|
+
capitalizeKind(kind) {
|
|
316
|
+
return kind.charAt(0).toUpperCase() + kind.slice(1);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
//# sourceMappingURL=context-coherence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-coherence.js","sourceRoot":"","sources":["../../../src/detectors/v4/context-coherence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HallucinatedImportDetector — V4 detector for hallucinated imports.
|
|
3
|
+
*
|
|
4
|
+
* Detects imports of packages/modules that don't exist in the package registry.
|
|
5
|
+
* This is THE core differentiator of Open Code Review: AI code generators
|
|
6
|
+
* frequently hallucinate package names that look plausible but don't exist.
|
|
7
|
+
*
|
|
8
|
+
* V4 improvements over V3:
|
|
9
|
+
* - Uses dynamic registry verification (npm, PyPI, Maven, Go proxy) instead of hardcoded whitelists
|
|
10
|
+
* - Operates on CodeUnit IR instead of raw source
|
|
11
|
+
* - Language-aware built-in module filtering
|
|
12
|
+
* - Batch verification to minimize HTTP calls
|
|
13
|
+
*
|
|
14
|
+
* @since 0.4.0
|
|
15
|
+
*/
|
|
16
|
+
import type { CodeUnit, SupportedLanguage } from '../../ir/types.js';
|
|
17
|
+
import type { V4Detector, DetectorResult, DetectorCategory, DetectorContext } from './types.js';
|
|
18
|
+
/** Tracks an import occurrence for hallucination detection. */
|
|
19
|
+
export interface ImportOccurrence {
|
|
20
|
+
file: string;
|
|
21
|
+
line: number;
|
|
22
|
+
raw: string;
|
|
23
|
+
}
|
|
24
|
+
export declare class HallucinatedImportDetector implements V4Detector {
|
|
25
|
+
readonly id = "hallucinated-import";
|
|
26
|
+
readonly name = "Hallucinated Import Detector";
|
|
27
|
+
readonly category: DetectorCategory;
|
|
28
|
+
readonly supportedLanguages: SupportedLanguage[];
|
|
29
|
+
detect(units: CodeUnit[], context: DetectorContext): Promise<DetectorResult[]>;
|
|
30
|
+
/**
|
|
31
|
+
* Group imports from all CodeUnits by language and package name.
|
|
32
|
+
* Returns Map<language, Map<packageName, occurrences[]>>.
|
|
33
|
+
*/
|
|
34
|
+
private groupImportsByLanguage;
|
|
35
|
+
/**
|
|
36
|
+
* Extract the top-level package name from an import path.
|
|
37
|
+
* - npm: "lodash/fp" → "lodash", "@scope/name/sub" → "@scope/name"
|
|
38
|
+
* - python: "flask.blueprints" → "flask"
|
|
39
|
+
* - java: "com.google.gson.Gson" → "com.google.gson"
|
|
40
|
+
* - go: "github.com/gin-gonic/gin/binding" → "github.com/gin-gonic/gin"
|
|
41
|
+
*/
|
|
42
|
+
private extractPackageName;
|
|
43
|
+
/**
|
|
44
|
+
* Check if an import is a language built-in module.
|
|
45
|
+
*/
|
|
46
|
+
private isBuiltin;
|
|
47
|
+
/**
|
|
48
|
+
* Get a human-readable registry name for a language.
|
|
49
|
+
*/
|
|
50
|
+
private getRegistryName;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=hallucinated-import.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hallucinated-import.d.ts","sourceRoot":"","sources":["../../../src/detectors/v4/hallucinated-import.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,iBAAiB,EAAc,MAAM,mBAAmB,CAAC;AACjF,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAoBhG,+DAA+D;AAC/D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAID,qBAAa,0BAA2B,YAAW,UAAU;IAC3D,QAAQ,CAAC,EAAE,yBAAyB;IACpC,QAAQ,CAAC,IAAI,kCAAkC;IAC/C,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAqB;IACxD,QAAQ,CAAC,kBAAkB,EAAE,iBAAiB,EAAE,CAAM;IAEhD,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IA+DpF;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAkC9B;;;;;;OAMG;IACH,OAAO,CAAC,kBAAkB;IAyC1B;;OAEG;IACH,OAAO,CAAC,SAAS;IA0BjB;;OAEG;IACH,OAAO,CAAC,eAAe;CAgBxB"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HallucinatedImportDetector — V4 detector for hallucinated imports.
|
|
3
|
+
*
|
|
4
|
+
* Detects imports of packages/modules that don't exist in the package registry.
|
|
5
|
+
* This is THE core differentiator of Open Code Review: AI code generators
|
|
6
|
+
* frequently hallucinate package names that look plausible but don't exist.
|
|
7
|
+
*
|
|
8
|
+
* V4 improvements over V3:
|
|
9
|
+
* - Uses dynamic registry verification (npm, PyPI, Maven, Go proxy) instead of hardcoded whitelists
|
|
10
|
+
* - Operates on CodeUnit IR instead of raw source
|
|
11
|
+
* - Language-aware built-in module filtering
|
|
12
|
+
* - Batch verification to minimize HTTP calls
|
|
13
|
+
*
|
|
14
|
+
* @since 0.4.0
|
|
15
|
+
*/
|
|
16
|
+
import { NODE_BUILTINS } from '../../registry/builtins/node-builtins.js';
|
|
17
|
+
import { PYTHON_BUILTINS } from '../../registry/builtins/python-builtins.js';
|
|
18
|
+
import { JAVA_BUILTINS } from '../../registry/builtins/java-builtins.js';
|
|
19
|
+
import { GO_BUILTINS } from '../../registry/builtins/go-builtins.js';
|
|
20
|
+
import { KOTLIN_BUILTINS } from '../../registry/builtins/kotlin-builtins.js';
|
|
21
|
+
// ─── Built-in module sets by language ──────────────────────────────
|
|
22
|
+
const BUILTIN_SETS = {
|
|
23
|
+
typescript: NODE_BUILTINS,
|
|
24
|
+
javascript: NODE_BUILTINS,
|
|
25
|
+
python: PYTHON_BUILTINS,
|
|
26
|
+
java: JAVA_BUILTINS,
|
|
27
|
+
go: GO_BUILTINS,
|
|
28
|
+
kotlin: KOTLIN_BUILTINS,
|
|
29
|
+
};
|
|
30
|
+
// ─── Detector ──────────────────────────────────────────────────────
|
|
31
|
+
export class HallucinatedImportDetector {
|
|
32
|
+
id = 'hallucinated-import';
|
|
33
|
+
name = 'Hallucinated Import Detector';
|
|
34
|
+
category = 'ai-faithfulness';
|
|
35
|
+
supportedLanguages = []; // All languages
|
|
36
|
+
async detect(units, context) {
|
|
37
|
+
// If no registry manager is provided (offline mode), skip detection
|
|
38
|
+
if (!context.registryManager) {
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
41
|
+
const results = [];
|
|
42
|
+
// Group imports by language, deduplicating by package name
|
|
43
|
+
const importsByLanguage = this.groupImportsByLanguage(units);
|
|
44
|
+
for (const [language, packageMap] of importsByLanguage.entries()) {
|
|
45
|
+
const builtins = BUILTIN_SETS[language];
|
|
46
|
+
if (!builtins)
|
|
47
|
+
continue;
|
|
48
|
+
// Collect non-relative, non-builtin package names
|
|
49
|
+
const packagesToVerify = [];
|
|
50
|
+
for (const [packageName] of packageMap) {
|
|
51
|
+
if (!this.isBuiltin(packageName, language, builtins)) {
|
|
52
|
+
packagesToVerify.push(packageName);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (packagesToVerify.length === 0)
|
|
56
|
+
continue;
|
|
57
|
+
// Batch verify against registry
|
|
58
|
+
const verifyResults = await context.registryManager.verifyBatch(language, packagesToVerify);
|
|
59
|
+
// Generate results for packages that don't exist
|
|
60
|
+
for (const [packageName, verifyResult] of verifyResults.entries()) {
|
|
61
|
+
if (!verifyResult.exists) {
|
|
62
|
+
const occurrences = packageMap.get(packageName);
|
|
63
|
+
if (!occurrences)
|
|
64
|
+
continue;
|
|
65
|
+
// Create a result for each occurrence
|
|
66
|
+
for (const occurrence of occurrences) {
|
|
67
|
+
results.push({
|
|
68
|
+
detectorId: this.id,
|
|
69
|
+
severity: 'error',
|
|
70
|
+
category: this.category,
|
|
71
|
+
messageKey: 'hallucinated-import.package-not-found',
|
|
72
|
+
message: `Import "${packageName}" does not exist in the ${this.getRegistryName(language)} registry. This may be a hallucinated package name.`,
|
|
73
|
+
file: occurrence.file,
|
|
74
|
+
line: occurrence.line + 1, // Convert 0-based to 1-based
|
|
75
|
+
confidence: 0.9,
|
|
76
|
+
metadata: {
|
|
77
|
+
packageName,
|
|
78
|
+
language,
|
|
79
|
+
registry: this.getRegistryName(language),
|
|
80
|
+
raw: occurrence.raw,
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return results;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Group imports from all CodeUnits by language and package name.
|
|
91
|
+
* Returns Map<language, Map<packageName, occurrences[]>>.
|
|
92
|
+
*/
|
|
93
|
+
groupImportsByLanguage(units) {
|
|
94
|
+
const result = new Map();
|
|
95
|
+
for (const unit of units) {
|
|
96
|
+
// Only process file-level units (imports are at file level)
|
|
97
|
+
if (unit.kind !== 'file')
|
|
98
|
+
continue;
|
|
99
|
+
for (const imp of unit.imports) {
|
|
100
|
+
// Skip relative imports
|
|
101
|
+
if (imp.isRelative)
|
|
102
|
+
continue;
|
|
103
|
+
const packageName = this.extractPackageName(imp.module, unit.language);
|
|
104
|
+
if (!result.has(unit.language)) {
|
|
105
|
+
result.set(unit.language, new Map());
|
|
106
|
+
}
|
|
107
|
+
const langMap = result.get(unit.language);
|
|
108
|
+
if (!langMap.has(packageName)) {
|
|
109
|
+
langMap.set(packageName, []);
|
|
110
|
+
}
|
|
111
|
+
langMap.get(packageName).push({
|
|
112
|
+
file: unit.file,
|
|
113
|
+
line: imp.line,
|
|
114
|
+
raw: imp.raw,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return result;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Extract the top-level package name from an import path.
|
|
122
|
+
* - npm: "lodash/fp" → "lodash", "@scope/name/sub" → "@scope/name"
|
|
123
|
+
* - python: "flask.blueprints" → "flask"
|
|
124
|
+
* - java: "com.google.gson.Gson" → "com.google.gson"
|
|
125
|
+
* - go: "github.com/gin-gonic/gin/binding" → "github.com/gin-gonic/gin"
|
|
126
|
+
*/
|
|
127
|
+
extractPackageName(module, language) {
|
|
128
|
+
switch (language) {
|
|
129
|
+
case 'typescript':
|
|
130
|
+
case 'javascript': {
|
|
131
|
+
// Scoped packages: @scope/name
|
|
132
|
+
if (module.startsWith('@')) {
|
|
133
|
+
const parts = module.split('/');
|
|
134
|
+
return parts.length >= 2 ? `${parts[0]}/${parts[1]}` : module;
|
|
135
|
+
}
|
|
136
|
+
// Regular packages: name/subpath → name
|
|
137
|
+
return module.split('/')[0];
|
|
138
|
+
}
|
|
139
|
+
case 'python': {
|
|
140
|
+
// Python: package.submodule → package
|
|
141
|
+
return module.split('.')[0];
|
|
142
|
+
}
|
|
143
|
+
case 'java':
|
|
144
|
+
case 'kotlin': {
|
|
145
|
+
// Java/Kotlin: use the full module path as-is for registry lookup
|
|
146
|
+
// The registry adapter handles groupId:artifactId mapping
|
|
147
|
+
return module;
|
|
148
|
+
}
|
|
149
|
+
case 'go': {
|
|
150
|
+
// Go: github.com/user/repo/subpkg → github.com/user/repo
|
|
151
|
+
const parts = module.split('/');
|
|
152
|
+
if (parts.length >= 3 && module.includes('.')) {
|
|
153
|
+
// Looks like a URL-based import: take first 3 segments
|
|
154
|
+
return parts.slice(0, 3).join('/');
|
|
155
|
+
}
|
|
156
|
+
// Standard library or short path
|
|
157
|
+
return parts[0];
|
|
158
|
+
}
|
|
159
|
+
default:
|
|
160
|
+
return module;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Check if an import is a language built-in module.
|
|
165
|
+
*/
|
|
166
|
+
isBuiltin(packageName, language, builtins) {
|
|
167
|
+
// Direct match
|
|
168
|
+
if (builtins.has(packageName))
|
|
169
|
+
return true;
|
|
170
|
+
// For Java/Kotlin, check prefix match (e.g., "java.util.List" matches "java.util")
|
|
171
|
+
if (language === 'java' || language === 'kotlin') {
|
|
172
|
+
for (const builtin of builtins) {
|
|
173
|
+
if (packageName.startsWith(builtin + '.') || packageName === builtin) {
|
|
174
|
+
return true;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// For Go, check prefix match (e.g., "net/http" matches "net")
|
|
179
|
+
if (language === 'go') {
|
|
180
|
+
const topLevel = packageName.split('/')[0];
|
|
181
|
+
if (builtins.has(topLevel))
|
|
182
|
+
return true;
|
|
183
|
+
}
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Get a human-readable registry name for a language.
|
|
188
|
+
*/
|
|
189
|
+
getRegistryName(language) {
|
|
190
|
+
switch (language) {
|
|
191
|
+
case 'typescript':
|
|
192
|
+
case 'javascript':
|
|
193
|
+
return 'npm';
|
|
194
|
+
case 'python':
|
|
195
|
+
return 'PyPI';
|
|
196
|
+
case 'java':
|
|
197
|
+
case 'kotlin':
|
|
198
|
+
return 'Maven Central';
|
|
199
|
+
case 'go':
|
|
200
|
+
return 'Go module proxy';
|
|
201
|
+
default:
|
|
202
|
+
return 'package';
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=hallucinated-import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hallucinated-import.js","sourceRoot":"","sources":["../../../src/detectors/v4/hallucinated-import.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* V4 Detector Module — AI-unique detectors operating on CodeUnit IR.
|
|
3
|
+
*
|
|
4
|
+
* V4 keeps only detectors that target AI-specific code quality issues:
|
|
5
|
+
* - HallucinatedImportDetector: Detects imports of non-existent packages
|
|
6
|
+
* - StaleAPIDetector: Detects deprecated/outdated API usage
|
|
7
|
+
* - ContextCoherenceDetector: Detects AI context window inconsistencies
|
|
8
|
+
* - OverEngineeringDetector: Detects over-engineered code patterns
|
|
9
|
+
* - SecurityPatternDetector: Detects security anti-patterns common in AI code
|
|
10
|
+
*
|
|
11
|
+
* Traditional lint concerns (duplication, type safety) are excluded.
|
|
12
|
+
*
|
|
13
|
+
* @since 0.4.0
|
|
14
|
+
*/
|
|
15
|
+
export type { V4Detector, DetectorResult as V4DetectorResult, DetectorCategory, DetectorContext, } from './types.js';
|
|
16
|
+
export { HallucinatedImportDetector } from './hallucinated-import.js';
|
|
17
|
+
export { StaleAPIDetector } from './stale-api.js';
|
|
18
|
+
export { ContextCoherenceDetector } from './context-coherence.js';
|
|
19
|
+
export { OverEngineeringDetector } from './over-engineering.js';
|
|
20
|
+
export { SecurityPatternDetector } from './security-pattern.js';
|
|
21
|
+
import type { V4Detector } from './types.js';
|
|
22
|
+
/**
|
|
23
|
+
* Create all V4 detectors with default configuration.
|
|
24
|
+
*
|
|
25
|
+
* @returns Array of all V4 detector instances
|
|
26
|
+
*/
|
|
27
|
+
export declare function createV4Detectors(): V4Detector[];
|
|
28
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/detectors/v4/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,YAAY,EACV,UAAU,EACV,cAAc,IAAI,gBAAgB,EAClC,gBAAgB,EAChB,eAAe,GAChB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAIhE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAO7C;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,UAAU,EAAE,CAQhD"}
|