use super::*;
impl AgentSession {
pub fn set_budget_guard(
&self,
guard: Option<Arc<dyn crate::budget::BudgetGuard>>,
) -> crate::error::Result<()> {
self.close_handle.mutate_immediate(|| {
let mut slot = self
.runtime_budget_guard
.lock()
.unwrap_or_else(|p| p.into_inner());
*slot = guard;
drop(slot);
self.refresh_task_delegation_tools();
self.refresh_skill_tools();
})
}
pub fn budget_guard(&self) -> Option<Arc<dyn crate::budget::BudgetGuard>> {
self.runtime_budget_guard
.lock()
.unwrap_or_else(|p| p.into_inner())
.clone()
}
pub async fn pending_confirmations(&self) -> Vec<PendingConfirmationInfo> {
HitlControl::from_session(self)
.pending_confirmations()
.await
}
pub async fn confirm_tool_use(
&self,
tool_id: &str,
approved: bool,
reason: Option<String>,
) -> Result<bool> {
HitlControl::from_session(self)
.confirm_tool_use(tool_id, approved, reason)
.await
}
pub async fn cancel_confirmations(&self) -> usize {
HitlControl::from_session(self).cancel_confirmations().await
}
pub fn verification_reports(&self) -> Vec<crate::verification::VerificationReport> {
VerificationRuntime::from_session(self).reports()
}
pub fn verification_summary(&self) -> crate::verification::VerificationSummary {
VerificationRuntime::from_session(self).summary()
}
pub fn verification_summary_text(&self) -> String {
VerificationRuntime::from_session(self).summary_text()
}
pub fn record_verification_reports(
&self,
reports: impl IntoIterator<Item = crate::verification::VerificationReport>,
) {
VerificationRuntime::from_session(self).record(reports);
}
pub fn register_hook(&self, hook: crate::hooks::Hook) -> crate::error::Result<()> {
self.close_handle.mutate_immediate(|| {
self.ensure_compatibility_name_available(
crate::capability::CapabilityKind::Hook,
&hook.id,
)?;
HookControl::from_session(self).register_hook(hook);
Ok(())
})?
}
pub fn unregister_hook(
&self,
hook_id: &str,
) -> crate::error::Result<Option<crate::hooks::Hook>> {
self.close_handle.mutate_immediate(|| {
self.ensure_compatibility_name_available(
crate::capability::CapabilityKind::Hook,
hook_id,
)?;
Ok(HookControl::from_session(self).unregister_hook(hook_id))
})?
}
pub fn register_hook_handler(
&self,
hook_id: &str,
handler: Arc<dyn crate::hooks::HookHandler>,
) -> crate::error::Result<()> {
let mut pending_handler = Some(handler);
let retired = self.close_handle.mutate_immediate(|| {
self.ensure_compatibility_name_available(
crate::capability::CapabilityKind::Hook,
hook_id,
)?;
let handler = pending_handler.take().ok_or_else(|| {
crate::error::CodeError::Capability(
crate::capability::CapabilityRuntimeError::RuntimeValueInvalid {
kind: crate::capability::CapabilityKind::Hook,
public_name: hook_id.to_owned(),
message: "Hook handler mutation was already consumed".to_owned(),
},
)
})?;
Ok::<_, crate::error::CodeError>(
HookControl::from_session(self).register_hook_handler(hook_id, handler),
)
})??;
drop(retired);
Ok(())
}
pub fn unregister_hook_handler(&self, hook_id: &str) -> crate::error::Result<()> {
let retired = self.close_handle.mutate_immediate(|| {
self.ensure_compatibility_name_available(
crate::capability::CapabilityKind::Hook,
hook_id,
)?;
Ok::<_, crate::error::CodeError>(
HookControl::from_session(self).unregister_hook_handler(hook_id),
)
})??;
drop(retired);
Ok(())
}
pub fn register_hook_registration(
&self,
hook: crate::hooks::Hook,
handler: Option<Arc<dyn crate::hooks::HookHandler>>,
) -> crate::error::Result<()> {
let mut pending_handler = Some(handler);
let retired = self.close_handle.mutate_immediate(|| {
self.ensure_compatibility_name_available(
crate::capability::CapabilityKind::Hook,
&hook.id,
)?;
let handler = pending_handler.take().ok_or_else(|| {
crate::error::CodeError::Capability(
crate::capability::CapabilityRuntimeError::RuntimeValueInvalid {
kind: crate::capability::CapabilityKind::Hook,
public_name: hook.id.clone(),
message: "Hook registration was already consumed".to_owned(),
},
)
})?;
Ok::<_, crate::error::CodeError>(
HookControl::from_session(self).register_hook_registration(hook, handler),
)
})??;
drop(retired);
Ok(())
}
pub fn unregister_hook_registration(
&self,
hook_id: &str,
) -> crate::error::Result<Option<crate::hooks::Hook>> {
let (retired_hook, retired_handler) = self.close_handle.mutate_immediate(|| {
self.ensure_compatibility_name_available(
crate::capability::CapabilityKind::Hook,
hook_id,
)?;
Ok::<_, crate::error::CodeError>(
HookControl::from_session(self).unregister_hook_registration(hook_id),
)
})??;
let removed = retired_hook.as_deref().cloned();
drop((retired_hook, retired_handler));
Ok(removed)
}
pub fn hook_count(&self) -> usize {
HookControl::from_session(self).hook_count()
}
pub async fn verify_commands(
&self,
subject: &str,
commands: &[crate::verification::VerificationCommand],
) -> Result<crate::verification::VerificationReport> {
VerificationRuntime::from_session(self)
.verify_commands(subject, commands)
.await
}
pub fn verification_presets(&self) -> Vec<crate::verification::VerificationPreset> {
VerificationRuntime::from_session(self).presets()
}
}