Skip to main content

conversation_api/
thread.rs

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}