1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
5#[serde(rename_all = "lowercase")]
6pub enum Placement {
7 Local,
8 Cloud,
9}
10
11#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
12#[serde(rename_all = "camelCase", deny_unknown_fields)]
13pub struct FrontendProvider {
14 pub provider: String,
15 pub deprecated: bool,
16 pub supported_placements: Vec<Placement>,
17}
18
19#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
20#[serde(rename_all = "camelCase", deny_unknown_fields)]
21pub struct ProviderListRequest {
22 pub placement: Placement,
23 pub frontend_providers: Vec<FrontendProvider>,
24}
25
26#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
27#[serde(rename_all = "camelCase", deny_unknown_fields)]
28pub struct ProviderMetadata {
29 pub provider: String,
30 pub display_name: String,
31 pub placement: Placement,
32 pub deprecated: bool,
33 pub available: bool,
34 #[serde(default, skip_serializing_if = "Option::is_none")]
35 pub disabled_reason: Option<String>,
36 pub setup_flow: String,
37 pub capabilities: Vec<ContentCapability>,
38 pub management_operations: Vec<ManagementOperation>,
39}
40
41#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
42#[serde(rename_all = "snake_case")]
43pub enum ContentCapability {
44 Text,
45 Markdown,
46 Image,
47 Audio,
48 Interaction,
49}
50
51#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
52pub enum ManagementOperation {
53 #[serde(rename = "connection.list")]
54 ConnectionList,
55 #[serde(rename = "connection.update")]
56 ConnectionUpdate,
57 #[serde(rename = "connection.delete")]
58 ConnectionDelete,
59 #[serde(rename = "connection.test")]
60 ConnectionTest,
61 #[serde(rename = "connection.status")]
62 ConnectionStatus,
63 #[serde(rename = "account.bind")]
64 AccountBind,
65 #[serde(rename = "account.unbind")]
66 AccountUnbind,
67 #[serde(rename = "account.binding.list")]
68 AccountBindingList,
69 #[serde(rename = "setup.options")]
70 SetupOptions,
71 #[serde(rename = "setup.start")]
72 SetupStart,
73 #[serde(rename = "setup.status")]
74 SetupStatus,
75 #[serde(rename = "surface.list")]
76 SurfaceList,
77 #[serde(rename = "surface.dismiss")]
78 SurfaceDismiss,
79 #[serde(rename = "surface.bind_code.create")]
80 SurfaceBindCodeCreate,
81 #[serde(rename = "actor.link_code.create")]
82 ActorLinkCodeCreate,
83 #[serde(rename = "actor.link.list")]
84 ActorLinkList,
85 #[serde(rename = "actor.link.delete")]
86 ActorLinkDelete,
87}
88
89#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
90#[serde(rename_all = "camelCase", deny_unknown_fields)]
91pub struct ProviderListResponse {
92 pub providers: Vec<ProviderMetadata>,
93}
94
95#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
96#[serde(rename_all = "camelCase", deny_unknown_fields)]
97pub struct ProviderPlacementRequest {
98 pub provider: String,
99 pub placement: Placement,
100}
101
102#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
103#[serde(rename_all = "camelCase", deny_unknown_fields)]
104pub struct ConnectionUpdateRequest {
105 pub provider: String,
106 pub placement: Placement,
107 #[serde(default, skip_serializing_if = "Option::is_none")]
108 pub connection_id: Option<String>,
109 pub data: Value,
110}
111
112#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
113#[serde(rename_all = "camelCase", deny_unknown_fields)]
114pub struct ConnectionRequest {
115 pub provider: String,
116 pub placement: Placement,
117 pub connection_id: String,
118}
119
120#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
121#[serde(rename_all = "camelCase", deny_unknown_fields)]
122pub struct ConnectionTestRequest {
123 pub provider: String,
124 pub placement: Placement,
125 pub data: Value,
126}
127
128#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
129#[serde(rename_all = "camelCase", deny_unknown_fields)]
130pub struct MessagingConnection {
131 pub provider: String,
132 pub placement: Placement,
133 pub connection_id: String,
134 pub account_id: String,
135 #[serde(default, skip_serializing_if = "Option::is_none")]
136 pub display_name: Option<String>,
137 pub enabled: bool,
138 pub status: String,
139 #[serde(default, skip_serializing_if = "Option::is_none")]
140 pub status_message: Option<String>,
141 pub bound_to_current_scope: bool,
142 pub provider_data: Value,
143}
144
145#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
146#[serde(rename_all = "camelCase", deny_unknown_fields)]
147pub struct ConnectionListResponse {
148 pub connections: Vec<MessagingConnection>,
149}
150
151#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
152#[serde(rename_all = "camelCase", deny_unknown_fields)]
153pub struct ConnectionUpdateResponse {
154 pub connection: MessagingConnection,
155}
156
157#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
158#[serde(rename_all = "camelCase", deny_unknown_fields)]
159pub struct ConnectionTestResponse {
160 pub result: Value,
161}
162
163#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
164#[serde(rename_all = "camelCase", deny_unknown_fields)]
165pub struct ProviderStatus {
166 pub provider: String,
167 pub placement: Placement,
168 pub enabled: bool,
169 pub provider_data: Value,
170}
171
172#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
173#[serde(rename_all = "camelCase", deny_unknown_fields)]
174pub struct ConnectionStatusResponse {
175 pub status: ProviderStatus,
176}
177
178#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
179#[serde(rename_all = "camelCase", deny_unknown_fields)]
180pub struct MutationResponse {
181 pub success: bool,
182}
183
184#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
185#[serde(rename_all = "camelCase", deny_unknown_fields)]
186pub struct AccountBindingRequest {
187 pub provider: String,
188 pub placement: Placement,
189 pub account_id: String,
190}
191
192#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
193#[serde(rename_all = "camelCase", deny_unknown_fields)]
194pub struct AccountBinding {
195 pub tenant_id: String,
196 pub scope_id: String,
197 pub user_id: String,
198 pub default: bool,
199}
200
201#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
202#[serde(rename_all = "camelCase", deny_unknown_fields)]
203pub struct AccountBindingListResponse {
204 pub bindings: Vec<AccountBinding>,
205}
206
207#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
208#[serde(rename_all = "camelCase", deny_unknown_fields)]
209pub struct SetupStartRequest {
210 pub provider: String,
211 pub placement: Placement,
212 pub data: Value,
213}
214
215#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
216#[serde(rename_all = "camelCase", deny_unknown_fields)]
217pub struct SetupOptionsResponse {
218 pub options: Value,
219}
220
221#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
222#[serde(rename_all = "camelCase", deny_unknown_fields)]
223pub struct SetupStatusRequest {
224 pub provider: String,
225 pub placement: Placement,
226 pub setup_id: String,
227}
228
229#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
230#[serde(rename_all = "camelCase", deny_unknown_fields)]
231pub struct SetupAction {
232 #[serde(rename = "type")]
233 pub kind: String,
234 #[serde(default, skip_serializing_if = "Option::is_none")]
235 pub url: Option<String>,
236}
237
238#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
239#[serde(rename_all = "camelCase", deny_unknown_fields)]
240pub struct SetupState {
241 #[serde(default, skip_serializing_if = "Option::is_none")]
242 pub setup_id: Option<String>,
243 pub status: String,
244 #[serde(default, skip_serializing_if = "Option::is_none")]
245 pub expires_at_ms: Option<i64>,
246 #[serde(default, skip_serializing_if = "Option::is_none")]
247 pub action: Option<SetupAction>,
248 pub provider_data: Value,
249 #[serde(default, skip_serializing_if = "Option::is_none")]
250 pub connection_id: Option<String>,
251 #[serde(default, skip_serializing_if = "Option::is_none")]
252 pub message: Option<String>,
253}
254
255#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
256#[serde(rename_all = "camelCase", deny_unknown_fields)]
257pub struct SetupResponse {
258 pub setup: SetupState,
259}
260
261#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
262#[serde(rename_all = "lowercase")]
263pub enum SurfaceState {
264 Pending,
265 Bound,
266 Dismissed,
267}
268
269#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
270#[serde(rename_all = "camelCase", deny_unknown_fields)]
271pub struct SurfaceListRequest {
272 pub provider: String,
273 pub placement: Placement,
274 #[serde(default, skip_serializing_if = "Option::is_none")]
275 pub account_id: Option<String>,
276 #[serde(default, skip_serializing_if = "Option::is_none")]
277 pub state: Option<SurfaceState>,
278}
279
280#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
281#[serde(rename_all = "camelCase", deny_unknown_fields)]
282pub struct MessagingSurface {
283 pub provider: String,
284 pub placement: Placement,
285 pub account_id: String,
286 pub surface_id: String,
287 #[serde(default, skip_serializing_if = "Option::is_none")]
288 pub display_name: Option<String>,
289 pub state: SurfaceState,
290 #[serde(default, skip_serializing_if = "Option::is_none")]
291 pub scope_id: Option<String>,
292 pub first_seen_at_ms: i64,
293 pub last_seen_at_ms: i64,
294}
295
296#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
297#[serde(rename_all = "camelCase", deny_unknown_fields)]
298pub struct SurfaceListResponse {
299 pub surfaces: Vec<MessagingSurface>,
300}
301
302#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
303#[serde(rename_all = "camelCase", deny_unknown_fields)]
304pub struct SurfaceRequest {
305 pub provider: String,
306 pub placement: Placement,
307 pub surface_id: String,
308}
309
310#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
311#[serde(rename_all = "camelCase", deny_unknown_fields)]
312pub struct SurfaceBindCodeCreateRequest {
313 pub provider: String,
314 pub placement: Placement,
315 pub surface_id: String,
316 pub scope_id: String,
317}
318
319#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
320#[serde(rename_all = "camelCase", deny_unknown_fields)]
321pub struct ActorLinkCodeCreateRequest {
322 pub provider: String,
323 pub placement: Placement,
324 pub surface_id: String,
325}
326
327#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
328#[serde(rename_all = "camelCase", deny_unknown_fields)]
329pub struct ChallengeCode {
330 pub code: String,
331 pub command: String,
332 pub expires_at_ms: i64,
333}
334
335#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
336#[serde(rename_all = "camelCase", deny_unknown_fields)]
337pub struct ChallengeCodeResponse {
338 pub challenge: ChallengeCode,
339}
340
341#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
342#[serde(rename_all = "camelCase", deny_unknown_fields)]
343pub struct ActorLinkListRequest {
344 pub provider: String,
345 pub placement: Placement,
346 #[serde(default, skip_serializing_if = "Option::is_none")]
347 pub surface_id: Option<String>,
348}
349
350#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
351#[serde(rename_all = "camelCase", deny_unknown_fields)]
352pub struct ActorLinkView {
353 pub link_id: String,
354 pub provider: String,
355 pub placement: Placement,
356 pub account_id: String,
357 #[serde(default, skip_serializing_if = "Option::is_none")]
358 pub display_name: Option<String>,
359 pub created_at_ms: i64,
360}
361
362#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
363#[serde(rename_all = "camelCase", deny_unknown_fields)]
364pub struct ActorLinkListResponse {
365 pub links: Vec<ActorLinkView>,
366}
367
368#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
369#[serde(rename_all = "camelCase", deny_unknown_fields)]
370pub struct ActorLinkDeleteRequest {
371 pub provider: String,
372 pub placement: Placement,
373 pub link_id: String,
374}