@inline-openclaw/inline 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -12,6 +12,8 @@ Supports:
12
12
  - Inline DMs (`ChatType=direct`)
13
13
  - Inline chats (including top-level thread-style chats) as conversations (`ChatType=group`)
14
14
  - Message replies: OpenClaw `replyToId` is mapped to Inline `replyToMsgId` (message id).
15
+ - Emoji reactions via message tool actions (`react`, `reactions`).
16
+ - Reaction events on bot-authored messages are surfaced back to the agent as inbound context.
15
17
 
16
18
  Non-goals (for now):
17
19
 
@@ -44,7 +46,7 @@ openclaw plugins install --link /path/to/inline/packages/openclaw-inline
44
46
 
45
47
  ## Configure
46
48
 
47
- Channel config lives under `channels.inline` (the plugin config schema is intentionally empty).
49
+ Channel config lives under `channels.inline` (supports account settings, block streaming/chunking, and group tool policy).
48
50
 
49
51
  Plugin id is `inline` (for `plugins.entries.*`).
50
52
  If you enable explicitly, use:
@@ -87,10 +89,49 @@ channels:
87
89
  groupAllowFrom:
88
90
  - "inline:123" # or "user:123" or just "123"
89
91
  requireMention: true
92
+ replyToBotWithoutMention: true # if true, replies to bot messages can bypass mention requirement
93
+
94
+ # Inbound context history (used to build richer thread context for the agent):
95
+ historyLimit: 12 # group chats
96
+ dmHistoryLimit: 6 # direct messages
97
+
98
+ # Streaming + chunking:
99
+ blockStreaming: true
100
+ chunkMode: "newline" # length|newline
101
+ blockStreamingCoalesce:
102
+ minChars: 600
103
+ idleMs: 700
104
+ maxChars: 2200
105
+
106
+ # Group-level tool policy (for agent tool access in group sessions):
107
+ groups:
108
+ "88":
109
+ requireMention: false
110
+ tools:
111
+ allow: ["message", "web.search"]
112
+ toolsBySender:
113
+ "42":
114
+ allow: ["message"]
90
115
  ```
91
116
 
92
117
  If you set `dmPolicy: "open"`, set `allowFrom: ["*"]`.
93
118
 
119
+ ## Message Tool RPC Actions
120
+
121
+ The plugin exposes Inline RPC-backed actions through the OpenClaw `message` tool:
122
+
123
+ - `read` (read recent messages in a thread/chat)
124
+ - `search` (search messages in a thread/chat)
125
+ - `react` (add/remove a reaction on a message via `emoji`, `messageId`, optional `remove`)
126
+ - `reactions` (list reactions on a message by `messageId`)
127
+ - `edit` (edit a message by `messageId`)
128
+ - `channel-info` (fetch thread/chat metadata)
129
+ - `channel-edit` (rename thread/chat via `title`)
130
+ - `addParticipant` (add participant by `userId`)
131
+ - `member-info` (inspect participant/user info in a thread/chat)
132
+
133
+ These actions expect a numeric Inline chat id via `to`, `chatId`, or `channelId`.
134
+
94
135
  Multi-account:
95
136
 
96
137
  ```yaml
