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 / Read it should be the file path; for
Edit it should be the file path. 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, &RuleSource)>
pub fn all_deny(&self) -> impl Iterator<Item = (&str, &RuleSource)>
Iterate over all deny patterns across all layers, paired with their source.
Sourcepub fn all_allow(&self) -> impl Iterator<Item = (&str, &RuleSource)>
pub fn all_allow(&self) -> impl Iterator<Item = (&str, &RuleSource)>
Iterate over all allow patterns across all layers, paired with their source.
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.