Skip to main content

liminal_server/agents/
state.rs

1//! The sole writer of the retained agent state subject.
2
3use super::error::AgentError;
4use super::runtime::Agents;
5
6/// Records AGT-004's waiting state on the same retained subject used for
7///
8/// presence and departure. Call after Lys has durably retained the draft;
9/// `words` are the exact held words and never enter a Debug or a log.
10///
11/// # Errors
12/// Unknown or retired agent, malformed draft, oversized words, or failed delivery.
13pub fn write_waiting(
14    agents: &Agents,
15    name: &str,
16    draft: &str,
17    words: &str,
18) -> Result<(), AgentError> {
19    let record = agents.registry().record(name)?;
20    if !record.active() {
21        return Err(AgentError::Transition("agent is retired"));
22    }
23    agents.bounds().field(draft, "waiting draft")?;
24    if words.is_empty() {
25        return Err(AgentError::Invalid("waiting words"));
26    }
27    if words.len() > agents.bounds().max_event_bytes {
28        return Err(AgentError::Bound {
29            bound: "max_event_bytes",
30            limit: agents.bounds().max_event_bytes,
31            count: words.len(),
32        });
33    }
34    agents.retained().publish(&[(
35        format!("agents.{name}.state"),
36        serde_json::json!({"state":"waiting", "draft":draft, "words":words}),
37    )])
38}