Skip to main content

khive_types/
agent.rs

1//! Agent process lifecycle types (ADR-142 §1, "Persistent process record").
2
3extern crate alloc;
4use alloc::string::String;
5use alloc::vec::Vec;
6
7#[cfg(feature = "serde")]
8use serde::{Deserialize, Serialize};
9
10/// One of the four lifecycle states an agent process record can occupy.
11#[derive(Debug, Clone, Copy, PartialEq, Eq)]
12#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
13#[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))]
14pub enum AgentState {
15    Spawned,
16    Running,
17    Suspended,
18    Terminal,
19}
20
21/// Why a record reached `Terminal`. Set exactly once, at the transition into `Terminal`.
22#[derive(Debug, Clone, Copy, PartialEq, Eq)]
23#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
24#[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))]
25pub enum TerminalReason {
26    Completed,
27    Failed,
28    Killed,
29    Abandoned,
30    HostRestart,
31}
32
33/// The runtime-owned agent process record (ADR-142 §1, "Persistent process record").
34#[derive(Debug, Clone)]
35#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
36pub struct AgentRecord {
37    pub agent_id: String,
38    pub state: AgentState,
39    pub terminal_reason: Option<TerminalReason>,
40    pub provider: String,
41    pub provider_session_id: Option<String>,
42    pub checkpoint_session_id: Option<String>,
43    pub checkpoint_cursor: Option<i64>,
44    pub owner_actor: String,
45    pub owner_peer_class: String,
46    pub owner_write_namespace: String,
47    pub owner_visible_namespaces: Vec<String>,
48    pub spawn_fingerprint: String,
49    pub spawned_at: i64,
50    pub state_changed_at: i64,
51    pub idempotency_key: Option<String>,
52}