{% extends "base.html" %} {% block title %}Standalone host — {{ plugin.package }}{% endblock %} {# trust-1: the mutation forms' header bag. The operator action token rides ONLY an armed page view (one whose query carried it); the token values are per-launch urlsafe secrets, so nothing here can break out of the attribute. #} {% macro action_headers(csrf_token, operator_token) -%} {"X-CSRF-Token": "{{ csrf_token }}"{% if operator_token %}, "X-Operator-Action-Token": "{{ operator_token }}"{% endif %}} {%- endmacro %} {% block content %}
One adapter session over one device. No gateway stands behind this host: no {{ absent | join(", ") }}.
{% for device in devices %}{{ device.id }}{{ device.connection_key }}{{ device.port_path }}bound endpoint
{%- else %} {%- endif %} {%- endif %} {% if has_presentation %}This plugin declares no presentation documents; the device page serves its readings.
{% endif %}Scan refused — {{ scan_error.code }}: {{ scan_error.message }}
Bind refused — {{ binding_error.code }}: {{ binding_error.message }}
This page view carries no operator action token. Bind and unbind are
refused without it. Open the URL that the serve command printed. That
URL carries the token. Or append
?operator_action=<token> to this page. The token is
printed at serve start. It is also written to the
operator-action-token.json file under the capture root.
Bound endpoint — {{ binding.endpoint_kind }}:
{{ binding.port_path }}{% if binding.usb_serial %} (USB serial {{ binding.usb_serial }}){% endif %},
bound {{ binding.bound_at }}.
No endpoint is bound yet. A scan opens candidate ports and asks each for its identity; nothing else is transmitted, and loading this page transmits nothing. Pick a listed port to bind it to this host.
{% endif %}