agent-messenger 2.28.0 → 2.29.0

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.
Files changed (157) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/README.md +18 -1
  3. package/dist/package.json +1 -1
  4. package/dist/src/platforms/discord/client.d.ts +6 -2
  5. package/dist/src/platforms/discord/client.d.ts.map +1 -1
  6. package/dist/src/platforms/discord/client.js +10 -3
  7. package/dist/src/platforms/discord/client.js.map +1 -1
  8. package/dist/src/platforms/instagram/client.d.ts +24 -2
  9. package/dist/src/platforms/instagram/client.d.ts.map +1 -1
  10. package/dist/src/platforms/instagram/client.js +343 -53
  11. package/dist/src/platforms/instagram/client.js.map +1 -1
  12. package/dist/src/platforms/instagram/commands/auth.d.ts +1 -0
  13. package/dist/src/platforms/instagram/commands/auth.d.ts.map +1 -1
  14. package/dist/src/platforms/instagram/commands/auth.js +123 -11
  15. package/dist/src/platforms/instagram/commands/auth.js.map +1 -1
  16. package/dist/src/platforms/instagram/credential-manager.d.ts +4 -1
  17. package/dist/src/platforms/instagram/credential-manager.d.ts.map +1 -1
  18. package/dist/src/platforms/instagram/credential-manager.js +17 -1
  19. package/dist/src/platforms/instagram/credential-manager.js.map +1 -1
  20. package/dist/src/platforms/instagram/types.d.ts +10 -8
  21. package/dist/src/platforms/instagram/types.d.ts.map +1 -1
  22. package/dist/src/platforms/instagram/types.js.map +1 -1
  23. package/dist/src/platforms/teams/app-config.d.ts +36 -0
  24. package/dist/src/platforms/teams/app-config.d.ts.map +1 -0
  25. package/dist/src/platforms/teams/app-config.js +69 -0
  26. package/dist/src/platforms/teams/app-config.js.map +1 -0
  27. package/dist/src/platforms/teams/client.d.ts +19 -2
  28. package/dist/src/platforms/teams/client.d.ts.map +1 -1
  29. package/dist/src/platforms/teams/client.js +295 -7
  30. package/dist/src/platforms/teams/client.js.map +1 -1
  31. package/dist/src/platforms/teams/commands/auth.d.ts +10 -0
  32. package/dist/src/platforms/teams/commands/auth.d.ts.map +1 -1
  33. package/dist/src/platforms/teams/commands/auth.js +137 -3
  34. package/dist/src/platforms/teams/commands/auth.js.map +1 -1
  35. package/dist/src/platforms/teams/commands/file.d.ts +3 -0
  36. package/dist/src/platforms/teams/commands/file.d.ts.map +1 -1
  37. package/dist/src/platforms/teams/commands/file.js +59 -2
  38. package/dist/src/platforms/teams/commands/file.js.map +1 -1
  39. package/dist/src/platforms/teams/commands/message.d.ts +11 -0
  40. package/dist/src/platforms/teams/commands/message.d.ts.map +1 -1
  41. package/dist/src/platforms/teams/commands/message.js +121 -2
  42. package/dist/src/platforms/teams/commands/message.js.map +1 -1
  43. package/dist/src/platforms/teams/credential-manager.d.ts +23 -1
  44. package/dist/src/platforms/teams/credential-manager.d.ts.map +1 -1
  45. package/dist/src/platforms/teams/credential-manager.js +46 -2
  46. package/dist/src/platforms/teams/credential-manager.js.map +1 -1
  47. package/dist/src/platforms/teams/device-code.d.ts +48 -0
  48. package/dist/src/platforms/teams/device-code.d.ts.map +1 -0
  49. package/dist/src/platforms/teams/device-code.js +199 -0
  50. package/dist/src/platforms/teams/device-code.js.map +1 -0
  51. package/dist/src/platforms/teams/device-login.d.ts +37 -0
  52. package/dist/src/platforms/teams/device-login.d.ts.map +1 -0
  53. package/dist/src/platforms/teams/device-login.js +129 -0
  54. package/dist/src/platforms/teams/device-login.js.map +1 -0
  55. package/dist/src/platforms/teams/ensure-auth.d.ts.map +1 -1
  56. package/dist/src/platforms/teams/ensure-auth.js +12 -0
  57. package/dist/src/platforms/teams/ensure-auth.js.map +1 -1
  58. package/dist/src/platforms/teams/index.d.ts +7 -3
  59. package/dist/src/platforms/teams/index.d.ts.map +1 -1
  60. package/dist/src/platforms/teams/index.js +5 -2
  61. package/dist/src/platforms/teams/index.js.map +1 -1
  62. package/dist/src/platforms/teams/listener.d.ts +35 -0
  63. package/dist/src/platforms/teams/listener.d.ts.map +1 -0
  64. package/dist/src/platforms/teams/listener.js +236 -0
  65. package/dist/src/platforms/teams/listener.js.map +1 -0
  66. package/dist/src/platforms/teams/realm-discovery.d.ts +3 -0
  67. package/dist/src/platforms/teams/realm-discovery.d.ts.map +1 -0
  68. package/dist/src/platforms/teams/realm-discovery.js +33 -0
  69. package/dist/src/platforms/teams/realm-discovery.js.map +1 -0
  70. package/dist/src/platforms/teams/token-extractor.d.ts +3 -0
  71. package/dist/src/platforms/teams/token-extractor.d.ts.map +1 -1
  72. package/dist/src/platforms/teams/token-extractor.js +60 -0
  73. package/dist/src/platforms/teams/token-extractor.js.map +1 -1
  74. package/dist/src/platforms/teams/token-provider.d.ts +25 -0
  75. package/dist/src/platforms/teams/token-provider.d.ts.map +1 -0
  76. package/dist/src/platforms/teams/token-provider.js +190 -0
  77. package/dist/src/platforms/teams/token-provider.js.map +1 -0
  78. package/dist/src/platforms/teams/trouter.d.ts +31 -0
  79. package/dist/src/platforms/teams/trouter.d.ts.map +1 -0
  80. package/dist/src/platforms/teams/trouter.js +181 -0
  81. package/dist/src/platforms/teams/trouter.js.map +1 -0
  82. package/dist/src/platforms/teams/types.d.ts +94 -0
  83. package/dist/src/platforms/teams/types.d.ts.map +1 -1
  84. package/dist/src/platforms/teams/types.js +30 -0
  85. package/dist/src/platforms/teams/types.js.map +1 -1
  86. package/dist/src/platforms/webex/types.d.ts +1 -1
  87. package/dist/src/tui/adapters/instagram-adapter.d.ts.map +1 -1
  88. package/dist/src/tui/adapters/instagram-adapter.js +16 -0
  89. package/dist/src/tui/adapters/instagram-adapter.js.map +1 -1
  90. package/dist/src/tui/adapters/teams-adapter.d.ts +3 -0
  91. package/dist/src/tui/adapters/teams-adapter.d.ts.map +1 -1
  92. package/dist/src/tui/adapters/teams-adapter.js +21 -0
  93. package/dist/src/tui/adapters/teams-adapter.js.map +1 -1
  94. package/dist/src/tui/app.js +3 -3
  95. package/docs/content/docs/cli/instagram.mdx +1 -0
  96. package/docs/content/docs/cli/teams.mdx +22 -0
  97. package/package.json +1 -1
  98. package/skills/agent-channeltalk/SKILL.md +1 -1
  99. package/skills/agent-channeltalkbot/SKILL.md +1 -1
  100. package/skills/agent-discord/SKILL.md +1 -1
  101. package/skills/agent-discordbot/SKILL.md +1 -1
  102. package/skills/agent-imessage/SKILL.md +1 -1
  103. package/skills/agent-instagram/SKILL.md +1 -1
  104. package/skills/agent-instagram/references/authentication.md +11 -0
  105. package/skills/agent-kakaotalk/SKILL.md +1 -1
  106. package/skills/agent-line/SKILL.md +1 -1
  107. package/skills/agent-slack/SKILL.md +1 -1
  108. package/skills/agent-slackbot/SKILL.md +1 -1
  109. package/skills/agent-teams/SKILL.md +59 -6
  110. package/skills/agent-teams/references/authentication.md +31 -1
  111. package/skills/agent-telegram/SKILL.md +1 -1
  112. package/skills/agent-telegrambot/SKILL.md +1 -1
  113. package/skills/agent-webex/SKILL.md +1 -1
  114. package/skills/agent-webexbot/SKILL.md +1 -1
  115. package/skills/agent-wechatbot/SKILL.md +1 -1
  116. package/skills/agent-whatsapp/SKILL.md +1 -1
  117. package/skills/agent-whatsappbot/SKILL.md +1 -1
  118. package/src/platforms/discord/client.test.ts +86 -0
  119. package/src/platforms/discord/client.ts +10 -3
  120. package/src/platforms/instagram/client.test.ts +478 -33
  121. package/src/platforms/instagram/client.ts +449 -68
  122. package/src/platforms/instagram/commands/auth.test.ts +177 -1
  123. package/src/platforms/instagram/commands/auth.ts +182 -11
  124. package/src/platforms/instagram/credential-manager.test.ts +30 -0
  125. package/src/platforms/instagram/credential-manager.ts +23 -1
  126. package/src/platforms/instagram/types.ts +11 -8
  127. package/src/platforms/teams/app-config.ts +92 -0
  128. package/src/platforms/teams/client.test.ts +335 -1
  129. package/src/platforms/teams/client.ts +342 -7
  130. package/src/platforms/teams/commands/auth.test.ts +93 -1
  131. package/src/platforms/teams/commands/auth.ts +182 -3
  132. package/src/platforms/teams/commands/file.test.ts +92 -1
  133. package/src/platforms/teams/commands/file.ts +76 -1
  134. package/src/platforms/teams/commands/message.test.ts +95 -1
  135. package/src/platforms/teams/commands/message.ts +145 -3
  136. package/src/platforms/teams/credential-manager.test.ts +20 -0
  137. package/src/platforms/teams/credential-manager.ts +68 -3
  138. package/src/platforms/teams/device-code.test.ts +311 -0
  139. package/src/platforms/teams/device-code.ts +277 -0
  140. package/src/platforms/teams/device-login.test.ts +288 -0
  141. package/src/platforms/teams/device-login.ts +206 -0
  142. package/src/platforms/teams/ensure-auth.ts +11 -0
  143. package/src/platforms/teams/index.test.ts +10 -0
  144. package/src/platforms/teams/index.ts +16 -1
  145. package/src/platforms/teams/listener.ts +295 -0
  146. package/src/platforms/teams/realm-discovery.test.ts +73 -0
  147. package/src/platforms/teams/realm-discovery.ts +42 -0
  148. package/src/platforms/teams/token-extractor.ts +69 -0
  149. package/src/platforms/teams/token-provider.test.ts +227 -0
  150. package/src/platforms/teams/token-provider.ts +284 -0
  151. package/src/platforms/teams/trouter.test.ts +114 -0
  152. package/src/platforms/teams/trouter.ts +228 -0
  153. package/src/platforms/teams/types.test.ts +17 -0
  154. package/src/platforms/teams/types.ts +86 -0
  155. package/src/tui/adapters/instagram-adapter.ts +13 -0
  156. package/src/tui/adapters/teams-adapter.ts +23 -0
  157. package/src/tui/app.ts +3 -3
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-webexbot
3
3
  description: Interact with Cisco Webex using bot tokens - send messages, reply in threads, upload and download files, look up people, read spaces, manage memberships, stream real-time events
