import type { Observation, ObservationIndex, ObservationType, SearchQuery, SearchResult } from "../types"; import type { Database } from "./database"; /** Repository for observation CRUD, FTS5 search, and embedding operations. */ export declare class ObservationRepository { private db; constructor(db: Database); /** Create a new observation and return it with generated ID and timestamp. */ create(data: Omit): Observation; /** Import an observation with a pre-existing ID (for data migration). */ importObservation(data: Observation): void; /** Get an observation by its unique ID. */ getById(id: string): Observation | null; /** Get an observation by ID regardless of superseded/tombstoned state. */ getByIdIncludingArchived(id: string): Observation | null; /** Get all observations for a session, ordered by creation time. */ getBySession(sessionId: string): Observation[]; /** Get the total observation count, optionally filtered by session. */ getCount(sessionId?: string): number; /** Lightweight index for progressive disclosure */ getIndex(projectPath: string, limit?: number): ObservationIndex[]; /** Get observations around a timestamp, cross-session, for anchor navigation. */ getAroundTimestamp(timestamp: string, before: number, after: number, projectPath: string): Observation[]; /** List observations for a project with optional state/type/session filters. */ listByProject(projectPath: string, options?: { limit?: number; offset?: number; type?: ObservationType; state?: "current" | "superseded" | "tombstoned"; sessionId?: string; }): Observation[]; /** Search observations using FTS5 full-text search with optional filters. */ search(query: SearchQuery): SearchResult[]; /** Search observations by concept tag using FTS5. */ searchByConcept(concept: string, limit?: number, projectPath?: string): Observation[]; /** Search observations by file path using FTS5. */ searchByFile(filePath: string, limit?: number, projectPath?: string): Observation[]; /** Store an embedding vector for an observation. */ setEmbedding(id: string, embedding: number[]): void; /** Get observations with their embedding vectors for a project. */ getWithEmbeddings(projectPath: string, limit: number): Array<{ id: string; embedding: number[]; title: string; }>; /** Find observations similar to a given embedding above a similarity threshold. */ findSimilar(embedding: number[], type: ObservationType, threshold: number, limit: number): Array<{ id: string; similarity: number; }>; /** Insert an embedding into the vec0 virtual table for native KNN search. */ insertVecEmbedding(observationId: string, embedding: number[]): void; /** Migrate existing JSON embeddings to the vec0 virtual table. */ migrateExistingEmbeddings(dimension: number): { migrated: number; skipped: number; }; /** Perform KNN search using the vec0 virtual table. */ getVecEmbeddingMatches(queryEmbedding: number[], limit: number): Array<{ observationId: string; distance: number; }>; /** Search vec0 embeddings filtered to a subset of observation IDs. */ searchVecSubset(queryEmbedding: number[], observationIds: string[], limit: number): Array<{ observationId: string; distance: number; }>; /** Update selected fields by creating a successor revision (immutable history). */ update(id: string, data: Partial>): Observation | null; /** Mark an observation as superseded by a newer one. */ supersede(observationId: string, newObservationId: string): void; /** Tombstone an observation by ID (soft delete), including embeddings cleanup. */ delete(id: string): boolean; /** Return full revision/tombstone lineage from oldest known revision to newest. */ getLineage(id: string): Observation[]; /** Delete observations older than the specified number of days. */ deleteOlderThan(days: number): number; /** Remove vec0 embeddings and clear JSON embedding column for given IDs. */ deleteEmbeddingsForObservations(ids: string[]): void; private mapRow; } //# sourceMappingURL=observations.d.ts.map