{% comment %} Shared Agents A2A content. Included by: * a2a.html (standalone: inside scitex_ui/standalone_shell.html) * a2a_hub.html (Hub: inside global_base.html — no second header) `url_base` is the app's mount prefix ("" at root, "/apps/agents" when mounted) so links and form actions are correct in both modes. Two halves, both projections of state the console already reads: 1. Peer reachability — one row per in-scope agent: the a2a port + turn URL from the batched fleet read (`sac a2a list` reads the same GET /agents source) and the inbox-channel liveness (`inbox_reachable`) the timeline already projects. The console probes nothing itself. 2. Peer allowlist — the CLI's `sac a2a grants` listing (`state_store_nodes.list_comms_grants`, same call). Read-only unless the acting identity is a lifecycle operator; mutations POST to `a2a/action` with the operator gate + audit trail. {% endcomment %}
Ports and turn URLs from the fleet read; inbox liveness from the agents' published status. Projected, not probed — for a measured cross-host probe use sac a2a reachability on the host.
{% if peers %}| Agent | State | a2a port | Turn host | Inbox | Scope |
|---|---|---|---|---|---|
| {{ p.name }} {% if p.cross_host %}remote{% endif %} | {{ p.state_label }} | {% if p.a2a_port %}{{ p.a2a_port }}{% else %}—{% endif %} | {{ p.host }} | {% if p.inbox_reachable == "true" %}reachable{% elif p.inbox_reachable == "false" %}unreachable{% else %}unknown{% endif %} | {% if p.cross_host %}cross-host{% else %}own{% endif %} |
No peers visible to {{ identity|default:"(unidentified)" }} in this scope.
{% endif %}Who may send to whom across groups — the same comms_grants table sac a2a grants lists. A block (right column of the CLI) always wins over a grant.
{% if grants is None %}| Sender | Target | Granted | Note |
|---|---|---|---|
| {{ g.sender }} | {{ g.target }} | {{ g.created_at }} | {{ g.note|default:"—" }} |
(no grants) — no cross-group send is allowlisted.
{% endif %} {% if can_operate %}Same verbs as sac a2a grant / unblock / block / revoke — directional sender → target, recorded in the operator audit trail.
{% else %}Read-only. Allowlist decisions require an identity listed in the lifecycle-operator allowlist.
{% endif %}