import type { Database } from "./database.js"; export interface ConceptRecord { cluster_id: number; label: string; summary: string | null; tags: string | null; hub_file: string | null; member_count: number; content_hash: string; labeled_at: number; } export interface ConceptInsert { cluster_id: number; label: string; summary: string | null; tags: string[]; hub_file: string | null; member_count: number; content_hash: string; } export declare class ConceptStore { private db; private upsertStmt; private getStmt; private getAllStmt; private deleteStmt; private upsertEmbeddingStmt; private getEmbeddingStmt; private getAllEmbeddingsStmt; private countStmt; constructor(db: Database); upsert(input: ConceptInsert, labeledAt?: number): void; get(clusterId: number): ConceptRecord | null; getAll(): ConceptRecord[]; delete(clusterId: number): void; upsertEmbedding(clusterId: number, vector: Float32Array): void; getEmbedding(clusterId: number): Float32Array | undefined; getAllEmbeddings(): Map; count(): number; } /** * Content hash for a cluster — drives the "re-label on change" decision. * Uses sorted member ids + their chunk count as a fingerprint. If a cluster * gains/loses members the hash changes; otherwise we can skip re-labeling. */ export declare function clusterContentHash(memberFileIds: number[], memberChunkCount: number): string;