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,
91 pub message: String,
92}
93
94#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
95#[serde(rename_all = "camelCase")]
96pub struct RunOutcome {
97 pub request_id: String,
98 pub status: RunStatus,
99 #[serde(default, skip_serializing_if = "Option::is_none")]
100 pub error_code: Option<String>,
101 #[serde(default, skip_serializing_if = "Option::is_none")]
102 pub failure: Option<RunFailure>,
103}
104
105#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
106#[serde(rename_all = "camelCase")]
107pub struct ThreadSnapshot {
108 pub version: u64,
109 pub messages: Vec<ConversationMessage>,
110 pub active_run: Option<ActiveRun>,
111 pub pending_interaction: Option<PendingInteraction>,
112 pub run_outcomes: Vec<RunOutcome>,
113}
114
115#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
116#[serde(rename_all = "camelCase")]
117pub struct LiveSnapshot {
118 pub base_snapshot_version: u64,
119 pub last_offset: u64,
120 #[serde(default)]
121 pub events: Vec<crate::LiveConversationEvent>,
122}