# Fleet Health at a Glance (#44)

## Context

The vendor tenant list at `/vendor/tenants` shows basic tenant info (name, slug, tier, status, server state, license expiry) but lacks live usage data. The vendor needs to see agent and environment counts per tenant to understand fleet utilization without clicking into each tenant.

## Design

### Backend

**Extend `VendorTenantSummary`** record in `VendorTenantController.java` with three fields:

```java
int agentCount, int environmentCount, int agentLimit
```

**In the list endpoint mapping**: for each ACTIVE tenant with a server endpoint, call `serverApiClient.getAgentCount(endpoint)` and `serverApiClient.getEnvironmentCount(endpoint)`. Agent limit comes from the tenant's license `limits.agents` field (-1 for unlimited). Use `CompletableFuture` to parallelize the N HTTP calls.

Tenants that are PROVISIONING/SUSPENDED/DELETED get zeroes — skip the HTTP calls.

### Frontend

**Add two columns** to the DataTable in `VendorTenantsPage.tsx`:

| Column | Key | Display |
|--------|-----|---------|
| Agents | `agentCount` | "3 / 10" or "0 / ∞" (uses agentCount + agentLimit) |
| Envs | `environmentCount` | "1" |

Place them after the Server column, before License.

**Update `VendorTenantSummary` type** in `ui/src/types/api.ts` to include `agentCount: number`, `environmentCount: number`, `agentLimit: number`.

### Existing infrastructure reused

- `ServerApiClient.getAgentCount()` and `getEnvironmentCount()` — already implemented for tenant dashboard
- `LicenseService.getActiveLicense()` — already used in the list endpoint for license expiry
- 30-second refetch interval on `useVendorTenants()` — already in place

### No changes to

- ServerStatusBadge column — kept as-is
- License column — kept as-is
- Detail page — already has its own health data

## Files to modify

| File | Change |
|------|--------|
| `VendorTenantController.java` | Extend summary record + parallel health fetch in list endpoint |
| `VendorTenantsPage.tsx` | Add Agents and Envs columns |
| `ui/src/types/api.ts` | Add fields to VendorTenantSummary type |
