reasoninglayer 0.2.1

Rust client SDK for the Reasoning Layer API
Documentation
//! Action review DTOs.

use std::collections::BTreeMap;

use serde::{Deserialize, Serialize};

/// Query parameters for `GET /action-reviews/pending`. Backend requires `tenant_id`.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ListActionReviewsQuery {
    pub tenant_id: String,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub agent_id: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub action_sort: Option<String>,
    /// Only include pending reviews (default: true).
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub pending_only: Option<bool>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub page: Option<u32>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub page_size: Option<u32>,
}

/// Query parameters for `GET /action-reviews/summary` (tenant-id required).
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ActionReviewSummaryQuery {
    pub tenant_id: String,
}

#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ActionReviewStatusDto {
    #[default]
    Pending,
    Approved,
    Rejected,
    Modified,
    TimedOut,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum ActionReviewReasonDto {
    Named(String),
    Custom { custom: String },
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ApproveActionRequest {
    pub review_id: String,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub notes: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RejectActionRequest {
    pub review_id: String,
    pub reason: String,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ModifyActionRequest {
    pub review_id: String,
    #[serde(default)]
    pub modified_params: BTreeMap<String, serde_json::Value>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub notes: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BulkApproveActionsRequest {
    pub review_ids: Vec<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub notes: Option<String>,
    pub reviewed_by: String,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BulkRejectActionsRequest {
    pub review_ids: Vec<String>,
    pub reason: String,
    pub reviewed_by: String,
}

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ActionReviewResponse {
    pub action_term_id: String,
    pub executed: bool,
    pub message: String,
    pub status: ActionReviewStatusDto,
    pub success: bool,
    pub will_execute: bool,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FailedReviewDto {
    pub reason: String,
    pub review_id: String,
}

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct BulkActionReviewResponse {
    #[serde(default)]
    pub failed_ids: Vec<FailedReviewDto>,
    pub failure_count: u64,
    #[serde(default)]
    pub succeeded_ids: Vec<String>,
    pub success_count: u64,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PendingActionReviewDto {
    pub action_sort: String,
    pub action_term_id: String,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub agent_id: Option<String>,
    pub confidence: f64,
    pub created_at: String,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub deadline: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub goal_context_id: Option<String>,
    pub priority: f64,
    pub reason: ActionReviewReasonDto,
    pub review_id: String,
    pub status: ActionReviewStatusDto,
    #[serde(default)]
    pub suggested_params: BTreeMap<String, serde_json::Value>,
}

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ListActionReviewsResponse {
    pub has_more: bool,
    #[serde(default)]
    pub items: Vec<PendingActionReviewDto>,
    pub page: u32,
    pub page_size: u32,
    pub total: u64,
}

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ActionReviewSummaryDto {
    #[serde(default)]
    pub by_action_sort: BTreeMap<String, u64>,
    #[serde(default)]
    pub by_reason: BTreeMap<String, u64>,
    pub expiring_soon_count: u64,
    pub high_priority_count: u64,
    pub total_pending: u64,
}