{% from "_macros.html" import icon %} {# The reply has stopped and is waiting for you. Two shapes, one mechanism: questions the model asked, and (later) a command waiting to be allowed. Everything shown here is model output and is escaped accordingly -- the questions, the options on the buttons and the command itself all came from a model that may have been reading somebody else's file a moment ago. Deliberately attributed to the model rather than styled as if {{ brand.name }} were asking. A question that looks like it came from the application is a question people answer with things they would not tell a chatbot. Several questions go on ONE card and come back in ONE submit. Asking them one at a time would cost a round trip and an interruption each, and answering the third would mean having forgotten the first. hx-swap="none" because the SSE stream clears this card the moment the answer lands; swapping a response in here would fight it. #}

{{ icon("sparkle", "icon--sm") }} The model is asking you

{% if ask.kind == "question" %} {% for item in ask.items %} {# Stacked, one per line, never in a row. An option carries a label and often a description, and a row of chips has nowhere to put the second and no room to read the first. Radio or checkbox by what the model said: `multiple` is false for alternatives and true for a set. The name is the same either way, so the endpoint reads one value or several without knowing which it asked for. #}
{{ item.title }}
{% for option in item.options %} {% endfor %} {% if item.allow_free_text %} {# Added here and nowhere else: on every question, by this template, never by the model. That is why the tool tells it not to write an "other" option of its own -- two of them is one that does nothing, and its version would have no box behind it. The box is revealed by `:has()` on the row, so this needs no JavaScript and cannot fall out of step with the checkbox. It is always submitted; the endpoint uses it only when this option is actually chosen. #} {% endif %}
{% endfor %}
{%- if ask.items | length > 1 %}All of them at once. {% endif -%} Leave any blank to skip it.
{% else %} {% for item in ask.items %}

{{ item.title }}

{% if item.purpose %} {# The model's own account of what this is for, above the thing itself. Deliberately separate from `reason` below, which is *our* reason for stopping — attributed, so nobody reads an explanation the model wrote as the application vouching for the command. #}

It says: {{ item.purpose }}

{% endif %} {% if item.detail %} {% if item.editable %} {# The command, correctable before it runs. A model proposing the right thing with one flag wrong is the common case, and Allow-or-Don't makes that a round trip to explain in prose. Both halves are always in the DOM and one is hidden, rather than the box being created when Edit is pressed: a field that does not exist until a click is a field that submits nothing if the click handler ever fails, and this one decides what runs on somebody's machine. The textarea is disabled while hidden so an untouched card cannot post a `text.` field at all — that field means "this was edited", and an empty one arriving would be indistinguishable from a command somebody cleared. #}
{{ item.detail }}

Allow runs what is in the box. It is not checked against this chat's rules again — you typed it.

{% else %}
{{ item.detail }}
{% endif %} {% endif %} {% if item.reason %}

{{ item.reason }}

{% endif %}
{% endfor %} {# Refusing, with or without saying why. A bare "Don't" tells the model it was refused and nothing else, so it does the only sensible thing left and asks what you would rather -- which costs a round to say something you already knew when you pressed the button. The box is how you skip that round: "not in that directory, use /srv" is a refusal and an instruction in one, and `_not_allowed` changes what it tells the model when there is one. Both halves are always in the DOM with one hidden, for the reason the edit box above gives: a field created by a click is a field that submits nothing when the click handler fails. And the textarea is disabled while hidden, so a card refused plainly cannot post an empty `reason` that would have to be told apart from one somebody cleared. #}
{# Never type="password", for the reason the "Something else" box above states: a chat transcript is not a place to keep secrets. #} {# `--deny-input` and not `--reason`: `.interaction__reason` already means *our* reason for stopping, which is the opposite direction. #}
{% endif %}