{% extends "base.html" %} {% set active_page = "sessions" %} {% block title %}Sessions - AI Control Plane{% endblock %} {% block head_extra %} {% endblock %} {% block content %}
{% if sessions %}

Sessions

{% if search_query or date_from or date_to %} Clear {% endif %}
{% if search_query %}
Server search: {{ search_query }} · {{ sessions|length }} match{{ '' if sessions|length == 1 else 'es' }}
{% endif %}
{% for s in sessions %} {# Use the composite ``source:id`` form so two sessions that happen to share a UUID across sources are still individually reachable — the route accepts both forms but ``_lookup_session`` rejects bare UUIDs as ambiguous when more than one source has the same id. #}

{{ s.summary or s.id }}

{% if s.source == 'claude' %} Claude Code {% elif s.source == 'vscode' %} VS Code Chat {% else %} Copilot {% endif %} {% if s.max_tool_calls_exceeded %} Tool limit hit {% endif %} {% if s.has_pending_edits %} Pending edits {% endif %} {% if s.slug %} {{ s.slug }} {% endif %} {% if s.memory_count %} 🧠 {{ s.memory_count }} {% endif %} {% set pc = s.get('permission_counts', {}) %} {% set total_perms = (pc.get('allow', 0) or 0) + (pc.get('deny', 0) or 0) + (pc.get('ask', 0) or 0) %} {% if total_perms %} 🔒 {{ total_perms }} {% endif %} {% if s.model %} {{ s.model }} {% endif %} {% if s.repository %} {{ s.repository }} {% endif %} {% if s.branch %} {{ s.branch }} {% endif %} {% if s.created_at %} {{ s.created_at[:19].replace('T', ' ') }} UTC {% endif %} {% if s.cwd %} {{ s.cwd }} {% endif %}
{% endfor %}

No matching sessions

Try a different search term or filter.

{% else %}

No sessions found

Point the viewer at directories containing Copilot, Claude Code, or VS Code Chat session logs.

{% endif %}
{% endblock %} {% block scripts_extra %} {% endblock %}