{% extends "dashboard/base.html" %} {% from "partials/_macros.html" import status_pill, relative_time, pill, empty_state, info_toggle %} {% from "partials/_list_chrome.html" import list_controls, list_pagination %} {% block page %} {% call info_toggle(key='sessions', title="What is a session?") %}

A session is one continuous run of an agent (Copilot CLI, Claude Code, Codex, etc.) talking to brains. Sessions register at start, write events as they work, file decisions/handoffs, claim tasks, and end when the agent finishes.

Click a session ID to open the session detail page — full event timeline, tools used, decisions raised, and the workspace it ran in.

{% endcall %} {% set tool_opts = [('', 'All tools')] %} {% for t in tool_options %}{% set _ = tool_opts.append((t, t)) %}{% endfor %} {{ list_controls( '/dashboard/sessions', search_value=search_value, search_placeholder='Search id / workspace / tool / summary…', filters=[ {'name': 'tool', 'label': 'Tool', 'value': tool_filter, 'options': tool_opts}, {'name': 'state', 'label': 'State', 'value': state_filter, 'options': [('', 'All'), ('active', 'active'), ('ended', 'ended')]}, ], per_page=per_page, ) }}
{% if sessions %} {% for s in sessions %} {% endfor %}
IDWorkspaceToolStartedEndedSummary
{{ icon('bot') }} {{ s.id }} {{ s.workspace }} {{ pill(s.tool, tone='accent') }} {{ relative_time(s.started_at) }} {% if s.ended_at is none %} {{ status_pill('active') }} {% else %} {{ relative_time(s.ended_at) }} {% endif %} {{ s.summary or '' }}
{% else %} {{ empty_state( 'No sessions match the current filter', body='Sessions appear here once a coding agent connects via the MCP gateway.', icon_name='bot' ) }} {% endif %}
{{ list_pagination( '/dashboard/sessions', page=page, per_page=per_page, total=total, search_value=search_value, filters=[ {'name': 'tool', 'value': tool_filter}, {'name': 'state', 'value': state_filter}, ], shown=sessions|length, ) }} {% endblock %}