forge_core_utils/
approvals.rs1use chrono::{DateTime, Duration, Utc};
2use serde::{Deserialize, Serialize};
3use ts_rs_forge::TS;
4use uuid::Uuid;
5
6pub const APPROVAL_TIMEOUT_SECONDS: i64 = 3600; #[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}