use crank_core::{ApprovalRequest, OperationApprovalPolicy, sanitize_invocation_preview}; use crank_registry::PublishedAgentTool; use serde_json::{Value, json}; pub(super) fn approval_required_response( tool: &PublishedAgentTool, approval: &ApprovalRequest, policy: &OperationApprovalPolicy, ) -> Value { let approval_url = format!( "/v1/{}/{}/approvals/{}", tool.workspace_slug, tool.agent_slug, approval.id.as_str() ); json!({ "status": "approval_required", "approval_id": approval.id.as_str(), "approval_url": approval_url, "approve": { "method": "POST", "url": format!("{approval_url}/approve"), "body": { "approve": "yes" } }, "deny": { "method": "POST", "url": format!("{approval_url}/deny"), "body": { "approve": "no" } }, "expires_at": approval.expires_at, "risk_level": approval.risk_level, "payload_preview": if policy.show_payload_preview { sanitize_invocation_preview(&approval.request_payload) } else { Value::Null }, }) } pub(super) fn approval_history_request_preview(approval: &ApprovalRequest) -> Value { json!({ "status": "approval_required", "approval_id": approval.id.as_str(), "risk_level": approval.risk_level, }) } pub(super) fn approval_history_response_preview(response: &Value) -> Value { json!({ "status": response.get("status").cloned().unwrap_or(Value::Null), "approval_id": response.get("approval_id").cloned().unwrap_or(Value::Null), "risk_level": response.get("risk_level").cloned().unwrap_or(Value::Null), }) }