Terminal chat
nouride chat # the default agentnouride chat nouva # address one by nameNothing reaches an agent unless a gateway delivers it, so a fresh daemon with no Discord or Telegram token is unreachable. This is the way in.
It is a real gateway, not a shortcut
Messages travel through the in-process local gateway, so routing, hooks, the queue, the tool loop
and session persistence all run exactly as they would for a chat platform. That is what makes it a
genuine end-to-end test rather than a debug console.
It is registered by:
[control]enabled = truechat = trueWhat works here
- Slash commands. All of them —
/new,/model,/approvals,/drafts. - Approvals inline. A request appears mid-turn and a keypress answers it.
ais “always”. - Live progress. Tool steps as they happen, rather than a pause and then a wall of text.
- Sessions. The conversation is
cli-<pid>, so each run of the command is its own thread.
Non-interactive
Piped stdin is detected, not assumed:
echo "what is the disk usage on this box?" | nouride chat nouvaApprovals are printed rather than prompted for, and the command does not try to read from a stream that has ended. A script driving this is a first-class use — it is how an end-to-end test talks to the daemon — and trying to prompt anyway used to crash at EOF.
Against a remote daemon
Every command except start talks to a running daemon over the control API, so this works over the
network too:
export NOURIDE_URL=https://nouride.example.comexport NOURIDE_TOKEN=<contents of its data/.control-token>nouride chatLocally it reads data/.control-token itself, which is why no token is needed on the box.
Why it does not start its own daemon
A CLI that booted one to answer a question would report on a process nobody is using — and
nouride chat would talk to a second copy with its own gateway connections. Two Telegram bots
polling one token get half the messages each.
So this needs a daemon running. If there is none:
nouride startLeaving
/quit, or Ctrl-D.