{"version":3,"file":"completion-dedupe.d.ts","sourceRoot":"","sources":["../../../../src/runs/background/completion-dedupe.ts"],"names":[],"mappings":"AAAA,UAAU,kBAAkB;IAC3B,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB;AAaD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAmBrF;AAQD,wBAAgB,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAK3G","sourcesContent":["interface CompletionDataLike {\n\tid?: unknown;\n\tagent?: unknown;\n\ttimestamp?: unknown;\n\tsessionId?: unknown;\n\ttaskIndex?: unknown;\n\ttotalTasks?: unknown;\n\tsuccess?: unknown;\n}\n\nfunction asNonEmptyString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\tconst trimmed = value.trim();\n\treturn trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction asFiniteNumber(value: unknown): number | undefined {\n\tif (typeof value !== \"number\") return undefined;\n\treturn Number.isFinite(value) ? value : undefined;\n}\n\nexport function buildCompletionKey(data: CompletionDataLike, fallback: string): string {\n\tconst sessionId = asNonEmptyString(data.sessionId) ?? \"no-session\";\n\tconst id = asNonEmptyString(data.id);\n\tif (id) return `session:${sessionId}:id:${id}`;\n\tconst agent = asNonEmptyString(data.agent) ?? \"unknown\";\n\tconst timestamp = asFiniteNumber(data.timestamp);\n\tconst taskIndex = asFiniteNumber(data.taskIndex);\n\tconst totalTasks = asFiniteNumber(data.totalTasks);\n\tconst success = typeof data.success === \"boolean\" ? (data.success ? \"1\" : \"0\") : \"?\";\n\treturn [\n\t\t\"meta\",\n\t\tsessionId,\n\t\tagent,\n\t\ttimestamp !== undefined ? String(timestamp) : \"no-ts\",\n\t\ttaskIndex !== undefined ? String(taskIndex) : \"-\",\n\t\ttotalTasks !== undefined ? String(totalTasks) : \"-\",\n\t\tsuccess,\n\t\tfallback,\n\t].join(\":\");\n}\n\nfunction pruneSeenMap(seen: Map<string, number>, now: number, ttlMs: number): void {\n\tfor (const [key, ts] of seen.entries()) {\n\t\tif (now - ts > ttlMs) seen.delete(key);\n\t}\n}\n\nexport function markSeenWithTtl(seen: Map<string, number>, key: string, now: number, ttlMs: number): boolean {\n\tpruneSeenMap(seen, now, ttlMs);\n\tif (seen.has(key)) return true;\n\tseen.set(key, now);\n\treturn false;\n}\n"]}