/** * db.ts — Capa de acceso a SQLite (node:sqlite) * * Por qué node:sqlite sobre better-sqlite3: * - Integrado en Node 22+, sin compilación nativa * - Cross-platform sin configuración extra * - API síncrona igual de rápida para uso local * * El warning "ExperimentalWarning" se suprime en index.ts. */ export declare const CLAUDESTAT_DIR: string; export declare const TOOL_RESPONSE_MAX_BYTES = 8192; export declare function capToolResponse(raw: string): string; export interface SessionRow { id: string; cwd?: string; project_path?: string; started_at: number; last_event_at?: number; total_cost_usd?: number; total_input_tokens?: number; total_output_tokens?: number; total_cache_read?: number; total_cache_creation?: number; efficiency_score?: number; loops_detected?: number; ai_summary?: string; dominant_model?: string; parent_session_id?: string; source?: string; exact_retries?: number; error_rate?: number; file_churn_score?: number; seq_cycle_count?: number; avg_output_chars?: number; error_block_count?: number; semantic_loop_count?: number; context_used?: number; context_window?: number; } export interface AssistantTurnRow { turn_index: number; ts?: number; text_preview?: string; tool_calls?: string[]; error_count: number; output_chars: number; context_used: number; model?: string; effort?: string; stop_reason?: string; stop_sequence?: string; } export interface EventRow { id?: number; session_id: string; type: string; tool_name?: string; tool_input?: string; tool_response?: string; ts: number; cwd?: string; duration_ms?: number; skill_parent?: string; source?: string; } export interface BlockCostEntry { inputUsd: number; outputUsd: number; totalUsd: number; inputTokens: number; outputTokens: number; cacheRead?: number; cacheCreate?: number; context_used?: number; context_window?: number; } export interface CostUpdate { input_tokens: number; output_tokens: number; cache_read: number; cache_creation: number; cost_usd: number; context_used: number; context_window: number; lastEntry?: BlockCostEntry; lastModel?: string; firstTs?: number; lastTs?: number; } export interface BillingBlock { block_start: number; block_end: number; sessions: number; total_cost_usd: number; total_tokens: number; is_current: boolean; } export interface DailyActivity { date: string; cost_usd: number; total_tokens: number; tool_calls: number; } export interface DailySummary { today_cost: number; today_sessions: number; today_tokens: number; today_top_tool: string; today_top_tool_pct: number; vs_yesterday_cost_pct: number | null; vs_yesterday_sessions_delta: number | null; vs_7d_avg_cost_pct: number | null; weekly_pace_cost: number; } export interface OrchRunRow { id: number; run_key: string; project_path: string; project_name: string | null; goal: string | null; status: string; total_cycles: number; started_at: string; ended_at: string | null; metrics_json: string | null; snapshot_json: string | null; } export declare const dbOps: { upsertSession(s: SessionRow): void; insertEvent(e: EventRow): number; insertOcEvent(sessionId: string, toolName: string, ts: number, durationMs: number, externalId: string): void; insertSessionIfAbsent(s: SessionRow): void; /** * Al llegar PostToolUse, actualizamos el PreToolUse pendiente más reciente * del mismo tool para esta sesión. Esto convierte el par Pre+Post en * un único registro de tipo 'Done' con duration_ms calculado. */ pairPostWithPre(sessionId: string, toolName: string, response: string, postTs: number): number | null; updateSessionCost(sessionId: string, cost: CostUpdate, efficiencyScore: number, loopsDetected: number, exactRetries?: number, errorRate?: number, fileChurnScore?: number, seqCycleCount?: number): void; getSessionEvents(sessionId: string): EventRow[]; getSession(sessionId: string): SessionRow | undefined; getLatestSession(): SessionRow | undefined; getLatestClaudeSession(): SessionRow | undefined; getLatestOpencodeSession(): SessionRow | undefined; getAllSessions(limit?: number): SessionRow[]; getSessionsInRange(startMs: number, endMs: number): SessionRow[]; getSessionEventsRecent(sessionId: string, limit?: number): EventRow[]; getLastRealEventTimes(): Map; updateSessionProject(sessionId: string, projectPath: string): void; touchSession(sessionId: string, now?: number): void; getRecentSessions(days: number): any[]; getProjectAggregates(): any[]; getProjectToolCounts(projectPath: string): { tool_name: string; count: number; }[]; getProjectSessionStats(projectPath: string): any; getProjectCliHours(): { project_path: string; source: string; total_ms: number; }[]; getProjectStatsBySource(projectPath: string): { source: string; session_count: number; total_cost_usd: number; total_tokens: number; avg_efficiency: number | null; avg_loops: number; last_active: number | null; dominant_model: string | null; }[]; getProjectRecentExtremes(projectPath: string): { heavy_loop_sessions: number; recent_sessions: number; max_session_cost: number; }; updateSessionSummary(sessionId: string, summary: string): void; updateSessionParent(sessionId: string, parentId: string): void; getChildSessions(parentSessionId: string): { id: string; dominant_model?: string; total_cost_usd?: number; started_at: number; }[]; getHiddenCostStats(days: number): { loop_waste_usd: number; total_cost_usd: number; loop_sessions: number; total_loops: number; total_sessions: number; }; insertWeeklyReport(date: string, markdown: string): void; deleteWeeklyReport(date: string): void; listWeeklyReports(): { id: number; date: string; preview: string; created_at: string; }[]; getWeeklyReportByDate(date: string): { id: number; date: string; report_markdown: string; created_at: string; } | undefined; getQuotaStats(since: number): Array<{ total_tokens: number; total_cost_usd: number; }>; getModeDistribution(days: number): { direct: number; mini: number; pipeline: number; total: number; }; getAnalyticsDaily(since: number): any[]; getAnalyticsByModel(since: number): any[]; getProjectHours(since: number): any[]; getCoachEvents(sessionIds: string[]): { session_id: string; type: string; tool_name: string | null; tool_input: string | null; ts: number; }[]; getTopTools(days?: number, by?: "cost" | "count" | "duration", limit?: number, source?: "all" | "claude-code" | "opencode"): { tool_name: string; source: string; count: number; total_duration_ms: number; total_cost_usd: number; }[]; getToolCountsForSession(sessionId: string): Record | null; getToolCountsByRange(startMs: number, endMs: number, source?: "claude-code" | "opencode" | "all"): Record | null; getWeeklyInsight(days?: number): { total_sessions: number; total_cost: number; input_tokens: number; output_tokens: number; cache_read: number; total_loops: number; avg_efficiency: number; week_start: number; week_end: number; }; getPrevWeekInsight(): { total_sessions: any; total_cost: any; input_tokens: any; output_tokens: any; cache_read: any; total_loops: any; avg_efficiency: any; week_start: any; week_end: any; }; setMeta(key: string, value: string): void; getMeta(key: string): string | undefined; getCostProjection(days?: number): { total_cost_usd: number; earliest: number; latest: number; }; getProjectCosts(days?: number): { project: string; session_count: number; total_cost: number; }[]; getHourlyDistribution(days?: number): { hour: number; session_count: number; }[]; updateSessionSemantic(sessionId: string, avgOutputChars: number, errorBlockCount: number, semanticLoopCount?: number): void; upsertAssistantTurns(sessionId: string, turns: AssistantTurnRow[]): void; getAssistantTurns(sessionId: string): AssistantTurnRow[]; getCacheReadByModel(days: number): { model: string; cache_read: number; }[]; getModelBreakdown(days: number): { model: string; total_cost: number; session_count: number; }[]; insertIntent(tool: string, sessionId: string, taskDesc: string | undefined): number; insertIntentFile(intentId: number, filePath: string, operation: string, lineStart?: number, lineEnd?: number): void; getWriteConflicts(filePaths: string[], excludeTool: string): { file_path: string; tool: string; session_id: string; task_desc: string | null; acquired_at: number; }[]; getIntent(id: number): { tool: string; session_id: string; task_desc: string | null; } | undefined; releaseIntent(id: number): void; heartbeatIntent(id: number): void; getIntentFiles(id: number): { file_path: string; operation: string; }[]; getActiveToolsInProject(projectPath: string, excludeTool: string): { source: string; last_event_at: number; }[]; releaseOrphanedIntents(): void; markStaleIntents(): { id: number; tool: string; task_desc: string | null; }[]; deleteOldStaleIntents(): void; hasActiveIntent(tool: string, filePath: string): boolean; getActiveIntents(): { id: number; tool: string; file_path: string; }[]; getBillingBlocks(limit?: number): BillingBlock[]; getDailyActivity(days?: number): DailyActivity[]; getToolSparklines(tools: string[], days: number): Record; getDbStats(): { sizeKb: number; oldestEventAt: number | null; totalEvents: number; }; getDailySummary(): DailySummary; upsertOrchRun(row: Omit): void; getOrchRuns(projectPath: string): OrchRunRow[]; getOrchRun(runKey: string): OrchRunRow | undefined; upsertOrchCycleTrace(runKey: string, cycleIndex: number, traceJson: string): void; getOrchCycleTrace(runKey: string, cycleIndex: number): string | null; getOrchAggregates(projectPath: string): { avg_cost_per_cycle: number; avg_duration_secs: number; avg_error_rate: number; avg_verify_pass_rate: number; total_runs: number; }; };