Skip to main content

meerkat_contracts/wire/
runtime.rs

1//! Runtime and input RPC wire contracts.
2
3use serde::{Deserialize, Serialize};
4
5/// Request payload for `runtime/state`.
6#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
7#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
8pub struct RuntimeStateParams {
9    pub session_id: String,
10}
11
12/// Request payload for `runtime/accept`.
13#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
14#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
15pub struct RuntimeAcceptParams {
16    pub session_id: String,
17    pub input: serde_json::Value,
18}
19
20/// Request payload for `runtime/retire`.
21#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
22#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
23pub struct RuntimeRetireParams {
24    pub session_id: String,
25}
26
27/// Request payload for `runtime/reset`.
28#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
29#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
30pub struct RuntimeResetParams {
31    pub session_id: String,
32}
33
34/// Request payload for `input/state`.
35#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
36#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
37pub struct InputStateParams {
38    pub session_id: String,
39    pub input_id: String,
40}
41
42/// Request payload for `input/list`.
43#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
44#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
45pub struct InputListParams {
46    pub session_id: String,
47}
48
49/// Public runtime state projection used by RPC surfaces.
50#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
51#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
52#[serde(rename_all = "snake_case")]
53pub enum WireRuntimeState {
54    Initializing,
55    Idle,
56    Attached,
57    Running,
58    Recovering,
59    Retired,
60    Stopped,
61    Destroyed,
62}
63
64/// Response payload for `runtime/state`.
65#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
66#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
67pub struct RuntimeStateResult {
68    pub state: WireRuntimeState,
69}
70
71/// Discriminator for `runtime/accept` responses.
72#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
73#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
74#[serde(rename_all = "snake_case")]
75pub enum RuntimeAcceptOutcomeType {
76    Accepted,
77    Deduplicated,
78    Rejected,
79}
80
81/// Public input lifecycle state projection used by RPC surfaces.
82#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
83#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
84#[serde(rename_all = "snake_case")]
85pub enum WireInputLifecycleState {
86    Accepted,
87    Queued,
88    Staged,
89    Applied,
90    AppliedPendingConsumption,
91    Consumed,
92    Superseded,
93    Coalesced,
94    Abandoned,
95}
96
97/// Input transition history entry for RPC-facing snapshots.
98#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
99#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
100pub struct WireInputStateHistoryEntry {
101    pub timestamp: String,
102    pub from: WireInputLifecycleState,
103    pub to: WireInputLifecycleState,
104    #[serde(skip_serializing_if = "Option::is_none")]
105    pub reason: Option<String>,
106}
107
108/// RPC-facing input state snapshot.
109#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
110#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
111pub struct WireInputState {
112    pub input_id: String,
113    pub current_state: WireInputLifecycleState,
114    #[serde(skip_serializing_if = "Option::is_none")]
115    pub policy: Option<serde_json::Value>,
116    #[serde(skip_serializing_if = "Option::is_none")]
117    pub terminal_outcome: Option<serde_json::Value>,
118    #[serde(skip_serializing_if = "Option::is_none")]
119    pub durability: Option<serde_json::Value>,
120    #[serde(skip_serializing_if = "Option::is_none")]
121    pub idempotency_key: Option<String>,
122    #[serde(default)]
123    pub attempt_count: u32,
124    #[serde(default)]
125    pub recovery_count: u32,
126    #[serde(default, skip_serializing_if = "Vec::is_empty")]
127    pub history: Vec<WireInputStateHistoryEntry>,
128    #[serde(skip_serializing_if = "Option::is_none")]
129    pub reconstruction_source: Option<serde_json::Value>,
130    #[serde(default, skip_serializing_if = "Option::is_none")]
131    pub persisted_input: Option<serde_json::Value>,
132    #[serde(default, skip_serializing_if = "Option::is_none")]
133    pub last_run_id: Option<String>,
134    #[serde(default, skip_serializing_if = "Option::is_none")]
135    pub last_boundary_sequence: Option<u64>,
136    pub created_at: String,
137    pub updated_at: String,
138}
139
140/// Response payload for `input/state`.
141#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
142#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
143#[serde(untagged)]
144pub enum InputStateResult {
145    Found(Box<WireInputState>),
146    Missing(()),
147}
148
149/// Response payload for `runtime/accept`.
150#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
151#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
152pub struct RuntimeAcceptResult {
153    pub outcome_type: RuntimeAcceptOutcomeType,
154    #[serde(skip_serializing_if = "Option::is_none")]
155    pub input_id: Option<String>,
156    #[serde(skip_serializing_if = "Option::is_none")]
157    pub existing_id: Option<String>,
158    #[serde(skip_serializing_if = "Option::is_none")]
159    pub reason: Option<String>,
160    #[serde(skip_serializing_if = "Option::is_none")]
161    pub policy: Option<serde_json::Value>,
162    #[serde(skip_serializing_if = "Option::is_none")]
163    pub state: Option<WireInputState>,
164}
165
166/// Response payload for `runtime/retire`.
167#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
168#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
169pub struct RuntimeRetireResult {
170    pub inputs_abandoned: usize,
171    #[serde(default)]
172    pub inputs_pending_drain: usize,
173}
174
175/// Response payload for `runtime/reset`.
176#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
177#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
178pub struct RuntimeResetResult {
179    pub inputs_abandoned: usize,
180}
181
182/// Response payload for `input/list`.
183#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
184#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
185pub struct InputListResult {
186    pub input_ids: Vec<String>,
187}