diff --git a/src/servers/api/upload/upload.ts b/src/servers/api/upload/upload.ts index b7cb970f..c932ec6f 100644 --- a/src/servers/api/upload/upload.ts +++ b/src/servers/api/upload/upload.ts @@ -2,6 +2,7 @@ import { createRouter } from '../../create-router'; import { mkdir } from 'node:fs/promises'; import { join } from 'node:path'; import { getTmpAttachmentsDir, getAttachmentsDir } from '@@/data-path'; +import { writeAtomic } from '@@/write-atomic'; const MAX_FILE_SIZE = 5 * 1024 * 1024; // 5 MB /** PDFs never enter a prompt whole — the agent reads them from disk — so the ceiling is storage, not context. */ @@ -49,8 +50,7 @@ uploadRouter.post('/', async (ctx) => { saveDir = getTmpAttachmentsDir(user.email); } - await mkdir(saveDir, { recursive: true }); - await Bun.write(join(saveDir, filename), buffer); + await writeAtomic(join(saveDir, filename), buffer); // Only an image gets a data URL. Building one for a PDF would mean carrying megabytes through the // browser for a preview nothing renders.