Skip to main content

conversation_api/
event.rs

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}