import { SWEEP_CONTENDED, sweepHeld, swept } from "../strings/sweep.strings.ts"; import { appendFileSync, existsSync, readFileSync, writeFileSync } from "node:fs"; import { itemSpans, seenItems, spanText, withoutSpans } from "../resolvers/sweep.resolver.ts"; import { resolve } from "node:path"; import { wasDelivered } from "../registries/snapshot.registry.ts"; const HEADING = "\n## board sweep: items every addressee has written past\n\n"; export interface SweepOutcome { readonly swept: readonly string[]; readonly message: string; } export const runSweep = function runSweep(repoRoot: string, absolute: string, archive: string): SweepOutcome { if (!existsSync(absolute)) { return { message: "", swept: [] }; } const before = readFileSync(absolute, "utf8"); const written = seenItems(itemSpans(before)); if (written.length === 0) { return { message: "", swept: [] }; } const held: string[] = []; const seen: typeof written = []; for (const span of written) { const unread = span.to.filter((reader) => !wasDelivered(repoRoot, reader, span.key)); if (unread.length === 0) { seen.push(span); continue; } held.push(`${span.key} → ${unread.join(", ")}`); } const holdNote = held.length === 0 ? "" : sweepHeld(held); if (seen.length === 0) { return { message: holdNote, swept: [] }; } const entries = seen.map( (span) => `\n### ${span.key} — to ${span.to.join(", ")} · every addressee was handed this item in a delivered read\n\n${spanText(before, span)}\n`, ); const witness = readFileSync(absolute, "utf8"); if (witness !== before) { return { message: SWEEP_CONTENDED, swept: [] }; } const target = resolve(repoRoot, archive); appendFileSync(target, existsSync(target) ? entries.join("") : `${HEADING}${entries.join("")}`, "utf8"); writeFileSync(absolute, withoutSpans(before, seen), "utf8"); const keys = seen.map((span) => span.key); return { message: `${holdNote}${swept(keys)}`, swept: keys }; };