fix(ui): fix kb id extraction logic for resource, sync tags (#3763)

* fix(ui): fix kb id extraction logic for resource, sync tags

* Pass knowledge base id back on edit tag

---------

Co-authored-by: Theodore Li <theo@sim.ai>
This commit is contained in:
Theodore Li
2026-03-25 13:46:57 -04:00
committed by GitHub
co-authored by Theodore Li
parent 668b948f0b
commit 8caaf01371
4 changed files with 103 additions and 2 deletions
@@ -138,6 +138,7 @@ const RESOURCE_INVALIDATORS: Record<
knowledgebase: (qc, _wId, id) => {
qc.invalidateQueries({ queryKey: knowledgeKeys.lists() })
qc.invalidateQueries({ queryKey: knowledgeKeys.detail(id) })
qc.invalidateQueries({ queryKey: knowledgeKeys.tagDefinitions(id) })
},
}
@@ -0,0 +1,85 @@
/**
* @vitest-environment node
*/
import { describe, expect, it } from 'vitest'
import { extractResourcesFromToolResult } from './resource-extraction'
describe('extractResourcesFromToolResult', () => {
it('uses the knowledge base id for knowledge_base tag mutations', () => {
const resources = extractResourcesFromToolResult(
'knowledge_base',
{
operation: 'update_tag',
args: {
knowledgeBaseId: 'kb_123',
tagDefinitionId: 'tag_456',
},
},
{
success: true,
message: 'Tag updated successfully',
data: {
id: 'tag_456',
displayName: 'Priority',
fieldType: 'text',
},
}
)
expect(resources).toEqual([
{
type: 'knowledgebase',
id: 'kb_123',
title: 'Knowledge Base',
},
])
})
it('uses knowledgeBaseId from the tool result when update_tag args omit it', () => {
const resources = extractResourcesFromToolResult(
'knowledge_base',
{
operation: 'update_tag',
args: {
tagDefinitionId: 'tag_456',
},
},
{
success: true,
message: 'Tag updated successfully',
data: {
id: 'tag_456',
knowledgeBaseId: 'kb_123',
displayName: 'Priority',
fieldType: 'text',
},
}
)
expect(resources).toEqual([
{
type: 'knowledgebase',
id: 'kb_123',
title: 'Knowledge Base',
},
])
})
it('does not create resources for read-only knowledge base tag operations', () => {
const resources = extractResourcesFromToolResult(
'knowledge_base',
{
operation: 'list_tags',
args: {
knowledgeBaseId: 'kb_123',
},
},
{
success: true,
data: [],
}
)
expect(resources).toEqual([])
})
})
+4 -2
View File
@@ -155,11 +155,13 @@ export function extractResourcesFromToolResult(
case 'knowledge_base': {
if (READ_ONLY_KB_OPS.has(getOperation(params) ?? '')) return []
const args = asRecord(params?.args)
const kbId =
(data.id as string) ??
(args.knowledgeBaseId as string) ??
(params?.knowledgeBaseId as string) ??
(result.knowledgeBaseId as string) ??
(data.knowledgeBaseId as string) ??
(params?.knowledgeBaseId as string)
(data.id as string)
if (kbId) {
const kbName =
(data.name as string) ?? (result.knowledgeBaseName as string) ?? 'Knowledge Base'
@@ -28,6 +28,7 @@ import {
deleteTagDefinition,
getDocumentTagDefinitions,
getNextAvailableSlot,
getTagDefinitionById,
getTagUsageStats,
updateTagDefinition,
} from '@/lib/knowledge/tags/service'
@@ -525,6 +526,7 @@ export const knowledgeBaseServerTool: BaseServerTool<KnowledgeBaseArgs, Knowledg
message: `Tag "${newTag.displayName}" created successfully`,
data: {
id: newTag.id,
knowledgeBaseId: args.knowledgeBaseId,
tagSlot: newTag.tagSlot,
displayName: newTag.displayName,
fieldType: newTag.fieldType,
@@ -551,12 +553,21 @@ export const knowledgeBaseServerTool: BaseServerTool<KnowledgeBaseArgs, Knowledg
}
}
const existingTag = await getTagDefinitionById(args.tagDefinitionId)
if (!existingTag) {
return {
success: false,
message: `Tag definition with ID "${args.tagDefinitionId}" not found`,
}
}
const requestId = crypto.randomUUID().slice(0, 8)
assertNotAborted()
const updatedTag = await updateTagDefinition(args.tagDefinitionId, updateData, requestId)
logger.info('Tag definition updated via copilot', {
tagId: args.tagDefinitionId,
knowledgeBaseId: existingTag.knowledgeBaseId,
userId: context.userId,
})
@@ -565,6 +576,7 @@ export const knowledgeBaseServerTool: BaseServerTool<KnowledgeBaseArgs, Knowledg
message: `Tag "${updatedTag.displayName}" updated successfully`,
data: {
id: updatedTag.id,
knowledgeBaseId: existingTag.knowledgeBaseId,
tagSlot: updatedTag.tagSlot,
displayName: updatedTag.displayName,
fieldType: updatedTag.fieldType,
@@ -605,6 +617,7 @@ export const knowledgeBaseServerTool: BaseServerTool<KnowledgeBaseArgs, Knowledg
success: true,
message: `Tag "${deleted.displayName}" deleted successfully. All document/chunk references cleared.`,
data: {
knowledgeBaseId: args.knowledgeBaseId,
tagSlot: deleted.tagSlot,
displayName: deleted.displayName,
},