use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
#[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>,
#[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>,
}
#[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,
}