correctly recognize WorkspaceWrite policy on /approvals (#7301)

the `/approvals` popup fails to recognize that the CLI is in
WorkspaceWrite mode if that policy has extra bits, like `writable_roots`
etc.

This change matches the policy, ignoring additional config aspects.
This commit is contained in:
iceweasel-oai
2025-11-25 12:41:00 -08:00
committed by GitHub
Unverified
parent 401f94ca31
commit 981e2f742d
2 changed files with 46 additions and 1 deletions
+23 -1
View File
@@ -2332,7 +2332,7 @@ impl ChatWidget {
let presets: Vec<ApprovalPreset> = builtin_approval_presets();
for preset in presets.into_iter() {
let is_current =
current_approval == preset.approval && current_sandbox == preset.sandbox;
Self::preset_matches_current(current_approval, &current_sandbox, &preset);
let name = preset.label.to_string();
let description_text = preset.description;
let description = Some(description_text.to_string());
@@ -2420,6 +2420,28 @@ impl ChatWidget {
})]
}
fn preset_matches_current(
current_approval: AskForApproval,
current_sandbox: &SandboxPolicy,
preset: &ApprovalPreset,
) -> bool {
if current_approval != preset.approval {
return false;
}
matches!(
(&preset.sandbox, current_sandbox),
(SandboxPolicy::ReadOnly, SandboxPolicy::ReadOnly)
| (
SandboxPolicy::DangerFullAccess,
SandboxPolicy::DangerFullAccess
)
| (
SandboxPolicy::WorkspaceWrite { .. },
SandboxPolicy::WorkspaceWrite { .. }
)
)
}
#[cfg(target_os = "windows")]
pub(crate) fn world_writable_warning_details(&self) -> Option<(Vec<String>, usize, bool)> {
if self
+23
View File
@@ -1567,6 +1567,29 @@ fn approvals_selection_popup_snapshot() {
assert_snapshot!("approvals_selection_popup", popup);
}
#[test]
fn preset_matching_ignores_extra_writable_roots() {
let preset = builtin_approval_presets()
.into_iter()
.find(|p| p.id == "auto")
.expect("auto preset exists");
let current_sandbox = SandboxPolicy::WorkspaceWrite {
writable_roots: vec![PathBuf::from("C:\\extra")],
network_access: false,
exclude_tmpdir_env_var: false,
exclude_slash_tmp: false,
};
assert!(
ChatWidget::preset_matches_current(AskForApproval::OnRequest, &current_sandbox, &preset),
"WorkspaceWrite with extra roots should still match the Agent preset"
);
assert!(
!ChatWidget::preset_matches_current(AskForApproval::Never, &current_sandbox, &preset),
"approval mismatch should prevent matching the preset"
);
}
#[test]
fn full_access_confirmation_popup_snapshot() {
let (mut chat, _rx, _op_rx) = make_chatwidget_manual();