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}