pub struct LoopDetector { /* private fields */ }Expand description
Tracks repeated tool calls within a time window to detect and throttle agent loops.
Implementations§
Source§impl LoopDetector
impl LoopDetector
Sourcepub fn with_config(cfg: &LoopDetectionConfig) -> Self
pub fn with_config(cfg: &LoopDetectionConfig) -> Self
Creates a loop detector with custom thresholds from config. Set blocked_threshold to 0 to disable blocking entirely (LeanCTX philosophy).
Sourcepub fn record_call(
&mut self,
tool: &str,
args_fingerprint: &str,
) -> ThrottleResult
pub fn record_call( &mut self, tool: &str, args_fingerprint: &str, ) -> ThrottleResult
Records a tool call and returns the throttle result based on repetition count.
Sourcepub fn record_search(
&mut self,
tool: &str,
args_fingerprint: &str,
search_pattern: Option<&str>,
) -> ThrottleResult
pub fn record_search( &mut self, tool: &str, args_fingerprint: &str, search_pattern: Option<&str>, ) -> ThrottleResult
Record a search-category call and check the cross-tool search group limit.
search_pattern is the extracted query/regex the agent is looking for (if available).
Sourcepub fn is_search_tool(tool: &str) -> bool
pub fn is_search_tool(tool: &str) -> bool
Returns true if the tool name is a known search tool (ctx_search, etc.).
Sourcepub fn is_search_shell_command(command: &str) -> bool
pub fn is_search_shell_command(command: &str) -> bool
Returns true if the shell command starts with a search tool (grep, rg, find, etc.).
Sourcepub fn fingerprint(args: &Value) -> String
pub fn fingerprint(args: &Value) -> String
Computes a deterministic hash fingerprint of JSON tool arguments.
Sourcepub fn stats(&self) -> Vec<(String, u32)>
pub fn stats(&self) -> Vec<(String, u32)>
Returns duplicate call entries sorted by count (descending), filtered to count > 1.
Sourcepub fn record_read_for_correction(
&mut self,
path: &str,
mode: &str,
fresh: bool,
)
pub fn record_read_for_correction( &mut self, path: &str, mode: &str, fresh: bool, )
Records a ctx_read call and detects correction signals:
fresh=truere-read of a previously cached file- Mode bounce: map/signatures followed by full within 30s
Sourcepub fn record_shell_for_correction(&mut self, command: &str)
pub fn record_shell_for_correction(&mut self, command: &str)
Records a ctx_shell command and detects re-runs of the same command within 60s.
Sourcepub fn correction_count(&self) -> u32
pub fn correction_count(&self) -> u32
Returns the number of correction signals in the sliding window.
Sourcepub fn correction_rate(&self) -> f64
pub fn correction_rate(&self) -> f64
Returns the correction rate: signals per minute within the window.
Sourcepub fn prune_corrections(&mut self)
pub fn prune_corrections(&mut self)
Prunes expired correction signals and stale read/command entries.
Trait Implementations§
Source§impl Clone for LoopDetector
impl Clone for LoopDetector
Source§fn clone(&self) -> LoopDetector
fn clone(&self) -> LoopDetector
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 LoopDetector
impl Debug for LoopDetector
Auto Trait Implementations§
impl Freeze for LoopDetector
impl RefUnwindSafe for LoopDetector
impl Send for LoopDetector
impl Sync for LoopDetector
impl Unpin for LoopDetector
impl UnsafeUnpin for LoopDetector
impl UnwindSafe for LoopDetector
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,
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