liminal-server 0.24.9

Standalone server for the liminal messaging bus
Documentation
//! The sole writer of the retained agent state subject.

use super::error::AgentError;
use super::runtime::Agents;

/// Records AGT-004's waiting state on the same retained subject used for
///
/// presence and departure. Call after Lys has durably retained the draft;
/// `words` are the exact held words and never enter a Debug or a log.
///
/// # Errors
/// Unknown or retired agent, malformed draft, oversized words, or failed delivery.
pub fn write_waiting(
    agents: &Agents,
    name: &str,
    draft: &str,
    words: &str,
) -> Result<(), AgentError> {
    let record = agents.registry().record(name)?;
    if !record.active() {
        return Err(AgentError::Transition("agent is retired"));
    }
    agents.bounds().field(draft, "waiting draft")?;
    if words.is_empty() {
        return Err(AgentError::Invalid("waiting words"));
    }
    if words.len() > agents.bounds().max_event_bytes {
        return Err(AgentError::Bound {
            bound: "max_event_bytes",
            limit: agents.bounds().max_event_bytes,
            count: words.len(),
        });
    }
    agents.retained().publish(&[(
        format!("agents.{name}.state"),
        serde_json::json!({"state":"waiting", "draft":draft, "words":words}),
    )])
}