import fs from "node:fs"; import type { PaperclipConfig } from "../config/schema.js"; import type { CheckResult } from "./index.js"; import { resolveRuntimeLikePath } from "./path-resolver.js"; export function storageCheck(config: PaperclipConfig, configPath?: string): CheckResult { if (config.storage.provider === "local_disk") { const baseDir = resolveRuntimeLikePath(config.storage.localDisk.baseDir, configPath); if (!fs.existsSync(baseDir)) { fs.mkdirSync(baseDir, { recursive: true }); } try { fs.accessSync(baseDir, fs.constants.W_OK); return { name: "Storage", status: "pass", message: `Local disk storage is writable: ${baseDir}`, }; } catch { return { name: "Storage", status: "fail", message: `Local storage directory is not writable: ${baseDir}`, canRepair: false, repairHint: "Check file permissions for storage.localDisk.baseDir", }; } } const bucket = config.storage.s3.bucket.trim(); const region = config.storage.s3.region.trim(); if (!bucket || !region) { return { name: "Storage", status: "fail", message: "S3 storage requires non-empty bucket and region", canRepair: false, repairHint: "Run `paperclipai configure --section storage`", }; } return { name: "Storage", status: "warn", message: `S3 storage configured (bucket=${bucket}, region=${region}). Reachability check is skipped in doctor.`, canRepair: false, repairHint: "Verify credentials and endpoint in deployment environment", }; }