vaspera 2.8.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 (303) hide show
  1. package/CHANGELOG.md +55 -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 +25 -4
  38. package/dist/agents/adversary/config.d.ts.map +1 -1
  39. package/dist/agents/adversary/config.js +38 -8
  40. package/dist/agents/adversary/config.js.map +1 -1
  41. package/dist/agents/adversary/index.d.ts +7 -0
  42. package/dist/agents/adversary/index.d.ts.map +1 -1
  43. package/dist/agents/adversary/index.js +83 -1
  44. package/dist/agents/adversary/index.js.map +1 -1
  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 +66 -10
  86. package/dist/agents/adversary/types.d.ts.map +1 -1
  87. package/dist/agents/zero-day-hunter.d.ts +1 -1
  88. package/dist/agents/zero-day-hunter.d.ts.map +1 -1
  89. package/dist/analysis/data-flow.d.ts +154 -0
  90. package/dist/analysis/data-flow.d.ts.map +1 -0
  91. package/dist/analysis/data-flow.js +393 -0
  92. package/dist/analysis/data-flow.js.map +1 -0
  93. package/dist/analysis/index.d.ts +9 -0
  94. package/dist/analysis/index.d.ts.map +1 -0
  95. package/dist/analysis/index.js +9 -0
  96. package/dist/analysis/index.js.map +1 -0
  97. package/dist/badge-service/index.d.ts +144 -0
  98. package/dist/badge-service/index.d.ts.map +1 -0
  99. package/dist/badge-service/index.js +206 -0
  100. package/dist/badge-service/index.js.map +1 -0
  101. package/dist/certification/types.d.ts +1 -1
  102. package/dist/certification/types.d.ts.map +1 -1
  103. package/dist/certification/types.js.map +1 -1
  104. package/dist/commands/certification/certify.d.ts.map +1 -1
  105. package/dist/commands/certification/certify.js +18 -4
  106. package/dist/commands/certification/certify.js.map +1 -1
  107. package/dist/compliance/attestation.d.ts +39 -0
  108. package/dist/compliance/attestation.d.ts.map +1 -0
  109. package/dist/compliance/attestation.js +364 -0
  110. package/dist/compliance/attestation.js.map +1 -0
  111. package/dist/compliance/cfr42-part2.d.ts +42 -0
  112. package/dist/compliance/cfr42-part2.d.ts.map +1 -0
  113. package/dist/compliance/cfr42-part2.js +408 -0
  114. package/dist/compliance/cfr42-part2.js.map +1 -0
  115. package/dist/compliance/compliance-bundle.d.ts +100 -0
  116. package/dist/compliance/compliance-bundle.d.ts.map +1 -0
  117. package/dist/compliance/compliance-bundle.js +210 -0
  118. package/dist/compliance/compliance-bundle.js.map +1 -0
  119. package/dist/compliance/healthcare-bundle.d.ts +68 -0
  120. package/dist/compliance/healthcare-bundle.d.ts.map +1 -0
  121. package/dist/compliance/healthcare-bundle.js +104 -0
  122. package/dist/compliance/healthcare-bundle.js.map +1 -0
  123. package/dist/compliance/hipaa.d.ts.map +1 -1
  124. package/dist/compliance/hipaa.js +14 -11
  125. package/dist/compliance/hipaa.js.map +1 -1
  126. package/dist/compliance/index.d.ts +10 -2
  127. package/dist/compliance/index.d.ts.map +1 -1
  128. package/dist/compliance/index.js +9 -3
  129. package/dist/compliance/index.js.map +1 -1
  130. package/dist/compliance/mapper.d.ts.map +1 -1
  131. package/dist/compliance/mapper.js +3 -17
  132. package/dist/compliance/mapper.js.map +1 -1
  133. package/dist/compliance/nist-800-53.d.ts +22 -6
  134. package/dist/compliance/nist-800-53.d.ts.map +1 -1
  135. package/dist/compliance/nist-800-53.js +264 -272
  136. package/dist/compliance/nist-800-53.js.map +1 -1
  137. package/dist/compliance/report.d.ts +31 -2
  138. package/dist/compliance/report.d.ts.map +1 -1
  139. package/dist/compliance/report.js +255 -4
  140. package/dist/compliance/report.js.map +1 -1
  141. package/dist/compliance/types.d.ts +1 -1
  142. package/dist/compliance/types.d.ts.map +1 -1
  143. package/dist/config/flags.d.ts +12 -12
  144. package/dist/cost/index.d.ts +1 -1
  145. package/dist/cost/index.d.ts.map +1 -1
  146. package/dist/cost/index.js +1 -1
  147. package/dist/cost/index.js.map +1 -1
  148. package/dist/cost/tracker.d.ts +64 -0
  149. package/dist/cost/tracker.d.ts.map +1 -1
  150. package/dist/cost/tracker.js +165 -0
  151. package/dist/cost/tracker.js.map +1 -1
  152. package/dist/eval/fixtures/healthcare/audit-gaps.d.ts +28 -0
  153. package/dist/eval/fixtures/healthcare/audit-gaps.d.ts.map +1 -0
  154. package/dist/eval/fixtures/healthcare/audit-gaps.js +90 -0
  155. package/dist/eval/fixtures/healthcare/audit-gaps.js.map +1 -0
  156. package/dist/eval/fixtures/healthcare/consent-bypass.d.ts +31 -0
  157. package/dist/eval/fixtures/healthcare/consent-bypass.d.ts.map +1 -0
  158. package/dist/eval/fixtures/healthcare/consent-bypass.js +61 -0
  159. package/dist/eval/fixtures/healthcare/consent-bypass.js.map +1 -0
  160. package/dist/eval/fixtures/healthcare/phi-in-logs.d.ts +24 -0
  161. package/dist/eval/fixtures/healthcare/phi-in-logs.d.ts.map +1 -0
  162. package/dist/eval/fixtures/healthcare/phi-in-logs.js +41 -0
  163. package/dist/eval/fixtures/healthcare/phi-in-logs.js.map +1 -0
  164. package/dist/evidence/collector.d.ts +21 -0
  165. package/dist/evidence/collector.d.ts.map +1 -0
  166. package/dist/evidence/collector.js +340 -0
  167. package/dist/evidence/collector.js.map +1 -0
  168. package/dist/evidence/index.d.ts +11 -0
  169. package/dist/evidence/index.d.ts.map +1 -0
  170. package/dist/evidence/index.js +12 -0
  171. package/dist/evidence/index.js.map +1 -0
  172. package/dist/evidence/store.d.ts +39 -0
  173. package/dist/evidence/store.d.ts.map +1 -0
  174. package/dist/evidence/store.js +173 -0
  175. package/dist/evidence/store.js.map +1 -0
  176. package/dist/evidence/types.d.ts +175 -0
  177. package/dist/evidence/types.d.ts.map +1 -0
  178. package/dist/evidence/types.js +9 -0
  179. package/dist/evidence/types.js.map +1 -0
  180. package/dist/exporters/checkmarx.d.ts +18 -0
  181. package/dist/exporters/checkmarx.d.ts.map +1 -0
  182. package/dist/exporters/checkmarx.js +203 -0
  183. package/dist/exporters/checkmarx.js.map +1 -0
  184. package/dist/exporters/index.d.ts +22 -0
  185. package/dist/exporters/index.d.ts.map +1 -0
  186. package/dist/exporters/index.js +41 -0
  187. package/dist/exporters/index.js.map +1 -0
  188. package/dist/exporters/snyk.d.ts +18 -0
  189. package/dist/exporters/snyk.d.ts.map +1 -0
  190. package/dist/exporters/snyk.js +119 -0
  191. package/dist/exporters/snyk.js.map +1 -0
  192. package/dist/exporters/sonarqube.d.ts +18 -0
  193. package/dist/exporters/sonarqube.d.ts.map +1 -0
  194. package/dist/exporters/sonarqube.js +125 -0
  195. package/dist/exporters/sonarqube.js.map +1 -0
  196. package/dist/exporters/types.d.ts +190 -0
  197. package/dist/exporters/types.d.ts.map +1 -0
  198. package/dist/exporters/types.js +9 -0
  199. package/dist/exporters/types.js.map +1 -0
  200. package/dist/frontier/index.d.ts +12 -0
  201. package/dist/frontier/index.d.ts.map +1 -0
  202. package/dist/frontier/index.js +12 -0
  203. package/dist/frontier/index.js.map +1 -0
  204. package/dist/frontier/orchestrator.d.ts +73 -0
  205. package/dist/frontier/orchestrator.d.ts.map +1 -0
  206. package/dist/frontier/orchestrator.js +312 -0
  207. package/dist/frontier/orchestrator.js.map +1 -0
  208. package/dist/frontier/providers/stub.d.ts +32 -0
  209. package/dist/frontier/providers/stub.d.ts.map +1 -0
  210. package/dist/frontier/providers/stub.js +66 -0
  211. package/dist/frontier/providers/stub.js.map +1 -0
  212. package/dist/frontier/types.d.ts +318 -0
  213. package/dist/frontier/types.d.ts.map +1 -0
  214. package/dist/frontier/types.js +27 -0
  215. package/dist/frontier/types.js.map +1 -0
  216. package/dist/history/index.d.ts +13 -0
  217. package/dist/history/index.d.ts.map +1 -0
  218. package/dist/history/index.js +15 -0
  219. package/dist/history/index.js.map +1 -0
  220. package/dist/history/store.d.ts +74 -0
  221. package/dist/history/store.d.ts.map +1 -0
  222. package/dist/history/store.js +399 -0
  223. package/dist/history/store.js.map +1 -0
  224. package/dist/history/types.d.ts +282 -0
  225. package/dist/history/types.d.ts.map +1 -0
  226. package/dist/history/types.js +41 -0
  227. package/dist/history/types.js.map +1 -0
  228. package/dist/history/verify.d.ts +44 -0
  229. package/dist/history/verify.d.ts.map +1 -0
  230. package/dist/history/verify.js +230 -0
  231. package/dist/history/verify.js.map +1 -0
  232. package/dist/index.d.ts.map +1 -1
  233. package/dist/index.js +431 -18
  234. package/dist/index.js.map +1 -1
  235. package/dist/multimodel/index.d.ts +1 -0
  236. package/dist/multimodel/index.d.ts.map +1 -1
  237. package/dist/multimodel/index.js +2 -0
  238. package/dist/multimodel/index.js.map +1 -1
  239. package/dist/multimodel/leaderboard.d.ts +116 -0
  240. package/dist/multimodel/leaderboard.d.ts.map +1 -0
  241. package/dist/multimodel/leaderboard.js +262 -0
  242. package/dist/multimodel/leaderboard.js.map +1 -0
  243. package/dist/observability/otel.d.ts.map +1 -1
  244. package/dist/observability/otel.js +1 -3
  245. package/dist/observability/otel.js.map +1 -1
  246. package/dist/plugins/loader.js +1 -1
  247. package/dist/plugins/loader.js.map +1 -1
  248. package/dist/scanners/agent/agent-chain-analysis.d.ts +152 -0
  249. package/dist/scanners/agent/agent-chain-analysis.d.ts.map +1 -0
  250. package/dist/scanners/agent/agent-chain-analysis.js +438 -0
  251. package/dist/scanners/agent/agent-chain-analysis.js.map +1 -0
  252. package/dist/scanners/agent/payloads/index.d.ts +2 -1
  253. package/dist/scanners/agent/payloads/index.d.ts.map +1 -1
  254. package/dist/scanners/agent/payloads/index.js +25 -6
  255. package/dist/scanners/agent/payloads/index.js.map +1 -1
  256. package/dist/scanners/agent/prompt-injection-fuzzer.d.ts.map +1 -1
  257. package/dist/scanners/agent/prompt-injection-fuzzer.js +14 -0
  258. package/dist/scanners/agent/prompt-injection-fuzzer.js.map +1 -1
  259. package/dist/scanners/agent/types.d.ts +5 -5
  260. package/dist/scanners/agent/types.d.ts.map +1 -1
  261. package/dist/scanners/agent/types.js.map +1 -1
  262. package/dist/scanners/cache.d.ts +156 -0
  263. package/dist/scanners/cache.d.ts.map +1 -0
  264. package/dist/scanners/cache.js +462 -0
  265. package/dist/scanners/cache.js.map +1 -0
  266. package/dist/scanners/dependencies.js +4 -4
  267. package/dist/scanners/dependencies.js.map +1 -1
  268. package/dist/scanners/gosec.d.ts.map +1 -1
  269. package/dist/scanners/gosec.js +47 -9
  270. package/dist/scanners/gosec.js.map +1 -1
  271. package/dist/scanners/healthcare.d.ts +29 -0
  272. package/dist/scanners/healthcare.d.ts.map +1 -0
  273. package/dist/scanners/healthcare.js +526 -0
  274. package/dist/scanners/healthcare.js.map +1 -0
  275. package/dist/scanners/index.d.ts +1 -0
  276. package/dist/scanners/index.d.ts.map +1 -1
  277. package/dist/scanners/index.js +33 -0
  278. package/dist/scanners/index.js.map +1 -1
  279. package/dist/scanners/index.test.js +6 -6
  280. package/dist/scanners/index.test.js.map +1 -1
  281. package/dist/scanners/secrets.js +4 -4
  282. package/dist/scanners/secrets.js.map +1 -1
  283. package/dist/scanners/semgrep.js +5 -5
  284. package/dist/scanners/semgrep.js.map +1 -1
  285. package/dist/scanners/types.d.ts +1 -1
  286. package/dist/scanners/types.d.ts.map +1 -1
  287. package/dist/scanners/types.js +1 -0
  288. package/dist/scanners/types.js.map +1 -1
  289. package/dist/scanners/typescript.test.js +1 -1
  290. package/dist/scanners/typescript.test.js.map +1 -1
  291. package/dist/telemetry/index.d.ts +10 -0
  292. package/dist/telemetry/index.d.ts.map +1 -0
  293. package/dist/telemetry/index.js +10 -0
  294. package/dist/telemetry/index.js.map +1 -0
  295. package/dist/telemetry/registry.d.ts +178 -0
  296. package/dist/telemetry/registry.d.ts.map +1 -0
  297. package/dist/telemetry/registry.js +297 -0
  298. package/dist/telemetry/registry.js.map +1 -0
  299. package/dist/telemetry/usage.d.ts +197 -0
  300. package/dist/telemetry/usage.d.ts.map +1 -0
  301. package/dist/telemetry/usage.js +244 -0
  302. package/dist/telemetry/usage.js.map +1 -0
  303. package/package.json +1 -1
