use serde::{Deserialize, Serialize};
use serde_json::Value;
use vigil_audit::{
EventHit, ReplayEvent, SecretRefEntry, ServerOnboardingData, StoredServerProfile,
ToolApprovalCard, ToolSecretBinding,
};
use vigil_runner_types::SandboxProfile;
use vigil_types::{ApprovalRequest, ApprovalScope, ApprovalStatus};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "kind", content = "data")]
#[non_exhaustive]
pub enum UiResponse {
Ack,
EventList(Vec<EventSummary>),
EventDetail(EventDetail),
SearchHits(Vec<EventHit>),
ApprovalList(Vec<ApprovalSummary>),
ApprovalDetail(ApprovalDetailDto),
SessionList(Vec<SessionSummary>),
ReplayDump(SessionReplay),
ChainVerification(ChainVerifyReport),
ServerList(Vec<StoredServerProfile>),
ServerOnboarding(ServerOnboardingData),
ToolApprovalList(Vec<ToolApprovalCard>),
DriftedServerList(Vec<ServerOnboardingData>),
SandboxProfileList(Vec<SandboxProfile>),
SandboxProfileOpt(Option<SandboxProfile>),
ApprovalResolution(ApprovalResolutionDto),
SandboxProfileUpserted(SandboxProfileUpsertDto),
SecretBinding(SecretBindingSummary),
PrivacyFindings(PrivacyFindingsDto),
SessionExport(SessionExportDto),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EventSummary {
pub event_id: i64,
pub session_id: String,
pub event_type: String,
pub redacted_text: Option<String>,
pub created_at: i64,
}
impl From<ReplayEvent> for EventSummary {
fn from(e: ReplayEvent) -> Self {
Self {
event_id: e.event_id,
session_id: e.session_id,
event_type: e.event_type,
redacted_text: e.redacted_text,
created_at: e.created_at,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EventDetail {
pub event_id: i64,
pub session_id: String,
pub event_type: String,
pub payload: Value,
pub redacted_text: Option<String>,
pub prev_hash: String,
pub event_hash: String,
pub created_at: i64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ApprovalSummary {
pub approval_id: String,
pub session_id: String,
pub title: String,
pub summary: String,
pub status: ApprovalStatus,
pub expires_at: i64,
}
impl From<&ApprovalRequest> for ApprovalSummary {
fn from(r: &ApprovalRequest) -> Self {
Self {
approval_id: r.approval_id.clone(),
session_id: r.session_id.clone(),
title: r.title.clone(),
summary: r.summary.clone(),
status: r.status,
expires_at: r.expires_at,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct PrivacyFindingDto {
pub label: String,
pub count: i64,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct SessionExportDto {
pub session_id: String,
pub format: crate::ExportFormat,
pub content: String,
pub byte_len: usize,
pub event_count: usize,
pub generated_at: i64,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct RedactionScanSummaryDto {
pub scan_id: String,
pub session_id: String,
pub ts: i64,
pub source: String,
pub text_length_bucket: i64,
pub fingerprint: String,
pub finding_count: i64,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)]
pub struct PrivacyFindingsDto {
pub by_label_total: Vec<PrivacyFindingDto>,
pub recent_scans: Vec<RedactionScanSummaryDto>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ApprovalDetailDto {
pub request: ApprovalRequest,
pub invocation_id: String,
pub decision_id: String,
#[serde(default)]
pub privacy_findings: Vec<PrivacyFindingDto>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SessionSummary {
pub session_id: String,
pub source: String,
pub app_name: Option<String>,
pub started_at: i64,
pub ended_at: Option<i64>,
pub risk_score: i64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SessionReplay {
pub session_id: String,
pub event_count: usize,
pub events: Vec<EventDetail>,
pub chain_verified: Option<ChainVerifyReport>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChainVerifyReport {
pub ok: bool,
pub broken_at_event_id: Option<i64>,
pub message: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ApprovalResolutionDto {
pub approval_id: String,
pub status: ApprovalStatus,
pub scope: Option<ApprovalScope>,
pub resolved_by: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SandboxProfileUpsertDto {
pub profile_id: String,
pub profile_hash: String,
pub inserted: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SecretBindingSummary {
pub server_id: String,
pub refs: Vec<SecretRefEntry>,
pub bindings: Vec<ToolSecretBinding>,
}