From 622febd225f19ed7fa20c22213e6907d0a993b35 Mon Sep 17 00:00:00 2001 From: naaa760 Date: Tue, 15 Jul 2025 20:24:18 +0530 Subject: [PATCH 1/2] update-data-store-name --- .../components/nodes/agentflow/Agent/Agent.ts | 21 ++++++++++++++++--- .../nodes/agentflow/Retriever/Retriever.ts | 15 ++++++++++--- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/packages/components/nodes/agentflow/Agent/Agent.ts b/packages/components/nodes/agentflow/Agent/Agent.ts index b5820612ffa..730bb32ab8a 100644 --- a/packages/components/nodes/agentflow/Agent/Agent.ts +++ b/packages/components/nodes/agentflow/Agent/Agent.ts @@ -433,8 +433,8 @@ class Agent_Agentflow implements INode { for (const store of stores) { if (store.status === 'UPSERTED') { const obj = { - name: `${store.id}:${store.name}`, - label: store.name, + name: store.id, // Store only the ID, not the name + label: store.name, // Display the current name description: store.description } returnData.push(obj) @@ -547,7 +547,22 @@ class Agent_Agentflow implements INode { const nodeInstanceFilePath = options.componentNodes['retrieverTool'].filePath as string const nodeModule = await import(nodeInstanceFilePath) const newRetrieverToolNodeInstance = new nodeModule.nodeClass() - const [storeId, storeName] = knowledgeBase.documentStore.split(':') + + // Handle both old format (id:name) and new format (id only) + let storeId = knowledgeBase.documentStore + let storeName = '' + + if (knowledgeBase.documentStore.includes(':')) { + // Old format - split to get ID and name + ;[storeId, storeName] = knowledgeBase.documentStore.split(':') + } else { + // New format - only ID is stored, need to look up current name + storeId = knowledgeBase.documentStore + const appDataSource = options.appDataSource as DataSource + const databaseEntities = options.databaseEntities as IDatabaseEntity + const store = await appDataSource.getRepository(databaseEntities['DocumentStore']).findOneBy({ id: storeId }) + storeName = store?.name || storeId // Fallback to ID if store not found + } const docStoreVectorInstanceFilePath = options.componentNodes['documentStoreVS'].filePath as string const docStoreVectorModule = await import(docStoreVectorInstanceFilePath) diff --git a/packages/components/nodes/agentflow/Retriever/Retriever.ts b/packages/components/nodes/agentflow/Retriever/Retriever.ts index 8524fcd12d3..d63028bd9e0 100644 --- a/packages/components/nodes/agentflow/Retriever/Retriever.ts +++ b/packages/components/nodes/agentflow/Retriever/Retriever.ts @@ -124,8 +124,8 @@ class Retriever_Agentflow implements INode { for (const store of stores) { if (store.status === 'UPSERTED') { const obj = { - name: `${store.id}:${store.name}`, - label: store.name, + name: store.id, // please store only the ID, not the name + label: store.name, // display the current name description: store.description } returnData.push(obj) @@ -152,7 +152,16 @@ class Retriever_Agentflow implements INode { const knowledgeBases = nodeData.inputs?.retrieverKnowledgeDocumentStores as IKnowledgeBase[] if (knowledgeBases && knowledgeBases.length > 0) { for (const knowledgeBase of knowledgeBases) { - const [storeId, _] = knowledgeBase.documentStore.split(':') + // Handle both old format (id:name) and new format (id only) + let storeId = knowledgeBase.documentStore + + if (knowledgeBase.documentStore.includes(':')) { + // Old format - split to get ID + ;[storeId] = knowledgeBase.documentStore.split(':') + } else { + // New format - only ID is stored + storeId = knowledgeBase.documentStore + } const docStoreVectorInstanceFilePath = options.componentNodes['documentStoreVS'].filePath as string const docStoreVectorModule = await import(docStoreVectorInstanceFilePath) From 0a26f106ea1b2a1334efbd6ada29e39bea495de9 Mon Sep 17 00:00:00 2001 From: naaa760 Date: Sat, 26 Jul 2025 00:32:39 +0530 Subject: [PATCH 2/2] Fix data store name referential integrity in agent flows Keep original format for backward compatibility while fetching current store name from database to prevent UI breaks when document store names are updated. --- .../components/nodes/agentflow/Agent/Agent.ts | 14 ++++++++++---- .../nodes/agentflow/Retriever/Retriever.ts | 15 +++------------ 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/packages/components/nodes/agentflow/Agent/Agent.ts b/packages/components/nodes/agentflow/Agent/Agent.ts index 730bb32ab8a..a05ce745b07 100644 --- a/packages/components/nodes/agentflow/Agent/Agent.ts +++ b/packages/components/nodes/agentflow/Agent/Agent.ts @@ -433,8 +433,8 @@ class Agent_Agentflow implements INode { for (const store of stores) { if (store.status === 'UPSERTED') { const obj = { - name: store.id, // Store only the ID, not the name - label: store.name, // Display the current name + name: `${store.id}:${store.name}`, + label: store.name, description: store.description } returnData.push(obj) @@ -564,6 +564,12 @@ class Agent_Agentflow implements INode { storeName = store?.name || storeId // Fallback to ID if store not found } + // Always fetch the current store name from database for referential integrity + const appDataSource = options.appDataSource as DataSource + const databaseEntities = options.databaseEntities as IDatabaseEntity + const store = await appDataSource.getRepository(databaseEntities['DocumentStore']).findOneBy({ id: storeId }) + const currentStoreName = store?.name || storeId // Use current name from database + const docStoreVectorInstanceFilePath = options.componentNodes['documentStoreVS'].filePath as string const docStoreVectorModule = await import(docStoreVectorInstanceFilePath) const newDocStoreVectorInstance = new docStoreVectorModule.nodeClass() @@ -586,7 +592,7 @@ class Agent_Agentflow implements INode { ...nodeData, inputs: { ...nodeData.inputs, - name: storeName + name: currentStoreName .toLowerCase() .replace(/ /g, '_') .replace(/[^a-z0-9_-]/g, ''), @@ -606,7 +612,7 @@ class Agent_Agentflow implements INode { const componentNode = options.componentNodes['retrieverTool'] availableTools.push({ - name: storeName + name: currentStoreName .toLowerCase() .replace(/ /g, '_') .replace(/[^a-z0-9_-]/g, ''), diff --git a/packages/components/nodes/agentflow/Retriever/Retriever.ts b/packages/components/nodes/agentflow/Retriever/Retriever.ts index d63028bd9e0..c4037814fef 100644 --- a/packages/components/nodes/agentflow/Retriever/Retriever.ts +++ b/packages/components/nodes/agentflow/Retriever/Retriever.ts @@ -124,8 +124,8 @@ class Retriever_Agentflow implements INode { for (const store of stores) { if (store.status === 'UPSERTED') { const obj = { - name: store.id, // please store only the ID, not the name - label: store.name, // display the current name + name: `${store.id}:${store.name}`, + label: store.name, description: store.description } returnData.push(obj) @@ -152,16 +152,7 @@ class Retriever_Agentflow implements INode { const knowledgeBases = nodeData.inputs?.retrieverKnowledgeDocumentStores as IKnowledgeBase[] if (knowledgeBases && knowledgeBases.length > 0) { for (const knowledgeBase of knowledgeBases) { - // Handle both old format (id:name) and new format (id only) - let storeId = knowledgeBase.documentStore - - if (knowledgeBase.documentStore.includes(':')) { - // Old format - split to get ID - ;[storeId] = knowledgeBase.documentStore.split(':') - } else { - // New format - only ID is stored - storeId = knowledgeBase.documentStore - } + const [storeId] = knowledgeBase.documentStore.split(':') const docStoreVectorInstanceFilePath = options.componentNodes['documentStoreVS'].filePath as string const docStoreVectorModule = await import(docStoreVectorInstanceFilePath)