diff --git a/packages/core/src/scheduler/tool-executor.ts b/packages/core/src/scheduler/tool-executor.ts index 53643e7c0f..923299abe4 100644 --- a/packages/core/src/scheduler/tool-executor.ts +++ b/packages/core/src/scheduler/tool-executor.ts @@ -403,31 +403,10 @@ export class ToolExecutor { ); } } - } else if (typeof content === 'string' && toolName === SHELL_TOOL_NAME) { - const threshold = this.config.getTruncateToolOutputThreshold(); - - if (threshold > 0 && content.length > threshold) { - const originalContentLength = content.length; - const { outputFile: savedPath } = await saveTruncatedToolOutput( - content, - toolName, - callId, - this.config.storage.getProjectTempDir(), - this.config.getSessionId(), - ); - outputFile = savedPath; - content = formatTruncatedToolOutput(content, outputFile, threshold); - - logToolOutputTruncated( - this.config, - new ToolOutputTruncatedEvent(call.request.prompt_id, { - toolName, - originalContentLength, - truncatedContentLength: content.length, - threshold, - }), - ); - } + } else { + const truncated = await this.truncateOutputIfNeeded(call, content); + content = truncated.truncatedContent; + outputFile = truncated.outputFile; } const response = convertToFunctionResponse( diff --git a/packages/core/src/services/toolOutputMaskingService.ts b/packages/core/src/services/toolOutputMaskingService.ts index e275983db5..c555957e0b 100644 --- a/packages/core/src/services/toolOutputMaskingService.ts +++ b/packages/core/src/services/toolOutputMaskingService.ts @@ -48,6 +48,18 @@ export interface MaskingResult { tokensSaved: number; } +interface HasOutputFile { + outputFile: string; +} + +function hasOutputFile(obj: unknown): obj is HasOutputFile { + if (typeof obj !== 'object' || obj === null || !('outputFile' in obj)) { + return false; + } + const val = (obj as Record)['outputFile']; + return typeof val === 'string'; +} + /** * Service to manage context window efficiency by masking bulky tool outputs (Tool Output Masking). * @@ -188,11 +200,8 @@ export class ToolOutputMaskingService { let fileSizeMB = '0.00'; let totalLines = 0; - if ( - typeof originalResponse['outputFile'] === 'string' && - originalResponse['outputFile'] - ) { - filePath = originalResponse['outputFile']; + if (hasOutputFile(originalResponse) && originalResponse.outputFile) { + filePath = originalResponse.outputFile; try { const stats = await fsPromises.stat(filePath); fileSizeMB = (stats.size / 1024 / 1024).toFixed(2);