uploadPreviewIfNeeded
internal suspend fun AssetRepository.uploadPreviewIfNeeded(preview: AssetContent.Preview?, conversationId: ConversationId): AssetContent.Preview?
Optional previews fail open; cancellation still propagates from repository calls.