@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.
Files changed (594) hide show
  1. package/.well-known/ai-compliance.json +16 -0
  2. package/COMPLIANCE.md +64 -0
  3. package/data/data-integrity.test.ts +75 -0
  4. package/data/eval/eval-mappings.json +33 -0
  5. package/data/llm/model-pricing.json +15 -0
  6. package/data/llm/model-routing.json +36 -0
  7. package/data/onboarding/risk-profile.json +17 -0
  8. package/data/regulations/eu-ai-act/README.md +245 -0
  9. package/data/regulations/eu-ai-act/applicability-tree.json +160 -0
  10. package/data/regulations/eu-ai-act/cross-mapping.json +175 -0
  11. package/data/regulations/eu-ai-act/localization.json +186 -0
  12. package/data/regulations/eu-ai-act/obligations.json +3981 -0
  13. package/data/regulations/eu-ai-act/regulation-meta.json +482 -0
  14. package/data/regulations/eu-ai-act/scoring.json +342 -0
  15. package/data/regulations/eu-ai-act/technical-requirements.json +2590 -0
  16. package/data/regulations/eu-ai-act/timeline.json +160 -0
  17. package/data/regulations/jurisdictions/at.json +15 -0
  18. package/data/regulations/jurisdictions/be.json +15 -0
  19. package/data/regulations/jurisdictions/bg.json +15 -0
  20. package/data/regulations/jurisdictions/cy.json +15 -0
  21. package/data/regulations/jurisdictions/cz.json +15 -0
  22. package/data/regulations/jurisdictions/de.json +15 -0
  23. package/data/regulations/jurisdictions/dk.json +15 -0
  24. package/data/regulations/jurisdictions/ee.json +15 -0
  25. package/data/regulations/jurisdictions/es.json +15 -0
  26. package/data/regulations/jurisdictions/fi.json +15 -0
  27. package/data/regulations/jurisdictions/fr.json +15 -0
  28. package/data/regulations/jurisdictions/gr.json +15 -0
  29. package/data/regulations/jurisdictions/hr.json +15 -0
  30. package/data/regulations/jurisdictions/hu.json +15 -0
  31. package/data/regulations/jurisdictions/ie.json +15 -0
  32. package/data/regulations/jurisdictions/is.json +15 -0
  33. package/data/regulations/jurisdictions/it.json +15 -0
  34. package/data/regulations/jurisdictions/li.json +15 -0
  35. package/data/regulations/jurisdictions/lt.json +15 -0
  36. package/data/regulations/jurisdictions/lu.json +15 -0
  37. package/data/regulations/jurisdictions/lv.json +15 -0
  38. package/data/regulations/jurisdictions/mt.json +15 -0
  39. package/data/regulations/jurisdictions/nl.json +15 -0
  40. package/data/regulations/jurisdictions/no.json +15 -0
  41. package/data/regulations/jurisdictions/pl.json +15 -0
  42. package/data/regulations/jurisdictions/pt.json +15 -0
  43. package/data/regulations/jurisdictions/ro.json +15 -0
  44. package/data/regulations/jurisdictions/se.json +15 -0
  45. package/data/regulations/jurisdictions/si.json +15 -0
  46. package/data/regulations/jurisdictions/sk.json +15 -0
  47. package/data/scanner/check-id-categories.json +81 -0
  48. package/data/scanner/confidence-params.json +16 -0
  49. package/data/scanner/limits.json +4 -0
  50. package/data/schemas/http-contract-sample.json +79 -0
  51. package/data/schemas/http-contract.json +144 -0
  52. package/data/semgrep-rules/bare-call.yaml +37 -0
  53. package/data/semgrep-rules/injection.yaml +73 -0
  54. package/data/semgrep-rules/missing-error-handling.yaml +58 -0
  55. package/data/semgrep-rules/unsafe-deser.yaml +65 -0
  56. package/data/templates/eu-ai-act/ai-literacy.md +184 -0
  57. package/data/templates/eu-ai-act/art5-screening.md +131 -0
  58. package/data/templates/eu-ai-act/data-governance.md +145 -0
  59. package/data/templates/eu-ai-act/declaration-of-conformity.md +161 -0
  60. package/data/templates/eu-ai-act/fria.md +127 -0
  61. package/data/templates/eu-ai-act/gpai-systemic-risk.md +150 -0
  62. package/data/templates/eu-ai-act/gpai-transparency.md +166 -0
  63. package/data/templates/eu-ai-act/incident-report.md +188 -0
  64. package/data/templates/eu-ai-act/instructions-for-use.md +202 -0
  65. package/data/templates/eu-ai-act/monitoring-policy.md +110 -0
  66. package/data/templates/eu-ai-act/qms.md +180 -0
  67. package/data/templates/eu-ai-act/risk-management-system.md +123 -0
  68. package/data/templates/eu-ai-act/technical-documentation.md +287 -0
  69. package/data/templates/eu-ai-act/worker-notification.md +143 -0
  70. package/data/templates/policies/biometrics-ai-policy.md +214 -0
  71. package/data/templates/policies/critical-infra-ai-policy.md +228 -0
  72. package/data/templates/policies/education-ai-policy.md +184 -0
  73. package/data/templates/policies/finance-ai-policy.md +191 -0
  74. package/data/templates/policies/healthcare-ai-policy.md +197 -0
  75. package/data/templates/policies/hr-ai-policy.md +178 -0
  76. package/data/templates/policies/legal-ai-policy.md +189 -0
  77. package/data/templates/policies/migration-ai-policy.md +239 -0
  78. package/engine.log +7 -0
  79. package/package.json +74 -0
  80. package/src/composition-root.ts +791 -0
  81. package/src/data/eval/conformity-tests.test.ts +122 -0
  82. package/src/data/eval/ct-1-transparency.ts +106 -0
  83. package/src/data/eval/ct-10-gpai.ts +25 -0
  84. package/src/data/eval/ct-11-industry.ts +42 -0
  85. package/src/data/eval/ct-2-oversight.ts +41 -0
  86. package/src/data/eval/ct-3-explanation.ts +14 -0
  87. package/src/data/eval/ct-4-bias.ts +83 -0
  88. package/src/data/eval/ct-5-accuracy.ts +41 -0
  89. package/src/data/eval/ct-6-robustness.ts +81 -0
  90. package/src/data/eval/ct-7-prohibited.ts +52 -0
  91. package/src/data/eval/ct-8-logging.ts +68 -0
  92. package/src/data/eval/ct-9-risk-awareness.ts +33 -0
  93. package/src/data/eval/deterministic-evaluator.ts +120 -0
  94. package/src/data/eval/index.ts +55 -0
  95. package/src/data/eval/judge-prompts.ts +146 -0
  96. package/src/data/eval/llm-judged-tests.ts +279 -0
  97. package/src/data/eval/llm-tests.test.ts +83 -0
  98. package/src/data/eval/remediation/ct-1-transparency.ts +91 -0
  99. package/src/data/eval/remediation/ct-10-gpai.ts +94 -0
  100. package/src/data/eval/remediation/ct-11-industry.ts +94 -0
  101. package/src/data/eval/remediation/ct-2-oversight.ts +71 -0
  102. package/src/data/eval/remediation/ct-3-explanation.ts +70 -0
  103. package/src/data/eval/remediation/ct-4-bias.ts +70 -0
  104. package/src/data/eval/remediation/ct-5-accuracy.ts +70 -0
  105. package/src/data/eval/remediation/ct-6-robustness.ts +70 -0
  106. package/src/data/eval/remediation/ct-7-prohibited.ts +94 -0
  107. package/src/data/eval/remediation/ct-8-logging.ts +94 -0
  108. package/src/data/eval/remediation/ct-9-risk-awareness.ts +94 -0
  109. package/src/data/eval/remediation/index.ts +89 -0
  110. package/src/data/eval/remediation/owasp-art5.ts +15 -0
  111. package/src/data/eval/remediation/owasp-llm01.ts +72 -0
  112. package/src/data/eval/remediation/owasp-llm02.ts +72 -0
  113. package/src/data/eval/remediation/owasp-llm03.ts +15 -0
  114. package/src/data/eval/remediation/owasp-llm04.ts +15 -0
  115. package/src/data/eval/remediation/owasp-llm05.ts +15 -0
  116. package/src/data/eval/remediation/owasp-llm06.ts +15 -0
  117. package/src/data/eval/remediation/owasp-llm07.ts +15 -0
  118. package/src/data/eval/remediation/owasp-llm08.ts +15 -0
  119. package/src/data/eval/remediation/owasp-llm09.ts +15 -0
  120. package/src/data/eval/remediation/owasp-llm10.ts +15 -0
  121. package/src/data/eval/remediation/remediation.test.ts +229 -0
  122. package/src/data/eval/remediation/test-mapping.ts +290 -0
  123. package/src/data/eval/security-rubrics.ts +381 -0
  124. package/src/data/finding-explanations.json +453 -0
  125. package/src/data/industry-patterns.ts +161 -0
  126. package/src/data/registry-cards.ts +368 -0
  127. package/src/data/regulation/index.ts +5 -0
  128. package/src/data/regulation/jurisdiction-data.test.ts +73 -0
  129. package/src/data/regulation/jurisdiction-data.ts +65 -0
  130. package/src/data/regulation/regulation-data.ts +19 -0
  131. package/src/data/regulation/regulation-loader.test.ts +107 -0
  132. package/src/data/regulation/regulation-loader.ts +56 -0
  133. package/src/data/scanner-constants.ts +46 -0
  134. package/src/data/schemas/schemas-core.ts +140 -0
  135. package/src/data/schemas/schemas-supplementary.ts +211 -0
  136. package/src/data/schemas/schemas.ts +28 -0
  137. package/src/data/security/attack-probes.test.ts +62 -0
  138. package/src/data/security/attack-probes.ts +496 -0
  139. package/src/data/security/eu-ai-act-security.ts +40 -0
  140. package/src/data/security/index.ts +19 -0
  141. package/src/data/security/mitre-atlas.test.ts +43 -0
  142. package/src/data/security/mitre-atlas.ts +93 -0
  143. package/src/data/security/nist-ai-rmf.ts +43 -0
  144. package/src/data/security/owasp-llm-top10.test.ts +60 -0
  145. package/src/data/security/owasp-llm-top10.ts +138 -0
  146. package/src/data/template-registry.ts +53 -0
  147. package/src/data/tool-versions.json +22 -0
  148. package/src/domain/audit/audit-package.test.ts +152 -0
  149. package/src/domain/audit/audit-package.ts +166 -0
  150. package/src/domain/audit/audit-trail.test.ts +121 -0
  151. package/src/domain/audit/audit-trail.ts +174 -0
  152. package/src/domain/audit/index.ts +8 -0
  153. package/src/domain/audit/permissions-matrix.test.ts +136 -0
  154. package/src/domain/audit/permissions-matrix.ts +121 -0
  155. package/src/domain/certification/adversarial/bias-tests.ts +95 -0
  156. package/src/domain/certification/adversarial/evaluators.ts +304 -0
  157. package/src/domain/certification/adversarial/index.ts +11 -0
  158. package/src/domain/certification/adversarial/prompt-injection.ts +103 -0
  159. package/src/domain/certification/adversarial/safety-boundary.ts +132 -0
  160. package/src/domain/certification/aiuc1-readiness.test.ts +236 -0
  161. package/src/domain/certification/aiuc1-readiness.ts +298 -0
  162. package/src/domain/certification/aiuc1-requirements.ts +235 -0
  163. package/src/domain/certification/index.ts +10 -0
  164. package/src/domain/certification/redteam-runner.test.ts +97 -0
  165. package/src/domain/certification/redteam-runner.ts +205 -0
  166. package/src/domain/certification/test-runner.test.ts +232 -0
  167. package/src/domain/certification/test-runner.ts +289 -0
  168. package/src/domain/cost/cost-estimator.test.ts +187 -0
  169. package/src/domain/cost/cost-estimator.ts +133 -0
  170. package/src/domain/disclaimer.test.ts +52 -0
  171. package/src/domain/disclaimer.ts +39 -0
  172. package/src/domain/documents/ai-enricher.test.ts +120 -0
  173. package/src/domain/documents/ai-enricher.ts +159 -0
  174. package/src/domain/documents/document-generator.test.ts +318 -0
  175. package/src/domain/documents/document-generator.ts +239 -0
  176. package/src/domain/documents/index.ts +9 -0
  177. package/src/domain/documents/passport-helpers.ts +25 -0
  178. package/src/domain/documents/policy-generator.test.ts +252 -0
  179. package/src/domain/documents/policy-generator.ts +94 -0
  180. package/src/domain/documents/worker-notification-generator.test.ts +162 -0
  181. package/src/domain/documents/worker-notification-generator.ts +141 -0
  182. package/src/domain/eval/adapters/adapter-port.ts +94 -0
  183. package/src/domain/eval/adapters/adapters.test.ts +303 -0
  184. package/src/domain/eval/adapters/anthropic-adapter.ts +57 -0
  185. package/src/domain/eval/adapters/auto-detect.ts +104 -0
  186. package/src/domain/eval/adapters/create-chat-adapter.ts +106 -0
  187. package/src/domain/eval/adapters/custom-adapter.ts +74 -0
  188. package/src/domain/eval/adapters/http-adapter.ts +66 -0
  189. package/src/domain/eval/adapters/index.ts +7 -0
  190. package/src/domain/eval/adapters/ollama-adapter.ts +48 -0
  191. package/src/domain/eval/adapters/openai-adapter.ts +58 -0
  192. package/src/domain/eval/adapters/with-timeout.ts +25 -0
  193. package/src/domain/eval/conformity-score.test.ts +161 -0
  194. package/src/domain/eval/conformity-score.ts +135 -0
  195. package/src/domain/eval/eval-constants.ts +55 -0
  196. package/src/domain/eval/eval-evidence.test.ts +85 -0
  197. package/src/domain/eval/eval-evidence.ts +103 -0
  198. package/src/domain/eval/eval-fix-generator.test.ts +421 -0
  199. package/src/domain/eval/eval-fix-generator.ts +205 -0
  200. package/src/domain/eval/eval-passport.test.ts +82 -0
  201. package/src/domain/eval/eval-passport.ts +89 -0
  202. package/src/domain/eval/eval-remediation-report.test.ts +682 -0
  203. package/src/domain/eval/eval-remediation-report.ts +170 -0
  204. package/src/domain/eval/eval-report.ts +108 -0
  205. package/src/domain/eval/eval-runner.test.ts +609 -0
  206. package/src/domain/eval/eval-runner.ts +593 -0
  207. package/src/domain/eval/eval-to-findings.test.ts +293 -0
  208. package/src/domain/eval/eval-to-findings.ts +83 -0
  209. package/src/domain/eval/index.ts +31 -0
  210. package/src/domain/eval/llm-judge.test.ts +139 -0
  211. package/src/domain/eval/llm-judge.ts +168 -0
  212. package/src/domain/eval/remediation-types.ts +90 -0
  213. package/src/domain/eval/security-integration.test.ts +196 -0
  214. package/src/domain/eval/security-integration.ts +136 -0
  215. package/src/domain/eval/types.test.ts +173 -0
  216. package/src/domain/eval/types.ts +244 -0
  217. package/src/domain/eval/verdict-utils.ts +45 -0
  218. package/src/domain/fixer/create-fixer.ts +101 -0
  219. package/src/domain/fixer/diff.ts +70 -0
  220. package/src/domain/fixer/fix-history.ts +23 -0
  221. package/src/domain/fixer/fixer.test.ts +306 -0
  222. package/src/domain/fixer/index.ts +9 -0
  223. package/src/domain/fixer/strategies/bandit-fix.ts +61 -0
  224. package/src/domain/fixer/strategies/bias-testing.ts +49 -0
  225. package/src/domain/fixer/strategies/ci-compliance.ts +57 -0
  226. package/src/domain/fixer/strategies/content-marking.ts +45 -0
  227. package/src/domain/fixer/strategies/cve-upgrade.ts +66 -0
  228. package/src/domain/fixer/strategies/data-governance.ts +65 -0
  229. package/src/domain/fixer/strategies/disclosure.ts +69 -0
  230. package/src/domain/fixer/strategies/doc-code-sync.ts +53 -0
  231. package/src/domain/fixer/strategies/documentation.ts +59 -0
  232. package/src/domain/fixer/strategies/error-handler.ts +63 -0
  233. package/src/domain/fixer/strategies/hitl-gate.ts +67 -0
  234. package/src/domain/fixer/strategies/index.ts +61 -0
  235. package/src/domain/fixer/strategies/kill-switch-test.ts +85 -0
  236. package/src/domain/fixer/strategies/kill-switch.ts +53 -0
  237. package/src/domain/fixer/strategies/license-fix.ts +57 -0
  238. package/src/domain/fixer/strategies/log-retention.ts +40 -0
  239. package/src/domain/fixer/strategies/logging.ts +59 -0
  240. package/src/domain/fixer/strategies/metadata.ts +45 -0
  241. package/src/domain/fixer/strategies/permission-guard.ts +84 -0
  242. package/src/domain/fixer/strategies/record-keeping.ts +69 -0
  243. package/src/domain/fixer/strategies/secret-rotation.ts +52 -0
  244. package/src/domain/fixer/strategies.test.ts +341 -0
  245. package/src/domain/fixer/template-engine.test.ts +64 -0
  246. package/src/domain/fixer/template-engine.ts +38 -0
  247. package/src/domain/fixer/types.ts +88 -0
  248. package/src/domain/frameworks/aiuc1-framework.test.ts +159 -0
  249. package/src/domain/frameworks/aiuc1-framework.ts +126 -0
  250. package/src/domain/frameworks/collect-foundation-metrics.test.ts +96 -0
  251. package/src/domain/frameworks/collect-foundation-metrics.ts +34 -0
  252. package/src/domain/frameworks/eu-ai-act-framework.test.ts +117 -0
  253. package/src/domain/frameworks/eu-ai-act-framework.ts +100 -0
  254. package/src/domain/frameworks/framework-registry.test.ts +91 -0
  255. package/src/domain/frameworks/framework-registry.ts +38 -0
  256. package/src/domain/frameworks/index.ts +8 -0
  257. package/src/domain/frameworks/mitre-atlas-framework.test.ts +53 -0
  258. package/src/domain/frameworks/mitre-atlas-framework.ts +53 -0
  259. package/src/domain/frameworks/owasp-llm-framework.test.ts +77 -0
  260. package/src/domain/frameworks/owasp-llm-framework.ts +54 -0
  261. package/src/domain/frameworks/score-plugin-framework.ts +117 -0
  262. package/src/domain/fria/fria-generator.test.ts +273 -0
  263. package/src/domain/fria/fria-generator.ts +366 -0
  264. package/src/domain/import/promptfoo-importer.test.ts +103 -0
  265. package/src/domain/import/promptfoo-importer.ts +151 -0
  266. package/src/domain/onboarding/guided-onboarding.test.ts +144 -0
  267. package/src/domain/onboarding/guided-onboarding.ts +135 -0
  268. package/src/domain/passport/builder/domain-mapper.ts +9 -0
  269. package/src/domain/passport/builder/manifest-builder.test.ts +546 -0
  270. package/src/domain/passport/builder/manifest-builder.ts +535 -0
  271. package/src/domain/passport/builder/manifest-diff.test.ts +105 -0
  272. package/src/domain/passport/builder/manifest-diff.ts +89 -0
  273. package/src/domain/passport/builder/manifest-files.ts +17 -0
  274. package/src/domain/passport/crypto-signer.test.ts +93 -0
  275. package/src/domain/passport/crypto-signer.ts +157 -0
  276. package/src/domain/passport/discovery/agent-discovery.test.ts +296 -0
  277. package/src/domain/passport/discovery/agent-discovery.ts +325 -0
  278. package/src/domain/passport/discovery/autonomy-analyzer.test.ts +141 -0
  279. package/src/domain/passport/discovery/autonomy-analyzer.ts +113 -0
  280. package/src/domain/passport/discovery/permission-scanner.test.ts +191 -0
  281. package/src/domain/passport/discovery/permission-scanner.ts +414 -0
  282. package/src/domain/passport/export/a2a-mapper.ts +75 -0
  283. package/src/domain/passport/export/aiuc1-mapper.ts +126 -0
  284. package/src/domain/passport/export/export.test.ts +207 -0
  285. package/src/domain/passport/export/index.ts +41 -0
  286. package/src/domain/passport/export/nist-mapper.ts +227 -0
  287. package/src/domain/passport/import/a2a-importer.test.ts +133 -0
  288. package/src/domain/passport/import/a2a-importer.ts +156 -0
  289. package/src/domain/passport/import/index.ts +2 -0
  290. package/src/domain/passport/index.ts +32 -0
  291. package/src/domain/passport/obligation-field-map.test.ts +113 -0
  292. package/src/domain/passport/obligation-field-map.ts +117 -0
  293. package/src/domain/passport/passport-validator.test.ts +156 -0
  294. package/src/domain/passport/passport-validator.ts +126 -0
  295. package/src/domain/passport/scan-to-compliance.test.ts +336 -0
  296. package/src/domain/passport/scan-to-compliance.ts +166 -0
  297. package/src/domain/passport/test-generator.test.ts +93 -0
  298. package/src/domain/passport/test-generator.ts +136 -0
  299. package/src/domain/proxy/index.ts +11 -0
  300. package/src/domain/proxy/json-rpc.test.ts +72 -0
  301. package/src/domain/proxy/json-rpc.ts +53 -0
  302. package/src/domain/proxy/policy-engine.test.ts +259 -0
  303. package/src/domain/proxy/policy-engine.ts +137 -0
  304. package/src/domain/proxy/proxy-bridge.ts +125 -0
  305. package/src/domain/proxy/proxy-interceptor.test.ts +184 -0
  306. package/src/domain/proxy/proxy-interceptor.ts +120 -0
  307. package/src/domain/proxy/proxy-types.ts +35 -0
  308. package/src/domain/registry/compute-agent-score.test.ts +279 -0
  309. package/src/domain/registry/compute-agent-score.ts +162 -0
  310. package/src/domain/reporter/audit-report.test.ts +87 -0
  311. package/src/domain/reporter/audit-report.ts +116 -0
  312. package/src/domain/reporter/badge-generator.test.ts +54 -0
  313. package/src/domain/reporter/badge-generator.ts +40 -0
  314. package/src/domain/reporter/compliance-md.ts +45 -0
  315. package/src/domain/reporter/index.ts +7 -0
  316. package/src/domain/reporter/pdf-renderer.ts +282 -0
  317. package/src/domain/reporter/share.test.ts +92 -0
  318. package/src/domain/reporter/share.ts +80 -0
  319. package/src/domain/scanner/ast/swc-analyzer.test.ts +49 -0
  320. package/src/domain/scanner/ast/swc-analyzer.ts +124 -0
  321. package/src/domain/scanner/attestations.ts +97 -0
  322. package/src/domain/scanner/checks/ai-disclosure.test.ts +90 -0
  323. package/src/domain/scanner/checks/ai-disclosure.ts +54 -0
  324. package/src/domain/scanner/checks/ai-literacy.ts +163 -0
  325. package/src/domain/scanner/checks/behavioral-constraints.test.ts +167 -0
  326. package/src/domain/scanner/checks/behavioral-constraints.ts +86 -0
  327. package/src/domain/scanner/checks/compliance-metadata.ts +63 -0
  328. package/src/domain/scanner/checks/content-marking.ts +74 -0
  329. package/src/domain/scanner/checks/dep-deep-scan.test.ts +318 -0
  330. package/src/domain/scanner/checks/dep-deep-scan.ts +137 -0
  331. package/src/domain/scanner/checks/documentation.test.ts +88 -0
  332. package/src/domain/scanner/checks/documentation.ts +79 -0
  333. package/src/domain/scanner/checks/git-history.test.ts +120 -0
  334. package/src/domain/scanner/checks/git-history.ts +163 -0
  335. package/src/domain/scanner/checks/gpai-systemic-risk.test.ts +84 -0
  336. package/src/domain/scanner/checks/gpai-systemic-risk.ts +98 -0
  337. package/src/domain/scanner/checks/gpai-transparency.ts +94 -0
  338. package/src/domain/scanner/checks/index.ts +28 -0
  339. package/src/domain/scanner/checks/industry/index.ts +40 -0
  340. package/src/domain/scanner/checks/industry/industry.test.ts +287 -0
  341. package/src/domain/scanner/checks/interaction-logging.test.ts +113 -0
  342. package/src/domain/scanner/checks/interaction-logging.ts +142 -0
  343. package/src/domain/scanner/checks/nhi-scanner.test.ts +158 -0
  344. package/src/domain/scanner/checks/nhi-scanner.ts +78 -0
  345. package/src/domain/scanner/checks/passport-completeness.test.ts +127 -0
  346. package/src/domain/scanner/checks/passport-completeness.ts +82 -0
  347. package/src/domain/scanner/checks/passport-presence.test.ts +56 -0
  348. package/src/domain/scanner/checks/passport-presence.ts +78 -0
  349. package/src/domain/scanner/checks/pattern-check-factory.ts +70 -0
  350. package/src/domain/scanner/checks/permission-scanner.test.ts +279 -0
  351. package/src/domain/scanner/checks/permission-scanner.ts +90 -0
  352. package/src/domain/scanner/checks/presence-check-factory.test.ts +124 -0
  353. package/src/domain/scanner/checks/presence-check-factory.ts +275 -0
  354. package/src/domain/scanner/compliance-diff.test.ts +165 -0
  355. package/src/domain/scanner/compliance-diff.ts +138 -0
  356. package/src/domain/scanner/confidence.test.ts +235 -0
  357. package/src/domain/scanner/confidence.ts +156 -0
  358. package/src/domain/scanner/constants.ts +13 -0
  359. package/src/domain/scanner/create-scanner.ts +573 -0
  360. package/src/domain/scanner/cross-layer.test.ts +372 -0
  361. package/src/domain/scanner/cross-layer.ts +232 -0
  362. package/src/domain/scanner/data/ai-packages.ts +82 -0
  363. package/src/domain/scanner/debt-calculator.test.ts +89 -0
  364. package/src/domain/scanner/debt-calculator.ts +111 -0
  365. package/src/domain/scanner/drift.test.ts +191 -0
  366. package/src/domain/scanner/drift.ts +73 -0
  367. package/src/domain/scanner/evidence-store.test.ts +207 -0
  368. package/src/domain/scanner/evidence-store.ts +195 -0
  369. package/src/domain/scanner/evidence.test.ts +104 -0
  370. package/src/domain/scanner/evidence.ts +71 -0
  371. package/src/domain/scanner/external/bandit-runner.test.ts +45 -0
  372. package/src/domain/scanner/external/bandit-runner.ts +90 -0
  373. package/src/domain/scanner/external/checks.ts +321 -0
  374. package/src/domain/scanner/external/dedup.test.ts +79 -0
  375. package/src/domain/scanner/external/dedup.ts +94 -0
  376. package/src/domain/scanner/external/detect-secrets-runner.test.ts +58 -0
  377. package/src/domain/scanner/external/detect-secrets-runner.ts +81 -0
  378. package/src/domain/scanner/external/external-scanner.test.ts +221 -0
  379. package/src/domain/scanner/external/external-scanner.ts +36 -0
  380. package/src/domain/scanner/external/finding-mapper.test.ts +95 -0
  381. package/src/domain/scanner/external/finding-mapper.ts +138 -0
  382. package/src/domain/scanner/external/index.ts +15 -0
  383. package/src/domain/scanner/external/mappings.ts +93 -0
  384. package/src/domain/scanner/external/modelscan-runner.test.ts +35 -0
  385. package/src/domain/scanner/external/modelscan-runner.ts +101 -0
  386. package/src/domain/scanner/external/path-utils.ts +8 -0
  387. package/src/domain/scanner/external/runner-port.ts +45 -0
  388. package/src/domain/scanner/external/semgrep-runner.test.ts +52 -0
  389. package/src/domain/scanner/external/semgrep-runner.ts +94 -0
  390. package/src/domain/scanner/external/types.ts +32 -0
  391. package/src/domain/scanner/finding-attribution.test.ts +444 -0
  392. package/src/domain/scanner/finding-attribution.ts +195 -0
  393. package/src/domain/scanner/finding-explainer.test.ts +157 -0
  394. package/src/domain/scanner/finding-explainer.ts +73 -0
  395. package/src/domain/scanner/fix-diff-builder.test.ts +272 -0
  396. package/src/domain/scanner/fix-diff-builder.ts +477 -0
  397. package/src/domain/scanner/import-graph.test.ts +162 -0
  398. package/src/domain/scanner/import-graph.ts +198 -0
  399. package/src/domain/scanner/languages/adapter.test.ts +105 -0
  400. package/src/domain/scanner/languages/adapter.ts +239 -0
  401. package/src/domain/scanner/layers/index.ts +24 -0
  402. package/src/domain/scanner/layers/layer1-files.ts +54 -0
  403. package/src/domain/scanner/layers/layer2-docs.test.ts +1207 -0
  404. package/src/domain/scanner/layers/layer2-docs.ts +297 -0
  405. package/src/domain/scanner/layers/layer2-parsing.ts +217 -0
  406. package/src/domain/scanner/layers/layer3-config.test.ts +187 -0
  407. package/src/domain/scanner/layers/layer3-config.ts +279 -0
  408. package/src/domain/scanner/layers/layer3-parsers.ts +73 -0
  409. package/src/domain/scanner/layers/layer4-patterns.test.ts +397 -0
  410. package/src/domain/scanner/layers/layer4-patterns.ts +216 -0
  411. package/src/domain/scanner/layers/layer5-docs.test.ts +99 -0
  412. package/src/domain/scanner/layers/layer5-docs.ts +250 -0
  413. package/src/domain/scanner/layers/layer5-llm.test.ts +146 -0
  414. package/src/domain/scanner/layers/layer5-llm.ts +262 -0
  415. package/src/domain/scanner/layers/layer5-targeted.test.ts +93 -0
  416. package/src/domain/scanner/layers/layer5-targeted.ts +233 -0
  417. package/src/domain/scanner/layers/lockfile-parsers.test.ts +320 -0
  418. package/src/domain/scanner/layers/lockfile-parsers.ts +184 -0
  419. package/src/domain/scanner/regulation-version.test.ts +54 -0
  420. package/src/domain/scanner/regulation-version.ts +23 -0
  421. package/src/domain/scanner/role-filter.test.ts +116 -0
  422. package/src/domain/scanner/role-filter.ts +51 -0
  423. package/src/domain/scanner/rules/banned-packages-data.ts +553 -0
  424. package/src/domain/scanner/rules/banned-packages-sdk.ts +65 -0
  425. package/src/domain/scanner/rules/banned-packages.test.ts +249 -0
  426. package/src/domain/scanner/rules/banned-packages.ts +55 -0
  427. package/src/domain/scanner/rules/comment-filter.test.ts +115 -0
  428. package/src/domain/scanner/rules/comment-filter.ts +297 -0
  429. package/src/domain/scanner/rules/index.ts +9 -0
  430. package/src/domain/scanner/rules/nhi-patterns.test.ts +128 -0
  431. package/src/domain/scanner/rules/nhi-patterns.ts +60 -0
  432. package/src/domain/scanner/rules/pattern-rules.ts +1152 -0
  433. package/src/domain/scanner/sbom.test.ts +136 -0
  434. package/src/domain/scanner/sbom.ts +103 -0
  435. package/src/domain/scanner/scan-cache.test.ts +136 -0
  436. package/src/domain/scanner/scan-cache.ts +115 -0
  437. package/src/domain/scanner/scanner.test.ts +125 -0
  438. package/src/domain/scanner/score-calculator.test.ts +363 -0
  439. package/src/domain/scanner/score-calculator.ts +189 -0
  440. package/src/domain/scanner/security-score.test.ts +107 -0
  441. package/src/domain/scanner/security-score.ts +116 -0
  442. package/src/domain/scanner/source-filter.ts +24 -0
  443. package/src/domain/scanner/validators.ts +223 -0
  444. package/src/domain/shared/compliance-constants.ts +48 -0
  445. package/src/domain/shared/disclosure-patterns.ts +16 -0
  446. package/src/domain/shared/index.ts +6 -0
  447. package/src/domain/shared/parse-dependencies.ts +21 -0
  448. package/src/domain/supply-chain/dependency-analyzer.ts +138 -0
  449. package/src/domain/supply-chain/index.ts +3 -0
  450. package/src/domain/supply-chain/supply-chain.test.ts +211 -0
  451. package/src/domain/supply-chain/types.ts +32 -0
  452. package/src/domain/whatif/config-fixer.ts +187 -0
  453. package/src/domain/whatif/index.ts +6 -0
  454. package/src/domain/whatif/scenario-engine.ts +121 -0
  455. package/src/domain/whatif/simulate-actions.test.ts +161 -0
  456. package/src/domain/whatif/simulate-actions.ts +114 -0
  457. package/src/domain/whatif/whatif.test.ts +135 -0
  458. package/src/e2e/gaps-e2e.test.ts +259 -0
  459. package/src/e2e/smoke.test.ts +101 -0
  460. package/src/hooks/hooks-export.test.ts +81 -0
  461. package/src/hooks/installer.ts +113 -0
  462. package/src/http/cors.test.ts +38 -0
  463. package/src/http/create-router.ts +259 -0
  464. package/src/http/routes/agent.route.ts +380 -0
  465. package/src/http/routes/audit.route.ts +66 -0
  466. package/src/http/routes/badge.route.ts +23 -0
  467. package/src/http/routes/cert.route.ts +66 -0
  468. package/src/http/routes/chat.route.ts +228 -0
  469. package/src/http/routes/cost.route.ts +33 -0
  470. package/src/http/routes/debt.route.ts +29 -0
  471. package/src/http/routes/disclaimer.route.ts +64 -0
  472. package/src/http/routes/eval.route.ts +161 -0
  473. package/src/http/routes/events.route.test.ts +108 -0
  474. package/src/http/routes/events.route.ts +71 -0
  475. package/src/http/routes/external-scan.route.ts +24 -0
  476. package/src/http/routes/file.route.ts +54 -0
  477. package/src/http/routes/fix.route.ts +219 -0
  478. package/src/http/routes/frameworks.route.test.ts +66 -0
  479. package/src/http/routes/frameworks.route.ts +36 -0
  480. package/src/http/routes/git.route.ts +27 -0
  481. package/src/http/routes/guided-onboarding.route.ts +65 -0
  482. package/src/http/routes/import.route.ts +64 -0
  483. package/src/http/routes/jurisdiction.route.ts +22 -0
  484. package/src/http/routes/obligations.route.test.ts +122 -0
  485. package/src/http/routes/obligations.route.ts +110 -0
  486. package/src/http/routes/onboarding.route.ts +53 -0
  487. package/src/http/routes/provider.route.ts +42 -0
  488. package/src/http/routes/proxy.route.ts +40 -0
  489. package/src/http/routes/redteam.route.ts +84 -0
  490. package/src/http/routes/report.route.ts +29 -0
  491. package/src/http/routes/scan.route.ts +104 -0
  492. package/src/http/routes/share.route.ts +44 -0
  493. package/src/http/routes/shell.route.ts +27 -0
  494. package/src/http/routes/status.route.ts +66 -0
  495. package/src/http/routes/supply-chain.route.ts +121 -0
  496. package/src/http/routes/sync.route.ts +328 -0
  497. package/src/http/routes/tools.route.ts +29 -0
  498. package/src/http/routes/whatif.route.ts +96 -0
  499. package/src/http/utils/validation.ts +31 -0
  500. package/src/index.ts +1 -0
  501. package/src/infra/bundle-fetcher.ts +77 -0
  502. package/src/infra/cache-storage.ts +34 -0
  503. package/src/infra/event-bus.ts +31 -0
  504. package/src/infra/file-collector.ts +61 -0
  505. package/src/infra/file-ops-adapter.ts +95 -0
  506. package/src/infra/file-watcher.test.ts +90 -0
  507. package/src/infra/file-watcher.ts +106 -0
  508. package/src/infra/git-adapter.ts +93 -0
  509. package/src/infra/git-history-adapter.ts +41 -0
  510. package/src/infra/headless-browser.ts +178 -0
  511. package/src/infra/llm-adapter.test.ts +83 -0
  512. package/src/infra/llm-adapter.ts +86 -0
  513. package/src/infra/logger.ts +27 -0
  514. package/src/infra/project-config.test.ts +74 -0
  515. package/src/infra/project-config.ts +35 -0
  516. package/src/infra/rate-limiter.test.ts +36 -0
  517. package/src/infra/rate-limiter.ts +34 -0
  518. package/src/infra/retry.ts +46 -0
  519. package/src/infra/saas-client.ts +123 -0
  520. package/src/infra/search-adapter.ts +113 -0
  521. package/src/infra/shell-adapter.ts +68 -0
  522. package/src/infra/tool-manager.test.ts +99 -0
  523. package/src/infra/tool-manager.ts +197 -0
  524. package/src/llm/agents/agent-modes.test.ts +44 -0
  525. package/src/llm/agents/modes.ts +68 -0
  526. package/src/llm/routing/cost-routing.test.ts +37 -0
  527. package/src/llm/routing/cost-tracker.ts +74 -0
  528. package/src/llm/routing/model-routing.test.ts +79 -0
  529. package/src/llm/routing/model-routing.ts +38 -0
  530. package/src/llm/routing/pricing.ts +19 -0
  531. package/src/llm/sse-protocol.ts +77 -0
  532. package/src/llm/tool-definitions.ts +83 -0
  533. package/src/llm/tool-executors.ts +80 -0
  534. package/src/llm/tools/types.ts +13 -0
  535. package/src/mcp/create-mcp-stack.ts +82 -0
  536. package/src/mcp/handlers.ts +245 -0
  537. package/src/mcp/index.ts +28 -0
  538. package/src/mcp/mcp-server.test.ts +80 -0
  539. package/src/mcp/server.ts +79 -0
  540. package/src/mcp/tools.ts +48 -0
  541. package/src/onboarding/auto-detect.ts +164 -0
  542. package/src/onboarding/onboarding.test.ts +89 -0
  543. package/src/onboarding/profile.ts +169 -0
  544. package/src/onboarding/questions.ts +112 -0
  545. package/src/onboarding/wizard.ts +66 -0
  546. package/src/output/github-issue.ts +32 -0
  547. package/src/output/json-output.ts +67 -0
  548. package/src/ports/browser.port.ts +23 -0
  549. package/src/ports/events.port.ts +28 -0
  550. package/src/ports/llm.port.ts +23 -0
  551. package/src/ports/logger.port.ts +6 -0
  552. package/src/ports/process.port.ts +6 -0
  553. package/src/ports/scanner.port.ts +15 -0
  554. package/src/server.ts +134 -0
  555. package/src/services/badge-service.ts +67 -0
  556. package/src/services/chat-service.test.ts +162 -0
  557. package/src/services/chat-service.ts +152 -0
  558. package/src/services/cost-service.ts +52 -0
  559. package/src/services/debt-service.ts +65 -0
  560. package/src/services/eval-integration.test.ts +132 -0
  561. package/src/services/eval-service.test.ts +373 -0
  562. package/src/services/eval-service.ts +463 -0
  563. package/src/services/external-scan-service.ts +60 -0
  564. package/src/services/file-service.ts +37 -0
  565. package/src/services/fix-service.test.ts +470 -0
  566. package/src/services/fix-service.ts +648 -0
  567. package/src/services/framework-service.test.ts +159 -0
  568. package/src/services/framework-service.ts +67 -0
  569. package/src/services/onboarding-service.ts +165 -0
  570. package/src/services/passport-audit.ts +244 -0
  571. package/src/services/passport-documents.ts +258 -0
  572. package/src/services/passport-service-utils.ts +72 -0
  573. package/src/services/passport-service.test.ts +251 -0
  574. package/src/services/passport-service.ts +339 -0
  575. package/src/services/proxy-service.ts +81 -0
  576. package/src/services/report-service.ts +72 -0
  577. package/src/services/scan-service.test.ts +470 -0
  578. package/src/services/scan-service.ts +335 -0
  579. package/src/services/share-service.ts +108 -0
  580. package/src/services/shared/backup.ts +23 -0
  581. package/src/services/status-service.ts +38 -0
  582. package/src/services/undo-service.test.ts +190 -0
  583. package/src/services/undo-service.ts +144 -0
  584. package/src/test-helpers/factories.ts +116 -0
  585. package/src/types/common.schemas.ts +147 -0
  586. package/src/types/common.types.ts +292 -0
  587. package/src/types/contract.test.ts +217 -0
  588. package/src/types/errors.ts +52 -0
  589. package/src/types/framework.types.ts +87 -0
  590. package/src/types/passport-schemas.ts +241 -0
  591. package/src/types/passport.types.ts +296 -0
  592. package/src/version.ts +1 -0
  593. package/tsconfig.json +20 -0
  594. package/vitest.config.ts +9 -0
