{# SPA partial: task detail loaded into index.html via HTMX OOB swaps. Update channels: • Initial load: renders all events + starts SSE via JS EventSource. • SSE "event": appends event_fragment.html fragments to #phase-events-list. • Pipeline OOB: polls /tasks/{id}/pipeline-oob every 2s, swaps OOB attrs. • SSE "close": stops streaming, triggers final OOB fetch. #} {# ── Header OOB swaps ── #} {{ task.name }} {{ task.id }} {{ task.status }} {% if task.current_phase %} phase {{ task.current_phase }} {% else %} — {% endif %}
{% include "partials/phase_pipeline.html" %}
{# ── Events list ───────────────────────────────────────────────────── #}
{{ task.status }} {% if events|length == 0 and task.status == 'running' %} Waiting for CLI output… {% else %} {{ events|length }} events {% endif %}
Goal
{{ task.goal }}
{% set ns = namespace(current_stage='') %} {% set _stage_map = {"research":"Researcher", "plan":"Implementer", "develop":"Implementer", "review":"Verifier", "test":"Verifier", "push":"Push"} %} {% for ev in events | reverse %} {% set p = ev.payload|from_json %} {# ── iter ── #} {% if ev.type == 'iter' %} {% set _stage = 'Updater' if p.agent == 'updater' else _stage_map.get(p.phase, '') %} {% if _stage and _stage != ns.current_stage %} {% set ns.current_stage = _stage %}
{{ _stage }}
{% if _stage == 'Researcher' %}web search + synthesis {% elif _stage == 'Implementer' %}plan + develop {% elif _stage == 'Verifier' %}review + test {% elif _stage == 'Push' %}finalize {% elif _stage == 'Updater' %}correction {% endif %}
{% endif %} {# ── tool ── #} {% elif ev.type == 'tool' %}
{{ p.name|default('?') }} {{ p.args_preview|default('') }} call
{# ── tool_result ── #} {% elif ev.type == 'tool_result' %}
{{ p.name|default('?') }} {{ 'ok' if p.ok else 'fail' }}
{% if p.snippet is defined and p.snippet %}
{{ p.snippet }}
{% endif %}
{# ── thinking ── #} {% elif ev.type == 'thinking' %} {# ── output ── #} {% elif ev.type == 'output' %}
{{ p.content|default('') }}
{# ── verdict ── #} {% elif ev.type == 'verdict' %} {% set v = p.verdict|default('') %}
{{ '✗' if 'FAIL' in v else '✔' }} {{ v }}
{# ── complete / exit ── #} {% elif ev.type == 'complete' %}
✔ Complete
{% elif ev.type == 'exit' %}
⏹ exit {{ p.code|default('?') }}
{# ── error ── #} {% elif ev.type == 'error' %}
✗ {{ p.message|default('error') }}
{# ── usage ── #} {% elif ev.type == 'usage' %}
Tokens {{ p.total|default(0) }} prompt {{ p.prompt_tokens|default(0) }} + completion {{ p.completion_tokens|default(0) }}
{% endif %} {% endfor %}
{# ── Pipeline OOB poller — updates phase status pills + timeline ── #} {% if task.status not in ('done', 'failed') %} {% endif %} {# ── SSE script: raw EventSource for zero-flicker streaming ── #} {% if task.status not in ('done', 'failed') %} {% endif %}