forge_core_utils/
approvals.rs

1use chrono::{DateTime, Duration, Utc};
2use serde::{Deserialize, Serialize};
3use ts_rs_forge::TS;
4use uuid::Uuid;
5
6pub const APPROVAL_TIMEOUT_SECONDS: i64 = 3600; // 1 hour
7
8#[derive(Debug, Clone, Serialize, Deserialize, TS)]
9pub struct ApprovalRequest {
10    pub id: String,
11    pub tool_name: String,
12    pub tool_input: serde_json::Value,
13    pub tool_call_id: String,
14    pub execution_process_id: Uuid,
15    pub created_at: DateTime<Utc>,
16    pub timeout_at: DateTime<Utc>,
17}
18
19impl ApprovalRequest {
20    pub fn from_create(request: CreateApprovalRequest, execution_process_id: Uuid) -> Self {
21        let now = Utc::now();
22        Self {
23            id: Uuid::new_v4().to_string(),
24            tool_name: request.tool_name,
25            tool_input: request.tool_input,
26            tool_call_id: request.tool_call_id,
27            execution_process_id,
28            created_at: now,
29            timeout_at: now + Duration::seconds(APPROVAL_TIMEOUT_SECONDS),
30        }
31    }
32}
33
34#[derive(Debug, Clone, Serialize, Deserialize, TS)]
35#[ts(export)]
36pub struct CreateApprovalRequest {
37    pub tool_name: String,
38    pub tool_input: serde_json::Value,
39    pub tool_call_id: String,
40}
41
42#[derive(Debug, Clone, Serialize, Deserialize, TS)]
43#[ts(export)]
44#[serde(tag = "status", rename_all = "snake_case")]
45pub enum ApprovalStatus {
46    Pending,
47    Approved,
48    Denied {
49        #[ts(optional)]
50        reason: Option<String>,
51    },
52    TimedOut,
53}
54
55#[derive(Debug, Clone, Serialize, Deserialize, TS)]
56#[ts(export)]
57pub struct ApprovalResponse {
58    pub execution_process_id: Uuid,
59    pub status: ApprovalStatus,
60}