4
- version: 2.28.0
4
+ version: 2.29.0
5
5
  allowed-tools: Bash(agent-webexbot:*)
6
6
  metadata:
7
7
  openclaw:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-wechatbot
3
3
  description: Interact with WeChat Official Account using API credentials - send messages, manage templates, list followers
4
- version: 2.28.0
4
+ version: 2.29.0
5
5
  allowed-tools: Bash(agent-wechatbot:*)
6
6
  metadata:
7
7
  openclaw:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-whatsapp
3
3
  description: Interact with WhatsApp - send messages, read chats, manage conversations
4
- version: 2.28.0
4
+ version: 2.29.0
5
5
  allowed-tools: Bash(agent-whatsapp:*)
6
6
  metadata:
7
7
  openclaw:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-whatsappbot
3
3
  description: Interact with WhatsApp using Cloud API credentials - send messages, manage templates
4
- version: 2.28.0
4
+ version: 2.29.0
5
5
  allowed-tools: Bash(agent-whatsappbot:*)
6
6
  metadata:
7
7
  openclaw:
@@ -164,6 +164,38 @@ describe('DiscordClient', () => {
164
164
  expect(fetchCalls[0].options?.method).toBe('POST')
165
165
  expect(fetchCalls[0].options?.body).toBe(JSON.stringify({ content: 'Hello world' }))
166
166
  })
