Implement native AgentManager services (#59)
All checks were successful
Native code generation / deterministic (push) Successful in 12m0s
Imaging and meshing gate / native (push) Successful in 4m3s
Native Rust workspace compile / compile (push) Successful in 4m4s

This commit is contained in:
2026-08-09 22:07:51 +00:00
parent c8b2317e13
commit 9c9d5b91f1
16 changed files with 7464 additions and 1531 deletions

View File

@@ -117,6 +117,7 @@ struct ClientRuntime {
http_caps_client: Mutex<crate::caps_http::HttpCapsClient>,
caps_rate_limiter: Mutex<crate::caps_http::CapsRateLimiter>,
network_manager: Mutex<std::sync::Weak<crate::network_manager::NetworkManagerInner>>,
agent_manager: Mutex<std::sync::Weak<crate::agent_manager::AgentManagerInner>>,
shutdown_complete: Condvar,
shutdown_wait: Mutex<()>,
}
@@ -144,6 +145,7 @@ impl ClientRuntime {
http_caps_client: Mutex::new(http_caps_client),
caps_rate_limiter: Mutex::new(caps_rate_limiter),
network_manager: Mutex::new(std::sync::Weak::new()),
agent_manager: Mutex::new(std::sync::Weak::new()),
shutdown_complete: Condvar::new(),
shutdown_wait: Mutex::new(()),
}
@@ -242,11 +244,24 @@ impl ClientRuntime {
/// Construction is side-effect free: it creates no runtime, task, socket, or
/// HTTP request. Network-facing services are attached explicitly and are owned
/// until ordered shutdown or drop.
#[derive(Clone)]
pub struct GridClient {
pub(crate) settings: Settings,
pub(crate) time_provider: TimeProvider,
runtime: Arc<ClientRuntime>,
network_manager: Option<crate::NetworkManager>,
agent_manager: Option<Box<crate::agent_manager::AgentManager>>,
}
impl Clone for GridClient {
fn clone(&self) -> Self {
Self {
settings: self.settings.clone(),
time_provider: self.time_provider.clone(),
runtime: Arc::clone(&self.runtime),
network_manager: self.network_manager.clone(),
agent_manager: None,
}
}
}
#[cfg(test)]
@@ -353,6 +368,9 @@ impl GridClient {
}
pub(crate) fn native_network(&self) -> Result<crate::NetworkManager, crate::Error> {
if let Some(manager) = &self.network_manager {
return Ok(manager.clone());
}
let mut cached = self
.runtime
.network_manager
@@ -369,12 +387,44 @@ impl GridClient {
}
#[allow(clippy::needless_pass_by_value)] // The mapped C# property setter owns its value.
pub(crate) fn native_set_network(&self, value: crate::NetworkManager) {
pub(crate) fn native_set_network(&mut self, value: crate::NetworkManager) {
*self
.runtime
.network_manager
.lock()
.unwrap_or_else(std::sync::PoisonError::into_inner) = value.native_inner_weak();
self.network_manager = Some(value);
}
pub(crate) fn native_self(&mut self) -> &mut crate::agent_manager::AgentManager {
if self.agent_manager.is_none() {
let client = Arc::new(self.clone());
let manager = crate::agent_manager::AgentManager::native_new(Some(client))
.unwrap_or_else(|_| panic!("failed to construct AgentManager"));
self.agent_manager = Some(Box::new(manager));
}
self.agent_manager.as_deref_mut().expect("agent manager")
}
pub(crate) fn cached_agent_manager_inner(
&self,
) -> Option<Arc<crate::agent_manager::AgentManagerInner>> {
self.runtime
.agent_manager
.lock()
.unwrap_or_else(std::sync::PoisonError::into_inner)
.upgrade()
}
pub(crate) fn cache_agent_manager_inner(
&self,
inner: &Arc<crate::agent_manager::AgentManagerInner>,
) {
*self
.runtime
.agent_manager
.lock()
.unwrap_or_else(std::sync::PoisonError::into_inner) = Arc::downgrade(inner);
}
pub(crate) fn native_set_caps_rate_limiter(
@@ -416,7 +466,7 @@ impl fmt::Debug for GridClient {
.field("lifecycle_state", &self.lifecycle_state())
.field("services", &service_names)
.field("time_provider", &self.time_provider)
.finish()
.finish_non_exhaustive()
}
}
@@ -527,6 +577,8 @@ impl GridClientBuilder {
http_caps_client,
caps_rate_limiter,
)),
network_manager: None,
agent_manager: None,
})
}
}