{% extends "admin/base.html" %} {% block title %}Tunnels — cmdop admin{% endblock %} {% block content %} {% from 'admin/components/ui.html' import card, input, badge, empty_state, modal, pagination, tooltip, page_header %} {# Plan 58 — Vercel polish. - Copy public URL per row (clipboard API + toast). - Truncated session_id with `title=…` for the full UUID. - Empty state explains how to open a tunnel from the CLI. - Close-confirmation modal replaces blocking confirm(). #}
{{ page_header( 'Tunnels', 'Active public tunnels for this fleet.', help_anchor='tunnels', actions=[ {'label': 'Refresh', 'kind': 'secondary', 'icon': 'refresh-cw', 'attrs': '@click="load()" :disabled="pagination.loading"'}, {'label': 'Open tunnel', 'kind': 'primary', 'icon': 'plus', 'attrs': '@click="openCreate()"'}, ] ) }} {# Create modal #} {% call modal('showCreate', 'closeCreate()') %}

Open tunnel

Expose a port on an agent machine through the public relay.

{# Plan 61/2b-W4 A1 — session picker replaces raw UUID input. #}
{{ input("local_host", label="Local host", value="127.0.0.1", required=true) }} {{ input("local_port", label="Local port", type="number", value="8080", required=true) }}
{{ input("subdomain", label="Subdomain (optional)", placeholder="my-app") }}
{% endcall %} {# Close confirmation modal #} {% call modal('!!pendingClose', 'pendingClose = null') %}

Close tunnel?

The public URL will stop routing immediately.

{% endcall %} {% call card() %}
Subdomain Public URL {{ tooltip("Shareable HTTPS URL that proxies to your machine's local port. Revoked if you delete this tunnel.") }} Target Protocol Session {{ tooltip("Agent connection that's hosting this tunnel. Hover to see the full UUID.") }} Created Actions
{{ pagination('pagination') }} {% endcall %}
{% endblock %}