@inline-openclaw/inline
v0.0.28
Published
OpenClaw channel plugin for interacting with an OpenClaw agent via **Inline**.
Readme
@inline-openclaw/inline
OpenClaw channel plugin for interacting with an OpenClaw agent via Inline.
Status: beta (solid foundation; expect iteration).
Quick setup guide: docs/openclaw-setup.md.
Create bot/token guide: docs/create-inline-bot.md.
Supports:
- Inline DMs (
ChatType=direct) - Inline chats as conversations (
ChatType=group) - Message replies: OpenClaw
replyToIdis mapped to InlinereplyToMsgId(message id). - Optional native reply threads: enable
channels.inline.capabilities.replyThreads: trueto expose Inline reply-thread chats as OpenClaw threads. - Native media upload/send for images, videos, and documents from
mediaUrlpayloads. - Emoji reactions via message tool actions (
react,reactions). - Reaction events on bot-authored messages are surfaced back to the agent as inbound context.
By default, native reply threads stay off to preserve the old compatibility behavior. When disabled:
replyToIdremains an Inline message reply only.thread-replykeeps the legacy compatibility path.thread-createkeeps the legacy chat-creation alias behavior.
When enabled:
- inbound reply-thread messages use the parent chat as the base conversation target and the child reply-thread chat id as
MessageThreadId - outbound
thread-replysends into the child reply-thread chat thread-createcreates a real Inline reply thread instead of a plain chat alias
Install
Requires OpenClaw 2026.3.28 or newer.
From npm (once published):
openclaw plugins install @inline-openclaw/inlineIf the plugin is already installed, update in place:
openclaw config set plugins.installs.inline.spec '"@inline-openclaw/inline@latest"'
openclaw plugins update inlineFrom a local checkout (dev):
cd /path/to/inline/packages/openclaw
bun run build
openclaw plugins install --link /path/to/inline/packages/openclawConfigure
Channel config lives under channels.inline (supports account settings, block streaming/chunking, and group tool policy).
Plugin id is inline (for plugins.entries.*).
If you enable explicitly, use:
plugins:
entries:
inline:
enabled: trueMinimal setup (token field only):
channels:
inline:
enabled: true
token: "<INLINE_BOT_TOKEN>"baseUrl defaults to https://api.inline.chat.
dmPolicy defaults to pairing (recommended starting point).
requireMention defaults to false for groups (set true to require explicit mentions).
Example:
channels:
inline:
enabled: true
baseUrl: "https://api.inline.chat"
token: "<INLINE_BOT_TOKEN>"
# DMs:
dmPolicy: "pairing" # pairing|open|disabled
allowFrom:
- "inline:123" # or "user:123" or just "123"
# Group threads/chats:
groupPolicy: "allowlist" # allowlist|open|disabled
groupAllowFrom:
- "inline:123" # or "user:123" or just "123"
capabilities:
replyThreads: false # optional, default false; enable native Inline reply-thread support
requireMention: true # optional: default is false
replyToBotWithoutMention: true # if true, replies to bot messages can bypass mention requirement
# Inbound context history (used to build richer thread context for the agent):
historyLimit: 50 # group chats
dmHistoryLimit: 6 # direct messages
# Streaming + chunking:
mediaMaxMb: 20
blockStreaming: true
streamViaEditMessage: true # optional: paragraph-level text streaming via send+edit fallback; off by default
chunkMode: "newline" # length|newline
blockStreamingCoalesce:
minChars: 600
idleMs: 700
maxChars: 2200
# Group-level tool policy (for agent tool access in group sessions):
groups:
"88":
requireMention: false
tools:
allow: ["message", "web.search"]
toolsBySender:
"42":
allow: ["message"]Per-account override:
channels:
inline:
capabilities:
replyThreads: false
accounts:
work:
token: "<INLINE_BOT_TOKEN>"
capabilities:
replyThreads: trueReply behavior summary:
replyToIdis always an Inline message id.- Native reply threads are separate and use OpenClaw
threadId. - Keep
replyThreadsoff if you only want classic message replies.
If you set dmPolicy: "open", set allowFrom: ["*"].
Outbound Target Semantics
For message send/plugin outbound sends:
chat:<id>targets a chat id.user:<id>targets a user id (DM peer).inline:user:<id>andinline:chat:<id>are accepted and normalized.- User directory IDs and
channels resolve --kind useroutputs are returned asuser:<id>to keep DM targets explicit. - Bare numeric ids are disambiguated against Inline directory data:
- matches chat only -> sent as chat id
- matches user only -> sent as user id
- matches both -> rejected (use explicit
chat:oruser:) - matches neither -> treated as chat id (legacy behavior)
Message Tool RPC Actions
The plugin exposes Inline RPC-backed actions through OpenClaw's message tool.
Most Inline RPC-backed actions use a numeric chat id via to, chatId, or channelId.
Direct DM sends can also target user:<id>.
- Sending:
send,sendAttachment - Replying:
reply,thread-reply - Reactions:
react,reactions - Reading/searching:
read,search - Editing:
edit - Channels/threads:
channel-info,channel-edit,renameGroup,channel-list,channel-create,channel-delete,channel-move,thread-list,thread-create - Participants:
addParticipant,removeParticipant,kick,leaveGroup,member-info - Message lifecycle:
delete,unsend - Pins:
pin,unpin,list-pins - Space permissions:
permissions
Native thread semantics are behind channels.inline.capabilities.replyThreads:
- disabled:
thread-replybehaves like the old compatibility reply path - enabled:
thread-replyexpectsthreadIdto be the child reply-thread chat id, whiletostays the parent chat id - enabled:
thread-createcreates a real reply thread from a parent chat and optionalreplyToIdanchor
You can gate action groups from config:
channels:
inline:
actions:
send: true
reply: true
reactions: true
read: true
search: true
edit: true
channels: true
participants: true
delete: true
pins: true
permissions: trueExtra Agent Tools
The plugin also registers a dedicated inline_members tool for space-member discovery outside the message action surface.
- Required input:
spaceId - Optional filters:
query,userId,limit,accountId - Returned members include explicit DM targets like
user:123
The plugin also registers inline_bot_commands for bot slash command management (v1):
action: "get"-> callsgetMyCommandsaction: "set"-> callssetMyCommandswith Telegram-stylecommands[]action: "delete"-> callsdeleteMyCommands- Limits follow Inline Bot API: max
100commands,commandmax32,descriptionmax256, charset^[a-z0-9_]+$
Native command sync (Telegram-style startup behavior):
- On
gateway_start, the plugin clears + re-registers default native commands for each enabled/configured Inline account. - Default commands now mirror OpenClaw native defaults (for example:
/status,/model,/exec,/usage, etc.). - When available in
openclaw/plugin-sdk, the plugin uses the same command + skill sources as native providers (Telegram/Slack/Discord), including plugin command specs. - Disable startup sync globally with
commands.native: false, or per-channel withchannels.inline.commands.native: false. - Disable native skill command inclusion with
commands.nativeSkills: false, or per-channel withchannels.inline.commands.nativeSkills: false.
Multi-account:
channels:
inline:
accounts:
default:
baseUrl: "https://api.inline.chat"
token: "<BOT_TOKEN_A>"
work:
baseUrl: "https://api.inline.chat"
token: "<BOT_TOKEN_B>"Quick Troubleshooting
plugin not found: inline/plugins.entries.inline: plugin not found: inline- Ensure the plugin is installed and discovered (
openclaw plugins list).
- Ensure the plugin is installed and discovered (
doctor --fixsuggests Inline changes even though channel is healthy- Plugin entry id should be
inline.
- Plugin entry id should be
Inline: SETUP / no token- Ensure
channels.inline.tokenis set and plugin is updated (openclaw plugins update inline). - If using
dmPolicy: "open", ensureallowFrom: ["*"].
- Ensure
