The operator console
The Chat tab of Korvun Desktop is the operator console: read every conversation flowing through your channels, answer them yourself when you want to, and talk to your brains directly — all from the app, all persisted in the same durable store.
It needs the storage and session blocks from the
configuration reference. The desktop provisions
both automatically on first run and when upgrading an existing config,
so normally there is nothing to do. Direct chat with the AI additionally
needs a console channel entry:
{ "type": "console" }
The inbox
The left pane lists every conversation in the store, newest activity first:
- Filter as you type — the box narrows the list instantly by conversation key, and also searches message content on the server.
- Unread badges — each conversation shows how many turns arrived since you last opened it; opening a conversation marks it read.
- TAKEN OVER marks conversations where you hold the takeover (below).
Turns are role-styled: the end user, the brain (Korvun), you
(Operator, right-aligned), and dashed system lines such as session-reset
acknowledgements. Attachments arrive announced: a photo persists and
renders as an [image] marker.
Sessions, /new and /reset
A conversation is a series of sessions; only the newest is active and only the active one is the brain's context. A session ends when:
- the end user (or you, in direct chat) sends a reset trigger —
/newor/resetby default — as the exact first token; the channel answers with a fixed acknowledgement and a fresh session opens; or - a configured
daily_at/idle_minexpiry passes, applied lazily at the next inbound message.
Old sessions stay stored: the session tabs above the transcript navigate them read-only. Resetting never deletes anything — it only cuts the context.
Recovering a cut: /recall
The cut is recoverable on purpose, never by accident. /recall
(enabled by session.recall_max) quotes the previous session's tail back
into the active one as ONE clearly-marked block — the header names its
source session, the acknowledgement names how many turns came back. It only
works on an EMPTY active session; on a non-empty one it refuses and points
you to /new first. Deliberate recovery, provenance visible, duplication
impossible by construction. The full design is on the
governed memory page.
Notes and /notes
A brain with memory configured also keeps notes — short facts the model
stores through the governed memory_note tool (see
governed tools and skills). Notes are not
history: they SURVIVE session resets on purpose, riding the brain's context
only within their scope. /notes lists them numbered; /notes clear wipes
the scope — both are instant system commands, no model call, and clearing
notes never touches the transcript.
Answering as the operator (takeover)
On a network channel (Telegram, Discord, webhook), replying by hand first requires Take over: while you hold it, the brain is silenced for that conversation — inbound turns still persist and still appear live, but no model answers. Your replies go out through the channel's own adapter (cost zero — no model call) and persist as operator turns, so when you Release, the brain resumes with your replies in its context. Takeover is per-conversation, survives session resets, and is not durable across a core restart (fail-open: the brain answers again).
Direct chat with the AI (console channel)
With a console channel configured, New chat ▾ asks first —
«¿Con qué cerebro?» — and starts the conversation addressed to the brain
you pick. The choice is part of the conversation itself: it survives
restarts, shows as a badge in the inbox and the header, and is honored on
the console channel only (a network channel can never smuggle a brain
address past its configured route). You are the user here, so there is no
takeover; messages run the full pipeline (policy, routing, persistence).
Sessions, /new, deletion, search and unread badges behave exactly as
everywhere else.
The wait never lies about who is working. While a reply is in flight the
console names the actual brain and model — «mybrain está pensando —
llama3.2:1b · local…» — and keeps its locality honest (local / nube).
If a request dies (provider error, dead model, broken route), the waiting
line CUTS and a visible band says so with Reintentar at hand — never an
eternal spinner. After 60 seconds without an answer the console warns and
offers Cancelar y reintentar, but it never cuts on its own: a real
local model on modest hardware may legitimately need the time. These error
states live in the UI only — your stored conversation keeps real turns, and
the permanent record stays the Activity feed.
From the console channel, /tools returns the gatekeeper report of that
conversation's brain — its effective tool grants and recent tool activity.
Deleting
- Delete conversation removes the whole conversation — every session, every turn — from disk, and releases any takeover first.
- Delete session removes one archived session; the active session
cannot be deleted (use
/newfirst if you really want to cut it).
Both are permanent. There is no undo.
Security notes
- The desktop UI never holds the admin bearer: the shell injects it server-side, and the live event stream stays secret-free.
- Secrets are only ever env-var names in the config; values live in the environment or the OS keychain. On the desktop, the SECRETOS card in Ajustes manages keychain values write-only — no value is ever shown back.