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