| 1 | import { app } from "./bridge"; |
| 2 | import { asArray } from "./array"; |
| 3 | import { entriesFor } from "./canonicalTranscriptBackend"; |
| 4 | import type { HistoryWindowPage, PersistentMessage } from "../generated/desktopContract.generated"; |
| 5 | import type { HistoryWindowPageView, HistoryWindowRequestView } from "./types"; |
| 6 | |
| 7 | function unsupportedWindow(): HistoryWindowPageView { |
| 8 | return { |
| 9 | entries: [], status: "unsupported", olderCursor: "", newerCursor: "", |
| 10 | hasOlder: false, hasNewer: false, totalTurns: 0, startTurn: 0, endTurn: 0, |
| 11 | revision: 0, revisionKnown: false, digest: "", |
| 12 | }; |
| 13 | } |
| 14 | |
| 15 | export async function readCanonicalHistoryWindow(tabId: string, req: HistoryWindowRequestView, remote: boolean): Promise<HistoryWindowPageView> { |
| 16 | let page: HistoryWindowPage; |
| 17 | if (remote) { |
| 18 | if (typeof app.RemoteSessionHistoryWindowForTab !== "function") { |
| 19 | return unsupportedWindow(); |
| 20 | } |
| 21 | page = await app.RemoteSessionHistoryWindowForTab(tabId, req); |
| 22 | } else { |
| 23 | if (typeof app.SessionHistoryWindowForTab !== "function") { |
| 24 | return unsupportedWindow(); |
| 25 | } |
| 26 | page = await app.SessionHistoryWindowForTab(tabId, req); |
| 27 | } |
| 28 | const status = (page.status || "ready") as HistoryWindowPageView["status"]; |
| 29 | if (status === "unsupported") { |
| 30 | return unsupportedWindow(); |
| 31 | } |
| 32 | const entries = entriesFor(asArray<PersistentMessage>(page.messages), page.snapshotSequence); |
| 33 | const turns = entries.map(entry => entry.turn).filter(turn => turn > 0); |
| 34 | return { |
| 35 | entries, |
| 36 | status, |
| 37 | olderCursor: page.olderCursor ?? "", |
| 38 | newerCursor: page.newerCursor ?? "", |
| 39 | hasOlder: Boolean(page.hasOlder), |
| 40 | hasNewer: Boolean(page.hasNewer), |
| 41 | totalTurns: page.totalTurns ?? (turns.length > 0 ? Math.max(...turns) : 0), |
| 42 | startTurn: turns.length > 0 ? Math.min(...turns) : 0, |
| 43 | endTurn: turns.length > 0 ? Math.max(...turns) : 0, |
| 44 | revision: page.snapshotSequence ?? 0, |
| 45 | revisionKnown: (page.snapshotSequence ?? 0) > 0, |
| 46 | digest: page.generation ?? "", |
| 47 | }; |
| 48 | } |
| 49 |