1use crate::{ConversationMessage, PendingInteraction};
2use serde::{Deserialize, Serialize};
3use serde_json::Value;
4
5#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
6#[serde(rename_all = "snake_case")]
7pub enum ThreadState {
8 Active,
9 Archived,
10}
11
12#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
13#[serde(rename_all = "snake_case")]
14pub enum ThreadArchiveReason {
15 IdleTimeout,
16 UserRequested,
17 Replaced,
18}
19
20#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
21#[serde(rename_all = "camelCase")]
22pub struct ThreadSummary {
23 pub thread_id: String,
24 pub title: String,
25 pub state: ThreadState,
26 pub created_at: String,
27 pub updated_at: String,
28 pub archived_at: Option<String>,
29 #[serde(default, skip_serializing_if = "Option::is_none")]
30 pub archive_reason: Option<ThreadArchiveReason>,
31 pub purge_after: Option<String>,
32}
33
34#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
35#[serde(rename_all = "camelCase")]
36pub struct ThreadCatalog {
37 pub catalog_version: u64,
38 #[serde(default)]
39 pub active_thread_id: Option<String>,
40 #[serde(default)]
41 pub threads: Vec<ThreadSummary>,
42}
43
44#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
45#[serde(rename_all = "camelCase")]
46pub struct QueuedMessage {
47 pub request_id: String,
48 pub thread_id: String,
49 pub content: crate::MessageContent,
50 pub created_at: String,
51}
52
53#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
54#[serde(rename_all = "camelCase")]
55pub struct ConversationQueue {
56 pub queue_version: u64,
57 #[serde(default)]
58 pub items: Vec<QueuedMessage>,
59}
60
61#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
62#[serde(rename_all = "camelCase")]
63pub struct ActiveRun {
64 pub request_id: String,
65 pub started_at: String,
66}
67
68#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
69#[serde(rename_all = "snake_case")]
70pub enum RunStatus {
71 Completed,
72 InteractionRequired,
73 Interrupted,
74 AgentFailed,
75 SystemFailed,
76}
77
78#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
79#[serde(rename_all = "snake_case")]
80pub enum FailureSource {
81 LlmProvider,
82 AgentRuntime,
83}
84
85#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
86#[serde(rename_all = "camelCase")]
87pub struct RunFailure {
88 pub source: FailureSource,
89 pub code: String,
90 pub message: String,
91}
92
93#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
94#[serde(rename_all = "camelCase")]
95pub struct RunOutcome {
96 pub request_id: String,
97 pub status: RunStatus,
98 #[serde(default, skip_serializing_if = "Option::is_none")]
99 pub error_code: Option<String>,
100 #[serde(default, skip_serializing_if = "Option::is_none")]
101 pub failure: Option<RunFailure>,
102}
103
104#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
105#[serde(rename_all = "camelCase")]
106pub struct ThreadSnapshot {
107 pub version: u64,
108 pub messages: Vec<ConversationMessage>,
109 pub active_run: Option<ActiveRun>,
110 pub pending_interaction: Option<PendingInteraction>,
111 pub run_outcomes: Vec<RunOutcome>,
112}
113
114#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
115#[serde(rename_all = "camelCase")]
116pub struct LiveEvent {
117 pub surface_id: String,
118 pub thread_id: String,
119 pub request_id: String,
120 pub base_snapshot_version: u64,
121 pub offset: u64,
122 pub occurred_at: String,
123 #[serde(rename = "type")]
124 pub event_type: String,
125 pub data: Value,
126}
127
128#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
129#[serde(rename_all = "camelCase")]
130pub struct LiveSnapshot {
131 pub base_snapshot_version: u64,
132 pub last_offset: u64,
133 #[serde(default)]
134 pub events: Vec<LiveEvent>,
135}