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 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more