agent-messenger 2.10.0 → 2.10.2

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 (239) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/dist/package.json +1 -1
  3. package/dist/src/platforms/teams/token-extractor.d.ts.map +1 -1
  4. package/dist/src/platforms/teams/token-extractor.js +15 -2
  5. package/dist/src/platforms/teams/token-extractor.js.map +1 -1
  6. package/dist/src/shared/chromium/decryptor.d.ts +6 -0
  7. package/dist/src/shared/chromium/decryptor.d.ts.map +1 -1
  8. package/dist/src/shared/chromium/decryptor.js +26 -6
  9. package/dist/src/shared/chromium/decryptor.js.map +1 -1
  10. package/e2e/channeltalk.e2e.test.ts +13 -13
  11. package/e2e/channeltalkbot.e2e.test.ts +13 -13
  12. package/e2e/discord.e2e.test.ts +24 -24
  13. package/e2e/discordbot.e2e.test.ts +16 -16
  14. package/e2e/instagram.e2e.test.ts +10 -10
  15. package/e2e/kakaotalk.e2e.test.ts +7 -7
  16. package/e2e/line.e2e.test.ts +8 -8
  17. package/e2e/slack.e2e.test.ts +34 -34
  18. package/e2e/slackbot.e2e.test.ts +14 -14
  19. package/e2e/teams.e2e.test.ts +23 -23
  20. package/e2e/telegram.e2e.test.ts +8 -8
  21. package/e2e/webex.e2e.test.ts +14 -14
  22. package/e2e/whatsapp.e2e.test.ts +8 -8
  23. package/e2e/whatsappbot.e2e.test.ts +6 -6
  24. package/package.json +1 -1
  25. package/skills/agent-channeltalk/SKILL.md +1 -1
  26. package/skills/agent-channeltalkbot/SKILL.md +1 -1
  27. package/skills/agent-discord/SKILL.md +1 -1
  28. package/skills/agent-discordbot/SKILL.md +1 -1
  29. package/skills/agent-instagram/SKILL.md +1 -1
  30. package/skills/agent-kakaotalk/SKILL.md +1 -1
  31. package/skills/agent-line/SKILL.md +1 -1
  32. package/skills/agent-slack/SKILL.md +1 -1
  33. package/skills/agent-slackbot/SKILL.md +1 -1
  34. package/skills/agent-teams/SKILL.md +1 -1
  35. package/skills/agent-telegram/SKILL.md +1 -1
  36. package/skills/agent-webex/SKILL.md +1 -1
  37. package/skills/agent-wechatbot/SKILL.md +1 -1
  38. package/skills/agent-whatsapp/SKILL.md +1 -1
  39. package/skills/agent-whatsappbot/SKILL.md +1 -1
  40. package/src/platforms/channeltalk/client.test.ts +26 -26
  41. package/src/platforms/channeltalk/commands/auth.test.ts +16 -16
  42. package/src/platforms/channeltalk/commands/bot.test.ts +2 -2
  43. package/src/platforms/channeltalk/commands/chat.test.ts +3 -3
  44. package/src/platforms/channeltalk/commands/group.test.ts +4 -4
  45. package/src/platforms/channeltalk/commands/manager.test.ts +2 -2
  46. package/src/platforms/channeltalk/commands/message.test.ts +17 -17
  47. package/src/platforms/channeltalk/commands/snapshot.test.ts +7 -7
  48. package/src/platforms/channeltalk/commands/whoami.test.ts +3 -3
  49. package/src/platforms/channeltalk/credential-manager.test.ts +18 -18
  50. package/src/platforms/channeltalk/ensure-auth.test.ts +5 -5
  51. package/src/platforms/channeltalk/index.test.ts +23 -23
  52. package/src/platforms/channeltalk/token-extractor.test.ts +21 -21
  53. package/src/platforms/channeltalk/types.test.ts +12 -12
  54. package/src/platforms/channeltalkbot/client.test.ts +14 -14
  55. package/src/platforms/channeltalkbot/commands/auth.test.ts +16 -16
  56. package/src/platforms/channeltalkbot/commands/bot.test.ts +6 -6
  57. package/src/platforms/channeltalkbot/commands/chat.test.ts +9 -9
  58. package/src/platforms/channeltalkbot/commands/group.test.ts +6 -6
  59. package/src/platforms/channeltalkbot/commands/manager.test.ts +3 -3
  60. package/src/platforms/channeltalkbot/commands/message.test.ts +10 -10
  61. package/src/platforms/channeltalkbot/commands/snapshot.test.ts +7 -7
  62. package/src/platforms/channeltalkbot/commands/whoami.test.ts +4 -4
  63. package/src/platforms/channeltalkbot/credential-manager.test.ts +27 -27
  64. package/src/platforms/channeltalkbot/index.test.ts +15 -15
  65. package/src/platforms/discord/client.test.ts +28 -28
  66. package/src/platforms/discord/commands/auth.test.ts +7 -7
  67. package/src/platforms/discord/commands/channel.test.ts +7 -7
  68. package/src/platforms/discord/commands/dm.test.ts +4 -4
  69. package/src/platforms/discord/commands/file.test.ts +4 -4
  70. package/src/platforms/discord/commands/friend.test.ts +6 -6
  71. package/src/platforms/discord/commands/member.test.ts +5 -5
  72. package/src/platforms/discord/commands/mention.test.ts +5 -5
  73. package/src/platforms/discord/commands/message.test.ts +9 -9
  74. package/src/platforms/discord/commands/note.test.ts +6 -6
  75. package/src/platforms/discord/commands/profile.test.ts +4 -4
  76. package/src/platforms/discord/commands/reaction.test.ts +5 -5
  77. package/src/platforms/discord/commands/server.test.ts +7 -7
  78. package/src/platforms/discord/commands/snapshot.test.ts +6 -6
  79. package/src/platforms/discord/commands/thread.test.ts +6 -6
  80. package/src/platforms/discord/commands/user.test.ts +5 -5
  81. package/src/platforms/discord/commands/whoami.test.ts +6 -6
  82. package/src/platforms/discord/credential-manager.test.ts +16 -16
  83. package/src/platforms/discord/ensure-auth.test.ts +8 -8
  84. package/src/platforms/discord/index.test.ts +17 -17
  85. package/src/platforms/discord/listener.test.ts +33 -33
  86. package/src/platforms/discord/token-extractor.test.ts +53 -53
  87. package/src/platforms/discord/types.test.ts +26 -26
  88. package/src/platforms/discordbot/client.test.ts +31 -31
  89. package/src/platforms/discordbot/commands/auth.test.ts +18 -18
  90. package/src/platforms/discordbot/commands/channel.test.ts +11 -11
  91. package/src/platforms/discordbot/commands/file.test.ts +7 -7
  92. package/src/platforms/discordbot/commands/message.test.ts +25 -25
  93. package/src/platforms/discordbot/commands/reaction.test.ts +6 -6
  94. package/src/platforms/discordbot/commands/server.test.ts +12 -12
  95. package/src/platforms/discordbot/commands/snapshot.test.ts +13 -13
  96. package/src/platforms/discordbot/commands/thread.test.ts +10 -10
  97. package/src/platforms/discordbot/commands/user.test.ts +9 -9
  98. package/src/platforms/discordbot/commands/whoami.test.ts +4 -4
  99. package/src/platforms/discordbot/credential-manager.test.ts +28 -28
  100. package/src/platforms/instagram/client.test.ts +18 -18
  101. package/src/platforms/instagram/commands/auth.test.ts +11 -11
  102. package/src/platforms/instagram/commands/chat.test.ts +6 -6
  103. package/src/platforms/instagram/commands/message.test.ts +11 -11
  104. package/src/platforms/instagram/commands/shared.test.ts +12 -12
  105. package/src/platforms/instagram/commands/whoami.test.ts +3 -3
  106. package/src/platforms/instagram/credential-manager.test.ts +21 -21
  107. package/src/platforms/instagram/ensure-auth.test.ts +4 -4
  108. package/src/platforms/instagram/index.test.ts +9 -9
  109. package/src/platforms/instagram/listener.test.ts +8 -8
  110. package/src/platforms/instagram/token-extractor.test.ts +35 -35
  111. package/src/platforms/kakaotalk/client.test.ts +33 -33
  112. package/src/platforms/kakaotalk/commands/auth.test.ts +11 -11
  113. package/src/platforms/kakaotalk/commands/chat.test.ts +6 -6
  114. package/src/platforms/kakaotalk/commands/message.test.ts +7 -7
  115. package/src/platforms/kakaotalk/commands/whoami.test.ts +5 -5
  116. package/src/platforms/kakaotalk/credential-manager.test.ts +15 -15
  117. package/src/platforms/kakaotalk/index.test.ts +15 -15
  118. package/src/platforms/kakaotalk/listener.test.ts +17 -17
  119. package/src/platforms/line/client.test.ts +17 -17
  120. package/src/platforms/line/commands/auth.test.ts +8 -8
  121. package/src/platforms/line/commands/chat.test.ts +7 -7
  122. package/src/platforms/line/commands/friend.test.ts +6 -6
  123. package/src/platforms/line/commands/message.test.ts +7 -7
  124. package/src/platforms/line/commands/whoami.test.ts +6 -6
  125. package/src/platforms/line/credential-manager.test.ts +17 -17
  126. package/src/platforms/line/index.test.ts +10 -10
  127. package/src/platforms/line/listener.test.ts +15 -15
  128. package/src/platforms/line/types.test.ts +14 -14
  129. package/src/platforms/slack/cli.test.ts +8 -8
  130. package/src/platforms/slack/client.test.ts +151 -151
  131. package/src/platforms/slack/commands/activity.test.ts +13 -13
  132. package/src/platforms/slack/commands/auth.test.ts +34 -34
  133. package/src/platforms/slack/commands/bookmark.test.ts +9 -9
  134. package/src/platforms/slack/commands/channel.test.ts +17 -17
  135. package/src/platforms/slack/commands/drafts.test.ts +7 -7
  136. package/src/platforms/slack/commands/emoji.test.ts +3 -3
  137. package/src/platforms/slack/commands/file.test.ts +12 -12
  138. package/src/platforms/slack/commands/message.test.ts +19 -19
  139. package/src/platforms/slack/commands/pin.test.ts +7 -7
  140. package/src/platforms/slack/commands/reaction.test.ts +10 -10
  141. package/src/platforms/slack/commands/reminder.test.ts +9 -9
  142. package/src/platforms/slack/commands/saved.test.ts +7 -7
  143. package/src/platforms/slack/commands/sections.test.ts +5 -5
  144. package/src/platforms/slack/commands/snapshot.test.ts +13 -13
  145. package/src/platforms/slack/commands/unread.test.ts +6 -6
  146. package/src/platforms/slack/commands/user.test.ts +10 -10
  147. package/src/platforms/slack/commands/usergroup.test.ts +15 -15
  148. package/src/platforms/slack/commands/whoami.test.ts +6 -6
  149. package/src/platforms/slack/commands/workspace.test.ts +26 -26
  150. package/src/platforms/slack/credential-manager.test.ts +14 -14
  151. package/src/platforms/slack/ensure-auth.test.ts +21 -21
  152. package/src/platforms/slack/index.test.ts +12 -12
  153. package/src/platforms/slack/listener.test.ts +17 -17
  154. package/src/platforms/slack/token-extractor-node.test.ts +2 -2
  155. package/src/platforms/slack/token-extractor.test.ts +37 -37
  156. package/src/platforms/slack/types.test.ts +21 -21
  157. package/src/platforms/slackbot/client.test.ts +22 -22
  158. package/src/platforms/slackbot/commands/auth.test.ts +14 -14
  159. package/src/platforms/slackbot/commands/channel.test.ts +7 -7
  160. package/src/platforms/slackbot/commands/message.test.ts +13 -13
  161. package/src/platforms/slackbot/commands/reaction.test.ts +6 -6
  162. package/src/platforms/slackbot/commands/user.test.ts +7 -7
  163. package/src/platforms/slackbot/commands/whoami.test.ts +4 -4
  164. package/src/platforms/slackbot/credential-manager.test.ts +22 -22
  165. package/src/platforms/slackbot/types.test.ts +7 -7
  166. package/src/platforms/teams/client.test.ts +30 -30
  167. package/src/platforms/teams/commands/auth.test.ts +8 -8
  168. package/src/platforms/teams/commands/channel.test.ts +7 -7
  169. package/src/platforms/teams/commands/file.test.ts +4 -4
  170. package/src/platforms/teams/commands/message.test.ts +5 -5
  171. package/src/platforms/teams/commands/reaction.test.ts +4 -4
  172. package/src/platforms/teams/commands/snapshot.test.ts +7 -7
  173. package/src/platforms/teams/commands/team.test.ts +8 -8
  174. package/src/platforms/teams/commands/user.test.ts +4 -4
  175. package/src/platforms/teams/commands/whoami.test.ts +6 -6
  176. package/src/platforms/teams/credential-manager.test.ts +17 -17
  177. package/src/platforms/teams/ensure-auth.test.ts +13 -13
  178. package/src/platforms/teams/index.test.ts +15 -15
  179. package/src/platforms/teams/token-extractor.test.ts +219 -145
  180. package/src/platforms/teams/token-extractor.ts +13 -2
  181. package/src/platforms/teams/types.test.ts +26 -26
  182. package/src/platforms/telegram/app-config.test.ts +4 -4
  183. package/src/platforms/telegram/chat-utils.test.ts +12 -12
  184. package/src/platforms/telegram/client.test.ts +4 -4
  185. package/src/platforms/telegram/commands/auth.test.ts +16 -16
  186. package/src/platforms/telegram/commands/chat.test.ts +9 -9
  187. package/src/platforms/telegram/commands/message.test.ts +6 -6
  188. package/src/platforms/telegram/commands/shared.test.ts +3 -3
  189. package/src/platforms/telegram/commands/whoami.test.ts +3 -3
  190. package/src/platforms/telegram/credential-manager.test.ts +10 -10
  191. package/src/platforms/telegram/types.test.ts +6 -6
  192. package/src/platforms/webex/app-config.test.ts +8 -8
  193. package/src/platforms/webex/cli.test.ts +5 -5
  194. package/src/platforms/webex/client.test.ts +65 -65
  195. package/src/platforms/webex/commands/auth.test.ts +18 -18
  196. package/src/platforms/webex/commands/member.test.ts +5 -5
  197. package/src/platforms/webex/commands/message.test.ts +12 -12
  198. package/src/platforms/webex/commands/snapshot.test.ts +5 -5
  199. package/src/platforms/webex/commands/space.test.ts +10 -10
  200. package/src/platforms/webex/commands/whoami.test.ts +6 -6
  201. package/src/platforms/webex/credential-manager.test.ts +22 -22
  202. package/src/platforms/webex/encryption.test.ts +4 -4
  203. package/src/platforms/webex/ensure-auth.test.ts +5 -5
  204. package/src/platforms/webex/index.test.ts +5 -5
  205. package/src/platforms/webex/markdown-to-html.test.ts +33 -33
  206. package/src/platforms/webex/token-extractor.test.ts +23 -23
  207. package/src/platforms/webex/types.test.ts +27 -27
  208. package/src/platforms/wechatbot/client.test.ts +27 -27
  209. package/src/platforms/wechatbot/commands/auth.test.ts +15 -15
  210. package/src/platforms/wechatbot/commands/message.test.ts +8 -8
  211. package/src/platforms/wechatbot/commands/template.test.ts +9 -9
  212. package/src/platforms/wechatbot/commands/user.test.ts +7 -7
  213. package/src/platforms/wechatbot/commands/whoami.test.ts +5 -5
  214. package/src/platforms/wechatbot/credential-manager.test.ts +18 -18
  215. package/src/platforms/wechatbot/index.test.ts +10 -10
  216. package/src/platforms/wechatbot/types.test.ts +25 -25
  217. package/src/platforms/whatsapp/commands/auth.test.ts +13 -13
  218. package/src/platforms/whatsapp/commands/chat.test.ts +8 -8
  219. package/src/platforms/whatsapp/commands/message.test.ts +10 -10
  220. package/src/platforms/whatsapp/commands/whoami.test.ts +3 -3
  221. package/src/platforms/whatsapp/credential-manager.test.ts +23 -23
  222. package/src/platforms/whatsapp/ensure-auth.test.ts +4 -4
  223. package/src/platforms/whatsapp/index.test.ts +8 -8
  224. package/src/platforms/whatsapp/types.test.ts +42 -42
  225. package/src/platforms/whatsappbot/client.test.ts +27 -27
  226. package/src/platforms/whatsappbot/commands/auth.test.ts +14 -14
  227. package/src/platforms/whatsappbot/commands/message.test.ts +16 -16
  228. package/src/platforms/whatsappbot/commands/template.test.ts +9 -9
  229. package/src/platforms/whatsappbot/commands/whoami.test.ts +5 -5
  230. package/src/platforms/whatsappbot/credential-manager.test.ts +18 -18
  231. package/src/platforms/whatsappbot/index.test.ts +7 -7
  232. package/src/platforms/whatsappbot/types.test.ts +18 -18
  233. package/src/shared/chromium/browsers.test.ts +22 -22
  234. package/src/shared/chromium/cookie-reader.test.ts +13 -13
  235. package/src/shared/chromium/decryptor.test.ts +97 -32
  236. package/src/shared/chromium/decryptor.ts +27 -6
  237. package/src/shared/utils/concurrency.test.ts +6 -6
  238. package/src/shared/utils/derived-key-cache.test.ts +11 -11
  239. package/src/tui/utils.test.ts +31 -31
