persistToolResult method

Future<Object> persistToolResult(
  1. dynamic content,
  2. String toolUseId
)

Persist a tool result to disk and return information about the persisted file.

Implementation

Future<Object> persistToolResult(dynamic content, String toolUseId) async {
  final isJson = content is List;

  // Check for non-text content.
  if (isJson) {
    final hasNonTextContent = (content).any(
      (block) => block is Map && block['type'] != 'text',
    );
    if (hasNonTextContent) {
      return const PersistToolResultError(
        error: 'Cannot persist tool results containing non-text content',
      );
    }
  }

  await ensureToolResultsDir();
  final filepath = getToolResultPath(toolUseId, isJson: isJson);
  final contentStr = isJson
      ? const JsonEncoder.withIndent('  ').convert(content)
      : content.toString();

  try {
    final file = File(filepath);
    if (!await file.exists()) {
      await file.writeAsString(contentStr);
    }
  } catch (e) {
    return PersistToolResultError(error: _getFileSystemErrorMessage(e));
  }

  final preview = generatePreview(contentStr, previewSizeBytes);

  return PersistedToolResult(
    filepath: filepath,
    originalSize: contentStr.length,
    isJson: isJson,
    preview: preview.preview,
    hasMore: preview.hasMore,
  );
}