pub struct DynamicConfigManager { /* private fields */ }Expand description
Manager for dynamic TOON configuration with hot-reload support
This manager:
- Loads all TOON configs at startup
- Watches config directories for changes
- Atomically swaps config on changes (lock-free reads)
- Provides convenient accessor methods
§Example
let manager = DynamicConfigManager::new(
PathBuf::from("config/agents"),
PathBuf::from("config/models"),
PathBuf::from("config/tools"),
PathBuf::from("config/workflows"),
PathBuf::from("config/mcps"),
true, // hot_reload
)?;
// Get an agent config (lock-free)
if let Some(router) = manager.agent("router") {
println!("Router uses model: {}", router.model);
}Implementations§
Source§impl DynamicConfigManager
impl DynamicConfigManager
Sourcepub fn from_config(config: &AresConfig) -> Result<Self, ToonConfigError>
pub fn from_config(config: &AresConfig) -> Result<Self, ToonConfigError>
Create DynamicConfigManager from AresConfig
This uses the paths defined in config.config (DynamicConfigPaths)
to initialize the manager.
Sourcepub fn reload(&self) -> Result<Vec<ConfigWarning>, ToonConfigError>
pub fn reload(&self) -> Result<Vec<ConfigWarning>, ToonConfigError>
Reload TOON files from the configured directories (Overlay watch callback).
Sourcepub fn new(
agents_dir: PathBuf,
models_dir: PathBuf,
tools_dir: PathBuf,
workflows_dir: PathBuf,
mcps_dir: PathBuf,
hot_reload: bool,
) -> Result<Self, ToonConfigError>
pub fn new( agents_dir: PathBuf, models_dir: PathBuf, tools_dir: PathBuf, workflows_dir: PathBuf, mcps_dir: PathBuf, hot_reload: bool, ) -> Result<Self, ToonConfigError>
Create a new DynamicConfigManager
§Arguments
agents_dir- Directory containing agent TOON filesmodels_dir- Directory containing model TOON filestools_dir- Directory containing tool TOON filesworkflows_dir- Directory containing workflow TOON filesmcps_dir- Directory containing MCP TOON fileshot_reload- Whether to watch for file changes
Sourcepub fn set_version_tx(&self, tx: UnboundedSender<Vec<ToonAgentConfig>>)
pub fn set_version_tx(&self, tx: UnboundedSender<Vec<ToonAgentConfig>>)
Attach a version tracking sender. After this call, every hot-reload emits the updated agent list to this channel for a background task to persist to DB.
Sourcepub fn config(&self) -> Guard<Arc<DynamicConfig>>
pub fn config(&self) -> Guard<Arc<DynamicConfig>>
Get current config snapshot (lock-free)
Sourcepub fn agent(&self, name: &str) -> Option<ToonAgentConfig>
pub fn agent(&self, name: &str) -> Option<ToonAgentConfig>
Get a specific agent config
Sourcepub fn model(&self, name: &str) -> Option<ToonModelConfig>
pub fn model(&self, name: &str) -> Option<ToonModelConfig>
Get a specific model config
Sourcepub fn tool(&self, name: &str) -> Option<ToonToolConfig>
pub fn tool(&self, name: &str) -> Option<ToonToolConfig>
Get a specific tool config
Sourcepub fn workflow(&self, name: &str) -> Option<ToonWorkflowConfig>
pub fn workflow(&self, name: &str) -> Option<ToonWorkflowConfig>
Get a specific workflow config
Sourcepub fn mcp(&self, name: &str) -> Option<ToonMcpConfig>
pub fn mcp(&self, name: &str) -> Option<ToonMcpConfig>
Get a specific MCP config
Sourcepub fn agents(&self) -> Vec<ToonAgentConfig>
pub fn agents(&self) -> Vec<ToonAgentConfig>
Get all agents
Sourcepub fn models(&self) -> Vec<ToonModelConfig>
pub fn models(&self) -> Vec<ToonModelConfig>
Get all models
Sourcepub fn tools(&self) -> Vec<ToonToolConfig>
pub fn tools(&self) -> Vec<ToonToolConfig>
Get all tools
Sourcepub fn workflows(&self) -> Vec<ToonWorkflowConfig>
pub fn workflows(&self) -> Vec<ToonWorkflowConfig>
Get all workflows
Sourcepub fn mcps(&self) -> Vec<ToonMcpConfig>
pub fn mcps(&self) -> Vec<ToonMcpConfig>
Get all MCPs
Sourcepub fn agent_names(&self) -> Vec<String>
pub fn agent_names(&self) -> Vec<String>
Get all agent names
Sourcepub fn model_names(&self) -> Vec<String>
pub fn model_names(&self) -> Vec<String>
Get all model names
Sourcepub fn tool_names(&self) -> Vec<String>
pub fn tool_names(&self) -> Vec<String>
Get all tool names
Sourcepub fn workflow_names(&self) -> Vec<String>
pub fn workflow_names(&self) -> Vec<String>
Get all workflow names
Sourcepub fn upsert_agent(&self, agent: ToonAgentConfig)
pub fn upsert_agent(&self, agent: ToonAgentConfig)
Hot-swap a single agent config in the in-memory cache (used for rollback). Does not write to disk — disk files are the canonical source on next restart.
Trait Implementations§
Source§impl Service for DynamicConfigManager
impl Service for DynamicConfigManager
Source§impl ToonAgents for DynamicConfigManager
impl ToonAgents for DynamicConfigManager
Auto Trait Implementations§
impl Freeze for DynamicConfigManager
impl RefUnwindSafe for DynamicConfigManager
impl Send for DynamicConfigManager
impl Sync for DynamicConfigManager
impl Unpin for DynamicConfigManager
impl UnsafeUnpin for DynamicConfigManager
impl UnwindSafe for DynamicConfigManager
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
impl<T> ErasedDestructor for Twhere
T: 'static,
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 moreimpl<T> MaybeSendSync for T
Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.