1use crate::{ActorRef, NodeId, PolicyId};
2use serde::{Deserialize, Serialize};
3use serde_json::Value as JsonValue;
4
5#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
6pub enum PolicyAction {
7 CreateNode,
8 CreateRelation,
9 PromotePatch,
10 MutatePrompt,
11 MutateToolConfig,
12 MutateMemory,
13 PromoteProjectPatch,
14}
15
16#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
17pub enum PolicyDecision {
18 Allow,
19 RequireApproval,
20 Deny,
21}
22
23#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
24pub enum ApprovalStatus {
25 Pending,
26 Approved,
27 Rejected,
28}
29
30#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
31pub struct Policy {
32 pub id: PolicyId,
33 pub title: String,
34 pub action: PolicyAction,
35 pub decision: PolicyDecision,
36 pub reason: Option<String>,
37}
38
39impl Policy {
40 pub fn require_approval(id: PolicyId, title: impl Into<String>, action: PolicyAction) -> Self {
41 Self {
42 id,
43 title: title.into(),
44 action,
45 decision: PolicyDecision::RequireApproval,
46 reason: None,
47 }
48 }
49}
50
51#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
52pub struct ApprovalRequest {
53 pub id: NodeId,
54 pub policy_id: PolicyId,
55 pub action: PolicyAction,
56 pub target: Option<NodeId>,
57 pub requested_by: ActorRef,
58 pub status: ApprovalStatus,
59 pub reason: Option<String>,
60 pub metadata: JsonValue,
61}