import { mkdir, readFile, writeFile, access, chmod } from 'node:fs/promises'; import type { AssemblinkerCache, LinkEntry, SourceRun } from './types.js'; import { CACHE_PATH, CONFIG_DIR } from './paths.js'; const version = 1 as const; export async function loadCache(): Promise { try { await access(CACHE_PATH); const raw = await readFile(CACHE_PATH, 'utf8'); return JSON.parse(raw) as AssemblinkerCache; } catch { return createEmptyCache(); } } export function createEmptyCache(): AssemblinkerCache { return { version, cards: {}, links: {}, runs: {} }; } export async function saveCache(cache: AssemblinkerCache): Promise { await mkdir(CONFIG_DIR, { recursive: true, mode: 0o700 }); await writeFile(CACHE_PATH, JSON.stringify(cache, null, 2), { mode: 0o600 }); try { await chmod(CACHE_PATH, 0o600); } catch {} } export function getLinkEntry(cache: AssemblinkerCache, url: string): LinkEntry | undefined { return cache.links[url]; } export function setLinkEntry(cache: AssemblinkerCache, url: string, entry: LinkEntry): void { cache.links[url] = entry; } export function getSourceRun(cache: AssemblinkerCache, sourceUrl: string): SourceRun { if (!cache.runs[sourceUrl]) { cache.runs[sourceUrl] = { links: {}, updatedAt: new Date().toISOString() }; } return cache.runs[sourceUrl]; } export function isLinked(cache: AssemblinkerCache, sourceUrl: string, targetUrl: string): boolean { return !!cache.runs[sourceUrl]?.links[targetUrl]?.connected; }