@@ -1,4 +1,4 @@
1
- import { afterEach, beforeAll, describe, expect, test } from 'bun:test'
1
+ import { afterEach, beforeAll, describe, expect, it } from 'bun:test'
2
2
 
3
3
  import { WEBEX_TEST_SPACE_ID, WEBEX_TEST_DM_EMAIL, validateWebexEnvironment } from './config'
4
4
  import { generateTestId, parseJSON, runCLI, waitForRateLimit } from './helpers'
@@ -31,7 +31,7 @@ describe('Webex E2E Tests', () => {
31
31
  })
32
32
 
33
33
  describe('auth', () => {
34
- test('auth status returns authenticated', async () => {
34
+ it('auth status returns authenticated', async () => {
35
35
  if (!webexAvailable) return
36
36
 
37
37
  const result = await runCLI('webex', ['auth', 'status'])
@@ -43,7 +43,7 @@ describe('Webex E2E Tests', () => {
43
43
  })
44
44
 
45
45
  describe('message', () => {
46
- test('message send creates a message', async () => {
46
+ it('message send creates a message', async () => {
47
47
  if (!webexAvailable) return
48
48
 
49
49
  const testId = generateTestId()
@@ -56,7 +56,7 @@ describe('Webex E2E Tests', () => {
56
56
  if (data?.id) testMessages.push(data.id)
57
57
  })
58
58
 
59
- test('message list returns messages array', async () => {
59
+ it('message list returns messages array', async () => {
60
60
  if (!webexAvailable) return
61
61
 
62
62
  const result = await runCLI('webex', ['message', 'list', WEBEX_TEST_SPACE_ID, '--limit', '5'])
@@ -66,7 +66,7 @@ describe('Webex E2E Tests', () => {
66
66
  expect(Array.isArray(data)).toBe(true)
67
67
  })
68
68
 
69
- test('message get retrieves specific message', async () => {
69
+ it('message get retrieves specific message', async () => {
70
70
  if (!webexAvailable) return
71
71
 
72
72
  const testId = generateTestId()
@@ -86,7 +86,7 @@ describe('Webex E2E Tests', () => {
86
86
  expect(data?.text).toContain(testId)
87
87
  }, 30000)
88
88
 
89
- test('message delete removes message', async () => {
89
+ it('message delete removes message', async () => {
90
90
  if (!webexAvailable) return
91
91
 
92
92
  const testId = generateTestId()
@@ -102,7 +102,7 @@ describe('Webex E2E Tests', () => {
102
102
  expect(result.exitCode).toBe(0)
103
103
  }, 30000)
104
104
 
105
- test('message edit updates message content', async () => {
105
+ it('message edit updates message content', async () => {
106
106
  if (!webexAvailable) return
107
107
 
108
108
  const testId = generateTestId()
@@ -139,7 +139,7 @@ describe('Webex E2E Tests', () => {
139
139
  return runCLI('webex', args)
140
140
  }
141
141
 
142
- test('message edit survives second edit and markdown edit (regression for silent failure)', async () => {
142
+ it('message edit survives second edit and markdown edit (regression for silent failure)', async () => {
143
143
  if (!webexAvailable) return
144
144
 
145
145
  const testId = generateTestId()
@@ -178,7 +178,7 @@ describe('Webex E2E Tests', () => {
178
178
  })
179
179
 
180
180
  describe('space', () => {
181
- test('space list returns spaces array', async () => {
181
+ it('space list returns spaces array', async () => {
182
182
  if (!webexAvailable) return
183
183
 
184
184
  const result = await runCLI('webex', ['space', 'list', '--limit', '5'])
@@ -188,7 +188,7 @@ describe('Webex E2E Tests', () => {
188
188
  expect(Array.isArray(data)).toBe(true)
189
189
  })
190
190
 
191
- test('space info returns space details', async () => {
191
+ it('space info returns space details', async () => {
192
192
  if (!webexAvailable) return
193
193
 
194
194
  const result = await runCLI('webex', ['space', 'info', WEBEX_TEST_SPACE_ID])
@@ -200,7 +200,7 @@ describe('Webex E2E Tests', () => {
200
200
  })
201
201
 
202
202
  describe('member', () => {
203
- test('member list returns members array', async () => {
203
+ it('member list returns members array', async () => {
204
204
  if (!webexAvailable) return
205
205
 
206
206
  const result = await runCLI('webex', ['member', 'list', WEBEX_TEST_SPACE_ID, '--limit', '5'])
@@ -212,7 +212,7 @@ describe('Webex E2E Tests', () => {
212
212
  })
213
213
 
214
214
  describe('snapshot', () => {
215
- test('snapshot returns spaces and members', async () => {
215
+ it('snapshot returns spaces and members', async () => {
216
216
  if (!webexAvailable) return
217
217
 
218
218
  const result = await runCLI('webex', ['snapshot', '--limit', '2'])
@@ -224,7 +224,7 @@ describe('Webex E2E Tests', () => {
224
224
  expect(data?.recent_messages).toBeDefined()
225
225
  }, 30000)
226
226
 
227
- test('snapshot --spaces-only returns only spaces', async () => {
227
+ it('snapshot --spaces-only returns only spaces', async () => {
228
228
  if (!webexAvailable) return
229
229
 
230
230
  const result = await runCLI('webex', ['snapshot', '--spaces-only'])
@@ -234,7 +234,7 @@ describe('Webex E2E Tests', () => {
234
234
  expect(data?.spaces).toBeDefined()
235
235
  })
236
236
 
237
- test('snapshot --members-only returns only members', async () => {
237
+ it('snapshot --members-only returns only members', async () => {
238
238
  if (!webexAvailable) return
239
239
 
240
240
  const result = await runCLI('webex', ['snapshot', '--members-only'])
@@ -1,4 +1,4 @@
1
- import { afterEach, beforeAll, describe, expect, test } from 'bun:test'
1
+ import { afterEach, beforeAll, describe, expect, it } from 'bun:test'
2
2
 
3
3
  import { WHATSAPP_TEST_CHAT_ID, validateWhatsAppEnvironment } from './config'
4
4
  import { generateTestId, parseJSON, runCLI, waitForRateLimit } from './helpers'
@@ -15,14 +15,14 @@ describe('WhatsApp E2E Tests', () => {
15
15
  })
16
16
 
17
17
  describe('auth', () => {
18
- test('auth status returns exit code 0', async () => {
18
+ it('auth status returns exit code 0', async () => {
19
19
  if (!whatsappAvailable) return
20
20
 
21
21
  const result = await runCLI('whatsapp', ['auth', 'status'])
22
22
  expect(result.exitCode).toBe(0)
23
23
  })
24
24
 
25
- test('auth list returns accounts array', async () => {
25
+ it('auth list returns accounts array', async () => {
26
26
  if (!whatsappAvailable) return
27
27
 
28
28
  const result = await runCLI('whatsapp', ['auth', 'list'])
@@ -34,7 +34,7 @@ describe('WhatsApp E2E Tests', () => {
34
34
  })
35
35
 
36
36
  describe('chat', () => {
37
- test('chat list returns chats', async () => {
37
+ it('chat list returns chats', async () => {
38
38
  if (!whatsappAvailable) return
39
39
 
40
40
  const result = await runCLI('whatsapp', ['chat', 'list', '--limit', '5'])
@@ -44,7 +44,7 @@ describe('WhatsApp E2E Tests', () => {
44
44
  expect(data).toBeTruthy()
45
45
  })
46
46
 
47
- test('chat search returns results', async () => {
47
+ it('chat search returns results', async () => {
48
48
  if (!whatsappAvailable) return
49
49
 
50
50
  const result = await runCLI('whatsapp', ['chat', 'search', 'test', '--limit', '5'])
@@ -53,7 +53,7 @@ describe('WhatsApp E2E Tests', () => {
53
53
  })
54
54
 
55
55
  describe('message', () => {
56
- test('message send delivers message to chat', async () => {
56
+ it('message send delivers message to chat', async () => {
57
57
  if (!whatsappAvailable) return
58
58
 
59
59
  const testId = generateTestId()
@@ -61,7 +61,7 @@ describe('WhatsApp E2E Tests', () => {
61
61
  expect(result.exitCode).toBe(0)
62
62
  })
63
63
 
64
- test('message list returns messages', async () => {
64
+ it('message list returns messages', async () => {
65
65
  if (!whatsappAvailable) return
66
66
 
67
67
  const result = await runCLI('whatsapp', ['message', 'list', WHATSAPP_TEST_CHAT_ID, '--limit', '5'])
@@ -71,7 +71,7 @@ describe('WhatsApp E2E Tests', () => {
71
71
  expect(data).toBeTruthy()
72
72
  })
73
73
 
74
- test('message react adds reaction to message', async () => {
74
+ it('message react adds reaction to message', async () => {
75
75
  if (!whatsappAvailable) return
76
76
 
77
77
  const testId = generateTestId()
@@ -1,4 +1,4 @@
1
- import { afterEach, beforeAll, describe, expect, test } from 'bun:test'
1
+ import { afterEach, beforeAll, describe, expect, it } from 'bun:test'
2
2
 
3
3
  import { WHATSAPPBOT_TEST_PHONE_NUMBER, validateWhatsAppBotEnvironment } from './config'
4
4
  import { generateTestId, parseJSON, runCLI, waitForRateLimit } from './helpers'
@@ -15,7 +15,7 @@ describe('WhatsApp Bot E2E Tests', () => {
15
15
  })
16
16
 
17
17
  describe('auth', () => {
18
- test('auth status returns valid credentials', async () => {
18
+ it('auth status returns valid credentials', async () => {
19
19
  if (!whatsappbotAvailable) return
20
20
 
21
21
  const result = await runCLI('whatsappbot', ['auth', 'status'])
@@ -25,7 +25,7 @@ describe('WhatsApp Bot E2E Tests', () => {
25
25
  expect(data?.valid).toBe(true)
26
26
  })
27
27
 
28
- test('auth list returns accounts array', async () => {
28
+ it('auth list returns accounts array', async () => {
29
29
  if (!whatsappbotAvailable) return
30
30
 
31
31
  const result = await runCLI('whatsappbot', ['auth', 'list'])
@@ -37,7 +37,7 @@ describe('WhatsApp Bot E2E Tests', () => {
37
37
  })
38
38
 
39
39
  describe('message', () => {
40
- test('message send delivers to test phone number', async () => {
40
+ it('message send delivers to test phone number', async () => {
41
41
  if (!whatsappbotAvailable) return
42
42
 
43
43
  const testId = generateTestId()
@@ -47,7 +47,7 @@ describe('WhatsApp Bot E2E Tests', () => {
47
47
  })
48
48
 
49
49
  describe('template', () => {
50
- test('template list returns templates', async () => {
50
+ it('template list returns templates', async () => {
51
51
  if (!whatsappbotAvailable) return
52
52
 
53
53
  const result = await runCLI('whatsappbot', ['template', 'list', '--limit', '5'])
@@ -57,7 +57,7 @@ describe('WhatsApp Bot E2E Tests', () => {
57
57
  expect(data).toBeDefined()
58
58
  })
59
59
 
60
- test('template get returns template details', async () => {
60
+ it('template get returns template details', async () => {
61
61
  if (!whatsappbotAvailable) return
62
62
 
63
63
  const listResult = await runCLI('whatsappbot', ['template', 'list', '--limit', '1'])
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-messenger",
3
- "version": "2.10.0",
3
+ "version": "2.10.2",
4
4
  "description": "Multi-platform messaging CLI for AI agents (Slack, Discord, Teams, Webex, Telegram, WhatsApp, LINE, Instagram, KakaoTalk, Channel Talk)",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-channeltalk
3
3
  description: Interact with Channel Talk using extracted desktop app or browser credentials - read chats, send messages, search messages, manage groups
4
- version: 2.10.0
4
+ version: 2.10.2
5
5
  allowed-tools: Bash(agent-channeltalk:*)
6
6
  metadata:
7
7
  openclaw:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-channeltalkbot
3
3
  description: Interact with Channel Talk workspaces using API credentials - send messages, read chats, manage groups and bots
4
- version: 2.10.0
4
+ version: 2.10.2
5
5
  allowed-tools: Bash(agent-channeltalkbot:*)
6
6
  metadata:
7
7
  openclaw:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-discord
3
3
  description: Interact with Discord servers - send messages, read channels, manage reactions
4
- version: 2.10.0
4
+ version: 2.10.2
5
5
  allowed-tools: Bash(agent-discord:*)
6
6
  metadata:
7
7
  openclaw:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-discordbot
3
3
  description: Interact with Discord servers using bot tokens - send messages, read channels, manage reactions
4
- version: 2.10.0
4
+ version: 2.10.2
5
5
  allowed-tools: Bash(agent-discordbot:*)
6
6
  metadata:
7
7
  openclaw:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-instagram
3
3
  description: Interact with Instagram DMs - send messages, read conversations, manage accounts
4
- version: 2.10.0
4
+ version: 2.10.2
5
5
  allowed-tools: Bash(agent-instagram:*)
6
6
  metadata:
7
7
  openclaw:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-kakaotalk
3
3
  description: Interact with KakaoTalk - send messages, read chats, manage conversations
4
- version: 2.10.0
4
+ version: 2.10.2
5
5
  allowed-tools: Bash(agent-kakaotalk:*)
6
6
  metadata:
7
7
  openclaw:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-line
3
3
  description: Interact with LINE - send messages, read chats, manage conversations
4
- version: 2.10.0
4
+ version: 2.10.2
5
5
  allowed-tools: Bash(agent-line:*)
6
6
  metadata:
7
7
  openclaw:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-slack
3
3
  description: Interact with Slack workspaces - send messages, read channels, manage reactions
4
- version: 2.10.0
4
+ version: 2.10.2
5
5
  allowed-tools: Bash(agent-slack:*)
6
6
  metadata:
7
7
  openclaw:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-slackbot
3
3
  description: Interact with Slack workspaces using bot tokens - send messages, read channels, manage reactions
4
- version: 2.10.0
4
+ version: 2.10.2
5
5
  allowed-tools: Bash(agent-slackbot:*)
6
6
  metadata:
7
7
  openclaw:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-teams
3
3
  description: Interact with Microsoft Teams - send messages, read channels, manage reactions
4
- version: 2.10.0
4
+ version: 2.10.2
5
5
  allowed-tools: Bash(agent-teams:*)
6
6
  metadata:
7
7
  openclaw:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-telegram
3
3
  description: Interact with Telegram through TDLib - authenticate, inspect chats, and send messages
4
- version: 2.10.0
4
+ version: 2.10.2
5
5
  allowed-tools: Bash(agent-telegram:*)
6
6
  ---
7
7
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-webex
3
3
  description: Interact with Cisco Webex - send messages, read spaces, manage memberships
4
- version: 2.10.0
4
+ version: 2.10.2
5
5
  allowed-tools: Bash(agent-webex:*)
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.10.0
4
+ version: 2.10.2
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.10.0
4
+ version: 2.10.2
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.10.0
4
+ version: 2.10.2
5
5
  allowed-tools: Bash(agent-whatsappbot:*)
6
6
  metadata:
7
7
  openclaw:
@@ -1,4 +1,4 @@
1
- import { afterEach, beforeEach, describe, expect, test } from 'bun:test'
1
+ import { afterEach, beforeEach, describe, expect, it } from 'bun:test'
2
2
 
3
3
  import { ChannelClient } from './client'
4
4
  import { ChannelError } from './types'
@@ -51,7 +51,7 @@ describe('ChannelClient', () => {
51
51
  const getJsonBody = (callIndex = 0) =>
52
52
  JSON.parse(String(fetchCalls[callIndex]?.options?.body)) as Record<string, unknown>
53
53
 
54
- test('login() requires account cookie', async () => {
54
+ it('login() requires account cookie', async () => {
55
55
  await expect(new ChannelClient().login({ accountCookie: '' })).rejects.toThrow(ChannelError)
56
56
  await expect(new ChannelClient().login({ accountCookie: '', sessionCookie: 'session-cookie' })).rejects.toThrow(
57
57
  ChannelError,
@@ -62,7 +62,7 @@ describe('ChannelClient', () => {
62
62
  expect(client2).toBeInstanceOf(ChannelClient)
63
63
  })
64
64
 
65
- test('successful GET request returns unwrapped JSON', async () => {
65
+ it('successful GET request returns unwrapped JSON', async () => {
66
66
  mockResponse({
67
67
  account: {
68
68
  id: 'acc-1',
@@ -82,7 +82,7 @@ describe('ChannelClient', () => {
82
82
  expect(fetchCalls[0].url).toBe('https://desk-api.channel.io/desk/account')
83
83
  })
84
84
 
85
- test('cookie auth headers are set on every request', async () => {
85
+ it('cookie auth headers are set on every request', async () => {
86
86
  mockResponse({
87
87
  account: {
88
88
  id: 'acc-1',
@@ -108,7 +108,7 @@ describe('ChannelClient', () => {
108
108
  }
109
109
  })
110
110
 
111
- test('429 response triggers retry with Retry-After wait', async () => {
111
+ it('429 response triggers retry with Retry-After wait', async () => {
112
112
  mockResponse({ errors: [{ message: 'Rate limited' }] }, 429, { 'Retry-After': '0.05' })
113
113
  mockResponse({
114
114
  account: {
@@ -132,7 +132,7 @@ describe('ChannelClient', () => {
132
132
  expect(elapsed).toBeGreaterThanOrEqual(40)
133
133
  })
134
134
 
135
- test('500 response triggers retry with exponential backoff for GET requests', async () => {
135
+ it('500 response triggers retry with exponential backoff for GET requests', async () => {
136
136
  mockResponse({ errors: [{ message: 'Server error' }] }, 500)
137
137
  mockResponse({ errors: [{ message: 'Server error' }] }, 500)
138
138
  mockResponse({
@@ -157,7 +157,7 @@ describe('ChannelClient', () => {
157
157
  expect(elapsed).toBeGreaterThanOrEqual(280)
158
158
  })
159
159
 
160
- test('4xx non-429 throws immediately without retry', async () => {
160
+ it('4xx non-429 throws immediately without retry', async () => {
161
161
  mockResponse({ type: 'forbidden', errors: [{ message: 'Forbidden' }] }, 403)
162
162
 
163
163
  const client = await new ChannelClient().login({ accountCookie: 'account-cookie', sessionCookie: 'session-cookie' })
@@ -165,7 +165,7 @@ describe('ChannelClient', () => {
165
165
  expect(fetchCalls).toHaveLength(1)
166
166
  })
167
167
 
168
- test('network error retries then throws ChannelError with code network_error', async () => {
168
+ it('network error retries then throws ChannelError with code network_error', async () => {
169
169
  ;(globalThis as Record<string, unknown>).fetch = async (
170
170
  url: string | URL | Request,
171
171
  options?: RequestInit,
@@ -186,7 +186,7 @@ describe('ChannelClient', () => {
186
186
  }
187
187
  })
188
188
 
189
- test('204 response returns undefined', async () => {
189
+ it('204 response returns undefined', async () => {
190
190
  mockResponse(null, 204)
191
191
 
192
192
  const client = await new ChannelClient().login({ accountCookie: 'account-cookie', sessionCookie: 'session-cookie' })
@@ -197,7 +197,7 @@ describe('ChannelClient', () => {
197
197
  expect(result).toBeUndefined()
198
198
  })
199
199
 
200
- test('wrapTextInBlocks returns a single text block and extractText joins block and plain text', () => {
200
+ it('wrapTextInBlocks returns a single text block and extractText joins block and plain text', () => {
201
201
  expect(ChannelClient.wrapTextInBlocks('Hello world')).toEqual([{ type: 'text', value: 'Hello world' }])
202
202
 
203
203
  expect(
@@ -212,7 +212,7 @@ describe('ChannelClient', () => {
212
212
  ).toBe('hello\nworld\nfallback')
213
213
  })
214
214
 
215
- test('listChannels includes query params', async () => {
215
+ it('listChannels includes query params', async () => {
216
216
  mockResponse({ channels: [{ id: 'ch-1', name: 'Support' }] })
217
217
 
218
218
  const client = await new ChannelClient().login({ accountCookie: 'account-cookie', sessionCookie: 'session-cookie' })
@@ -222,7 +222,7 @@ describe('ChannelClient', () => {
222
222
  expect(fetchCalls[0].url).toBe('https://desk-api.channel.io/desk/channels?limit=500')
223
223
  })
224
224
 
225
- test('getChannel uses the channel detail endpoint', async () => {
225
+ it('getChannel uses the channel detail endpoint', async () => {
226
226
  mockResponse({ channel: { id: 'ch-1', name: 'Support' } })
227
227
 
228
228
  const client = await new ChannelClient().login({ accountCookie: 'account-cookie', sessionCookie: 'session-cookie' })
@@ -231,7 +231,7 @@ describe('ChannelClient', () => {
231
231
  expect(fetchCalls[0].url).toBe('https://desk-api.channel.io/desk/channels/ch-1')
232
232
  })
233
233
 
234
- test('listManagers uses the managers endpoint', async () => {
234
+ it('listManagers uses the managers endpoint', async () => {
235
235
  mockResponse({ managers: [{ id: 'mgr-1', channelId: 'ch-1', accountId: 'acc-1', name: 'Alex' }] })
236
236
 
237
237
  const client = await new ChannelClient().login({ accountCookie: 'account-cookie', sessionCookie: 'session-cookie' })
@@ -241,7 +241,7 @@ describe('ChannelClient', () => {
241
241
  expect(fetchCalls[0].url).toBe('https://desk-api.channel.io/desk/channels/ch-1/managers?limit=200')
242
242
  })
243
243
 
244
- test('getManagerRole unwraps the role response', async () => {
244
+ it('getManagerRole unwraps the role response', async () => {
245
245
  mockResponse({ role: { permissions: ['read'] } })
246
246
 
247
247
  const client = await new ChannelClient().login({ accountCookie: 'account-cookie', sessionCookie: 'session-cookie' })
@@ -251,7 +251,7 @@ describe('ChannelClient', () => {
251
251
  expect(fetchCalls[0].url).toBe('https://desk-api.channel.io/desk/channels/ch-1/managers/me/role')
252
252
  })
253
253
 
254
- test('group endpoints build the expected URLs', async () => {
254
+ it('group endpoints build the expected URLs', async () => {
255
255
  mockResponse({ groups: [{ id: 'grp-1', channelId: 'ch-1', name: 'ops' }] })
256
256
  mockResponse({ group: { id: 'grp-1', channelId: 'ch-1', name: 'ops' } })
257
257
  mockResponse({ messages: [{ id: 'msg-1' }] })
@@ -273,7 +273,7 @@ describe('ChannelClient', () => {
273
273
  expect(messagesUrl.searchParams.get('since')).toBe('cursor-1')
274
274
  })
275
275
 
276
- test('sendGroupMessage includes requestId in the body', async () => {
276
+ it('sendGroupMessage includes requestId in the body', async () => {
277
277
  mockResponse({ message: { id: 'msg-1', requestId: 'req-123' } })
278
278
 
279
279
  const client = await new ChannelClient().login({ accountCookie: 'account-cookie', sessionCookie: 'session-cookie' })
@@ -285,7 +285,7 @@ describe('ChannelClient', () => {
285
285
  expect(getJsonBody()).toEqual({ blocks, requestId: 'req-123' })
286
286
  })
287
287
 
288
- test('direct chat endpoints build the expected URLs', async () => {
288
+ it('direct chat endpoints build the expected URLs', async () => {
289
289
  mockResponse({ directChats: [{ id: 'dm-1', channelId: 'ch-1' }] })
290
290
  mockResponse({ messages: [{ id: 'msg-1' }] })
291
291
  mockResponse({ message: { id: 'msg-2', requestId: 'req-234' } })
@@ -305,7 +305,7 @@ describe('ChannelClient', () => {
305
305
  expect(getJsonBody(2)).toEqual({ blocks, requestId: 'req-234' })
306
306
  })
307
307
 
308
- test('user chat endpoints build the expected URLs', async () => {
308
+ it('user chat endpoints build the expected URLs', async () => {
309
309
  mockResponse({ userChats: [{ id: 'uc-1', channelId: 'ch-1', state: 'opened' }] })
310
310
  mockResponse({ userChat: { id: 'uc-1', channelId: 'ch-1', state: 'opened' } })
311
311
  mockResponse({ messages: [{ id: 'msg-1' }] })
@@ -330,7 +330,7 @@ describe('ChannelClient', () => {
330
330
  expect(getJsonBody(3)).toEqual({ blocks, requestId: 'req-345' })
331
331
  })
332
332
 
333
- test('listBots uses the bots endpoint', async () => {
333
+ it('listBots uses the bots endpoint', async () => {
334
334
  mockResponse({ bots: [{ id: 'bot-1', channelId: 'ch-1', name: 'DeskBot' }] })
335
335
 
336
336
  const client = await new ChannelClient().login({ accountCookie: 'account-cookie', sessionCookie: 'session-cookie' })
@@ -340,7 +340,7 @@ describe('ChannelClient', () => {
340
340
  expect(fetchCalls[0].url).toBe('https://desk-api.channel.io/desk/channels/ch-1/bots?limit=1000')
341
341
  })
342
342
 
343
- test('5xx on POST does not retry', async () => {
343
+ it('5xx on POST does not retry', async () => {
344
344
  mockResponse({ type: 'server_error', errors: [{ message: 'Server error' }] }, 500)
345
345
 
346
346
  const client = await new ChannelClient().login({ accountCookie: 'account-cookie', sessionCookie: 'session-cookie' })
@@ -350,7 +350,7 @@ describe('ChannelClient', () => {
350
350
  expect(fetchCalls).toHaveLength(1)
351
351
  })
352
352
 
353
- test('error responses use desk API error fields', async () => {
353
+ it('error responses use desk API error fields', async () => {
354
354
  mockResponse({ type: 'not_found', status: 404, errors: [{ message: 'Missing resource' }], language: 'en' }, 404)
355
355
 
356
356
  const client = await new ChannelClient().login({ accountCookie: 'account-cookie', sessionCookie: 'session-cookie' })
@@ -365,7 +365,7 @@ describe('ChannelClient', () => {
365
365
  }
366
366
  })
367
367
 
368
- test('rate limit headers delay the next request when remaining is zero', async () => {
368
+ it('rate limit headers delay the next request when remaining is zero', async () => {
369
369
  mockResponse(
370
370
  {
371
371
  account: {
@@ -407,7 +407,7 @@ describe('ChannelClient', () => {
407
407
  expect(fetchCalls).toHaveLength(2)
408
408
  })
409
409
 
410
- test('generated requests still include the cookie header on post endpoints', async () => {
410
+ it('generated requests still include the cookie header on post endpoints', async () => {
411
411
  mockResponse({ message: { id: 'msg-1' } })
412
412
 
413
413
  const client = await new ChannelClient().login({ accountCookie: 'account-cookie', sessionCookie: 'session-cookie' })
@@ -416,7 +416,7 @@ describe('ChannelClient', () => {
416
416
  expect(getHeaders().Cookie).toBe('x-account=account-cookie; ch-session-1=session-cookie')
417
417
  })
418
418
 
419
- test('searchTeamChatMessages builds correct URL with query and limit', async () => {
419
+ it('searchTeamChatMessages builds correct URL with query and limit', async () => {
420
420
  const searchResponse = {
421
421
  hits: [
422
422
  {
@@ -443,7 +443,7 @@ describe('ChannelClient', () => {
443
443
  expect(result.hits).toHaveLength(1)
444
444
  })
445
445
 
446
- test('searchUserChatMessages builds correct URL with query', async () => {
446
+ it('searchUserChatMessages builds correct URL with query', async () => {
447
447
  const searchResponse = {
448
448
  hits: [],
449
449
  bots: [],
@@ -461,7 +461,7 @@ describe('ChannelClient', () => {
461
461
  expect(result.hits).toHaveLength(0)
462
462
  })
463
463
 
464
- test('searchTeamChatMessages works without limit parameter', async () => {
464
+ it('searchTeamChatMessages works without limit parameter', async () => {
465
465
  mockResponse({ hits: [], bots: [], sessions: [] })
466
466
 
467
467
  const client = await new ChannelClient().login({ accountCookie: 'account-cookie', sessionCookie: 'session-cookie' })