aboutsummaryrefslogtreecommitdiff
path: root/src/detect/manifest.rs
diff options
context:
space:
mode:
authorakbash <akbash@herdr.dev>2026-08-25 01:08:36 +0300
committerGitHub <noreply@github.com>2026-08-25 01:08:36 +0300
commitcafd9e5dd0e59ecc7551ae066c737f23573460a7 (patch)
tree82ff1bbf5703f06c906bc22a783a2f18366f73d1 /src/detect/manifest.rs
parent7d56b4c51b046a5d477439bcea4512339f8841aa (diff)
fix: refresh shared agent manifest caches (#3204)
refs #2711 Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
Diffstat (limited to 'src/detect/manifest.rs')
-rw-r--r--src/detect/manifest.rs30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/detect/manifest.rs b/src/detect/manifest.rs
index b9fe786a..5e226ece 100644
--- a/src/detect/manifest.rs
+++ b/src/detect/manifest.rs
@@ -284,6 +284,36 @@ pub(crate) fn reload_manifests() -> Vec<AgentManifestSummary> {
summaries
}
+pub(crate) fn reload_manifests_for_agents(agents: &[Agent]) {
+ if agents.is_empty() {
+ return;
+ }
+
+ let _reload_guard = MANIFEST_RELOAD_LOCK
+ .get_or_init(|| Mutex::new(()))
+ .lock()
+ .unwrap_or_else(|poisoned| poisoned.into_inner());
+ let lock = manifest_cache();
+ let replacements = Agent::SCREEN_MANIFEST_AGENTS
+ .into_iter()
+ .filter(|agent| agents.contains(agent))
+ .map(|agent| (agent, load_manifest_uncached(agent)))
+ .collect::<Vec<_>>();
+ let mut cache = match lock.write() {
+ Ok(guard) => guard,
+ Err(poisoned) => poisoned.into_inner(),
+ };
+ for (agent, replacement) in replacements {
+ if let Some((_, loaded)) = cache
+ .manifests
+ .iter_mut()
+ .find(|(cached_agent, _)| *cached_agent == agent)
+ {
+ *loaded = replacement;
+ }
+ }
+}
+
fn manifest_cache() -> &'static RwLock<ManifestCache> {
MANIFEST_CACHE.get_or_init(|| RwLock::new(build_manifest_cache()))
}