167
+
168
+ it('includes message_reference when reply_to is provided', async () => {
169
+ mockResponse({
170
+ id: 'msg1',
171
+ channel_id: 'ch1',
172
+ author: { id: '123', username: 'bot' },
173
+ content: 'Reply text',
174
+ timestamp: '2024-01-01T00:00:00.000Z',
175
+ })
176
+
177
+ const client = await new DiscordClient().login({ token: 'test-token' })
178
+ await client.sendMessage('ch1', 'Reply text', { reply_to: 'parent123' })
179
+
180
+ expect(fetchCalls[0].options?.body).toBe(
181
+ JSON.stringify({ content: 'Reply text', message_reference: { message_id: 'parent123' } }),
182
+ )
183
+ })
184
+
185
+ it('omits message_reference when reply_to is not provided', async () => {
186
+ mockResponse({
187
+ id: 'msg1',
188
+ channel_id: 'ch1',
189
+ author: { id: '123', username: 'bot' },
190
+ content: 'Hello world',
191
+ timestamp: '2024-01-01T00:00:00.000Z',
192
+ })
193
+
194
+ const client = await new DiscordClient().login({ token: 'test-token' })
195
+ await client.sendMessage('ch1', 'Hello world')
196
+
197
+ expect(fetchCalls[0].options?.body).toBe(JSON.stringify({ content: 'Hello world' }))
198
+ })
167
199
  })
