Files
crank/crates/crank-community-mcp/src/approval_response.rs
T

55 lines
1.7 KiB
Rust

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),
})
}