import type { LoggerInterface } from '@qvac/logging'; import { BaseDBAdapter } from './BaseDBAdapter.js'; import { type HyperDBStorageInput } from './HyperDBStorage.js'; import type { EmbeddedDoc, HyperDBAdapterConfig, ReindexOpts, ReindexResult, SaveEmbeddingsOpts, SaveEmbeddingsResult, SearchParams, SearchResult } from '../../types.js'; export type TurboVecIndexStorage = 'f32' | 'q8' | 'q4' | 'turbovec-q4' | 'turbovec-q2'; export interface TurboVecIndexSearchResult { scores: Float32Array; ids: BigUint64Array; m: number; k: number; } export interface TurboVecIndex { readonly length: number; readonly dim: number; addWithIds(vectors: Float32Array, ids: BigUint64Array): void; search(queries: Float32Array, k: number): TurboVecIndexSearchResult; contains(id: bigint): boolean; remove(id: bigint): boolean; prepare(): void; write(path: string): void; dispose(): void; } export interface TurboVecIndexProvider { create(options: { dim: number; storage: TurboVecIndexStorage; }): TurboVecIndex; load(path: string): TurboVecIndex; } export interface TurboVecAdapterInput extends HyperDBStorageInput { indexProvider: TurboVecIndexProvider; checkpointDir?: string; storage?: 'turbovec-q4' | 'turbovec-q2'; fallbackStorage?: 'f32' | 'q8' | 'q4'; candidateMultiplier?: number; checkpointEveryMutations?: number; lockStaleMs?: number; lockHeartbeatMs?: number; nativeIdsTable?: string; logger?: LoggerInterface; } export declare class TurboVecAdapter extends BaseDBAdapter { readonly checkpointDir: string | undefined; readonly preferredStorage: 'turbovec-q4' | 'turbovec-q2'; readonly fallbackStorage: 'f32' | 'q8' | 'q4'; readonly candidateMultiplier: number; readonly checkpointEveryMutations: number; readonly lockStaleMs: number; readonly lockHeartbeatMs: number; readonly mutationsTable: string; readonly nativeIdsTable: string; private index; private indexUnavailable; private indexRevision; private activeStorage; private idToDocument; private operationTail; private activeSearches; private checkpointScheduled; private refreshPromise; private dirty; private needsRecovery; private mutationsSinceCheckpoint; private lockHeartbeat; private ownsLock; private writerFenced; private readonly lockOwner; private readonly indexProvider; private readonly storage; private isClosingIndex; private databaseIdentity; private checkpointWorkspaceDir; constructor(config: TurboVecAdapterInput); get dbName(): string; get BATCH_SIZE(): number; get logger(): LoggerInterface; get vectorStorage(): TurboVecIndexStorage | null; get revision(): number; saveEmbeddings(embeddedDocs: EmbeddedDoc[], opts?: SaveEmbeddingsOpts): Promise; deleteEmbeddings(ids: string[]): Promise; search(query: string, queryVector: number[], params?: SearchParams): Promise; private _search; private _saveEmbeddings; private _deleteEmbeddings; private _applySavedDocuments; private _applyDeletedDocuments; private _postCommitSyncError; private _assertPreFlushOwnership; reindex(opts?: ReindexOpts): Promise; checkpoint(): Promise; getConfig(): Promise; _open(): Promise; _close(): Promise; private _initializeCheckpointWorkspace; private _closingError; private _enqueue; private _scheduleRefresh; private _searchAllDocuments; private _ensureNativeIdRecord; private _refreshIndex; private _recoverIndex; private _fullRebuild; private _replayMutations; private _ensureIndex; private _createIndex; private _normalizeVector; private _nativeIdForDocument; private _assertRuntimeMapping; private _assertMapping; private _nativeIdCollision; private _resolveCandidateIds; private _loadRuntimeMappings; private _persistMissingMappings; private _markDirty; private _checkpoint; private _readManifest; private _manifestPath; private _syncCheckpointDirectory; private _pruneMutations; private _removeOldSnapshots; private _acquireLock; private _releaseLock; private _startLockHeartbeat; private _writeLockRecord; private _readLockRecord; private _readLockTimestamp; private _removeLockArtifact; private _assertWriterOwnership; private _fenceWriter; private _tryRecoverFromFence; private _lockLostError; private _lockUncertainError; }