use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; use models::{MessageId, RoomId, RoomThreadId, Seq, UserId, Uuid}; #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub enum MessageEventType { New, Edited, Revoked, StreamChunk, StreamDone, } #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(tag = "type", rename_all = "snake_case")] pub enum MessageEvent { New(MessageNewService), Edited(MessageEditedService), Revoked(MessageRevokedService), StreamChunk(MessageStreamChunkService), StreamDone(MessageStreamDoneService), } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct MessageNewService { pub id: MessageId, pub seq: Seq, pub room: RoomId, pub sender_type: String, pub sender_id: Option, pub display_name: Option, pub thread: Option, pub in_reply_to: Option, pub content: String, pub content_type: String, pub thinking_content: Option, pub thinking_is_chunked: bool, pub send_at: DateTime, #[serde(skip_serializing_if = "Option::is_none")] pub reactions: Option>, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct MessageEditedService { pub id: MessageId, pub seq: Seq, pub room: RoomId, pub sender_id: Option, pub content: String, pub edited_at: DateTime, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct MessageRevokedService { pub id: MessageId, pub seq: Seq, pub room: RoomId, pub revoked_at: DateTime, pub revoked_by: Option, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct MessageStreamStartService { pub message_id: MessageId, pub room: RoomId, /// SSE endpoint the client should open to receive full chunk content. pub sse_url: String, pub display_name: Option, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct MessageStreamChunkService { pub message_id: MessageId, pub room: RoomId, pub seq: u64, pub content: String, pub chunk_type: Option, pub display_name: Option, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct MessageStreamDoneService { pub message_id: MessageId, pub room: RoomId, pub content: String, pub thinking_content: Option, pub display_name: Option, pub error: Option, } #[derive(Debug, Clone, Deserialize, Serialize)] pub struct MessageSendClient { pub room: RoomId, pub content: String, pub content_type: Option, pub thread: Option, pub in_reply_to: Option, #[serde(default)] pub attachment_ids: Vec, } #[derive(Debug, Clone, Deserialize, Serialize)] pub struct MessageEditClient { pub room: RoomId, pub message_id: MessageId, pub content: String, } #[derive(Debug, Clone, Deserialize, Serialize)] pub struct MessageRevokeClient { pub room: RoomId, pub message_id: MessageId, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct MessageListService { pub room: RoomId, pub messages: Vec, pub total: i64, }