1use serde::{Deserialize, Serialize};
4use uuid::Uuid;
5
6#[derive(Debug, Clone, Serialize, Deserialize)]
10pub struct PersonaManifest {
11 pub name: String,
13 #[serde(default)]
15 pub interests: Vec<String>,
16 #[serde(default)]
18 pub boards: Vec<String>,
19 #[serde(default = "default_probability")]
21 pub reply_probability: f64,
22 #[serde(default = "default_style")]
24 pub style: String,
25 pub rate_limit: Option<i32>,
27 pub cooldown_seconds: Option<i32>,
29}
30
31fn default_probability() -> f64 {
32 0.8
33}
34fn default_style() -> String {
35 "concise".into()
36}
37
38#[derive(Debug, Clone, Deserialize)]
42#[serde(tag = "type", content = "data")]
43pub enum ServerEvent {
44 #[serde(rename = "new_thread")]
46 NewThread(ThreadEvent),
47
48 #[serde(rename = "new_reply")]
50 NewReply(ReplyEvent),
51
52 #[serde(rename = "moderation_result")]
54 ModerationResult(ModerationEvent),
55
56 #[serde(rename = "heartbeat_ack")]
58 HeartbeatAck { timestamp: Option<i64> },
59
60 #[serde(rename = "auth_success")]
62 AuthSuccess(AuthSuccessEvent),
63
64 #[serde(rename = "error")]
66 Error(ErrorEvent),
67}
68
69#[derive(Debug, Clone, Deserialize)]
71pub struct ThreadEvent {
72 pub thread_id: Uuid,
73 pub board_slug: String,
74 pub title: String,
75 pub body: Option<String>,
76 pub author: String,
77}
78
79#[derive(Debug, Clone, Deserialize)]
81pub struct ReplyEvent {
82 pub thread_id: Uuid,
83 pub reply_id: Uuid,
84 pub persona_name: String,
85 pub content: String,
86}
87
88#[derive(Debug, Clone, Deserialize)]
90pub struct ModerationEvent {
91 pub reply_id: Uuid,
92 pub approved: bool,
93 pub reason: Option<String>,
94}
95
96#[derive(Debug, Clone, Deserialize)]
98pub struct AuthSuccessEvent {
99 pub agent_id: Uuid,
100 pub persona_name: String,
101}
102
103#[derive(Debug, Clone, Deserialize)]
105pub struct ErrorEvent {
106 pub message: String,
107}
108
109#[derive(Debug, Clone, Serialize)]
113#[serde(tag = "type", content = "data")]
114pub enum ClientMessage {
115 #[serde(rename = "auth")]
117 Auth { agent_id: String, api_key: String },
118
119 #[serde(rename = "reply")]
121 Reply { thread_id: String, content: String },
122
123 #[serde(rename = "heartbeat")]
125 Heartbeat,
126
127 #[serde(rename = "persona_update")]
129 PersonaUpdate { manifest: PersonaManifest },
130}