@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 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/languages/typescript/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* License Key Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates and validates AICV license keys in the format:
|
|
5
|
+
* AICV-XXXX-XXXX-XXXX-XXXX
|
|
6
|
+
*
|
|
7
|
+
* Each group contains 4 characters from a set that excludes
|
|
8
|
+
* easily confused characters (I/O/0/1/L).
|
|
9
|
+
*
|
|
10
|
+
* @since 0.3.0
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Generate a new License Key.
|
|
14
|
+
*
|
|
15
|
+
* Format: AICV-XXXX-XXXX-XXXX-XXXX
|
|
16
|
+
* Each X is a character from: ABCDEFGHJKLMNPQRSTUVWXYZ23456789
|
|
17
|
+
*
|
|
18
|
+
* @returns A new license key string
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* const key = generateLicenseKey();
|
|
23
|
+
* // => "AICV-8F3A-K9D2-P7X1-Q4M6"
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export declare function generateLicenseKey(): string;
|
|
27
|
+
/**
|
|
28
|
+
* Validate whether a string matches the license key format.
|
|
29
|
+
*
|
|
30
|
+
* Does NOT verify the key against the API — only checks format.
|
|
31
|
+
*
|
|
32
|
+
* @param key - String to validate
|
|
33
|
+
* @returns true if the key matches AICV-XXXX-XXXX-XXXX-XXXX format
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```ts
|
|
37
|
+
* isValidLicenseFormat('AICV-8F3A-K9D2-P7X1-Q4M6'); // true
|
|
38
|
+
* isValidLicenseFormat('AICV-0000-1111-OOOO-LLLL'); // false (contains 0, 1, O, L)
|
|
39
|
+
* isValidLicenseFormat('invalid'); // false
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export declare function isValidLicenseFormat(key: string): boolean;
|
|
43
|
+
//# sourceMappingURL=generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/license/generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA0BH;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAY3C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEzD"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* License Key Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates and validates AICV license keys in the format:
|
|
5
|
+
* AICV-XXXX-XXXX-XXXX-XXXX
|
|
6
|
+
*
|
|
7
|
+
* Each group contains 4 characters from a set that excludes
|
|
8
|
+
* easily confused characters (I/O/0/1/L).
|
|
9
|
+
*
|
|
10
|
+
* @since 0.3.0
|
|
11
|
+
*/
|
|
12
|
+
import { randomInt } from 'node:crypto';
|
|
13
|
+
/**
|
|
14
|
+
* Character set for license key generation.
|
|
15
|
+
* Excludes I, O, 0, 1, L to avoid confusion in manual entry.
|
|
16
|
+
*/
|
|
17
|
+
const LICENSE_CHARS = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789';
|
|
18
|
+
/** License key prefix */
|
|
19
|
+
const LICENSE_PREFIX = 'AICV';
|
|
20
|
+
/** Number of character groups after the prefix */
|
|
21
|
+
const GROUP_COUNT = 4;
|
|
22
|
+
/** Characters per group */
|
|
23
|
+
const GROUP_SIZE = 4;
|
|
24
|
+
/**
|
|
25
|
+
* Regular expression pattern for valid license keys.
|
|
26
|
+
* Format: AICV-[A-HJ-NP-Z2-9]{4}-[A-HJ-NP-Z2-9]{4}-[A-HJ-NP-Z2-9]{4}-[A-HJ-NP-Z2-9]{4}
|
|
27
|
+
*/
|
|
28
|
+
const LICENSE_FORMAT_REGEX = /^AICV-[A-HJ-NP-Z2-9]{4}-[A-HJ-NP-Z2-9]{4}-[A-HJ-NP-Z2-9]{4}-[A-HJ-NP-Z2-9]{4}$/;
|
|
29
|
+
/**
|
|
30
|
+
* Generate a new License Key.
|
|
31
|
+
*
|
|
32
|
+
* Format: AICV-XXXX-XXXX-XXXX-XXXX
|
|
33
|
+
* Each X is a character from: ABCDEFGHJKLMNPQRSTUVWXYZ23456789
|
|
34
|
+
*
|
|
35
|
+
* @returns A new license key string
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```ts
|
|
39
|
+
* const key = generateLicenseKey();
|
|
40
|
+
* // => "AICV-8F3A-K9D2-P7X1-Q4M6"
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export function generateLicenseKey() {
|
|
44
|
+
const parts = [];
|
|
45
|
+
for (let g = 0; g < GROUP_COUNT; g++) {
|
|
46
|
+
let part = '';
|
|
47
|
+
for (let i = 0; i < GROUP_SIZE; i++) {
|
|
48
|
+
part += LICENSE_CHARS[randomInt(LICENSE_CHARS.length)];
|
|
49
|
+
}
|
|
50
|
+
parts.push(part);
|
|
51
|
+
}
|
|
52
|
+
return `${LICENSE_PREFIX}-${parts.join('-')}`;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Validate whether a string matches the license key format.
|
|
56
|
+
*
|
|
57
|
+
* Does NOT verify the key against the API — only checks format.
|
|
58
|
+
*
|
|
59
|
+
* @param key - String to validate
|
|
60
|
+
* @returns true if the key matches AICV-XXXX-XXXX-XXXX-XXXX format
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* ```ts
|
|
64
|
+
* isValidLicenseFormat('AICV-8F3A-K9D2-P7X1-Q4M6'); // true
|
|
65
|
+
* isValidLicenseFormat('AICV-0000-1111-OOOO-LLLL'); // false (contains 0, 1, O, L)
|
|
66
|
+
* isValidLicenseFormat('invalid'); // false
|
|
67
|
+
* ```
|
|
68
|
+
*/
|
|
69
|
+
export function isValidLicenseFormat(key) {
|
|
70
|
+
return LICENSE_FORMAT_REGEX.test(key);
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/license/generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC;;;GAGG;AACH,MAAM,aAAa,GAAG,kCAAkC,CAAC;AAEzD,yBAAyB;AACzB,MAAM,cAAc,GAAG,MAAM,CAAC;AAE9B,kDAAkD;AAClD,MAAM,WAAW,GAAG,CAAC,CAAC;AAEtB,2BAA2B;AAC3B,MAAM,UAAU,GAAG,CAAC,CAAC;AAErB;;;GAGG;AACH,MAAM,oBAAoB,GACxB,gFAAgF,CAAC;AAEnF;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,IAAI,IAAI,aAAa,CAAC,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;QACzD,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IAED,OAAO,GAAG,cAAc,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAChD,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC9C,OAAO,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* License Module — Public API
|
|
3
|
+
*
|
|
4
|
+
* Provides license key generation, validation, and caching.
|
|
5
|
+
*
|
|
6
|
+
* @since 0.3.0
|
|
7
|
+
*/
|
|
8
|
+
export type { LicenseInfo, LicenseValidationResult, LicenseCacheEntry, LicenseResolveOptions, LicenseValidatorOptions, } from './types.js';
|
|
9
|
+
export { generateLicenseKey, isValidLicenseFormat } from './generator.js';
|
|
10
|
+
export { LicenseValidator } from './validator.js';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/license/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,YAAY,EACV,WAAW,EACX,uBAAuB,EACvB,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAG1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* License Module — Public API
|
|
3
|
+
*
|
|
4
|
+
* Provides license key generation, validation, and caching.
|
|
5
|
+
*
|
|
6
|
+
* @since 0.3.0
|
|
7
|
+
*/
|
|
8
|
+
// Generator
|
|
9
|
+
export { generateLicenseKey, isValidLicenseFormat } from './generator.js';
|
|
10
|
+
// Validator
|
|
11
|
+
export { LicenseValidator } from './validator.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/license/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAWH,YAAY;AACZ,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAE1E,YAAY;AACZ,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* License Module — Type Definitions
|
|
3
|
+
*
|
|
4
|
+
* Defines types for the License system: key format, validation results,
|
|
5
|
+
* and cache entries.
|
|
6
|
+
*
|
|
7
|
+
* @since 0.3.0
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Information about a License Key.
|
|
11
|
+
* Returned from the validation API and stored in cache.
|
|
12
|
+
*/
|
|
13
|
+
export interface LicenseInfo {
|
|
14
|
+
/** License key in format AICV-XXXX-XXXX-XXXX-XXXX */
|
|
15
|
+
key: string;
|
|
16
|
+
/** Whether the license is currently valid */
|
|
17
|
+
valid: boolean;
|
|
18
|
+
/** Associated user ID (from Portal) */
|
|
19
|
+
userId?: string;
|
|
20
|
+
/** Associated email address */
|
|
21
|
+
email?: string;
|
|
22
|
+
/** When the license was created (ISO 8601) */
|
|
23
|
+
createdAt?: string;
|
|
24
|
+
/** When the license expires (ISO 8601), null = never expires (free plan) */
|
|
25
|
+
expiresAt?: string | null;
|
|
26
|
+
/** License plan — currently only 'free' */
|
|
27
|
+
plan: 'free';
|
|
28
|
+
/** Number of times this license has been used for scans */
|
|
29
|
+
usageCount?: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Result of a license validation attempt.
|
|
33
|
+
* Contains the validation status, license info, and caching metadata.
|
|
34
|
+
*/
|
|
35
|
+
export interface LicenseValidationResult {
|
|
36
|
+
/** Whether the license is valid */
|
|
37
|
+
valid: boolean;
|
|
38
|
+
/** License information (when valid or cached) */
|
|
39
|
+
info?: LicenseInfo;
|
|
40
|
+
/** Error message (when invalid or failed) */
|
|
41
|
+
error?: string;
|
|
42
|
+
/** Whether this result came from local cache */
|
|
43
|
+
cached: boolean;
|
|
44
|
+
/** Whether this result is from a degraded/fallback path */
|
|
45
|
+
degraded?: boolean;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Cache entry stored in ~/.aicv/license-cache.json
|
|
49
|
+
*/
|
|
50
|
+
export interface LicenseCacheEntry {
|
|
51
|
+
/** The license key that was validated */
|
|
52
|
+
key: string;
|
|
53
|
+
/** The cached validation result */
|
|
54
|
+
result: LicenseValidationResult;
|
|
55
|
+
/** Timestamp when the cache entry was created (ms since epoch) */
|
|
56
|
+
timestamp: number;
|
|
57
|
+
/** Cache TTL in milliseconds (default: 24h = 86400000) */
|
|
58
|
+
ttl: number;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Options for resolving a license key from various sources.
|
|
62
|
+
* Priority: cli > env > config > file
|
|
63
|
+
*/
|
|
64
|
+
export interface LicenseResolveOptions {
|
|
65
|
+
/** License key from CLI --license flag */
|
|
66
|
+
cli?: string;
|
|
67
|
+
/** License key from environment variable (AICV_LICENSE) */
|
|
68
|
+
env?: string;
|
|
69
|
+
/** License key from .aicv.yml config file */
|
|
70
|
+
config?: string;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Options for creating a LicenseValidator instance.
|
|
74
|
+
*/
|
|
75
|
+
export interface LicenseValidatorOptions {
|
|
76
|
+
/** Directory for cache files (default: ~/.aicv/) */
|
|
77
|
+
cacheDir?: string;
|
|
78
|
+
/** API endpoint for license verification */
|
|
79
|
+
apiEndpoint?: string;
|
|
80
|
+
/** Cache TTL in ms (default: 86400000 = 24h) */
|
|
81
|
+
cacheTtlMs?: number;
|
|
82
|
+
/** Grace period for expired cache when API fails (default: 604800000 = 7 days) */
|
|
83
|
+
gracePeriodMs?: number;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/license/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,qDAAqD;IACrD,GAAG,EAAE,MAAM,CAAC;IACZ,6CAA6C;IAC7C,KAAK,EAAE,OAAO,CAAC;IACf,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAID;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,mCAAmC;IACnC,KAAK,EAAE,OAAO,CAAC;IACf,iDAAiD;IACjD,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,MAAM,EAAE,OAAO,CAAC;IAChB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAID;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,yCAAyC;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,mCAAmC;IACnC,MAAM,EAAE,uBAAuB,CAAC;IAChC,kEAAkE;IAClE,SAAS,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,GAAG,EAAE,MAAM,CAAC;CACb;AAID;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,0CAA0C;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAID;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kFAAkF;IAClF,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/license/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* License Validator
|
|
3
|
+
*
|
|
4
|
+
* Validates license keys with local caching and API fallback.
|
|
5
|
+
*
|
|
6
|
+
* Validation flow:
|
|
7
|
+
* 1. Check local cache (~/.aicv/license-cache.json, TTL 24h)
|
|
8
|
+
* 2. Cache hit → return cached result
|
|
9
|
+
* 3. Cache miss → call API to verify
|
|
10
|
+
* 4. API success → update cache → return result
|
|
11
|
+
* 5. API failure → if expired cache within grace period (7 days) → return cached (degraded)
|
|
12
|
+
* 6. No cache + API failure → return valid (free product, don't block users)
|
|
13
|
+
*
|
|
14
|
+
* @since 0.3.0
|
|
15
|
+
*/
|
|
16
|
+
import type { LicenseValidationResult, LicenseResolveOptions, LicenseValidatorOptions } from './types.js';
|
|
17
|
+
/**
|
|
18
|
+
* Validates license keys against API with local caching.
|
|
19
|
+
*
|
|
20
|
+
* Design principle: as a free product, we never block users due to
|
|
21
|
+
* API failures. If the API is unreachable, we treat the license as valid.
|
|
22
|
+
*/
|
|
23
|
+
export declare class LicenseValidator {
|
|
24
|
+
private readonly cacheDir;
|
|
25
|
+
private readonly apiEndpoint;
|
|
26
|
+
private readonly cacheTtlMs;
|
|
27
|
+
private readonly gracePeriodMs;
|
|
28
|
+
constructor(options?: LicenseValidatorOptions);
|
|
29
|
+
/**
|
|
30
|
+
* Validate a license key.
|
|
31
|
+
*
|
|
32
|
+
* @param licenseKey - License key to validate (AICV-XXXX-XXXX-XXXX-XXXX)
|
|
33
|
+
* @returns Validation result with license info and cache status
|
|
34
|
+
*/
|
|
35
|
+
validate(licenseKey: string): Promise<LicenseValidationResult>;
|
|
36
|
+
/**
|
|
37
|
+
* Resolve a license key from multiple sources.
|
|
38
|
+
*
|
|
39
|
+
* Priority:
|
|
40
|
+
* 1. CLI parameter (--license)
|
|
41
|
+
* 2. Environment variable (AICV_LICENSE)
|
|
42
|
+
* 3. Config file (.aicv.yml)
|
|
43
|
+
* 4. Stored license file (~/.aicv/license)
|
|
44
|
+
*
|
|
45
|
+
* @param options - Sources to check
|
|
46
|
+
* @returns License key or null if not found
|
|
47
|
+
*/
|
|
48
|
+
static resolveLicenseKey(options?: LicenseResolveOptions): string | null;
|
|
49
|
+
/**
|
|
50
|
+
* Save a license key to the user's home directory (~/.aicv/license).
|
|
51
|
+
*
|
|
52
|
+
* @param key - License key to save
|
|
53
|
+
*/
|
|
54
|
+
static saveLicenseKey(key: string): void;
|
|
55
|
+
/**
|
|
56
|
+
* Read cache entry for a specific key.
|
|
57
|
+
* Returns null if cache doesn't exist or is for a different key.
|
|
58
|
+
*/
|
|
59
|
+
private readCache;
|
|
60
|
+
/**
|
|
61
|
+
* Write a cache entry to disk.
|
|
62
|
+
* Creates the cache directory if it doesn't exist.
|
|
63
|
+
* Sets file permissions to 0600 (user-only read/write).
|
|
64
|
+
*/
|
|
65
|
+
private writeCache;
|
|
66
|
+
/**
|
|
67
|
+
* Call the license verification API.
|
|
68
|
+
*
|
|
69
|
+
* POST {apiEndpoint}
|
|
70
|
+
* Body: { "key": "AICV-..." }
|
|
71
|
+
* Response: { "valid": true, "info": {...} }
|
|
72
|
+
*
|
|
73
|
+
* @throws Error if the API request fails
|
|
74
|
+
*/
|
|
75
|
+
private callAPI;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/license/validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,OAAO,KAAK,EACV,uBAAuB,EAEvB,qBAAqB,EACrB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAqBpB;;;;;GAKG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;gBAE3B,OAAO,CAAC,EAAE,uBAAuB;IAO7C;;;;;OAKG;IACG,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC;IA4DpE;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,MAAM,GAAG,IAAI;IA+BxE;;;;OAIG;IACH,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAgBxC;;;OAGG;IACH,OAAO,CAAC,SAAS;IAoBjB;;;;OAIG;IACH,OAAO,CAAC,UAAU;IAmBlB;;;;;;;;OAQG;YACW,OAAO;CAgDtB"}
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* License Validator
|
|
3
|
+
*
|
|
4
|
+
* Validates license keys with local caching and API fallback.
|
|
5
|
+
*
|
|
6
|
+
* Validation flow:
|
|
7
|
+
* 1. Check local cache (~/.aicv/license-cache.json, TTL 24h)
|
|
8
|
+
* 2. Cache hit → return cached result
|
|
9
|
+
* 3. Cache miss → call API to verify
|
|
10
|
+
* 4. API success → update cache → return result
|
|
11
|
+
* 5. API failure → if expired cache within grace period (7 days) → return cached (degraded)
|
|
12
|
+
* 6. No cache + API failure → return valid (free product, don't block users)
|
|
13
|
+
*
|
|
14
|
+
* @since 0.3.0
|
|
15
|
+
*/
|
|
16
|
+
import { readFileSync, writeFileSync, mkdirSync, existsSync, chmodSync } from 'node:fs';
|
|
17
|
+
import { join } from 'node:path';
|
|
18
|
+
import { homedir } from 'node:os';
|
|
19
|
+
import { isValidLicenseFormat } from './generator.js';
|
|
20
|
+
// ─── Constants ─────────────────────────────────────────────────────
|
|
21
|
+
/** Default cache TTL: 24 hours */
|
|
22
|
+
const DEFAULT_CACHE_TTL_MS = 24 * 60 * 60 * 1000;
|
|
23
|
+
/** Default grace period: 7 days */
|
|
24
|
+
const DEFAULT_GRACE_PERIOD_MS = 7 * 24 * 60 * 60 * 1000;
|
|
25
|
+
/** Default API endpoint */
|
|
26
|
+
const DEFAULT_API_ENDPOINT = 'https://codes.evallab.ai/api/license/verify';
|
|
27
|
+
/** Cache filename */
|
|
28
|
+
const CACHE_FILENAME = 'license-cache.json';
|
|
29
|
+
/** License file (stores key from login) */
|
|
30
|
+
const LICENSE_FILENAME = 'license';
|
|
31
|
+
// ─── LicenseValidator Class ────────────────────────────────────────
|
|
32
|
+
/**
|
|
33
|
+
* Validates license keys against API with local caching.
|
|
34
|
+
*
|
|
35
|
+
* Design principle: as a free product, we never block users due to
|
|
36
|
+
* API failures. If the API is unreachable, we treat the license as valid.
|
|
37
|
+
*/
|
|
38
|
+
export class LicenseValidator {
|
|
39
|
+
cacheDir;
|
|
40
|
+
apiEndpoint;
|
|
41
|
+
cacheTtlMs;
|
|
42
|
+
gracePeriodMs;
|
|
43
|
+
constructor(options) {
|
|
44
|
+
this.cacheDir = options?.cacheDir ?? join(homedir(), '.aicv');
|
|
45
|
+
this.apiEndpoint = options?.apiEndpoint ?? DEFAULT_API_ENDPOINT;
|
|
46
|
+
this.cacheTtlMs = options?.cacheTtlMs ?? DEFAULT_CACHE_TTL_MS;
|
|
47
|
+
this.gracePeriodMs = options?.gracePeriodMs ?? DEFAULT_GRACE_PERIOD_MS;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Validate a license key.
|
|
51
|
+
*
|
|
52
|
+
* @param licenseKey - License key to validate (AICV-XXXX-XXXX-XXXX-XXXX)
|
|
53
|
+
* @returns Validation result with license info and cache status
|
|
54
|
+
*/
|
|
55
|
+
async validate(licenseKey) {
|
|
56
|
+
// Step 0: Format check
|
|
57
|
+
if (!isValidLicenseFormat(licenseKey)) {
|
|
58
|
+
return {
|
|
59
|
+
valid: false,
|
|
60
|
+
error: `Invalid license key format: ${licenseKey}. Expected: AICV-XXXX-XXXX-XXXX-XXXX`,
|
|
61
|
+
cached: false,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
// Step 1: Check local cache
|
|
65
|
+
const cached = this.readCache(licenseKey);
|
|
66
|
+
if (cached) {
|
|
67
|
+
const age = Date.now() - cached.timestamp;
|
|
68
|
+
if (age < cached.ttl) {
|
|
69
|
+
// Cache hit (not expired)
|
|
70
|
+
return { ...cached.result, cached: true };
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Step 2: Call API for verification
|
|
74
|
+
try {
|
|
75
|
+
const apiResult = await this.callAPI(licenseKey);
|
|
76
|
+
// Step 3: Update cache on API success
|
|
77
|
+
this.writeCache({
|
|
78
|
+
key: licenseKey,
|
|
79
|
+
result: apiResult,
|
|
80
|
+
timestamp: Date.now(),
|
|
81
|
+
ttl: this.cacheTtlMs,
|
|
82
|
+
});
|
|
83
|
+
return { ...apiResult, cached: false };
|
|
84
|
+
}
|
|
85
|
+
catch (_error) {
|
|
86
|
+
// Step 4: API failed — try degraded cache
|
|
87
|
+
if (cached) {
|
|
88
|
+
const age = Date.now() - cached.timestamp;
|
|
89
|
+
if (age < this.gracePeriodMs) {
|
|
90
|
+
// Expired cache within grace period → return degraded
|
|
91
|
+
return {
|
|
92
|
+
...cached.result,
|
|
93
|
+
cached: true,
|
|
94
|
+
degraded: true,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Step 5: No cache + API failure → treat as valid (free product)
|
|
99
|
+
return {
|
|
100
|
+
valid: true,
|
|
101
|
+
cached: false,
|
|
102
|
+
degraded: true,
|
|
103
|
+
error: 'API unreachable, operating in offline mode',
|
|
104
|
+
info: {
|
|
105
|
+
key: licenseKey,
|
|
106
|
+
valid: true,
|
|
107
|
+
plan: 'free',
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Resolve a license key from multiple sources.
|
|
114
|
+
*
|
|
115
|
+
* Priority:
|
|
116
|
+
* 1. CLI parameter (--license)
|
|
117
|
+
* 2. Environment variable (AICV_LICENSE)
|
|
118
|
+
* 3. Config file (.aicv.yml)
|
|
119
|
+
* 4. Stored license file (~/.aicv/license)
|
|
120
|
+
*
|
|
121
|
+
* @param options - Sources to check
|
|
122
|
+
* @returns License key or null if not found
|
|
123
|
+
*/
|
|
124
|
+
static resolveLicenseKey(options) {
|
|
125
|
+
// Priority 1: CLI argument
|
|
126
|
+
if (options?.cli) {
|
|
127
|
+
return options.cli;
|
|
128
|
+
}
|
|
129
|
+
// Priority 2: Environment variable
|
|
130
|
+
const envKey = options?.env ?? process.env.AICV_LICENSE;
|
|
131
|
+
if (envKey) {
|
|
132
|
+
return envKey;
|
|
133
|
+
}
|
|
134
|
+
// Priority 3: Config file (.aicv.yml license field)
|
|
135
|
+
if (options?.config) {
|
|
136
|
+
return options.config;
|
|
137
|
+
}
|
|
138
|
+
// Priority 4: Stored license file (~/.aicv/license)
|
|
139
|
+
try {
|
|
140
|
+
const licensePath = join(homedir(), '.aicv', LICENSE_FILENAME);
|
|
141
|
+
if (existsSync(licensePath)) {
|
|
142
|
+
const key = readFileSync(licensePath, 'utf-8').trim();
|
|
143
|
+
if (key)
|
|
144
|
+
return key;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
// Ignore read errors
|
|
149
|
+
}
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Save a license key to the user's home directory (~/.aicv/license).
|
|
154
|
+
*
|
|
155
|
+
* @param key - License key to save
|
|
156
|
+
*/
|
|
157
|
+
static saveLicenseKey(key) {
|
|
158
|
+
const dir = join(homedir(), '.aicv');
|
|
159
|
+
if (!existsSync(dir)) {
|
|
160
|
+
mkdirSync(dir, { recursive: true });
|
|
161
|
+
}
|
|
162
|
+
const filePath = join(dir, LICENSE_FILENAME);
|
|
163
|
+
writeFileSync(filePath, key, 'utf-8');
|
|
164
|
+
try {
|
|
165
|
+
chmodSync(filePath, 0o600);
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
// chmod may fail on some platforms (Windows)
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// ─── Private: Cache Operations ─────────────────────────────────
|
|
172
|
+
/**
|
|
173
|
+
* Read cache entry for a specific key.
|
|
174
|
+
* Returns null if cache doesn't exist or is for a different key.
|
|
175
|
+
*/
|
|
176
|
+
readCache(licenseKey) {
|
|
177
|
+
try {
|
|
178
|
+
const cachePath = join(this.cacheDir, CACHE_FILENAME);
|
|
179
|
+
if (!existsSync(cachePath))
|
|
180
|
+
return null;
|
|
181
|
+
const raw = readFileSync(cachePath, 'utf-8');
|
|
182
|
+
const entry = JSON.parse(raw);
|
|
183
|
+
// Validate cache entry structure
|
|
184
|
+
if (!entry || typeof entry !== 'object')
|
|
185
|
+
return null;
|
|
186
|
+
if (entry.key !== licenseKey)
|
|
187
|
+
return null;
|
|
188
|
+
if (typeof entry.timestamp !== 'number')
|
|
189
|
+
return null;
|
|
190
|
+
if (!entry.result)
|
|
191
|
+
return null;
|
|
192
|
+
return entry;
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Write a cache entry to disk.
|
|
200
|
+
* Creates the cache directory if it doesn't exist.
|
|
201
|
+
* Sets file permissions to 0600 (user-only read/write).
|
|
202
|
+
*/
|
|
203
|
+
writeCache(entry) {
|
|
204
|
+
try {
|
|
205
|
+
if (!existsSync(this.cacheDir)) {
|
|
206
|
+
mkdirSync(this.cacheDir, { recursive: true });
|
|
207
|
+
}
|
|
208
|
+
const cachePath = join(this.cacheDir, CACHE_FILENAME);
|
|
209
|
+
writeFileSync(cachePath, JSON.stringify(entry, null, 2), 'utf-8');
|
|
210
|
+
try {
|
|
211
|
+
chmodSync(cachePath, 0o600);
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
// chmod may fail on some platforms (Windows)
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
// Silently fail on cache write errors — don't block the user
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
// ─── Private: API Call ─────────────────────────────────────────
|
|
222
|
+
/**
|
|
223
|
+
* Call the license verification API.
|
|
224
|
+
*
|
|
225
|
+
* POST {apiEndpoint}
|
|
226
|
+
* Body: { "key": "AICV-..." }
|
|
227
|
+
* Response: { "valid": true, "info": {...} }
|
|
228
|
+
*
|
|
229
|
+
* @throws Error if the API request fails
|
|
230
|
+
*/
|
|
231
|
+
async callAPI(key) {
|
|
232
|
+
const controller = new AbortController();
|
|
233
|
+
const timeout = setTimeout(() => controller.abort(), 10000); // 10s timeout
|
|
234
|
+
try {
|
|
235
|
+
const response = await fetch(this.apiEndpoint, {
|
|
236
|
+
method: 'POST',
|
|
237
|
+
headers: {
|
|
238
|
+
'Content-Type': 'application/json',
|
|
239
|
+
'User-Agent': 'open-code-review-cli/0.3.0',
|
|
240
|
+
},
|
|
241
|
+
body: JSON.stringify({ key }),
|
|
242
|
+
signal: controller.signal,
|
|
243
|
+
});
|
|
244
|
+
if (response.ok) {
|
|
245
|
+
const data = (await response.json());
|
|
246
|
+
return {
|
|
247
|
+
valid: data.valid,
|
|
248
|
+
info: data.info
|
|
249
|
+
? {
|
|
250
|
+
key,
|
|
251
|
+
valid: data.valid,
|
|
252
|
+
plan: 'free',
|
|
253
|
+
userId: data.info.userId,
|
|
254
|
+
email: data.info.email,
|
|
255
|
+
createdAt: data.info.createdAt,
|
|
256
|
+
expiresAt: data.info.expiresAt,
|
|
257
|
+
usageCount: data.info.usageCount,
|
|
258
|
+
}
|
|
259
|
+
: { key, valid: data.valid, plan: 'free' },
|
|
260
|
+
cached: false,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
// Non-OK response (401, 403, etc.)
|
|
264
|
+
return {
|
|
265
|
+
valid: false,
|
|
266
|
+
error: `License verification failed: HTTP ${response.status}`,
|
|
267
|
+
cached: false,
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
finally {
|
|
271
|
+
clearTimeout(timeout);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
//# sourceMappingURL=validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/license/validator.ts"],"names":[],"mappings":"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"}
|