@@ -0,0 +1,144 @@
1
+ import { resolve, dirname } from 'node:path';
2
+ import { mkdir, copyFile, unlink, readFile, writeFile } from 'node:fs/promises';
3
+ import { z } from 'zod';
4
+ import type { EventBusPort } from '../ports/events.port.js';
5
+ import type { ScanService } from './scan-service.js';
6
+ import type { FixPlan, FixResult, FixValidation, FixHistory, FixHistoryEntry, FixHistoryFile } from '../domain/fixer/types.js';
7
+ import type { ScanResult } from '../types/common.types.js';
8
+ import { createEmptyHistory, addEntry, markUndone, getLastApplied, getById } from '../domain/fixer/fix-history.js';
9
+
10
+ const FixHistoryFileSchema = z.object({
11
+ path: z.string(),
12
+ action: z.enum(['create', 'edit', 'splice']),
13
+ backupPath: z.string(),
14
+ });
15
+
16
+ const FixHistoryEntrySchema = z.object({
17
+ id: z.number(),
18
+ checkId: z.string(),
19
+ obligationId: z.string(),
20
+ fixType: z.enum(['code_injection', 'template_generation', 'config_fix', 'metadata_generation', 'dependency_fix', 'ai_enrichment']),
21
+ status: z.enum(['applied', 'undone']),
22
+ timestamp: z.string(),
23
+ files: z.array(FixHistoryFileSchema),
24
+ scoreBefore: z.number(),
25
+ scoreAfter: z.number(),
26
+ });
27
+
28
+ const FixHistorySchema = z.object({
29
+ fixes: z.array(FixHistoryEntrySchema),
30
+ });
31
+
32
+ export interface UndoServiceDeps {
33
+ readonly events: EventBusPort;
34
+ readonly scanService: ScanService;
35
+ readonly getProjectPath: () => string;
36
+ readonly getHistoryPath: () => string;
37
+ readonly getLastScanResult: () => ScanResult | null;
38
+ }
39
+
40
+ export const createUndoService = (deps: UndoServiceDeps) => {
41
+ const { events, scanService, getProjectPath, getHistoryPath, getLastScanResult } = deps;
42
+
43
+ const loadHistory = async (): Promise<FixHistory> => {
44
+ try {
45
+ const raw = await readFile(getHistoryPath(), 'utf-8');
46
+ return FixHistorySchema.parse(JSON.parse(raw));
47
+ } catch {
48
+ return createEmptyHistory();
49
+ }
50
+ };
51
+
52
+ const saveHistory = async (history: FixHistory): Promise<void> => {
53
+ const historyPath = getHistoryPath();
54
+ await mkdir(dirname(historyPath), { recursive: true });
55
+ await writeFile(historyPath, JSON.stringify(history, null, 2), 'utf-8');
56
+ };
57
+
58
+ const recordFix = async (result: FixResult, plan: FixPlan): Promise<void> => {
59
+ const history = await loadHistory();
60
+ const nextId = history.fixes.length > 0
61
+ ? Math.max(...history.fixes.map((f) => f.id)) + 1
62
+ : 1;
63
+
64
+ const files: FixHistoryFile[] = plan.actions.map((action, i) => ({
65
+ path: action.path,
66
+ action: action.type,
67
+ backupPath: result.backedUpFiles[i] ?? '',
68
+ }));
69
+
70
+ const entry: FixHistoryEntry = {
71
+ id: nextId,
72
+ checkId: plan.checkId,
73
+ obligationId: plan.obligationId,
74
+ fixType: plan.fixType,
75
+ status: 'applied',
76
+ timestamp: new Date().toISOString(),
77
+ files,
78
+ scoreBefore: result.scoreBefore,
79
+ scoreAfter: result.scoreAfter,
80
+ };
81
+
82
+ await saveHistory(addEntry(history, entry));
83
+ };
84
+
85
+ const undoEntry = async (entry: FixHistoryEntry): Promise<FixValidation> => {
86
+ const projectPath = getProjectPath();
87
+ const scoreBefore = getLastScanResult()?.score.totalScore ?? 0;
88
+ const restoredFiles: string[] = [];
89
+
90
+ for (const file of entry.files) {
91
+ const fullPath = resolve(projectPath, file.path);
92
+ if (file.action === 'create') {
93
+ try { await unlink(fullPath); } catch { /* already removed */ }
94
+ } else {
95
+ await mkdir(dirname(fullPath), { recursive: true });
96
+ await copyFile(file.backupPath, fullPath);
97
+ }
98
+ restoredFiles.push(file.path);
99
+ }
100
+
101
+ // Mark as undone in history
102
+ const history = await loadHistory();
103
+ await saveHistory(markUndone(history, entry.id));
104
+
105
+ // Re-scan to get updated score
106
+ const newResult = await scanService.scan(projectPath);
107
+ const scoreAfter = newResult.score.totalScore;
108
+
109
+ events.emit('fix.undone', { checkId: entry.checkId, restoredFiles });
110
+
111
+ const findingAfter = newResult.findings.find((f) => f.checkId === entry.checkId);
112
+
113
+ return {
114
+ checkId: entry.checkId,
115
+ obligationId: entry.obligationId,
116
+ article: '',
117
+ before: 'pass',
118
+ after: findingAfter?.type ?? 'fail',
119
+ scoreDelta: scoreAfter - scoreBefore,
120
+ totalScore: scoreAfter,
121
+ };
122
+ };
123
+
124
+ const undoLast = async (): Promise<FixValidation> => {
125
+ const history = await loadHistory();
126
+ const entry = getLastApplied(history);
127
+ if (!entry) throw new Error('No applied fixes to undo');
128
+ return undoEntry(entry);
129
+ };
130
+
131
+ const undoById = async (id: number): Promise<FixValidation> => {
132
+ const history = await loadHistory();
133
+ const entry = getById(history, id);
134
+ if (!entry) throw new Error(`Fix #${id} not found`);
135
+ if (entry.status === 'undone') throw new Error(`Fix #${id} already undone`);
136
+ return undoEntry(entry);
137
+ };
138
+
139
+ const getHistory = async (): Promise<FixHistory> => loadHistory();
140
+
141
+ return Object.freeze({ recordFix, undoLast, undoById, getHistory });
142
+ };
143
+
144
+ export type UndoService = ReturnType<typeof createUndoService>;
@@ -0,0 +1,116 @@
1
+ import type {
2
+ Finding,
3
+ CheckResult,
4
+ ScanResult,
5
+ CompliorConfig,
6
+ ProjectProfile,
7
+ } from '../types/common.types.js';
8
+ import type { AgentPassport } from '../types/passport.types.js';
9
+ import type { FileInfo, ScanContext } from '../ports/scanner.port.js';
10
+
11
+ export const createMockFinding = (overrides?: Partial<Finding>): Finding => ({
12
+ checkId: 'CHECK-001',
13
+ type: 'fail',
14
+ message: 'Test finding',
15
+ severity: 'medium',
16
+ ...overrides,
17
+ });
18
+
19
+ export const createMockCheckResult = (overrides?: Partial<Extract<CheckResult, { readonly type: 'fail' }>>): CheckResult => ({
20
+ type: 'fail',
21
+ checkId: 'CHECK-001',
22
+ message: 'Test check result',
23
+ severity: 'medium',
24
+ ...overrides,
25
+ });
26
+
27
+ export const createMockScanResult = (overrides?: Partial<ScanResult>): ScanResult => ({
28
+ score: {
29
+ totalScore: 75,
30
+ zone: 'yellow',
31
+ categoryScores: [],
32
+ criticalCapApplied: false,
33
+ totalChecks: 10,
34
+ passedChecks: 7,
35
+ failedChecks: 2,
36
+ skippedChecks: 1,
37
+ },
38
+ findings: [],
39
+ projectPath: '/test/project',
40
+ scannedAt: new Date().toISOString(),
41
+ duration: 150,
42
+ filesScanned: 10,
43
+ ...overrides,
44
+ });
45
+
46
+ export const createMockConfig = (overrides?: Partial<CompliorConfig>): CompliorConfig => ({
47
+ projectPath: '/test/project',
48
+ extends: ['complior:eu-ai-act'],
49
+ exclude: ['node_modules', '.git', 'dist', 'build'],
50
+ severity: 'low',
51
+ outputFormat: 'json',
52
+ ...overrides,
53
+ });
54
+
55
+ export const createMockProjectProfile = (overrides?: Partial<ProjectProfile>): ProjectProfile => ({
56
+ frameworks: [{ name: 'Next.js', version: '^14.0.0', confidence: 1.0 }],
57
+ aiTools: [{ name: 'OpenAI', version: '^4.0.0', type: 'sdk' }],
58
+ languages: ['TypeScript', 'JavaScript'],
59
+ hasPackageJson: true,
60
+ detectedModels: ['gpt-4'],
61
+ ...overrides,
62
+ });
63
+
64
+ export const createMockPassport = (overrides?: Partial<AgentPassport>): AgentPassport => ({
65
+ $schema: 'https://complior.dev/schemas/agent-manifest-v1.json',
66
+ manifest_version: '1.0.0',
67
+ agent_id: 'agent-test-001',
68
+ name: 'test-agent',
69
+ display_name: 'Test Agent',
70
+ description: 'An AI agent for testing compliance',
71
+ version: '1.0.0',
72
+ created: '2026-01-01T00:00:00Z',
73
+ updated: '2026-01-01T00:00:00Z',
74
+ owner: { team: 'Acme Corp', contact: 'admin@acme.com', responsible_person: 'Jane Doe' },
75
+ type: 'assistive',
76
+ autonomy_level: 'L2',
77
+ autonomy_evidence: { human_approval_gates: 3, unsupervised_actions: 1, no_logging_actions: 0, auto_rated: true },
78
+ framework: 'openai-sdk',
79
+ model: { provider: 'OpenAI', model_id: 'gpt-4', deployment: 'cloud', data_residency: 'EU' },
80
+ permissions: { tools: ['search', 'read'], data_access: { read: ['docs'], write: [], delete: [] }, denied: [] },
81
+ constraints: {
82
+ rate_limits: { max_actions_per_minute: 60 },
83
+ budget: { max_cost_per_session_usd: 10 },
84
+ human_approval_required: ['deploy', 'delete'],
85
+ prohibited_actions: [],
86
+ },
87
+ compliance: {
88
+ eu_ai_act: {
89
+ risk_class: 'high',
90
+ applicable_articles: ['Art. 9', 'Art. 27'],
91
+ deployer_obligations_met: ['OBL-013'],
92
+ deployer_obligations_pending: ['OBL-014'],
93
+ },
94
+ complior_score: 72,
95
+ last_scan: '2026-01-01T00:00:00Z',
96
+ },
97
+ disclosure: { user_facing: true, disclosure_text: 'AI-powered', ai_marking: { responses_marked: true, method: 'header' } },
98
+ logging: { actions_logged: true, retention_days: 90, includes_decision_rationale: true },
99
+ lifecycle: { status: 'active', deployed_since: '2026-01-01', next_review: '2026-06-01', review_frequency_days: 90 },
100
+ interop: { mcp_servers: [] },
101
+ source: { mode: 'auto', generated_by: 'complior', code_analyzed: true, fields_auto_filled: ['name'], fields_manual: [], confidence: 0.85 },
102
+ signature: { algorithm: 'ed25519', public_key: 'test', signed_at: '2026-01-01T00:00:00Z', hash: 'sha256:test', value: 'test' },
103
+ ...overrides,
104
+ } as AgentPassport);
105
+
106
+ export const createScanFile = (relativePath: string, content: string): FileInfo => ({
107
+ path: `/test/project/${relativePath}`,
108
+ content,
109
+ extension: `.${relativePath.split('.').pop()}`,
110
+ relativePath,
111
+ });
112
+
113
+ export const createScanCtx = (files: readonly FileInfo[]): ScanContext => ({
114
+ files,
115
+ projectPath: '/test/project',
116
+ });
@@ -0,0 +1,147 @@
1
+ import { z } from 'zod';
2
+ import type { ScanResult, EvidenceChain } from './common.types.js';
3
+
4
+ // --- Sub-schemas ---
5
+
6
+ const EvidenceSchema = z.object({
7
+ findingId: z.string(),
8
+ layer: z.string(),
9
+ timestamp: z.string(),
10
+ source: z.string(),
11
+ snippet: z.string().optional(),
12
+ file: z.string().optional(),
13
+ line: z.number().optional(),
14
+ });
15
+
16
+ const CodeContextLineSchema = z.object({
17
+ num: z.number(),
18
+ content: z.string(),
19
+ });
20
+
21
+ const CodeContextSchema = z.object({
22
+ lines: z.array(CodeContextLineSchema),
23
+ startLine: z.number(),
24
+ highlightLine: z.number().optional(),
25
+ });
26
+
27
+ const FixDiffSchema = z.object({
28
+ before: z.array(z.string()),
29
+ after: z.array(z.string()),
30
+ startLine: z.number(),
31
+ filePath: z.string(),
32
+ importLine: z.string().optional(),
33
+ });
34
+
35
+ const FindingExplanationSchema = z.object({
36
+ article: z.string(),
37
+ penalty: z.string(),
38
+ deadline: z.string(),
39
+ business_impact: z.string(),
40
+ });
41
+
42
+ const FindingSchema = z.object({
43
+ checkId: z.string(),
44
+ type: z.enum(['pass', 'fail', 'skip']),
45
+ message: z.string(),
46
+ severity: z.enum(['critical', 'high', 'medium', 'low', 'info']),
47
+ file: z.string().optional(),
48
+ line: z.number().optional(),
49
+ obligationId: z.string().optional(),
50
+ articleReference: z.string().optional(),
51
+ fix: z.string().optional(),
52
+ priority: z.number().optional(),
53
+ confidence: z.number().optional(),
54
+ confidenceLevel: z.string().optional(),
55
+ evidence: z.array(EvidenceSchema).optional(),
56
+ codeContext: CodeContextSchema.optional(),
57
+ fixDiff: FixDiffSchema.optional(),
58
+ explanation: FindingExplanationSchema.optional(),
59
+ });
60
+
61
+ // --- Score schemas ---
62
+
63
+ const CategoryScoreSchema = z.object({
64
+ category: z.string(),
65
+ weight: z.number(),
66
+ score: z.number(),
67
+ obligationCount: z.number(),
68
+ passedCount: z.number(),
69
+ });
70
+
71
+ const ConfidenceSummarySchema = z.object({
72
+ pass: z.number(),
73
+ likelyPass: z.number(),
74
+ uncertain: z.number(),
75
+ likelyFail: z.number(),
76
+ fail: z.number(),
77
+ total: z.number(),
78
+ });
79
+
80
+ const ScoreBreakdownSchema = z.object({
81
+ totalScore: z.number(),
82
+ zone: z.enum(['red', 'yellow', 'green']),
83
+ categoryScores: z.array(CategoryScoreSchema),
84
+ criticalCapApplied: z.boolean(),
85
+ totalChecks: z.number(),
86
+ passedChecks: z.number(),
87
+ failedChecks: z.number(),
88
+ skippedChecks: z.number(),
89
+ confidenceSummary: ConfidenceSummarySchema.optional(),
90
+ });
91
+
92
+ const RegulationVersionSchema = z.object({
93
+ regulation: z.string(),
94
+ version: z.string(),
95
+ rulesVersion: z.string(),
96
+ checkCount: z.number(),
97
+ lastUpdated: z.string(),
98
+ });
99
+
100
+ // --- Top-level I/O schemas ---
101
+
102
+ const ScanResultSchema = z.object({
103
+ score: ScoreBreakdownSchema,
104
+ findings: z.array(FindingSchema),
105
+ projectPath: z.string(),
106
+ scannedAt: z.string(),
107
+ duration: z.number(),
108
+ filesScanned: z.number(),
109
+ deepAnalysis: z.boolean().optional(),
110
+ l5Cost: z.number().optional(),
111
+ regulationVersion: RegulationVersionSchema.optional(),
112
+ });
113
+
114
+ const EvidenceEntrySchema = z.object({
115
+ evidence: EvidenceSchema,
116
+ scanId: z.string(),
117
+ chainPrev: z.string().nullable(),
118
+ hash: z.string(),
119
+ signature: z.string(),
120
+ });
121
+
122
+ const EvidenceChainSchema = z.object({
123
+ version: z.literal('1.0.0'),
124
+ projectPath: z.string(),
125
+ entries: z.array(EvidenceEntrySchema),
126
+ lastHash: z.string(),
127
+ });
128
+
129
+ // --- Parse functions (never throw) ---
130
+
131
+ export const parseScanResult = (json: string): ScanResult | null => {
132
+ try {
133
+ const result = ScanResultSchema.safeParse(JSON.parse(json));
134
+ return result.success ? (result.data as ScanResult) : null;
135
+ } catch {
136
+ return null;
137
+ }
138
+ };
139
+
140
+ export const parseEvidenceChain = (json: string): EvidenceChain | null => {
141
+ try {
142
+ const result = EvidenceChainSchema.safeParse(JSON.parse(json));
143
+ return result.success ? (result.data as EvidenceChain) : null;
144
+ } catch {
145
+ return null;
146
+ }
147
+ };
@@ -0,0 +1,292 @@
1
+ import type { DocQualityLevel } from './passport.types.js';
2
+
3
+ // --- Risk & Severity ---
4
+
5
+ export type RiskLevel = 'unacceptable' | 'high' | 'limited' | 'minimal' | 'gpai' | 'gpai_systemic';
6
+
7
+ export type Severity = 'critical' | 'high' | 'medium' | 'low' | 'info';
8
+
9
+ const SEVERITY_ORDER: Record<Severity, number> = { critical: 0, high: 1, medium: 2, low: 3, info: 4 };
10
+
11
+ /** Compare two severity values for sorting (most severe first). */
12
+ export const compareSeverity = (a: Severity, b: Severity): number =>
13
+ (SEVERITY_ORDER[a] ?? 4) - (SEVERITY_ORDER[b] ?? 4);
14
+
15
+ export type ComplianceStatus = 'fully_met' | 'partially_met' | 'not_met' | 'not_applicable';
16
+
17
+ export type ScoreZone = 'red' | 'yellow' | 'green';
18
+
19
+ export type ObligationType =
20
+ | 'training'
21
+ | 'documentation'
22
+ | 'organizational'
23
+ | 'assessment'
24
+ | 'technical'
25
+ | 'monitoring'
26
+ | 'reporting'
27
+ | 'transparency';
28
+
29
+ export type Role = 'provider' | 'deployer' | 'both';
30
+
31
+ // --- Check Results ---
32
+
33
+ export type CheckResultType = 'pass' | 'fail' | 'skip' | 'info';
34
+
35
+ export type CheckResult = Readonly<
36
+ | { readonly type: 'pass'; readonly checkId: string; readonly message: string }
37
+ | {
38
+ readonly type: 'fail';
39
+ readonly checkId: string;
40
+ readonly message: string;
41
+ readonly severity: Severity;
42
+ readonly obligationId?: string;
43
+ readonly articleReference?: string;
44
+ readonly fix?: string;
45
+ readonly file?: string;
46
+ readonly line?: number;
47
+ }
48
+ | {
49
+ readonly type: 'info';
50
+ readonly checkId: string;
51
+ readonly message: string;
52
+ readonly severity: Severity;
53
+ readonly obligationId?: string;
54
+ readonly articleReference?: string;
55
+ readonly fix?: string;
56
+ readonly file?: string;
57
+ readonly line?: number;
58
+ }
59
+ | { readonly type: 'skip'; readonly checkId: string; readonly reason: string }
60
+ >;
61
+
62
+ // --- Findings ---
63
+
64
+ export interface Evidence {
65
+ readonly findingId: string;
66
+ readonly layer: string;
67
+ readonly timestamp: string;
68
+ readonly source: string;
69
+ readonly snippet?: string;
70
+ readonly file?: string;
71
+ readonly line?: number;
72
+ }
73
+
74
+ export interface CodeContextLine {
75
+ readonly num: number;
76
+ readonly content: string;
77
+ }
78
+
79
+ export interface CodeContext {
80
+ readonly lines: readonly CodeContextLine[];
81
+ readonly startLine: number;
82
+ readonly highlightLine?: number;
83
+ }
84
+
85
+ export interface FixDiff {
86
+ readonly before: readonly string[];
87
+ readonly after: readonly string[];
88
+ readonly startLine: number;
89
+ readonly filePath: string;
90
+ /** Import line to add at top of file (e.g. "import { complior } from '@complior/sdk'"). */
91
+ readonly importLine?: string;
92
+ }
93
+
94
+ export interface FindingExplanation {
95
+ readonly article: string;
96
+ readonly penalty: string;
97
+ readonly deadline: string;
98
+ readonly business_impact: string;
99
+ }
100
+
101
+ export interface Finding {
102
+ readonly checkId: string;
103
+ readonly type: CheckResultType;
104
+ readonly message: string;
105
+ readonly severity: Severity;
106
+ readonly file?: string;
107
+ readonly line?: number;
108
+ readonly obligationId?: string;
109
+ readonly articleReference?: string;
110
+ readonly fix?: string;
111
+ readonly priority?: number;
112
+ readonly confidence?: number;
113
+ readonly confidenceLevel?: string;
114
+ readonly evidence?: readonly Evidence[];
115
+ readonly codeContext?: CodeContext;
116
+ readonly fixDiff?: FixDiff;
117
+ readonly explanation?: FindingExplanation;
118
+ /** Agent passport name (enriched post-scan from passport source_files). */
119
+ readonly agentId?: string;
120
+ /** Document quality level (none → scaffold → draft → reviewed). */
121
+ readonly docQuality?: DocQualityLevel;
122
+ /** True when this finding was analyzed/modified by L5 LLM. */
123
+ readonly l5Analyzed?: boolean;
124
+ }
125
+
126
+ // --- Score ---
127
+
128
+ export interface CategoryScore {
129
+ readonly category: string;
130
+ readonly weight: number;
131
+ readonly score: number;
132
+ readonly obligationCount: number;
133
+ readonly passedCount: number;
134
+ }
135
+
136
+ export interface ConfidenceSummary {
137
+ readonly pass: number;
138
+ readonly likelyPass: number;
139
+ readonly uncertain: number;
140
+ readonly likelyFail: number;
141
+ readonly fail: number;
142
+ readonly total: number;
143
+ }
144
+
145
+ export interface ScoreBreakdown {
146
+ readonly totalScore: number;
147
+ readonly zone: ScoreZone;
148
+ readonly categoryScores: readonly CategoryScore[];
149
+ readonly criticalCapApplied: boolean;
150
+ readonly totalChecks: number;
151
+ readonly passedChecks: number;
152
+ readonly failedChecks: number;
153
+ readonly skippedChecks: number;
154
+ readonly confidenceSummary?: ConfidenceSummary;
155
+ }
156
+
157
+ export interface ScoreDiff {
158
+ readonly before: number;
159
+ readonly after: number;
160
+ readonly delta: number;
161
+ readonly improved: readonly string[];
162
+ readonly degraded: readonly string[];
163
+ }
164
+
165
+ // --- Scan Tiers ---
166
+
167
+ export type ScanTier = 1 | 2 | 3;
168
+
169
+ export type ExternalToolName = 'semgrep' | 'bandit' | 'modelscan' | 'detect-secrets';
170
+
171
+ export interface ExternalToolResult {
172
+ readonly tool: ExternalToolName;
173
+ readonly version: string;
174
+ readonly findings: readonly Finding[];
175
+ readonly duration: number;
176
+ readonly exitCode: number;
177
+ readonly error?: string;
178
+ }
179
+
180
+ // --- Scan ---
181
+
182
+ export interface RegulationVersion {
183
+ readonly regulation: string;
184
+ readonly version: string;
185
+ readonly rulesVersion: string;
186
+ readonly checkCount: number;
187
+ readonly lastUpdated: string;
188
+ }
189
+
190
+ export interface AgentSummary {
191
+ readonly agentId: string;
192
+ readonly agentName: string;
193
+ readonly findingCount: number;
194
+ readonly criticalCount: number;
195
+ readonly highCount: number;
196
+ readonly fileCount: number;
197
+ }
198
+
199
+ export interface ScanResult {
200
+ readonly score: ScoreBreakdown;
201
+ readonly findings: readonly Finding[];
202
+ readonly projectPath: string;
203
+ readonly scannedAt: string;
204
+ readonly duration: number;
205
+ readonly filesScanned: number;
206
+ readonly deepAnalysis?: boolean;
207
+ readonly l5Cost?: number;
208
+ readonly regulationVersion?: RegulationVersion;
209
+ readonly tier?: ScanTier;
210
+ readonly externalToolResults?: readonly ExternalToolResult[];
211
+ readonly agentSummaries?: readonly AgentSummary[];
212
+ }
213
+
214
+ // --- Project Profile ---
215
+
216
+ export interface DetectedFramework {
217
+ readonly name: string;
218
+ readonly version?: string;
219
+ readonly confidence: number;
220
+ }
221
+
222
+ export interface DetectedAiTool {
223
+ readonly name: string;
224
+ readonly version?: string;
225
+ readonly type: 'sdk' | 'api' | 'library' | 'model';
226
+ }
227
+
228
+ export interface ProjectProfile {
229
+ readonly frameworks: readonly DetectedFramework[];
230
+ readonly aiTools: readonly DetectedAiTool[];
231
+ readonly languages: readonly string[];
232
+ readonly hasPackageJson: boolean;
233
+ readonly detectedModels: readonly string[];
234
+ }
235
+
236
+ // --- Scan History ---
237
+
238
+ export interface ScanRecord {
239
+ readonly score: number;
240
+ readonly zone: ScoreZone;
241
+ readonly findingsCount: number;
242
+ readonly criticalCount: number;
243
+ readonly timestamp: string;
244
+ }
245
+
246
+ // --- Config ---
247
+
248
+ export interface CompliorConfig {
249
+ readonly projectPath: string;
250
+ readonly extends: readonly string[];
251
+ readonly exclude: readonly string[];
252
+ readonly severity: Severity;
253
+ readonly outputFormat: 'json' | 'text' | 'sarif';
254
+ }
255
+
256
+ // --- Compliance Gate ---
257
+
258
+ export interface GateResult {
259
+ readonly passed: boolean;
260
+ readonly beforeScore: number;
261
+ readonly afterScore: number;
262
+ readonly delta: number;
263
+ readonly warnings: readonly string[];
264
+ readonly newFindings: readonly Finding[];
265
+ }
266
+
267
+ // --- Server ---
268
+
269
+ export interface EngineStatus {
270
+ readonly ready: boolean;
271
+ readonly version: string;
272
+ readonly mode: string;
273
+ readonly uptime: number;
274
+ readonly lastScan?: ScanRecord;
275
+ }
276
+
277
+ // --- Evidence Chain (used by evidence-store, read from disk) ---
278
+
279
+ export interface EvidenceEntry {
280
+ readonly evidence: Evidence;
281
+ readonly scanId: string;
282
+ readonly chainPrev: string | null;
283
+ readonly hash: string;
284
+ readonly signature: string;
285
+ }
286
+
287
+ export interface EvidenceChain {
288
+ readonly version: '1.0.0';
289
+ readonly projectPath: string;
290
+ readonly entries: readonly EvidenceEntry[];
291
+ readonly lastHash: string;
292
+ }