The agent_backend module provides a registry where agent backends declare
their identity and capabilities. Backends are registered by name and can be
listed, looked up, deactivated, and reactivated.
use std::sync::Arc;
use corbusier::agent_backend::{
adapters::memory::InMemoryBackendRegistry,
services::{BackendRegistryService, RegisterBackendRequest},
};
use corbusier::context::{CorrelationId, RequestContext, SessionId, UserId};
use corbusier::tenant::TenantId;
use mockable::DefaultClock;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let service = BackendRegistryService::new(
Arc::new(InMemoryBackendRegistry::new()),
Arc::new(DefaultClock),
);
let ctx = RequestContext::new(
TenantId::new(),
CorrelationId::new(),
UserId::new(),
SessionId::new(),
);
// Register two backends.
let claude = service
.register(
&ctx,
RegisterBackendRequest::new(
"claude_code_sdk",
"Claude Code SDK",
"1.0.0",
"Anthropic",
)
.with_capabilities(true, true),
)
.await?;
service
.register(
&ctx,
RegisterBackendRequest::new(
"codex_cli",
"Codex CLI",
"0.9.0",
"OpenAI",
)
.with_capabilities(false, true),
)
.await?;
// List all registered backends.
let all = service.list_all(&ctx).await?;
assert_eq!(all.len(), 2);
// Look up a backend by name.
let found = service.find_by_name(&ctx, "claude_code_sdk").await?;
assert!(found.is_some());
// Deactivate a backend — it no longer appears in active listings.
service.deactivate(&ctx, claude.id()).await?;
let active = service.list_active(&ctx).await?;
assert_eq!(active.len(), 1);
Ok(())
}