cueloop 0.5.0

A Rust CLI for managing AI agent loops with a structured JSON task queue
Documentation
//! Session loop-progress mutation helpers.
//!
//! Purpose:
//! - Session loop-progress mutation helpers.
//!
//! Responsibilities:
//! - Increment persisted loop progress without exposing persistence details to callers.
//!
//! Not handled here:
//! - Session validation.
//! - Recovery prompting.
//!
//!
//! Usage:
//! - Used through the crate module tree or integration test harness.
//!
//! Invariants/assumptions:
//! - Missing session files are a no-op.
//! - Progress updates reuse the same persistence path as session recovery.

use std::path::Path;

use anyhow::Result;

use super::persistence::{load_session, save_session};

/// Persist the current phase for the interrupted/resumable task session.
pub fn set_session_phase(cache_dir: &Path, phase: u8) -> Result<()> {
    let mut session = match load_session(cache_dir)? {
        Some(session) => session,
        None => {
            log::debug!("No session to update phase for");
            return Ok(());
        }
    };

    let now = crate::timeutil::now_utc_rfc3339_or_fallback();
    session.set_phase(phase, now);
    save_session(cache_dir, &session)
}

/// Increment the session's iterations_completed counter and persist.
pub fn mark_session_iteration_complete(cache_dir: &Path) -> Result<()> {
    let mut session = match load_session(cache_dir)? {
        Some(session) => session,
        None => {
            log::debug!("No session to mark iteration complete for");
            return Ok(());
        }
    };

    let now = crate::timeutil::now_utc_rfc3339_or_fallback();
    session.mark_iteration_complete(now);
    save_session(cache_dir, &session)
}

/// Increment the session's tasks_completed_in_loop counter and persist.
pub fn increment_session_progress(cache_dir: &Path) -> Result<()> {
    let mut session = match load_session(cache_dir)? {
        Some(session) => session,
        None => {
            log::debug!("No session to increment progress for");
            return Ok(());
        }
    };

    let now = crate::timeutil::now_utc_rfc3339_or_fallback();
    session.mark_task_complete(now);
    save_session(cache_dir, &session)
}