@@ -0,0 +1,3 @@
1
+ import { type ChannelMessageActionAdapter } from "openclaw/plugin-sdk";
2
+ export declare const inlineMessageActions: ChannelMessageActionAdapter;
3
+ //# sourceMappingURL=actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/inline/actions.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,2BAA2B,EAGjC,MAAM,qBAAqB,CAAA;AAuM5B,eAAO,MAAM,oBAAoB,EAAE,2BAsTlC,CAAA"}
@@ -0,0 +1,449 @@
1
+ import { jsonResult, readReactionParams, readNumberParam, readStringParam, } from "openclaw/plugin-sdk";
2
+ import { InlineSdkClient, Method } from "@inline-chat/realtime-sdk";
3
+ import { resolveInlineAccount, resolveInlineToken } from "./accounts.js";
4
+ import { normalizeInlineTarget } from "./normalize.js";
5
+ const ACTIONS = [
6
+ "react",
7
+ "reactions",
8
+ "read",
9
+ "search",
10
+ "edit",
11
+ "channel-info",
12
+ "channel-edit",
13
+ "addParticipant",
14
+ "member-info",
15
+ ];
16
+ function normalizeChatId(raw) {
17
+ const normalized = normalizeInlineTarget(raw) ?? raw.trim();
18
+ if (!/^[0-9]+$/.test(normalized)) {
19
+ throw new Error(`inline action: invalid chat target "${raw}" (expected numeric chat id)`);
20
+ }
21
+ return normalized;
22
+ }
23
+ function readFlexibleId(params, key) {
24
+ const direct = params[key];
25
+ if (typeof direct === "bigint")
26
+ return direct.toString();
27
+ if (typeof direct === "number") {
28
+ if (!Number.isFinite(direct) || !Number.isInteger(direct))
29
+ return undefined;
30
+ return String(direct);
31
+ }
32
+ if (typeof direct === "string") {
33
+ const trimmed = direct.trim();
34
+ return trimmed || undefined;
35
+ }
36
+ return undefined;
37
+ }
38
+ function parseInlineId(raw, label) {
39
+ if (typeof raw === "bigint")
40
+ return raw;
41
+ if (typeof raw === "number") {
42
+ if (!Number.isFinite(raw) || !Number.isInteger(raw)) {
43
+ throw new Error(`inline action: invalid ${label} "${String(raw)}"`);
44
+ }
45
+ return BigInt(raw);
46
+ }
47
+ if (typeof raw === "string") {
48
+ const trimmed = raw.trim();
49
+ if (!trimmed) {
50
+ throw new Error(`inline action: missing ${label}`);
51
+ }
52
+ if (!/^[0-9]+$/.test(trimmed)) {
53
+ throw new Error(`inline action: invalid ${label} "${raw}"`);
54
+ }
55
+ return BigInt(trimmed);
56
+ }
57
+ throw new Error(`inline action: missing ${label}`);
58
+ }
59
+ function parseOptionalInlineId(raw, label) {
60
+ if (raw == null)
61
+ return undefined;
62
+ return parseInlineId(raw, label);
63
+ }
64
+ function resolveChatIdFromParams(params) {
65
+ const raw = readFlexibleId(params, "chatId") ??
66
+ readFlexibleId(params, "channelId") ??
67
+ readFlexibleId(params, "to") ??
68
+ readStringParam(params, "to");
69
+ if (!raw) {
70
+ throw new Error("inline action requires chatId/channelId/to");
71
+ }
72
+ return BigInt(normalizeChatId(raw));
73
+ }
74
+ function buildChatPeer(chatId) {
75
+ return {
76
+ type: {
77
+ oneofKind: "chat",
78
+ chat: { chatId },
79
+ },
80
+ };
81
+ }
82
+ function mapMessage(message) {
83
+ const reactions = (message.reactions?.reactions ?? []).map((reaction) => ({
84
+ emoji: reaction.emoji ?? "",
85
+ userId: String(reaction.userId),
86
+ messageId: String(reaction.messageId),
87
+ chatId: String(reaction.chatId),
88
+ date: Number(reaction.date) * 1000,
89
+ }));
90
+ return {
91
+ id: String(message.id),
92
+ fromId: String(message.fromId),
93
+ date: Number(message.date) * 1000,
94
+ text: message.message ?? "",
95
+ out: Boolean(message.out),
96
+ replyToId: message.replyToMsgId != null ? String(message.replyToMsgId) : undefined,
97
+ reactions,
98
+ };
99
+ }
100
+ async function loadMessageReactions(params) {
101
+ const result = await params.client.invokeRaw(Method.GET_CHAT_HISTORY, {
102
+ oneofKind: "getChatHistory",
103
+ getChatHistory: {
104
+ peerId: buildChatPeer(params.chatId),
105
+ offsetId: params.messageId + 1n,
106
+ limit: 8,
107
+ },
108
+ });
109
+ if (result.oneofKind !== "getChatHistory") {
110
+ throw new Error(`inline action: expected getChatHistory result, got ${String(result.oneofKind)}`);
111
+ }
112
+ const target = (result.getChatHistory.messages ?? []).find((message) => message.id === params.messageId) ?? null;
113
+ if (!target) {
114
+ return [];
115
+ }
116
+ const byEmoji = new Map();
117
+ for (const reaction of target.reactions?.reactions ?? []) {
118
+ const emoji = reaction.emoji ?? "";
119
+ if (!emoji)
120
+ continue;
121
+ const existing = byEmoji.get(emoji);
122
+ if (existing) {
123
+ existing.count += 1;
124
+ existing.userIds.push(String(reaction.userId));
125
+ continue;
126
+ }
127
+ byEmoji.set(emoji, {
128
+ emoji,
129
+ count: 1,
130
+ userIds: [String(reaction.userId)],
131
+ });
132
+ }
133
+ return Array.from(byEmoji.values());
134
+ }
135
+ async function withInlineClient(params) {
136
+ const account = resolveInlineAccount({ cfg: params.cfg, accountId: params.accountId ?? null });
137
+ if (!account.configured || !account.baseUrl) {
138
+ throw new Error(`Inline not configured for account "${account.accountId}" (missing token or baseUrl)`);
139
+ }
140
+ const token = await resolveInlineToken(account);
141
+ const client = new InlineSdkClient({
142
+ baseUrl: account.baseUrl,
143
+ token,
144
+ });
145
+ await client.connect();
146
+ try {
147
+ return await params.fn(client);
148
+ }
149
+ finally {
150
+ await client.close().catch(() => { });
151
+ }
152
+ }
153
+ function toJsonSafe(value) {
154
+ if (typeof value === "bigint")
155
+ return value.toString();
156
+ if (Array.isArray(value))
157
+ return value.map((item) => toJsonSafe(item));
158
+ if (value && typeof value === "object") {
159
+ const out = {};
160
+ for (const [key, current] of Object.entries(value)) {
161
+ out[key] = toJsonSafe(current);
162
+ }
163
+ return out;
164
+ }
165
+ return value;
166
+ }
167
+ export const inlineMessageActions = {
168
+ listActions: ({ cfg }) => {
169
+ const account = resolveInlineAccount({ cfg, accountId: null });
170
+ if (!account.enabled || !account.configured)
171
+ return [];
172
+ return [...ACTIONS];
173
+ },
174
+ supportsAction: ({ action }) => ACTIONS.includes(action),
175
+ extractToolSend: ({ args }) => {
176
+ const action = typeof args.action === "string" ? args.action.trim() : "";
177
+ if (action !== "sendMessage")
178
+ return null;
179
+ const to = typeof args.to === "string" ? args.to.trim() : "";
180
+ if (!to)
181
+ return null;
182
+ const normalized = normalizeInlineTarget(to) ?? to;
183
+ if (!/^[0-9]+$/.test(normalized))
184
+ return null;
185
+ return { to: normalized };
186
+ },
187
+ handleAction: async ({ action, params, cfg, accountId }) => {
188
+ if (action === "react") {
189
+ return await withInlineClient({
190
+ cfg,
191
+ accountId,
192
+ fn: async (client) => {
193
+ const chatId = resolveChatIdFromParams(params);
194
+ const messageId = parseInlineId(readFlexibleId(params, "messageId") ?? readStringParam(params, "messageId", { required: true }), "messageId");
195
+ const { emoji, remove, isEmpty } = readReactionParams(params, {
196
+ removeErrorMessage: "Emoji is required to remove an Inline reaction.",
197
+ });
198
+ if (isEmpty) {
199
+ throw new Error("inline action: react requires emoji");
200
+ }
201
+ if (remove) {
202
+ const result = await client.invokeRaw(Method.DELETE_REACTION, {
203
+ oneofKind: "deleteReaction",
204
+ deleteReaction: {
205
+ emoji,
206
+ peerId: buildChatPeer(chatId),
207
+ messageId,
208
+ },
209
+ });
210
+ if (result.oneofKind !== "deleteReaction") {
211
+ throw new Error(`inline action: expected deleteReaction result, got ${String(result.oneofKind)}`);
212
+ }
213
+ }
214
+ else {
215
+ const result = await client.invokeRaw(Method.ADD_REACTION, {
216
+ oneofKind: "addReaction",
217
+ addReaction: {
218
+ emoji,
219
+ messageId,
220
+ peerId: buildChatPeer(chatId),
221
+ },
222
+ });
223
+ if (result.oneofKind !== "addReaction") {
224
+ throw new Error(`inline action: expected addReaction result, got ${String(result.oneofKind)}`);
225
+ }
226
+ }
227
+ return jsonResult({
228
+ ok: true,
229
+ chatId: String(chatId),
230
+ messageId: String(messageId),
231
+ emoji,
232
+ remove,
233
+ });
234
+ },
235
+ });
236
+ }
237
+ if (action === "reactions") {
238
+ return await withInlineClient({
239
+ cfg,
240
+ accountId,
241
+ fn: async (client) => {
242
+ const chatId = resolveChatIdFromParams(params);
243
+ const messageId = parseInlineId(readFlexibleId(params, "messageId") ?? readStringParam(params, "messageId", { required: true }), "messageId");
244
+ const reactions = await loadMessageReactions({
245
+ client,
246
+ chatId,
247
+ messageId,
248
+ });
249
+ return jsonResult({
250
+ ok: true,
251
+ chatId: String(chatId),
252
+ messageId: String(messageId),
253
+ reactions,
254
+ });
255
+ },
256
+ });
257
+ }
258
+ if (action === "read") {
259
+ return await withInlineClient({
260
+ cfg,
261
+ accountId,
262
+ fn: async (client) => {
263
+ const chatId = resolveChatIdFromParams(params);
264
+ const limit = Math.max(1, Math.min(100, readNumberParam(params, "limit", { integer: true }) ?? 20));
265
+ const offsetId = parseOptionalInlineId(readFlexibleId(params, "offsetId") ?? readFlexibleId(params, "before"), "offsetId");
266
+ const result = await client.invokeRaw(Method.GET_CHAT_HISTORY, {
267
+ oneofKind: "getChatHistory",
268
+ getChatHistory: {
269
+ peerId: buildChatPeer(chatId),
270
+ ...(offsetId != null ? { offsetId } : {}),
271
+ limit,
272
+ },
273
+ });
274
+ if (result.oneofKind !== "getChatHistory") {
275
+ throw new Error(`inline action: expected getChatHistory result, got ${String(result.oneofKind)}`);
276
+ }
277
+ return jsonResult(toJsonSafe({
278
+ ok: true,
279
+ chatId: String(chatId),
280
+ messages: (result.getChatHistory.messages ?? []).map((message) => mapMessage(message)),
281
+ }));
282
+ },
283
+ });
284
+ }
285
+ if (action === "search") {
286
+ return await withInlineClient({
287
+ cfg,
288
+ accountId,
289
+ fn: async (client) => {
290
+ const chatId = resolveChatIdFromParams(params);
291
+ const query = readStringParam(params, "query") ??
292
+ readStringParam(params, "q") ??
293
+ readStringParam(params, "message", { required: true });
294
+ const limit = Math.max(1, Math.min(100, readNumberParam(params, "limit", { integer: true }) ?? 20));
295
+ const offsetId = parseOptionalInlineId(readFlexibleId(params, "offsetId"), "offsetId");
296
+ const result = await client.invokeRaw(Method.SEARCH_MESSAGES, {
297
+ oneofKind: "searchMessages",
298
+ searchMessages: {
299
+ peerId: buildChatPeer(chatId),
300
+ queries: [query],
301
+ limit,
302
+ ...(offsetId != null ? { offsetId } : {}),
303
+ },
304
+ });
305
+ if (result.oneofKind !== "searchMessages") {
306
+ throw new Error(`inline action: expected searchMessages result, got ${String(result.oneofKind)}`);
307
+ }
308
+ return jsonResult(toJsonSafe({
309
+ ok: true,
310
+ chatId: String(chatId),
311
+ query,
312
+ messages: (result.searchMessages.messages ?? []).map((message) => mapMessage(message)),
313
+ }));
314
+ },
315
+ });
316
+ }
317
+ if (action === "edit") {
318
+ return await withInlineClient({
319
+ cfg,
320
+ accountId,
321
+ fn: async (client) => {
322
+ const chatId = resolveChatIdFromParams(params);
323
+ const messageId = parseInlineId(readFlexibleId(params, "messageId") ?? readStringParam(params, "messageId", { required: true }), "messageId");
324
+ const text = readStringParam(params, "message", { required: true, allowEmpty: true });
325
+ const result = await client.invokeRaw(Method.EDIT_MESSAGE, {
326
+ oneofKind: "editMessage",
327
+ editMessage: {
328
+ messageId,
329
+ peerId: buildChatPeer(chatId),
330
+ text,
331
+ },
332
+ });
333
+ if (result.oneofKind !== "editMessage") {
334
+ throw new Error(`inline action: expected editMessage result, got ${String(result.oneofKind)}`);
335
+ }
336
+ return jsonResult(toJsonSafe({ ok: true, chatId: String(chatId), messageId: String(messageId), text }));
337
+ },
338
+ });
339
+ }
340
+ if (action === "channel-info") {
341
+ return await withInlineClient({
342
+ cfg,
343
+ accountId,
344
+ fn: async (client) => {
345
+ const chatId = resolveChatIdFromParams(params);
346
+ const result = await client.invokeRaw(Method.GET_CHAT, {
347
+ oneofKind: "getChat",
348
+ getChat: { peerId: buildChatPeer(chatId) },
349
+ });
350
+ if (result.oneofKind !== "getChat") {
351
+ throw new Error(`inline action: expected getChat result, got ${String(result.oneofKind)}`);
352
+ }
353
+ return jsonResult(toJsonSafe({
354
+ ok: true,
355
+ chatId: String(chatId),
356
+ chat: result.getChat.chat ?? null,
357
+ dialog: result.getChat.dialog ?? null,
358
+ pinnedMessageIds: (result.getChat.pinnedMessageIds ?? []).map((id) => String(id)),
359
+ }));
360
+ },
361
+ });
362
+ }
363
+ if (action === "channel-edit") {
364
+ return await withInlineClient({
365
+ cfg,
366
+ accountId,
367
+ fn: async (client) => {
368
+ const chatId = resolveChatIdFromParams(params);
369
+ const title = readStringParam(params, "title") ??
370
+ readStringParam(params, "name") ??
371
+ readStringParam(params, "message", { required: true });
372
+ const result = await client.invokeRaw(Method.UPDATE_CHAT_INFO, {
373
+ oneofKind: "updateChatInfo",
374
+ updateChatInfo: {
375
+ chatId,
376
+ title,
377
+ },
378
+ });
379
+ if (result.oneofKind !== "updateChatInfo") {
380
+ throw new Error(`inline action: expected updateChatInfo result, got ${String(result.oneofKind)}`);
381
+ }
382
+ return jsonResult(toJsonSafe({
383
+ ok: true,
384
+ chatId: String(chatId),
385
+ title,
386
+ chat: result.updateChatInfo.chat ?? null,
387
+ }));
388
+ },
389
+ });
390
+ }
391
+ if (action === "addParticipant") {
392
+ return await withInlineClient({
393
+ cfg,
394
+ accountId,
395
+ fn: async (client) => {
396
+ const chatId = resolveChatIdFromParams(params);
397
+ const userId = parseInlineId(readFlexibleId(params, "userId") ??
398
+ readFlexibleId(params, "participant") ??
399
+ readFlexibleId(params, "memberId") ??
400
+ readStringParam(params, "userId", { required: true }), "userId");
401
+ const result = await client.invokeRaw(Method.ADD_CHAT_PARTICIPANT, {
402
+ oneofKind: "addChatParticipant",
403
+ addChatParticipant: {
404
+ chatId,
405
+ userId,
406
+ },
407
+ });
408
+ if (result.oneofKind !== "addChatParticipant") {
409
+ throw new Error(`inline action: expected addChatParticipant result, got ${String(result.oneofKind)}`);
410
+ }
411
+ return jsonResult(toJsonSafe({
412
+ ok: true,
413
+ chatId: String(chatId),
414
+ userId: String(userId),
415
+ participant: result.addChatParticipant.participant ?? null,
416
+ }));
417
+ },
418
+ });
419
+ }
420
+ if (action === "member-info") {
421
+ return await withInlineClient({
422
+ cfg,
423
+ accountId,
424
+ fn: async (client) => {
425
+ const chatId = resolveChatIdFromParams(params);
426
+ const userId = parseInlineId(readFlexibleId(params, "userId") ?? readStringParam(params, "userId", { required: true }), "userId");
427
+ const result = await client.invokeRaw(Method.GET_CHAT_PARTICIPANTS, {
428
+ oneofKind: "getChatParticipants",
429
+ getChatParticipants: { chatId },
430
+ });
431
+ if (result.oneofKind !== "getChatParticipants") {
432
+ throw new Error(`inline action: expected getChatParticipants result, got ${String(result.oneofKind)}`);
433
+ }
434
+ const user = (result.getChatParticipants.users ?? []).find((candidate) => candidate.id === userId) ?? null;
435
+ const participant = (result.getChatParticipants.participants ?? []).find((candidate) => candidate.userId === userId) ?? null;
436
+ return jsonResult(toJsonSafe({
437
+ ok: true,
438
+ chatId: String(chatId),
439
+ userId: String(userId),
440
+ user,
441
+ participant,
442
+ }));
443
+ },
444
+ });
445
+ }
446
+ throw new Error(`Action ${action} is not supported for provider inline.`);
447
+ },
448
+ };
449
+ //# sourceMappingURL=actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/inline/actions.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../src/inline/channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,aAAa,EAEnB,MAAM,qBAAqB,CAAA;AAG5B,OAAO,EAKL,KAAK,qBAAqB,EAC3B,MAAM,eAAe,CAAA;AAgItB,eAAO,MAAM,mBAAmB,EAAE,aAAa,CAAC,qBAAqB,CAgMpE,CAAA"}
1
+ {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../src/inline/channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,aAAa,EAEnB,MAAM,qBAAqB,CAAA;AAG5B,OAAO,EAKL,KAAK,qBAAqB,EAC3B,MAAM,eAAe,CAAA;AAkItB,eAAO,MAAM,mBAAmB,EAAE,aAAa,CAAC,qBAAqB,CA6NpE,CAAA"}
@@ -4,6 +4,8 @@ import { InlineConfigSchema } from "./config-schema.js";
4
4
  import { listInlineAccountIds, resolveDefaultInlineAccountId, resolveInlineAccount, resolveInlineToken, } from "./accounts.js";
5
5
  import { looksLikeInlineTargetId, normalizeInlineTarget } from "./normalize.js";
6
6
  import { monitorInlineProvider } from "./monitor.js";
7
+ import { resolveInlineGroupRequireMention, resolveInlineGroupToolPolicy } from "./policy.js";
8
+ import { inlineMessageActions } from "./actions.js";
7
9
  import { getInlineRuntime } from "../runtime.js";
8
10
  const activeMonitors = new Map();
9
11
  const meta = {
@@ -118,11 +120,16 @@ export const inlineChannelPlugin = {
118
120
  capabilities: {
119
121
  chatTypes: ["direct", "group"],
120
122
  media: false,
121
- reactions: false,
123
+ reactions: true,
124
+ edit: true,
125
+ groupManagement: true,
122
126
  threads: false,
123
127
  nativeCommands: false,
124
128
  blockStreaming: true,
125
129
  },
130
+ streaming: {
131
+ blockStreamingCoalesceDefaults: { minChars: 1500, idleMs: 1000 },
132
+ },
126
133
  reload: { configPrefixes: ["channels.inline"] },
127
134
  configSchema: buildChannelConfigSchema(InlineConfigSchema),
128
135
  config: {
@@ -168,6 +175,26 @@ export const inlineChannelPlugin = {
168
175
  };
169
176
  },
170
177
  },
178
+ groups: {
179
+ resolveRequireMention: ({ cfg, accountId, groupId }) => {
180
+ const resolved = resolveInlineAccount({ cfg, accountId: accountId ?? null });
181
+ return resolveInlineGroupRequireMention({
182
+ cfg,
183
+ groupId,
184
+ accountId,
185
+ requireMentionDefault: resolved.config.requireMention ?? true,
186
+ });
187
+ },
188
+ resolveToolPolicy: ({ cfg, accountId, groupId, senderId, senderName, senderUsername, senderE164 }) => resolveInlineGroupToolPolicy({
189
+ cfg,
190
+ groupId,
191
+ accountId,
192
+ senderId,
193
+ senderName,
194
+ senderUsername,
195
+ senderE164,
196
+ }),
197
+ },
171
198
  messaging: {
172
199
  normalizeTarget: normalizeInlineTarget,
173
200
  targetResolver: {
@@ -175,6 +202,7 @@ export const inlineChannelPlugin = {
175
202
  hint: "<chatId>",
176
203
  },
177
204
  },
205
+ actions: inlineMessageActions,
178
206
  outbound: {
179
207
  deliveryMode: "direct",
180
208
  chunker: (text, limit) => getInlineRuntime().channel.text.chunkMarkdownText(text, limit),