{% comment %} Shared Agents A2A content. Included by a2a.html, which extends the SDK adapter (scitex_sdk/app/app_shell.html) and fills scitex_app_content. `url_base` is the app's mount prefix ("" at root, "/apps/agents" when mounted) so links and form actions are correct at any mount. 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 %}
Fleet

A2A peers

acting as {{ identity|default:"(unidentified)" }}
{% if notice %}
{{ notice.operation }}: {{ notice.state }} {% if notice.message %}{{ notice.message }}{% endif %}
{% endif %} {% if comm_error %} {% endif %}

Peer reachability

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 %}
{% for p in peers %} {% endfor %}
AgentStatea2a portTurn hostInboxScope
{{ 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 %}
{% else %}

No peers visible to {{ identity|default:"(unidentified)" }} in this scope.

{% endif %}

Peer allowlist

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 %}
The allowlist is not available from this host. {{ grants_error|default:"the grant store could not be read here" }} — use sac a2a grants on the listener host.
{% elif grants %}
{% for g in grants %} {% endfor %}
SenderTargetGrantedNote
{{ g.sender }} {{ g.target }} {{ g.created_at }} {{ g.note|default:"—" }}
{% else %}

(no grants) — no cross-group send is allowlisted.

{% endif %} {% if can_operate %}

Decide a grant

Same verbs as sac a2a grant / unblock / block / revoke — directional sender → target, recorded in the operator audit trail.

{% if csrf_token %}{% endif %}
{% else %}

Read-only. Allowlist decisions require an identity listed in the lifecycle-operator allowlist.

{% endif %}