pub struct ToolDependencyGraph { /* private fields */ }Expand description
Dependency graph for sequential tool availability (issue #2024).
Built once from DependencyConfig at agent start, reused across turns.
Implements cycle detection via DFS topological sort: any tool in a detected
cycle has all its requires removed (made unconditionally available) so it
can never be permanently blocked by a dependency loop.
§Deadlock fallback
If all non-always-on tools would be blocked (either by config cycles or
unreachable requires chains), apply() detects this at filter time and
disables hard gates for that turn, logging a warning.
Implementations§
Source§impl ToolDependencyGraph
impl ToolDependencyGraph
Sourcepub fn new(deps: HashMap<String, ToolDependency>) -> Self
pub fn new(deps: HashMap<String, ToolDependency>) -> Self
Build a dependency graph from a map of tool rules.
Performs DFS-based cycle detection. All tools participating in any cycle
have their requires entries removed so they are always available.
Sourcepub fn requirements_met(
&self,
tool_id: &str,
completed: &HashSet<String>,
) -> bool
pub fn requirements_met( &self, tool_id: &str, completed: &HashSet<String>, ) -> bool
Check if a tool’s hard requirements are all satisfied.
Returns true if the tool has no requires entries, or if all entries
are present in completed. Returns true for unconfigured tools.
Sourcepub fn unmet_requires<'a>(
&'a self,
tool_id: &str,
completed: &HashSet<String>,
) -> Vec<&'a str>
pub fn unmet_requires<'a>( &'a self, tool_id: &str, completed: &HashSet<String>, ) -> Vec<&'a str>
Returns the unmet requires entries for a tool, if any.
Sourcepub fn preference_boost(
&self,
tool_id: &str,
completed: &HashSet<String>,
boost_per_dep: f32,
max_total_boost: f32,
) -> f32
pub fn preference_boost( &self, tool_id: &str, completed: &HashSet<String>, boost_per_dep: f32, max_total_boost: f32, ) -> f32
Calculate similarity boost for soft prerequisites.
Returns min(boost_per_dep * met_count, max_total_boost).
Sourcepub fn apply(
&self,
result: &mut ToolFilterResult,
completed: &HashSet<String>,
boost_per_dep: f32,
max_total_boost: f32,
always_on: &HashSet<String>,
)
pub fn apply( &self, result: &mut ToolFilterResult, completed: &HashSet<String>, boost_per_dep: f32, max_total_boost: f32, always_on: &HashSet<String>, )
Apply hard dependency gates and preference boosts to a ToolFilterResult.
Called after ToolSchemaFilter::filter() returns so the filter signature
remains unchanged (HIGH-03 fix). Dependency gates are applied AFTER TAFC
augmentation to prevent re-adding gated tools through augmentation (MED-04 fix).
Only AlwaysOn tools bypass hard gates. NameMentioned tools are still subject
to requires checks — a user mentioning a gated tool name does not grant access.
§Deadlock fallback (CRIT-01)
If applying hard gates would remove ALL non-always-on included tools, the gates are disabled for this turn and a warning is logged.
Sourcepub fn filter_tool_names<'a>(
&self,
names: &[&'a str],
completed: &HashSet<String>,
always_on: &HashSet<String>,
) -> Vec<&'a str>
pub fn filter_tool_names<'a>( &self, names: &[&'a str], completed: &HashSet<String>, always_on: &HashSet<String>, ) -> Vec<&'a str>
Filter a slice of tool IDs to those whose hard requirements are met.
Used on iterations 1+ in the native tool loop via the agent helper
apply_hard_dependency_gate_to_names. Returns only the IDs that pass.
Trait Implementations§
Source§impl Clone for ToolDependencyGraph
impl Clone for ToolDependencyGraph
Source§fn clone(&self) -> ToolDependencyGraph
fn clone(&self) -> ToolDependencyGraph
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 ToolDependencyGraph
impl Debug for ToolDependencyGraph
Source§impl Default for ToolDependencyGraph
impl Default for ToolDependencyGraph
Source§fn default() -> ToolDependencyGraph
fn default() -> ToolDependencyGraph
Auto Trait Implementations§
impl Freeze for ToolDependencyGraph
impl RefUnwindSafe for ToolDependencyGraph
impl Send for ToolDependencyGraph
impl Sync for ToolDependencyGraph
impl Unpin for ToolDependencyGraph
impl UnsafeUnpin for ToolDependencyGraph
impl UnwindSafe for ToolDependencyGraph
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