Skip to main content

yoagent_state/
policy.rs

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}