168
200
 
169
201
  describe('getMessages', () => {
@@ -308,6 +340,60 @@ describe('DiscordClient', () => {
308
340
  expect(fetchCalls[0].url).toBe('https://discord.com/api/v10/channels/ch1/messages')
309
341
  expect(fetchCalls[0].options?.method).toBe('POST')
310
342
  })
343
+
344
+ it('includes payload_json with message_reference when reply_to is provided', async () => {
345
+ const tempFile = '/tmp/test-upload-reply.txt'
346
+ await Bun.write(tempFile, 'test content')
347
+
348
+ mockResponse({
349
+ id: 'msg1',
350
+ channel_id: 'ch1',
351
+ author: { id: '123', username: 'bot' },
352
+ content: '',
353
+ timestamp: '2024-01-01T00:00:00.000Z',
354
+ attachments: [
355
+ {
356
+ id: 'att1',
357
+ filename: 'test-upload-reply.txt',
358
+ size: 12,
359
+ url: 'https://cdn.discord.com/attachments/ch1/att1/test-upload-reply.txt',
360
+ },
361
+ ],
362
+ })
363
+
364
+ const client = await new DiscordClient().login({ token: 'test-token' })
365
+ await client.uploadFile('ch1', tempFile, { reply_to: 'parent123' })
366
+
367
+ const formData = fetchCalls[0].options?.body as FormData
368
+ expect(formData.get('payload_json')).toBe(JSON.stringify({ message_reference: { message_id: 'parent123' } }))
369
+ })
370
+
371
+ it('omits payload_json when reply_to is not provided', async () => {
372
+ const tempFile = '/tmp/test-upload-no-reply.txt'
373
+ await Bun.write(tempFile, 'test content')
374
+
375
+ mockResponse({
376
+ id: 'msg1',
377
+ channel_id: 'ch1',
378
+ author: { id: '123', username: 'bot' },
379
+ content: '',
380
+ timestamp: '2024-01-01T00:00:00.000Z',
381
+ attachments: [
382
+ {
383
+ id: 'att1',
384
+ filename: 'test-upload-no-reply.txt',
385
+ size: 12,
386
+ url: 'https://cdn.discord.com/attachments/ch1/att1/test-upload-no-reply.txt',
387
+ },
388
+ ],
389
+ })
390
+
391
+ const client = await new DiscordClient().login({ token: 'test-token' })
392
+ await client.uploadFile('ch1', tempFile)
393
+
394
+ const formData = fetchCalls[0].options?.body as FormData
395
+ expect(formData.get('payload_json')).toBeNull()
396
+ })
311
397
  })
312
398
 
313
399
  describe('listFiles', () => {
@@ -226,8 +226,12 @@ export class DiscordClient {
226
226
  return this.request<DiscordChannel>('GET', `/channels/${channelId}`)
227
227
  }
228
228
 
229
- async sendMessage(channelId: string, content: string): Promise<DiscordMessage> {
230
- return this.request<DiscordMessage>('POST', `/channels/${channelId}/messages`, { content })
229
+ async sendMessage(channelId: string, content: string, options?: { reply_to?: string }): Promise<DiscordMessage> {
230
+ const body: Record<string, unknown> = { content }
231
+ if (options?.reply_to) {
232
+ body.message_reference = { message_id: options.reply_to }
233
+ }
234
+ return this.request<DiscordMessage>('POST', `/channels/${channelId}/messages`, body)
231
235
  }
232
236
 
233
237
  async getMessages(channelId: string, limit: number = 50): Promise<DiscordMessage[]> {
@@ -270,11 +274,14 @@ export class DiscordClient {
270
274
  return this.request<DiscordUser>('GET', `/users/${userId}`)
271
275
  }
272
276
 
273
- async uploadFile(channelId: string, filePath: string): Promise<DiscordFile> {
277
+ async uploadFile(channelId: string, filePath: string, options?: { reply_to?: string }): Promise<DiscordFile> {
274
278
  const fileBuffer = await readFile(filePath)
275
279
  const filename = filePath.split('/').pop() || 'file'
276
280
 
277
281
  const formData = new FormData()
282
+ if (options?.reply_to) {
283
+ formData.append('payload_json', JSON.stringify({ message_reference: { message_id: options.reply_to } }))
284
+ }
278
285
  formData.append('files[0]', new Blob([fileBuffer]), filename)
279
286
 
280
287
  interface MessageWithAttachments extends DiscordMessage {