Skip to main content

stasis/ports/outbound/memory/
identity_memory_models.rs

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}