vaspera 2.7.0 → 2.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 (321) hide show
  1. package/CHANGELOG.md +72 -0
  2. package/README.md +111 -7
  3. package/dist/__tests__/agents/adversary/tactics/api.test.d.ts +5 -0
  4. package/dist/__tests__/agents/adversary/tactics/api.test.d.ts.map +1 -0
  5. package/dist/__tests__/agents/adversary/tactics/api.test.js +369 -0
  6. package/dist/__tests__/agents/adversary/tactics/api.test.js.map +1 -0
  7. package/dist/__tests__/agents/adversary/tactics/llm.test.d.ts +5 -0
  8. package/dist/__tests__/agents/adversary/tactics/llm.test.d.ts.map +1 -0
  9. package/dist/__tests__/agents/adversary/tactics/llm.test.js +409 -0
  10. package/dist/__tests__/agents/adversary/tactics/llm.test.js.map +1 -0
  11. package/dist/__tests__/agents/adversary/tactics/registry.test.d.ts +7 -0
  12. package/dist/__tests__/agents/adversary/tactics/registry.test.d.ts.map +1 -0
  13. package/dist/__tests__/agents/adversary/tactics/registry.test.js +74 -0
  14. package/dist/__tests__/agents/adversary/tactics/registry.test.js.map +1 -0
  15. package/dist/__tests__/agents/adversary/tactics/web-app.test.d.ts +7 -0
  16. package/dist/__tests__/agents/adversary/tactics/web-app.test.d.ts.map +1 -0
  17. package/dist/__tests__/agents/adversary/tactics/web-app.test.js +374 -0
  18. package/dist/__tests__/agents/adversary/tactics/web-app.test.js.map +1 -0
  19. package/dist/__tests__/compliance-bundle.test.d.ts +9 -0
  20. package/dist/__tests__/compliance-bundle.test.d.ts.map +1 -0
  21. package/dist/__tests__/compliance-bundle.test.js +344 -0
  22. package/dist/__tests__/compliance-bundle.test.js.map +1 -0
  23. package/dist/__tests__/healthcare-compliance.test.d.ts +9 -0
  24. package/dist/__tests__/healthcare-compliance.test.d.ts.map +1 -0
  25. package/dist/__tests__/healthcare-compliance.test.js +233 -0
  26. package/dist/__tests__/healthcare-compliance.test.js.map +1 -0
  27. package/dist/action/diff-mode.d.ts +124 -8
  28. package/dist/action/diff-mode.d.ts.map +1 -1
  29. package/dist/action/diff-mode.js +384 -65
  30. package/dist/action/diff-mode.js.map +1 -1
  31. package/dist/action/diff-mode.test.js +3 -3
  32. package/dist/action/diff-mode.test.js.map +1 -1
  33. package/dist/action/pr-comment.test.js +1 -0
  34. package/dist/action/pr-comment.test.js.map +1 -1
  35. package/dist/action/sarif-upload.test.js +1 -0
  36. package/dist/action/sarif-upload.test.js.map +1 -1
  37. package/dist/agents/adversary/config.d.ts +113 -0
  38. package/dist/agents/adversary/config.d.ts.map +1 -0
  39. package/dist/agents/adversary/config.js +391 -0
  40. package/dist/agents/adversary/config.js.map +1 -0
  41. package/dist/agents/adversary/index.d.ts +41 -0
  42. package/dist/agents/adversary/index.d.ts.map +1 -0
  43. package/dist/agents/adversary/index.js +838 -0
  44. package/dist/agents/adversary/index.js.map +1 -0
  45. package/dist/agents/adversary/reporting/compliance-mapper.d.ts +108 -0
  46. package/dist/agents/adversary/reporting/compliance-mapper.d.ts.map +1 -0
  47. package/dist/agents/adversary/reporting/compliance-mapper.js +391 -0
  48. package/dist/agents/adversary/reporting/compliance-mapper.js.map +1 -0
  49. package/dist/agents/adversary/reporting/index.d.ts +10 -0
  50. package/dist/agents/adversary/reporting/index.d.ts.map +1 -0
  51. package/dist/agents/adversary/reporting/index.js +10 -0
  52. package/dist/agents/adversary/reporting/index.js.map +1 -0
  53. package/dist/agents/adversary/reporting/poc-generator.d.ts +44 -0
  54. package/dist/agents/adversary/reporting/poc-generator.d.ts.map +1 -0
  55. package/dist/agents/adversary/reporting/poc-generator.js +308 -0
  56. package/dist/agents/adversary/reporting/poc-generator.js.map +1 -0
  57. package/dist/agents/adversary/tactics/api.d.ts +13 -0
  58. package/dist/agents/adversary/tactics/api.d.ts.map +1 -0
  59. package/dist/agents/adversary/tactics/api.js +815 -0
  60. package/dist/agents/adversary/tactics/api.js.map +1 -0
  61. package/dist/agents/adversary/tactics/auth.d.ts +13 -0
  62. package/dist/agents/adversary/tactics/auth.d.ts.map +1 -0
  63. package/dist/agents/adversary/tactics/auth.js +676 -0
  64. package/dist/agents/adversary/tactics/auth.js.map +1 -0
  65. package/dist/agents/adversary/tactics/index.d.ts +129 -0
  66. package/dist/agents/adversary/tactics/index.d.ts.map +1 -0
  67. package/dist/agents/adversary/tactics/index.js +199 -0
  68. package/dist/agents/adversary/tactics/index.js.map +1 -0
  69. package/dist/agents/adversary/tactics/infra.d.ts +13 -0
  70. package/dist/agents/adversary/tactics/infra.d.ts.map +1 -0
  71. package/dist/agents/adversary/tactics/infra.js +827 -0
  72. package/dist/agents/adversary/tactics/infra.js.map +1 -0
  73. package/dist/agents/adversary/tactics/injection.d.ts +12 -0
  74. package/dist/agents/adversary/tactics/injection.d.ts.map +1 -0
  75. package/dist/agents/adversary/tactics/injection.js +549 -0
  76. package/dist/agents/adversary/tactics/injection.js.map +1 -0
  77. package/dist/agents/adversary/tactics/llm.d.ts +13 -0
  78. package/dist/agents/adversary/tactics/llm.d.ts.map +1 -0
  79. package/dist/agents/adversary/tactics/llm.js +767 -0
  80. package/dist/agents/adversary/tactics/llm.js.map +1 -0
  81. package/dist/agents/adversary/tactics/web-app.d.ts +13 -0
  82. package/dist/agents/adversary/tactics/web-app.d.ts.map +1 -0
  83. package/dist/agents/adversary/tactics/web-app.js +717 -0
  84. package/dist/agents/adversary/tactics/web-app.js.map +1 -0
  85. package/dist/agents/adversary/types.d.ts +407 -0
  86. package/dist/agents/adversary/types.d.ts.map +1 -0
  87. package/dist/agents/adversary/types.js +12 -0
  88. package/dist/agents/adversary/types.js.map +1 -0
  89. package/dist/agents/index.d.ts +1 -0
  90. package/dist/agents/index.d.ts.map +1 -1
  91. package/dist/agents/index.js +2 -0
  92. package/dist/agents/index.js.map +1 -1
  93. package/dist/agents/zero-day-hunter.d.ts +1 -1
  94. package/dist/agents/zero-day-hunter.d.ts.map +1 -1
  95. package/dist/analysis/data-flow.d.ts +154 -0
  96. package/dist/analysis/data-flow.d.ts.map +1 -0
  97. package/dist/analysis/data-flow.js +393 -0
  98. package/dist/analysis/data-flow.js.map +1 -0
  99. package/dist/analysis/index.d.ts +9 -0
  100. package/dist/analysis/index.d.ts.map +1 -0
  101. package/dist/analysis/index.js +9 -0
  102. package/dist/analysis/index.js.map +1 -0
  103. package/dist/badge-service/index.d.ts +144 -0
  104. package/dist/badge-service/index.d.ts.map +1 -0
  105. package/dist/badge-service/index.js +206 -0
  106. package/dist/badge-service/index.js.map +1 -0
  107. package/dist/certification/consensus.test.js +2 -0
  108. package/dist/certification/consensus.test.js.map +1 -1
  109. package/dist/certification/store.d.ts.map +1 -1
  110. package/dist/certification/store.js +4 -0
  111. package/dist/certification/store.js.map +1 -1
  112. package/dist/certification/types.d.ts +3 -3
  113. package/dist/certification/types.d.ts.map +1 -1
  114. package/dist/certification/types.js +2 -0
  115. package/dist/certification/types.js.map +1 -1
  116. package/dist/commands/certification/certify.d.ts.map +1 -1
  117. package/dist/commands/certification/certify.js +18 -4
  118. package/dist/commands/certification/certify.js.map +1 -1
  119. package/dist/compliance/attestation.d.ts +39 -0
  120. package/dist/compliance/attestation.d.ts.map +1 -0
  121. package/dist/compliance/attestation.js +364 -0
  122. package/dist/compliance/attestation.js.map +1 -0
  123. package/dist/compliance/cfr42-part2.d.ts +42 -0
  124. package/dist/compliance/cfr42-part2.d.ts.map +1 -0
  125. package/dist/compliance/cfr42-part2.js +408 -0
  126. package/dist/compliance/cfr42-part2.js.map +1 -0
  127. package/dist/compliance/compliance-bundle.d.ts +100 -0
  128. package/dist/compliance/compliance-bundle.d.ts.map +1 -0
  129. package/dist/compliance/compliance-bundle.js +210 -0
  130. package/dist/compliance/compliance-bundle.js.map +1 -0
  131. package/dist/compliance/healthcare-bundle.d.ts +68 -0
  132. package/dist/compliance/healthcare-bundle.d.ts.map +1 -0
  133. package/dist/compliance/healthcare-bundle.js +104 -0
  134. package/dist/compliance/healthcare-bundle.js.map +1 -0
  135. package/dist/compliance/hipaa.d.ts.map +1 -1
  136. package/dist/compliance/hipaa.js +14 -11
  137. package/dist/compliance/hipaa.js.map +1 -1
  138. package/dist/compliance/index.d.ts +10 -2
  139. package/dist/compliance/index.d.ts.map +1 -1
  140. package/dist/compliance/index.js +9 -3
  141. package/dist/compliance/index.js.map +1 -1
  142. package/dist/compliance/mapper.d.ts.map +1 -1
  143. package/dist/compliance/mapper.js +3 -17
  144. package/dist/compliance/mapper.js.map +1 -1
  145. package/dist/compliance/nist-800-53.d.ts +22 -6
  146. package/dist/compliance/nist-800-53.d.ts.map +1 -1
  147. package/dist/compliance/nist-800-53.js +264 -272
  148. package/dist/compliance/nist-800-53.js.map +1 -1
  149. package/dist/compliance/report.d.ts +31 -2
  150. package/dist/compliance/report.d.ts.map +1 -1
  151. package/dist/compliance/report.js +255 -4
  152. package/dist/compliance/report.js.map +1 -1
  153. package/dist/compliance/types.d.ts +1 -1
  154. package/dist/compliance/types.d.ts.map +1 -1
  155. package/dist/config/flags.d.ts +12 -12
  156. package/dist/cost/index.d.ts +1 -1
  157. package/dist/cost/index.d.ts.map +1 -1
  158. package/dist/cost/index.js +1 -1
  159. package/dist/cost/index.js.map +1 -1
  160. package/dist/cost/tracker.d.ts +64 -0
  161. package/dist/cost/tracker.d.ts.map +1 -1
  162. package/dist/cost/tracker.js +165 -0
  163. package/dist/cost/tracker.js.map +1 -1
  164. package/dist/eval/fixtures/healthcare/audit-gaps.d.ts +28 -0
  165. package/dist/eval/fixtures/healthcare/audit-gaps.d.ts.map +1 -0
  166. package/dist/eval/fixtures/healthcare/audit-gaps.js +90 -0
  167. package/dist/eval/fixtures/healthcare/audit-gaps.js.map +1 -0
  168. package/dist/eval/fixtures/healthcare/consent-bypass.d.ts +31 -0
  169. package/dist/eval/fixtures/healthcare/consent-bypass.d.ts.map +1 -0
  170. package/dist/eval/fixtures/healthcare/consent-bypass.js +61 -0
  171. package/dist/eval/fixtures/healthcare/consent-bypass.js.map +1 -0
  172. package/dist/eval/fixtures/healthcare/phi-in-logs.d.ts +24 -0
  173. package/dist/eval/fixtures/healthcare/phi-in-logs.d.ts.map +1 -0
  174. package/dist/eval/fixtures/healthcare/phi-in-logs.js +41 -0
  175. package/dist/eval/fixtures/healthcare/phi-in-logs.js.map +1 -0
  176. package/dist/evidence/collector.d.ts +21 -0
  177. package/dist/evidence/collector.d.ts.map +1 -0
  178. package/dist/evidence/collector.js +340 -0
  179. package/dist/evidence/collector.js.map +1 -0
  180. package/dist/evidence/index.d.ts +11 -0
  181. package/dist/evidence/index.d.ts.map +1 -0
  182. package/dist/evidence/index.js +12 -0
  183. package/dist/evidence/index.js.map +1 -0
  184. package/dist/evidence/store.d.ts +39 -0
  185. package/dist/evidence/store.d.ts.map +1 -0
  186. package/dist/evidence/store.js +173 -0
  187. package/dist/evidence/store.js.map +1 -0
  188. package/dist/evidence/types.d.ts +175 -0
  189. package/dist/evidence/types.d.ts.map +1 -0
  190. package/dist/evidence/types.js +9 -0
  191. package/dist/evidence/types.js.map +1 -0
  192. package/dist/exporters/checkmarx.d.ts +18 -0
  193. package/dist/exporters/checkmarx.d.ts.map +1 -0
  194. package/dist/exporters/checkmarx.js +203 -0
  195. package/dist/exporters/checkmarx.js.map +1 -0
  196. package/dist/exporters/index.d.ts +22 -0
  197. package/dist/exporters/index.d.ts.map +1 -0
  198. package/dist/exporters/index.js +41 -0
  199. package/dist/exporters/index.js.map +1 -0
  200. package/dist/exporters/snyk.d.ts +18 -0
  201. package/dist/exporters/snyk.d.ts.map +1 -0
  202. package/dist/exporters/snyk.js +119 -0
  203. package/dist/exporters/snyk.js.map +1 -0
  204. package/dist/exporters/sonarqube.d.ts +18 -0
  205. package/dist/exporters/sonarqube.d.ts.map +1 -0
  206. package/dist/exporters/sonarqube.js +125 -0
  207. package/dist/exporters/sonarqube.js.map +1 -0
  208. package/dist/exporters/types.d.ts +190 -0
  209. package/dist/exporters/types.d.ts.map +1 -0
  210. package/dist/exporters/types.js +9 -0
  211. package/dist/exporters/types.js.map +1 -0
  212. package/dist/frontier/index.d.ts +12 -0
  213. package/dist/frontier/index.d.ts.map +1 -0
  214. package/dist/frontier/index.js +12 -0
  215. package/dist/frontier/index.js.map +1 -0
  216. package/dist/frontier/orchestrator.d.ts +73 -0
  217. package/dist/frontier/orchestrator.d.ts.map +1 -0
  218. package/dist/frontier/orchestrator.js +312 -0
  219. package/dist/frontier/orchestrator.js.map +1 -0
  220. package/dist/frontier/providers/stub.d.ts +32 -0
  221. package/dist/frontier/providers/stub.d.ts.map +1 -0
  222. package/dist/frontier/providers/stub.js +66 -0
  223. package/dist/frontier/providers/stub.js.map +1 -0
  224. package/dist/frontier/types.d.ts +318 -0
  225. package/dist/frontier/types.d.ts.map +1 -0
  226. package/dist/frontier/types.js +27 -0
  227. package/dist/frontier/types.js.map +1 -0
  228. package/dist/history/index.d.ts +13 -0
  229. package/dist/history/index.d.ts.map +1 -0
  230. package/dist/history/index.js +15 -0
  231. package/dist/history/index.js.map +1 -0
  232. package/dist/history/store.d.ts +74 -0
  233. package/dist/history/store.d.ts.map +1 -0
  234. package/dist/history/store.js +399 -0
  235. package/dist/history/store.js.map +1 -0
  236. package/dist/history/types.d.ts +282 -0
  237. package/dist/history/types.d.ts.map +1 -0
  238. package/dist/history/types.js +41 -0
  239. package/dist/history/types.js.map +1 -0
  240. package/dist/history/verify.d.ts +44 -0
  241. package/dist/history/verify.d.ts.map +1 -0
  242. package/dist/history/verify.js +230 -0
  243. package/dist/history/verify.js.map +1 -0
  244. package/dist/index.d.ts.map +1 -1
  245. package/dist/index.js +431 -18
  246. package/dist/index.js.map +1 -1
  247. package/dist/multimodel/index.d.ts +1 -0
  248. package/dist/multimodel/index.d.ts.map +1 -1
  249. package/dist/multimodel/index.js +2 -0
  250. package/dist/multimodel/index.js.map +1 -1
  251. package/dist/multimodel/leaderboard.d.ts +116 -0
  252. package/dist/multimodel/leaderboard.d.ts.map +1 -0
  253. package/dist/multimodel/leaderboard.js +262 -0
  254. package/dist/multimodel/leaderboard.js.map +1 -0
  255. package/dist/observability/otel.d.ts.map +1 -1
  256. package/dist/observability/otel.js +1 -3
  257. package/dist/observability/otel.js.map +1 -1
  258. package/dist/plugins/loader.js +1 -1
  259. package/dist/plugins/loader.js.map +1 -1
  260. package/dist/sbom/provenance.test.js +2 -2
  261. package/dist/sbom/provenance.test.js.map +1 -1
  262. package/dist/scanners/agent/agent-chain-analysis.d.ts +152 -0
  263. package/dist/scanners/agent/agent-chain-analysis.d.ts.map +1 -0
  264. package/dist/scanners/agent/agent-chain-analysis.js +438 -0
  265. package/dist/scanners/agent/agent-chain-analysis.js.map +1 -0
  266. package/dist/scanners/agent/manifest-audit.d.ts.map +1 -1
  267. package/dist/scanners/agent/manifest-audit.js +30 -18
  268. package/dist/scanners/agent/manifest-audit.js.map +1 -1
  269. package/dist/scanners/agent/payloads/index.d.ts +2 -1
  270. package/dist/scanners/agent/payloads/index.d.ts.map +1 -1
  271. package/dist/scanners/agent/payloads/index.js +25 -6
  272. package/dist/scanners/agent/payloads/index.js.map +1 -1
  273. package/dist/scanners/agent/prompt-injection-fuzzer.d.ts.map +1 -1
  274. package/dist/scanners/agent/prompt-injection-fuzzer.js +14 -0
  275. package/dist/scanners/agent/prompt-injection-fuzzer.js.map +1 -1
  276. package/dist/scanners/agent/types.d.ts +5 -5
  277. package/dist/scanners/agent/types.d.ts.map +1 -1
  278. package/dist/scanners/agent/types.js.map +1 -1
  279. package/dist/scanners/cache.d.ts +156 -0
  280. package/dist/scanners/cache.d.ts.map +1 -0
  281. package/dist/scanners/cache.js +462 -0
  282. package/dist/scanners/cache.js.map +1 -0
  283. package/dist/scanners/dependencies.d.ts.map +1 -1
  284. package/dist/scanners/dependencies.js +5 -6
  285. package/dist/scanners/dependencies.js.map +1 -1
  286. package/dist/scanners/gosec.d.ts.map +1 -1
  287. package/dist/scanners/gosec.js +47 -9
  288. package/dist/scanners/gosec.js.map +1 -1
  289. package/dist/scanners/healthcare.d.ts +29 -0
  290. package/dist/scanners/healthcare.d.ts.map +1 -0
  291. package/dist/scanners/healthcare.js +526 -0
  292. package/dist/scanners/healthcare.js.map +1 -0
  293. package/dist/scanners/index.d.ts +1 -0
  294. package/dist/scanners/index.d.ts.map +1 -1
  295. package/dist/scanners/index.js +33 -0
  296. package/dist/scanners/index.js.map +1 -1
  297. package/dist/scanners/index.test.js +6 -6
  298. package/dist/scanners/index.test.js.map +1 -1
  299. package/dist/scanners/secrets.js +4 -4
  300. package/dist/scanners/secrets.js.map +1 -1
  301. package/dist/scanners/semgrep.js +5 -5
  302. package/dist/scanners/semgrep.js.map +1 -1
  303. package/dist/scanners/types.d.ts +1 -1
  304. package/dist/scanners/types.d.ts.map +1 -1
  305. package/dist/scanners/types.js +1 -0
  306. package/dist/scanners/types.js.map +1 -1
  307. package/dist/scanners/typescript.test.js +1 -1
  308. package/dist/scanners/typescript.test.js.map +1 -1
  309. package/dist/telemetry/index.d.ts +10 -0
  310. package/dist/telemetry/index.d.ts.map +1 -0
  311. package/dist/telemetry/index.js +10 -0
  312. package/dist/telemetry/index.js.map +1 -0
  313. package/dist/telemetry/registry.d.ts +178 -0
  314. package/dist/telemetry/registry.d.ts.map +1 -0
  315. package/dist/telemetry/registry.js +297 -0
  316. package/dist/telemetry/registry.js.map +1 -0
  317. package/dist/telemetry/usage.d.ts +197 -0
  318. package/dist/telemetry/usage.d.ts.map +1 -0
  319. package/dist/telemetry/usage.js +244 -0
  320. package/dist/telemetry/usage.js.map +1 -0
  321. package/package.json +11 -2
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Evidence Collector
3
+ *
4
+ * Collects and packages audit evidence for compliance.
5
+ *
6
+ * @module evidence/collector
7
+ */
8
+ import type { EvidenceBundle, EvidenceArtifact, CollectEvidenceOptions, CollectEvidenceResult } from "./types.js";
9
+ /**
10
+ * Collect evidence artifacts
11
+ */
12
+ export declare function collectEvidence(options: CollectEvidenceOptions): Promise<CollectEvidenceResult>;
13
+ /**
14
+ * Calculate bundle digest from artifacts
15
+ */
16
+ export declare function calculateBundleDigest(artifacts: EvidenceArtifact[]): string;
17
+ /**
18
+ * Format evidence bundle as markdown summary
19
+ */
20
+ export declare function formatEvidenceBundleAsMarkdown(bundle: EvidenceBundle): string;
21
+ //# sourceMappingURL=collector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../../src/evidence/collector.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAIhB,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,YAAY,CAAC;AAqMpB;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,qBAAqB,CAAC,CA+JhC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAG3E;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CA6D7E"}
@@ -0,0 +1,340 @@
1
+ /**
2
+ * Evidence Collector
3
+ *
4
+ * Collects and packages audit evidence for compliance.
5
+ *
6
+ * @module evidence/collector
7
+ */
8
+ import { readFile, access, stat, readdir } from "fs/promises";
9
+ import { join, basename } from "path";
10
+ import { createHash, randomUUID } from "crypto";
11
+ import { platform, release, hostname } from "os";
12
+ import { logger } from "../logger.js";
13
+ const VASPERA_DIR = ".vaspera";
14
+ const DEFAULT_MAX_INLINE_SIZE = 50 * 1024; // 50KB
15
+ /**
16
+ * Get package.json version
17
+ */
18
+ async function getVasperaVersion() {
19
+ try {
20
+ const pkgPath = join(process.cwd(), "package.json");
21
+ const pkg = JSON.parse(await readFile(pkgPath, "utf-8"));
22
+ return pkg.version || "unknown";
23
+ }
24
+ catch {
25
+ return "unknown";
26
+ }
27
+ }
28
+ /**
29
+ * Detect CI environment
30
+ */
31
+ function detectCIEnvironment() {
32
+ // GitHub Actions
33
+ if (process.env.GITHUB_ACTIONS === "true") {
34
+ return {
35
+ provider: "github",
36
+ buildId: process.env.GITHUB_RUN_ID || "",
37
+ commitSha: process.env.GITHUB_SHA || "",
38
+ ref: process.env.GITHUB_REF,
39
+ actor: process.env.GITHUB_ACTOR,
40
+ runId: process.env.GITHUB_RUN_NUMBER,
41
+ repository: process.env.GITHUB_REPOSITORY
42
+ ? {
43
+ owner: process.env.GITHUB_REPOSITORY.split("/")[0],
44
+ name: process.env.GITHUB_REPOSITORY.split("/")[1],
45
+ url: `https://github.com/${process.env.GITHUB_REPOSITORY}`,
46
+ }
47
+ : undefined,
48
+ pullRequest: process.env.GITHUB_EVENT_NAME === "pull_request"
49
+ ? {
50
+ number: parseInt(process.env.GITHUB_REF?.split("/")[2] || "0", 10),
51
+ }
52
+ : undefined,
53
+ };
54
+ }
55
+ // GitLab CI
56
+ if (process.env.GITLAB_CI === "true") {
57
+ return {
58
+ provider: "gitlab",
59
+ buildId: process.env.CI_PIPELINE_ID || "",
60
+ commitSha: process.env.CI_COMMIT_SHA || "",
61
+ ref: process.env.CI_COMMIT_REF_NAME,
62
+ actor: process.env.GITLAB_USER_LOGIN,
63
+ runId: process.env.CI_JOB_ID,
64
+ repository: {
65
+ owner: process.env.CI_PROJECT_NAMESPACE || "",
66
+ name: process.env.CI_PROJECT_NAME || "",
67
+ url: process.env.CI_PROJECT_URL || "",
68
+ },
69
+ pullRequest: process.env.CI_MERGE_REQUEST_IID
70
+ ? {
71
+ number: parseInt(process.env.CI_MERGE_REQUEST_IID, 10),
72
+ title: process.env.CI_MERGE_REQUEST_TITLE,
73
+ }
74
+ : undefined,
75
+ };
76
+ }
77
+ // Jenkins
78
+ if (process.env.JENKINS_URL) {
79
+ return {
80
+ provider: "jenkins",
81
+ buildId: process.env.BUILD_ID || "",
82
+ commitSha: process.env.GIT_COMMIT || "",
83
+ ref: process.env.GIT_BRANCH,
84
+ runId: process.env.BUILD_NUMBER,
85
+ };
86
+ }
87
+ // CircleCI
88
+ if (process.env.CIRCLECI === "true") {
89
+ return {
90
+ provider: "circleci",
91
+ buildId: process.env.CIRCLE_BUILD_NUM || "",
92
+ commitSha: process.env.CIRCLE_SHA1 || "",
93
+ ref: process.env.CIRCLE_BRANCH,
94
+ actor: process.env.CIRCLE_USERNAME,
95
+ repository: {
96
+ owner: process.env.CIRCLE_PROJECT_USERNAME || "",
97
+ name: process.env.CIRCLE_PROJECT_REPONAME || "",
98
+ url: `https://github.com/${process.env.CIRCLE_PROJECT_USERNAME}/${process.env.CIRCLE_PROJECT_REPONAME}`,
99
+ },
100
+ pullRequest: process.env.CIRCLE_PULL_REQUEST
101
+ ? {
102
+ number: parseInt(process.env.CIRCLE_PULL_REQUEST.split("/").pop() || "0", 10),
103
+ url: process.env.CIRCLE_PULL_REQUEST,
104
+ }
105
+ : undefined,
106
+ };
107
+ }
108
+ // Generic CI detection
109
+ if (process.env.CI === "true" || process.env.CI === "1") {
110
+ return {
111
+ provider: "unknown",
112
+ buildId: process.env.BUILD_ID || process.env.BUILD_NUMBER || "",
113
+ commitSha: process.env.COMMIT_SHA || process.env.GIT_COMMIT || "",
114
+ };
115
+ }
116
+ return undefined;
117
+ }
118
+ /**
119
+ * Capture runtime environment
120
+ */
121
+ async function captureEnvironment() {
122
+ const ci = detectCIEnvironment();
123
+ return {
124
+ os: platform(),
125
+ osVersion: release(),
126
+ nodeVersion: process.version,
127
+ vasperaVersion: await getVasperaVersion(),
128
+ hostname: ci ? undefined : hostname().slice(0, 8), // Truncate for privacy in non-CI
129
+ ci,
130
+ capturedAt: new Date().toISOString(),
131
+ };
132
+ }
133
+ /**
134
+ * Calculate SHA-256 hash of content
135
+ */
136
+ function calculateDigest(content) {
137
+ return createHash("sha256").update(content).digest("hex");
138
+ }
139
+ /**
140
+ * Create an artifact from a file
141
+ */
142
+ async function createFileArtifact(filePath, type, name, description, maxInlineSize) {
143
+ try {
144
+ await access(filePath);
145
+ const stats = await stat(filePath);
146
+ const content = await readFile(filePath, "utf-8");
147
+ const digest = calculateDigest(content);
148
+ const artifact = {
149
+ type,
150
+ name,
151
+ description,
152
+ contentDigest: digest,
153
+ sizeBytes: stats.size,
154
+ collectedAt: new Date().toISOString(),
155
+ sourcePath: filePath,
156
+ };
157
+ // Inline small artifacts
158
+ if (stats.size <= maxInlineSize) {
159
+ artifact.content = content;
160
+ }
161
+ return artifact;
162
+ }
163
+ catch {
164
+ return null;
165
+ }
166
+ }
167
+ /**
168
+ * Create an artifact from inline content
169
+ */
170
+ function createInlineArtifact(content, type, name, description) {
171
+ const contentBytes = Buffer.from(content, "utf-8");
172
+ return {
173
+ type,
174
+ name,
175
+ description,
176
+ contentDigest: calculateDigest(contentBytes),
177
+ sizeBytes: contentBytes.length,
178
+ collectedAt: new Date().toISOString(),
179
+ content,
180
+ };
181
+ }
182
+ /**
183
+ * Collect evidence artifacts
184
+ */
185
+ export async function collectEvidence(options) {
186
+ const { projectPath, certificationId, frameworks = [], includeSbom = true, includeHistory = true, includeScanResults = true, includeConfig = true, maxInlineSize = DEFAULT_MAX_INLINE_SIZE, } = options;
187
+ const warnings = [];
188
+ const artifacts = [];
189
+ logger.info("evidence.collect.start", { projectPath, certificationId });
190
+ try {
191
+ const vasperaDir = join(projectPath, VASPERA_DIR);
192
+ // Collect config files
193
+ if (includeConfig) {
194
+ const configFile = join(vasperaDir, "config.json");
195
+ const configArtifact = await createFileArtifact(configFile, "config_file", "vaspera-config", "Vaspera configuration file", maxInlineSize);
196
+ if (configArtifact) {
197
+ artifacts.push(configArtifact);
198
+ }
199
+ }
200
+ // Collect history snapshot
201
+ if (includeHistory) {
202
+ const historyFile = join(vasperaDir, "history.jsonl");
203
+ const historyArtifact = await createFileArtifact(historyFile, "history_snapshot", "audit-history", "Certification and scan history with hash chain", maxInlineSize);
204
+ if (historyArtifact) {
205
+ artifacts.push(historyArtifact);
206
+ }
207
+ else {
208
+ warnings.push("History file not found - audit trail not included");
209
+ }
210
+ }
211
+ // Collect scan results
212
+ if (includeScanResults) {
213
+ const scansDir = join(vasperaDir, "scans");
214
+ try {
215
+ await access(scansDir);
216
+ const files = await readdir(scansDir);
217
+ const jsonFiles = files.filter((f) => f.endsWith(".json")).slice(0, 10); // Limit to 10 most recent
218
+ for (const file of jsonFiles) {
219
+ const scanArtifact = await createFileArtifact(join(scansDir, file), "scan_result", `scan-${basename(file, ".json")}`, "Deterministic scanner results", maxInlineSize);
220
+ if (scanArtifact) {
221
+ artifacts.push(scanArtifact);
222
+ }
223
+ }
224
+ }
225
+ catch {
226
+ warnings.push("Scans directory not found");
227
+ }
228
+ }
229
+ // Collect compliance reports
230
+ if (frameworks.length > 0) {
231
+ const reportsDir = join(vasperaDir, "reports");
232
+ try {
233
+ await access(reportsDir);
234
+ const files = await readdir(reportsDir);
235
+ for (const framework of frameworks) {
236
+ const reportFile = files.find((f) => f.includes(framework.toLowerCase()));
237
+ if (reportFile) {
238
+ const reportArtifact = await createFileArtifact(join(reportsDir, reportFile), "compliance_report", `compliance-${framework}`, `${framework} compliance report`, maxInlineSize);
239
+ if (reportArtifact) {
240
+ artifacts.push(reportArtifact);
241
+ }
242
+ }
243
+ }
244
+ }
245
+ catch {
246
+ warnings.push("Reports directory not found");
247
+ }
248
+ }
249
+ // Collect SBOM
250
+ if (includeSbom) {
251
+ const sbomFile = join(vasperaDir, "sbom.json");
252
+ const sbomArtifact = await createFileArtifact(sbomFile, "sbom", "sbom", "Software Bill of Materials (CycloneDX)", maxInlineSize);
253
+ if (sbomArtifact) {
254
+ artifacts.push(sbomArtifact);
255
+ }
256
+ }
257
+ // Calculate bundle digest from all artifact digests
258
+ const allDigests = artifacts.map((a) => a.contentDigest).sort().join("");
259
+ const bundleDigest = calculateDigest(allDigests);
260
+ // Capture environment
261
+ const environment = await captureEnvironment();
262
+ // Create the bundle
263
+ const bundle = {
264
+ id: `evidence-${randomUUID().slice(0, 12)}`,
265
+ certificationId,
266
+ createdAt: new Date().toISOString(),
267
+ projectPath,
268
+ frameworks,
269
+ environment,
270
+ artifacts,
271
+ bundleDigest,
272
+ };
273
+ logger.info("evidence.collect.complete", {
274
+ bundleId: bundle.id,
275
+ artifactCount: artifacts.length,
276
+ warningCount: warnings.length,
277
+ });
278
+ return {
279
+ success: true,
280
+ bundle,
281
+ warnings,
282
+ };
283
+ }
284
+ catch (error) {
285
+ const message = error instanceof Error ? error.message : "Unknown error";
286
+ logger.error("evidence.collect.failed", { error: message });
287
+ return {
288
+ success: false,
289
+ error: message,
290
+ warnings,
291
+ };
292
+ }
293
+ }
294
+ /**
295
+ * Calculate bundle digest from artifacts
296
+ */
297
+ export function calculateBundleDigest(artifacts) {
298
+ const allDigests = artifacts.map((a) => a.contentDigest).sort().join("");
299
+ return calculateDigest(allDigests);
300
+ }
301
+ /**
302
+ * Format evidence bundle as markdown summary
303
+ */
304
+ export function formatEvidenceBundleAsMarkdown(bundle) {
305
+ const lines = [
306
+ "# Evidence Bundle",
307
+ "",
308
+ `**Bundle ID**: ${bundle.id}`,
309
+ `**Created**: ${bundle.createdAt}`,
310
+ `**Project**: ${bundle.projectPath}`,
311
+ bundle.certificationId ? `**Certification**: ${bundle.certificationId}` : "",
312
+ "",
313
+ "## Environment",
314
+ "",
315
+ `| Property | Value |`,
316
+ `|----------|-------|`,
317
+ `| OS | ${bundle.environment.os} ${bundle.environment.osVersion} |`,
318
+ `| Node.js | ${bundle.environment.nodeVersion} |`,
319
+ `| Vaspera | ${bundle.environment.vasperaVersion} |`,
320
+ ];
321
+ if (bundle.environment.ci) {
322
+ lines.push(`| CI Provider | ${bundle.environment.ci.provider} |`, `| Build ID | ${bundle.environment.ci.buildId} |`, `| Commit | \`${bundle.environment.ci.commitSha.slice(0, 8)}\` |`);
323
+ }
324
+ lines.push("", "## Artifacts", "", `| Type | Name | Size | Digest |`, `|------|------|------|--------|`);
325
+ for (const artifact of bundle.artifacts) {
326
+ const sizeKB = (artifact.sizeBytes / 1024).toFixed(1);
327
+ lines.push(`| ${artifact.type} | ${artifact.name} | ${sizeKB}KB | \`${artifact.contentDigest.slice(0, 16)}...\` |`);
328
+ }
329
+ lines.push("", "## Bundle Integrity", "", `**Bundle Digest**: \`${bundle.bundleDigest}\``, "");
330
+ if (bundle.signature) {
331
+ lines.push("**Signature**: Present", bundle.signature.rekorLogIndex
332
+ ? `**Rekor Log Index**: ${bundle.signature.rekorLogIndex}`
333
+ : "");
334
+ }
335
+ else {
336
+ lines.push("**Signature**: Not signed");
337
+ }
338
+ return lines.filter(Boolean).join("\n");
339
+ }
340
+ //# sourceMappingURL=collector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collector.js","sourceRoot":"","sources":["../../src/evidence/collector.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAYtC,MAAM,WAAW,GAAG,UAAU,CAAC;AAC/B,MAAM,uBAAuB,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO;AAElD;;GAEG;AACH,KAAK,UAAU,iBAAiB;IAC9B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QACzD,OAAO,GAAG,CAAC,OAAO,IAAI,SAAS,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB;IAC1B,iBAAiB;IACjB,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,MAAM,EAAE,CAAC;QAC1C,OAAO;YACL,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE;YACxC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE;YACvC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU;YAC3B,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY;YAC/B,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB;YACpC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB;gBACvC,CAAC,CAAC;oBACE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBAClD,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBACjD,GAAG,EAAE,sBAAsB,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE;iBAC3D;gBACH,CAAC,CAAC,SAAS;YACb,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,cAAc;gBAC3D,CAAC,CAAC;oBACE,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC;iBACnE;gBACH,CAAC,CAAC,SAAS;SACd,CAAC;IACJ,CAAC;IAED,YAAY;IACZ,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;QACrC,OAAO;YACL,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE;YACzC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE;YAC1C,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB;YACnC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB;YACpC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS;YAC5B,UAAU,EAAE;gBACV,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE;gBAC7C,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE;gBACvC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE;aACtC;YACD,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB;gBAC3C,CAAC,CAAC;oBACE,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,EAAE,CAAC;oBACtD,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB;iBAC1C;gBACH,CAAC,CAAC,SAAS;SACd,CAAC;IACJ,CAAC;IAED,UAAU;IACV,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;QAC5B,OAAO;YACL,QAAQ,EAAE,SAAS;YACnB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE;YACnC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE;YACvC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU;YAC3B,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY;SAChC,CAAC;IACJ,CAAC;IAED,WAAW;IACX,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QACpC,OAAO;YACL,QAAQ,EAAE,UAAU;YACpB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,EAAE;YAC3C,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE;YACxC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa;YAC9B,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe;YAClC,UAAU,EAAE;gBACV,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,EAAE;gBAChD,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,EAAE;gBAC/C,GAAG,EAAE,sBAAsB,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE;aACxG;YACD,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB;gBAC1C,CAAC,CAAC;oBACE,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;oBAC7E,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB;iBACrC;gBACH,CAAC,CAAC,SAAS;SACd,CAAC;IACJ,CAAC;IAED,uBAAuB;IACvB,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE,CAAC;QACxD,OAAO;YACL,QAAQ,EAAE,SAAS;YACnB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE;YAC/D,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE;SAClE,CAAC;IACJ,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,kBAAkB;IAC/B,MAAM,EAAE,GAAG,mBAAmB,EAAE,CAAC;IAEjC,OAAO;QACL,EAAE,EAAE,QAAQ,EAAE;QACd,SAAS,EAAE,OAAO,EAAE;QACpB,WAAW,EAAE,OAAO,CAAC,OAAO;QAC5B,cAAc,EAAE,MAAM,iBAAiB,EAAE;QACzC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,iCAAiC;QACpF,EAAE;QACF,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACrC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,OAAwB;IAC/C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,kBAAkB,CAC/B,QAAgB,EAChB,IAA0B,EAC1B,IAAY,EACZ,WAAmB,EACnB,aAAqB;IAErB,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QAExC,MAAM,QAAQ,GAAqB;YACjC,IAAI;YACJ,IAAI;YACJ,WAAW;YACX,aAAa,EAAE,MAAM;YACrB,SAAS,EAAE,KAAK,CAAC,IAAI;YACrB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACrC,UAAU,EAAE,QAAQ;SACrB,CAAC;QAEF,yBAAyB;QACzB,IAAI,KAAK,CAAC,IAAI,IAAI,aAAa,EAAE,CAAC;YAChC,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC;QAC7B,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAC3B,OAAe,EACf,IAA0B,EAC1B,IAAY,EACZ,WAAmB;IAEnB,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACnD,OAAO;QACL,IAAI;QACJ,IAAI;QACJ,WAAW;QACX,aAAa,EAAE,eAAe,CAAC,YAAY,CAAC;QAC5C,SAAS,EAAE,YAAY,CAAC,MAAM;QAC9B,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,OAAO;KACR,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAA+B;IAE/B,MAAM,EACJ,WAAW,EACX,eAAe,EACf,UAAU,GAAG,EAAE,EACf,WAAW,GAAG,IAAI,EAClB,cAAc,GAAG,IAAI,EACrB,kBAAkB,GAAG,IAAI,EACzB,aAAa,GAAG,IAAI,EACpB,aAAa,GAAG,uBAAuB,GACxC,GAAG,OAAO,CAAC;IAEZ,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAuB,EAAE,CAAC;IAEzC,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC,CAAC;IAExE,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAElD,uBAAuB;QACvB,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;YACnD,MAAM,cAAc,GAAG,MAAM,kBAAkB,CAC7C,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,4BAA4B,EAC5B,aAAa,CACd,CAAC;YACF,IAAI,cAAc,EAAE,CAAC;gBACnB,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QAED,2BAA2B;QAC3B,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;YACtD,MAAM,eAAe,GAAG,MAAM,kBAAkB,CAC9C,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,gDAAgD,EAChD,aAAa,CACd,CAAC;YACF,IAAI,eAAe,EAAE,CAAC;gBACpB,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAClC,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;QAED,uBAAuB;QACvB,IAAI,kBAAkB,EAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAC3C,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACvB,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACtC,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,0BAA0B;gBAEnG,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;oBAC7B,MAAM,YAAY,GAAG,MAAM,kBAAkB,CAC3C,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,EACpB,aAAa,EACb,QAAQ,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EACjC,+BAA+B,EAC/B,aAAa,CACd,CAAC;oBACF,IAAI,YAAY,EAAE,CAAC;wBACjB,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;oBAC/B,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,QAAQ,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QAED,6BAA6B;QAC7B,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YAC/C,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;gBACzB,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;gBAExC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;oBACnC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;oBAC1E,IAAI,UAAU,EAAE,CAAC;wBACf,MAAM,cAAc,GAAG,MAAM,kBAAkB,CAC7C,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,EAC5B,mBAAmB,EACnB,cAAc,SAAS,EAAE,EACzB,GAAG,SAAS,oBAAoB,EAChC,aAAa,CACd,CAAC;wBACF,IAAI,cAAc,EAAE,CAAC;4BACnB,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;wBACjC,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,QAAQ,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QAED,eAAe;QACf,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;YAC/C,MAAM,YAAY,GAAG,MAAM,kBAAkB,CAC3C,QAAQ,EACR,MAAM,EACN,MAAM,EACN,wCAAwC,EACxC,aAAa,CACd,CAAC;YACF,IAAI,YAAY,EAAE,CAAC;gBACjB,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QAED,oDAAoD;QACpD,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzE,MAAM,YAAY,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;QAEjD,sBAAsB;QACtB,MAAM,WAAW,GAAG,MAAM,kBAAkB,EAAE,CAAC;QAE/C,oBAAoB;QACpB,MAAM,MAAM,GAAmB;YAC7B,EAAE,EAAE,YAAY,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;YAC3C,eAAe;YACf,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,WAAW;YACX,UAAU;YACV,WAAW;YACX,SAAS;YACT,YAAY;SACb,CAAC;QAEF,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE;YACvC,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,aAAa,EAAE,SAAS,CAAC,MAAM;YAC/B,YAAY,EAAE,QAAQ,CAAC,MAAM;SAC9B,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE,IAAI;YACb,MAAM;YACN,QAAQ;SACT,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QACzE,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAE5D,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,OAAO;YACd,QAAQ;SACT,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,SAA6B;IACjE,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzE,OAAO,eAAe,CAAC,UAAU,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,8BAA8B,CAAC,MAAsB;IACnE,MAAM,KAAK,GAAa;QACtB,mBAAmB;QACnB,EAAE;QACF,kBAAkB,MAAM,CAAC,EAAE,EAAE;QAC7B,gBAAgB,MAAM,CAAC,SAAS,EAAE;QAClC,gBAAgB,MAAM,CAAC,WAAW,EAAE;QACpC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,sBAAsB,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE;QAC5E,EAAE;QACF,gBAAgB;QAChB,EAAE;QACF,sBAAsB;QACtB,sBAAsB;QACtB,UAAU,MAAM,CAAC,WAAW,CAAC,EAAE,IAAI,MAAM,CAAC,WAAW,CAAC,SAAS,IAAI;QACnE,eAAe,MAAM,CAAC,WAAW,CAAC,WAAW,IAAI;QACjD,eAAe,MAAM,CAAC,WAAW,CAAC,cAAc,IAAI;KACrD,CAAC;IAEF,IAAI,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CACR,mBAAmB,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,QAAQ,IAAI,EACrD,gBAAgB,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,OAAO,IAAI,EACjD,gBAAgB,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAClE,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CACR,EAAE,EACF,cAAc,EACd,EAAE,EACF,iCAAiC,EACjC,iCAAiC,CAClC,CAAC;IAEF,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,CAAC,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACtD,KAAK,CAAC,IAAI,CACR,KAAK,QAAQ,CAAC,IAAI,MAAM,QAAQ,CAAC,IAAI,MAAM,MAAM,UAAU,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CACxG,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CACR,EAAE,EACF,qBAAqB,EACrB,EAAE,EACF,wBAAwB,MAAM,CAAC,YAAY,IAAI,EAC/C,EAAE,CACH,CAAC;IAEF,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CACR,wBAAwB,EACxB,MAAM,CAAC,SAAS,CAAC,aAAa;YAC5B,CAAC,CAAC,wBAAwB,MAAM,CAAC,SAAS,CAAC,aAAa,EAAE;YAC1D,CAAC,CAAC,EAAE,CACP,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Evidence Collection Module
3
+ *
4
+ * Collects, stores, and verifies audit evidence for compliance.
5
+ *
6
+ * @module evidence
7
+ */
8
+ export type { EvidenceArtifactType, EvidenceArtifact, CIEnvironment, RuntimeEnvironment, EvidenceBundle, CollectEvidenceOptions, CollectEvidenceResult, VerifyEvidenceResult, } from "./types.js";
9
+ export { collectEvidence, calculateBundleDigest, formatEvidenceBundleAsMarkdown, } from "./collector.js";
10
+ export { storeEvidenceBundle, loadEvidenceBundle, listEvidenceBundles, verifyEvidenceBundle, getEvidenceStats, } from "./store.js";
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/evidence/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,YAAY,EACV,oBAAoB,EACpB,gBAAgB,EAChB,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,8BAA8B,GAC/B,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Evidence Collection Module
3
+ *
4
+ * Collects, stores, and verifies audit evidence for compliance.
5
+ *
6
+ * @module evidence
7
+ */
8
+ // Collector
9
+ export { collectEvidence, calculateBundleDigest, formatEvidenceBundleAsMarkdown, } from "./collector.js";
10
+ // Store
11
+ export { storeEvidenceBundle, loadEvidenceBundle, listEvidenceBundles, verifyEvidenceBundle, getEvidenceStats, } from "./store.js";
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/evidence/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAcH,YAAY;AACZ,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,8BAA8B,GAC/B,MAAM,gBAAgB,CAAC;AAExB,QAAQ;AACR,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Evidence Store
3
+ *
4
+ * Storage and retrieval for evidence bundles.
5
+ *
6
+ * @module evidence/store
7
+ */
8
+ import type { EvidenceBundle, VerifyEvidenceResult } from "./types.js";
9
+ /**
10
+ * Store an evidence bundle
11
+ */
12
+ export declare function storeEvidenceBundle(projectPath: string, bundle: EvidenceBundle): Promise<string>;
13
+ /**
14
+ * Load an evidence bundle by ID
15
+ */
16
+ export declare function loadEvidenceBundle(projectPath: string, bundleId: string): Promise<EvidenceBundle | null>;
17
+ /**
18
+ * List all evidence bundles for a project
19
+ */
20
+ export declare function listEvidenceBundles(projectPath: string): Promise<Array<{
21
+ id: string;
22
+ createdAt: string;
23
+ certificationId?: string;
24
+ artifactCount: number;
25
+ }>>;
26
+ /**
27
+ * Verify an evidence bundle's integrity
28
+ */
29
+ export declare function verifyEvidenceBundle(bundle: EvidenceBundle): Promise<VerifyEvidenceResult>;
30
+ /**
31
+ * Get evidence bundle statistics
32
+ */
33
+ export declare function getEvidenceStats(projectPath: string): Promise<{
34
+ bundleCount: number;
35
+ totalSizeBytes: number;
36
+ oldestBundle?: string;
37
+ newestBundle?: string;
38
+ }>;
39
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/evidence/store.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EACV,cAAc,EACd,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAoBpB;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,MAAM,CAAC,CAUjB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAWhC;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAiCpG;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,oBAAoB,CAAC,CAgD/B;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IACnE,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC,CA0CD"}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Evidence Store
3
+ *
4
+ * Storage and retrieval for evidence bundles.
5
+ *
6
+ * @module evidence/store
7
+ */
8
+ import { readFile, writeFile, mkdir, access, readdir, stat } from "fs/promises";
9
+ import { join } from "path";
10
+ import { createHash } from "crypto";
11
+ import { logger } from "../logger.js";
12
+ import { calculateBundleDigest } from "./collector.js";
13
+ const EVIDENCE_DIR = ".vaspera/evidence";
14
+ /**
15
+ * Ensure evidence directory exists
16
+ */
17
+ async function ensureEvidenceDir(projectPath) {
18
+ const evidenceDir = join(projectPath, EVIDENCE_DIR);
19
+ try {
20
+ await access(evidenceDir);
21
+ }
22
+ catch {
23
+ await mkdir(evidenceDir, { recursive: true });
24
+ }
25
+ return evidenceDir;
26
+ }
27
+ /**
28
+ * Store an evidence bundle
29
+ */
30
+ export async function storeEvidenceBundle(projectPath, bundle) {
31
+ const evidenceDir = await ensureEvidenceDir(projectPath);
32
+ const filename = `${bundle.id}.json`;
33
+ const filepath = join(evidenceDir, filename);
34
+ await writeFile(filepath, JSON.stringify(bundle, null, 2), "utf-8");
35
+ logger.info("evidence.store.saved", { bundleId: bundle.id, path: filepath });
36
+ return filepath;
37
+ }
38
+ /**
39
+ * Load an evidence bundle by ID
40
+ */
41
+ export async function loadEvidenceBundle(projectPath, bundleId) {
42
+ const evidenceDir = join(projectPath, EVIDENCE_DIR);
43
+ const filepath = join(evidenceDir, `${bundleId}.json`);
44
+ try {
45
+ await access(filepath);
46
+ const content = await readFile(filepath, "utf-8");
47
+ return JSON.parse(content);
48
+ }
49
+ catch {
50
+ return null;
51
+ }
52
+ }
53
+ /**
54
+ * List all evidence bundles for a project
55
+ */
56
+ export async function listEvidenceBundles(projectPath) {
57
+ const evidenceDir = join(projectPath, EVIDENCE_DIR);
58
+ try {
59
+ await access(evidenceDir);
60
+ }
61
+ catch {
62
+ return [];
63
+ }
64
+ const files = await readdir(evidenceDir);
65
+ const bundles = [];
66
+ for (const file of files) {
67
+ if (!file.endsWith(".json"))
68
+ continue;
69
+ try {
70
+ const content = await readFile(join(evidenceDir, file), "utf-8");
71
+ const bundle = JSON.parse(content);
72
+ bundles.push({
73
+ id: bundle.id,
74
+ createdAt: bundle.createdAt,
75
+ certificationId: bundle.certificationId,
76
+ artifactCount: bundle.artifacts.length,
77
+ });
78
+ }
79
+ catch {
80
+ // Skip invalid files
81
+ }
82
+ }
83
+ // Sort by creation date, newest first
84
+ bundles.sort((a, b) => b.createdAt.localeCompare(a.createdAt));
85
+ return bundles;
86
+ }
87
+ /**
88
+ * Verify an evidence bundle's integrity
89
+ */
90
+ export async function verifyEvidenceBundle(bundle) {
91
+ const result = {
92
+ verified: false,
93
+ bundleId: bundle.id,
94
+ artifactsIntact: true,
95
+ failedArtifacts: [],
96
+ verifiedAt: new Date().toISOString(),
97
+ };
98
+ // Verify bundle digest
99
+ const calculatedDigest = calculateBundleDigest(bundle.artifacts);
100
+ if (calculatedDigest !== bundle.bundleDigest) {
101
+ result.error = `Bundle digest mismatch: expected ${bundle.bundleDigest}, got ${calculatedDigest}`;
102
+ result.artifactsIntact = false;
103
+ return result;
104
+ }
105
+ // Verify each artifact with inline content
106
+ for (const artifact of bundle.artifacts) {
107
+ if (artifact.content) {
108
+ const calculatedHash = createHash("sha256")
109
+ .update(Buffer.from(artifact.content, "utf-8"))
110
+ .digest("hex");
111
+ if (calculatedHash !== artifact.contentDigest) {
112
+ result.artifactsIntact = false;
113
+ result.failedArtifacts.push(artifact.name);
114
+ }
115
+ }
116
+ // Note: For non-inline artifacts, we can't verify without accessing the stored file
117
+ }
118
+ // Verify signature if present
119
+ if (bundle.signature) {
120
+ // Signature verification would call verifyBlob from src/sbom/signing.ts
121
+ // For now, we just check if the signature exists
122
+ result.signatureValid = true;
123
+ }
124
+ result.verified = result.artifactsIntact && result.failedArtifacts.length === 0;
125
+ logger.info("evidence.verify.complete", {
126
+ bundleId: bundle.id,
127
+ verified: result.verified,
128
+ failedCount: result.failedArtifacts.length,
129
+ });
130
+ return result;
131
+ }
132
+ /**
133
+ * Get evidence bundle statistics
134
+ */
135
+ export async function getEvidenceStats(projectPath) {
136
+ const evidenceDir = join(projectPath, EVIDENCE_DIR);
137
+ try {
138
+ await access(evidenceDir);
139
+ }
140
+ catch {
141
+ return { bundleCount: 0, totalSizeBytes: 0 };
142
+ }
143
+ const files = await readdir(evidenceDir);
144
+ const jsonFiles = files.filter((f) => f.endsWith(".json"));
145
+ let totalSize = 0;
146
+ let oldest;
147
+ let newest;
148
+ for (const file of jsonFiles) {
149
+ const filepath = join(evidenceDir, file);
150
+ const stats = await stat(filepath);
151
+ totalSize += stats.size;
152
+ try {
153
+ const content = await readFile(filepath, "utf-8");
154
+ const bundle = JSON.parse(content);
155
+ if (!oldest || bundle.createdAt < oldest) {
156
+ oldest = bundle.createdAt;
157
+ }
158
+ if (!newest || bundle.createdAt > newest) {
159
+ newest = bundle.createdAt;
160
+ }
161
+ }
162
+ catch {
163
+ // Skip invalid files
164
+ }
165
+ }
166
+ return {
167
+ bundleCount: jsonFiles.length,
168
+ totalSizeBytes: totalSize,
169
+ oldestBundle: oldest,
170
+ newestBundle: newest,
171
+ };
172
+ }
173
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/evidence/store.ts"],"names":[],"mappings":"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"}