# tools/core/runners/sweep.runner.ts

> 47 lines of code and 13 definitions.

Tree: Coordination tree
Language: typescript
Canonical: https://banes-lab.com/anatomy/coordination#file-coordination-tools-core-runners-sweep-runner-ts
Source text: https://banes-lab.com/assets/sources/source.52c7f2801b0aa1778a4922862bfc7f47a1033ea0e4a7603c9beebf0f899f45e0.generated.txt

## Definitions

- `runSweep` (lexical_declaration, line 15, exported)
- `HEADING` (lexical_declaration, line 8)
- `SweepOutcome` (interface_declaration, line 10, exported)
- `before` (lexical_declaration, line 20, exported)
- `written` (lexical_declaration, line 22, exported)
- `held` (lexical_declaration, line 27, exported)
- `seen` (lexical_declaration, line 28, exported)
- `unread` (lexical_declaration, line 31, exported)
- `holdNote` (lexical_declaration, line 39, exported)
- `entries` (lexical_declaration, line 45, exported)
- `witness` (lexical_declaration, line 50, exported)
- `target` (lexical_declaration, line 55, exported)
- `keys` (lexical_declaration, line 60, exported)

## Uses

- [tools/core/resolvers/sweep.resolver.ts](https://banes-lab.com/source/coordination/tools/core/resolvers/sweep.resolver.ts.md)
- [tools/core/strings/sweep.strings.ts](https://banes-lab.com/source/coordination/tools/core/strings/sweep.strings.ts.md)

## Used by

- [tools/core/entrypoints/board.entrypoint.ts](https://banes-lab.com/source/coordination/tools/core/entrypoints/board.entrypoint.ts.md)

## Source

```typescript
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 };
};
```
