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.
- package/CHANGELOG.md +55 -0
- package/README.md +111 -7
- package/dist/__tests__/agents/adversary/tactics/api.test.d.ts +5 -0
- package/dist/__tests__/agents/adversary/tactics/api.test.d.ts.map +1 -0
- package/dist/__tests__/agents/adversary/tactics/api.test.js +369 -0
- package/dist/__tests__/agents/adversary/tactics/api.test.js.map +1 -0
- package/dist/__tests__/agents/adversary/tactics/llm.test.d.ts +5 -0
- package/dist/__tests__/agents/adversary/tactics/llm.test.d.ts.map +1 -0
- package/dist/__tests__/agents/adversary/tactics/llm.test.js +409 -0
- package/dist/__tests__/agents/adversary/tactics/llm.test.js.map +1 -0
- package/dist/__tests__/agents/adversary/tactics/registry.test.d.ts +7 -0
- package/dist/__tests__/agents/adversary/tactics/registry.test.d.ts.map +1 -0
- package/dist/__tests__/agents/adversary/tactics/registry.test.js +74 -0
- package/dist/__tests__/agents/adversary/tactics/registry.test.js.map +1 -0
- package/dist/__tests__/agents/adversary/tactics/web-app.test.d.ts +7 -0
- package/dist/__tests__/agents/adversary/tactics/web-app.test.d.ts.map +1 -0
- package/dist/__tests__/agents/adversary/tactics/web-app.test.js +374 -0
- package/dist/__tests__/agents/adversary/tactics/web-app.test.js.map +1 -0
- package/dist/__tests__/compliance-bundle.test.d.ts +9 -0
- package/dist/__tests__/compliance-bundle.test.d.ts.map +1 -0
- package/dist/__tests__/compliance-bundle.test.js +344 -0
- package/dist/__tests__/compliance-bundle.test.js.map +1 -0
- package/dist/__tests__/healthcare-compliance.test.d.ts +9 -0
- package/dist/__tests__/healthcare-compliance.test.d.ts.map +1 -0
- package/dist/__tests__/healthcare-compliance.test.js +233 -0
- package/dist/__tests__/healthcare-compliance.test.js.map +1 -0
- package/dist/action/diff-mode.d.ts +124 -8
- package/dist/action/diff-mode.d.ts.map +1 -1
- package/dist/action/diff-mode.js +384 -65
- package/dist/action/diff-mode.js.map +1 -1
- package/dist/action/diff-mode.test.js +3 -3
- package/dist/action/diff-mode.test.js.map +1 -1
- package/dist/action/pr-comment.test.js +1 -0
- package/dist/action/pr-comment.test.js.map +1 -1
- package/dist/action/sarif-upload.test.js +1 -0
- package/dist/action/sarif-upload.test.js.map +1 -1
- package/dist/agents/adversary/config.d.ts +25 -4
- package/dist/agents/adversary/config.d.ts.map +1 -1
- package/dist/agents/adversary/config.js +38 -8
- package/dist/agents/adversary/config.js.map +1 -1
- package/dist/agents/adversary/index.d.ts +7 -0
- package/dist/agents/adversary/index.d.ts.map +1 -1
- package/dist/agents/adversary/index.js +83 -1
- package/dist/agents/adversary/index.js.map +1 -1
- package/dist/agents/adversary/reporting/compliance-mapper.d.ts +108 -0
- package/dist/agents/adversary/reporting/compliance-mapper.d.ts.map +1 -0
- package/dist/agents/adversary/reporting/compliance-mapper.js +391 -0
- package/dist/agents/adversary/reporting/compliance-mapper.js.map +1 -0
- package/dist/agents/adversary/reporting/index.d.ts +10 -0
- package/dist/agents/adversary/reporting/index.d.ts.map +1 -0
- package/dist/agents/adversary/reporting/index.js +10 -0
- package/dist/agents/adversary/reporting/index.js.map +1 -0
- package/dist/agents/adversary/reporting/poc-generator.d.ts +44 -0
- package/dist/agents/adversary/reporting/poc-generator.d.ts.map +1 -0
- package/dist/agents/adversary/reporting/poc-generator.js +308 -0
- package/dist/agents/adversary/reporting/poc-generator.js.map +1 -0
- package/dist/agents/adversary/tactics/api.d.ts +13 -0
- package/dist/agents/adversary/tactics/api.d.ts.map +1 -0
- package/dist/agents/adversary/tactics/api.js +815 -0
- package/dist/agents/adversary/tactics/api.js.map +1 -0
- package/dist/agents/adversary/tactics/auth.d.ts +13 -0
- package/dist/agents/adversary/tactics/auth.d.ts.map +1 -0
- package/dist/agents/adversary/tactics/auth.js +676 -0
- package/dist/agents/adversary/tactics/auth.js.map +1 -0
- package/dist/agents/adversary/tactics/index.d.ts +129 -0
- package/dist/agents/adversary/tactics/index.d.ts.map +1 -0
- package/dist/agents/adversary/tactics/index.js +199 -0
- package/dist/agents/adversary/tactics/index.js.map +1 -0
- package/dist/agents/adversary/tactics/infra.d.ts +13 -0
- package/dist/agents/adversary/tactics/infra.d.ts.map +1 -0
- package/dist/agents/adversary/tactics/infra.js +827 -0
- package/dist/agents/adversary/tactics/infra.js.map +1 -0
- package/dist/agents/adversary/tactics/injection.d.ts +12 -0
- package/dist/agents/adversary/tactics/injection.d.ts.map +1 -0
- package/dist/agents/adversary/tactics/injection.js +549 -0
- package/dist/agents/adversary/tactics/injection.js.map +1 -0
- package/dist/agents/adversary/tactics/llm.d.ts +13 -0
- package/dist/agents/adversary/tactics/llm.d.ts.map +1 -0
- package/dist/agents/adversary/tactics/llm.js +767 -0
- package/dist/agents/adversary/tactics/llm.js.map +1 -0
- package/dist/agents/adversary/tactics/web-app.d.ts +13 -0
- package/dist/agents/adversary/tactics/web-app.d.ts.map +1 -0
- package/dist/agents/adversary/tactics/web-app.js +717 -0
- package/dist/agents/adversary/tactics/web-app.js.map +1 -0
- package/dist/agents/adversary/types.d.ts +66 -10
- package/dist/agents/adversary/types.d.ts.map +1 -1
- package/dist/agents/zero-day-hunter.d.ts +1 -1
- package/dist/agents/zero-day-hunter.d.ts.map +1 -1
- package/dist/analysis/data-flow.d.ts +154 -0
- package/dist/analysis/data-flow.d.ts.map +1 -0
- package/dist/analysis/data-flow.js +393 -0
- package/dist/analysis/data-flow.js.map +1 -0
- package/dist/analysis/index.d.ts +9 -0
- package/dist/analysis/index.d.ts.map +1 -0
- package/dist/analysis/index.js +9 -0
- package/dist/analysis/index.js.map +1 -0
- package/dist/badge-service/index.d.ts +144 -0
- package/dist/badge-service/index.d.ts.map +1 -0
- package/dist/badge-service/index.js +206 -0
- package/dist/badge-service/index.js.map +1 -0
- package/dist/certification/types.d.ts +1 -1
- package/dist/certification/types.d.ts.map +1 -1
- package/dist/certification/types.js.map +1 -1
- package/dist/commands/certification/certify.d.ts.map +1 -1
- package/dist/commands/certification/certify.js +18 -4
- package/dist/commands/certification/certify.js.map +1 -1
- package/dist/compliance/attestation.d.ts +39 -0
- package/dist/compliance/attestation.d.ts.map +1 -0
- package/dist/compliance/attestation.js +364 -0
- package/dist/compliance/attestation.js.map +1 -0
- package/dist/compliance/cfr42-part2.d.ts +42 -0
- package/dist/compliance/cfr42-part2.d.ts.map +1 -0
- package/dist/compliance/cfr42-part2.js +408 -0
- package/dist/compliance/cfr42-part2.js.map +1 -0
- package/dist/compliance/compliance-bundle.d.ts +100 -0
- package/dist/compliance/compliance-bundle.d.ts.map +1 -0
- package/dist/compliance/compliance-bundle.js +210 -0
- package/dist/compliance/compliance-bundle.js.map +1 -0
- package/dist/compliance/healthcare-bundle.d.ts +68 -0
- package/dist/compliance/healthcare-bundle.d.ts.map +1 -0
- package/dist/compliance/healthcare-bundle.js +104 -0
- package/dist/compliance/healthcare-bundle.js.map +1 -0
- package/dist/compliance/hipaa.d.ts.map +1 -1
- package/dist/compliance/hipaa.js +14 -11
- package/dist/compliance/hipaa.js.map +1 -1
- package/dist/compliance/index.d.ts +10 -2
- package/dist/compliance/index.d.ts.map +1 -1
- package/dist/compliance/index.js +9 -3
- package/dist/compliance/index.js.map +1 -1
- package/dist/compliance/mapper.d.ts.map +1 -1
- package/dist/compliance/mapper.js +3 -17
- package/dist/compliance/mapper.js.map +1 -1
- package/dist/compliance/nist-800-53.d.ts +22 -6
- package/dist/compliance/nist-800-53.d.ts.map +1 -1
- package/dist/compliance/nist-800-53.js +264 -272
- package/dist/compliance/nist-800-53.js.map +1 -1
- package/dist/compliance/report.d.ts +31 -2
- package/dist/compliance/report.d.ts.map +1 -1
- package/dist/compliance/report.js +255 -4
- package/dist/compliance/report.js.map +1 -1
- package/dist/compliance/types.d.ts +1 -1
- package/dist/compliance/types.d.ts.map +1 -1
- package/dist/config/flags.d.ts +12 -12
- package/dist/cost/index.d.ts +1 -1
- package/dist/cost/index.d.ts.map +1 -1
- package/dist/cost/index.js +1 -1
- package/dist/cost/index.js.map +1 -1
- package/dist/cost/tracker.d.ts +64 -0
- package/dist/cost/tracker.d.ts.map +1 -1
- package/dist/cost/tracker.js +165 -0
- package/dist/cost/tracker.js.map +1 -1
- package/dist/eval/fixtures/healthcare/audit-gaps.d.ts +28 -0
- package/dist/eval/fixtures/healthcare/audit-gaps.d.ts.map +1 -0
- package/dist/eval/fixtures/healthcare/audit-gaps.js +90 -0
- package/dist/eval/fixtures/healthcare/audit-gaps.js.map +1 -0
- package/dist/eval/fixtures/healthcare/consent-bypass.d.ts +31 -0
- package/dist/eval/fixtures/healthcare/consent-bypass.d.ts.map +1 -0
- package/dist/eval/fixtures/healthcare/consent-bypass.js +61 -0
- package/dist/eval/fixtures/healthcare/consent-bypass.js.map +1 -0
- package/dist/eval/fixtures/healthcare/phi-in-logs.d.ts +24 -0
- package/dist/eval/fixtures/healthcare/phi-in-logs.d.ts.map +1 -0
- package/dist/eval/fixtures/healthcare/phi-in-logs.js +41 -0
- package/dist/eval/fixtures/healthcare/phi-in-logs.js.map +1 -0
- package/dist/evidence/collector.d.ts +21 -0
- package/dist/evidence/collector.d.ts.map +1 -0
- package/dist/evidence/collector.js +340 -0
- package/dist/evidence/collector.js.map +1 -0
- package/dist/evidence/index.d.ts +11 -0
- package/dist/evidence/index.d.ts.map +1 -0
- package/dist/evidence/index.js +12 -0
- package/dist/evidence/index.js.map +1 -0
- package/dist/evidence/store.d.ts +39 -0
- package/dist/evidence/store.d.ts.map +1 -0
- package/dist/evidence/store.js +173 -0
- package/dist/evidence/store.js.map +1 -0
- package/dist/evidence/types.d.ts +175 -0
- package/dist/evidence/types.d.ts.map +1 -0
- package/dist/evidence/types.js +9 -0
- package/dist/evidence/types.js.map +1 -0
- package/dist/exporters/checkmarx.d.ts +18 -0
- package/dist/exporters/checkmarx.d.ts.map +1 -0
- package/dist/exporters/checkmarx.js +203 -0
- package/dist/exporters/checkmarx.js.map +1 -0
- package/dist/exporters/index.d.ts +22 -0
- package/dist/exporters/index.d.ts.map +1 -0
- package/dist/exporters/index.js +41 -0
- package/dist/exporters/index.js.map +1 -0
- package/dist/exporters/snyk.d.ts +18 -0
- package/dist/exporters/snyk.d.ts.map +1 -0
- package/dist/exporters/snyk.js +119 -0
- package/dist/exporters/snyk.js.map +1 -0
- package/dist/exporters/sonarqube.d.ts +18 -0
- package/dist/exporters/sonarqube.d.ts.map +1 -0
- package/dist/exporters/sonarqube.js +125 -0
- package/dist/exporters/sonarqube.js.map +1 -0
- package/dist/exporters/types.d.ts +190 -0
- package/dist/exporters/types.d.ts.map +1 -0
- package/dist/exporters/types.js +9 -0
- package/dist/exporters/types.js.map +1 -0
- package/dist/frontier/index.d.ts +12 -0
- package/dist/frontier/index.d.ts.map +1 -0
- package/dist/frontier/index.js +12 -0
- package/dist/frontier/index.js.map +1 -0
- package/dist/frontier/orchestrator.d.ts +73 -0
- package/dist/frontier/orchestrator.d.ts.map +1 -0
- package/dist/frontier/orchestrator.js +312 -0
- package/dist/frontier/orchestrator.js.map +1 -0
- package/dist/frontier/providers/stub.d.ts +32 -0
- package/dist/frontier/providers/stub.d.ts.map +1 -0
- package/dist/frontier/providers/stub.js +66 -0
- package/dist/frontier/providers/stub.js.map +1 -0
- package/dist/frontier/types.d.ts +318 -0
- package/dist/frontier/types.d.ts.map +1 -0
- package/dist/frontier/types.js +27 -0
- package/dist/frontier/types.js.map +1 -0
- package/dist/history/index.d.ts +13 -0
- package/dist/history/index.d.ts.map +1 -0
- package/dist/history/index.js +15 -0
- package/dist/history/index.js.map +1 -0
- package/dist/history/store.d.ts +74 -0
- package/dist/history/store.d.ts.map +1 -0
- package/dist/history/store.js +399 -0
- package/dist/history/store.js.map +1 -0
- package/dist/history/types.d.ts +282 -0
- package/dist/history/types.d.ts.map +1 -0
- package/dist/history/types.js +41 -0
- package/dist/history/types.js.map +1 -0
- package/dist/history/verify.d.ts +44 -0
- package/dist/history/verify.d.ts.map +1 -0
- package/dist/history/verify.js +230 -0
- package/dist/history/verify.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +431 -18
- package/dist/index.js.map +1 -1
- package/dist/multimodel/index.d.ts +1 -0
- package/dist/multimodel/index.d.ts.map +1 -1
- package/dist/multimodel/index.js +2 -0
- package/dist/multimodel/index.js.map +1 -1
- package/dist/multimodel/leaderboard.d.ts +116 -0
- package/dist/multimodel/leaderboard.d.ts.map +1 -0
- package/dist/multimodel/leaderboard.js +262 -0
- package/dist/multimodel/leaderboard.js.map +1 -0
- package/dist/observability/otel.d.ts.map +1 -1
- package/dist/observability/otel.js +1 -3
- package/dist/observability/otel.js.map +1 -1
- package/dist/plugins/loader.js +1 -1
- package/dist/plugins/loader.js.map +1 -1
- package/dist/scanners/agent/agent-chain-analysis.d.ts +152 -0
- package/dist/scanners/agent/agent-chain-analysis.d.ts.map +1 -0
- package/dist/scanners/agent/agent-chain-analysis.js +438 -0
- package/dist/scanners/agent/agent-chain-analysis.js.map +1 -0
- package/dist/scanners/agent/payloads/index.d.ts +2 -1
- package/dist/scanners/agent/payloads/index.d.ts.map +1 -1
- package/dist/scanners/agent/payloads/index.js +25 -6
- package/dist/scanners/agent/payloads/index.js.map +1 -1
- package/dist/scanners/agent/prompt-injection-fuzzer.d.ts.map +1 -1
- package/dist/scanners/agent/prompt-injection-fuzzer.js +14 -0
- package/dist/scanners/agent/prompt-injection-fuzzer.js.map +1 -1
- package/dist/scanners/agent/types.d.ts +5 -5
- package/dist/scanners/agent/types.d.ts.map +1 -1
- package/dist/scanners/agent/types.js.map +1 -1
- package/dist/scanners/cache.d.ts +156 -0
- package/dist/scanners/cache.d.ts.map +1 -0
- package/dist/scanners/cache.js +462 -0
- package/dist/scanners/cache.js.map +1 -0
- package/dist/scanners/dependencies.js +4 -4
- package/dist/scanners/dependencies.js.map +1 -1
- package/dist/scanners/gosec.d.ts.map +1 -1
- package/dist/scanners/gosec.js +47 -9
- package/dist/scanners/gosec.js.map +1 -1
- package/dist/scanners/healthcare.d.ts +29 -0
- package/dist/scanners/healthcare.d.ts.map +1 -0
- package/dist/scanners/healthcare.js +526 -0
- package/dist/scanners/healthcare.js.map +1 -0
- package/dist/scanners/index.d.ts +1 -0
- package/dist/scanners/index.d.ts.map +1 -1
- package/dist/scanners/index.js +33 -0
- package/dist/scanners/index.js.map +1 -1
- package/dist/scanners/index.test.js +6 -6
- package/dist/scanners/index.test.js.map +1 -1
- package/dist/scanners/secrets.js +4 -4
- package/dist/scanners/secrets.js.map +1 -1
- package/dist/scanners/semgrep.js +5 -5
- package/dist/scanners/semgrep.js.map +1 -1
- package/dist/scanners/types.d.ts +1 -1
- package/dist/scanners/types.d.ts.map +1 -1
- package/dist/scanners/types.js +1 -0
- package/dist/scanners/types.js.map +1 -1
- package/dist/scanners/typescript.test.js +1 -1
- package/dist/scanners/typescript.test.js.map +1 -1
- package/dist/telemetry/index.d.ts +10 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +10 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/registry.d.ts +178 -0
- package/dist/telemetry/registry.d.ts.map +1 -0
- package/dist/telemetry/registry.js +297 -0
- package/dist/telemetry/registry.js.map +1 -0
- package/dist/telemetry/usage.d.ts +197 -0
- package/dist/telemetry/usage.d.ts.map +1 -0
- package/dist/telemetry/usage.js +244 -0
- package/dist/telemetry/usage.js.map +1 -0
- 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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"}
|