chore: snapshot before performance optimization

This commit is contained in:
Sepehr Ramezani
2026-04-17 21:14:43 +02:00
parent b6a548acd8
commit 2eceb32fd4
95 changed files with 4357 additions and 1942 deletions

View File

@@ -454,7 +454,7 @@ Deine Antwort (nur JSON):
let names: string[] = []
if (note.labels) {
try {
const parsed = JSON.parse(note.labels) as unknown
const parsed = note.labels as unknown
names = Array.isArray(parsed)
? parsed.filter((n): n is string => typeof n === 'string' && n.trim().length > 0)
: []
@@ -471,7 +471,7 @@ Deine Antwort (nur JSON):
await prisma.note.update({
where: { id: noteId },
data: {
labels: JSON.stringify(names),
labels: names as any,
labelRelations: {
connect: { id: label.id },
},

View File

@@ -175,26 +175,17 @@ export class EmbeddingService {
}
/**
* Serialize embedding to JSON-safe format (for storage)
* Pass-through — embeddings are stored as native JSONB in PostgreSQL
*/
serialize(embedding: number[]): string {
return JSON.stringify(embedding)
serialize(embedding: number[]): number[] {
return embedding
}
/**
* Deserialize embedding from JSON string
* Pass-through — embeddings come back already parsed from PostgreSQL
*/
deserialize(jsonString: string): number[] {
try {
const parsed = JSON.parse(jsonString)
if (!Array.isArray(parsed)) {
throw new Error('Invalid embedding format')
}
return parsed
} catch (error) {
console.error('Error deserializing embedding:', error)
throw new Error('Failed to deserialize embedding')
}
deserialize(embedding: number[]): number[] {
return embedding
}
/**

View File

@@ -77,11 +77,11 @@ export class MemoryEchoService {
return [] // Need at least 2 notes to find connections
}
// Parse embeddings
// Parse embeddings (already native Json from PostgreSQL)
const notesWithEmbeddings = notes
.map(note => ({
...note,
embedding: note.embedding ? JSON.parse(note.embedding) : null
embedding: note.embedding ? JSON.parse(note.embedding) as number[] : null
}))
.filter(note => note.embedding && Array.isArray(note.embedding))
@@ -108,7 +108,7 @@ export class MemoryEchoService {
}
// Calculate cosine similarity
const similarity = cosineSimilarity(note1.embedding, note2.embedding)
const similarity = cosineSimilarity(note1.embedding!, note2.embedding!)
// Similarity threshold for meaningful connections
if (similarity >= similarityThreshold) {
@@ -348,9 +348,9 @@ Explain in one brief sentence (max 15 words) why these notes are connected. Focu
feedbackType: feedback,
feature: 'memory_echo',
originalContent: JSON.stringify({ insightId }),
metadata: JSON.stringify({
metadata: {
timestamp: new Date().toISOString()
})
} as any
}
})
}
@@ -426,8 +426,9 @@ Explain in one brief sentence (max 15 words) why these notes are connected. Focu
return []
}
// Parse target note embedding
const targetEmbedding = JSON.parse(targetNote.embedding)
// Target note embedding (already native Json from PostgreSQL)
const targetEmbedding = targetNote.embedding ? JSON.parse(targetNote.embedding) as number[] : null
if (!targetEmbedding) return []
// Check if user has demo mode enabled
const settings = await prisma.userAISettings.findUnique({
@@ -444,7 +445,8 @@ Explain in one brief sentence (max 15 words) why these notes are connected. Focu
for (const otherNote of otherNotes) {
if (!otherNote.embedding) continue
const otherEmbedding = JSON.parse(otherNote.embedding)
const otherEmbedding = otherNote.embedding ? JSON.parse(otherNote.embedding) as number[] : null
if (!otherEmbedding) continue
// Check if this connection was dismissed
const pairKey1 = `${targetNote.id}-${otherNote.id}`

View File

@@ -192,7 +192,7 @@ export class SemanticSearchService {
// Calculate similarities for all notes
const similarities = notes.map(note => {
const noteEmbedding = embeddingService.deserialize(note.embedding || '[]')
const noteEmbedding = note.embedding ? JSON.parse(note.embedding) as number[] : []
const similarity = embeddingService.calculateCosineSimilarity(
queryEmbedding,
noteEmbedding
@@ -283,7 +283,7 @@ export class SemanticSearchService {
// Check if embedding needs regeneration
const shouldRegenerate = embeddingService.shouldRegenerateEmbedding(
note.content,
note.embedding,
note.embedding as any,
note.lastAiAnalysis
)
@@ -298,7 +298,7 @@ export class SemanticSearchService {
await prisma.note.update({
where: { id: noteId },
data: {
embedding: embeddingService.serialize(embedding),
embedding: embeddingService.serialize(embedding) as any,
lastAiAnalysis: new Date()
}
})