use serde::{Deserialize, Serialize};
use super::capability::Capability;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum PermissionMode {
#[default]
Default,
Plan,
AcceptEdits,
BypassPermissions,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum PermissionVerdict {
Allow,
Ask,
Block,
}
impl PermissionMode {
pub fn parse(s: &str) -> Option<Self> {
match s.trim() {
"default" => Some(Self::Default),
"plan" => Some(Self::Plan),
"acceptEdits" | "accept-edits" | "accept_edits" => Some(Self::AcceptEdits),
"bypassPermissions" | "bypass-permissions" | "bypass_permissions" => {
Some(Self::BypassPermissions)
}
_ => None,
}
}
pub fn as_str(self) -> &'static str {
match self {
Self::Default => "default",
Self::Plan => "plan",
Self::AcceptEdits => "acceptEdits",
Self::BypassPermissions => "bypassPermissions",
}
}
pub fn next(self) -> Self {
match self {
Self::Default => Self::Plan,
Self::Plan => Self::AcceptEdits,
Self::AcceptEdits => Self::BypassPermissions,
Self::BypassPermissions => Self::Default,
}
}
pub fn verdict(self, capability: &Capability) -> PermissionVerdict {
match self {
Self::BypassPermissions => PermissionVerdict::Allow,
Self::Default => match capability {
Capability::FileRead { .. } | Capability::Memory | Capability::Rag => {
PermissionVerdict::Allow
}
_ => PermissionVerdict::Ask,
},
Self::Plan => match capability {
Capability::FileRead { .. } | Capability::Memory | Capability::Rag => {
PermissionVerdict::Allow
}
_ => PermissionVerdict::Block,
},
Self::AcceptEdits => match capability {
Capability::FileRead { .. }
| Capability::FileWrite { .. }
| Capability::Memory
| Capability::Rag => PermissionVerdict::Allow,
_ => PermissionVerdict::Ask,
},
}
}
pub fn would_run_unattended(self, capability: &Capability) -> bool {
matches!(self.verdict(capability), PermissionVerdict::Allow)
}
}
impl std::fmt::Display for PermissionMode {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.as_str())
}
}
#[cfg(test)]
mod tests;