Skip to content

Commit 61f0868

Browse files
committed
fix(copilot): preserve organization folder delegation restrictions
1 parent 6963b6e commit 61f0868

2 files changed

Lines changed: 24 additions & 5 deletions

File tree

apps/sim/lib/knowledge/application/operations.test.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -212,14 +212,24 @@ describe('knowledge operation registry', () => {
212212
).toBe(true)
213213
})
214214

215-
it('allows delegated callers only on semantic knowledge and document operations', () => {
215+
it('allows Copilot folder discovery without delegating folder mutations or upload completion', () => {
216216
expect(knowledgeOperations.list.principalKinds).toContain('delegated')
217217
expect(knowledgeOperations.search.principalKinds).toContain('delegated')
218218
expect(knowledgeOperations.uploadDocument.principalKinds).toContain('delegated')
219219
expect(knowledgeOperations.updateDocument.principalKinds).toContain('delegated')
220220
expect(knowledgeOperations.updateTag.principalKinds).toContain('delegated')
221221
expect(knowledgeOperations.syncConnector.principalKinds).toContain('delegated')
222-
expect(knowledgeOperations.listFolders.principalKinds).not.toContain('delegated')
222+
expect(knowledgeOperations.listFolders.principalKinds).toContain('delegated')
223+
expect(knowledgeOperations.listFolders.delegatedServices).toEqual(['copilot'])
224+
expect(knowledgeOperations.listFolders.minimumRole).toBe('read')
225+
for (const operation of [
226+
knowledgeOperations.createFolder,
227+
knowledgeOperations.relocateFolder,
228+
knowledgeOperations.deleteFolder,
229+
]) {
230+
expect(operation.principalKinds).not.toContain('delegated')
231+
expect(operation.delegatedServices).toBeUndefined()
232+
}
223233
expect(knowledgeOperations.uploadComplete.principalKinds).not.toContain('delegated')
224234
expect(knowledgeOperations.list.delegatedServices).toEqual(['copilot'])
225235
expect(knowledgeOperations.search.delegatedServices).toEqual(['copilot', 'executor'])

apps/sim/lib/knowledge/application/operations.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,19 @@ export type ScopedKnowledgeOperation<O extends WorkspaceOperation = WorkspaceOpe
1515
readonly organizationOperation: OrganizationOperation
1616
}
1717

18+
interface KnowledgeOperationOptions {
19+
organizationDelegation?: 'deny'
20+
}
21+
1822
/** Binds organization policy to the same semantic operation declared for workspace access. */
1923
function defineKnowledgeOperation<const O extends WorkspaceOperation>(
20-
operation: O
24+
operation: O,
25+
options?: KnowledgeOperationOptions
2126
): ScopedKnowledgeOperation<O> {
2227
const supportsOrganizationDelegation =
23-
operation.minimumRole === 'read' && operation.delegatedServices?.includes('copilot')
28+
options?.organizationDelegation !== 'deny' &&
29+
operation.minimumRole === 'read' &&
30+
operation.delegatedServices?.includes('copilot')
2431
const organizationOperation = defineOrganizationOperation({
2532
id: operation.id,
2633
capability: operation.capability,
@@ -258,7 +265,9 @@ export const knowledgeOperations = {
258265
workspaceApiKey: 'allow',
259266
capability: 'knowledge.use',
260267
...ALL_PRINCIPAL_POLICY,
261-
})
268+
}),
269+
/** Folder mentions resolve workspace folders; organization delegation stays disabled. */
270+
{ organizationDelegation: 'deny' }
262271
),
263272
createFolder: defineKnowledgeOperation(
264273
defineWorkspaceOperation({

0 commit comments

Comments
 (0)