/** * Forgen — Observability Store (Phase 1) * * solution_events 테이블에 matched/surfaced/acted_on 이벤트를 기록. * Fail-open: 모든 함수는 내부 오류를 삼키고 절대 throw 하지 않는다. */ export type EventType = 'matched' | 'surfaced' | 'acted_on'; export interface EmitOptions { ts?: number; sessionId?: string | null; solutionId: string; eventType: EventType; signalSource: string; signalScore?: number | null; meta?: Record; } export interface SurfacedEvent { id: number; ts: number; sessionId: string | null; solutionId: string; signalSource: string; signalScore: number | null; meta: Record | null; } export interface HitRateRow { solutionId: string; matched_30d: number; surfaced_30d: number; acted_30d: number; matched_90d: number; surfaced_90d: number; acted_90d: number; matched_180d: number; surfaced_180d: number; acted_180d: number; last_event_ts: number; } interface SqliteDb { exec(sql: string): void; prepare(sql: string): { run(...args: unknown[]): { lastInsertRowid: number; }; get(...args: unknown[]): unknown; all(...args: unknown[]): unknown[]; }; close(): void; } /** solution_events 스키마 및 schema_version 초기화. idempotent. */ export declare function ensureObservabilitySchema(db: SqliteDb): void; /** solution_events 에 이벤트를 기록한다. fail-open (throw 없음). */ export declare function emitSolutionEvent(opts: EmitOptions): void; /** 특정 세션에서 지정 시간 window 내 surfaced 이벤트 조회. */ export declare function querySurfacedWithin(sessionId: string, minutesWindow: number): SurfacedEvent[]; /** 30/90/180일 hit-rate 집계. solutionId 지정 시 단일 솔루션만. */ export declare function queryHitRate(solutionId?: string): HitRateRow[]; export {};