moadim 1.6.1

Loop engine for AI agents — routines over REST, MCP, and a built-in web UI
//! `OpenAPI` 3.0 spec for the Moadim Server REST API, generated from utoipa path decorators.

#[derive(utoipa::OpenApi)]
#[openapi(
    // `version` is intentionally omitted so utoipa derives it from `CARGO_PKG_VERSION`,
    // keeping the spec in lockstep with the crate instead of a frozen literal (see issue #309).
    info(title = "Moadim Server API", description = "REST API for managing routines"),
    // Host-relative server URL: Swagger UI resolves "Try it out" requests against the origin the
    // docs were loaded from, so it follows a custom MOADIM_BIND_ADDR port or a reverse proxy instead
    // of a hardcoded 127.0.0.1:5784 that breaks the moment the daemon isn't bound there (issue #385).
    servers((url = "/api/v1", description = "This server")),
    paths(
        crate::routes::health::health,
        crate::routes::metrics::metrics,
        crate::routes::shutdown::shutdown,
        crate::routes::restart::restart,
        crate::routes::http::get_current_machine,
        crate::routes::http::put_machine,
        crate::routes::http::list_machines,
        crate::routes::http::get_user_prompt,
        crate::routes::http::put_user_prompt,
        crate::routes::http::get_max_concurrent_runs,
        crate::routes::http::put_max_concurrent_runs,
        crate::routes::list_routines::list_routines,
        crate::routes::list_agents::list_agents,
        crate::routes::create_routine::create_routine,
        crate::routes::get_routine::get_routine,
        crate::routines::get_prompt_preview,
        crate::routes::update_routine::replace,
        crate::routes::update_routine::update_routine,
        crate::routes::delete_routine::delete_routine,
        crate::routes::trigger_routine::trigger_routine,
        crate::routines::scheduled_trigger,
        crate::routes::cleanup_workbenches::cleanup_workbenches,
        crate::routes::get_lock_status::get_lock_status,
        crate::routes::lock_routines::lock_routines,
        crate::routes::unlock_routines::unlock_routines,
        crate::routines::get_logs,
        crate::routes::list_routine_runs::list_routine_runs,
        crate::routines::get_run_log,
        crate::routines::get_run_summary,
        crate::routines::get_all_runs,
        crate::routines::ical_feed,
        crate::routes::create_flag::create_flag,
        crate::routes::list_flags::list_flags,
        crate::routes::resolve_flag::resolve_flag,
    ),
    components(schemas(
        crate::routines::Routine,
        crate::routines::Repository,
        crate::routines::RoutineResponse,
        crate::routines::CreateRoutineRequest,
        crate::routines::UpdateRoutineRequest,
        crate::routines::CleanupResponse,
        crate::routines::RunSummary,
        crate::routines::RunStatus,
        crate::routines::FleetRunSummary,
        crate::routines::RoutineSort,
        crate::routines::SortOrder,
        crate::routines::Flag,
        crate::routines::FlagScope,
        crate::routes::create_flag::CreateFlagRequest,
        crate::routes::health::HealthResponse,
        crate::routes::health::DependencyHealth,
        crate::routes::shutdown::ShutdownResponse,
        crate::routes::restart::RestartResponse,
        crate::routes::http::MachineResponse,
        crate::routes::http::SetMachineRequest,
        crate::routes::http::SetUserPromptRequest,
        crate::routes::http::MaxConcurrentRunsResponse,
        crate::routes::http::SetMaxConcurrentRunsRequest,
        crate::global_lock::LockStatus,
        crate::routes::lock_routines::LockRequest,
    ))
)]
/// `OpenAPI` document aggregating all REST paths and component schemas.
pub struct ApiDoc;

impl ApiDoc {
    /// Serialize the `OpenAPI` spec to a pretty-printed JSON string.
    pub fn to_json() -> String {
        use utoipa::OpenApi as _;
        serde_json::to_string_pretty(&Self::openapi()).unwrap_or_default()
    }
}

#[cfg(test)]
#[path = "openapi_tests.rs"]
mod openapi_tests;