mirror of
https://github.com/pchuan98/codex.git
synced 2026-07-01 00:31:56 +08:00
Rename reject approval policy to granular (#14516)
This commit is contained in:
committed by
GitHub
Unverified
parent
d32820ab07
commit
b7dba72dbd
@@ -483,10 +483,10 @@ impl DeveloperInstructions {
|
||||
pub fn from(
|
||||
approval_policy: AskForApproval,
|
||||
exec_policy: &Policy,
|
||||
request_permission_enabled: bool,
|
||||
exec_permission_approvals_enabled: bool,
|
||||
) -> DeveloperInstructions {
|
||||
let on_request_instructions = || {
|
||||
let on_request_rule = if request_permission_enabled {
|
||||
let on_request_rule = if exec_permission_approvals_enabled {
|
||||
APPROVAL_POLICY_ON_REQUEST_RULE_REQUEST_PERMISSION
|
||||
} else {
|
||||
APPROVAL_POLICY_ON_REQUEST_RULE
|
||||
@@ -506,22 +506,22 @@ impl DeveloperInstructions {
|
||||
AskForApproval::UnlessTrusted => APPROVAL_POLICY_UNLESS_TRUSTED.to_string(),
|
||||
AskForApproval::OnFailure => APPROVAL_POLICY_ON_FAILURE.to_string(),
|
||||
AskForApproval::OnRequest => on_request_instructions(),
|
||||
AskForApproval::Reject(reject_config) => {
|
||||
AskForApproval::Granular(granular_config) => {
|
||||
let on_request_instructions = on_request_instructions();
|
||||
let sandbox_approval = reject_config.sandbox_approval;
|
||||
let rules = reject_config.rules;
|
||||
let skill_approval = reject_config.skill_approval;
|
||||
let request_permissions = reject_config.request_permissions;
|
||||
let mcp_elicitations = reject_config.mcp_elicitations;
|
||||
let sandbox_approval = granular_config.sandbox_approval;
|
||||
let rules = granular_config.rules;
|
||||
let skill_approval = granular_config.skill_approval;
|
||||
let request_permissions = granular_config.request_permissions;
|
||||
let mcp_elicitations = granular_config.mcp_elicitations;
|
||||
format!(
|
||||
"{on_request_instructions}\n\n\
|
||||
Approval policy is `reject`.\n\
|
||||
Approval policy is `granular`.\n\
|
||||
- `sandbox_approval`: {sandbox_approval}\n\
|
||||
- `rules`: {rules}\n\
|
||||
- `skill_approval`: {skill_approval}\n\
|
||||
- `request_permissions`: {request_permissions}\n\
|
||||
- `mcp_elicitations`: {mcp_elicitations}\n\
|
||||
When a category is `true`, requests in that category are auto-rejected instead of prompting the user."
|
||||
When a category is `true`, requests in that category are allowed. When it is `false`, they are auto-rejected instead of prompting the user."
|
||||
)
|
||||
}
|
||||
};
|
||||
@@ -577,7 +577,7 @@ impl DeveloperInstructions {
|
||||
approval_policy: AskForApproval,
|
||||
exec_policy: &Policy,
|
||||
cwd: &Path,
|
||||
request_permission_enabled: bool,
|
||||
exec_permission_approvals_enabled: bool,
|
||||
) -> Self {
|
||||
let network_access = if sandbox_policy.has_full_network_access() {
|
||||
NetworkAccess::Enabled
|
||||
@@ -601,7 +601,7 @@ impl DeveloperInstructions {
|
||||
approval_policy,
|
||||
exec_policy,
|
||||
writable_roots,
|
||||
request_permission_enabled,
|
||||
exec_permission_approvals_enabled,
|
||||
)
|
||||
}
|
||||
|
||||
@@ -625,7 +625,7 @@ impl DeveloperInstructions {
|
||||
approval_policy: AskForApproval,
|
||||
exec_policy: &Policy,
|
||||
writable_roots: Option<Vec<WritableRoot>>,
|
||||
request_permission_enabled: bool,
|
||||
exec_permission_approvals_enabled: bool,
|
||||
) -> Self {
|
||||
let start_tag = DeveloperInstructions::new("<permissions instructions>");
|
||||
let end_tag = DeveloperInstructions::new("</permissions instructions>");
|
||||
@@ -637,7 +637,7 @@ impl DeveloperInstructions {
|
||||
.concat(DeveloperInstructions::from(
|
||||
approval_policy,
|
||||
exec_policy,
|
||||
request_permission_enabled,
|
||||
exec_permission_approvals_enabled,
|
||||
))
|
||||
.concat(DeveloperInstructions::from_writable_roots(writable_roots))
|
||||
.concat(end_tag)
|
||||
|
||||
@@ -516,11 +516,13 @@ pub enum AskForApproval {
|
||||
#[default]
|
||||
OnRequest,
|
||||
|
||||
/// Fine-grained rejection controls for approval prompts.
|
||||
/// Fine-grained controls for individual approval flows.
|
||||
///
|
||||
/// When a field is `true`, prompts of that category are automatically
|
||||
/// rejected instead of shown to the user.
|
||||
Reject(RejectConfig),
|
||||
/// When a field is `true`, commands in that category are allowed. When it
|
||||
/// is `false`, those requests are automatically rejected instead of shown
|
||||
/// to the user.
|
||||
#[strum(serialize = "granular")]
|
||||
Granular(GranularApprovalConfig),
|
||||
|
||||
/// Never ask the user to approve commands. Failures are immediately returned
|
||||
/// to the model, and never escalated to the user for approval.
|
||||
@@ -528,40 +530,40 @@ pub enum AskForApproval {
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema, TS)]
|
||||
pub struct RejectConfig {
|
||||
/// Reject shell command approval requests, including inline
|
||||
pub struct GranularApprovalConfig {
|
||||
/// Whether to allow shell command approval requests, including inline
|
||||
/// `with_additional_permissions` and `require_escalated` requests.
|
||||
pub sandbox_approval: bool,
|
||||
/// Reject prompts triggered by execpolicy `prompt` rules.
|
||||
/// Whether to allow prompts triggered by execpolicy `prompt` rules.
|
||||
pub rules: bool,
|
||||
/// Reject approval prompts triggered by skill script execution.
|
||||
/// Whether to allow approval prompts triggered by skill script execution.
|
||||
#[serde(default)]
|
||||
pub skill_approval: bool,
|
||||
/// Reject `request_permissions` tool requests.
|
||||
/// Whether to allow prompts triggered by the `request_permissions` tool.
|
||||
#[serde(default)]
|
||||
pub request_permissions: bool,
|
||||
/// Reject MCP elicitation prompts.
|
||||
/// Whether to allow MCP elicitation prompts.
|
||||
pub mcp_elicitations: bool,
|
||||
}
|
||||
|
||||
impl RejectConfig {
|
||||
pub const fn rejects_sandbox_approval(self) -> bool {
|
||||
impl GranularApprovalConfig {
|
||||
pub const fn allows_sandbox_approval(self) -> bool {
|
||||
self.sandbox_approval
|
||||
}
|
||||
|
||||
pub const fn rejects_rules_approval(self) -> bool {
|
||||
pub const fn allows_rules_approval(self) -> bool {
|
||||
self.rules
|
||||
}
|
||||
|
||||
pub const fn rejects_skill_approval(self) -> bool {
|
||||
pub const fn allows_skill_approval(self) -> bool {
|
||||
self.skill_approval
|
||||
}
|
||||
|
||||
pub const fn rejects_request_permissions(self) -> bool {
|
||||
pub const fn allows_request_permissions(self) -> bool {
|
||||
self.request_permissions
|
||||
}
|
||||
|
||||
pub const fn rejects_mcp_elicitations(self) -> bool {
|
||||
pub const fn allows_mcp_elicitations(self) -> bool {
|
||||
self.mcp_elicitations
|
||||
}
|
||||
}
|
||||
@@ -3466,89 +3468,89 @@ mod tests {
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn reject_config_mcp_elicitation_flag_is_field_driven() {
|
||||
fn granular_approval_config_mcp_elicitation_flag_is_field_driven() {
|
||||
assert!(
|
||||
RejectConfig {
|
||||
GranularApprovalConfig {
|
||||
sandbox_approval: false,
|
||||
rules: false,
|
||||
skill_approval: false,
|
||||
request_permissions: false,
|
||||
mcp_elicitations: true,
|
||||
}
|
||||
.rejects_mcp_elicitations()
|
||||
.allows_mcp_elicitations()
|
||||
);
|
||||
assert!(
|
||||
!RejectConfig {
|
||||
!GranularApprovalConfig {
|
||||
sandbox_approval: false,
|
||||
rules: false,
|
||||
skill_approval: false,
|
||||
request_permissions: false,
|
||||
mcp_elicitations: false,
|
||||
}
|
||||
.rejects_mcp_elicitations()
|
||||
.allows_mcp_elicitations()
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn reject_config_skill_approval_flag_is_field_driven() {
|
||||
fn granular_approval_config_skill_approval_flag_is_field_driven() {
|
||||
assert!(
|
||||
RejectConfig {
|
||||
GranularApprovalConfig {
|
||||
sandbox_approval: false,
|
||||
rules: false,
|
||||
skill_approval: true,
|
||||
request_permissions: false,
|
||||
mcp_elicitations: false,
|
||||
}
|
||||
.rejects_skill_approval()
|
||||
.allows_skill_approval()
|
||||
);
|
||||
assert!(
|
||||
!RejectConfig {
|
||||
!GranularApprovalConfig {
|
||||
sandbox_approval: false,
|
||||
rules: false,
|
||||
skill_approval: false,
|
||||
request_permissions: false,
|
||||
mcp_elicitations: false,
|
||||
}
|
||||
.rejects_skill_approval()
|
||||
.allows_skill_approval()
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn reject_config_request_permissions_flag_is_field_driven() {
|
||||
fn granular_approval_config_request_permissions_flag_is_field_driven() {
|
||||
assert!(
|
||||
RejectConfig {
|
||||
GranularApprovalConfig {
|
||||
sandbox_approval: false,
|
||||
rules: false,
|
||||
skill_approval: false,
|
||||
request_permissions: true,
|
||||
mcp_elicitations: false,
|
||||
}
|
||||
.rejects_request_permissions()
|
||||
.allows_request_permissions()
|
||||
);
|
||||
assert!(
|
||||
!RejectConfig {
|
||||
!GranularApprovalConfig {
|
||||
sandbox_approval: false,
|
||||
rules: false,
|
||||
skill_approval: false,
|
||||
request_permissions: false,
|
||||
mcp_elicitations: false,
|
||||
}
|
||||
.rejects_request_permissions()
|
||||
.allows_request_permissions()
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn reject_config_defaults_missing_optional_flags_to_false() {
|
||||
let decoded = serde_json::from_value::<RejectConfig>(serde_json::json!({
|
||||
fn granular_approval_config_defaults_missing_optional_flags_to_false() {
|
||||
let decoded = serde_json::from_value::<GranularApprovalConfig>(serde_json::json!({
|
||||
"sandbox_approval": true,
|
||||
"rules": false,
|
||||
"mcp_elicitations": true,
|
||||
}))
|
||||
.expect("legacy reject config should deserialize");
|
||||
.expect("granular approval config should deserialize");
|
||||
|
||||
assert_eq!(
|
||||
decoded,
|
||||
RejectConfig {
|
||||
GranularApprovalConfig {
|
||||
sandbox_approval: true,
|
||||
rules: false,
|
||||
skill_approval: false,
|
||||
|
||||
Reference in New Issue
Block a user