Merge branch 'feat/edge-glyph'

This commit is contained in:
amosblomqvist
2026-09-19 22:39:03 +03:00
15 changed files with 740 additions and 68 deletions
+26
View File
@@ -44,6 +44,7 @@ import type {
ProvenancePoint,
CoverageEntry,
SessionCheckpoint,
NamingRunUsage,
} from "../core/contracts.ts";
import type { GraphStore } from "../core/ports.ts";
@@ -90,6 +91,19 @@ function readValid<T>(file: string, isValid: (v: unknown) => v is T): T[] {
const isProvenancePoint = (v: unknown): v is ProvenancePoint =>
isRecord(v) && isString(v.chatId) && isString(v.messageId);
const isNamingStats = (v: unknown): v is NamingRunUsage["stats"] =>
isRecord(v) &&
["detected", "claimed", "named", "appended"].every((k) => typeof v[k] === "number");
const isNamingRun = (v: unknown): v is NamingRunUsage =>
isRecord(v) &&
typeof v.startedAt === "number" &&
isString(v.at) &&
typeof v.durationMs === "number" &&
isString(v.model) &&
Array.isArray(v.steps) &&
isNamingStats(v.stats);
const isClusterLabeling = (v: unknown): v is ClusterLabeling =>
isRecord(v) &&
isString(v.id) &&
@@ -198,6 +212,18 @@ export const graphStore: GraphStore = {
return readValid(LEDGER_FILES.clusterLabels, isClusterLabeling);
},
// ── cluster-naming run usage (config.LEDGER_FILES.namingRuns) ──
/** Idempotent per startedAt — the same discipline as every usage
* channel (chats.appendExtractionUsage, appendSourceUsage). */
appendNamingUsage(entry: NamingRunUsage): void {
if (this.readNamingRuns().some((r) => r.startedAt === entry.startedAt)) return;
appendLine(LEDGER_FILES.namingRuns, entry);
},
readNamingRuns(): NamingRunUsage[] {
return readValid(LEDGER_FILES.namingRuns, isNamingRun);
},
// ── imported-notes bookkeeping (config.SOURCES_FILE — a JSON map) ──
/** Upsert: keeps the existing record's usage log when re-importing. */