@@ -0,0 +1,197 @@
1
+ /**
2
+ * Usage Telemetry Module
3
+ *
4
+ * Tracks scan events and usage patterns for analytics and case studies.
5
+ * All telemetry is opt-in and respects user privacy preferences.
6
+ *
7
+ * @module telemetry/usage
8
+ */
9
+ import type { Severity, CertificationLevel } from "../certification/types.js";
10
+ /**
11
+ * Telemetry configuration
12
+ */
13
+ export interface TelemetryConfig {
14
+ /** Whether telemetry is enabled */
15
+ enabled: boolean;
16
+ /** API endpoint for telemetry events */
17
+ endpoint?: string;
18
+ /** Optional API key for authentication */
19
+ apiKey?: string;
20
+ /** Include repository URL (requires explicit opt-in) */
21
+ includeRepoUrl?: boolean;
22
+ /** Include organization name (requires explicit opt-in) */
23
+ includeOrgName?: boolean;
24
+ /** Include user email (requires explicit opt-in) */
25
+ includeUserEmail?: boolean;
26
+ }
27
+ /**
28
+ * Default telemetry configuration
29
+ */
30
+ export declare const DEFAULT_TELEMETRY_CONFIG: TelemetryConfig;
31
+ /**
32
+ * Types of telemetry events
33
+ */
34
+ export type TelemetryEventType = "certification_started" | "certification_completed" | "certification_failed" | "finding_discovered" | "finding_resolved" | "scanner_run" | "badge_generated" | "sbom_generated" | "compliance_report_generated";
35
+ /**
36
+ * Base telemetry event
37
+ */
38
+ export interface BaseTelemetryEvent {
39
+ /** Event type */
40
+ eventType: TelemetryEventType;
41
+ /** ISO timestamp */
42
+ timestamp: string;
43
+ /** SHA256 hash of project path (anonymized) */
44
+ projectHash: string;
45
+ /** Vaspera version */
46
+ vasperaVersion: string;
47
+ /** Platform (darwin, linux, win32) */
48
+ platform: string;
49
+ /** Node.js version */
50
+ nodeVersion: string;
51
+ }
52
+ /**
53
+ * Event when a certification scan starts
54
+ */
55
+ export interface CertificationStartedEvent extends BaseTelemetryEvent {
56
+ eventType: "certification_started";
57
+ /** Scanners being run */
58
+ scanners: string[];
59
+ /** Frameworks being assessed */
60
+ frameworks: string[];
61
+ /** Corpus size setting */
62
+ corpusSize?: string;
63
+ }
64
+ /**
65
+ * Event when a certification scan completes
66
+ */
67
+ export interface CertificationCompletedEvent extends BaseTelemetryEvent {
68
+ eventType: "certification_completed";
69
+ /** Certification ID */
70
+ certificationId: string;
71
+ /** Achieved level */
72
+ level: CertificationLevel;
73
+ /** Overall score (0-100) */
74
+ score: number;
75
+ /** Duration in milliseconds */
76
+ duration: number;
77
+ /** Findings count by severity */
78
+ severityCounts: Record<Severity, number>;
79
+ /** Total findings */
80
+ totalFindings: number;
81
+ /** Frameworks assessed */
82
+ frameworks: string[];
83
+ /** Optional: repository URL if user opted in */
84
+ repoUrl?: string;
85
+ /** Optional: organization name if user opted in */
86
+ orgName?: string;
87
+ /** Optional: user email if user opted in */
88
+ userEmail?: string;
89
+ }
90
+ /**
91
+ * Event when a certification scan fails
92
+ */
93
+ export interface CertificationFailedEvent extends BaseTelemetryEvent {
94
+ eventType: "certification_failed";
95
+ /** Error message (sanitized) */
96
+ errorMessage: string;
97
+ /** Error category */
98
+ errorCategory: "scanner_error" | "config_error" | "timeout" | "unknown";
99
+ /** Duration before failure */
100
+ duration: number;
101
+ }
102
+ /**
103
+ * Event when a finding is discovered
104
+ */
105
+ export interface FindingDiscoveredEvent extends BaseTelemetryEvent {
106
+ eventType: "finding_discovered";
107
+ /** Finding category */
108
+ category: string;
109
+ /** Severity level */
110
+ severity: Severity;
111
+ /** Scanner that found it */
112
+ scanner: string;
113
+ /** Rule/check ID */
114
+ ruleId?: string;
115
+ }
116
+ /**
117
+ * Event when a scanner completes
118
+ */
119
+ export interface ScannerRunEvent extends BaseTelemetryEvent {
120
+ eventType: "scanner_run";
121
+ /** Scanner name */
122
+ scanner: string;
123
+ /** Duration in milliseconds */
124
+ duration: number;
125
+ /** Number of findings */
126
+ findingsCount: number;
127
+ /** Whether it succeeded */
128
+ success: boolean;
129
+ }
130
+ /**
131
+ * Union of all telemetry events
132
+ */
133
+ export type TelemetryEvent = CertificationStartedEvent | CertificationCompletedEvent | CertificationFailedEvent | FindingDiscoveredEvent | ScannerRunEvent;
134
+ /**
135
+ * Initialize telemetry with configuration
136
+ */
137
+ export declare function initTelemetry(config: Partial<TelemetryConfig>): void;
138
+ /**
139
+ * Check if telemetry is enabled
140
+ */
141
+ export declare function isTelemetryEnabled(): boolean;
142
+ /**
143
+ * Hash a value for anonymization
144
+ */
145
+ export declare function hashValue(value: string): string;
146
+ /**
147
+ * Track a telemetry event
148
+ */
149
+ export declare function trackEvent(event: Omit<TelemetryEvent, keyof BaseTelemetryEvent> & {
150
+ eventType: TelemetryEventType;
151
+ projectPath: string;
152
+ }): Promise<void>;
153
+ /**
154
+ * Flush buffered events to the telemetry endpoint
155
+ */
156
+ export declare function flushEvents(): Promise<void>;
157
+ /**
158
+ * Shutdown telemetry (flush remaining events)
159
+ */
160
+ export declare function shutdownTelemetry(): Promise<void>;
161
+ /**
162
+ * Track certification start
163
+ */
164
+ export declare function trackCertificationStarted(projectPath: string, scanners: string[], frameworks: string[], corpusSize?: string): Promise<void>;
165
+ /**
166
+ * Track certification completion
167
+ */
168
+ export declare function trackCertificationCompleted(projectPath: string, certificationId: string, level: CertificationLevel, score: number, duration: number, severityCounts: Record<Severity, number>, totalFindings: number, frameworks: string[], optionalInfo?: {
169
+ repoUrl?: string;
170
+ orgName?: string;
171
+ userEmail?: string;
172
+ }): Promise<void>;
173
+ /**
174
+ * Track certification failure
175
+ */
176
+ export declare function trackCertificationFailed(projectPath: string, errorMessage: string, errorCategory: CertificationFailedEvent["errorCategory"], duration: number): Promise<void>;
177
+ /**
178
+ * Track a finding discovery
179
+ */
180
+ export declare function trackFindingDiscovered(projectPath: string, category: string, severity: Severity, scanner: string, ruleId?: string): Promise<void>;
181
+ /**
182
+ * Track a scanner run
183
+ */
184
+ export declare function trackScannerRun(projectPath: string, scanner: string, duration: number, findingsCount: number, success: boolean): Promise<void>;
185
+ export declare const telemetry: {
186
+ init: typeof initTelemetry;
187
+ isEnabled: typeof isTelemetryEnabled;
188
+ track: typeof trackEvent;
189
+ flush: typeof flushEvents;
190
+ shutdown: typeof shutdownTelemetry;
191
+ trackCertificationStarted: typeof trackCertificationStarted;
192
+ trackCertificationCompleted: typeof trackCertificationCompleted;
193
+ trackCertificationFailed: typeof trackCertificationFailed;
194
+ trackFindingDiscovered: typeof trackFindingDiscovered;
195
+ trackScannerRun: typeof trackScannerRun;
196
+ };
197
+ //# sourceMappingURL=usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/telemetry/usage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,244 @@
1
+ /**
2
+ * Usage Telemetry Module
3
+ *
4
+ * Tracks scan events and usage patterns for analytics and case studies.
5
+ * All telemetry is opt-in and respects user privacy preferences.
6
+ *
7
+ * @module telemetry/usage
8
+ */
9
+ import { createHash } from "crypto";
10
+ import { logger } from "../logger.js";
11
+ /**
12
+ * Default telemetry configuration
13
+ */
14
+ export const DEFAULT_TELEMETRY_CONFIG = {
15
+ enabled: false,
16
+ endpoint: "https://api.vaspera.dev/telemetry",
17
+ includeRepoUrl: false,
18
+ includeOrgName: false,
19
+ includeUserEmail: false,
20
+ };
21
+ // ============================================================================
22
+ // Telemetry Client
23
+ // ============================================================================
24
+ /**
25
+ * In-memory buffer for batching events
26
+ */
27
+ const eventBuffer = [];
28
+ const MAX_BUFFER_SIZE = 100;
29
+ const FLUSH_INTERVAL_MS = 30000;
30
+ let flushTimer = null;
31
+ let currentConfig = { ...DEFAULT_TELEMETRY_CONFIG };
32
+ /**
33
+ * Initialize telemetry with configuration
34
+ */
35
+ export function initTelemetry(config) {
36
+ currentConfig = { ...DEFAULT_TELEMETRY_CONFIG, ...config };
37
+ if (currentConfig.enabled && !flushTimer) {
38
+ flushTimer = setInterval(flushEvents, FLUSH_INTERVAL_MS);
39
+ }
40
+ logger.debug("telemetry.initialized", {
41
+ enabled: currentConfig.enabled,
42
+ endpoint: currentConfig.endpoint,
43
+ });
44
+ }
45
+ /**
46
+ * Check if telemetry is enabled
47
+ */
48
+ export function isTelemetryEnabled() {
49
+ return currentConfig.enabled;
50
+ }
51
+ /**
52
+ * Hash a value for anonymization
53
+ */
54
+ export function hashValue(value) {
55
+ return createHash("sha256").update(value).digest("hex").slice(0, 16);
56
+ }
57
+ /**
58
+ * Create base event fields
59
+ */
60
+ function createBaseEvent(eventType, projectPath) {
61
+ return {
62
+ eventType,
63
+ timestamp: new Date().toISOString(),
64
+ projectHash: hashValue(projectPath),
65
+ vasperaVersion: process.env.npm_package_version || "unknown",
66
+ platform: process.platform,
67
+ nodeVersion: process.version,
68
+ };
69
+ }
70
+ /**
71
+ * Track a telemetry event
72
+ */
73
+ export async function trackEvent(event) {
74
+ if (!currentConfig.enabled) {
75
+ return;
76
+ }
77
+ const { projectPath, ...rest } = event;
78
+ const baseEvent = createBaseEvent(rest.eventType, projectPath);
79
+ const fullEvent = { ...baseEvent, ...rest };
80
+ // Strip fields that weren't opted into
81
+ if (!currentConfig.includeRepoUrl && "repoUrl" in fullEvent) {
82
+ delete fullEvent.repoUrl;
83
+ }
84
+ if (!currentConfig.includeOrgName && "orgName" in fullEvent) {
85
+ delete fullEvent.orgName;
86
+ }
87
+ if (!currentConfig.includeUserEmail && "userEmail" in fullEvent) {
88
+ delete fullEvent.userEmail;
89
+ }
90
+ eventBuffer.push(fullEvent);
91
+ logger.debug("telemetry.event_tracked", {
92
+ eventType: event.eventType,
93
+ bufferSize: eventBuffer.length,
94
+ });
95
+ // Flush if buffer is full
96
+ if (eventBuffer.length >= MAX_BUFFER_SIZE) {
97
+ await flushEvents();
98
+ }
99
+ }
100
+ /**
101
+ * Flush buffered events to the telemetry endpoint
102
+ */
103
+ export async function flushEvents() {
104
+ if (!currentConfig.enabled || eventBuffer.length === 0) {
105
+ return;
106
+ }
107
+ const events = [...eventBuffer];
108
+ eventBuffer.length = 0;
109
+ try {
110
+ const endpoint = currentConfig.endpoint || DEFAULT_TELEMETRY_CONFIG.endpoint;
111
+ const response = await fetch(endpoint, {
112
+ method: "POST",
113
+ headers: {
114
+ "Content-Type": "application/json",
115
+ ...(currentConfig.apiKey && {
116
+ Authorization: `Bearer ${currentConfig.apiKey}`,
117
+ }),
118
+ },
119
+ body: JSON.stringify({ events }),
120
+ });
121
+ if (!response.ok) {
122
+ logger.warn("telemetry.flush_failed", {
123
+ status: response.status,
124
+ eventCount: events.length,
125
+ });
126
+ // Re-add events to buffer on failure (with limit)
127
+ eventBuffer.push(...events.slice(0, MAX_BUFFER_SIZE - eventBuffer.length));
128
+ }
129
+ else {
130
+ logger.debug("telemetry.flush_success", { eventCount: events.length });
131
+ }
132
+ }
133
+ catch (error) {
134
+ logger.warn("telemetry.flush_error", {
135
+ error: error instanceof Error ? error.message : String(error),
136
+ eventCount: events.length,
137
+ });
138
+ // Re-add events to buffer on error (with limit)
139
+ eventBuffer.push(...events.slice(0, MAX_BUFFER_SIZE - eventBuffer.length));
140
+ }
141
+ }
142
+ /**
143
+ * Shutdown telemetry (flush remaining events)
144
+ */
145
+ export async function shutdownTelemetry() {
146
+ if (flushTimer) {
147
+ clearInterval(flushTimer);
148
+ flushTimer = null;
149
+ }
150
+ await flushEvents();
151
+ logger.debug("telemetry.shutdown");
152
+ }
153
+ // ============================================================================
154
+ // Convenience Functions
155
+ // ============================================================================
156
+ /**
157
+ * Track certification start
158
+ */
159
+ export async function trackCertificationStarted(projectPath, scanners, frameworks, corpusSize) {
160
+ await trackEvent({
161
+ eventType: "certification_started",
162
+ projectPath,
163
+ scanners,
164
+ frameworks,
165
+ corpusSize,
166
+ });
167
+ }
168
+ /**
169
+ * Track certification completion
170
+ */
171
+ export async function trackCertificationCompleted(projectPath, certificationId, level, score, duration, severityCounts, totalFindings, frameworks, optionalInfo) {
172
+ await trackEvent({
173
+ eventType: "certification_completed",
174
+ projectPath,
175
+ certificationId,
176
+ level,
177
+ score,
178
+ duration,
179
+ severityCounts,
180
+ totalFindings,
181
+ frameworks,
182
+ ...optionalInfo,
183
+ });
184
+ }
185
+ /**
186
+ * Track certification failure
187
+ */
188
+ export async function trackCertificationFailed(projectPath, errorMessage, errorCategory, duration) {
189
+ // Sanitize error message to avoid leaking sensitive data
190
+ const sanitizedError = errorMessage
191
+ .replace(/\/[^\s]+/g, "[PATH]")
192
+ .replace(/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g, "[EMAIL]")
193
+ .replace(/\b[A-Za-z0-9]{32,}\b/g, "[TOKEN]")
194
+ .slice(0, 200);
195
+ await trackEvent({
196
+ eventType: "certification_failed",
197
+ projectPath,
198
+ errorMessage: sanitizedError,
199
+ errorCategory,
200
+ duration,
201
+ });
202
+ }
203
+ /**
204
+ * Track a finding discovery
205
+ */
206
+ export async function trackFindingDiscovered(projectPath, category, severity, scanner, ruleId) {
207
+ await trackEvent({
208
+ eventType: "finding_discovered",
209
+ projectPath,
210
+ category,
211
+ severity,
212
+ scanner,
213
+ ruleId,
214
+ });
215
+ }
216
+ /**
217
+ * Track a scanner run
218
+ */
219
+ export async function trackScannerRun(projectPath, scanner, duration, findingsCount, success) {
220
+ await trackEvent({
221
+ eventType: "scanner_run",
222
+ projectPath,
223
+ scanner,
224
+ duration,
225
+ findingsCount,
226
+ success,
227
+ });
228
+ }
229
+ // ============================================================================
230
+ // Exports
231
+ // ============================================================================
232
+ export const telemetry = {
233
+ init: initTelemetry,
234
+ isEnabled: isTelemetryEnabled,
235
+ track: trackEvent,
236
+ flush: flushEvents,
237
+ shutdown: shutdownTelemetry,
238
+ trackCertificationStarted,
239
+ trackCertificationCompleted,
240
+ trackCertificationFailed,
241
+ trackFindingDiscovered,
242
+ trackScannerRun,
243
+ };
244
+ //# sourceMappingURL=usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/telemetry/usage.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vaspera",
3
- "version": "2.8.0",
3
+ "version": "2.9.0",
4
4
  "packageManager": "npm@10.2.4",
5
5
  "workspaces": [
6
6
  "apps/*",