From 37900988eb44d20146b492d258e7e86f85718e73 Mon Sep 17 00:00:00 2001 From: Vikhyath Mondreti Date: Mon, 26 Jan 2026 16:27:07 -0800 Subject: [PATCH] fix(kb): workspace id required for creation (#3001) * fix(kb): workspace id required for creation * fix tests --- apps/sim/app/api/knowledge/route.test.ts | 21 ++++++++++++++++++- apps/sim/app/api/knowledge/route.ts | 2 +- .../tools/server/knowledge/knowledge-base.ts | 7 +++++++ apps/sim/lib/copilot/tools/shared/schemas.ts | 2 +- apps/sim/lib/knowledge/service.ts | 12 +++++------ apps/sim/lib/knowledge/types.ts | 2 +- 6 files changed, 35 insertions(+), 11 deletions(-) diff --git a/apps/sim/app/api/knowledge/route.test.ts b/apps/sim/app/api/knowledge/route.test.ts index 2a59f4540..bd93fab3b 100644 --- a/apps/sim/app/api/knowledge/route.test.ts +++ b/apps/sim/app/api/knowledge/route.test.ts @@ -16,6 +16,10 @@ mockKnowledgeSchemas() mockDrizzleOrm() mockConsoleLogger() +vi.mock('@/lib/workspaces/permissions/utils', () => ({ + getUserEntityPermissions: vi.fn().mockResolvedValue({ role: 'owner' }), +})) + describe('Knowledge Base API Route', () => { const mockAuth$ = mockAuth() @@ -86,6 +90,7 @@ describe('Knowledge Base API Route', () => { const validKnowledgeBaseData = { name: 'Test Knowledge Base', description: 'Test description', + workspaceId: 'test-workspace-id', chunkingConfig: { maxSize: 1024, minSize: 100, @@ -133,11 +138,25 @@ describe('Knowledge Base API Route', () => { expect(data.details).toBeDefined() }) + it('should require workspaceId', async () => { + mockAuth$.mockAuthenticatedUser() + + const req = createMockRequest('POST', { name: 'Test KB' }) + const { POST } = await import('@/app/api/knowledge/route') + const response = await POST(req) + const data = await response.json() + + expect(response.status).toBe(400) + expect(data.error).toBe('Invalid request data') + expect(data.details).toBeDefined() + }) + it('should validate chunking config constraints', async () => { mockAuth$.mockAuthenticatedUser() const invalidData = { name: 'Test KB', + workspaceId: 'test-workspace-id', chunkingConfig: { maxSize: 100, // 100 tokens = 400 characters minSize: 500, // Invalid: minSize (500 chars) > maxSize (400 chars) @@ -157,7 +176,7 @@ describe('Knowledge Base API Route', () => { it('should use default values for optional fields', async () => { mockAuth$.mockAuthenticatedUser() - const minimalData = { name: 'Test KB' } + const minimalData = { name: 'Test KB', workspaceId: 'test-workspace-id' } const req = createMockRequest('POST', minimalData) const { POST } = await import('@/app/api/knowledge/route') const response = await POST(req) diff --git a/apps/sim/app/api/knowledge/route.ts b/apps/sim/app/api/knowledge/route.ts index 07d439fe8..9aaf52b5a 100644 --- a/apps/sim/app/api/knowledge/route.ts +++ b/apps/sim/app/api/knowledge/route.ts @@ -19,7 +19,7 @@ const logger = createLogger('KnowledgeBaseAPI') const CreateKnowledgeBaseSchema = z.object({ name: z.string().min(1, 'Name is required'), description: z.string().optional(), - workspaceId: z.string().optional(), + workspaceId: z.string().min(1, 'Workspace ID is required'), embeddingModel: z.literal('text-embedding-3-small').default('text-embedding-3-small'), embeddingDimension: z.literal(1536).default(1536), chunkingConfig: z diff --git a/apps/sim/lib/copilot/tools/server/knowledge/knowledge-base.ts b/apps/sim/lib/copilot/tools/server/knowledge/knowledge-base.ts index 853638d89..d6d5af7ba 100644 --- a/apps/sim/lib/copilot/tools/server/knowledge/knowledge-base.ts +++ b/apps/sim/lib/copilot/tools/server/knowledge/knowledge-base.ts @@ -37,6 +37,13 @@ export const knowledgeBaseServerTool: BaseServerTool