import type { AuditResult, Finding } from "../types.js"; export declare const EVENT_SCHEMA_VERSION = "1.0.0"; export declare function telemetryEnabled(): boolean; /** * Compact ID: strip dashes from UUID v4 and take first 26 chars. * Fits the schema's event_id / session_id constraint (minLength: 16, maxLength: 32). */ export declare function generateId(): string; interface BaseEvent { schema_version: string; source: "user"; event_id: string; event_type: "audit.started" | "audit.completed" | "finding.discovered"; ts: string; session_id: string; repo_bucket: string; sdk_version: string; } export interface AuditStartedEvent extends BaseEvent { event_type: "audit.started"; rules_version: string; stack: { framework?: string; ds_detected?: string; }; } interface AuditCompletedEvent extends BaseEvent { event_type: "audit.completed"; audit: { duration_ms: number; score: number | null; axes: Record; violations: { error: number; warning: number; info: number; }; }; } interface FindingDiscoveredEvent extends BaseEvent { event_type: "finding.discovered"; finding: { rule_id: string; severity: "error" | "warning" | "info"; /** sha256(filepath + "|" + salt)[:8] — no path leakage */ file_hash: string; }; } export type TelemetryEvent = AuditStartedEvent | AuditCompletedEvent | FindingDiscoveredEvent; export interface LogContext { repoRoot: string; sessionId: string; repoBucket: string; sdkVersion: string; rulesVersion: string; /** Salt used for file_hash. Pass BUCKET_SALT from identity module for consistency. */ salt: string; } export declare function logAuditStarted(ctx: LogContext, stack: AuditStartedEvent["stack"]): void; export declare function logAuditCompleted(ctx: LogContext, durationMs: number, result: AuditResult): void; export declare function logFindingDiscovered(ctx: LogContext, finding: Finding): void; /** Test helper: read all events back from the NDJSON log. */ export declare function readEvents(repoRoot: string): TelemetryEvent[]; export {};