import type { AnalysisRecord, AuditEvent, ChatDirection, ChatMessageIn, DeploymentEventMirror, MediaMeta, MediaRef, ReleaseProvenance, TombstoneIn, TriggerReason, } from './events.ts' /** Public timeline row; archived rows have no seq and are flagged cold. */ export interface TimelineRow { seq?: number | undefined id: string ts: string kind: string sessionId?: string | undefined provenance?: ReleaseProvenance | undefined payload: unknown archived: boolean } export interface ChatViewRow { id: string chatId: number messageId: number direction: ChatDirection ts: string senderId?: string | undefined senderName?: string | undefined replyToMessageId?: number | undefined triggerReason?: TriggerReason | undefined text?: string | undefined media?: MediaRef[] | undefined hidden: boolean archived: boolean } export interface IngestResult { accepted: number duplicates: number insertedSeqs: number[] } export type RecallKind = 'audit' | 'chat' | 'deploy' | 'analysis' export interface RecallQuery { kind: RecallKind since?: string until?: string q?: string digest?: string limit?: number } export interface RecallResponse { rows: unknown[] cold: boolean } export interface ServiceStatus { ready: boolean schemaVersion: number lastAuditSeq: number counts: { audit: number; chat: number; deployments: number; media: number } dbSizeBytes: number storage: { freeBytes: number; totalBytes: number; freePct: number } storageState: 'ok' | 'warn' | 'stop' lastQuickCheck?: string } /** Internal maintenance op names (typed API surface, no arbitrary SQL). */ export const MAINTENANCE_OPS = ['quick_check', 'archive_cycle', 'vacuum', 'reconcile'] as const export type MaintenanceOp = (typeof MAINTENANCE_OPS)[number] export interface ArchiveCycleResult { exportedAudit: number exportedChat: number segments: number } /* ---- wire helpers shared by service routes and the agent client ---- */ export type { AnalysisRecord, AuditEvent, ChatMessageIn, DeploymentEventMirror, MediaMeta, TombstoneIn, }