Agent runs keyed by conversation detail ID.
Parsed artifacts keyed by conversation detail ID.
The window's rows, chronological by Sequence.
True when a read underlying this window FAILED, as opposed to returning nothing.
Without this the two are indistinguishable, and the difference matters more than it
looks: HasMoreAbove: false from a failed read means "you have reached the start of
the conversation", so a consumer folds a transport blip into its cursor and stops
offering to page. Nothing later restores it. A failed read must leave the caller's
paging state alone, which it can only do if it can tell the two apart.
Set when the row read failed, when the older-rows probe failed, or when a widening retry failed. Peripheral failures do NOT set it — those already degrade to empty maps and the transcript still renders.
True when at least one row exists below OldestSequence.
Sequence of the newest loaded row. Used to detect live appends.
Sequence of the oldest loaded row — the next older fetch's exclusive bound.
Ratings keyed by conversation detail ID.
User avatars keyed by UserID.
One page of a conversation's transcript plus the peripheral data its rows need.
Deliberately NOT a ConversationDetailCache — that type is the FULL-history contract and is what
GetAgentContextWindowconsumes. Keeping the shapes distinct is what stops a window from being written into_detailCacheby accident.