11import { createLogger } from '@sim/logger'
2+ import { isUserFile } from '@/lib/core/utils/user-file'
23import { uploadExecutionFile , uploadFileFromRawData } from '@/lib/uploads/contexts/execution'
34import { downloadFileFromUrl } from '@/lib/uploads/utils/file-utils.server'
45import type { ExecutionContext , UserFile } from '@/executor/types'
@@ -94,31 +95,39 @@ export class FileToolProcessor {
9495 }
9596
9697 /**
97- * Convert various file data formats to UserFile by storing in execution filesystem
98+ * Convert various file data formats to UserFile by storing in execution filesystem.
99+ * If the input is already a UserFile, returns it unchanged.
98100 */
99101 private static async processFileData (
100- fileData : ToolFileData ,
102+ fileData : ToolFileData | UserFile ,
101103 context : ExecutionContext
102104 ) : Promise < UserFile > {
105+ // If already a UserFile (e.g., from tools that handle their own file storage),
106+ // return it directly without re-processing
107+ if ( isUserFile ( fileData ) ) {
108+ return fileData as UserFile
109+ }
110+
111+ const data = fileData as ToolFileData
103112 try {
104113 let buffer : Buffer | null = null
105114
106- if ( Buffer . isBuffer ( fileData . data ) ) {
107- buffer = fileData . data
115+ if ( Buffer . isBuffer ( data . data ) ) {
116+ buffer = data . data
108117 } else if (
109- fileData . data &&
110- typeof fileData . data === 'object' &&
111- 'type' in fileData . data &&
112- 'data' in fileData . data
118+ data . data &&
119+ typeof data . data === 'object' &&
120+ 'type' in data . data &&
121+ 'data' in data . data
113122 ) {
114- const serializedBuffer = fileData . data as { type : string ; data : number [ ] }
123+ const serializedBuffer = data . data as { type : string ; data : number [ ] }
115124 if ( serializedBuffer . type === 'Buffer' && Array . isArray ( serializedBuffer . data ) ) {
116125 buffer = Buffer . from ( serializedBuffer . data )
117126 } else {
118- throw new Error ( `Invalid serialized buffer format for ${ fileData . name } ` )
127+ throw new Error ( `Invalid serialized buffer format for ${ data . name } ` )
119128 }
120- } else if ( typeof fileData . data === 'string' && fileData . data ) {
121- let base64Data = fileData . data
129+ } else if ( typeof data . data === 'string' && data . data ) {
130+ let base64Data = data . data
122131
123132 if ( base64Data . includes ( '-' ) || base64Data . includes ( '_' ) ) {
124133 base64Data = base64Data . replace ( / - / g, '+' ) . replace ( / _ / g, '/' )
@@ -127,13 +136,13 @@ export class FileToolProcessor {
127136 buffer = Buffer . from ( base64Data , 'base64' )
128137 }
129138
130- if ( ! buffer && fileData . url ) {
131- buffer = await downloadFileFromUrl ( fileData . url )
139+ if ( ! buffer && data . url ) {
140+ buffer = await downloadFileFromUrl ( data . url )
132141 }
133142
134143 if ( buffer ) {
135144 if ( buffer . length === 0 ) {
136- throw new Error ( `File '${ fileData . name } ' has zero bytes` )
145+ throw new Error ( `File '${ data . name } ' has zero bytes` )
137146 }
138147
139148 return await uploadExecutionFile (
@@ -143,23 +152,23 @@ export class FileToolProcessor {
143152 executionId : context . executionId || '' ,
144153 } ,
145154 buffer ,
146- fileData . name ,
147- fileData . mimeType ,
155+ data . name ,
156+ data . mimeType ,
148157 context . userId
149158 )
150159 }
151160
152- if ( ! fileData . data ) {
161+ if ( ! data . data ) {
153162 throw new Error (
154- `File data for '${ fileData . name } ' must have either 'data' (Buffer/base64) or 'url' property`
163+ `File data for '${ data . name } ' must have either 'data' (Buffer/base64) or 'url' property`
155164 )
156165 }
157166
158167 return uploadFileFromRawData (
159168 {
160- name : fileData . name ,
161- data : fileData . data ,
162- mimeType : fileData . mimeType ,
169+ name : data . name ,
170+ data : data . data ,
171+ mimeType : data . mimeType ,
163172 } ,
164173 {
165174 workspaceId : context . workspaceId || '' ,
@@ -169,7 +178,7 @@ export class FileToolProcessor {
169178 context . userId
170179 )
171180 } catch ( error ) {
172- logger . error ( `Error processing file data for '${ fileData . name } ':` , error )
181+ logger . error ( `Error processing file data for '${ data . name } ':` , error )
173182 throw error
174183 }
175184 }
0 commit comments