interface CompletionDataLike { id?: unknown; agent?: unknown; timestamp?: unknown; sessionId?: unknown; taskIndex?: unknown; totalTasks?: unknown; success?: unknown; } function asNonEmptyString(value: unknown): string | undefined { if (typeof value !== "string") return undefined; const trimmed = value.trim(); return trimmed.length > 0 ? trimmed : undefined; } function asFiniteNumber(value: unknown): number | undefined { if (typeof value !== "number") return undefined; return Number.isFinite(value) ? value : undefined; } export function buildCompletionKey(data: CompletionDataLike, fallback: string): string { const id = asNonEmptyString(data.id); if (id) return `id:${id}`; const sessionId = asNonEmptyString(data.sessionId) ?? "no-session"; const agent = asNonEmptyString(data.agent) ?? "unknown"; const timestamp = asFiniteNumber(data.timestamp); const taskIndex = asFiniteNumber(data.taskIndex); const totalTasks = asFiniteNumber(data.totalTasks); const success = typeof data.success === "boolean" ? (data.success ? "1" : "0") : "?"; return [ "meta", sessionId, agent, timestamp !== undefined ? String(timestamp) : "no-ts", taskIndex !== undefined ? String(taskIndex) : "-", totalTasks !== undefined ? String(totalTasks) : "-", success, fallback, ].join(":"); } function pruneSeenMap(seen: Map, now: number, ttlMs: number): void { for (const [key, ts] of seen.entries()) { if (now - ts > ttlMs) seen.delete(key); } } export function markSeenWithTtl(seen: Map, key: string, now: number, ttlMs: number): boolean { pruneSeenMap(seen, now, ttlMs); if (seen.has(key)) return true; seen.set(key, now); return false; } export function getGlobalSeenMap(storeKey: string): Map { const globalStore = globalThis as Record; const existing = globalStore[storeKey]; if (existing instanceof Map) return existing as Map; const map = new Map(); globalStore[storeKey] = map; return map; }