1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4
5use crate::contracts::{Capability, CapabilityToken, ExecutionRoute};
6
7#[non_exhaustive]
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
9pub enum ExecutionPlane {
10 Connector,
11 Runtime,
12 Tool,
13 Memory,
14}
15
16#[non_exhaustive]
17#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
18pub enum PlaneTier {
19 Legacy,
20 Core,
21 Extension,
22}
23
24#[non_exhaustive]
25#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
26pub enum AuditEventKind {
27 TokenIssued {
28 token: CapabilityToken,
29 },
30 TokenRevoked {
31 token_id: String,
32 },
33 TaskDispatched {
34 pack_id: String,
35 task_id: String,
36 route: ExecutionRoute,
37 required_capabilities: Vec<Capability>,
38 },
39 ConnectorInvoked {
40 pack_id: String,
41 connector_name: String,
42 operation: String,
43 required_capabilities: Vec<Capability>,
44 },
45 PlaneInvoked {
46 pack_id: String,
47 plane: ExecutionPlane,
48 tier: PlaneTier,
49 primary_adapter: String,
50 delegated_core_adapter: Option<String>,
51 operation: String,
52 required_capabilities: Vec<Capability>,
53 },
54 SecurityScanEvaluated {
55 pack_id: String,
56 scanned_plugins: usize,
57 total_findings: usize,
58 high_findings: usize,
59 medium_findings: usize,
60 low_findings: usize,
61 blocked: bool,
62 block_reason: Option<String>,
63 categories: Vec<String>,
64 finding_ids: Vec<String>,
65 },
66 PluginTrustEvaluated {
67 pack_id: String,
68 scanned_plugins: usize,
69 official_plugins: usize,
70 verified_community_plugins: usize,
71 unverified_plugins: usize,
72 high_risk_plugins: usize,
73 high_risk_unverified_plugins: usize,
74 blocked_auto_apply_plugins: usize,
75 review_required_plugin_ids: Vec<String>,
76 review_required_bridges: Vec<String>,
77 },
78 ToolSearchEvaluated {
79 pack_id: String,
80 query: String,
81 returned: usize,
82 trust_filter_applied: bool,
83 query_requested_tiers: Vec<String>,
84 structured_requested_tiers: Vec<String>,
85 effective_tiers: Vec<String>,
86 conflicting_requested_tiers: bool,
87 filtered_out_candidates: usize,
88 filtered_out_tier_counts: BTreeMap<String, usize>,
89 top_provider_ids: Vec<String>,
90 },
91 ProviderFailover {
92 pack_id: String,
93 provider_id: String,
94 reason: String,
95 stage: String,
96 model: String,
97 attempt: usize,
98 max_attempts: usize,
99 status_code: Option<u16>,
100 try_next_model: bool,
101 auto_model_mode: bool,
102 candidate_index: usize,
103 candidate_count: usize,
104 },
105 AuthorizationDenied {
106 pack_id: String,
107 token_id: String,
108 reason: String,
109 },
110}
111
112#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
113pub struct AuditEvent {
114 pub event_id: String,
115 pub timestamp_epoch_s: u64,
116 pub agent_id: Option<String>,
117 pub kind: AuditEventKind,
118}