1use serde::{Deserialize, Serialize};
5use serde_json::Value;
6
7use crate::event::BaseEvent;
8use crate::ids::SubagentRunId;
9use crate::message::Message;
10use crate::patch::PatchOperation;
11
12#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
14#[serde(rename_all = "camelCase")]
15#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
16#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
17pub struct StateSnapshotEvent {
18 #[serde(flatten)]
20 pub base: BaseEvent,
21 pub snapshot: Value,
23 #[serde(
28 default,
29 deserialize_with = "crate::serde_util::reject_null",
30 skip_serializing_if = "Option::is_none"
31 )]
32 pub subagent_run_id: Option<SubagentRunId>,
33}
34
35impl StateSnapshotEvent {
36 pub fn new(snapshot: impl Into<Value>) -> Self {
38 Self {
39 base: BaseEvent::default(),
40 snapshot: snapshot.into(),
41 subagent_run_id: None,
42 }
43 }
44}
45
46#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
48#[serde(rename_all = "camelCase")]
49#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
50#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
51pub struct StateDeltaEvent {
52 #[serde(flatten)]
54 pub base: BaseEvent,
55 pub delta: Vec<PatchOperation>,
57 #[serde(
61 default,
62 deserialize_with = "crate::serde_util::reject_null",
63 skip_serializing_if = "Option::is_none"
64 )]
65 pub subagent_run_id: Option<SubagentRunId>,
66}
67
68impl StateDeltaEvent {
69 pub fn new(delta: impl Into<Vec<PatchOperation>>) -> Self {
71 Self {
72 base: BaseEvent::default(),
73 delta: delta.into(),
74 subagent_run_id: None,
75 }
76 }
77}
78
79#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
87#[serde(rename_all = "camelCase")]
88#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
89#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
90pub struct MessagesSnapshotEvent {
91 #[serde(flatten)]
93 pub base: BaseEvent,
94 pub messages: Vec<Message>,
96}
97
98impl MessagesSnapshotEvent {
99 pub fn new(messages: impl Into<Vec<Message>>) -> Self {
101 Self {
102 base: BaseEvent::default(),
103 messages: messages.into(),
104 }
105 }
106}