| 1 | import type { TranscriptProjection } from "./transcriptStore"; |
| 2 | import type { Meta } from "./types"; |
| 3 | |
| 4 | export function historyFingerprintMatchesMeta(history: { revision: number; revisionKnown?: boolean; digest?: string }, meta: Meta): boolean { |
| 5 | const expectedDigest = (meta.sessionDigest ?? "").trim(); |
| 6 | if (expectedDigest && history.digest !== expectedDigest) return false; |
| 7 | const expectedRevision = meta.sessionRevision ?? 0; |
| 8 | return expectedRevision <= 0 || Boolean(history.revisionKnown && history.revision === expectedRevision); |
| 9 | } |
| 10 | |
| 11 | export function historyRevisionIsOlder(current: number | undefined, incoming: number | undefined): boolean { |
| 12 | return typeof current === "number" && current > 0 |
| 13 | && typeof incoming === "number" && incoming > 0 |
| 14 | && incoming < current; |
| 15 | } |
| 16 | |
| 17 | export function historyReplaceAction(projection: TranscriptProjection) { |
| 18 | return { |
| 19 | type: "history_replace" as const, items: projection.items, |
| 20 | startTurn: projection.startTurn, endTurn: projection.endTurn, totalTurns: projection.totalTurns, |
| 21 | hasOlder: projection.hasOlder, hasNewer: projection.hasNewer, |
| 22 | revision: projection.revisionKnown ? projection.revision : undefined, |
| 23 | digest: projection.digest || undefined, |
| 24 | }; |
| 25 | } |
| 26 |