Allow clarifying questions in Allow All profiles

Separate clarification questions from action approvals while preserving Galaxy Decides and Read Only behavior. Respect question capabilities in explicit tool overrides, keep CLI monitors focused, and render approved asynchronous questions while they wait for answers.

Validation: cargo build passed on Linux. Added permission, request and question-state regressions; tests and GUI execution were not run under the build-only workflow.
This commit is contained in:
Ryan Ward
2026-10-22 16:12:16 +00:00
parent f6c6434e5e
commit 7dceca51cf
9 changed files with 227 additions and 39 deletions
@@ -661,10 +661,14 @@ impl AIExecutionProfile {
PermissionMode::GalaxyDecides => RunAgentsPermission::GalaxyDecides,
PermissionMode::AllowAll => RunAgentsPermission::AlwaysAllow,
};
self.ask_user_question = if self.permission_mode == PermissionMode::AskFirst {
AskUserQuestionPermission::AlwaysAsk
} else {
AskUserQuestionPermission::Never
// Allow All bypasses tool approval, while clarification can still need user input.
self.ask_user_question = match self.permission_mode {
PermissionMode::AskFirst | PermissionMode::AllowAll => {
AskUserQuestionPermission::AlwaysAsk
}
PermissionMode::ReadOnly | PermissionMode::GalaxyDecides => {
AskUserQuestionPermission::Never
}
};
self.directory_allowlist.clear();
self.mcp_allowlist.clear();
@@ -61,6 +61,7 @@ fn serialized_profiles_only_store_one_permission_mode_and_bounded_approvals() {
"write_to_pty",
"run_agents",
"computer_use",
"ask_user_question",
"directory_allowlist",
"mcp_allowlist",
] {
@@ -127,3 +128,25 @@ fn allow_all_projects_every_tool_to_always_allow() {
assert_eq!(profile.computer_use, ComputerUsePermission::AlwaysAllow);
assert_eq!(profile.run_agents, RunAgentsPermission::AlwaysAllow);
}
#[test]
fn clarification_availability_follows_permission_mode_after_projection_and_restore() {
for (mode, expected) in [
(PermissionMode::AskFirst, AskUserQuestionPermission::AlwaysAsk),
(PermissionMode::AllowAll, AskUserQuestionPermission::AlwaysAsk),
(PermissionMode::GalaxyDecides, AskUserQuestionPermission::Never),
(PermissionMode::ReadOnly, AskUserQuestionPermission::Never),
] {
let mut profile = AIExecutionProfile {
permission_mode: mode,
..Default::default()
};
profile.project_permission_mode();
assert_eq!(profile.ask_user_question, expected, "{mode:?}");
let saved = serde_json::to_value(&profile).unwrap();
assert!(saved.get("ask_user_question").is_none());
let restored: AIExecutionProfile = serde_json::from_value(saved).unwrap();
assert_eq!(restored.ask_user_question, expected, "{mode:?}");
}
}