/** * Computes the cosine similarity between two vectors */ export function cosineSimilarity(a: Float32Array, b: Float32Array): number { if (a.length !== b.length) { throw new Error(`Vector dimensions don't match: ${a.length} vs ${b.length}`); } let dotProduct = 0; let aMagnitude = 0; let bMagnitude = 0; for (let i = 0; i < a.length; i++) { dotProduct += a[i] * b[i]; aMagnitude += a[i] * a[i]; bMagnitude += b[i] * b[i]; } aMagnitude = Math.sqrt(aMagnitude); bMagnitude = Math.sqrt(bMagnitude); if (aMagnitude === 0 || bMagnitude === 0) { return 0; } return dotProduct / (aMagnitude * bMagnitude); } /** * Converts embedding Float32Array to Buffer for storage in SQLite */ export function embeddingToBuffer(embedding: Float32Array): Buffer { return Buffer.from(embedding.buffer); } /** * Converts Buffer from SQLite back to Float32Array */ export function bufferToEmbedding(buffer: Buffer, dimension: number): Float32Array { return new Float32Array(buffer.buffer, buffer.byteOffset, dimension); }