/** * BaselineStore — load/save one diff-view baseline JSON per document (F6 §6.3). * The CoauthorStore shape (src/store.ts): vscode-free (Node fs only, unit- * testable), one file per storage key. INV-19: the storage dir is VS Code's * per-extension GLOBAL storage, NEVER the repo — so the baseline can never be * committed, merged, or read by another rung. F6 works on *any* file, so the * key is a hash of the document URI (the controller derives it), not a * workspace-relative path; an untitled buffer has no durable identity and is * never persisted here (in-memory only — see DiffViewController). */ import * as fs from "node:fs"; import * as path from "node:path"; export type BaselineReason = "opened" | "machine-landing" | "pinned"; export interface Baseline { /** the document URI (the identity the key is derived from) — for round-trip/debug. */ uri: string; /** full document text captured at the epoch (from the buffer, not disk — §6.3). */ text: string; capturedAt: string; reason: BaselineReason; } export class BaselineStore { /** @param storageDir absolute VS Code GLOBAL-storage dir (context.globalStorageUri.fsPath). */ constructor(private readonly storageDir: string) {} /** `/baselines/.json` — `key` is a filesystem-safe hash (§6.3). */ baselinePath(key: string): string { return path.join(this.storageDir, "baselines", `${key}.json`); } load(key: string): Baseline | null { const p = this.baselinePath(key); if (!fs.existsSync(p)) return null; return JSON.parse(fs.readFileSync(p, "utf8")) as Baseline; } /** Newest epoch wins — overwrite in place, no history (state-not-history, the F3/F4 precedent). */ save(key: string, baseline: Baseline): void { const p = this.baselinePath(key); fs.mkdirSync(path.dirname(p), { recursive: true }); fs.writeFileSync(p, JSON.stringify(baseline, null, 2) + "\n", "utf8"); } }