Skip to content

Multi-Tenant Architecture

Commander supports multi-tenant isolation at every layer.

Request Flow

Request → HttpServer

           ├─ authenticate()           ← Bearer token → tenant mapping
           ├─ resolveTenantFromAuth()  ← API key → tenantId

           └─ execute({ tenantId }) → AgentRuntime

                                        ├─ TenantProvider.getTenantConfig(tenantId)
                                        │   → per-tenant: tokenBudget, maxConcurrency, maxRunsPerMinute

                                        ├─ Rate limit check     → TENANT_RATE_LIMIT
                                        ├─ Concurrency check    → TENANT_CONCURRENCY_LIMIT

                                        └─ Tenant-scoped instances:
                                            ├─ SamplesStore(path/tenant_{id}/)
                                            ├─ TraceStore(path/tenant_{id}/)
                                            ├─ StateCheckpointer(path/tenant_{id}/)
                                            ├─ ThreeLayerMemory(per-instance)
                                            └─ ToolResultCache(key = SHA256(tenantId + tool + args))

Isolation Layers

LayerMechanism
Rate limitsPer-tenant: requests/minute
ConcurrencyPer-tenant: max concurrent runs
StoragePer-tenant directory paths
MemoryPer-instance ThreeLayerMemory
CacheSHA-256 key includes tenantId
MetricsEvery counter/gauge/histogram has tenant label

Providers

ProviderBehavior
NullTenantProviderNo isolation, backward compatible (single-tenant)
SimpleTenantProviderStatic config map of tenant → config

Tenant Config

typescript
interface TenantConfig {
  tenantId: string;
  tokenBudget: number;
  maxConcurrency: number;
  maxRunsPerMinute: number;
  enabled: boolean;
  workspacePath?: string;
}

MIT Licensed — Built for multi-agent orchestration.