agent-evaluate-v2-contract 0.1.0

Vendored Evaluate v2 transport contract for agent-infra-sdk
Documentation
//! Administration surface.
//!
//! The console needs a cross-tenant view that the tenant API deliberately
//! cannot give: platform drafts, every run, and the judge catalogue. Counts
//! and pages are bounded so an operations screen can never scan the world.

use std::collections::BTreeMap;

use serde::{Deserialize, Serialize};

use crate::binding::{BindingTarget, EvalBinding};
use crate::catalog::{Capability, OwnerKind, SnapshotLifecycle, SnapshotRef, SnapshotSummary};
use crate::run::{EvaluationSubject, OperationState};

/// Aggregate counts for the landing screen. Keyed by the enum's wire name so
/// a new state shows up without a schema change on the console side.
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AdminOverview {
    pub snapshots_by_lifecycle: BTreeMap<String, u64>,
    pub snapshots_by_owner: BTreeMap<String, u64>,
    pub ephemeral_snapshots: u64,
    pub runs_by_state: BTreeMap<String, u64>,
    pub case_runs_by_state: BTreeMap<String, u64>,
    pub analysis_tasks_by_state: BTreeMap<String, u64>,
    pub bindings: u64,
    pub judge_models: u64,
    pub gate_approved_judge_models: u64,
}

#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct ListAdminSnapshotsRequest {
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub owner: Option<OwnerKind>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub lifecycle: Option<SnapshotLifecycle>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub capability: Option<Capability>,
    /// Restricts tenant-owned rows; platform rows ignore it.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub tenant_id: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub cursor: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub limit: Option<usize>,
}

/// Same shape as the tenant listing plus the scope a platform operator needs
/// in order to tell two tenants' snapshots apart.
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AdminSnapshotSummary {
    #[serde(flatten)]
    pub summary: SnapshotSummary,
    pub tenant_id: String,
    pub project_id: String,
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AdminSnapshotPage {
    pub items: Vec<AdminSnapshotSummary>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub next_cursor: Option<String>,
}

#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct ListAdminRunsRequest {
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub state: Option<OperationState>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub tenant_id: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub cursor: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub limit: Option<usize>,
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AdminRunSummary {
    pub run_id: String,
    pub operation_id: String,
    pub tenant_id: String,
    pub project_id: String,
    pub target: BindingTarget,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub subject: Option<EvaluationSubject>,
    pub subject_version: String,
    pub snapshots: Vec<SnapshotRef>,
    pub state: OperationState,
    pub phase: String,
    pub completed_cases: usize,
    pub total_cases: usize,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub report_id: Option<String>,
    pub created_at_ms: i64,
    pub updated_at_ms: i64,
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AdminRunPage {
    pub items: Vec<AdminRunSummary>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub next_cursor: Option<String>,
}

#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct ListAdminBindingsRequest {
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub tenant_id: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub cursor: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub limit: Option<usize>,
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AdminBindingPage {
    pub items: Vec<EvalBinding>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub next_cursor: Option<String>,
}

/// Selects what an export bundle carries. An empty selection exports every
/// published platform snapshot, which is the usual "seed a new deployment"
/// case.
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct ExportBundleRequest {
    #[serde(default)]
    pub snapshots: Vec<SnapshotRef>,
}