{% extends "admin/_layout.html" %} {% from "_macros.html" import icon %} {% set section = "agents" %} {% block title %}Agents - LLeMbas{% endblock %} {% block heading %}Agents{% endblock %} {% block admin_content %}

An Agent chat can read files, write files and run commands on a machine reached over SSH. Nothing runs on this server. People add their own connections under Connections; what you decide here is whether the feature exists and what one reply may spend.

{{ icon("shield", "icon--sm") }} There is no sandbox to configure, and that is deliberate: containment is whatever host somebody points a connection at. A container built for the job is a very different thing from a key to a live server, and LLeMbas cannot tell them apart. What a model reads — a web page, a file, the output of the last command — is untrusted, and in Auto mode nothing stands between that and a command running.
{% if problem %}
{{ icon("warning", "icon--sm") }} {{ problem }}
{% endif %} {% if saved %}
{{ icon("check", "icon--sm") }} Saved.
{% endif %}

Switch

Off, nobody can start one and no agent tool is offered, whatever permissions they hold. {{ profile_count }} connection{{ '' if profile_count == 1 else 's' }} saved across all accounts.

People also need the Run commands permission, a model flagged Agent execution, and a connection of their own.

The modes

Set per chat and switchable at any time. This is what each one means; the two lists below adjust them.

{% for value, label, hint in modes %}
{{ label }}
{{ hint }}
{% endfor %}

What never needs asking

One per line: a tool name like file_read, or a command with wildcards like git *. A command containing anything that joins two commands together — a semicolon, a pipe, backticks — can never match one of these, so git * does not quietly also mean git status; curl … | sh.

What always needs asking

Checked before everything, including Auto. Treat it as a guard against an accident rather than against an adversary: rm -rf /* here does not stop /bin/rm -rf /, and nothing pattern-shaped could.

What one command may spend

Characters. The rest is cut off and the model is told so.

What one reply may spend

Three separate bounds, because they fail differently: steps stop a loop, the clock stops one slow command eating an afternoon, and output stops a model filling its own context with build logs and having no room to answer.

Time spent waiting for you to answer does not count.

Asking you things

Seconds. After this the reply carries on without an answer and says so. At least a minute, whatever is typed here.

When a model asks a question it can offer answers to pick from, and by default a box to write something else. Turn this off if you would rather nobody typed free text into a prompt a model composed.

The terminal

A panel beside an agent chat holding an interactive shell on that chat's own connection. What somebody types there is theirs: the modes and the two lists above govern the model, not the person at the keyboard, who could open the same shell with an ssh client. The model cannot see the panel; sending it something is a button they press.

People also need the Open a terminal permission. {{ terminal_count }} shell{{ '' if terminal_count == 1 else 's' }} open right now.

Seconds with nobody watching and nothing typed. Closing the panel does not end the session — a build carries on and is still there on the way back — so this is what eventually ends one.

One per chat. Each holds an SSH connection open on the far machine.

The project directory

A listing of the directory a chat works in, so a reply does not spend its first rounds finding out what is there — and so files can be attached by name with @. Built by one read-only command (git ls-files where it works, otherwise find), cached briefly, and shared by every chat pointed at the same directory.

Off means no listing is built at all, and the file picker offers only what is in the library.

This is spent on every request in an agent chat, so it is a budget rather than a limit: directories that will not fit are shown as a count and the model is told to look inside them itself. 0 keeps the listing for the file picker and puts none of it in the prompt.

{% endblock %}