pub struct LayeredPermissionsConfig {
pub mode: PermissionMode,
pub layers: Vec<PermissionLayer>,
}Expand description
Layered permission configuration.
Layers are ordered by priority (highest first). The merging semantics
for check_static are:
- deny: any layer denies → denied (union)
- allow: any layer allows → allowed (union)
- interactive: any layer marks as interactive → interactive (union)
The mode field provides session-level behaviour on top
of these static rules.
Fields§
§mode: PermissionModeSession-wide permission mode.
layers: Vec<PermissionLayer>Ordered layers (highest priority first).
Implementations§
Source§impl LayeredPermissionsConfig
impl LayeredPermissionsConfig
Sourcepub fn check_static(
&self,
tool_name: &str,
is_readonly: bool,
content: Option<&str>,
) -> Permission
pub fn check_static( &self, tool_name: &str, is_readonly: bool, content: Option<&str>, ) -> Permission
Check whether a tool is allowed or denied, taking the current
PermissionMode into account.
Checks are applied in priority order (highest first):
- Safety check (Goal 196) — if
contentresolves to a file path under a protected location (.git,.ssh, etc.), deny withDecisionReason::SafetyCheck. This is enforced even underBypassPermissions. Read-only tools are exempt. - Plan mode — blocks write tools unless
bypass_available(always exemptsexit_plan_mode). - BypassPermissions — skips all rules, allows everything.
- DontAsk — denies tools in the interactive list.
- AcceptEdits — auto-allows write tools.
- Deny/allow rules — static deny (union) then allow (union).
- Default — falls through with
Unknown(no rule matched).invoke_with_audittreatsUnknownas allowed for non-interactive tools and delegates to the registeredPermissionHookfor interactive tools in non-headless contexts (Goal-212).
content is the call-time content the tool will operate on. For
write_file / read_file it should be the file path; for
apply_patch it should be the full V4A patch body. Other tools
can pass None. See [extract_file_path_from_content].
Sourcepub fn is_plan_mode(&self, tool_name: &str) -> bool
pub fn is_plan_mode(&self, tool_name: &str) -> bool
Check whether a tool requires plan mode.
Returns true if the session mode is Plan.
Returns false if the tool is denied.
Sourcepub fn is_interactive(&self, tool_name: &str) -> bool
pub fn is_interactive(&self, tool_name: &str) -> bool
Check whether a tool requires interactive confirmation.
Returns true if any layer marks the tool as interactive.
Returns false if the tool is denied (denied tools never prompt).
Sourcepub fn any_interactive(&self, tool_name: &str) -> bool
pub fn any_interactive(&self, tool_name: &str) -> bool
Returns true if the tool is in the interactive list of any layer.
Sourcepub fn all_deny(&self) -> impl Iterator<Item = &str>
pub fn all_deny(&self) -> impl Iterator<Item = &str>
Iterate over all deny patterns across all layers.
Sourcepub fn all_allow(&self) -> impl Iterator<Item = &str>
pub fn all_allow(&self) -> impl Iterator<Item = &str>
Iterate over all allow patterns across all layers.
Sourcepub fn all_interactive(&self) -> impl Iterator<Item = &str>
pub fn all_interactive(&self) -> impl Iterator<Item = &str>
Iterate over all interactive patterns across all layers.
Sourcepub fn add_session_rule(&mut self, behavior: RuleBehavior, pattern: String)
pub fn add_session_rule(&mut self, behavior: RuleBehavior, pattern: String)
Add a permission rule to the session layer at runtime.
The session layer is always the highest-priority layer (index 0). If it doesn’t exist yet, it is created on first use.
Rules added via this method take effect immediately for all
subsequent check_static calls, without requiring a restart.
They are not persisted to disk — they live only in memory
for the current session.
Sourcepub fn remove_session_rule(&mut self, behavior: RuleBehavior, pattern: &str)
pub fn remove_session_rule(&mut self, behavior: RuleBehavior, pattern: &str)
Remove a permission rule from the session layer.
The pattern is matched against existing rules as a substring.
All rules whose string representation contains pattern are
removed from the corresponding behaviour list.
Sourcepub fn session_rules(&self) -> &PermissionLayer
pub fn session_rules(&self) -> &PermissionLayer
Return a reference to the session layer.
Panics if the session layer does not exist — call
session_layer_mut() first to ensure it is created.
Trait Implementations§
Source§impl Clone for LayeredPermissionsConfig
impl Clone for LayeredPermissionsConfig
Source§fn clone(&self) -> LayeredPermissionsConfig
fn clone(&self) -> LayeredPermissionsConfig
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for LayeredPermissionsConfig
impl Debug for LayeredPermissionsConfig
Source§impl Default for LayeredPermissionsConfig
impl Default for LayeredPermissionsConfig
Source§fn default() -> LayeredPermissionsConfig
fn default() -> LayeredPermissionsConfig
Source§impl<'de> Deserialize<'de> for LayeredPermissionsConfig
impl<'de> Deserialize<'de> for LayeredPermissionsConfig
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl From<OldPermissionsConfig> for LayeredPermissionsConfig
impl From<OldPermissionsConfig> for LayeredPermissionsConfig
Source§fn from(old: OldPermissionsConfig) -> Self
fn from(old: OldPermissionsConfig) -> Self
Auto Trait Implementations§
impl Freeze for LayeredPermissionsConfig
impl RefUnwindSafe for LayeredPermissionsConfig
impl Send for LayeredPermissionsConfig
impl Sync for LayeredPermissionsConfig
impl Unpin for LayeredPermissionsConfig
impl UnsafeUnpin for LayeredPermissionsConfig
impl UnwindSafe for LayeredPermissionsConfig
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
impl<A, B, T> HttpServerConnExec<A, B> for Twhere
B: Body,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more