@complior/engine 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.well-known/ai-compliance.json +16 -0
- package/COMPLIANCE.md +64 -0
- package/data/data-integrity.test.ts +75 -0
- package/data/eval/eval-mappings.json +33 -0
- package/data/llm/model-pricing.json +15 -0
- package/data/llm/model-routing.json +36 -0
- package/data/onboarding/risk-profile.json +17 -0
- package/data/regulations/eu-ai-act/README.md +245 -0
- package/data/regulations/eu-ai-act/applicability-tree.json +160 -0
- package/data/regulations/eu-ai-act/cross-mapping.json +175 -0
- package/data/regulations/eu-ai-act/localization.json +186 -0
- package/data/regulations/eu-ai-act/obligations.json +3981 -0
- package/data/regulations/eu-ai-act/regulation-meta.json +482 -0
- package/data/regulations/eu-ai-act/scoring.json +342 -0
- package/data/regulations/eu-ai-act/technical-requirements.json +2590 -0
- package/data/regulations/eu-ai-act/timeline.json +160 -0
- package/data/regulations/jurisdictions/at.json +15 -0
- package/data/regulations/jurisdictions/be.json +15 -0
- package/data/regulations/jurisdictions/bg.json +15 -0
- package/data/regulations/jurisdictions/cy.json +15 -0
- package/data/regulations/jurisdictions/cz.json +15 -0
- package/data/regulations/jurisdictions/de.json +15 -0
- package/data/regulations/jurisdictions/dk.json +15 -0
- package/data/regulations/jurisdictions/ee.json +15 -0
- package/data/regulations/jurisdictions/es.json +15 -0
- package/data/regulations/jurisdictions/fi.json +15 -0
- package/data/regulations/jurisdictions/fr.json +15 -0
- package/data/regulations/jurisdictions/gr.json +15 -0
- package/data/regulations/jurisdictions/hr.json +15 -0
- package/data/regulations/jurisdictions/hu.json +15 -0
- package/data/regulations/jurisdictions/ie.json +15 -0
- package/data/regulations/jurisdictions/is.json +15 -0
- package/data/regulations/jurisdictions/it.json +15 -0
- package/data/regulations/jurisdictions/li.json +15 -0
- package/data/regulations/jurisdictions/lt.json +15 -0
- package/data/regulations/jurisdictions/lu.json +15 -0
- package/data/regulations/jurisdictions/lv.json +15 -0
- package/data/regulations/jurisdictions/mt.json +15 -0
- package/data/regulations/jurisdictions/nl.json +15 -0
- package/data/regulations/jurisdictions/no.json +15 -0
- package/data/regulations/jurisdictions/pl.json +15 -0
- package/data/regulations/jurisdictions/pt.json +15 -0
- package/data/regulations/jurisdictions/ro.json +15 -0
- package/data/regulations/jurisdictions/se.json +15 -0
- package/data/regulations/jurisdictions/si.json +15 -0
- package/data/regulations/jurisdictions/sk.json +15 -0
- package/data/scanner/check-id-categories.json +81 -0
- package/data/scanner/confidence-params.json +16 -0
- package/data/scanner/limits.json +4 -0
- package/data/schemas/http-contract-sample.json +79 -0
- package/data/schemas/http-contract.json +144 -0
- package/data/semgrep-rules/bare-call.yaml +37 -0
- package/data/semgrep-rules/injection.yaml +73 -0
- package/data/semgrep-rules/missing-error-handling.yaml +58 -0
- package/data/semgrep-rules/unsafe-deser.yaml +65 -0
- package/data/templates/eu-ai-act/ai-literacy.md +184 -0
- package/data/templates/eu-ai-act/art5-screening.md +131 -0
- package/data/templates/eu-ai-act/data-governance.md +145 -0
- package/data/templates/eu-ai-act/declaration-of-conformity.md +161 -0
- package/data/templates/eu-ai-act/fria.md +127 -0
- package/data/templates/eu-ai-act/gpai-systemic-risk.md +150 -0
- package/data/templates/eu-ai-act/gpai-transparency.md +166 -0
- package/data/templates/eu-ai-act/incident-report.md +188 -0
- package/data/templates/eu-ai-act/instructions-for-use.md +202 -0
- package/data/templates/eu-ai-act/monitoring-policy.md +110 -0
- package/data/templates/eu-ai-act/qms.md +180 -0
- package/data/templates/eu-ai-act/risk-management-system.md +123 -0
- package/data/templates/eu-ai-act/technical-documentation.md +287 -0
- package/data/templates/eu-ai-act/worker-notification.md +143 -0
- package/data/templates/policies/biometrics-ai-policy.md +214 -0
- package/data/templates/policies/critical-infra-ai-policy.md +228 -0
- package/data/templates/policies/education-ai-policy.md +184 -0
- package/data/templates/policies/finance-ai-policy.md +191 -0
- package/data/templates/policies/healthcare-ai-policy.md +197 -0
- package/data/templates/policies/hr-ai-policy.md +178 -0
- package/data/templates/policies/legal-ai-policy.md +189 -0
- package/data/templates/policies/migration-ai-policy.md +239 -0
- package/engine.log +7 -0
- package/package.json +74 -0
- package/src/composition-root.ts +791 -0
- package/src/data/eval/conformity-tests.test.ts +122 -0
- package/src/data/eval/ct-1-transparency.ts +106 -0
- package/src/data/eval/ct-10-gpai.ts +25 -0
- package/src/data/eval/ct-11-industry.ts +42 -0
- package/src/data/eval/ct-2-oversight.ts +41 -0
- package/src/data/eval/ct-3-explanation.ts +14 -0
- package/src/data/eval/ct-4-bias.ts +83 -0
- package/src/data/eval/ct-5-accuracy.ts +41 -0
- package/src/data/eval/ct-6-robustness.ts +81 -0
- package/src/data/eval/ct-7-prohibited.ts +52 -0
- package/src/data/eval/ct-8-logging.ts +68 -0
- package/src/data/eval/ct-9-risk-awareness.ts +33 -0
- package/src/data/eval/deterministic-evaluator.ts +120 -0
- package/src/data/eval/index.ts +55 -0
- package/src/data/eval/judge-prompts.ts +146 -0
- package/src/data/eval/llm-judged-tests.ts +279 -0
- package/src/data/eval/llm-tests.test.ts +83 -0
- package/src/data/eval/remediation/ct-1-transparency.ts +91 -0
- package/src/data/eval/remediation/ct-10-gpai.ts +94 -0
- package/src/data/eval/remediation/ct-11-industry.ts +94 -0
- package/src/data/eval/remediation/ct-2-oversight.ts +71 -0
- package/src/data/eval/remediation/ct-3-explanation.ts +70 -0
- package/src/data/eval/remediation/ct-4-bias.ts +70 -0
- package/src/data/eval/remediation/ct-5-accuracy.ts +70 -0
- package/src/data/eval/remediation/ct-6-robustness.ts +70 -0
- package/src/data/eval/remediation/ct-7-prohibited.ts +94 -0
- package/src/data/eval/remediation/ct-8-logging.ts +94 -0
- package/src/data/eval/remediation/ct-9-risk-awareness.ts +94 -0
- package/src/data/eval/remediation/index.ts +89 -0
- package/src/data/eval/remediation/owasp-art5.ts +15 -0
- package/src/data/eval/remediation/owasp-llm01.ts +72 -0
- package/src/data/eval/remediation/owasp-llm02.ts +72 -0
- package/src/data/eval/remediation/owasp-llm03.ts +15 -0
- package/src/data/eval/remediation/owasp-llm04.ts +15 -0
- package/src/data/eval/remediation/owasp-llm05.ts +15 -0
- package/src/data/eval/remediation/owasp-llm06.ts +15 -0
- package/src/data/eval/remediation/owasp-llm07.ts +15 -0
- package/src/data/eval/remediation/owasp-llm08.ts +15 -0
- package/src/data/eval/remediation/owasp-llm09.ts +15 -0
- package/src/data/eval/remediation/owasp-llm10.ts +15 -0
- package/src/data/eval/remediation/remediation.test.ts +229 -0
- package/src/data/eval/remediation/test-mapping.ts +290 -0
- package/src/data/eval/security-rubrics.ts +381 -0
- package/src/data/finding-explanations.json +453 -0
- package/src/data/industry-patterns.ts +161 -0
- package/src/data/registry-cards.ts +368 -0
- package/src/data/regulation/index.ts +5 -0
- package/src/data/regulation/jurisdiction-data.test.ts +73 -0
- package/src/data/regulation/jurisdiction-data.ts +65 -0
- package/src/data/regulation/regulation-data.ts +19 -0
- package/src/data/regulation/regulation-loader.test.ts +107 -0
- package/src/data/regulation/regulation-loader.ts +56 -0
- package/src/data/scanner-constants.ts +46 -0
- package/src/data/schemas/schemas-core.ts +140 -0
- package/src/data/schemas/schemas-supplementary.ts +211 -0
- package/src/data/schemas/schemas.ts +28 -0
- package/src/data/security/attack-probes.test.ts +62 -0
- package/src/data/security/attack-probes.ts +496 -0
- package/src/data/security/eu-ai-act-security.ts +40 -0
- package/src/data/security/index.ts +19 -0
- package/src/data/security/mitre-atlas.test.ts +43 -0
- package/src/data/security/mitre-atlas.ts +93 -0
- package/src/data/security/nist-ai-rmf.ts +43 -0
- package/src/data/security/owasp-llm-top10.test.ts +60 -0
- package/src/data/security/owasp-llm-top10.ts +138 -0
- package/src/data/template-registry.ts +53 -0
- package/src/data/tool-versions.json +22 -0
- package/src/domain/audit/audit-package.test.ts +152 -0
- package/src/domain/audit/audit-package.ts +166 -0
- package/src/domain/audit/audit-trail.test.ts +121 -0
- package/src/domain/audit/audit-trail.ts +174 -0
- package/src/domain/audit/index.ts +8 -0
- package/src/domain/audit/permissions-matrix.test.ts +136 -0
- package/src/domain/audit/permissions-matrix.ts +121 -0
- package/src/domain/certification/adversarial/bias-tests.ts +95 -0
- package/src/domain/certification/adversarial/evaluators.ts +304 -0
- package/src/domain/certification/adversarial/index.ts +11 -0
- package/src/domain/certification/adversarial/prompt-injection.ts +103 -0
- package/src/domain/certification/adversarial/safety-boundary.ts +132 -0
- package/src/domain/certification/aiuc1-readiness.test.ts +236 -0
- package/src/domain/certification/aiuc1-readiness.ts +298 -0
- package/src/domain/certification/aiuc1-requirements.ts +235 -0
- package/src/domain/certification/index.ts +10 -0
- package/src/domain/certification/redteam-runner.test.ts +97 -0
- package/src/domain/certification/redteam-runner.ts +205 -0
- package/src/domain/certification/test-runner.test.ts +232 -0
- package/src/domain/certification/test-runner.ts +289 -0
- package/src/domain/cost/cost-estimator.test.ts +187 -0
- package/src/domain/cost/cost-estimator.ts +133 -0
- package/src/domain/disclaimer.test.ts +52 -0
- package/src/domain/disclaimer.ts +39 -0
- package/src/domain/documents/ai-enricher.test.ts +120 -0
- package/src/domain/documents/ai-enricher.ts +159 -0
- package/src/domain/documents/document-generator.test.ts +318 -0
- package/src/domain/documents/document-generator.ts +239 -0
- package/src/domain/documents/index.ts +9 -0
- package/src/domain/documents/passport-helpers.ts +25 -0
- package/src/domain/documents/policy-generator.test.ts +252 -0
- package/src/domain/documents/policy-generator.ts +94 -0
- package/src/domain/documents/worker-notification-generator.test.ts +162 -0
- package/src/domain/documents/worker-notification-generator.ts +141 -0
- package/src/domain/eval/adapters/adapter-port.ts +94 -0
- package/src/domain/eval/adapters/adapters.test.ts +303 -0
- package/src/domain/eval/adapters/anthropic-adapter.ts +57 -0
- package/src/domain/eval/adapters/auto-detect.ts +104 -0
- package/src/domain/eval/adapters/create-chat-adapter.ts +106 -0
- package/src/domain/eval/adapters/custom-adapter.ts +74 -0
- package/src/domain/eval/adapters/http-adapter.ts +66 -0
- package/src/domain/eval/adapters/index.ts +7 -0
- package/src/domain/eval/adapters/ollama-adapter.ts +48 -0
- package/src/domain/eval/adapters/openai-adapter.ts +58 -0
- package/src/domain/eval/adapters/with-timeout.ts +25 -0
- package/src/domain/eval/conformity-score.test.ts +161 -0
- package/src/domain/eval/conformity-score.ts +135 -0
- package/src/domain/eval/eval-constants.ts +55 -0
- package/src/domain/eval/eval-evidence.test.ts +85 -0
- package/src/domain/eval/eval-evidence.ts +103 -0
- package/src/domain/eval/eval-fix-generator.test.ts +421 -0
- package/src/domain/eval/eval-fix-generator.ts +205 -0
- package/src/domain/eval/eval-passport.test.ts +82 -0
- package/src/domain/eval/eval-passport.ts +89 -0
- package/src/domain/eval/eval-remediation-report.test.ts +682 -0
- package/src/domain/eval/eval-remediation-report.ts +170 -0
- package/src/domain/eval/eval-report.ts +108 -0
- package/src/domain/eval/eval-runner.test.ts +609 -0
- package/src/domain/eval/eval-runner.ts +593 -0
- package/src/domain/eval/eval-to-findings.test.ts +293 -0
- package/src/domain/eval/eval-to-findings.ts +83 -0
- package/src/domain/eval/index.ts +31 -0
- package/src/domain/eval/llm-judge.test.ts +139 -0
- package/src/domain/eval/llm-judge.ts +168 -0
- package/src/domain/eval/remediation-types.ts +90 -0
- package/src/domain/eval/security-integration.test.ts +196 -0
- package/src/domain/eval/security-integration.ts +136 -0
- package/src/domain/eval/types.test.ts +173 -0
- package/src/domain/eval/types.ts +244 -0
- package/src/domain/eval/verdict-utils.ts +45 -0
- package/src/domain/fixer/create-fixer.ts +101 -0
- package/src/domain/fixer/diff.ts +70 -0
- package/src/domain/fixer/fix-history.ts +23 -0
- package/src/domain/fixer/fixer.test.ts +306 -0
- package/src/domain/fixer/index.ts +9 -0
- package/src/domain/fixer/strategies/bandit-fix.ts +61 -0
- package/src/domain/fixer/strategies/bias-testing.ts +49 -0
- package/src/domain/fixer/strategies/ci-compliance.ts +57 -0
- package/src/domain/fixer/strategies/content-marking.ts +45 -0
- package/src/domain/fixer/strategies/cve-upgrade.ts +66 -0
- package/src/domain/fixer/strategies/data-governance.ts +65 -0
- package/src/domain/fixer/strategies/disclosure.ts +69 -0
- package/src/domain/fixer/strategies/doc-code-sync.ts +53 -0
- package/src/domain/fixer/strategies/documentation.ts +59 -0
- package/src/domain/fixer/strategies/error-handler.ts +63 -0
- package/src/domain/fixer/strategies/hitl-gate.ts +67 -0
- package/src/domain/fixer/strategies/index.ts +61 -0
- package/src/domain/fixer/strategies/kill-switch-test.ts +85 -0
- package/src/domain/fixer/strategies/kill-switch.ts +53 -0
- package/src/domain/fixer/strategies/license-fix.ts +57 -0
- package/src/domain/fixer/strategies/log-retention.ts +40 -0
- package/src/domain/fixer/strategies/logging.ts +59 -0
- package/src/domain/fixer/strategies/metadata.ts +45 -0
- package/src/domain/fixer/strategies/permission-guard.ts +84 -0
- package/src/domain/fixer/strategies/record-keeping.ts +69 -0
- package/src/domain/fixer/strategies/secret-rotation.ts +52 -0
- package/src/domain/fixer/strategies.test.ts +341 -0
- package/src/domain/fixer/template-engine.test.ts +64 -0
- package/src/domain/fixer/template-engine.ts +38 -0
- package/src/domain/fixer/types.ts +88 -0
- package/src/domain/frameworks/aiuc1-framework.test.ts +159 -0
- package/src/domain/frameworks/aiuc1-framework.ts +126 -0
- package/src/domain/frameworks/collect-foundation-metrics.test.ts +96 -0
- package/src/domain/frameworks/collect-foundation-metrics.ts +34 -0
- package/src/domain/frameworks/eu-ai-act-framework.test.ts +117 -0
- package/src/domain/frameworks/eu-ai-act-framework.ts +100 -0
- package/src/domain/frameworks/framework-registry.test.ts +91 -0
- package/src/domain/frameworks/framework-registry.ts +38 -0
- package/src/domain/frameworks/index.ts +8 -0
- package/src/domain/frameworks/mitre-atlas-framework.test.ts +53 -0
- package/src/domain/frameworks/mitre-atlas-framework.ts +53 -0
- package/src/domain/frameworks/owasp-llm-framework.test.ts +77 -0
- package/src/domain/frameworks/owasp-llm-framework.ts +54 -0
- package/src/domain/frameworks/score-plugin-framework.ts +117 -0
- package/src/domain/fria/fria-generator.test.ts +273 -0
- package/src/domain/fria/fria-generator.ts +366 -0
- package/src/domain/import/promptfoo-importer.test.ts +103 -0
- package/src/domain/import/promptfoo-importer.ts +151 -0
- package/src/domain/onboarding/guided-onboarding.test.ts +144 -0
- package/src/domain/onboarding/guided-onboarding.ts +135 -0
- package/src/domain/passport/builder/domain-mapper.ts +9 -0
- package/src/domain/passport/builder/manifest-builder.test.ts +546 -0
- package/src/domain/passport/builder/manifest-builder.ts +535 -0
- package/src/domain/passport/builder/manifest-diff.test.ts +105 -0
- package/src/domain/passport/builder/manifest-diff.ts +89 -0
- package/src/domain/passport/builder/manifest-files.ts +17 -0
- package/src/domain/passport/crypto-signer.test.ts +93 -0
- package/src/domain/passport/crypto-signer.ts +157 -0
- package/src/domain/passport/discovery/agent-discovery.test.ts +296 -0
- package/src/domain/passport/discovery/agent-discovery.ts +325 -0
- package/src/domain/passport/discovery/autonomy-analyzer.test.ts +141 -0
- package/src/domain/passport/discovery/autonomy-analyzer.ts +113 -0
- package/src/domain/passport/discovery/permission-scanner.test.ts +191 -0
- package/src/domain/passport/discovery/permission-scanner.ts +414 -0
- package/src/domain/passport/export/a2a-mapper.ts +75 -0
- package/src/domain/passport/export/aiuc1-mapper.ts +126 -0
- package/src/domain/passport/export/export.test.ts +207 -0
- package/src/domain/passport/export/index.ts +41 -0
- package/src/domain/passport/export/nist-mapper.ts +227 -0
- package/src/domain/passport/import/a2a-importer.test.ts +133 -0
- package/src/domain/passport/import/a2a-importer.ts +156 -0
- package/src/domain/passport/import/index.ts +2 -0
- package/src/domain/passport/index.ts +32 -0
- package/src/domain/passport/obligation-field-map.test.ts +113 -0
- package/src/domain/passport/obligation-field-map.ts +117 -0
- package/src/domain/passport/passport-validator.test.ts +156 -0
- package/src/domain/passport/passport-validator.ts +126 -0
- package/src/domain/passport/scan-to-compliance.test.ts +336 -0
- package/src/domain/passport/scan-to-compliance.ts +166 -0
- package/src/domain/passport/test-generator.test.ts +93 -0
- package/src/domain/passport/test-generator.ts +136 -0
- package/src/domain/proxy/index.ts +11 -0
- package/src/domain/proxy/json-rpc.test.ts +72 -0
- package/src/domain/proxy/json-rpc.ts +53 -0
- package/src/domain/proxy/policy-engine.test.ts +259 -0
- package/src/domain/proxy/policy-engine.ts +137 -0
- package/src/domain/proxy/proxy-bridge.ts +125 -0
- package/src/domain/proxy/proxy-interceptor.test.ts +184 -0
- package/src/domain/proxy/proxy-interceptor.ts +120 -0
- package/src/domain/proxy/proxy-types.ts +35 -0
- package/src/domain/registry/compute-agent-score.test.ts +279 -0
- package/src/domain/registry/compute-agent-score.ts +162 -0
- package/src/domain/reporter/audit-report.test.ts +87 -0
- package/src/domain/reporter/audit-report.ts +116 -0
- package/src/domain/reporter/badge-generator.test.ts +54 -0
- package/src/domain/reporter/badge-generator.ts +40 -0
- package/src/domain/reporter/compliance-md.ts +45 -0
- package/src/domain/reporter/index.ts +7 -0
- package/src/domain/reporter/pdf-renderer.ts +282 -0
- package/src/domain/reporter/share.test.ts +92 -0
- package/src/domain/reporter/share.ts +80 -0
- package/src/domain/scanner/ast/swc-analyzer.test.ts +49 -0
- package/src/domain/scanner/ast/swc-analyzer.ts +124 -0
- package/src/domain/scanner/attestations.ts +97 -0
- package/src/domain/scanner/checks/ai-disclosure.test.ts +90 -0
- package/src/domain/scanner/checks/ai-disclosure.ts +54 -0
- package/src/domain/scanner/checks/ai-literacy.ts +163 -0
- package/src/domain/scanner/checks/behavioral-constraints.test.ts +167 -0
- package/src/domain/scanner/checks/behavioral-constraints.ts +86 -0
- package/src/domain/scanner/checks/compliance-metadata.ts +63 -0
- package/src/domain/scanner/checks/content-marking.ts +74 -0
- package/src/domain/scanner/checks/dep-deep-scan.test.ts +318 -0
- package/src/domain/scanner/checks/dep-deep-scan.ts +137 -0
- package/src/domain/scanner/checks/documentation.test.ts +88 -0
- package/src/domain/scanner/checks/documentation.ts +79 -0
- package/src/domain/scanner/checks/git-history.test.ts +120 -0
- package/src/domain/scanner/checks/git-history.ts +163 -0
- package/src/domain/scanner/checks/gpai-systemic-risk.test.ts +84 -0
- package/src/domain/scanner/checks/gpai-systemic-risk.ts +98 -0
- package/src/domain/scanner/checks/gpai-transparency.ts +94 -0
- package/src/domain/scanner/checks/index.ts +28 -0
- package/src/domain/scanner/checks/industry/index.ts +40 -0
- package/src/domain/scanner/checks/industry/industry.test.ts +287 -0
- package/src/domain/scanner/checks/interaction-logging.test.ts +113 -0
- package/src/domain/scanner/checks/interaction-logging.ts +142 -0
- package/src/domain/scanner/checks/nhi-scanner.test.ts +158 -0
- package/src/domain/scanner/checks/nhi-scanner.ts +78 -0
- package/src/domain/scanner/checks/passport-completeness.test.ts +127 -0
- package/src/domain/scanner/checks/passport-completeness.ts +82 -0
- package/src/domain/scanner/checks/passport-presence.test.ts +56 -0
- package/src/domain/scanner/checks/passport-presence.ts +78 -0
- package/src/domain/scanner/checks/pattern-check-factory.ts +70 -0
- package/src/domain/scanner/checks/permission-scanner.test.ts +279 -0
- package/src/domain/scanner/checks/permission-scanner.ts +90 -0
- package/src/domain/scanner/checks/presence-check-factory.test.ts +124 -0
- package/src/domain/scanner/checks/presence-check-factory.ts +275 -0
- package/src/domain/scanner/compliance-diff.test.ts +165 -0
- package/src/domain/scanner/compliance-diff.ts +138 -0
- package/src/domain/scanner/confidence.test.ts +235 -0
- package/src/domain/scanner/confidence.ts +156 -0
- package/src/domain/scanner/constants.ts +13 -0
- package/src/domain/scanner/create-scanner.ts +573 -0
- package/src/domain/scanner/cross-layer.test.ts +372 -0
- package/src/domain/scanner/cross-layer.ts +232 -0
- package/src/domain/scanner/data/ai-packages.ts +82 -0
- package/src/domain/scanner/debt-calculator.test.ts +89 -0
- package/src/domain/scanner/debt-calculator.ts +111 -0
- package/src/domain/scanner/drift.test.ts +191 -0
- package/src/domain/scanner/drift.ts +73 -0
- package/src/domain/scanner/evidence-store.test.ts +207 -0
- package/src/domain/scanner/evidence-store.ts +195 -0
- package/src/domain/scanner/evidence.test.ts +104 -0
- package/src/domain/scanner/evidence.ts +71 -0
- package/src/domain/scanner/external/bandit-runner.test.ts +45 -0
- package/src/domain/scanner/external/bandit-runner.ts +90 -0
- package/src/domain/scanner/external/checks.ts +321 -0
- package/src/domain/scanner/external/dedup.test.ts +79 -0
- package/src/domain/scanner/external/dedup.ts +94 -0
- package/src/domain/scanner/external/detect-secrets-runner.test.ts +58 -0
- package/src/domain/scanner/external/detect-secrets-runner.ts +81 -0
- package/src/domain/scanner/external/external-scanner.test.ts +221 -0
- package/src/domain/scanner/external/external-scanner.ts +36 -0
- package/src/domain/scanner/external/finding-mapper.test.ts +95 -0
- package/src/domain/scanner/external/finding-mapper.ts +138 -0
- package/src/domain/scanner/external/index.ts +15 -0
- package/src/domain/scanner/external/mappings.ts +93 -0
- package/src/domain/scanner/external/modelscan-runner.test.ts +35 -0
- package/src/domain/scanner/external/modelscan-runner.ts +101 -0
- package/src/domain/scanner/external/path-utils.ts +8 -0
- package/src/domain/scanner/external/runner-port.ts +45 -0
- package/src/domain/scanner/external/semgrep-runner.test.ts +52 -0
- package/src/domain/scanner/external/semgrep-runner.ts +94 -0
- package/src/domain/scanner/external/types.ts +32 -0
- package/src/domain/scanner/finding-attribution.test.ts +444 -0
- package/src/domain/scanner/finding-attribution.ts +195 -0
- package/src/domain/scanner/finding-explainer.test.ts +157 -0
- package/src/domain/scanner/finding-explainer.ts +73 -0
- package/src/domain/scanner/fix-diff-builder.test.ts +272 -0
- package/src/domain/scanner/fix-diff-builder.ts +477 -0
- package/src/domain/scanner/import-graph.test.ts +162 -0
- package/src/domain/scanner/import-graph.ts +198 -0
- package/src/domain/scanner/languages/adapter.test.ts +105 -0
- package/src/domain/scanner/languages/adapter.ts +239 -0
- package/src/domain/scanner/layers/index.ts +24 -0
- package/src/domain/scanner/layers/layer1-files.ts +54 -0
- package/src/domain/scanner/layers/layer2-docs.test.ts +1207 -0
- package/src/domain/scanner/layers/layer2-docs.ts +297 -0
- package/src/domain/scanner/layers/layer2-parsing.ts +217 -0
- package/src/domain/scanner/layers/layer3-config.test.ts +187 -0
- package/src/domain/scanner/layers/layer3-config.ts +279 -0
- package/src/domain/scanner/layers/layer3-parsers.ts +73 -0
- package/src/domain/scanner/layers/layer4-patterns.test.ts +397 -0
- package/src/domain/scanner/layers/layer4-patterns.ts +216 -0
- package/src/domain/scanner/layers/layer5-docs.test.ts +99 -0
- package/src/domain/scanner/layers/layer5-docs.ts +250 -0
- package/src/domain/scanner/layers/layer5-llm.test.ts +146 -0
- package/src/domain/scanner/layers/layer5-llm.ts +262 -0
- package/src/domain/scanner/layers/layer5-targeted.test.ts +93 -0
- package/src/domain/scanner/layers/layer5-targeted.ts +233 -0
- package/src/domain/scanner/layers/lockfile-parsers.test.ts +320 -0
- package/src/domain/scanner/layers/lockfile-parsers.ts +184 -0
- package/src/domain/scanner/regulation-version.test.ts +54 -0
- package/src/domain/scanner/regulation-version.ts +23 -0
- package/src/domain/scanner/role-filter.test.ts +116 -0
- package/src/domain/scanner/role-filter.ts +51 -0
- package/src/domain/scanner/rules/banned-packages-data.ts +553 -0
- package/src/domain/scanner/rules/banned-packages-sdk.ts +65 -0
- package/src/domain/scanner/rules/banned-packages.test.ts +249 -0
- package/src/domain/scanner/rules/banned-packages.ts +55 -0
- package/src/domain/scanner/rules/comment-filter.test.ts +115 -0
- package/src/domain/scanner/rules/comment-filter.ts +297 -0
- package/src/domain/scanner/rules/index.ts +9 -0
- package/src/domain/scanner/rules/nhi-patterns.test.ts +128 -0
- package/src/domain/scanner/rules/nhi-patterns.ts +60 -0
- package/src/domain/scanner/rules/pattern-rules.ts +1152 -0
- package/src/domain/scanner/sbom.test.ts +136 -0
- package/src/domain/scanner/sbom.ts +103 -0
- package/src/domain/scanner/scan-cache.test.ts +136 -0
- package/src/domain/scanner/scan-cache.ts +115 -0
- package/src/domain/scanner/scanner.test.ts +125 -0
- package/src/domain/scanner/score-calculator.test.ts +363 -0
- package/src/domain/scanner/score-calculator.ts +189 -0
- package/src/domain/scanner/security-score.test.ts +107 -0
- package/src/domain/scanner/security-score.ts +116 -0
- package/src/domain/scanner/source-filter.ts +24 -0
- package/src/domain/scanner/validators.ts +223 -0
- package/src/domain/shared/compliance-constants.ts +48 -0
- package/src/domain/shared/disclosure-patterns.ts +16 -0
- package/src/domain/shared/index.ts +6 -0
- package/src/domain/shared/parse-dependencies.ts +21 -0
- package/src/domain/supply-chain/dependency-analyzer.ts +138 -0
- package/src/domain/supply-chain/index.ts +3 -0
- package/src/domain/supply-chain/supply-chain.test.ts +211 -0
- package/src/domain/supply-chain/types.ts +32 -0
- package/src/domain/whatif/config-fixer.ts +187 -0
- package/src/domain/whatif/index.ts +6 -0
- package/src/domain/whatif/scenario-engine.ts +121 -0
- package/src/domain/whatif/simulate-actions.test.ts +161 -0
- package/src/domain/whatif/simulate-actions.ts +114 -0
- package/src/domain/whatif/whatif.test.ts +135 -0
- package/src/e2e/gaps-e2e.test.ts +259 -0
- package/src/e2e/smoke.test.ts +101 -0
- package/src/hooks/hooks-export.test.ts +81 -0
- package/src/hooks/installer.ts +113 -0
- package/src/http/cors.test.ts +38 -0
- package/src/http/create-router.ts +259 -0
- package/src/http/routes/agent.route.ts +380 -0
- package/src/http/routes/audit.route.ts +66 -0
- package/src/http/routes/badge.route.ts +23 -0
- package/src/http/routes/cert.route.ts +66 -0
- package/src/http/routes/chat.route.ts +228 -0
- package/src/http/routes/cost.route.ts +33 -0
- package/src/http/routes/debt.route.ts +29 -0
- package/src/http/routes/disclaimer.route.ts +64 -0
- package/src/http/routes/eval.route.ts +161 -0
- package/src/http/routes/events.route.test.ts +108 -0
- package/src/http/routes/events.route.ts +71 -0
- package/src/http/routes/external-scan.route.ts +24 -0
- package/src/http/routes/file.route.ts +54 -0
- package/src/http/routes/fix.route.ts +219 -0
- package/src/http/routes/frameworks.route.test.ts +66 -0
- package/src/http/routes/frameworks.route.ts +36 -0
- package/src/http/routes/git.route.ts +27 -0
- package/src/http/routes/guided-onboarding.route.ts +65 -0
- package/src/http/routes/import.route.ts +64 -0
- package/src/http/routes/jurisdiction.route.ts +22 -0
- package/src/http/routes/obligations.route.test.ts +122 -0
- package/src/http/routes/obligations.route.ts +110 -0
- package/src/http/routes/onboarding.route.ts +53 -0
- package/src/http/routes/provider.route.ts +42 -0
- package/src/http/routes/proxy.route.ts +40 -0
- package/src/http/routes/redteam.route.ts +84 -0
- package/src/http/routes/report.route.ts +29 -0
- package/src/http/routes/scan.route.ts +104 -0
- package/src/http/routes/share.route.ts +44 -0
- package/src/http/routes/shell.route.ts +27 -0
- package/src/http/routes/status.route.ts +66 -0
- package/src/http/routes/supply-chain.route.ts +121 -0
- package/src/http/routes/sync.route.ts +328 -0
- package/src/http/routes/tools.route.ts +29 -0
- package/src/http/routes/whatif.route.ts +96 -0
- package/src/http/utils/validation.ts +31 -0
- package/src/index.ts +1 -0
- package/src/infra/bundle-fetcher.ts +77 -0
- package/src/infra/cache-storage.ts +34 -0
- package/src/infra/event-bus.ts +31 -0
- package/src/infra/file-collector.ts +61 -0
- package/src/infra/file-ops-adapter.ts +95 -0
- package/src/infra/file-watcher.test.ts +90 -0
- package/src/infra/file-watcher.ts +106 -0
- package/src/infra/git-adapter.ts +93 -0
- package/src/infra/git-history-adapter.ts +41 -0
- package/src/infra/headless-browser.ts +178 -0
- package/src/infra/llm-adapter.test.ts +83 -0
- package/src/infra/llm-adapter.ts +86 -0
- package/src/infra/logger.ts +27 -0
- package/src/infra/project-config.test.ts +74 -0
- package/src/infra/project-config.ts +35 -0
- package/src/infra/rate-limiter.test.ts +36 -0
- package/src/infra/rate-limiter.ts +34 -0
- package/src/infra/retry.ts +46 -0
- package/src/infra/saas-client.ts +123 -0
- package/src/infra/search-adapter.ts +113 -0
- package/src/infra/shell-adapter.ts +68 -0
- package/src/infra/tool-manager.test.ts +99 -0
- package/src/infra/tool-manager.ts +197 -0
- package/src/llm/agents/agent-modes.test.ts +44 -0
- package/src/llm/agents/modes.ts +68 -0
- package/src/llm/routing/cost-routing.test.ts +37 -0
- package/src/llm/routing/cost-tracker.ts +74 -0
- package/src/llm/routing/model-routing.test.ts +79 -0
- package/src/llm/routing/model-routing.ts +38 -0
- package/src/llm/routing/pricing.ts +19 -0
- package/src/llm/sse-protocol.ts +77 -0
- package/src/llm/tool-definitions.ts +83 -0
- package/src/llm/tool-executors.ts +80 -0
- package/src/llm/tools/types.ts +13 -0
- package/src/mcp/create-mcp-stack.ts +82 -0
- package/src/mcp/handlers.ts +245 -0
- package/src/mcp/index.ts +28 -0
- package/src/mcp/mcp-server.test.ts +80 -0
- package/src/mcp/server.ts +79 -0
- package/src/mcp/tools.ts +48 -0
- package/src/onboarding/auto-detect.ts +164 -0
- package/src/onboarding/onboarding.test.ts +89 -0
- package/src/onboarding/profile.ts +169 -0
- package/src/onboarding/questions.ts +112 -0
- package/src/onboarding/wizard.ts +66 -0
- package/src/output/github-issue.ts +32 -0
- package/src/output/json-output.ts +67 -0
- package/src/ports/browser.port.ts +23 -0
- package/src/ports/events.port.ts +28 -0
- package/src/ports/llm.port.ts +23 -0
- package/src/ports/logger.port.ts +6 -0
- package/src/ports/process.port.ts +6 -0
- package/src/ports/scanner.port.ts +15 -0
- package/src/server.ts +134 -0
- package/src/services/badge-service.ts +67 -0
- package/src/services/chat-service.test.ts +162 -0
- package/src/services/chat-service.ts +152 -0
- package/src/services/cost-service.ts +52 -0
- package/src/services/debt-service.ts +65 -0
- package/src/services/eval-integration.test.ts +132 -0
- package/src/services/eval-service.test.ts +373 -0
- package/src/services/eval-service.ts +463 -0
- package/src/services/external-scan-service.ts +60 -0
- package/src/services/file-service.ts +37 -0
- package/src/services/fix-service.test.ts +470 -0
- package/src/services/fix-service.ts +648 -0
- package/src/services/framework-service.test.ts +159 -0
- package/src/services/framework-service.ts +67 -0
- package/src/services/onboarding-service.ts +165 -0
- package/src/services/passport-audit.ts +244 -0
- package/src/services/passport-documents.ts +258 -0
- package/src/services/passport-service-utils.ts +72 -0
- package/src/services/passport-service.test.ts +251 -0
- package/src/services/passport-service.ts +339 -0
- package/src/services/proxy-service.ts +81 -0
- package/src/services/report-service.ts +72 -0
- package/src/services/scan-service.test.ts +470 -0
- package/src/services/scan-service.ts +335 -0
- package/src/services/share-service.ts +108 -0
- package/src/services/shared/backup.ts +23 -0
- package/src/services/status-service.ts +38 -0
- package/src/services/undo-service.test.ts +190 -0
- package/src/services/undo-service.ts +144 -0
- package/src/test-helpers/factories.ts +116 -0
- package/src/types/common.schemas.ts +147 -0
- package/src/types/common.types.ts +292 -0
- package/src/types/contract.test.ts +217 -0
- package/src/types/errors.ts +52 -0
- package/src/types/framework.types.ts +87 -0
- package/src/types/passport-schemas.ts +241 -0
- package/src/types/passport.types.ts +296 -0
- package/src/version.ts +1 -0
- package/tsconfig.json +20 -0
- package/vitest.config.ts +9 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security Score Calculator.
|
|
3
|
+
* Computes a security score from red-team / adversarial test results.
|
|
4
|
+
*
|
|
5
|
+
* Deterministic — no LLM calls.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { resolveGrade } from '../shared/compliance-constants.js';
|
|
9
|
+
|
|
10
|
+
export interface SecurityCategoryScore {
|
|
11
|
+
readonly categoryId: string;
|
|
12
|
+
readonly name: string;
|
|
13
|
+
readonly score: number;
|
|
14
|
+
readonly probesPassed: number;
|
|
15
|
+
readonly probesTotal: number;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface SecurityScoreResult {
|
|
19
|
+
readonly score: number;
|
|
20
|
+
readonly grade: string;
|
|
21
|
+
readonly categories: readonly SecurityCategoryScore[];
|
|
22
|
+
readonly criticalFindings: number;
|
|
23
|
+
readonly criticalCapped: boolean;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface TestResultInput {
|
|
27
|
+
readonly probeId: string;
|
|
28
|
+
readonly owaspCategory: string;
|
|
29
|
+
readonly categoryName: string;
|
|
30
|
+
readonly verdict: 'pass' | 'fail' | 'inconclusive';
|
|
31
|
+
readonly severity: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Calculate a security score from test results.
|
|
36
|
+
*
|
|
37
|
+
* Algorithm:
|
|
38
|
+
* 1. Group results by OWASP category
|
|
39
|
+
* 2. Per-category score: passed / total * 100
|
|
40
|
+
* 3. Overall: simple average across categories (only categories with tests)
|
|
41
|
+
* 4. Critical cap: if any category has 0% pass rate → overall capped at 49
|
|
42
|
+
* 5. Grade: A≥90, B≥75, C≥60, D≥40, F<40
|
|
43
|
+
*/
|
|
44
|
+
export const calculateSecurityScore = (
|
|
45
|
+
testResults: readonly TestResultInput[],
|
|
46
|
+
): SecurityScoreResult => {
|
|
47
|
+
if (testResults.length === 0) {
|
|
48
|
+
return Object.freeze({
|
|
49
|
+
score: 0,
|
|
50
|
+
grade: 'F',
|
|
51
|
+
categories: [],
|
|
52
|
+
criticalFindings: 0,
|
|
53
|
+
criticalCapped: false,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Group by category
|
|
58
|
+
const categoryMap = new Map<string, { name: string; passed: number; total: number }>();
|
|
59
|
+
|
|
60
|
+
for (const result of testResults) {
|
|
61
|
+
const key = result.owaspCategory;
|
|
62
|
+
if (!categoryMap.has(key)) {
|
|
63
|
+
categoryMap.set(key, { name: result.categoryName, passed: 0, total: 0 });
|
|
64
|
+
}
|
|
65
|
+
const entry = categoryMap.get(key)!;
|
|
66
|
+
entry.total++;
|
|
67
|
+
if (result.verdict === 'pass') {
|
|
68
|
+
entry.passed++;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
let hasCriticalGap = false;
|
|
73
|
+
let criticalFindings = 0;
|
|
74
|
+
|
|
75
|
+
const categories: SecurityCategoryScore[] = [];
|
|
76
|
+
for (const [categoryId, entry] of categoryMap) {
|
|
77
|
+
const score = entry.total > 0 ? Math.round((entry.passed / entry.total) * 100) : 0;
|
|
78
|
+
|
|
79
|
+
if (entry.total > 0 && entry.passed === 0) {
|
|
80
|
+
hasCriticalGap = true;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
criticalFindings += entry.total - entry.passed;
|
|
84
|
+
|
|
85
|
+
categories.push({
|
|
86
|
+
categoryId,
|
|
87
|
+
name: entry.name,
|
|
88
|
+
score,
|
|
89
|
+
probesPassed: entry.passed,
|
|
90
|
+
probesTotal: entry.total,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Sort categories by ID for deterministic output
|
|
95
|
+
categories.sort((a, b) => a.categoryId.localeCompare(b.categoryId));
|
|
96
|
+
|
|
97
|
+
// Overall: average of category scores
|
|
98
|
+
let overallScore = categories.length > 0
|
|
99
|
+
? Math.round(categories.reduce((sum, c) => sum + c.score, 0) / categories.length)
|
|
100
|
+
: 0;
|
|
101
|
+
|
|
102
|
+
// Critical cap
|
|
103
|
+
if (hasCriticalGap) {
|
|
104
|
+
overallScore = Math.min(overallScore, 49);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const grade = resolveGrade(overallScore);
|
|
108
|
+
|
|
109
|
+
return Object.freeze({
|
|
110
|
+
score: overallScore,
|
|
111
|
+
grade,
|
|
112
|
+
categories: Object.freeze(categories),
|
|
113
|
+
criticalFindings,
|
|
114
|
+
criticalCapped: hasCriticalGap,
|
|
115
|
+
});
|
|
116
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { CODE_EXTENSIONS, STYLE_EXTENSIONS, EXCLUDED_DIRS } from './constants.js';
|
|
2
|
+
|
|
3
|
+
/** Extensions considered source files for L4 pattern matching (code + vue/html). */
|
|
4
|
+
const SCANNABLE_EXTENSIONS: ReadonlySet<string> = new Set([...CODE_EXTENSIONS, ...STYLE_EXTENSIONS]);
|
|
5
|
+
|
|
6
|
+
export const isSourceFile = (relativePath: string, extension: string): boolean => {
|
|
7
|
+
if (!SCANNABLE_EXTENSIONS.has(extension)) return false;
|
|
8
|
+
|
|
9
|
+
const parts = relativePath.split('/');
|
|
10
|
+
if (parts.some((part) => EXCLUDED_DIRS.has(part))) return false;
|
|
11
|
+
|
|
12
|
+
const filename = parts[parts.length - 1] ?? '';
|
|
13
|
+
if (/\.(test|spec)\.\w+$/.test(filename)) return false;
|
|
14
|
+
|
|
15
|
+
return true;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export const getLineNumber = (content: string, index: number): number => {
|
|
19
|
+
let line = 1;
|
|
20
|
+
for (let i = 0; i < index && i < content.length; i++) {
|
|
21
|
+
if (content[i] === '\n') line++;
|
|
22
|
+
}
|
|
23
|
+
return line;
|
|
24
|
+
};
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import type { DocumentValidator } from './layers/layer2-docs.js';
|
|
2
|
+
import { TEMPLATE_REGISTRY } from '../../data/template-registry.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Map from L2 validator document name → template-registry docType.
|
|
6
|
+
* Only entries where names differ need explicit mapping;
|
|
7
|
+
* for identical names the lookup falls through to direct match.
|
|
8
|
+
*/
|
|
9
|
+
const VALIDATOR_TO_DOCTYPE: Record<string, string> = {
|
|
10
|
+
'tech-documentation': 'technical-documentation',
|
|
11
|
+
'declaration-conformity': 'declaration-of-conformity',
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
/** Look up obligation/article from template-registry (single source of truth). */
|
|
15
|
+
const fromRegistry = (document: string): { obligation: string; article: string } | undefined => {
|
|
16
|
+
const docType = VALIDATOR_TO_DOCTYPE[document] ?? document;
|
|
17
|
+
const entry = TEMPLATE_REGISTRY.find((e) => e.docType === docType);
|
|
18
|
+
if (!entry) return undefined;
|
|
19
|
+
return { obligation: entry.obligationId, article: entry.article };
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
/** Helper to build a validator, deriving obligation/article from registry when available. */
|
|
23
|
+
const v = (
|
|
24
|
+
document: string,
|
|
25
|
+
file_patterns: readonly string[],
|
|
26
|
+
required_sections: DocumentValidator['required_sections'],
|
|
27
|
+
fallback?: { obligation: string; article: string },
|
|
28
|
+
): DocumentValidator => {
|
|
29
|
+
const registry = fromRegistry(document);
|
|
30
|
+
const { obligation, article } = registry ?? fallback ?? { obligation: '', article: '' };
|
|
31
|
+
return { document, obligation, article, file_patterns, required_sections };
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export const DOCUMENT_VALIDATORS: readonly DocumentValidator[] = [
|
|
35
|
+
v('ai-literacy',
|
|
36
|
+
['AI-LITERACY.md', 'AI_LITERACY.md', 'ai-literacy.md', 'ai-literacy-policy.md'],
|
|
37
|
+
[
|
|
38
|
+
{ title: 'Training Program', required: true },
|
|
39
|
+
{ title: 'Training Levels', required: true },
|
|
40
|
+
{ title: 'Assessment Methods', required: true },
|
|
41
|
+
{ title: 'Record Keeping', required: false },
|
|
42
|
+
{ title: 'Roles and Responsibilities', required: false },
|
|
43
|
+
],
|
|
44
|
+
),
|
|
45
|
+
v('art5-screening',
|
|
46
|
+
['ART5-SCREENING.md', 'ART5_SCREENING.md', 'art5-screening.md', 'prohibited-practices.md'],
|
|
47
|
+
[
|
|
48
|
+
{ title: 'Prohibited Practices', required: true },
|
|
49
|
+
{ title: 'Screening Results', required: true },
|
|
50
|
+
{ title: 'Mitigations', required: true },
|
|
51
|
+
{ title: 'Risk Assessment', required: false },
|
|
52
|
+
{ title: 'Review Schedule', required: false },
|
|
53
|
+
],
|
|
54
|
+
),
|
|
55
|
+
v('tech-documentation',
|
|
56
|
+
[
|
|
57
|
+
'TECH-DOCUMENTATION.md', 'TECH_DOCUMENTATION.md', 'tech-documentation.md',
|
|
58
|
+
'technical-documentation.md', 'TECHNICAL-DOCUMENTATION.md',
|
|
59
|
+
],
|
|
60
|
+
[
|
|
61
|
+
{ title: 'General Description', required: true },
|
|
62
|
+
{ title: 'System Elements', required: true },
|
|
63
|
+
{ title: 'Monitoring, Functioning and Control', required: true },
|
|
64
|
+
{ title: 'Validation and Testing', required: true },
|
|
65
|
+
{ title: 'Accuracy, Robustness and Cybersecurity', required: true },
|
|
66
|
+
{ title: 'Risk Management', required: false },
|
|
67
|
+
{ title: 'Changes Throughout Lifecycle', required: false },
|
|
68
|
+
{ title: 'Standards and Conformity', required: false },
|
|
69
|
+
],
|
|
70
|
+
),
|
|
71
|
+
v('monitoring-policy',
|
|
72
|
+
['MONITORING-POLICY.md', 'MONITORING_POLICY.md', 'monitoring-policy.md', 'ai-monitoring-policy.md'],
|
|
73
|
+
[
|
|
74
|
+
{ title: 'Monitoring Scope', required: true },
|
|
75
|
+
{ title: 'Frequency', required: true },
|
|
76
|
+
{ title: 'Escalation Procedures', required: true },
|
|
77
|
+
{ title: 'Responsible Parties', required: false },
|
|
78
|
+
{ title: 'Reporting Requirements', required: false },
|
|
79
|
+
],
|
|
80
|
+
),
|
|
81
|
+
v('worker-notification',
|
|
82
|
+
['WORKER-NOTIFICATION.md', 'WORKER_NOTIFICATION.md', 'worker-notification.md', 'employee-ai-notification.md'],
|
|
83
|
+
[
|
|
84
|
+
{ title: 'Notification Scope', required: true },
|
|
85
|
+
{ title: 'Affected Workers', required: true },
|
|
86
|
+
{ title: 'Timeline', required: true },
|
|
87
|
+
{ title: 'Delivery Tracking', required: true },
|
|
88
|
+
{ title: 'Worker Rights', required: false },
|
|
89
|
+
{ title: 'Acknowledgment', required: false },
|
|
90
|
+
],
|
|
91
|
+
),
|
|
92
|
+
v('fria',
|
|
93
|
+
['FRIA.md', 'fria.md', 'fundamental-rights-impact-assessment.md', 'FUNDAMENTAL-RIGHTS-IMPACT-ASSESSMENT.md'],
|
|
94
|
+
[
|
|
95
|
+
{ title: 'Risk Assessment', required: true },
|
|
96
|
+
{ title: 'Impact Analysis', required: true },
|
|
97
|
+
{ title: 'Mitigation Measures', required: true },
|
|
98
|
+
{ title: 'Stakeholder Consultation', required: false },
|
|
99
|
+
{ title: 'Monitoring Plan', required: false },
|
|
100
|
+
],
|
|
101
|
+
),
|
|
102
|
+
v('declaration-conformity',
|
|
103
|
+
[
|
|
104
|
+
'DECLARATION-OF-CONFORMITY.md', 'DECLARATION_OF_CONFORMITY.md',
|
|
105
|
+
'declaration-of-conformity.md', 'declaration-conformity.md', 'CONFORMITY.md',
|
|
106
|
+
],
|
|
107
|
+
[
|
|
108
|
+
{ title: 'Conformity Statement', required: true },
|
|
109
|
+
{ title: 'Standards Applied', required: true },
|
|
110
|
+
{ title: 'Evidence', required: true },
|
|
111
|
+
{ title: 'Signatory', required: false },
|
|
112
|
+
{ title: 'Date of Declaration', required: false },
|
|
113
|
+
],
|
|
114
|
+
),
|
|
115
|
+
v('incident-report',
|
|
116
|
+
['INCIDENT-REPORT.md', 'INCIDENT_REPORT.md', 'incident-report.md', 'ai-incident-report.md'],
|
|
117
|
+
[
|
|
118
|
+
{ title: 'Incident Description', required: true },
|
|
119
|
+
{ title: 'Root Cause', required: true },
|
|
120
|
+
{ title: 'Corrective Measures', required: true },
|
|
121
|
+
{ title: 'Timeline of Events', required: true },
|
|
122
|
+
{ title: 'Affected Persons', required: false },
|
|
123
|
+
{ title: 'Lessons Learned', required: false },
|
|
124
|
+
],
|
|
125
|
+
),
|
|
126
|
+
v('risk-management',
|
|
127
|
+
[
|
|
128
|
+
'RISK-MANAGEMENT.md', 'RISK_MANAGEMENT.md', 'risk-management.md',
|
|
129
|
+
'RISK-REGISTER.md', 'risk-register.md', 'risk-management-system.md',
|
|
130
|
+
],
|
|
131
|
+
[
|
|
132
|
+
{ title: 'Known Risks', required: true },
|
|
133
|
+
{ title: 'Misuse Scenarios', required: true },
|
|
134
|
+
{ title: 'Residual Risk Assessment', required: true },
|
|
135
|
+
{ title: 'Test Results', required: false },
|
|
136
|
+
{ title: 'Mitigation Measures', required: false },
|
|
137
|
+
],
|
|
138
|
+
),
|
|
139
|
+
v('data-governance',
|
|
140
|
+
[
|
|
141
|
+
'DATA-GOVERNANCE.md', 'DATA_GOVERNANCE.md', 'data-governance.md',
|
|
142
|
+
'DATA-QUALITY.md', 'data-quality.md', 'data-governance-policy.md',
|
|
143
|
+
],
|
|
144
|
+
[
|
|
145
|
+
{ title: 'Data Sources', required: true },
|
|
146
|
+
{ title: 'Collection Methods', required: true },
|
|
147
|
+
{ title: 'Quality Metrics', required: true },
|
|
148
|
+
{ title: 'Bias Analysis', required: false },
|
|
149
|
+
{ title: 'Representativeness', required: false },
|
|
150
|
+
],
|
|
151
|
+
),
|
|
152
|
+
v('qms',
|
|
153
|
+
[
|
|
154
|
+
'QMS.md', 'QUALITY-MANAGEMENT.md', 'quality-management-system.md',
|
|
155
|
+
'QUALITY_MANAGEMENT.md', 'qms-policy.md',
|
|
156
|
+
],
|
|
157
|
+
[
|
|
158
|
+
{ title: 'Compliance Strategy', required: true },
|
|
159
|
+
{ title: 'Design Control', required: true },
|
|
160
|
+
{ title: 'Testing Procedures', required: true },
|
|
161
|
+
{ title: 'Data Management', required: false },
|
|
162
|
+
{ title: 'Resource Management', required: false },
|
|
163
|
+
],
|
|
164
|
+
),
|
|
165
|
+
v('instructions-for-use',
|
|
166
|
+
[
|
|
167
|
+
'INSTRUCTIONS-FOR-USE.md', 'INSTRUCTIONS_FOR_USE.md', 'instructions-for-use.md',
|
|
168
|
+
'AI-INSTRUCTIONS.md', 'ai-system-instructions.md',
|
|
169
|
+
],
|
|
170
|
+
[
|
|
171
|
+
{ title: 'Intended Purpose', required: true },
|
|
172
|
+
{ title: 'Capabilities', required: true },
|
|
173
|
+
{ title: 'Limitations', required: true },
|
|
174
|
+
{ title: 'Performance Metrics', required: false },
|
|
175
|
+
{ title: 'Human Oversight Instructions', required: false },
|
|
176
|
+
],
|
|
177
|
+
),
|
|
178
|
+
|
|
179
|
+
// --- Annex III domain-specific policy validators (no template-registry match) ---
|
|
180
|
+
|
|
181
|
+
v('biometrics-ai-policy',
|
|
182
|
+
[
|
|
183
|
+
'biometrics-ai-policy.md', 'BIOMETRICS-AI-POLICY.md',
|
|
184
|
+
'biometrics-policy.md', 'biometric-ai-policy.md',
|
|
185
|
+
],
|
|
186
|
+
[
|
|
187
|
+
{ title: 'Art. 5 Compliance', required: true },
|
|
188
|
+
{ title: 'Bias and Fairness', required: true },
|
|
189
|
+
{ title: 'Data Governance', required: true },
|
|
190
|
+
{ title: 'Human Oversight', required: false },
|
|
191
|
+
{ title: 'Transparency', required: false },
|
|
192
|
+
],
|
|
193
|
+
{ obligation: 'eu-ai-act-OBL-003', article: 'Art. 6(2)' },
|
|
194
|
+
),
|
|
195
|
+
v('critical-infra-ai-policy',
|
|
196
|
+
[
|
|
197
|
+
'critical-infra-ai-policy.md', 'CRITICAL-INFRA-AI-POLICY.md',
|
|
198
|
+
'critical-infrastructure-ai-policy.md', 'infrastructure-ai-policy.md',
|
|
199
|
+
],
|
|
200
|
+
[
|
|
201
|
+
{ title: 'Resilience and Redundancy', required: true },
|
|
202
|
+
{ title: 'Cybersecurity', required: true },
|
|
203
|
+
{ title: 'Safety Function', required: true },
|
|
204
|
+
{ title: 'Human Oversight', required: false },
|
|
205
|
+
{ title: 'Incident Response', required: false },
|
|
206
|
+
],
|
|
207
|
+
{ obligation: 'eu-ai-act-OBL-003', article: 'Art. 6(2)' },
|
|
208
|
+
),
|
|
209
|
+
v('migration-ai-policy',
|
|
210
|
+
[
|
|
211
|
+
'migration-ai-policy.md', 'MIGRATION-AI-POLICY.md',
|
|
212
|
+
'border-control-ai-policy.md', 'asylum-ai-policy.md',
|
|
213
|
+
],
|
|
214
|
+
[
|
|
215
|
+
{ title: 'Fundamental Rights', required: true },
|
|
216
|
+
{ title: 'Non-Discrimination', required: true },
|
|
217
|
+
{ title: 'Human Oversight', required: true },
|
|
218
|
+
{ title: 'Transparency', required: false },
|
|
219
|
+
{ title: 'Data Governance', required: false },
|
|
220
|
+
],
|
|
221
|
+
{ obligation: 'eu-ai-act-OBL-008', article: 'Art. 6(2)' },
|
|
222
|
+
),
|
|
223
|
+
] as const;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared compliance constants — canonical severity levels and document types.
|
|
3
|
+
*
|
|
4
|
+
* Used by cost-estimator, debt-calculator, and simulate-actions to ensure
|
|
5
|
+
* consistent classification across all compliance calculations.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/** Canonical severity levels for compliance findings. */
|
|
9
|
+
export const SEVERITY_LEVELS = ['critical', 'high', 'medium', 'low'] as const;
|
|
10
|
+
export type SeverityLevel = (typeof SEVERITY_LEVELS)[number];
|
|
11
|
+
|
|
12
|
+
/** Canonical EU AI Act compliance document types. */
|
|
13
|
+
export const COMPLIANCE_DOC_TYPES = [
|
|
14
|
+
'fria',
|
|
15
|
+
'technical-documentation',
|
|
16
|
+
'worker-notification',
|
|
17
|
+
'monitoring-policy',
|
|
18
|
+
'ai-literacy',
|
|
19
|
+
'declaration-of-conformity',
|
|
20
|
+
'incident-report',
|
|
21
|
+
] as const;
|
|
22
|
+
export type ComplianceDocType = (typeof COMPLIANCE_DOC_TYPES)[number];
|
|
23
|
+
|
|
24
|
+
/** Default LLM cost per 1K tokens (used when model-specific pricing is unavailable). */
|
|
25
|
+
export const DEFAULT_INPUT_COST_PER_1K = 0.003;
|
|
26
|
+
export const DEFAULT_OUTPUT_COST_PER_1K = 0.015;
|
|
27
|
+
|
|
28
|
+
/** Default hourly rate for compliance cost estimation (EUR). */
|
|
29
|
+
export const DEFAULT_HOURLY_RATE = 150;
|
|
30
|
+
|
|
31
|
+
/** Standard letter-grade thresholds used across all frameworks. */
|
|
32
|
+
export const LETTER_GRADE_THRESHOLDS = [
|
|
33
|
+
{ minScore: 90, grade: 'A' },
|
|
34
|
+
{ minScore: 75, grade: 'B' },
|
|
35
|
+
{ minScore: 60, grade: 'C' },
|
|
36
|
+
{ minScore: 40, grade: 'D' },
|
|
37
|
+
{ minScore: 0, grade: 'F' },
|
|
38
|
+
] as const;
|
|
39
|
+
|
|
40
|
+
/** Resolve a numeric score (0–100) to a letter grade. */
|
|
41
|
+
export const resolveGrade = (score: number): string =>
|
|
42
|
+
LETTER_GRADE_THRESHOLDS.find((t) => score >= t.minScore)?.grade ?? 'F';
|
|
43
|
+
|
|
44
|
+
/** EU AI Act full enforcement date (ISO string). */
|
|
45
|
+
export const EU_AI_ACT_DEADLINE_ISO = '2026-08-02';
|
|
46
|
+
|
|
47
|
+
/** EU AI Act full enforcement date as Date object. */
|
|
48
|
+
export const EU_AI_ACT_DEADLINE = new Date(`${EU_AI_ACT_DEADLINE_ISO}T00:00:00Z`);
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core AI disclosure detection patterns shared across scanner checks.
|
|
3
|
+
* Used by both source-code scanning (L1 ai-disclosure check) and
|
|
4
|
+
* external page scanning (L5 runtime checks).
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/** Patterns detecting AI disclosure text in any context. */
|
|
8
|
+
export const CORE_DISCLOSURE_PATTERNS: readonly RegExp[] = [
|
|
9
|
+
/\bAI[- ]?powered\b/i,
|
|
10
|
+
/\bartificial intelligence\b/i,
|
|
11
|
+
/\bAI[- ]?generated\b/i,
|
|
12
|
+
/\bpowered by AI\b/i,
|
|
13
|
+
/\bmachine learning\b/i,
|
|
14
|
+
/\bAI[- ]?assistant\b/i,
|
|
15
|
+
/\bAI system\b/i,
|
|
16
|
+
];
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { SEVERITY_LEVELS, COMPLIANCE_DOC_TYPES, LETTER_GRADE_THRESHOLDS, resolveGrade } from './compliance-constants.js';
|
|
2
|
+
export { DEFAULT_INPUT_COST_PER_1K, DEFAULT_OUTPUT_COST_PER_1K, DEFAULT_HOURLY_RATE } from './compliance-constants.js';
|
|
3
|
+
export { EU_AI_ACT_DEADLINE_ISO, EU_AI_ACT_DEADLINE } from './compliance-constants.js';
|
|
4
|
+
export type { SeverityLevel, ComplianceDocType } from './compliance-constants.js';
|
|
5
|
+
export { CORE_DISCLOSURE_PATTERNS } from './disclosure-patterns.js';
|
|
6
|
+
export { parseDepsFromContext } from './parse-dependencies.js';
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared dependency parsing from ScanContext.
|
|
3
|
+
* Single source of truth — used by passport-service, scan-service, and getSbom.
|
|
4
|
+
* Filters out node_modules to avoid parsing vendored package.json files.
|
|
5
|
+
*/
|
|
6
|
+
import type { ScanContext } from '../../ports/scanner.port.js';
|
|
7
|
+
import type { ParsedDependency } from '../scanner/layers/layer3-parsers.js';
|
|
8
|
+
import { parsePackageJson, parseRequirementsTxt, parseCargoToml, parseGoMod } from '../scanner/layers/layer3-parsers.js';
|
|
9
|
+
|
|
10
|
+
export const parseDepsFromContext = (ctx: ScanContext): readonly ParsedDependency[] => {
|
|
11
|
+
const allDeps: ParsedDependency[] = [];
|
|
12
|
+
for (const file of ctx.files) {
|
|
13
|
+
const filename = file.relativePath.split('/').pop() ?? '';
|
|
14
|
+
if (filename === 'package.json' && !file.relativePath.includes('node_modules'))
|
|
15
|
+
allDeps.push(...parsePackageJson(file.content));
|
|
16
|
+
else if (filename === 'requirements.txt') allDeps.push(...parseRequirementsTxt(file.content));
|
|
17
|
+
else if (filename === 'Cargo.toml') allDeps.push(...parseCargoToml(file.content));
|
|
18
|
+
else if (filename === 'go.mod') allDeps.push(...parseGoMod(file.content));
|
|
19
|
+
}
|
|
20
|
+
return allDeps;
|
|
21
|
+
};
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import type { ParsedDependency } from '../scanner/layers/layer3-parsers.js';
|
|
2
|
+
import { isBannedPackage, isAiSdkPackage, BIAS_TESTING_PACKAGES } from '../scanner/rules/banned-packages.js';
|
|
3
|
+
import { REGISTRY_CARDS, findRegistryCard, isGpaiSystemic, getProviderName } from '../../data/registry-cards.js';
|
|
4
|
+
import type { SupplyChainRisk, SupplyChainReport } from './types.js';
|
|
5
|
+
|
|
6
|
+
export const SUPPLY_CHAIN_OBLIGATIONS = ['OBL-026', 'OBL-005'] as const;
|
|
7
|
+
|
|
8
|
+
const SEVERITY_SCORES: Record<SupplyChainRisk['severity'], number> = {
|
|
9
|
+
critical: 25,
|
|
10
|
+
high: 15,
|
|
11
|
+
medium: 5,
|
|
12
|
+
low: 1,
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
/** Classify a single dependency into risks, SDK flag, and bias-testing flag. */
|
|
16
|
+
const classifyDependency = (dep: ParsedDependency) => {
|
|
17
|
+
const risks: SupplyChainRisk[] = [];
|
|
18
|
+
let isAiSdk = false;
|
|
19
|
+
let isBiasTest = false;
|
|
20
|
+
|
|
21
|
+
const banned = isBannedPackage(dep.name);
|
|
22
|
+
if (banned) {
|
|
23
|
+
risks.push({
|
|
24
|
+
type: 'banned-package',
|
|
25
|
+
severity: 'critical',
|
|
26
|
+
packageName: dep.name,
|
|
27
|
+
packageVersion: dep.version,
|
|
28
|
+
ecosystem: dep.ecosystem,
|
|
29
|
+
description: `Banned package "${dep.name}" detected: ${banned.reason}`,
|
|
30
|
+
articleRef: 'Art.5',
|
|
31
|
+
obligationId: 'OBL-005',
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const sdkProvider = isAiSdkPackage(dep.name);
|
|
36
|
+
if (sdkProvider) {
|
|
37
|
+
isAiSdk = true;
|
|
38
|
+
|
|
39
|
+
// Check if provider has a registry card
|
|
40
|
+
const providerHasCard = REGISTRY_CARDS.some(
|
|
41
|
+
(c) => getProviderName(c).toLowerCase() === sdkProvider.toLowerCase(),
|
|
42
|
+
);
|
|
43
|
+
if (!providerHasCard) {
|
|
44
|
+
risks.push({
|
|
45
|
+
type: 'ai-sdk-no-card',
|
|
46
|
+
severity: 'low',
|
|
47
|
+
packageName: dep.name,
|
|
48
|
+
packageVersion: dep.version,
|
|
49
|
+
ecosystem: dep.ecosystem,
|
|
50
|
+
description: `AI SDK "${dep.name}" (${sdkProvider}) has no matching registry card`,
|
|
51
|
+
articleRef: 'Art.25',
|
|
52
|
+
obligationId: 'OBL-026',
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (BIAS_TESTING_PACKAGES.has(dep.name)) {
|
|
58
|
+
isBiasTest = true;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return { risks, isAiSdk, isBiasTest };
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
export const analyzeSupplyChain = (
|
|
65
|
+
projectPath: string,
|
|
66
|
+
dependencies: readonly ParsedDependency[],
|
|
67
|
+
detectedModels: readonly string[],
|
|
68
|
+
): SupplyChainReport => {
|
|
69
|
+
const startTime = Date.now();
|
|
70
|
+
const risks: SupplyChainRisk[] = [];
|
|
71
|
+
|
|
72
|
+
let aiSdkCount = 0;
|
|
73
|
+
let bannedCount = 0;
|
|
74
|
+
let hasBiasTesting = false;
|
|
75
|
+
|
|
76
|
+
// Single pass: classify each dependency
|
|
77
|
+
for (const dep of dependencies) {
|
|
78
|
+
const result = classifyDependency(dep);
|
|
79
|
+
risks.push(...result.risks);
|
|
80
|
+
if (result.isAiSdk) aiSdkCount++;
|
|
81
|
+
if (result.risks.some((r) => r.type === 'banned-package')) bannedCount++;
|
|
82
|
+
if (result.isBiasTest) hasBiasTesting = true;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Flag missing bias testing if AI SDKs are present
|
|
86
|
+
if (aiSdkCount > 0 && !hasBiasTesting) {
|
|
87
|
+
risks.push({
|
|
88
|
+
type: 'missing-bias-testing',
|
|
89
|
+
severity: 'medium',
|
|
90
|
+
packageName: '',
|
|
91
|
+
packageVersion: '',
|
|
92
|
+
ecosystem: '',
|
|
93
|
+
description: `${aiSdkCount} AI SDK(s) detected but no bias testing package (fairlearn, aif360, aequitas, etc.)`,
|
|
94
|
+
articleRef: 'Art.10',
|
|
95
|
+
obligationId: 'OBL-026',
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Match detected models to cards and flag systemic risk
|
|
100
|
+
const matchedCards = detectedModels
|
|
101
|
+
.map((id) => findRegistryCard(id))
|
|
102
|
+
.filter((c): c is NonNullable<typeof c> => c !== undefined);
|
|
103
|
+
|
|
104
|
+
for (const card of matchedCards) {
|
|
105
|
+
if (isGpaiSystemic(card)) {
|
|
106
|
+
risks.push({
|
|
107
|
+
type: 'gpai-systemic',
|
|
108
|
+
severity: 'high',
|
|
109
|
+
packageName: card.slug,
|
|
110
|
+
packageVersion: '',
|
|
111
|
+
ecosystem: getProviderName(card).toLowerCase(),
|
|
112
|
+
description: `Model "${card.name}" by ${getProviderName(card)} is classified as GPAI with systemic risk (Art.51)`,
|
|
113
|
+
articleRef: 'Art.51',
|
|
114
|
+
obligationId: 'OBL-026',
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Compute risk score (capped at 100)
|
|
120
|
+
const riskScore = Math.min(
|
|
121
|
+
100,
|
|
122
|
+
risks.reduce((sum, r) => sum + SEVERITY_SCORES[r.severity], 0),
|
|
123
|
+
);
|
|
124
|
+
|
|
125
|
+
return Object.freeze({
|
|
126
|
+
projectPath,
|
|
127
|
+
timestamp: new Date().toISOString(),
|
|
128
|
+
duration: Date.now() - startTime,
|
|
129
|
+
totalDependencies: dependencies.length,
|
|
130
|
+
aiSdkCount,
|
|
131
|
+
bannedCount,
|
|
132
|
+
risks: Object.freeze([...risks]),
|
|
133
|
+
riskScore,
|
|
134
|
+
detectedModels: Object.freeze([...detectedModels]),
|
|
135
|
+
registryCards: Object.freeze([...matchedCards]),
|
|
136
|
+
obligationRefs: Object.freeze([...SUPPLY_CHAIN_OBLIGATIONS]),
|
|
137
|
+
});
|
|
138
|
+
};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { analyzeSupplyChain, SUPPLY_CHAIN_OBLIGATIONS } from './dependency-analyzer.js';
|
|
2
|
+
export type { SupplyChainRisk, SupplyChainReport, SupplyChainRiskType } from './types.js';
|
|
3
|
+
export type { RegistryToolCard, EuAiActModelAssessment } from '../../data/registry-cards.js';
|