import { appStorageKey } from "@arronqzy/blueprint-dsl"; export type ExecutionLogSettings = { retentionDays: number; autoSave: boolean; /** IndexedDB 中最多保留的日志条数 */ maxSavedRuns: number; }; const SETTINGS_KEY = "arronqzy-blueprint-execution-log-settings"; export const DEFAULT_EXECUTION_LOG_SETTINGS: ExecutionLogSettings = { retentionDays: 7, autoSave: true, maxSavedRuns: 80, }; export function readExecutionLogSettings( nameSpace?: string | null ): ExecutionLogSettings { try { const raw = localStorage.getItem(appStorageKey(SETTINGS_KEY, nameSpace)); if (!raw) return { ...DEFAULT_EXECUTION_LOG_SETTINGS }; const parsed = JSON.parse(raw) as Partial; return { retentionDays: typeof parsed.retentionDays === "number" && parsed.retentionDays > 0 ? parsed.retentionDays : DEFAULT_EXECUTION_LOG_SETTINGS.retentionDays, autoSave: typeof parsed.autoSave === "boolean" ? parsed.autoSave : DEFAULT_EXECUTION_LOG_SETTINGS.autoSave, maxSavedRuns: typeof parsed.maxSavedRuns === "number" && parsed.maxSavedRuns > 0 ? Math.floor(parsed.maxSavedRuns) : DEFAULT_EXECUTION_LOG_SETTINGS.maxSavedRuns, }; } catch { return { ...DEFAULT_EXECUTION_LOG_SETTINGS }; } } export function writeExecutionLogSettings( settings: ExecutionLogSettings, nameSpace?: string | null ) { try { localStorage.setItem( appStorageKey(SETTINGS_KEY, nameSpace), JSON.stringify(settings) ); } catch { // ignore storage errors } } export function retentionCutoffMs(retentionDays: number) { return Date.now() - retentionDays * 24 * 60 * 60 * 1000; }