@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,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI AI Provider
|
|
3
|
+
*
|
|
4
|
+
* Remote AI provider using OpenAI-compatible API for code analysis.
|
|
5
|
+
* Uses native fetch (no SDK dependency).
|
|
6
|
+
*
|
|
7
|
+
* Supports any OpenAI-compatible endpoint (OpenAI, Azure, local proxies).
|
|
8
|
+
*
|
|
9
|
+
* @since 0.3.0
|
|
10
|
+
*/
|
|
11
|
+
import { buildAnalysisPrompt, mapRawCategory, mapRawSeverity } from './prompts.js';
|
|
12
|
+
// ─── OpenAI Provider ───────────────────────────────────────────────
|
|
13
|
+
export class OpenAIProvider {
|
|
14
|
+
name = 'openai';
|
|
15
|
+
type = 'remote';
|
|
16
|
+
apiKey;
|
|
17
|
+
model;
|
|
18
|
+
endpoint;
|
|
19
|
+
timeoutMs;
|
|
20
|
+
constructor(options) {
|
|
21
|
+
this.apiKey = options?.apiKey || process.env.OPENAI_API_KEY || '';
|
|
22
|
+
this.model = options?.model || 'gpt-4o-mini';
|
|
23
|
+
this.endpoint = options?.endpoint || 'https://api.openai.com/v1';
|
|
24
|
+
this.timeoutMs = options?.timeoutMs || 60_000;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Check if an API key is configured.
|
|
28
|
+
* Does not make a network call — just verifies the key is present.
|
|
29
|
+
*/
|
|
30
|
+
async isAvailable() {
|
|
31
|
+
return !!this.apiKey;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Analyze code using OpenAI Chat Completions API.
|
|
35
|
+
* Uses JSON mode for structured output.
|
|
36
|
+
*/
|
|
37
|
+
async analyze(request) {
|
|
38
|
+
if (!this.apiKey) {
|
|
39
|
+
throw new Error('OpenAI API key is not configured');
|
|
40
|
+
}
|
|
41
|
+
const startTime = Date.now();
|
|
42
|
+
const prompt = buildAnalysisPrompt(request.files, request.mode);
|
|
43
|
+
const controller = new AbortController();
|
|
44
|
+
const timeout = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
45
|
+
try {
|
|
46
|
+
const res = await fetch(`${this.endpoint}/chat/completions`, {
|
|
47
|
+
method: 'POST',
|
|
48
|
+
headers: {
|
|
49
|
+
'Content-Type': 'application/json',
|
|
50
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
51
|
+
},
|
|
52
|
+
body: JSON.stringify({
|
|
53
|
+
model: this.model,
|
|
54
|
+
messages: [
|
|
55
|
+
{
|
|
56
|
+
role: 'system',
|
|
57
|
+
content: 'You are an expert code reviewer. Always respond with valid JSON matching the requested format.',
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
role: 'user',
|
|
61
|
+
content: prompt,
|
|
62
|
+
},
|
|
63
|
+
],
|
|
64
|
+
response_format: { type: 'json_object' },
|
|
65
|
+
temperature: 0.1,
|
|
66
|
+
max_tokens: 4096,
|
|
67
|
+
}),
|
|
68
|
+
signal: controller.signal,
|
|
69
|
+
});
|
|
70
|
+
clearTimeout(timeout);
|
|
71
|
+
if (!res.ok) {
|
|
72
|
+
const errText = await res.text().catch(() => 'unknown error');
|
|
73
|
+
throw new Error(`OpenAI API error ${res.status}: ${errText}`);
|
|
74
|
+
}
|
|
75
|
+
const data = (await res.json());
|
|
76
|
+
const content = data.choices?.[0]?.message?.content || '{}';
|
|
77
|
+
const issues = this.parseResponse(content, request);
|
|
78
|
+
const durationMs = Date.now() - startTime;
|
|
79
|
+
return {
|
|
80
|
+
issues,
|
|
81
|
+
model: this.model,
|
|
82
|
+
tokensUsed: data.usage?.total_tokens || 0,
|
|
83
|
+
durationMs,
|
|
84
|
+
provider: this.name,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
clearTimeout(timeout);
|
|
89
|
+
throw err;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// ─── Response Parsing ────────────────────────────────────────────
|
|
93
|
+
/**
|
|
94
|
+
* Parse the OpenAI JSON response into UnifiedIssue array.
|
|
95
|
+
*/
|
|
96
|
+
parseResponse(content, request) {
|
|
97
|
+
try {
|
|
98
|
+
const parsed = JSON.parse(content);
|
|
99
|
+
if (!parsed.issues || !Array.isArray(parsed.issues)) {
|
|
100
|
+
return [];
|
|
101
|
+
}
|
|
102
|
+
const validFiles = new Set(request.files.map((f) => f.path));
|
|
103
|
+
return parsed.issues
|
|
104
|
+
.filter((raw) => raw.file &&
|
|
105
|
+
raw.line &&
|
|
106
|
+
raw.message &&
|
|
107
|
+
raw.category &&
|
|
108
|
+
raw.severity &&
|
|
109
|
+
validFiles.has(raw.file))
|
|
110
|
+
.map((raw, index) => this.rawToUnifiedIssue(raw, index));
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return [];
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Convert a raw AI issue to a UnifiedIssue.
|
|
118
|
+
*/
|
|
119
|
+
rawToUnifiedIssue(raw, index) {
|
|
120
|
+
const category = mapRawCategory(raw.category);
|
|
121
|
+
const severity = mapRawSeverity(raw.severity);
|
|
122
|
+
return {
|
|
123
|
+
id: `ai-openai:${index}`,
|
|
124
|
+
detector: 'ai-analysis',
|
|
125
|
+
type: `ai-${category}`,
|
|
126
|
+
category,
|
|
127
|
+
severity,
|
|
128
|
+
message: raw.message,
|
|
129
|
+
file: raw.file,
|
|
130
|
+
line: raw.line,
|
|
131
|
+
suggestion: raw.fix,
|
|
132
|
+
confidence: 0.75,
|
|
133
|
+
detectionSource: 'ai',
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=openai-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-provider.js","sourceRoot":"","sources":["../../src/ai/openai-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Orchestrator
|
|
3
|
+
*
|
|
4
|
+
* Manages multiple AI providers and executes analysis according to
|
|
5
|
+
* the configured strategy (local-first, remote-first, etc.).
|
|
6
|
+
*
|
|
7
|
+
* Also provides result fusion — merging static analysis issues
|
|
8
|
+
* with AI-detected issues, deduplicating by file+line+category.
|
|
9
|
+
*
|
|
10
|
+
* @since 0.3.0
|
|
11
|
+
*/
|
|
12
|
+
import type { AIProvider, AIAnalysisRequest, AIAnalysisResponse, AIStrategy } from './types.js';
|
|
13
|
+
import type { UnifiedIssue } from '../types.js';
|
|
14
|
+
import type { AIConfig } from '../config/types.js';
|
|
15
|
+
export declare class AIOrchestrator {
|
|
16
|
+
private providers;
|
|
17
|
+
private strategy;
|
|
18
|
+
constructor(config?: AIConfig, strategy?: AIStrategy);
|
|
19
|
+
/**
|
|
20
|
+
* Initialize providers based on configuration.
|
|
21
|
+
*/
|
|
22
|
+
private initProviders;
|
|
23
|
+
/**
|
|
24
|
+
* Get the list of configured providers (for testing/inspection).
|
|
25
|
+
*/
|
|
26
|
+
getProviders(): readonly AIProvider[];
|
|
27
|
+
/**
|
|
28
|
+
* Get the current strategy.
|
|
29
|
+
*/
|
|
30
|
+
getStrategy(): AIStrategy;
|
|
31
|
+
/**
|
|
32
|
+
* Execute AI analysis according to the configured strategy.
|
|
33
|
+
*
|
|
34
|
+
* @returns Analysis response, or null if no provider could complete
|
|
35
|
+
*/
|
|
36
|
+
analyze(request: AIAnalysisRequest): Promise<AIAnalysisResponse | null>;
|
|
37
|
+
/**
|
|
38
|
+
* Try providers of the primary type first, falling back to secondary type.
|
|
39
|
+
*/
|
|
40
|
+
private tryWithFallback;
|
|
41
|
+
/**
|
|
42
|
+
* Try all providers of a given type until one succeeds.
|
|
43
|
+
*/
|
|
44
|
+
private tryProvidersByType;
|
|
45
|
+
/**
|
|
46
|
+
* Merge static analysis issues with AI-detected issues.
|
|
47
|
+
*
|
|
48
|
+
* Deduplication rules:
|
|
49
|
+
* - Same file + line (±3) + category → keep the one with higher severity
|
|
50
|
+
* - Static issues get detectionSource: 'static'
|
|
51
|
+
* - AI issues get detectionSource: 'ai'
|
|
52
|
+
* - Duplicates confirmed by both get detectionSource: 'both'
|
|
53
|
+
*
|
|
54
|
+
* @param staticIssues - Issues from static detectors (Tier 1/2)
|
|
55
|
+
* @param aiIssues - Issues from AI analysis (Tier 3)
|
|
56
|
+
* @returns Merged and deduplicated issue list
|
|
57
|
+
*/
|
|
58
|
+
static mergeResults(staticIssues: UnifiedIssue[], aiIssues: UnifiedIssue[]): UnifiedIssue[];
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=orchestrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/ai/orchestrator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EACV,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,UAAU,EACX,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,YAAY,EAAY,MAAM,aAAa,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAiBnD,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,QAAQ,CAAa;gBAEjB,MAAM,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,UAAU;IAKpD;;OAEG;IACH,OAAO,CAAC,aAAa;IAkCrB;;OAEG;IACH,YAAY,IAAI,SAAS,UAAU,EAAE;IAIrC;;OAEG;IACH,WAAW,IAAI,UAAU;IAIzB;;;;OAIG;IACG,OAAO,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAmB7E;;OAEG;YACW,eAAe;IAa7B;;OAEG;YACW,kBAAkB;IAuBhC;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,YAAY,CACjB,YAAY,EAAE,YAAY,EAAE,EAC5B,QAAQ,EAAE,YAAY,EAAE,GACvB,YAAY,EAAE;CA2DlB"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Orchestrator
|
|
3
|
+
*
|
|
4
|
+
* Manages multiple AI providers and executes analysis according to
|
|
5
|
+
* the configured strategy (local-first, remote-first, etc.).
|
|
6
|
+
*
|
|
7
|
+
* Also provides result fusion — merging static analysis issues
|
|
8
|
+
* with AI-detected issues, deduplicating by file+line+category.
|
|
9
|
+
*
|
|
10
|
+
* @since 0.3.0
|
|
11
|
+
*/
|
|
12
|
+
import { OllamaProvider } from './ollama-provider.js';
|
|
13
|
+
import { OpenAIProvider } from './openai-provider.js';
|
|
14
|
+
import { AnthropicProvider } from './anthropic-provider.js';
|
|
15
|
+
// ─── Severity ordering for comparison ──────────────────────────────
|
|
16
|
+
const SEVERITY_ORDER = {
|
|
17
|
+
critical: 5,
|
|
18
|
+
high: 4,
|
|
19
|
+
medium: 3,
|
|
20
|
+
low: 2,
|
|
21
|
+
info: 1,
|
|
22
|
+
};
|
|
23
|
+
// ─── AI Orchestrator ───────────────────────────────────────────────
|
|
24
|
+
export class AIOrchestrator {
|
|
25
|
+
providers = [];
|
|
26
|
+
strategy;
|
|
27
|
+
constructor(config, strategy) {
|
|
28
|
+
this.strategy = strategy || config?.strategy || 'local-first';
|
|
29
|
+
this.initProviders(config);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Initialize providers based on configuration.
|
|
33
|
+
*/
|
|
34
|
+
initProviders(config) {
|
|
35
|
+
// Local provider (Ollama)
|
|
36
|
+
if (config?.local?.enabled !== false) {
|
|
37
|
+
this.providers.push(new OllamaProvider({
|
|
38
|
+
endpoint: config?.local?.endpoint,
|
|
39
|
+
model: config?.local?.model,
|
|
40
|
+
}));
|
|
41
|
+
}
|
|
42
|
+
// Remote provider (OpenAI or Anthropic)
|
|
43
|
+
if (config?.remote?.enabled) {
|
|
44
|
+
const provider = config.remote.provider || 'openai';
|
|
45
|
+
if (provider === 'anthropic') {
|
|
46
|
+
this.providers.push(new AnthropicProvider({
|
|
47
|
+
apiKey: config.remote.apiKey,
|
|
48
|
+
model: config.remote.model,
|
|
49
|
+
}));
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
// Default to OpenAI-compatible
|
|
53
|
+
this.providers.push(new OpenAIProvider({
|
|
54
|
+
apiKey: config.remote.apiKey,
|
|
55
|
+
model: config.remote.model,
|
|
56
|
+
}));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get the list of configured providers (for testing/inspection).
|
|
62
|
+
*/
|
|
63
|
+
getProviders() {
|
|
64
|
+
return this.providers;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Get the current strategy.
|
|
68
|
+
*/
|
|
69
|
+
getStrategy() {
|
|
70
|
+
return this.strategy;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Execute AI analysis according to the configured strategy.
|
|
74
|
+
*
|
|
75
|
+
* @returns Analysis response, or null if no provider could complete
|
|
76
|
+
*/
|
|
77
|
+
async analyze(request) {
|
|
78
|
+
switch (this.strategy) {
|
|
79
|
+
case 'local-first':
|
|
80
|
+
return this.tryWithFallback(request, 'local', 'remote');
|
|
81
|
+
case 'remote-first':
|
|
82
|
+
return this.tryWithFallback(request, 'remote', 'local');
|
|
83
|
+
case 'local-only':
|
|
84
|
+
return this.tryProvidersByType(request, 'local');
|
|
85
|
+
case 'remote-only':
|
|
86
|
+
return this.tryProvidersByType(request, 'remote');
|
|
87
|
+
default:
|
|
88
|
+
return this.tryWithFallback(request, 'local', 'remote');
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Try providers of the primary type first, falling back to secondary type.
|
|
93
|
+
*/
|
|
94
|
+
async tryWithFallback(request, primaryType, fallbackType) {
|
|
95
|
+
// Try primary type
|
|
96
|
+
const primaryResult = await this.tryProvidersByType(request, primaryType);
|
|
97
|
+
if (primaryResult)
|
|
98
|
+
return primaryResult;
|
|
99
|
+
// Fallback to secondary type
|
|
100
|
+
return this.tryProvidersByType(request, fallbackType);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Try all providers of a given type until one succeeds.
|
|
104
|
+
*/
|
|
105
|
+
async tryProvidersByType(request, type) {
|
|
106
|
+
const candidates = this.providers.filter((p) => p.type === type);
|
|
107
|
+
for (const provider of candidates) {
|
|
108
|
+
try {
|
|
109
|
+
const available = await provider.isAvailable();
|
|
110
|
+
if (!available)
|
|
111
|
+
continue;
|
|
112
|
+
return await provider.analyze(request);
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// Provider failed, try next
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
// ─── Result Fusion (Static Method) ──────────────────────────────
|
|
122
|
+
/**
|
|
123
|
+
* Merge static analysis issues with AI-detected issues.
|
|
124
|
+
*
|
|
125
|
+
* Deduplication rules:
|
|
126
|
+
* - Same file + line (±3) + category → keep the one with higher severity
|
|
127
|
+
* - Static issues get detectionSource: 'static'
|
|
128
|
+
* - AI issues get detectionSource: 'ai'
|
|
129
|
+
* - Duplicates confirmed by both get detectionSource: 'both'
|
|
130
|
+
*
|
|
131
|
+
* @param staticIssues - Issues from static detectors (Tier 1/2)
|
|
132
|
+
* @param aiIssues - Issues from AI analysis (Tier 3)
|
|
133
|
+
* @returns Merged and deduplicated issue list
|
|
134
|
+
*/
|
|
135
|
+
static mergeResults(staticIssues, aiIssues) {
|
|
136
|
+
// Mark sources
|
|
137
|
+
const markedStatic = staticIssues.map((issue) => ({
|
|
138
|
+
...issue,
|
|
139
|
+
detectionSource: (issue.detectionSource || 'static'),
|
|
140
|
+
}));
|
|
141
|
+
const markedAI = aiIssues.map((issue) => ({
|
|
142
|
+
...issue,
|
|
143
|
+
detectionSource: (issue.detectionSource || 'ai'),
|
|
144
|
+
}));
|
|
145
|
+
const result = [...markedStatic];
|
|
146
|
+
const usedStaticIndices = new Set();
|
|
147
|
+
for (const aiIssue of markedAI) {
|
|
148
|
+
// Check for duplicates in static issues
|
|
149
|
+
const duplicateIndex = result.findIndex((staticIssue, idx) => !usedStaticIndices.has(idx) &&
|
|
150
|
+
staticIssue.file === aiIssue.file &&
|
|
151
|
+
Math.abs(staticIssue.line - aiIssue.line) <= 3 &&
|
|
152
|
+
staticIssue.category === aiIssue.category);
|
|
153
|
+
if (duplicateIndex >= 0) {
|
|
154
|
+
// Merge: keep the one with higher severity, mark as 'both'
|
|
155
|
+
usedStaticIndices.add(duplicateIndex);
|
|
156
|
+
const existing = result[duplicateIndex];
|
|
157
|
+
const existingSev = SEVERITY_ORDER[existing.severity] || 0;
|
|
158
|
+
const aiSev = SEVERITY_ORDER[aiIssue.severity] || 0;
|
|
159
|
+
if (aiSev > existingSev) {
|
|
160
|
+
// AI found higher severity — use AI issue but mark as both
|
|
161
|
+
result[duplicateIndex] = {
|
|
162
|
+
...aiIssue,
|
|
163
|
+
detectionSource: 'both',
|
|
164
|
+
confidence: Math.min(1.0, (existing.confidence || 0.9) * 1.05),
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
// Static found equal or higher — keep static but mark as both
|
|
169
|
+
result[duplicateIndex] = {
|
|
170
|
+
...existing,
|
|
171
|
+
detectionSource: 'both',
|
|
172
|
+
confidence: Math.min(1.0, (existing.confidence || 0.9) * 1.05),
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
// New issue from AI — apply confidence discount
|
|
178
|
+
result.push({
|
|
179
|
+
...aiIssue,
|
|
180
|
+
confidence: (aiIssue.confidence || 0.7) * 0.8,
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// Filter out very low confidence issues
|
|
185
|
+
return result.filter((issue) => (issue.confidence || 1.0) >= 0.3);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/ai/orchestrator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAUH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,sEAAsE;AAEtE,MAAM,cAAc,GAA6B;IAC/C,QAAQ,EAAE,CAAC;IACX,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,CAAC;IACT,GAAG,EAAE,CAAC;IACN,IAAI,EAAE,CAAC;CACR,CAAC;AAEF,sEAAsE;AAEtE,MAAM,OAAO,cAAc;IACjB,SAAS,GAAiB,EAAE,CAAC;IAC7B,QAAQ,CAAa;IAE7B,YAAY,MAAiB,EAAE,QAAqB;QAClD,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,MAAM,EAAE,QAAQ,IAAI,aAAa,CAAC;QAC9D,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,MAAiB;QACrC,0BAA0B;QAC1B,IAAI,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,KAAK,EAAE,CAAC;YACrC,IAAI,CAAC,SAAS,CAAC,IAAI,CACjB,IAAI,cAAc,CAAC;gBACjB,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ;gBACjC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;aAC5B,CAAC,CACH,CAAC;QACJ,CAAC;QAED,wCAAwC;QACxC,IAAI,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,IAAI,QAAQ,CAAC;YAEpD,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;gBAC7B,IAAI,CAAC,SAAS,CAAC,IAAI,CACjB,IAAI,iBAAiB,CAAC;oBACpB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;oBAC5B,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK;iBAC3B,CAAC,CACH,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,+BAA+B;gBAC/B,IAAI,CAAC,SAAS,CAAC,IAAI,CACjB,IAAI,cAAc,CAAC;oBACjB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;oBAC5B,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK;iBAC3B,CAAC,CACH,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,OAAO,CAAC,OAA0B;QACtC,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;YACtB,KAAK,aAAa;gBAChB,OAAO,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YAE1D,KAAK,cAAc;gBACjB,OAAO,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YAE1D,KAAK,YAAY;gBACf,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAEnD,KAAK,aAAa;gBAChB,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAEpD;gBACE,OAAO,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,eAAe,CAC3B,OAA0B,EAC1B,WAA+B,EAC/B,YAAgC;QAEhC,mBAAmB;QACnB,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAC1E,IAAI,aAAa;YAAE,OAAO,aAAa,CAAC;QAExC,6BAA6B;QAC7B,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACxD,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,kBAAkB,CAC9B,OAA0B,EAC1B,IAAwB;QAExB,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAEjE,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;YAClC,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;gBAC/C,IAAI,CAAC,SAAS;oBAAE,SAAS;gBAEzB,OAAO,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACzC,CAAC;YAAC,MAAM,CAAC;gBACP,4BAA4B;gBAC5B,SAAS;YACX,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,mEAAmE;IAEnE;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,YAAY,CACjB,YAA4B,EAC5B,QAAwB;QAExB,eAAe;QACf,MAAM,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAChD,GAAG,KAAK;YACR,eAAe,EAAE,CAAC,KAAK,CAAC,eAAe,IAAI,QAAQ,CAA6B;SACjF,CAAC,CAAC,CAAC;QAEJ,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACxC,GAAG,KAAK;YACR,eAAe,EAAE,CAAC,KAAK,CAAC,eAAe,IAAI,IAAI,CAA6B;SAC7E,CAAC,CAAC,CAAC;QAEJ,MAAM,MAAM,GAAmB,CAAC,GAAG,YAAY,CAAC,CAAC;QACjD,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;QAE5C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,wCAAwC;YACxC,MAAM,cAAc,GAAG,MAAM,CAAC,SAAS,CACrC,CAAC,WAAW,EAAE,GAAG,EAAE,EAAE,CACnB,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC;gBAC3B,WAAW,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI;gBACjC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC9C,WAAW,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,CAC5C,CAAC;YAEF,IAAI,cAAc,IAAI,CAAC,EAAE,CAAC;gBACxB,2DAA2D;gBAC3D,iBAAiB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;gBACtC,MAAM,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;gBACxC,MAAM,WAAW,GAAG,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC3D,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAEpD,IAAI,KAAK,GAAG,WAAW,EAAE,CAAC;oBACxB,2DAA2D;oBAC3D,MAAM,CAAC,cAAc,CAAC,GAAG;wBACvB,GAAG,OAAO;wBACV,eAAe,EAAE,MAAM;wBACvB,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC;qBAC/D,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,8DAA8D;oBAC9D,MAAM,CAAC,cAAc,CAAC,GAAG;wBACvB,GAAG,QAAQ;wBACX,eAAe,EAAE,MAAM;wBACvB,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC;qBAC/D,CAAC;gBACJ,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,gDAAgD;gBAChD,MAAM,CAAC,IAAI,CAAC;oBACV,GAAG,OAAO;oBACV,UAAU,EAAE,CAAC,OAAO,CAAC,UAAU,IAAI,GAAG,CAAC,GAAG,GAAG;iBAC9C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,wCAAwC;QACxC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;IACpE,CAAC;CACF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Prompt Templates
|
|
3
|
+
*
|
|
4
|
+
* Structured prompts for AI-powered code analysis.
|
|
5
|
+
* Designed to elicit consistent JSON output from LLMs.
|
|
6
|
+
*
|
|
7
|
+
* @since 0.3.0
|
|
8
|
+
*/
|
|
9
|
+
import type { AIAnalysisRequest } from './types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Build the analysis prompt for AI code review.
|
|
12
|
+
*
|
|
13
|
+
* @param files - Files to include in the prompt
|
|
14
|
+
* @param mode - 'quick' for L2 (critical/high only), 'deep' for L3 (all severities)
|
|
15
|
+
* @returns Formatted prompt string
|
|
16
|
+
*/
|
|
17
|
+
export declare function buildAnalysisPrompt(files: AIAnalysisRequest['files'], mode: 'quick' | 'deep'): string;
|
|
18
|
+
/**
|
|
19
|
+
* Map AI raw category string to AIDefectCategory enum value.
|
|
20
|
+
* Handles various naming conventions from LLM output.
|
|
21
|
+
*/
|
|
22
|
+
export declare function mapRawCategory(raw: string): string;
|
|
23
|
+
/**
|
|
24
|
+
* Map raw severity string to a valid Severity type.
|
|
25
|
+
*/
|
|
26
|
+
export declare function mapRawSeverity(raw: string): 'critical' | 'high' | 'medium' | 'low' | 'info';
|
|
27
|
+
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/ai/prompts.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAIpD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,iBAAiB,CAAC,OAAO,CAAC,EACjC,IAAI,EAAE,OAAO,GAAG,MAAM,GACrB,MAAM,CAmDR;AAID;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAwBlD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAgB3F"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Prompt Templates
|
|
3
|
+
*
|
|
4
|
+
* Structured prompts for AI-powered code analysis.
|
|
5
|
+
* Designed to elicit consistent JSON output from LLMs.
|
|
6
|
+
*
|
|
7
|
+
* @since 0.3.0
|
|
8
|
+
*/
|
|
9
|
+
// ─── Main Analysis Prompt ──────────────────────────────────────────
|
|
10
|
+
/**
|
|
11
|
+
* Build the analysis prompt for AI code review.
|
|
12
|
+
*
|
|
13
|
+
* @param files - Files to include in the prompt
|
|
14
|
+
* @param mode - 'quick' for L2 (critical/high only), 'deep' for L3 (all severities)
|
|
15
|
+
* @returns Formatted prompt string
|
|
16
|
+
*/
|
|
17
|
+
export function buildAnalysisPrompt(files, mode) {
|
|
18
|
+
const fileBlocks = files
|
|
19
|
+
.map((f) => `### ${f.path} (${f.language})
|
|
20
|
+
\`\`\`${f.language}
|
|
21
|
+
${f.content}
|
|
22
|
+
\`\`\``)
|
|
23
|
+
.join('\n\n');
|
|
24
|
+
const depthInstruction = mode === 'deep'
|
|
25
|
+
? 'Perform a DEEP analysis. Check every import, every API call, every type annotation.'
|
|
26
|
+
: 'Perform a QUICK analysis. Focus on critical and high severity issues only.';
|
|
27
|
+
return `You are an expert code reviewer specializing in detecting AI-generated code defects.
|
|
28
|
+
|
|
29
|
+
Analyze the following code files for AI-specific issues:
|
|
30
|
+
|
|
31
|
+
${fileBlocks}
|
|
32
|
+
|
|
33
|
+
Focus on these AI-specific defect categories:
|
|
34
|
+
1. HALLUCINATION - References to non-existent packages, APIs, or methods
|
|
35
|
+
2. STALE_KNOWLEDGE - Usage of deprecated or outdated APIs
|
|
36
|
+
3. CONTEXT_LOSS - Logical inconsistencies across the code
|
|
37
|
+
4. SECURITY - AI-generated security anti-patterns (hardcoded secrets, eval, etc.)
|
|
38
|
+
5. OVER_ENGINEERING - Unnecessary abstraction or complexity
|
|
39
|
+
6. INCOMPLETE - TODO/FIXME/placeholder code, empty catch blocks
|
|
40
|
+
7. TYPE_SAFETY - Excessive use of 'any', missing types
|
|
41
|
+
|
|
42
|
+
${depthInstruction}
|
|
43
|
+
|
|
44
|
+
Respond in JSON format:
|
|
45
|
+
{
|
|
46
|
+
"issues": [
|
|
47
|
+
{
|
|
48
|
+
"file": "path/to/file.ts",
|
|
49
|
+
"line": 42,
|
|
50
|
+
"category": "HALLUCINATION",
|
|
51
|
+
"severity": "critical",
|
|
52
|
+
"message": "Package 'non-existent-pkg' does not exist on npm",
|
|
53
|
+
"fix": "Remove this import or replace with a real package"
|
|
54
|
+
}
|
|
55
|
+
]
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
Only report genuine AI-specific issues. Do NOT report:
|
|
59
|
+
- Code formatting issues (handled by ESLint/Prettier)
|
|
60
|
+
- Simple naming conventions (handled by linters)
|
|
61
|
+
- Basic TypeScript type errors (handled by tsc)
|
|
62
|
+
- Import ordering (handled by import sorters)`;
|
|
63
|
+
}
|
|
64
|
+
// ─── Category Mapping ──────────────────────────────────────────────
|
|
65
|
+
/**
|
|
66
|
+
* Map AI raw category string to AIDefectCategory enum value.
|
|
67
|
+
* Handles various naming conventions from LLM output.
|
|
68
|
+
*/
|
|
69
|
+
export function mapRawCategory(raw) {
|
|
70
|
+
const normalized = raw.toUpperCase().replace(/[-_ ]/g, '_');
|
|
71
|
+
const mapping = {
|
|
72
|
+
HALLUCINATION: 'hallucination',
|
|
73
|
+
STALE_KNOWLEDGE: 'stale-knowledge',
|
|
74
|
+
STALE_API: 'stale-knowledge',
|
|
75
|
+
DEPRECATED: 'stale-knowledge',
|
|
76
|
+
CONTEXT_LOSS: 'context-loss',
|
|
77
|
+
CONTEXT_BREAK: 'context-loss',
|
|
78
|
+
SECURITY: 'security',
|
|
79
|
+
SECURITY_ANTIPATTERN: 'security',
|
|
80
|
+
OVER_ENGINEERING: 'over-engineering',
|
|
81
|
+
OVERENGINEERING: 'over-engineering',
|
|
82
|
+
INCOMPLETE: 'incomplete',
|
|
83
|
+
INCOMPLETE_IMPL: 'incomplete',
|
|
84
|
+
TYPE_SAFETY: 'type-safety',
|
|
85
|
+
TYPESAFETY: 'type-safety',
|
|
86
|
+
ERROR_HANDLING: 'error-handling',
|
|
87
|
+
DUPLICATION: 'duplication',
|
|
88
|
+
TRAINING_LEAK: 'training-leak',
|
|
89
|
+
};
|
|
90
|
+
return mapping[normalized] || 'hallucination';
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Map raw severity string to a valid Severity type.
|
|
94
|
+
*/
|
|
95
|
+
export function mapRawSeverity(raw) {
|
|
96
|
+
const normalized = raw.toLowerCase().trim();
|
|
97
|
+
switch (normalized) {
|
|
98
|
+
case 'critical':
|
|
99
|
+
return 'critical';
|
|
100
|
+
case 'high':
|
|
101
|
+
return 'high';
|
|
102
|
+
case 'medium':
|
|
103
|
+
return 'medium';
|
|
104
|
+
case 'low':
|
|
105
|
+
return 'low';
|
|
106
|
+
case 'info':
|
|
107
|
+
return 'info';
|
|
108
|
+
default:
|
|
109
|
+
return 'medium';
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/ai/prompts.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,sEAAsE;AAEtE;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CACjC,KAAiC,EACjC,IAAsB;IAEtB,MAAM,UAAU,GAAG,KAAK;SACrB,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,QAAQ;QACjC,CAAC,CAAC,QAAQ;EAChB,CAAC,CAAC,OAAO;OACJ,CACF;SACA,IAAI,CAAC,MAAM,CAAC,CAAC;IAEhB,MAAM,gBAAgB,GACpB,IAAI,KAAK,MAAM;QACb,CAAC,CAAC,qFAAqF;QACvF,CAAC,CAAC,4EAA4E,CAAC;IAEnF,OAAO;;;;EAIP,UAAU;;;;;;;;;;;EAWV,gBAAgB;;;;;;;;;;;;;;;;;;;;8CAoB4B,CAAC;AAC/C,CAAC;AAED,sEAAsE;AAEtE;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAE5D,MAAM,OAAO,GAA2B;QACtC,aAAa,EAAE,eAAe;QAC9B,eAAe,EAAE,iBAAiB;QAClC,SAAS,EAAE,iBAAiB;QAC5B,UAAU,EAAE,iBAAiB;QAC7B,YAAY,EAAE,cAAc;QAC5B,aAAa,EAAE,cAAc;QAC7B,QAAQ,EAAE,UAAU;QACpB,oBAAoB,EAAE,UAAU;QAChC,gBAAgB,EAAE,kBAAkB;QACpC,eAAe,EAAE,kBAAkB;QACnC,UAAU,EAAE,YAAY;QACxB,eAAe,EAAE,YAAY;QAC7B,WAAW,EAAE,aAAa;QAC1B,UAAU,EAAE,aAAa;QACzB,cAAc,EAAE,gBAAgB;QAChC,WAAW,EAAE,aAAa;QAC1B,aAAa,EAAE,eAAe;KAC/B,CAAC;IAEF,OAAO,OAAO,CAAC,UAAU,CAAC,IAAI,eAAe,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IAC5C,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,UAAU;YACb,OAAO,UAAU,CAAC;QACpB,KAAK,MAAM;YACT,OAAO,MAAM,CAAC;QAChB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAClB,KAAK,KAAK;YACR,OAAO,KAAK,CAAC;QACf,KAAK,MAAM;YACT,OAAO,MAAM,CAAC;QAChB;YACE,OAAO,QAAQ,CAAC;IACpB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Provider Type Definitions
|
|
3
|
+
*
|
|
4
|
+
* Defines the abstraction layer for AI-powered code analysis.
|
|
5
|
+
* Supports both local (Ollama) and remote (OpenAI, Anthropic) providers.
|
|
6
|
+
*
|
|
7
|
+
* @since 0.3.0
|
|
8
|
+
*/
|
|
9
|
+
import type { UnifiedIssue } from '../types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Abstract AI provider interface.
|
|
12
|
+
* All AI backends (Ollama, OpenAI, Anthropic) implement this.
|
|
13
|
+
*/
|
|
14
|
+
export interface AIProvider {
|
|
15
|
+
/** Provider identifier (e.g. 'ollama', 'openai', 'anthropic') */
|
|
16
|
+
readonly name: string;
|
|
17
|
+
/** Provider type: local runs on user's machine, remote calls cloud API */
|
|
18
|
+
readonly type: 'local' | 'remote';
|
|
19
|
+
/** Check if this provider is available and ready to use */
|
|
20
|
+
isAvailable(): Promise<boolean>;
|
|
21
|
+
/** Analyze code files and return detected issues */
|
|
22
|
+
analyze(request: AIAnalysisRequest): Promise<AIAnalysisResponse>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Input for AI analysis — a set of files to review.
|
|
26
|
+
*/
|
|
27
|
+
export interface AIAnalysisRequest {
|
|
28
|
+
/** Files to analyze */
|
|
29
|
+
files: Array<{
|
|
30
|
+
path: string;
|
|
31
|
+
content: string;
|
|
32
|
+
language: string;
|
|
33
|
+
}>;
|
|
34
|
+
/** Extra context (e.g. package.json content, tsconfig) */
|
|
35
|
+
context?: string;
|
|
36
|
+
/** Analysis mode: quick for L2, deep for L3 */
|
|
37
|
+
mode: 'quick' | 'deep';
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Output from AI analysis.
|
|
41
|
+
*/
|
|
42
|
+
export interface AIAnalysisResponse {
|
|
43
|
+
/** Detected issues in UnifiedIssue format */
|
|
44
|
+
issues: UnifiedIssue[];
|
|
45
|
+
/** Model used for analysis (e.g. 'codellama:13b', 'gpt-4o-mini') */
|
|
46
|
+
model: string;
|
|
47
|
+
/** Approximate tokens consumed */
|
|
48
|
+
tokensUsed: number;
|
|
49
|
+
/** Wall-clock duration in milliseconds */
|
|
50
|
+
durationMs: number;
|
|
51
|
+
/** Provider name */
|
|
52
|
+
provider: string;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Strategy for selecting which AI provider(s) to use.
|
|
56
|
+
*
|
|
57
|
+
* - local-first: try local provider, fallback to remote on failure
|
|
58
|
+
* - remote-first: try remote provider, fallback to local on failure
|
|
59
|
+
* - local-only: only use local provider, no fallback
|
|
60
|
+
* - remote-only: only use remote provider, no fallback
|
|
61
|
+
*/
|
|
62
|
+
export type AIStrategy = 'local-first' | 'remote-first' | 'local-only' | 'remote-only';
|
|
63
|
+
/**
|
|
64
|
+
* Raw issue structure returned by LLM in JSON output.
|
|
65
|
+
* Parsed from the AI response and converted to UnifiedIssue.
|
|
66
|
+
*/
|
|
67
|
+
export interface AIRawIssue {
|
|
68
|
+
file: string;
|
|
69
|
+
line: number;
|
|
70
|
+
category: string;
|
|
71
|
+
severity: string;
|
|
72
|
+
message: string;
|
|
73
|
+
fix?: string;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ai/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,iEAAiE;IACjE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,0EAA0E;IAC1E,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;IAElC,2DAA2D;IAC3D,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAEhC,oDAAoD;IACpD,OAAO,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;CAClE;AAID;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,uBAAuB;IACvB,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;IAEH,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,+CAA+C;IAC/C,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,6CAA6C;IAC7C,MAAM,EAAE,YAAY,EAAE,CAAC;IAEvB,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAC;IAEd,kCAAkC;IAClC,UAAU,EAAE,MAAM,CAAC;IAEnB,0CAA0C;IAC1C,UAAU,EAAE,MAAM,CAAC;IAEnB,oBAAoB;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID;;;;;;;GAOG;AACH,MAAM,MAAM,UAAU,GAAG,aAAa,GAAG,cAAc,GAAG,YAAY,GAAG,aAAa,CAAC;AAIvF;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd"}
|
package/dist/ai/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/ai/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedding providers for the V4 AI pipeline Stage 1.
|
|
3
|
+
*
|
|
4
|
+
* @since 0.4.0
|
|
5
|
+
*/
|
|
6
|
+
export { LocalEmbeddingProvider, tokenize, cosineSimilarity } from './local.js';
|
|
7
|
+
export { findTopMatches } from './similarity.js';
|
|
8
|
+
export { OpenAIEmbeddingProvider } from './openai.js';
|
|
9
|
+
export { OllamaEmbeddingProvider } from './ollama.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/ai/v4/embedding/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,sBAAsB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC"}
|