diff --git a/apps/client/src/services/froca_updater.ts b/apps/client/src/services/froca_updater.ts index 27d25922a..412d8d6cd 100644 --- a/apps/client/src/services/froca_updater.ts +++ b/apps/client/src/services/froca_updater.ts @@ -36,7 +36,7 @@ async function processEntityChanges(entityChanges: EntityChange[]) { } else if (ec.entityName === "attachments") { processAttachment(loadResults, ec); } else if (ec.entityName === "blobs" || ec.entityName === "etapi_tokens" || ec.entityName === "note_embeddings") { - // NOOP - these entities don't require frontend processing + // NOOP - these entities are handled at the backend level and don't require frontend processing } else { throw new Error(`Unknown entityName '${ec.entityName}'`); } diff --git a/apps/client/src/services/load_results.ts b/apps/client/src/services/load_results.ts index 9762463f6..59d201f2b 100644 --- a/apps/client/src/services/load_results.ts +++ b/apps/client/src/services/load_results.ts @@ -80,7 +80,6 @@ export default class LoadResults { private contentNoteIdToComponentId: ContentNoteIdToComponentIdRow[]; private optionNames: string[]; private attachmentRows: AttachmentRow[]; - private noteEmbeddingRows: NoteEmbeddingRow[]; constructor(entityChanges: EntityChange[]) { const entities: Record> = {}; @@ -109,8 +108,6 @@ export default class LoadResults { this.optionNames = []; this.attachmentRows = []; - - this.noteEmbeddingRows = []; } getEntityRow(entityName: T, entityId: string): EntityRowMappings[T] { @@ -213,14 +210,6 @@ export default class LoadResults { return this.attachmentRows; } - addNoteEmbedding(embedding: NoteEmbeddingRow) { - this.noteEmbeddingRows.push(embedding); - } - - getNoteEmbeddingRows() { - return this.noteEmbeddingRows; - } - /** * @returns {boolean} true if there are changes which could affect the attributes (including inherited ones) * notably changes in note itself should not have any effect on attributes @@ -238,8 +227,7 @@ export default class LoadResults { this.revisionRows.length === 0 && this.contentNoteIdToComponentId.length === 0 && this.optionNames.length === 0 && - this.attachmentRows.length === 0 && - this.noteEmbeddingRows.length === 0 + this.attachmentRows.length === 0 ); } diff --git a/apps/server/src/services/ws.ts b/apps/server/src/services/ws.ts index 8dde51639..6a211c572 100644 --- a/apps/server/src/services/ws.ts +++ b/apps/server/src/services/ws.ts @@ -203,6 +203,13 @@ function fillInAdditionalProperties(entityChange: EntityChange) { WHERE attachmentId = ?`, [entityChange.entityId] ); + } else if (entityChange.entityName === "note_embeddings") { + // Note embeddings are backend-only entities for AI/vector search + // Frontend doesn't need the full embedding data (which is large binary data) + // Just ensure entity is marked as handled - actual sync happens at database level + if (!entityChange.isErased) { + entityChange.entity = { embedId: entityChange.entityId }; + } } if (entityChange.entity instanceof AbstractBeccaEntity) {