Skip to content

Communication & escalation tools

Reactions, ask_user, escalate_to_human, polls, Pushover, and inter-session messaging.

This page documents the agent tools your Revka agent uses to talk to people and to other sessions: react to messages, ask a question and wait for the answer, escalate to a human, run a poll, fire a Pushover push notification, and read or write across conversation sessions. Use it when you need the exact parameters each tool accepts.

The tools fall into three groups:

  • Channel interactionsreaction, ask_user, escalate_to_human, and poll send something to a live messaging channel. They depend on at least one channel being configured and initialized at startup. See Channels overview and Connect a messaging channel.
  • Push notificationspushover (and the escalation path of escalate_to_human) sends a mobile push via Pushover.
  • Inter-session messagingsessions_list, sessions_history, and sessions_send inspect and write to other conversation sessions, enabling cross-session and inter-agent communication. See Sessions & conversation state.

Adds or removes an emoji reaction on a message in any active channel (Discord, Slack, Telegram, etc.). You identify the message with the platform channel ID and message ID — not Revka’s internal channel name.

{
"channel": "discord",
"channel_id": "123456789",
"message_id": "msg_123",
"emoji": "👍",
"action": "add"
}
FieldTypeMeaning
channelstring (required)The configured channel name to react in (e.g. discord, slack, telegram).
channel_idstring (required)Platform-specific channel/conversation identifier (e.g. a Discord channel snowflake, a Slack channel ID).
message_idstring (required)Platform-scoped identifier of the message to react to.
emojistring (required)The emoji — a Unicode character (e.g. 👍) or a platform shortcode.
actionstringadd (default) or remove. Any other value is rejected.

If the named channel is not in the channel map, the tool lists the available channel names in its error. Emoji format differs per platform — some platforms expect a Unicode character, others a shortcode — so use what the target platform accepts.

Asks the user a question on a messaging channel and blocks the agent loop until they reply or the timeout expires. Pass choices to offer structured options; on the CLI they render as a numbered list, and on platforms that support it (e.g. Telegram) as buttons.

{
"question": "Which deployment environment should I use?",
"choices": ["production", "staging", "dev"],
"timeout_secs": 120
}
FieldTypeMeaning
questionstring (required)The question to ask. Must be non-empty.
choicesarray of stringsOptional structured options. Rendered as a numbered list (and buttons on capable channels). Empty entries are dropped.
timeout_secsintegerSeconds to wait for a reply. Default 300.
channelstringTarget channel name. Defaults to the first available channel if omitted.

The tool returns the user’s reply text on success. On timeout it returns success: false with the output TIMEOUT and an error such as No response received within 120 seconds. If you name a channel that does not exist, the error lists the available channels.

Escalates a situation to a human operator with urgency routing. It sends a structured, urgency-prefixed message to the active channel, and for high or critical urgency it also fires a Pushover notification when credentials are configured. Optionally it blocks to wait for a human reply.

{
"summary": "Database replication lag exceeded 30s",
"context": "Lag has been growing for 10 minutes",
"urgency": "high",
"wait_for_response": true,
"timeout_secs": 600
}
FieldTypeMeaning
summarystring (required)One-line escalation summary. Must be non-empty.
contextstringDetailed context for the human.
urgencystringlow, medium (default), high, or critical. Any other value is rejected.
wait_for_responsebooleanfalse by default. When true, the tool blocks and returns the human’s reply.
timeout_secsintegerWait timeout when wait_for_response is true. Default 600.

The escalation is sent to the first available channel. The message is prefixed by urgency — ℹ️ [LOW], ⚠️ [MEDIUM], 🔴 [HIGH], or 🚨 [CRITICAL] — followed by the summary, the optional context, and a Reply to this message to respond. line.

When wait_for_response is false, the tool returns immediately with a JSON status, e.g. {"status":"escalated","urgency":"high","channel":"slack"}. When true, it returns the human’s reply text, or TIMEOUT if none arrives in time.

