{# Renders a single event as an HTML fragment for SSE direct push. Also includes pipeline OOB updates when phase changes. Used by: sse_stream() in mangopi_web.py #} {% set p = event.payload|from_json %} {# ── iter ── #} {% if event.type == 'iter' %} {% set _stage_map = {"research":"Researcher", "plan":"Implementer", "develop":"Implementer", "review":"Verifier", "test":"Verifier", "push":"Push"} %} {% set _stage = 'Updater' if p.agent == 'updater' else _stage_map.get(p.phase, '') %} {% if _stage and _stage != last_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 event.type == 'tool' %}
{{ p.name|default('?') }} {{ p.args_preview|default('') }} call
{# ── tool_result ── #} {% elif event.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 event.type == 'thinking' %} {# ── output ── #} {% elif event.type == 'output' %}
{{ p.content|default('') }}
{# ── verdict ── #} {% elif event.type == 'verdict' %} {% set v = p.verdict|default('') %}
{{ '✗' if 'FAIL' in v else '✔' }} {{ v }}
{# ── usage ── #} {% elif event.type == 'usage' %}
Tokens {{ p.total|default(0) }} prompt {{ p.prompt_tokens|default(0) }} + completion {{ p.completion_tokens|default(0) }}
{# ── complete / exit ── #} {% elif event.type == 'complete' %}
✔ Complete
{% elif event.type == 'exit' %}
⏹ exit {{ p.code|default('?') }}
{# ── error ── #} {% elif event.type == 'error' %}
✗ {{ p.message|default('error') }}
{% endif %} {# start events silently skipped #}