99} from '@/lib/copilot/application/execute-file-use-case'
1010import {
1111 executeCopilotKnowledgeUseCase ,
12+ messageForCopilotKnowledgeError ,
1213 resolveCopilotKnowledgePrincipal ,
1314} from '@/lib/copilot/application/execute-knowledge-use-case'
1415import { messageForCopilotFileError } from '@/lib/copilot/auth/file-delegation'
@@ -89,6 +90,14 @@ class KnowledgeVfsInfrastructureError extends Error {
8990 }
9091}
9192
93+ function messageForKnowledgeVfsError ( error : unknown , forbiddenMessage : string ) : string {
94+ const classified = asOrchestrationError ( error )
95+ if ( ! classified || classified . code === 'internal' ) {
96+ throw new KnowledgeVfsInfrastructureError ( error )
97+ }
98+ return classified . code === 'forbidden' ? forbiddenMessage : messageForCopilotKnowledgeError ( error )
99+ }
100+
92101/** Top-level VFS segment of a raw (possibly encoded) path. */
93102function topLevelSegment ( path : string ) : string {
94103 return path . trim ( ) . replace ( / ^ \/ + / , '' ) . split ( '/' ) [ 0 ] ?? ''
@@ -861,11 +870,10 @@ async function renameFlatResource(
861870 } )
862871 knowledgeBases = result . knowledgeBases
863872 } catch ( error ) {
864- const classified = asOrchestrationError ( error )
865- if ( classified && classified . code !== 'internal' ) {
866- return { success : false , error : 'Write access required to rename knowledge bases' }
873+ return {
874+ success : false ,
875+ error : messageForKnowledgeVfsError ( error , 'Write access required to rename knowledge bases' ) ,
867876 }
868- throw new KnowledgeVfsInfrastructureError ( error )
869877 }
870878 const match = knowledgeBases
871879 . map ( ( { knowledgeBase } ) => knowledgeBase )
@@ -882,14 +890,13 @@ async function renameFlatResource(
882890 source : 'agent' ,
883891 } )
884892 } catch ( error ) {
885- const classified = asOrchestrationError ( error )
886- if ( classified && classified . code !== 'internal' ) {
887- return {
888- success : false ,
889- error : `Write access required to rename knowledge base "${ match . name } "` ,
890- }
893+ return {
894+ success : false ,
895+ error : messageForKnowledgeVfsError (
896+ error ,
897+ `Write access required to rename knowledge base "${ match . name } "`
898+ ) ,
891899 }
892- throw new KnowledgeVfsInfrastructureError ( error )
893900 }
894901 logger . info ( 'Renamed knowledge base via mv' , { knowledgeBaseId : match . id , workspaceId } )
895902 return buildResult ( verb , [
@@ -1193,15 +1200,11 @@ async function removeKnowledgeBasePath(
11931200 } )
11941201 knowledgeBases = result . knowledgeBases
11951202 } catch ( error ) {
1196- const classified = asOrchestrationError ( error )
1197- if ( classified && classified . code !== 'internal' ) {
1198- return {
1199- from : path ,
1200- kind : 'knowledge_base' ,
1201- error : 'Write access required to delete knowledge bases' ,
1202- }
1203+ return {
1204+ from : path ,
1205+ kind : 'knowledge_base' ,
1206+ error : messageForKnowledgeVfsError ( error , 'Write access required to delete knowledge bases' ) ,
12031207 }
1204- throw new KnowledgeVfsInfrastructureError ( error )
12051208 }
12061209 const match = knowledgeBases
12071210 . map ( ( { knowledgeBase } ) => knowledgeBase )
@@ -1216,16 +1219,15 @@ async function removeKnowledgeBasePath(
12161219 source : 'agent' ,
12171220 } )
12181221 } catch ( error ) {
1219- const classified = asOrchestrationError ( error )
1220- if ( classified && classified . code !== 'internal' ) {
1221- return {
1222- from : path ,
1223- kind : 'knowledge_base' ,
1224- id : match . id ,
1225- error : `Write access required to delete knowledge base "${ match . name } "` ,
1226- }
1222+ return {
1223+ from : path ,
1224+ kind : 'knowledge_base' ,
1225+ id : match . id ,
1226+ error : messageForKnowledgeVfsError (
1227+ error ,
1228+ `Write access required to delete knowledge base "${ match . name } "`
1229+ ) ,
12271230 }
1228- throw new KnowledgeVfsInfrastructureError ( error )
12291231 }
12301232 PlatformEvents . knowledgeBaseDeleted ( { knowledgeBaseId : match . id } )
12311233 logger . info ( 'Deleted knowledge base via rm' , { knowledgeBaseId : match . id , workspaceId } )
0 commit comments