notify_user.
message — Endpoint-Scoped Messaging
Themessage tool supports 7 actions — send, reply, react, edit, delete, fetch, and attach. Comis verifies the requested coordinates against the turn’s authoritative endpoint, then dispatches to its exact channel adapter instance. Not every action is supported on every platform (see the capability matrix below); the tool returns a structured error if you ask for something the channel cannot do.
All actions require the channel_type parameter to specify which platform adapter handles the request. This is a required string identifying the channel type (e.g., telegram, discord, slack, whatsapp, signal, imessage, line, irc, email).
Quick Reference
Actions
send -- Send a new message
send -- Send a new message
Sends a new message to the endpoint authorized for the current turn. An inbound turn uses its source endpoint; a scheduled or heartbeat turn can send only after the run is bound to an exact endpoint.Parameters:
Example — Send a notification:
react -- Add an emoji reaction
react -- Add an emoji reaction
Adds an emoji reaction to an existing message. This is a lightweight way for agents to acknowledge messages without sending a full reply.Parameters:
Example — Acknowledge a request:
Emoji names vary by platform. Discord uses custom emoji names, Telegram uses Unicode emoji, and Slack uses shortcodes like
:thumbsup:. The agent handles the translation automatically.edit -- Edit a sent message
edit -- Edit a sent message
Edits a message that the agent previously sent. Useful for updating status messages or correcting errors.Parameters:
delete -- Delete a message
delete -- Delete a message
Deletes a message from a channel. The agent can only delete messages it has permission to delete — typically its own messages or, on platforms with moderation rights, other users’ messages.Parameters:
Platform permissions apply. On Discord, the bot needs “Manage Messages” permission to delete other users’ messages. On Telegram, the bot needs admin rights. Check your platform’s documentation for permission requirements. This is a destructive action that requires user confirmation via the
_confirmed parameter.fetch -- Retrieve recent messages
fetch -- Retrieve recent messages
Fetches recent messages from a channel. Useful when the agent needs to review recent conversation history or catch up on messages it may have missed.Parameters:
Returns a list of messages including their IDs, authors, timestamps, and content.Example — Get the last 5 messages:
attach -- Send a message with a file
attach -- Send a message with a file
Sends a message with a file attachment. The agent can attach images, documents, audio files, or any other file type supported by the target platform.Parameters:
Example — Send a generated report:
File size limits vary by platform. Discord allows up to 25 MB (or 100 MB with Nitro). Telegram allows up to 50 MB for most files. Check your platform’s limits if sending large files.
Per-channel capability matrix
Channel adapters declare what they can do via aChannelCapability schema, and the message tool checks support before dispatching. Asking for an unsupported action returns a structured error with errorKind: "platform" — it does not silently no-op.
Streaming methods:
edit— the agent posts a placeholder, then edits it in place as content streams in. Supported on Discord, Telegram, Slack.block— the agent buffers chunks and emits complete blocks (no edit). Used by WhatsApp and Signal where edits are unreliable or unsupported.none— no streaming; the agent waits for the full reply before sending.
The React column above is the outbound capability — whether the agent can add an emoji via
message action: react. It is independent of inbound-reaction capture (below): a channel can support sending reactions while not exposing inbound ones, and vice versa.Inbound reactions: corroborating learning signal
Beyond sending reactions (thereact action above, plus the removeReaction lifecycle), Comis also captures reactions that other people add to the agent’s own outbound messages — turning a 👍 / 👎 into a lightweight, corroborating outcome signal for Verified Learning.
This is off by default and only does anything when learningOutcome.enabled is set for the agent (and the master memory.enabled switch is on). When enabled, a reaction is matched against the agent’s reactionMap (👍/✅ → success, 👎/❌ → failure by default) and recorded through the reaction source. It is strictly a corroborating signal: it can only weight an outcome the deterministic tool/pipeline signal already resolved, never override it. The captured event carries ids / emoji / counts only — never a message body or a sender display name. See the learningOutcome config for the trust-weighting and rate-limit behavior.
Which channels capture inbound reactions
Operator setup
The reaction-capable platforms need a one-time setup so the platform actually delivers reaction events:- Slack — add the
reactions:readOAuth scope to the app and subscribe to thereaction_addedevent in the app’s Event Subscriptions. Without both, Slack silently delivers no reaction events and the signal stays dark with no error. - Telegram — the bot opts into
message_reactionupdates automatically. Telegram webhook ingestion is not available; setting a webhook URL fails adapter startup. - Discord — no developer-portal change. Comis already holds the
GuildMessageReactions/DirectMessageReactionsintents.
Endpoint-Scoped Routing
channel_type and channel_id are necessary coordinates, but they are not
sufficient authority. The current turn must also carry the same complete
endpoint. This keeps separate accounts, threads, and direct/shared
conversations distinct even when a platform reuses the same visible ID.
To contact a different known endpoint, bind the scheduled run to that endpoint
or use notify_user. Notification resolution accepts only complete endpoints
recorded from authoritative session activity and fails closed when none exists.
notify_user — Proactive Notifications
Thenotify_user tool delivers proactive notifications outside the normal request-response flow. The daemon resolves a complete tracked endpoint, then applies rate limiting, dedup, quiet-hours suppression, and channel-resolution guards before enqueueing the notification.
Example — Critical alert that bypasses quiet hours:
notify_user for agent-initiated communication (alerts, reminders, task-completion notices) when the daemon should resolve a tracked endpoint and apply platform-level guards. Use message (action: send) for direct messaging to the endpoint already authorized for the current turn.
Related
Channels Overview
Connect Discord, Telegram, Slack, and 5 more platforms
Sessions
Sub-agents, pipelines, and session management
Agent Tools Overview
Master reference table of all tools
Platform Actions
Moderation actions for Discord, Telegram, Slack, and WhatsApp
