Improve Galaxy permissions, computer-use routing, and agent UX

This commit is contained in:
2026-09-30 09:55:24 -05:00
parent cc064d4050
commit a2a2633199
30 changed files with 623 additions and 180 deletions
+5 -30
View File
@@ -284,12 +284,6 @@ impl ExecutionProfileEditorView {
let mut dropdown = Dropdown::new(ctx);
dropdown.set_items(
vec![
DropdownItem::new(
"Agent decides",
ExecutionProfileEditorViewAction::SetApplyCodeDiffs {
permission: ActionPermission::AgentDecides,
},
),
DropdownItem::new(
"Always allow",
ExecutionProfileEditorViewAction::SetApplyCodeDiffs {
@@ -318,12 +312,6 @@ impl ExecutionProfileEditorView {
let mut dropdown = Dropdown::new(ctx);
dropdown.set_items(
vec![
DropdownItem::new(
"Agent decides",
ExecutionProfileEditorViewAction::SetReadFiles {
permission: ActionPermission::AgentDecides,
},
),
DropdownItem::new(
"Always allow",
ExecutionProfileEditorViewAction::SetReadFiles {
@@ -352,12 +340,6 @@ impl ExecutionProfileEditorView {
let mut dropdown = Dropdown::new(ctx);
dropdown.set_items(
vec![
DropdownItem::new(
"Agent decides",
ExecutionProfileEditorViewAction::SetExecuteCommands {
permission: ActionPermission::AgentDecides,
},
),
DropdownItem::new(
"Always allow",
ExecutionProfileEditorViewAction::SetExecuteCommands {
@@ -420,12 +402,6 @@ impl ExecutionProfileEditorView {
let mut dropdown = Dropdown::new(ctx);
dropdown.set_items(
vec![
DropdownItem::new(
"Agent decides",
ExecutionProfileEditorViewAction::SetCallMcpServers {
permission: ActionPermission::AgentDecides,
},
),
DropdownItem::new(
"Always allow",
ExecutionProfileEditorViewAction::SetCallMcpServers {
@@ -824,7 +800,7 @@ impl ExecutionProfileEditorView {
Self::refresh_filterable_model_dropdown(
&me.computer_use_model_dropdown,
current_permissions.computer_use_model.clone(),
|prefs, _| prefs.get_computer_use_llm_choices().collect_vec(),
|prefs, app| prefs.get_computer_use_llm_choices(app).collect_vec(),
|id| ExecutionProfileEditorViewAction::SetComputerUseModel { id },
|prefs| prefs.get_default_computer_use_model().id.clone(),
&me.upgrade_footer_mouse_state,
@@ -1003,7 +979,7 @@ impl ExecutionProfileEditorView {
Self::refresh_filterable_model_dropdown(
&self.computer_use_model_dropdown,
current_permissions.computer_use_model.clone(),
|prefs, _| prefs.get_computer_use_llm_choices().collect_vec(),
|prefs, app| prefs.get_computer_use_llm_choices(app).collect_vec(),
|id| ExecutionProfileEditorViewAction::SetComputerUseModel { id },
|prefs| prefs.get_default_computer_use_model().id.clone(),
&self.upgrade_footer_mouse_state,
@@ -1091,10 +1067,9 @@ impl ExecutionProfileEditorView {
}
let active = match current_permission {
ActionPermission::AgentDecides | ActionPermission::Unknown => 0,
ActionPermission::AlwaysAllow => 1,
ActionPermission::AlwaysAsk => 2,
ActionPermission::GalaxyDecides => 3,
ActionPermission::AlwaysAllow => 0,
ActionPermission::AlwaysAsk | ActionPermission::Unknown => 1,
ActionPermission::GalaxyDecides => 2,
};
menu.set_selected_by_index(active, ctx);
@@ -474,9 +474,7 @@ pub fn render_permissions_section(
),
]);
if profile_data.read_files == ActionPermission::AlwaysAsk
|| profile_data.read_files == ActionPermission::AgentDecides
{
if profile_data.read_files == ActionPermission::AlwaysAsk {
column.add_child(render_directory_allowlist_section(
view,
profile_data,
@@ -514,7 +512,7 @@ pub fn render_permissions_section(
app,
));
}
ActionPermission::AgentDecides | ActionPermission::Unknown => {
ActionPermission::Unknown => {
column.add_children([
render_command_allowlist_section(view, profile_data, appearance, app),
render_command_denylist_section(view, profile_data, appearance, app),
@@ -600,7 +598,7 @@ pub fn render_permissions_section(
appearance,
));
}
ActionPermission::AgentDecides | ActionPermission::Unknown => {
ActionPermission::Unknown => {
column.add_children([
render_mcp_allowlist_section(view, profile_data, app, appearance),
render_mcp_denylist_section(view, profile_data, app, appearance),
@@ -108,12 +108,12 @@ fn edits_persist_default_profile_locally_when_logged_out() {
let default_profile_id = profile_model.read(&app, |model, _ctx| model.default_profile_id());
// Sanity-check the precondition: the baseline `apply_code_diffs`
// on a fresh default profile is the enum default (`AgentDecides`).
// on a fresh default profile is `GalaxyDecides`.
profile_model.read(&app, |model, ctx| {
assert!(
matches!(
model.default_profile(ctx).data().apply_code_diffs,
ActionPermission::AgentDecides
ActionPermission::GalaxyDecides
),
"unexpected baseline apply_code_diffs"
);
@@ -402,3 +402,13 @@ fn filters_non_owned_non_default_profile_from_list() {
});
})
}
#[test]
fn legacy_agent_decides_profiles_use_galaxy_decides() {
let permission: ActionPermission = serde_json::from_str("\"AgentDecides\"").unwrap();
assert_eq!(permission, ActionPermission::GalaxyDecides);
assert_eq!(
serde_json::to_string(&permission).unwrap(),
"\"GalaxyDecides\""
);
}