invoance 0.1.0

Official Rust SDK for the Invoance compliance API
Documentation
//! AI Attestations models.

use serde::Deserialize;

use super::{JsonObject, OrganizationPublic};

/// Parameters for [`AttestationsResource::ingest`](crate::resources::attestations::AttestationsResource::ingest).
#[derive(Debug, Clone, Default)]
pub struct IngestAttestationParams {
    /// Wire key `type`.
    pub r#type: String,
    /// Nested under `payload.input`.
    pub input: String,
    /// Nested under `payload.output`.
    pub output: String,
    /// Nested under `context.model_provider`.
    pub model_provider: String,
    /// Nested under `context.model_name`.
    pub model_name: String,
    /// Nested under `context.model_version`.
    pub model_version: String,
    /// Subject context — `user_id`, `session_id`, plus arbitrary extra keys.
    /// Omitted from the request when empty.
    pub subject: Option<JsonObject>,
    /// Per-call idempotency key.
    pub idempotency_key: Option<String>,
    /// Wire key `trace_id`.
    pub trace_id: Option<String>,
}

#[derive(Debug, Clone, Deserialize)]
pub struct IngestAttestationResponse {
    pub attestation_id: String,
    pub created_at: String,
    pub input_hash: String,
    pub output_hash: String,
    pub payload_hash: String,
    pub status: String,
}

/// Parameters for [`AttestationsResource::list`](crate::resources::attestations::AttestationsResource::list).
#[derive(Debug, Clone, Default)]
pub struct ListAttestationsParams {
    pub page: Option<u32>,
    pub limit: Option<u32>,
    pub date_from: Option<String>,
    pub date_to: Option<String>,
    pub attestation_type: Option<String>,
    pub model_provider: Option<String>,
}

#[derive(Debug, Clone, Deserialize)]
pub struct AttestationListItem {
    pub attestation_id: String,
    pub attestation_type: String,
    pub attestation_hash: String,
    #[serde(default)]
    pub model_provider: Option<String>,
    #[serde(default)]
    pub model_name: Option<String>,
    pub retention_policy: String,
    pub created_at: String,
}

#[derive(Debug, Clone, Deserialize)]
pub struct ListAttestationsResponse {
    pub attestations: Vec<AttestationListItem>,
    pub page: u32,
    pub limit: u32,
    pub total: u64,
    pub has_more: bool,
}

#[derive(Debug, Clone, Deserialize)]
pub struct AiAttestation {
    pub attestation_id: String,
    pub tenant_id: String,
    pub attestation_type: String,
    pub attestation_hash: String,
    #[serde(default)]
    pub input_hash: Option<String>,
    #[serde(default)]
    pub output_hash: Option<String>,
    pub signed_payload: String,
    pub signature: String,
    pub public_key: String,
    pub signature_alg: String,
    #[serde(default)]
    pub model_provider: Option<String>,
    #[serde(default)]
    pub model_name: Option<String>,
    #[serde(default)]
    pub model_version: Option<String>,
    pub retention_policy: String,
    pub created_at: String,
    #[serde(default)]
    pub organization: Option<OrganizationPublic>,
}

/// Result of client-side Ed25519 signature verification.
#[derive(Debug, Clone)]
pub struct SignatureVerificationResult {
    /// Whether the signature is valid.
    pub valid: bool,
    /// Human-readable reason if invalid, `None` if valid.
    pub reason: Option<String>,
    /// The attestation that was verified.
    pub attestation: AiAttestation,
    /// The parsed JSON that was covered by the signature (or `None`).
    pub signed_data: Option<serde_json::Value>,
}

/// Parameters for [`AttestationsResource::verify`](crate::resources::attestations::AttestationsResource::verify).
#[derive(Debug, Clone, Default)]
pub struct VerifyAttestationParams {
    pub content_hash: String,
}

#[derive(Debug, Clone, Deserialize)]
pub struct VerifyAttestationResponse {
    pub attestation_id: String,
    pub match_result: bool,
    #[serde(default)]
    pub matched_field: Option<String>,
    pub anchored_hash: String,
    pub submitted_hash: String,
    pub anchored_at: String,
    #[serde(default)]
    pub organization: Option<OrganizationPublic>,
}