#![allow(dead_code)]
use crate::types::permissions::{PermissionMode, ToolPermissionContext};
pub fn get_next_permission_mode(
tool_permission_context: &ToolPermissionContext,
_team_context: Option<&str>,
) -> String {
match tool_permission_context.mode.as_str() {
"default" => {
if std::env::var("USER_TYPE").as_deref() == Ok("ant") {
if tool_permission_context.is_bypass_permissions_mode_available {
return "bypassPermissions".to_string();
}
if can_cycle_to_auto(tool_permission_context) {
return "auto".to_string();
}
return "default".to_string();
}
"acceptEdits".to_string()
}
"acceptEdits" => "plan".to_string(),
"plan" => {
if tool_permission_context.is_bypass_permissions_mode_available {
return "bypassPermissions".to_string();
}
if can_cycle_to_auto(tool_permission_context) {
return "auto".to_string();
}
"default".to_string()
}
"bypassPermissions" => {
if can_cycle_to_auto(tool_permission_context) {
return "auto".to_string();
}
"default".to_string()
}
"dontAsk" => "default".to_string(),
_ => "default".to_string(),
}
}
fn can_cycle_to_auto(ctx: &ToolPermissionContext) -> bool {
let gate_enabled = is_auto_mode_gate_enabled();
let can = gate_enabled;
if !can {
log::debug!(
"[auto-mode] canCycleToAuto=false: isAutoModeGateEnabled={}",
gate_enabled,
);
}
can
}
fn is_auto_mode_gate_enabled() -> bool {
true
}
pub fn cycle_permission_mode(
tool_permission_context: &ToolPermissionContext,
team_context: Option<&str>,
) -> (String, ToolPermissionContext) {
let next_mode = get_next_permission_mode(tool_permission_context, team_context);
let context = transition_permission_mode(
&tool_permission_context.mode,
&next_mode,
tool_permission_context,
);
(next_mode, context)
}
pub fn transition_permission_mode(
from_mode: &str,
to_mode: &str,
context: &ToolPermissionContext,
) -> ToolPermissionContext {
if from_mode == to_mode {
return context.clone();
}
if from_mode == "plan" && to_mode != "plan" && context.pre_plan_mode.is_some() {
let mut new_ctx = context.clone();
new_ctx.pre_plan_mode = None;
return new_ctx;
}
context.clone()
}