The Pushover step is best-effort: high/critical escalations still succeed (channel-only) even when Pushover credentials are missing or the push fails. The push uses the title Agent Escalation, with Pushover priority 1 for critical and 0 for high; low and medium never push.

Creates a poll in a messaging channel. The poll is rendered as a numbered text message with number-emoji voting (1️⃣–🔟) so it works on every channel.

{
"question": "Which tech talk topic should we host next?",
"options": ["Rust", "WebAssembly", "AI agents"],
"channel": "discord",
"duration_minutes": 60,
"multi_select": false
}
FieldTypeMeaning
questionstring (required)The poll question. Must be non-empty.
optionsarray of strings (required)The answer options. 2–10 non-empty entries; outside that range the call is rejected.
channelstringTarget channel name. Defaults to the first available channel if omitted.
recipientstringRecipient/chat identifier within the channel (e.g. a Telegram chat ID or a Slack channel ID).
duration_minutesintegerPoll duration shown in the message. Default 60.
multi_selectbooleanfalse by default. Controls the “single choice” vs. “multiple choices allowed” label.

Sends a Pushover push notification to your configured device. Credentials are read from a .env file in the agent’s workspace directory.

{
"message": "Deployment succeeded",
"title": "CI/CD",
"priority": 1
}
FieldTypeMeaning
messagestring (required)The notification body. Must be non-empty.
titlestringOptional notification title.
priorityinteger-2 (lowest/silent), -1 (low/no sound), 0 (normal), 1 (high), 2 (emergency/repeating). Values outside -2..=2 are rejected.
soundstringNotification sound override (e.g. pushover, bike, bugle, cashregister).

Setup: create a Pushover account and application to get an API token, then add both values to the .env file in the workspace:

Terminal window
# .env (in the agent's workspace directory)
PUSHOVER_TOKEN=your-application-api-token
PUSHOVER_USER_KEY=your-user-key

Both keys are required; the tool errors if either is missing. export prefixes, quoted values, and trailing # comments are tolerated. Priority 2 (emergency) repeats until acknowledged in the Pushover app.

These three tools let the agent see and act across other conversation sessions. A session is keyed by <channel>__<identifier> (for example telegram__alice or discord__bob); the part before __ is the channel. Sessions are persisted by the session backend in the workspace.

sessions_list is read-only and ungated. sessions_history requires the Read tool operation and sessions_send requires the Act operation, so both are subject to the security policy. A session_id must be non-empty and contain at least one alphanumeric character.

Lists active sessions with their channel, last activity time, and message count.

{"limit": 20}
FieldTypeMeaning
limitintegerMax sessions to return. Default 50.

Returns No active sessions found. when there are none; otherwise one line per session in the form - telegram__alice: channel=telegram, messages=2, last_activity=....

Reads the message history of a specific session, returning the last N messages with their roles.

{"session_id": "telegram__alice", "limit": 50}
FieldTypeMeaning
session_idstring (required)The session ID, e.g. telegram__alice. From sessions_list.
limitintegerMax messages to return, counting from the most recent. Default 20.

Each message is rendered as [<role>] <content> (roles such as user and assistant), prefixed by a header like Session 'telegram__alice': showing 2/2 messages. An unknown or empty session returns No messages found for session '...'.

Sends a message to a specific session by its ID. The message is appended to that session’s conversation history as a user message — this is the push model that enables inter-agent communication: the next time the target session runs, the message is in its history and drives the agent’s response.

{
"session_id": "discord__bob",
"message": "The background task has completed. Results: ..."
}
FieldTypeMeaning
session_idstring (required)The target session ID, e.g. discord__bob.
messagestring (required)The message content. Must be non-empty.

On success it returns Message sent to session '<id>'. Sending to a session ID that does not exist creates/appends to that key in the backend; the validation only rejects blank or non-alphanumeric IDs and empty messages.