From 974f3b9eff551f8a5bad74eea0b7f5d022479580 Mon Sep 17 00:00:00 2001 From: Vikhyath Mondreti Date: Sun, 25 Jan 2026 14:40:25 -0800 Subject: [PATCH 1/2] fix(kb): workspace id required for creation --- apps/sim/app/api/knowledge/route.ts | 2 +- .../copilot/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 +- 5 files changed, 15 insertions(+), 10 deletions(-) diff --git a/apps/sim/app/api/knowledge/route.ts b/apps/sim/app/api/knowledge/route.ts index 07d439fe8c..9aaf52b5ab 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 853638d893..d6d5af7ba1 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 Date: Sun, 25 Jan 2026 18:29:56 -0800 Subject: [PATCH 2/2] fix tests --- apps/sim/app/api/knowledge/route.test.ts | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/apps/sim/app/api/knowledge/route.test.ts b/apps/sim/app/api/knowledge/route.test.ts index 2a59f45409..bd93fab3b3 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)