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    pub content: crate::MessageContent,
49    pub created_at: String,
50}
51
52#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
53#[serde(rename_all = "camelCase")]
54pub struct ConversationQueue {
55    pub queue_version: u64,
56    #[serde(default)]
57    pub items: Vec<QueuedMessage>,
58}
59
60#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
61#[serde(rename_all = "camelCase")]
62pub struct ActiveRun {
63    pub request_id: String,
64    pub started_at: String,
65}
66
67#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
68#[serde(rename_all = "snake_case")]
69pub enum RunStatus {
70    Completed,
71    InteractionRequired,
72    Interrupted,
73    AgentFailed,
74    SystemFailed,
75}
76
77#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
78#[serde(rename_all = "snake_case")]
79pub enum FailureSource {
80    LlmProvider,
81    AgentRuntime,
82}
83
84#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
85#[serde(rename_all = "camelCase")]
86pub struct RunFailure {
87    pub source: FailureSource,
88    pub code: String,
89    pub message: String,
90}
91
92#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
93#[serde(rename_all = "camelCase")]
94pub struct RunOutcome {
95    pub request_id: String,
96    pub status: RunStatus,
97    #[serde(default, skip_serializing_if = "Option::is_none")]
98    pub error_code: Option<String>,
99    #[serde(default, skip_serializing_if = "Option::is_none")]
100    pub failure: Option<RunFailure>,
101}
102
103#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
104#[serde(rename_all = "camelCase")]
105pub struct ThreadSnapshot {
106    pub version: u64,
107    pub messages: Vec<ConversationMessage>,
108    pub active_run: Option<ActiveRun>,
109    pub pending_interaction: Option<PendingInteraction>,
110    pub run_outcomes: Vec<RunOutcome>,
111}
112
113#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
114#[serde(rename_all = "camelCase")]
115pub struct LiveSnapshot {
116    pub base_snapshot_version: u64,
117    pub last_offset: u64,
118    #[serde(default)]
119    pub events: Vec<crate::LiveConversationEvent>,
120}