diff --git a/src/main/ipc.ts b/src/main/ipc.ts index 39ce0106..6978bb10 100644 --- a/src/main/ipc.ts +++ b/src/main/ipc.ts @@ -992,10 +992,15 @@ function getKnowledgeSnapshot( ]) } } + const bindingsByLibraryId = new Map( + service.database.externalStore + .listBindings() + .map((binding) => [binding.knowledgeBaseId, binding]) + ) return { libraries: snapshot.libraries.map((library) => ({ - kind: service.database.externalStore.listBindings().some(item=>item.knowledgeBaseId===library.id) ? 'external' : 'local', - external: service.database.externalStore.listBindings().find(item=>item.knowledgeBaseId===library.id), + kind: bindingsByLibraryId.has(library.id) ? 'external' : 'local', + external: bindingsByLibraryId.get(library.id), id: library.id, name: library.name, description: library.description ?? '', diff --git a/src/main/knowledge/external/external-knowledge-store.ts b/src/main/knowledge/external/external-knowledge-store.ts index 4d8c345a..6b0b1a8b 100644 --- a/src/main/knowledge/external/external-knowledge-store.ts +++ b/src/main/knowledge/external/external-knowledge-store.ts @@ -19,6 +19,16 @@ export class ExternalKnowledgeStore { deleteInstance(id: string): void { this.database.prepare('DELETE FROM external_knowledge_instances WHERE id=?').run(id) } + getBinding(knowledgeBaseId: string): ExternalKnowledgeBinding | undefined { + const row = this.database.prepare('SELECT value_json FROM external_knowledge_bindings WHERE knowledge_base_id=?').get(knowledgeBaseId) + return row ? JSON.parse(String(row.value_json)) as ExternalKnowledgeBinding : undefined + } + hasBinding(knowledgeBaseId: string): boolean { + return this.database.prepare('SELECT 1 FROM external_knowledge_bindings WHERE knowledge_base_id=?').get(knowledgeBaseId) !== undefined + } + getBindingsForInstance(instanceId: string): ExternalKnowledgeBinding[] { + return this.database.prepare('SELECT value_json FROM external_knowledge_bindings WHERE instance_id=? ORDER BY rowid').all(instanceId).map(row => JSON.parse(String(row.value_json)) as ExternalKnowledgeBinding) + } listBindings(): ExternalKnowledgeBinding[] { return this.database.prepare('SELECT value_json FROM external_knowledge_bindings ORDER BY rowid').all().map(row => JSON.parse(String(row.value_json)) as ExternalKnowledgeBinding) } diff --git a/src/main/knowledge/knowledge-database.ts b/src/main/knowledge/knowledge-database.ts index fcd8e1b7..9b891bbb 100644 --- a/src/main/knowledge/knowledge-database.ts +++ b/src/main/knowledge/knowledge-database.ts @@ -926,7 +926,7 @@ export class KnowledgeDatabase { input: UpdateKnowledgeBaseInput ): KnowledgeBase { const current = this.requiredKnowledgeBase(id) - if (this.externalStore.listBindings().some(item => item.knowledgeBaseId === id) && + if (this.externalStore.hasBinding(id) && (input.graphEnabled !== undefined || input.graphStrategy !== undefined || input.storageMode !== undefined)) { throw new Error('EXTERNAL_KB_READ_ONLY') } diff --git a/src/renderer/src/App.tsx b/src/renderer/src/App.tsx index 63fdb859..b52d9a3a 100644 --- a/src/renderer/src/App.tsx +++ b/src/renderer/src/App.tsx @@ -3791,8 +3791,15 @@ function App(): React.JSX.Element { [conversations, conversationTitles, assistantTasks, activeConversationIds, projects, projectNames, tWorkspace], ); - const activityByConversationId = new Map( - projectActivity.activities.map((activity) => [activity.conversationId, activity]), + const activityByConversationId = useMemo( + () => + new Map( + projectActivity.activities.map((activity) => [ + activity.conversationId, + activity, + ]), + ), + [projectActivity], ); const pendingSidebarApprovals = useMemo( () =>