Add AcceptWithOverrideCommand for approval decision

This commit is contained in:
Qiyao Qin
2026-03-14 16:22:35 -07:00
parent d692b74007
commit bccfefd43c
22 changed files with 272 additions and 9 deletions
@@ -33,6 +33,31 @@
],
"type": "string"
},
{
"additionalProperties": false,
"description": "User has approved this command and wants to execute a different argv vector instead of the original one-time request.",
"properties": {
"approved_override_command": {
"properties": {
"command": {
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"command"
],
"type": "object"
}
},
"required": [
"approved_override_command"
],
"title": "ApprovedOverrideCommandReviewDecision",
"type": "object"
},
{
"additionalProperties": false,
"description": "User has approved this command and wants to apply the proposed execpolicy amendment so future matching commands are permitted.",
@@ -228,6 +228,31 @@
],
"type": "string"
},
{
"additionalProperties": false,
"description": "User approved the command, but wants to execute a different argv vector.",
"properties": {
"acceptWithOverrideCommand": {
"properties": {
"command": {
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"command"
],
"type": "object"
}
},
"required": [
"acceptWithOverrideCommand"
],
"title": "AcceptWithOverrideCommandCommandExecutionApprovalDecision",
"type": "object"
},
{
"description": "User approved the command and future prompts in the same session-scoped approval cache should run without prompting.",
"enum": [
@@ -10,6 +10,31 @@
],
"type": "string"
},
{
"additionalProperties": false,
"description": "User approved the command, but wants to execute a different argv vector.",
"properties": {
"acceptWithOverrideCommand": {
"properties": {
"command": {
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"command"
],
"type": "object"
}
},
"required": [
"acceptWithOverrideCommand"
],
"title": "AcceptWithOverrideCommandCommandExecutionApprovalDecision",
"type": "object"
},
{
"description": "User approved the command and future prompts in the same session-scoped approval cache should run without prompting.",
"enum": [
@@ -33,6 +33,31 @@
],
"type": "string"
},
{
"additionalProperties": false,
"description": "User has approved this command and wants to execute a different argv vector instead of the original one-time request.",
"properties": {
"approved_override_command": {
"properties": {
"command": {
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"command"
],
"type": "object"
}
},
"required": [
"approved_override_command"
],
"title": "ApprovedOverrideCommandReviewDecision",
"type": "object"
},
{
"additionalProperties": false,
"description": "User has approved this command and wants to apply the proposed execpolicy amendment so future matching commands are permitted.",
@@ -294,6 +294,31 @@
],
"type": "string"
},
{
"additionalProperties": false,
"description": "User approved the command, but wants to execute a different argv vector.",
"properties": {
"acceptWithOverrideCommand": {
"properties": {
"command": {
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"command"
],
"type": "object"
}
},
"required": [
"acceptWithOverrideCommand"
],
"title": "AcceptWithOverrideCommandCommandExecutionApprovalDecision",
"type": "object"
},
{
"description": "User approved the command and future prompts in the same session-scoped approval cache should run without prompting.",
"enum": [
@@ -1639,6 +1639,31 @@
],
"type": "string"
},
{
"additionalProperties": false,
"description": "User approved the command, but wants to execute a different argv vector.",
"properties": {
"acceptWithOverrideCommand": {
"properties": {
"command": {
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"command"
],
"type": "object"
}
},
"required": [
"acceptWithOverrideCommand"
],
"title": "AcceptWithOverrideCommandCommandExecutionApprovalDecision",
"type": "object"
},
{
"description": "User approved the command and future prompts in the same session-scoped approval cache should run without prompting.",
"enum": [
@@ -3392,6 +3417,31 @@
],
"type": "string"
},
{
"additionalProperties": false,
"description": "User has approved this command and wants to execute a different argv vector instead of the original one-time request.",
"properties": {
"approved_override_command": {
"properties": {
"command": {
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"command"
],
"type": "object"
}
},
"required": [
"approved_override_command"
],
"title": "ApprovedOverrideCommandReviewDecision",
"type": "object"
},
{
"additionalProperties": false,
"description": "User has approved this command and wants to apply the proposed execpolicy amendment so future matching commands are permitted.",
@@ -7,4 +7,4 @@ import type { NetworkPolicyAmendment } from "./NetworkPolicyAmendment";
/**
* User's decision in response to an ExecApprovalRequest.
*/
export type ReviewDecision = "approved" | { "approved_execpolicy_amendment": { proposed_execpolicy_amendment: ExecPolicyAmendment, } } | "approved_for_session" | { "network_policy_amendment": { network_policy_amendment: NetworkPolicyAmendment, } } | "denied" | "abort";
export type ReviewDecision = "approved" | { "approved_override_command": { command: Array<string>, } } | { "approved_execpolicy_amendment": { proposed_execpolicy_amendment: ExecPolicyAmendment, } } | "approved_for_session" | { "network_policy_amendment": { network_policy_amendment: NetworkPolicyAmendment, } } | "denied" | "abort";
@@ -4,4 +4,4 @@
import type { ExecPolicyAmendment } from "./ExecPolicyAmendment";
import type { NetworkPolicyAmendment } from "./NetworkPolicyAmendment";
export type CommandExecutionApprovalDecision = "accept" | "acceptForSession" | { "acceptWithExecpolicyAmendment": { execpolicy_amendment: ExecPolicyAmendment, } } | { "applyNetworkPolicyAmendment": { network_policy_amendment: NetworkPolicyAmendment, } } | "decline" | "cancel";
export type CommandExecutionApprovalDecision = "accept" | { "acceptWithOverrideCommand": { command: Array<string>, } } | "acceptForSession" | { "acceptWithExecpolicyAmendment": { execpolicy_amendment: ExecPolicyAmendment, } } | { "applyNetworkPolicyAmendment": { network_policy_amendment: NetworkPolicyAmendment, } } | "decline" | "cancel";
@@ -959,6 +959,8 @@ pub struct ConfigEdit {
pub enum CommandExecutionApprovalDecision {
/// User approved the command.
Accept,
/// User approved the command, but wants to execute a different argv vector.
AcceptWithOverrideCommand { command: Vec<String> },
/// User approved the command and future prompts in the same session-scoped
/// approval cache should run without prompting.
AcceptForSession,
@@ -981,6 +983,9 @@ impl From<CoreReviewDecision> for CommandExecutionApprovalDecision {
fn from(value: CoreReviewDecision) -> Self {
match value {
CoreReviewDecision::Approved => Self::Accept,
CoreReviewDecision::ApprovedOverrideCommand { command } => {
Self::AcceptWithOverrideCommand { command }
}
CoreReviewDecision::ApprovedExecpolicyAmendment {
proposed_execpolicy_amendment,
} => Self::AcceptWithExecpolicyAmendment {
@@ -6033,6 +6038,27 @@ mod tests {
);
}
#[test]
fn command_execution_request_approval_response_accepts_override_command() {
let response = serde_json::from_value::<CommandExecutionRequestApprovalResponse>(json!({
"decision": {
"acceptWithOverrideCommand": {
"command": ["echo", "hi"]
}
}
}))
.expect("override command response should deserialize");
assert_eq!(
response,
CommandExecutionRequestApprovalResponse {
decision: CommandExecutionApprovalDecision::AcceptWithOverrideCommand {
command: vec!["echo".to_string(), "hi".to_string()],
},
}
);
}
#[test]
fn permissions_request_approval_response_accepts_partial_macos_grants() {
let cases = vec![