Talking to an agent
Wherever you are talking to it — Telegram, Discord, WhatsApp, the dashboard or nouride chat — the
message travels the same path. The gateway is the only part that differs.
Slash commands
Type these instead of a message. They are answered by the daemon, not by the model, so they cost nothing and always work.
/help | List available commands |
/status | Show agent status |
/new | Start a new conversation |
/compact | Summarise the conversation so far, keeping the recent turns |
/reset | Hard reset: clear the conversation, expire approvals, reload config |
/stop | Pause this agent |
/start | Resume this agent |
/model | Switch model for this chat |
/agents | List agents |
/prompt | Show the system prompt this agent is running with |
/reload | Reload persona files and config from disk |
/approvals | Change what this chat gets asked about |
/approve | Approve a pending tool call — add always to stop being asked for it |
/deny | Deny a pending tool call |
/grants | List standing command permissions, or revoke them: /grants revoke <id|all> |
/drafts | Skills the agent has drafted and wants your call on — show, approve, deny |
/commands | Sync this list to the platform’s own command menu |
/commands is worth running once per Telegram bot: it pushes the list into the native menu so the
people using it do not have to know any of this.
Sessions, and what /new actually clears
A conversation is stored per agent per chat. /new starts a fresh one — the agent stops seeing the
earlier messages.
What survives /new:
MEMORY.md— the agent’s own curated notes.USER.mdand the People entries — who you are, what you go by.- Skills — the shared pool.
So the fix for “it forgot my wife’s name after /new” is not to avoid /new. It is to have the fact
written down in one of those three places, where it is permanent.
When the conversation gets long
The daemon compacts rather than truncating: it summarises the older part of the conversation and
keeps the recent turns verbatim. That happens automatically, and /compact forces it early.
max_context_ratio decides how much of the model’s context window gets filled before that kicks in.
Configuration reference →
Groups
Two settings decide how an agent behaves in a room it is not being spoken to directly in:
groups_require_mention— off by default. On, an agent ignores unaddressed group chatter entirely. DMs still answer everything.group_context_messages— 20 by default. When an agent is addressed, this many recent messages come along, so@nouva ini gimana?arrives with the exchange it points at.
Chatter still triggers nothing. It is remembered, not answered.
Both are daemon-wide, and they live above the agent cards in the dashboard for that reason. A single connection can override the second, and that field says out loud that it is an override.
On Telegram, none of this works until privacy mode is off. BotFather → /setprivacy → Disable,
or make the bot an admin. Otherwise Telegram simply does not deliver the messages.
Two agents in one room
Agents address each other by tag. Nouva writes @nox benerin build ini, Nox sees it and acts.
The tag is the handover. A reply without one reaches nobody, which is how an exchange ends
naturally. That soft brake depends on a model choosing not to tag, so there is a hard one too: only a
mention routes a message from an agent — never a channel binding, never the gateway owner, never the
default agent — and after mention_max_hops handovers (5 by default) the daemon says so in the chat
and stops delivering. A human saying anything resets the count, because the limit exists to bound
unattended chatter.
Both agents share a working directory (workspace/shared/), which is what makes the handover
meaningful: the build Nox was asked to fix is somewhere Nox can actually open.
In a one-to-one chat this is not how it works, and it cannot be. Each bot has its own private
conversation with you, so a tag written in a DM reaches nobody — the other agent’s bot never sees the
message. There, an agent hands work over with the ask_agent tool instead: the other agent runs
behind the chat with its own skills and permissions, its progress appears labelled [nox], and its
answer comes back to the agent that asked. The one you are talking to stays the only one that speaks.
Nothing to configure. The prompt tells each agent which of the two applies to the chat it is in, and
mentions_enabled = false turns off both.
Files
Send an agent a file and it lands in its workspace. Images are read by a model if read_images is on
— by the agent’s own model unless you name a cheaper one in [media] image_model. Documents are
not sent to a model at all: they land in the workspace and the agent opens them with read or a
command, so a PDF costs nothing until the agent looks at it.
Agents send files back with send_file.
From the terminal
nouride chat # the default agentnouride chat nouva # address one by nameMessages go through a real in-process gateway, so routing, hooks, the queue, the tool loop and session persistence all run exactly as they would for a chat platform. Slash commands work. Approvals appear inline and you answer them with a keypress.
It also works non-interactively — piped stdin is detected, and approvals are printed rather than prompted for — which is how an end-to-end test talks to the daemon.