1use crate::{
2 ActiveRun, ConversationMessage, PendingInteraction, QueuedMessage, RunOutcome, ThreadSummary,
3};
4use serde::{Deserialize, Serialize};
5use serde_json::Value;
6
7#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
8#[serde(rename_all = "camelCase")]
9pub struct SnapshotUpdatedEvent {
10 #[serde(rename = "type")]
11 pub event_type: String,
12 pub surface_id: String,
13 pub thread_id: String,
14 pub request_id: String,
15 pub snapshot_version: u64,
16 pub occurred_at: String,
17 pub data: SnapshotUpdatedData,
18}
19
20#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
21#[serde(rename_all = "camelCase")]
22pub struct SnapshotUpdatedData {
23 pub reason: String,
24 #[serde(default)]
25 pub session_activity_at_unix_ms: i64,
26 #[serde(default)]
27 pub messages_added: Vec<ConversationMessage>,
28 pub active_run: Option<ActiveRun>,
29 pub pending_interaction: Option<PendingInteraction>,
30 pub run_outcome: Option<RunOutcome>,
31}
32
33#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
34#[serde(rename_all = "camelCase")]
35pub struct QueueChangedEvent {
36 #[serde(rename = "type")]
37 pub event_type: String,
38 pub surface_id: String,
39 pub thread_id: String,
40 pub queue_version: u64,
41 pub occurred_at: String,
42 pub data: QueueChangedData,
43}
44
45#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
46#[serde(rename_all = "camelCase")]
47pub struct QueueChangedData {
48 pub items: Vec<QueuedMessage>,
49 pub active_run: Option<ActiveRun>,
50}
51
52#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
53#[serde(rename_all = "camelCase")]
54pub struct CatalogChangedEvent {
55 #[serde(rename = "type")]
56 pub event_type: String,
57 pub surface_id: String,
58 pub catalog_version: u64,
59 pub occurred_at: String,
60 pub data: CatalogChangedData,
61}
62
63#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
64#[serde(rename_all = "camelCase")]
65pub struct CatalogChangedData {
66 pub active_thread_id: Option<String>,
67 pub threads: Vec<ThreadSummary>,
68}
69
70#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
71#[serde(rename_all = "camelCase")]
72pub struct SessionPolicyChangedEvent {
73 #[serde(rename = "type")]
74 pub event_type: String,
75 pub version: u64,
76 pub surface_id: String,
77 pub occurred_at: String,
78 pub data: SessionPolicyChangedData,
79}
80
81#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
82#[serde(rename_all = "camelCase")]
83pub struct SessionPolicyChangedData {
84 pub idle_timeout_minutes: u32,
85 pub updated_at_ms: Option<i64>,
86}
87
88#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
89#[serde(tag = "type")]
90pub enum ConversationEvent {
91 #[serde(rename = "snapshot.updated")]
92 SnapshotUpdated {
93 #[serde(default)]
94 #[serde(rename = "surfaceId")]
95 surface_id: String,
96 #[serde(rename = "threadId")]
97 thread_id: String,
98 #[serde(rename = "requestId")]
99 request_id: String,
100 #[serde(rename = "snapshotVersion")]
101 snapshot_version: u64,
102 #[serde(rename = "occurredAt")]
103 occurred_at: String,
104 data: Box<SnapshotUpdatedData>,
105 },
106 #[serde(rename = "thread.catalog_changed")]
107 CatalogChanged {
108 #[serde(default)]
109 #[serde(rename = "surfaceId")]
110 surface_id: String,
111 #[serde(rename = "catalogVersion")]
112 catalog_version: u64,
113 #[serde(rename = "occurredAt")]
114 occurred_at: String,
115 data: CatalogChangedData,
116 },
117 #[serde(rename = "queue.changed")]
118 QueueChanged {
119 #[serde(default)]
120 #[serde(rename = "surfaceId")]
121 surface_id: String,
122 #[serde(rename = "threadId")]
123 thread_id: String,
124 #[serde(rename = "queueVersion")]
125 queue_version: u64,
126 #[serde(rename = "occurredAt")]
127 occurred_at: String,
128 data: QueueChangedData,
129 },
130 #[serde(rename = "session.policy_changed")]
131 SessionPolicyChanged {
132 version: u64,
133 #[serde(default)]
134 #[serde(rename = "surfaceId")]
135 surface_id: String,
136 #[serde(rename = "occurredAt")]
137 occurred_at: String,
138 data: SessionPolicyChangedData,
139 },
140 #[serde(rename = "run.progress")]
141 Live {
142 #[serde(default)]
143 #[serde(rename = "surfaceId")]
144 surface_id: String,
145 #[serde(rename = "threadId")]
146 thread_id: String,
147 #[serde(rename = "requestId")]
148 request_id: String,
149 #[serde(rename = "baseSnapshotVersion")]
150 base_snapshot_version: u64,
151 offset: u64,
152 #[serde(rename = "occurredAt")]
153 occurred_at: String,
154 data: Value,
155 },
156}
157
158impl ConversationEvent {
159 pub fn surface_id(&self) -> &str {
160 match self {
161 Self::SnapshotUpdated { surface_id, .. }
162 | Self::CatalogChanged { surface_id, .. }
163 | Self::QueueChanged { surface_id, .. }
164 | Self::SessionPolicyChanged { surface_id, .. }
165 | Self::Live { surface_id, .. } => surface_id,
166 }
167 }
168}