Skip to main content

conversation_api/
response.rs

1use crate::{ConversationQueue, ThreadSnapshot, ThreadSummary};
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
5#[serde(rename_all = "camelCase")]
6pub struct QueueMutationResponse {
7    pub operation_id: String,
8    pub request_id: String,
9    pub queue_version: u64,
10    pub disposition: QueueMutationDisposition,
11}
12
13#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
14#[serde(rename_all = "snake_case")]
15pub enum QueueMutationDisposition {
16    Applied,
17    AlreadyApplied,
18}
19
20#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
21#[serde(rename_all = "camelCase")]
22pub struct RequestStatusResponse {
23    pub request_id: String,
24    pub admission: Option<RequestAdmission>,
25}
26
27#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
28#[serde(rename_all = "camelCase")]
29pub struct ThreadSession {
30    pub activity_at_unix_ms: i64,
31}
32
33#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
34#[serde(
35    tag = "mode",
36    rename_all = "snake_case",
37    rename_all_fields = "camelCase"
38)]
39pub enum ThreadSync {
40    Unchanged {
41        snapshot_version: u64,
42    },
43    Delta {
44        base_snapshot_version: u64,
45        snapshot_version: u64,
46        events: Vec<crate::SnapshotUpdatedEvent>,
47    },
48    Snapshot {
49        // Keep unchanged/delta responses independent of the full snapshot's size.
50        snapshot: Box<ThreadSnapshot>,
51    },
52}
53
54#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
55#[serde(rename_all = "camelCase")]
56pub struct ThreadLoadResponse {
57    pub thread: ThreadSummary,
58    pub session: ThreadSession,
59    pub sync: ThreadSync,
60    pub queue: ConversationQueue,
61}
62
63#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
64#[serde(rename_all = "camelCase")]
65pub struct MessageEnqueueResponse {
66    pub request_id: String,
67    pub disposition: MessageEnqueueDisposition,
68    #[serde(default, skip_serializing_if = "Option::is_none")]
69    pub queue_version: Option<u64>,
70    #[serde(default, skip_serializing_if = "Option::is_none")]
71    pub admission: Option<RequestAdmission>,
72}
73
74#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
75#[serde(rename_all = "snake_case")]
76pub enum MessageEnqueueDisposition {
77    Scheduled,
78    Queued,
79    Duplicate,
80}
81
82#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
83#[serde(rename_all = "camelCase")]
84pub struct TurnSubmitResponse {
85    pub request_id: String,
86    #[serde(default, skip_serializing_if = "Option::is_none")]
87    pub thread_id: Option<String>,
88    pub disposition: TurnSubmitDisposition,
89    #[serde(default, skip_serializing_if = "Option::is_none")]
90    pub session_disposition: Option<TurnSessionDisposition>,
91    #[serde(default, skip_serializing_if = "Option::is_none")]
92    pub queue_version: Option<u64>,
93    #[serde(default, skip_serializing_if = "Option::is_none")]
94    pub admission: Option<RequestAdmission>,
95}
96
97#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
98#[serde(rename_all = "snake_case")]
99pub enum TurnSubmitDisposition {
100    Scheduled,
101    Queued,
102    Duplicate,
103    BlockedPendingInteraction,
104}
105
106#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
107#[serde(rename_all = "snake_case")]
108pub enum TurnSessionDisposition {
109    Existing,
110    Created,
111    RotatedIdleTimeout,
112}
113
114#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
115#[serde(rename_all = "camelCase")]
116pub struct SessionStartResponse {
117    pub operation_id: String,
118    pub thread_id: String,
119    pub disposition: SessionStartDisposition,
120    pub catalog: crate::ThreadCatalog,
121}
122
123#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
124#[serde(rename_all = "snake_case")]
125pub enum SessionStartDisposition {
126    Rotated,
127    AlreadyApplied,
128}
129
130#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
131#[serde(rename_all = "camelCase")]
132pub struct InteractionAnswerResponse {
133    pub request_id: String,
134    pub thread_id: String,
135    pub disposition: InteractionAnswerDisposition,
136}
137
138#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
139#[serde(rename_all = "snake_case")]
140pub enum InteractionAnswerDisposition {
141    Accepted,
142    Duplicate,
143    Unavailable,
144    ExpiredSession,
145}
146
147#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
148#[serde(rename_all = "camelCase")]
149pub struct InteractionSubmitResponse {
150    pub request_id: String,
151    pub disposition: InteractionSubmitDisposition,
152}
153
154#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
155#[serde(rename_all = "snake_case")]
156pub enum InteractionSubmitDisposition {
157    Accepted,
158}
159
160#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
161#[serde(rename_all = "camelCase")]
162pub struct RequestCancelResponse {
163    pub request_id: String,
164    pub phase: RequestCancelPhase,
165    pub outcome: RequestCancelOutcome,
166    #[serde(default, skip_serializing_if = "Option::is_none")]
167    pub queue_version: Option<u64>,
168    #[serde(default, skip_serializing_if = "Option::is_none")]
169    pub admission_version: Option<u64>,
170}
171
172#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
173#[serde(rename_all = "snake_case")]
174pub enum RequestCancelPhase {
175    AdmissionWaiting,
176    Waiting,
177    Running,
178}
179
180#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
181#[serde(rename_all = "snake_case")]
182pub enum RequestCancelOutcome {
183    Cancelled,
184    Cancelling,
185}
186
187#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
188#[serde(rename_all = "camelCase")]
189pub struct RequestAdmission {
190    pub state: RequestAdmissionState,
191    pub admission_version: u64,
192    #[serde(default, skip_serializing_if = "Option::is_none")]
193    pub reason: Option<RequestAdmissionReason>,
194    #[serde(default, skip_serializing_if = "Option::is_none")]
195    pub thread_id: Option<String>,
196    #[serde(default, skip_serializing_if = "Option::is_none")]
197    pub queue_version: Option<u64>,
198}
199
200#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
201#[serde(rename_all = "snake_case")]
202pub enum RequestAdmissionState {
203    WaitingHandoff,
204    Bound,
205    Cancelled,
206    Failed,
207}
208
209#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
210#[serde(rename_all = "snake_case")]
211pub enum RequestAdmissionReason {
212    ModeHandoff,
213    WaitingForPriorTurn,
214    Accepted,
215    Cancelled,
216    HandoffFailed,
217}