pub struct SafetyGateway { /* private fields */ }Expand description
Unified Safety Gateway
Consolidates rate limiting, destructive tool detection, command policy enforcement, plan mode restrictions, and dotfile protection into a single safety decision point.
Implementations§
Source§impl SafetyGateway
impl SafetyGateway
Sourcepub fn with_config(config: SafetyGatewayConfig) -> Self
pub fn with_config(config: SafetyGatewayConfig) -> Self
Create a new safety gateway with custom configuration
Sourcepub fn with_dotfile_guardian(self, guardian: Arc<DotfileGuardian>) -> Self
pub fn with_dotfile_guardian(self, guardian: Arc<DotfileGuardian>) -> Self
Set the dotfile guardian for protected file access
Sourcepub async fn with_dotfile_protection(
self,
config: DotfileProtectionConfig,
) -> Result<Self>
pub async fn with_dotfile_protection( self, config: DotfileProtectionConfig, ) -> Result<Self>
Create and set a dotfile guardian from configuration
Sourcepub fn with_command_policy(self, policy: CommandPolicyEvaluator) -> Self
pub fn with_command_policy(self, policy: CommandPolicyEvaluator) -> Self
Set the command policy evaluator for shell command checks
Sourcepub fn with_commands_config(self, config: &CommandsConfig) -> Self
pub fn with_commands_config(self, config: &CommandsConfig) -> Self
Create from commands config
Sourcepub fn set_plan_mode(&self, active: bool)
pub fn set_plan_mode(&self, active: bool)
Enable or disable plan mode
Sourcepub fn set_workspace_trust(&self, trust: WorkspaceTrust)
pub fn set_workspace_trust(&self, trust: WorkspaceTrust)
Set workspace trust level
Sourcepub fn set_limits(&self, max_per_turn: usize, max_per_session: usize)
pub fn set_limits(&self, max_per_turn: usize, max_per_session: usize)
Update rate limits
Sourcepub fn set_rate_limits(
&self,
rate_limit_per_second: usize,
rate_limit_per_minute: Option<usize>,
)
pub fn set_rate_limits( &self, rate_limit_per_second: usize, rate_limit_per_minute: Option<usize>, )
Update rate-limiter thresholds.
Sourcepub fn set_rate_limit_enforcement(&self, enabled: bool)
pub fn set_rate_limit_enforcement(&self, enabled: bool)
Enable or disable rate-limit enforcement while preserving counters.
Sourcepub fn increase_session_limit(&self, increment: usize)
pub fn increase_session_limit(&self, increment: usize)
Increase session limit dynamically
pub fn max_per_session(&self) -> usize
Sourcepub fn start_turn(&self)
pub fn start_turn(&self)
Reset turn counters (call at start of new turn)
Sourcepub fn preapprove(&self, tool_name: &str)
pub fn preapprove(&self, tool_name: &str)
Preapprove a tool for this session
Sourcepub fn is_preapproved(&self, tool_name: &str) -> bool
pub fn is_preapproved(&self, tool_name: &str) -> bool
Check if a tool is preapproved
Sourcepub fn is_destructive(&self, tool_name: &str) -> bool
pub fn is_destructive(&self, tool_name: &str) -> bool
Check if a tool is destructive
Sourcepub fn is_mutating(&self, tool_name: &str) -> bool
pub fn is_mutating(&self, tool_name: &str) -> bool
Check if a tool is mutating
Sourcepub fn check_safety<'a>(
&'a self,
ctx: &'a SafetyContext,
tool_name: &'a str,
args: &'a Value,
) -> impl Future<Output = SafetyDecision> + 'a
pub fn check_safety<'a>( &'a self, ctx: &'a SafetyContext, tool_name: &'a str, args: &'a Value, ) -> impl Future<Output = SafetyDecision> + 'a
Main entry point: check safety for a tool invocation.
Returns a SafetyDecision indicating whether execution can proceed.
Inline-delegating wrapper that returns the inner future directly to
avoid an extra coroutine state machine (audit section 16).
Sourcepub async fn check_safety_with_id(
&self,
ctx: &SafetyContext,
tool_name: &str,
args: &Value,
invocation_id: Option<ToolInvocationId>,
) -> SafetyDecision
pub async fn check_safety_with_id( &self, ctx: &SafetyContext, tool_name: &str, args: &Value, invocation_id: Option<ToolInvocationId>, ) -> SafetyDecision
Check safety with explicit invocation ID for correlation
Sourcepub async fn check_and_record(
&self,
ctx: &SafetyContext,
tool_name: &str,
args: &Value,
) -> SafetyCheckResult
pub async fn check_and_record( &self, ctx: &SafetyContext, tool_name: &str, args: &Value, ) -> SafetyCheckResult
Check safety and atomically reserve a rate-limit slot on success.
This avoids split check/record races by validating rate limits and recording execution under a single lock acquisition.
Sourcepub async fn check_and_record_with_id(
&self,
ctx: &SafetyContext,
tool_name: &str,
args: &Value,
invocation_id: Option<ToolInvocationId>,
) -> SafetyCheckResult
pub async fn check_and_record_with_id( &self, ctx: &SafetyContext, tool_name: &str, args: &Value, invocation_id: Option<ToolInvocationId>, ) -> SafetyCheckResult
Check safety with correlation ID and atomically reserve a rate-limit slot.
Sourcepub fn record_execution(&self)
pub fn record_execution(&self)
Record that a tool call was executed (for rate limiting)
Sourcepub fn dotfile_guardian(&self) -> Option<&Arc<DotfileGuardian>>
pub fn dotfile_guardian(&self) -> Option<&Arc<DotfileGuardian>>
Get the dotfile guardian (if configured)
Sourcepub fn get_stats(&self) -> SafetyStats
pub fn get_stats(&self) -> SafetyStats
Get current session statistics
Trait Implementations§
Auto Trait Implementations§
impl !Freeze for SafetyGateway
impl !RefUnwindSafe for SafetyGateway
impl !UnwindSafe for SafetyGateway
impl Send for SafetyGateway
impl Sync for SafetyGateway
impl Unpin for SafetyGateway
impl UnsafeUnpin for SafetyGateway
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> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
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> 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 moreSource§impl<D> OwoColorize for D
impl<D> OwoColorize for D
Source§fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
Source§fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
Source§fn black(&self) -> FgColorDisplay<'_, Black, Self>
fn black(&self) -> FgColorDisplay<'_, Black, Self>
Source§fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
Source§fn red(&self) -> FgColorDisplay<'_, Red, Self>
fn red(&self) -> FgColorDisplay<'_, Red, Self>
Source§fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
Source§fn green(&self) -> FgColorDisplay<'_, Green, Self>
fn green(&self) -> FgColorDisplay<'_, Green, Self>
Source§fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
Source§fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
Source§fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
Source§fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
Source§fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
Source§fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
Source§fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
Source§fn white(&self) -> FgColorDisplay<'_, White, Self>
fn white(&self) -> FgColorDisplay<'_, White, Self>
Source§fn on_white(&self) -> BgColorDisplay<'_, White, Self>
fn on_white(&self) -> BgColorDisplay<'_, White, Self>
Source§fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
Source§fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
Source§fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
Source§fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
Source§fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
Source§fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
Source§fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
Source§fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
Source§fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
Source§fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
Source§fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
Source§fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
Source§fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
Source§fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
Source§fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
Source§fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
Source§fn bold(&self) -> BoldDisplay<'_, Self>
fn bold(&self) -> BoldDisplay<'_, Self>
Source§fn dimmed(&self) -> DimDisplay<'_, Self>
fn dimmed(&self) -> DimDisplay<'_, Self>
Source§fn italic(&self) -> ItalicDisplay<'_, Self>
fn italic(&self) -> ItalicDisplay<'_, Self>
Source§fn underline(&self) -> UnderlineDisplay<'_, Self>
fn underline(&self) -> UnderlineDisplay<'_, Self>
Source§fn blink(&self) -> BlinkDisplay<'_, Self>
fn blink(&self) -> BlinkDisplay<'_, Self>
Source§fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
Source§fn reversed(&self) -> ReversedDisplay<'_, Self>
fn reversed(&self) -> ReversedDisplay<'_, Self>
Source§fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
Source§fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::fg or
a color-specific method, such as OwoColorize::green, Read moreSource§fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::bg or
a color-specific method, such as OwoColorize::on_yellow, Read more