Skip to main content

ToolDependencyGraph

Struct ToolDependencyGraph 

Source
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

Source

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.

Source

pub fn is_empty(&self) -> bool

Returns true if no dependency rules are configured.

Source

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.

Source

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.

Source

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).

Source

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.

Source

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

Source§

fn clone(&self) -> ToolDependencyGraph

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ToolDependencyGraph

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ToolDependencyGraph

Source§

fn default() -> ToolDependencyGraph

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more