Skip to main content

systemprompt_models/events/
system_event.rs

1//! `SystemEvent` shape and builder.
2//!
3//! Copyright (c) systemprompt.io — Business Source License 1.1.
4//! See <https://systemprompt.io> for licensing details.
5
6use chrono::{DateTime, Utc};
7use serde::{Deserialize, Serialize};
8use systemprompt_identifiers::ContextId;
9
10use super::payloads::system::{
11    ConnectedPayload, ContextCreatedPayload, ContextDeletedPayload, ContextSummary,
12    ContextUpdatedPayload, ContextsSnapshotPayload,
13};
14use super::system_event_type::SystemEventType;
15
16#[derive(Debug, Clone, Serialize, Deserialize)]
17#[serde(tag = "type", rename_all = "SCREAMING_SNAKE_CASE")]
18pub enum SystemEvent {
19    ContextCreated {
20        timestamp: DateTime<Utc>,
21        #[serde(flatten)]
22        payload: ContextCreatedPayload,
23    },
24    ContextUpdated {
25        timestamp: DateTime<Utc>,
26        #[serde(flatten)]
27        payload: ContextUpdatedPayload,
28    },
29    ContextDeleted {
30        timestamp: DateTime<Utc>,
31        #[serde(flatten)]
32        payload: ContextDeletedPayload,
33    },
34    ContextsSnapshot {
35        timestamp: DateTime<Utc>,
36        #[serde(flatten)]
37        payload: ContextsSnapshotPayload,
38    },
39    Connected {
40        timestamp: DateTime<Utc>,
41        #[serde(flatten)]
42        payload: ConnectedPayload,
43    },
44    Heartbeat {
45        timestamp: DateTime<Utc>,
46    },
47}
48
49impl SystemEvent {
50    pub const fn event_type(&self) -> SystemEventType {
51        match self {
52            Self::ContextCreated { .. } => SystemEventType::ContextCreated,
53            Self::ContextUpdated { .. } => SystemEventType::ContextUpdated,
54            Self::ContextDeleted { .. } => SystemEventType::ContextDeleted,
55            Self::ContextsSnapshot { .. } => SystemEventType::ContextsSnapshot,
56            Self::Connected { .. } => SystemEventType::Connected,
57            Self::Heartbeat { .. } => SystemEventType::Heartbeat,
58        }
59    }
60
61    pub const fn timestamp(&self) -> DateTime<Utc> {
62        match self {
63            Self::ContextCreated { timestamp, .. }
64            | Self::ContextUpdated { timestamp, .. }
65            | Self::ContextDeleted { timestamp, .. }
66            | Self::ContextsSnapshot { timestamp, .. }
67            | Self::Connected { timestamp, .. }
68            | Self::Heartbeat { timestamp } => *timestamp,
69        }
70    }
71}
72
73#[derive(Debug, Clone, Copy)]
74pub struct SystemEventBuilder;
75
76impl SystemEventBuilder {
77    pub fn context_created(context_id: ContextId, name: String) -> SystemEvent {
78        SystemEvent::ContextCreated {
79            timestamp: Utc::now(),
80            payload: ContextCreatedPayload { context_id, name },
81        }
82    }
83
84    pub fn context_updated(context_id: ContextId, name: Option<String>) -> SystemEvent {
85        SystemEvent::ContextUpdated {
86            timestamp: Utc::now(),
87            payload: ContextUpdatedPayload { context_id, name },
88        }
89    }
90
91    pub fn context_deleted(context_id: ContextId) -> SystemEvent {
92        SystemEvent::ContextDeleted {
93            timestamp: Utc::now(),
94            payload: ContextDeletedPayload { context_id },
95        }
96    }
97
98    pub fn contexts_snapshot(contexts: Vec<ContextSummary>) -> SystemEvent {
99        SystemEvent::ContextsSnapshot {
100            timestamp: Utc::now(),
101            payload: ContextsSnapshotPayload { contexts },
102        }
103    }
104
105    pub fn connected(connection_id: systemprompt_identifiers::ConnectionId) -> SystemEvent {
106        SystemEvent::Connected {
107            timestamp: Utc::now(),
108            payload: ConnectedPayload { connection_id },
109        }
110    }
111
112    pub fn heartbeat() -> SystemEvent {
113        SystemEvent::Heartbeat {
114            timestamp: Utc::now(),
115        }
116    }
117}