tools/core/resolvers/checklist.resolver.ts
tools/core/resolvers/checklist.resolver.ts is a file in Coordination Surface. 168 lines of code and 40 definitions.
import type { IdBreach } from "../types/checklist.types.ts";
import { TASK_MARKER } from "../constants/checklist.constants.ts";
export const isDigit = function isDigit(char: string): boolean {
return char >= "0" && char <= "9";
};
const idAt = function idAt(line: string, from: number): string | null {
let cursor = from;
let parts = 0;
let digits = 0;
while (cursor < line.length) {
const char = line.charAt(cursor);
const separates = char === "." && digits > 0 && isDigit(line.charAt(cursor + 1));
if (!isDigit(char) && !separates) {
break;
}
parts += separates ? 1 : 0;
digits = separates ? 0 : digits + 1;
cursor += 1;
}
return digits === 0 || parts !== 2 ? null : line.slice(from, cursor);
};
export const declaredId = function declaredId(line: string): string | null {
const trimmed = line.trimStart();
if (!trimmed.startsWith(TASK_MARKER)) {
return null;
}
let cursor = TASK_MARKER.length;
while (cursor < trimmed.length && trimmed.charAt(cursor) === " ") {
cursor += 1;
}
return idAt(trimmed, cursor);
};
export const citedIds = function citedIds(line: string): string[] {
const out: string[] = [];
for (let index = 0; index < line.length; index += 1) {
const previous = index > 0 ? line.charAt(index - 1) : "";
const starts = isDigit(line.charAt(index)) && !isDigit(previous) && previous !== ".";
const id = starts ? idAt(line, index) : null;
if (id !== null) {
out.push(id);
}
}
return out;
};
const BINDING_FIELDS = ["verifier", "owner"];
const boundAgent = function boundAgent(line: string, field: string): string | null {
const marker = `*${field}:*`;
const at = line.indexOf(marker);
if (at === -1) {
return null;
}
let cursor = at + marker.length;
while (cursor < line.length && line.charAt(cursor) === " ") {
cursor += 1;
}
const letter = line.charAt(cursor);
if (letter < "A" || letter > "Z") {
return null;
}
const after = line.charAt(cursor + 1);
if (after !== "" && after !== " " && after !== "\r") {
return null;
}
return letter;
};
export const agentBreaches = function agentBreaches(lines: readonly string[], active: ReadonlySet<string>): IdBreach[] {
const out: IdBreach[] = [];
for (let index = 0; index < lines.length; index += 1) {
const line = lines[index] ?? "";
for (const field of BINDING_FIELDS) {
const letter = boundAgent(line, field);
if (letter === null || active.has(letter)) {
continue;
}
const names = `the ${field} names agent ${letter}, and no active record declares it`;
const resolves = `a ${field} resolves to an agent the board declares ACTIVE`;
out.push({
actual: names,
expected: resolves,
id: `${field}:${letter}`,
kind: "danglingBinding",
line: index + 1,
});
}
}
return out;
};
const CLOSES_FIELD = "CLOSES:";
const phaseOf = function phaseOf(id: string): number {
const dot = id.indexOf(".");
return dot === -1 ? Number.NaN : Number(id.slice(0, dot));
};
export const closureBreaches = function closureBreaches(lines: readonly string[]): IdBreach[] {
let closes = "";
let declaredAt = 0;
const open: { id: string; line: number }[] = [];
for (let index = 0; index < lines.length; index += 1) {
const trimmed = (lines[index] ?? "").trim();
if (trimmed.startsWith(CLOSES_FIELD)) {
closes = trimmed.slice(CLOSES_FIELD.length).trim();
declaredAt = index + 1;
continue;
}
const id = declaredId(lines[index] ?? "");
if (id !== null) {
open.push({ id, line: index + 1 });
}
}
if (closes.length === 0) {
return [];
}
const closurePhase = phaseOf(closes);
if (Number.isNaN(closurePhase)) {
return [];
}
const later = open.filter((task) => {
const phase = phaseOf(task.id);
return task.id !== closes && !Number.isNaN(phase) && phase > closurePhase;
});
if (later.length === 0) {
return [];
}
return [
{
actual: `the closure row ${closes} sits in phase ${String(closurePhase)} and these open rows sit later: ${later
.map((task) => `${task.id} at line ${String(task.line)}`)
.join(", ")}`,
expected: `every open row sits at or before the phase of the closure row ${closes}`,
id: closes,
kind: "closureBeforeItsDependencies",
line: declaredAt,
},
];
};
const danglingBreaches = function danglingBreaches(
lines: readonly string[],
declared: ReadonlyMap<string, number>,
): IdBreach[] {
return [...lines.entries()]
.filter(([, line]) => declaredId(line) === null)
.flatMap(([index, line]) =>
citedIds(line)
.filter((id) => !declared.has(id))
.map((id) => ({
actual: `${id} is cited and no task declares it`,
expected: "a cited id resolves to a declared task",
id,
kind: "danglingReference",
line: index + 1,
})),
);
};
export const idBreaches = function idBreaches(lines: readonly string[]): IdBreach[] {
const out: IdBreach[] = [];
const declared = new Map<string, number>();
for (const [index, line] of lines.entries()) {
const id = declaredId(line);
const first = id === null ? undefined : declared.get(id);
if (id !== null && first === undefined) {
declared.set(id, index + 1);
}
if (id !== null && first !== undefined) {
const twice = `${id} is declared at line ${String(first)} and again here`;
out.push({ actual: twice, expected: "one task per id", id, kind: "duplicateId", line: index + 1 });
}
}
return [...out, ...danglingBreaches(lines, declared)];
};