Skip to main content

conversation_api/
thread.rs

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