Life of a message
A message passes through 13 steps: it is received, checked against the allow-list, queued in order, sent to a model, run through tool rounds with approval where needed, screened and answered.
Message arrivesThe gateway gets a Telegram update or a Discord message. It can fail when: The adapter is down or the platform drops the update.Telegram adapterDiscord adapter
Allow-list checkOnly listed user ids continue. An empty list refuses everyone. It can fail when: Unlisted users get a refusal.Telegram adapterDiscord adapter
Wait for the chat lockEach chat or channel has one lock. A second message waits in arrival order. It can fail when: A long first turn delays the second message.Telegram adapterDiscord adapter
Build the promptSystem text, tool list, memory context and recent history are put together. Long history is shortened. It can fail when: Very long chats are summarised with a simple text method, not by a model.Agent loopMemory store
Pick a modelThe router picks small, medium or power from the message and the settings. It can fail when: An empty tier falls back to the next one.Model router
Call the modelThe provider layer sends messages and tool schemas. It can fail when: The API returns an error. Fallback candidates are tried when set.Provider layer
Tool roundIf the model asks for tools, each is run and the results go back. The default limit is 25 rounds. It can fail when: At the limit the model is asked once for a wrap-up without tools.Agent loopTool registry and groups
Approval pauseRisky code or commands return an approval request and the turn ends. It can fail when: The owner does not tap. The request stays saved and can be denied or reset.Approval gate
Run approved workAfter a button press the code or command runs with secrets filled in. It can fail when: A timeout or an error is reported as text.Python sandboxShell terminalSecret vault
Screen resultsWeb text is checked for injection phrasing. Output is redacted for known secrets. It can fail when: Pattern checks can miss new phrasing.Content and privacy screeningSecret vault
Split and sendLong replies are split to fit (Telegram 4,000 characters, Discord 1,900). It can fail when: Some paths still cut text blindly, such as scheduled-job sends.Telegram adapterDiscord adapter
Progress linesTool lines and interim text can be shown while the turn runs. It can fail when: Setting TOOL_PROGRESS to off hides them.Telegram adapterDiscord adapter
Turn endsHistory is kept. Pending approvals are saved to disk. It can fail when: A restart clears time-boxed windows and session allows.Agent loopApproval gate
Checked against the source at commit f4fd89f on 29 Oct 2026. Everything here is merged on the main branch; no release has been tagged yet. The source is private, so these pages are the public description.