{{ icon("sparkle", "icon--sm reasoning__icon") }} {{ t("Thinking") }} {{ icon("chevron-down", "icon--sm reasoning__chevron") }}
{{ icon("refresh", "icon--sm") }} {{ t("%(failed)s did not answer (%(reason)s), so %(answered)s answered instead.", failed=fell_back.failed, answered=fell_back.label, reason=(fell_back.reason or "").rstrip(".")) }}
{% endif %} {% if message.role == "assistant" %} {# The same id and the same marker as the live container. That is what carries an opened block across the `done` frame, which replaces the whole bubble: steps.js keys what it remembers on this id, and the ids inside come from the mark index either way. #}{{ icon("x", "icon--sm") }} {{ t("Stopped. This reply is cut short.") }}
{% endif %} {% elif message.content == continue_prompt() %} {# Continue: the harness's own sentence, sent as this turn. Shown as what was pressed, not as a paragraph nobody typed -- the LLeMbas CLI's TUI draws the same turn as "↻ continue". #}↻ {{ t("Continue") }}
{% elif machine and message.content %} {# Jinja's own escaping, not `tokens`: that filter marks `@name` as a reference to this reader's files and people, and an `@` inside a command line or a log is neither. Nothing here goes through services/markdown.py either -- the fence in the content stays a fence on screen, for the same reason: it came off somebody else's machine. #}