+
+ Encounter Timeline — {events.length} event{events.length !== 1 ? "s" : ""}
+
+
+
+ );
+}
diff --git a/src/types/payloads.ts b/src/types/payloads.ts
index 36c8081..66e9209 100644
--- a/src/types/payloads.ts
+++ b/src/types/payloads.ts
@@ -582,6 +582,29 @@ export function isScrapbookEntry(msg: TypedGameMessage): msg is ScrapbookEntryMe
return msg.type === MessageType.SCRAPBOOK_ENTRY;
}
+// ---------------------------------------------------------------------------
+// Encounter event types (GM panel — Task 22)
+// REST source: GET /api/sessions/{slug}/encounter_events
+// ---------------------------------------------------------------------------
+
+export type EncounterEventKind =
+ | "ENCOUNTER_STARTED"
+ | "ENCOUNTER_BEAT_APPLIED"
+ | "ENCOUNTER_METRIC_ADVANCE"
+ | "ENCOUNTER_BEAT_SKIPPED"
+ | "ENCOUNTER_TAG_CREATED"
+ | "ENCOUNTER_STATUS_ADDED"
+ | "ENCOUNTER_YIELD"
+ | "ENCOUNTER_RESOLVED"
+ | "ENCOUNTER_RESOLUTION_SIGNAL";
+
+export interface EncounterEvent {
+ seq: number;
+ kind: EncounterEventKind;
+ payload: Record