55 lines
1.7 KiB
Rust
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),
|
|
})
|
|
}
|