Skip to content

Commit 8caaf01

Browse files
TheodoreSpeaksTheodore Li
andauthored
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>
1 parent 668b948 commit 8caaf01

File tree

4 files changed

+103
-2
lines changed

4 files changed

+103
-2
lines changed

apps/sim/app/workspace/[workspaceId]/home/components/mothership-view/components/resource-registry/resource-registry.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ const RESOURCE_INVALIDATORS: Record<
138138
knowledgebase: (qc, _wId, id) => {
139139
qc.invalidateQueries({ queryKey: knowledgeKeys.lists() })
140140
qc.invalidateQueries({ queryKey: knowledgeKeys.detail(id) })
141+
qc.invalidateQueries({ queryKey: knowledgeKeys.tagDefinitions(id) })
141142
},
142143
}
143144

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
/**
2+
* @vitest-environment node
3+
*/
4+
import { describe, expect, it } from 'vitest'
5+
import { extractResourcesFromToolResult } from './resource-extraction'
6+
7+
describe('extractResourcesFromToolResult', () => {
8+
it('uses the knowledge base id for knowledge_base tag mutations', () => {
9+
const resources = extractResourcesFromToolResult(
10+
'knowledge_base',
11+
{
12+
operation: 'update_tag',
13+
args: {
14+
knowledgeBaseId: 'kb_123',
15+
tagDefinitionId: 'tag_456',
16+
},
17+
},
18+
{
19+
success: true,
20+
message: 'Tag updated successfully',
21+
data: {
22+
id: 'tag_456',
23+
displayName: 'Priority',
24+
fieldType: 'text',
25+
},
26+
}
27+
)
28+
29+
expect(resources).toEqual([
30+
{
31+
type: 'knowledgebase',
32+
id: 'kb_123',
33+
title: 'Knowledge Base',
34+
},
35+
])
36+
})
37+
38+
it('uses knowledgeBaseId from the tool result when update_tag args omit it', () => {
39+
const resources = extractResourcesFromToolResult(
40+
'knowledge_base',
41+
{
42+
operation: 'update_tag',
43+
args: {
44+
tagDefinitionId: 'tag_456',
45+
},
46+
},
47+
{
48+
success: true,
49+
message: 'Tag updated successfully',
50+
data: {
51+
id: 'tag_456',
52+
knowledgeBaseId: 'kb_123',
53+
displayName: 'Priority',
54+
fieldType: 'text',
55+
},
56+
}
57+
)
58+
59+
expect(resources).toEqual([
60+
{
61+
type: 'knowledgebase',
62+
id: 'kb_123',
63+
title: 'Knowledge Base',
64+
},
65+
])
66+
})
67+
68+
it('does not create resources for read-only knowledge base tag operations', () => {
69+
const resources = extractResourcesFromToolResult(
70+
'knowledge_base',
71+
{
72+
operation: 'list_tags',
73+
args: {
74+
knowledgeBaseId: 'kb_123',
75+
},
76+
},
77+
{
78+
success: true,
79+
data: [],
80+
}
81+
)
82+
83+
expect(resources).toEqual([])
84+
})
85+
})

apps/sim/lib/copilot/resource-extraction.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,11 +155,13 @@ export function extractResourcesFromToolResult(
155155
case 'knowledge_base': {
156156
if (READ_ONLY_KB_OPS.has(getOperation(params) ?? '')) return []
157157

158+
const args = asRecord(params?.args)
158159
const kbId =
159-
(data.id as string) ??
160+
(args.knowledgeBaseId as string) ??
161+
(params?.knowledgeBaseId as string) ??
160162
(result.knowledgeBaseId as string) ??
161163
(data.knowledgeBaseId as string) ??
162-
(params?.knowledgeBaseId as string)
164+
(data.id as string)
163165
if (kbId) {
164166
const kbName =
165167
(data.name as string) ?? (result.knowledgeBaseName as string) ?? 'Knowledge Base'

apps/sim/lib/copilot/tools/server/knowledge/knowledge-base.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import {
2828
deleteTagDefinition,
2929
getDocumentTagDefinitions,
3030
getNextAvailableSlot,
31+
getTagDefinitionById,
3132
getTagUsageStats,
3233
updateTagDefinition,
3334
} from '@/lib/knowledge/tags/service'
@@ -525,6 +526,7 @@ export const knowledgeBaseServerTool: BaseServerTool<KnowledgeBaseArgs, Knowledg
525526
message: `Tag "${newTag.displayName}" created successfully`,
526527
data: {
527528
id: newTag.id,
529+
knowledgeBaseId: args.knowledgeBaseId,
528530
tagSlot: newTag.tagSlot,
529531
displayName: newTag.displayName,
530532
fieldType: newTag.fieldType,
@@ -551,12 +553,21 @@ export const knowledgeBaseServerTool: BaseServerTool<KnowledgeBaseArgs, Knowledg
551553
}
552554
}
553555

556+
const existingTag = await getTagDefinitionById(args.tagDefinitionId)
557+
if (!existingTag) {
558+
return {
559+
success: false,
560+
message: `Tag definition with ID "${args.tagDefinitionId}" not found`,
561+
}
562+
}
563+
554564
const requestId = crypto.randomUUID().slice(0, 8)
555565
assertNotAborted()
556566
const updatedTag = await updateTagDefinition(args.tagDefinitionId, updateData, requestId)
557567

558568
logger.info('Tag definition updated via copilot', {
559569
tagId: args.tagDefinitionId,
570+
knowledgeBaseId: existingTag.knowledgeBaseId,
560571
userId: context.userId,
561572
})
562573

@@ -565,6 +576,7 @@ export const knowledgeBaseServerTool: BaseServerTool<KnowledgeBaseArgs, Knowledg
565576
message: `Tag "${updatedTag.displayName}" updated successfully`,
566577
data: {
567578
id: updatedTag.id,
579+
knowledgeBaseId: existingTag.knowledgeBaseId,
568580
tagSlot: updatedTag.tagSlot,
569581
displayName: updatedTag.displayName,
570582
fieldType: updatedTag.fieldType,
@@ -605,6 +617,7 @@ export const knowledgeBaseServerTool: BaseServerTool<KnowledgeBaseArgs, Knowledg
605617
success: true,
606618
message: `Tag "${deleted.displayName}" deleted successfully. All document/chunk references cleared.`,
607619
data: {
620+
knowledgeBaseId: args.knowledgeBaseId,
608621
tagSlot: deleted.tagSlot,
609622
displayName: deleted.displayName,
610623
},

0 commit comments

Comments
 (0)