Agent backend registration

Updated Jul 14, 2026

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(())
}