1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3use serde_json::Value;
4
5#[derive(Clone, Debug, Default, Serialize, Deserialize, Eq, PartialEq)]
6pub enum IdentityEntityType {
7 PersonaEntity,
8 UserEntity,
9 ChannelProfileEntity,
10 PolicyProfileEntity,
11 #[default]
12 RelationshipEntity,
13}
14
15#[derive(Clone, Copy, Debug, Default, Serialize, Deserialize, Eq, PartialEq, Hash)]
16pub enum UpdateTier {
17 #[default]
18 AutoCommit,
19 ConfirmRequired,
20 ApprovalRequired,
21}
22
23#[derive(Clone, Copy, Debug, Serialize, Deserialize, Eq, PartialEq)]
24pub enum ProposalState {
25 Proposed,
26 Committed,
27 Rejected,
28 Expired,
29}
30
31#[derive(Clone, Copy, Debug, Default, Serialize, Deserialize, Eq, PartialEq)]
32pub enum UpdateSource {
33 UserDirect,
34 #[default]
35 ModelInferred,
36 SystemEvent,
37}
38
39#[derive(Clone, Copy, Debug, Default, Serialize, Deserialize, Eq, PartialEq)]
40pub enum RelationshipStatus {
41 #[default]
42 Proposed,
43 Active,
44 Suspended,
45 Deprecated,
46 Revoked,
47}
48
49#[derive(Clone, Debug, Default, Serialize, Deserialize, Eq, PartialEq)]
50pub struct EntityRef {
51 pub entity_type: String,
52 pub entity_id: String,
53}
54
55#[derive(Clone, Debug, Default, Serialize, Deserialize, Eq, PartialEq)]
56pub struct EscalationPolicy {
57 pub mode: Option<String>,
58 pub fallback: Option<String>,
59}
60
61#[derive(Clone, Debug, Default, Serialize, Deserialize, PartialEq)]
62pub struct InterruptionPolicy {
63 pub quiet_hours: Option<String>,
64 pub allow_urgent_only: Option<bool>,
65 pub urgent_threshold: Option<f32>,
66}
67
68#[derive(Clone, Debug, Default, Serialize, Deserialize, Eq, PartialEq)]
69pub struct AutonomyScope {
70 pub allow: Vec<String>,
71 pub deny: Vec<String>,
72 pub approval_required: Vec<String>,
73}
74
75#[derive(Clone, Debug, Default, Serialize, Deserialize)]
76pub struct PersonaEntity {
77 pub persona_id: String,
78 pub display_name: String,
79 pub status: String,
80 pub version: i32,
81 pub updated_at: DateTime<Utc>,
82}
83
84#[derive(Clone, Debug, Default, Serialize, Deserialize)]
85pub struct UserEntity {
86 pub user_id: String,
87 pub timezone: String,
88 pub language_variant: Option<String>,
89 pub status: String,
90 pub version: i32,
91 pub updated_at: DateTime<Utc>,
92}
93
94#[derive(Clone, Debug, Default, Serialize, Deserialize)]
95pub struct ChannelProfileEntity {
96 pub channel_id: String,
97 pub channel_type: String,
98 pub proactive_allowed: bool,
99 pub status: String,
100 pub version: i32,
101 pub updated_at: DateTime<Utc>,
102}
103
104#[derive(Clone, Debug, Default, Serialize, Deserialize)]
105pub struct PolicyProfileEntity {
106 pub policy_profile_id: String,
107 pub graph_max_depth: usize,
108 pub trust_delta_max_per_window: f32,
109 pub status: String,
110 pub version: i32,
111 pub updated_at: DateTime<Utc>,
112}
113
114#[derive(Clone, Debug, Default, Serialize, Deserialize)]
115pub struct RelationshipEntity {
116 pub relationship_id: String,
117 pub source_entity_ref: EntityRef,
118 pub target_entity_ref: EntityRef,
119 pub relationship_kind: String,
120 pub status: RelationshipStatus,
121 pub trust_level: f32,
122 pub confidence: f32,
123 pub strength_score: f32,
124 pub recency_score: f32,
125 pub autonomy_scope: AutonomyScope,
126 pub approval_profile_id: Option<String>,
127 pub interruption_policy: InterruptionPolicy,
128 pub escalation_policy: EscalationPolicy,
129 pub policy_tags: Vec<String>,
130 pub provenance: UpdateSource,
131 pub parent_relationship_id: Option<String>,
132 pub governing_relationship_ids: Vec<String>,
133 pub derived_from_relationship_id: Option<String>,
134 pub last_transition_reason: Option<String>,
135 pub transition_receipt_id: Option<String>,
136 pub version: i32,
137 pub created_at: DateTime<Utc>,
138 pub updated_at: DateTime<Utc>,
139}
140
141#[derive(Clone, Debug, Default, Serialize, Deserialize)]
142pub struct FlattenedPolicyClaim {
143 pub claim_id: String,
144 pub source_relationship_ids: Vec<String>,
145 pub summary: String,
146 pub confidence: f32,
147 pub timestamp: DateTime<Utc>,
148}
149
150#[derive(Clone, Debug, Default, Serialize, Deserialize)]
151pub struct GetIdentityContextRequest {
152 pub user_id: String,
153 pub persona_id: String,
154 pub channel_id: String,
155 pub relationship_limit: usize,
156}
157
158#[derive(Clone, Debug, Default, Serialize, Deserialize)]
159pub struct GetIdentityContextResponse {
160 pub persona: Option<PersonaEntity>,
161 pub user: Option<UserEntity>,
162 pub channel: Option<ChannelProfileEntity>,
163 pub relationships: Vec<RelationshipEntity>,
164 pub policy_profiles: Vec<PolicyProfileEntity>,
165 pub graph_depth_used: usize,
166 pub flattened_claims: Vec<FlattenedPolicyClaim>,
167}
168
169#[derive(Clone, Debug, Default, Serialize, Deserialize)]
170pub struct ProposeEntityUpdateRequest {
171 pub entity_type: IdentityEntityType,
172 pub entity_id: String,
173 pub patch: Value,
174 pub source: UpdateSource,
175 pub confidence: f32,
176 pub reason: String,
177 pub actor: String,
178 pub receipt_id: Option<String>,
179 pub expires_at: Option<DateTime<Utc>>,
180}
181
182#[derive(Clone, Debug, Default, Serialize, Deserialize)]
183pub struct ProposeEntityUpdateResponse {
184 pub proposal_ids: Vec<String>,
185 pub tiers: Vec<UpdateTier>,
186 pub requires_approval: bool,
187 pub split_patch: bool,
188 pub policy_notes: Vec<String>,
189}
190
191#[derive(Clone, Debug, Serialize, Deserialize)]
192pub struct EntityUpdateProposalRecord {
193 pub proposal_id: String,
194 pub entity_type: IdentityEntityType,
195 pub entity_id: String,
196 pub patch: Value,
197 pub tier: UpdateTier,
198 pub source: UpdateSource,
199 pub confidence: f32,
200 pub reason: String,
201 pub state: ProposalState,
202 pub approver: Option<String>,
203 pub actor: String,
204 pub receipt_id: Option<String>,
205 pub expires_at: Option<DateTime<Utc>>,
206 pub created_at: DateTime<Utc>,
207 pub updated_at: DateTime<Utc>,
208}
209
210#[derive(Clone, Debug, Default, Serialize, Deserialize)]
211pub struct CommitEntityUpdateRequest {
212 pub proposal_id: String,
213 pub expected_version: i32,
214 pub approver: Option<String>,
215}
216
217#[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq)]
218pub enum CommitOutcomeCode {
219 Ok,
220 StaleState,
221 ApprovalRequired,
222 PolicyDenied,
223 InvalidPatch,
224 ExpiredProposal,
225 NotFound,
226}
227
228#[derive(Clone, Debug, Default, Serialize, Deserialize)]
229pub struct CommitEntityUpdateResponse {
230 pub committed: bool,
231 pub code: Option<CommitOutcomeCode>,
232 pub entity_type: Option<IdentityEntityType>,
233 pub entity_id: Option<String>,
234 pub new_version: Option<i32>,
235 pub receipt_id: Option<String>,
236 pub transition_event_id: Option<String>,
237 pub sttp_bridge_node: Option<String>,
238 pub sttp_bridge_reason: Option<String>,
239 pub rationale: Option<String>,
240}
241
242#[derive(Clone, Debug, Serialize, Deserialize)]
243pub struct RelationshipTransitionEvent {
244 pub event_id: String,
245 pub relationship_id: String,
246 pub from_status: Option<RelationshipStatus>,
247 pub to_status: RelationshipStatus,
248 pub reason: String,
249 pub actor: String,
250 pub receipt_id: Option<String>,
251 pub occurred_at: DateTime<Utc>,
252 pub metadata: Option<Value>,
253}
254
255#[derive(Clone, Debug, Default, Serialize, Deserialize)]
256pub struct ListEntityHistoryRequest {
257 pub entity_type: IdentityEntityType,
258 pub entity_id: String,
259 pub limit: usize,
260}
261
262#[derive(Clone, Debug, Default, Serialize, Deserialize)]
263pub struct ListEntityHistoryResponse {
264 pub proposals: Vec<EntityUpdateProposalRecord>,
265 pub transitions: Vec<RelationshipTransitionEvent>,
266}
267
268#[derive(Clone, Debug, Default, Serialize, Deserialize)]
269pub struct RollbackEntityVersionRequest {
270 pub entity_type: IdentityEntityType,
271 pub entity_id: String,
272 pub target_version: i32,
273 pub reason: String,
274 pub approver: String,
275}
276
277#[derive(Clone, Debug, Default, Serialize, Deserialize)]
278pub struct RollbackEntityVersionResponse {
279 pub rolled_back: bool,
280 pub new_version: Option<i32>,
281 pub rollback_receipt_id: Option<String>,
282 pub rationale: Option<String>,
283}