Skip to content

Features

Every capability below exists in 0.8.0. Each section says what it does, its status, how to use it, and where the detailed guide is. Planned work is only in the roadmap. For release-by-release availability, see the table on the home page.

The Python examples use the in-memory API from create_api() and run with only the base package installed.

Agent registry and heartbeats

Status: stable. Since 0.2.0.

Each deployment registers once with an ID, environment, runtime, framework and the DeepAgentLabs capabilities it has. Heartbeats then update its reported status (healthy, degraded, unhealthy or unknown), last-seen time, capabilities and metadata. Health is always reported by the agent; Tower never infers it from evidence.

from agenticops_control_tower.models import AgentRegistrationPayload, HeartbeatPayload
from agenticops_control_tower.snapshot import create_api

api = create_api()
api.register(
    AgentRegistrationPayload(
        agent_id="payment-agent",
        name="payment-agent",
        environment="production",
        runtime="aws-lambda",
        framework="langgraph",
        capabilities={"agenticlens": "0.7.0"},
    )
)
record = api.heartbeat("payment-agent", HeartbeatPayload(status="healthy"))
print(record.status.value, record.heartbeat_count)
healthy 1
  • HTTP: POST /agents/register, POST /agents/{agent_id}/heartbeat (writer).
  • CLI: agents register FILE.json, agents heartbeat AGENT_ID FILE.json.
  • Limits: agent IDs must be route-safe; registering an existing ID replaces its registration. Unknown IDs return HTTP 404.

Capability discovery and version inventory

Status: stable. Since 0.2.0; minimum-version checks since 0.3.0.

Capabilities come from registrations and heartbeats (a heartbeat's capabilities are merged in). Tower aggregates which versions are in use and, given a minimum you choose, reports each agent as meets_minimum, outdated or missing using PEP 440 comparison.

for result in api.assess_versions("agenticlens", "0.8.0"):
    print(result.agent_id, result.installed_version, result.assessment)
payment-agent 0.7.0 outdated
  • HTTP: GET /capabilities, GET /versions?capability=…&minimum_version=….
  • CLI: capabilities list.
  • Limits: the minimum is your policy, not a lookup of the latest release. Invalid reported versions are reported separately, never treated as outdated.

Fleet health and filters

Status: stable. Since 0.2.1.

status rolls reported health into counts and buckets and shows capability coverage: how many agents have each capability and which are missing it. Agent lists filter by status, environment, capability and missing capability, combined with AND.

summary = api.get_status()
print(summary.total_agents, summary.healthy_agents)
print([a.agent_id for a in api.list_agents(missing_capability="agentic-sidecar")])
1 1
['payment-agent']
  • HTTP: GET /status?environment=…, GET /agents?status=…&environment=…&capability=…&missing_capability=….
  • CLI: status, agents list --unhealthy, agents list --environment staging --missing-capability agentic-sidecar.

HTTP API, CLI and offline snapshots

Status: stable. HTTP API and CLI since 0.2.0; offline snapshots since 0.2.1.

One FastAPI application serves the API and the console (agenticops-control-tower serve). The CLI talks to it over HTTP, or reads a snapshot file with --snapshot for offline, read-only inspection with no server. Snapshots contain registrations, heartbeats and optional evidence; posture from a snapshot is evaluated as of its captured_at time.

agenticops-control-tower --snapshot examples/sample_fleet_snapshot.json agents list --unhealthy

See the CLI reference and API reference.

SQLite persistence and bearer tokens

Status: stable. Since 0.2.1.

Without --database the registry is in memory and is lost on restart. With --database registry.sqlite (or AGENTICOPS_DATABASE) inventory, evidence, configuration, alerts and incidents are stored in that SQLite file.

HTTP reads need the reader or writer token, writes need the writer token, and approvals need a separate approval token. With no tokens configured, access is anonymous (local development only). Tokens are shared deployment credentials that you generate; there are no user accounts. See Server settings and Authentication.

Read-only AgenticOps Console

Status: stable. Since 0.3.0.

serve also serves a browser console at /console/. Paste the reader token and select Connect / refresh to see fleet health, searchable and filterable inventory, environment-scoped capability coverage, version checks against a minimum you enter, evidence posture per producer, alerts and incident timelines.

  • The console sends only GET requests; every change goes through the API or CLI.
  • Tokens are kept only in page memory and cleared on Disconnect or reload.
  • Refresh is manual.

See Hosting the console to share it beyond your own computer.

Controlled configuration

Status: experimental. Since 0.4.0.

Tower can hold desired configuration for settings a trusted host declared as Tower-owned. Changes go through preview → approval by a different operator → execution, with expiry, revision checks, revocation and a durable audit trail. Tower records the desired value; it does not claim to reconfigure the running agent.

  • CLI: config AGENT CAPABILITY, actions preview REQUEST.json, actions approve|deny|revoke|execute ID, audit AGENT.
  • Example: examples/controlled_configuration.py.
  • Guide: Controlled configuration.

Ecosystem evidence posture

Status: experimental. Since 0.5.0.

Pipelines push native artifacts from AgenticLens, Agentic Evals, Agentic Sidecar and Agentic Chaos, each attributed to a deployment. Tower stores a validated projection and reports, per producer, whether evidence is fresh, stale or missing, plus native counts (failed runs, gate results, decision outcomes, chaos experiments). Retries are idempotent. Evidence never changes reported health, and Tower never recomputes a producer's verdict. Collection is push-only.

  • CLI: evidence ingest, evidence ingest-manifest, evidence ingest-sidecar-journal, evidence posture, evidence history, posture.
  • Guide: Evidence posture.

Incident investigation and approved staging recovery

Status: experimental. Since 0.6.0.

Durable incidents with an investigation prompt for an MCP host, an exact-preview human approval and one bounded recovery runbook for a deterministic staging runtime. Recovery counts only after a probe, a fresh successful Lens run and a passing Evals gate for the same run; otherwise it escalates. No model is bundled and no production runtime adapter ships yet.

Bulk fleet operations

Status: experimental. Since 0.7.0.

A selector (for example staging agents with AgenticLens) is frozen into an explicit target list at preview time. After approval, execution applies the desired-configuration change per target and reports each result. There is no fleet-wide atomicity or automatic rollback.

  • CLI: bulk preview|get|approve|deny|revoke|execute.
  • Example: examples/fleet_operations.py.
  • Guide: Fleet operations.

Live detection, alerts and incident views

Status: experimental. Since 0.8.0.

While the server runs it scans stored telemetry every 30 seconds. A fresh failed Lens run raises a critical lens.failed alert and opens a recovery incident; overdue heartbeats and stale or missing evidence raise warnings. Alerts are deduplicated, can be acknowledged, and keep an append-only audit history. Detection never executes recovery and never changes reported health.

  • CLI: alerts list|evaluate|acknowledge, incidents view ID.
  • Example: examples/live_operations.py.
  • Guide: Live operations.