agent-messenger 2.10.1 → 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 +9 -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 +109 -49
  180. package/src/platforms/teams/token-extractor.ts +7 -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,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.1
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.1
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.1
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.1
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.1
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.1
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.1
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.1
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.1
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.1
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.1
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' })
@@ -1,4 +1,4 @@
1
- import { afterAll, beforeEach, describe, expect, mock, test } from 'bun:test'
1
+ import { afterAll, beforeEach, describe, expect, mock, it } from 'bun:test'
2
2
 
3
3
  type WorkspaceEntry = {
4
4
  workspace_id: string
@@ -119,7 +119,7 @@ describe('channel auth commands', () => {
119
119
  })
120
120
 
121
121
  describe('extractAction', () => {
122
- test('extracts fresh cookies and saves all workspaces', async () => {
122
+ it('extracts fresh cookies and saves all workspaces', async () => {
123
123
  const result = await extractAction()
124
124
 
125
125
  expect(mockExtract).toHaveBeenCalledTimes(1)
@@ -136,7 +136,7 @@ describe('channel auth commands', () => {
136
136
  expect(workspaceStore.get('ws-2')?.account_cookie).toBe('fresh-account')
137
137
  })
138
138
 
139
- test('preserves current workspace if it still exists after re-extraction', async () => {
139
+ it('preserves current workspace if it still exists after re-extraction', async () => {
140
140
  workspaceStore.set('ws-2', {
141
141
  workspace_id: 'ws-2',
142
142
  workspace_name: 'Workspace 2',
@@ -157,7 +157,7 @@ describe('channel auth commands', () => {
157
157
  })
158
158
  })
159
159
 
160
- test('switches to first workspace when previous current no longer exists', async () => {
160
+ it('switches to first workspace when previous current no longer exists', async () => {
161
161
  workspaceStore.set('ws-old', {
162
162
  workspace_id: 'ws-old',
163
163
  workspace_name: 'Old Workspace',
@@ -178,7 +178,7 @@ describe('channel auth commands', () => {
178
178
  })
179
179
  })
180
180
 
181
- test('returns error when token extraction fails', async () => {
181
+ it('returns error when token extraction fails', async () => {
182
182
  mockExtract.mockImplementation(() => Promise.resolve([]))
183
183
 
184
184
  const result = await extractAction()
@@ -188,7 +188,7 @@ describe('channel auth commands', () => {
188
188
  })
189
189
  })
190
190
 
191
- test('returns error when no workspaces found', async () => {
191
+ it('returns error when no workspaces found', async () => {
192
192
  mockListChannels.mockImplementation(() => Promise.resolve([]))
193
193
 
194
194
  const result = await extractAction()
@@ -200,14 +200,14 @@ describe('channel auth commands', () => {
200
200
  })
201
201
 
202
202
  describe('statusAction', () => {
203
- test('returns an error when no credentials exist', async () => {
203
+ it('returns an error when no credentials exist', async () => {
204
204
  const result = await statusAction()
205
205
 
206
206
  expect(result.valid).toBe(false)
207
207
  expect(result.error).toBe('No credentials. Run "agent-channeltalk auth extract" first.')
208
208
  })
209
209
 
210
- test('returns valid status for current workspace', async () => {
210
+ it('returns valid status for current workspace', async () => {
211
211
  workspaceStore.set('ws-1', {
212
212
  workspace_id: 'ws-1',
213
213
  workspace_name: 'Workspace 1',
@@ -228,7 +228,7 @@ describe('channel auth commands', () => {
228
228
  })
229
229
  })
230
230
 
231
- test('returns invalid status with stored info when api validation fails', async () => {
231
+ it('returns invalid status with stored info when api validation fails', async () => {
232
232
  workspaceStore.set('ws-1', {
233
233
  workspace_id: 'ws-1',
234
234
  workspace_name: 'Workspace 1',
@@ -251,7 +251,7 @@ describe('channel auth commands', () => {
251
251
  })
252
252
  })
253
253
 
254
- test('returns workspace-specific error for unknown workspace', async () => {
254
+ it('returns workspace-specific error for unknown workspace', async () => {
255
255
  const result = await statusAction({ workspace: 'missing' })
256
256
 
257
257
  expect(result).toEqual({
@@ -262,7 +262,7 @@ describe('channel auth commands', () => {
262
262
  })
263
263
 
264
264
  describe('clearAction', () => {
265
- test('removes all stored credentials', async () => {
265
+ it('removes all stored credentials', async () => {
266
266
  workspaceStore.set('ws-1', {
267
267
  workspace_id: 'ws-1',
268
268
  workspace_name: 'Workspace 1',
@@ -280,7 +280,7 @@ describe('channel auth commands', () => {
280
280
  })
281
281
 
282
282
  describe('listAction', () => {
283
- test('lists all workspaces with current flag', async () => {
283
+ it('lists all workspaces with current flag', async () => {
284
284
  workspaceStore.set('ws-1', {
285
285
  workspace_id: 'ws-1',
286
286
  workspace_name: 'Workspace 1',
@@ -305,7 +305,7 @@ describe('channel auth commands', () => {
305
305
  })
306
306
 
307
307
  describe('useAction', () => {
308
- test('switches current workspace', async () => {
308
+ it('switches current workspace', async () => {
309
309
  workspaceStore.set('ws-1', {
310
310
  workspace_id: 'ws-1',
311
311
  workspace_name: 'Workspace 1',
@@ -326,7 +326,7 @@ describe('channel auth commands', () => {
326
326
  expect(currentWorkspaceId).toBe('ws-1')
327
327
  })
328
328
 
329
- test('returns error for unknown workspace', async () => {
329
+ it('returns error for unknown workspace', async () => {
330
330
  const result = await useAction('missing')
331
331
 
332
332
  expect(result).toEqual({
@@ -336,7 +336,7 @@ describe('channel auth commands', () => {
336
336
  })
337
337
 
338
338
  describe('removeAction', () => {
339
- test('removes a stored workspace', async () => {
339
+ it('removes a stored workspace', async () => {
340
340
  workspaceStore.set('ws-1', {
341
341
  workspace_id: 'ws-1',
342
342
  workspace_name: 'Workspace 1',
@@ -351,7 +351,7 @@ describe('channel auth commands', () => {
351
351
  expect(workspaceStore.has('ws-1')).toBe(false)
352
352
  })
353
353
 
354
- test('returns error for unknown workspace', async () => {
354
+ it('returns error for unknown workspace', async () => {
355
355
  const result = await removeAction('missing')
356
356
 
357
357
  expect(result).toEqual({
@@ -1,4 +1,4 @@
1
- import { beforeEach, describe, expect, mock, test } from 'bun:test'
1
+ import { beforeEach, describe, expect, mock, it } from 'bun:test'
2
2
 
3
3
  const mockListBots = mock(() =>
4
4
  Promise.resolve([
@@ -35,7 +35,7 @@ describe('bot commands', () => {
35
35
  )
36
36
  })
37
37
 
38
- test('listAction lists bots', async () => {
38
+ it('listAction lists bots', async () => {
39
39
  const result = await listAction({ limit: '8' })
40
40
 
41
41
  expect(mockListBots).toHaveBeenCalledWith('ws-1', { limit: 8 })
@@ -1,4 +1,4 @@
1
- import { beforeEach, describe, expect, mock, test } from 'bun:test'
1
+ import { beforeEach, describe, expect, mock, it } from 'bun:test'
2
2
 
3
3
  const mockListUserChats = mock(() =>
4
4
  Promise.resolve([
@@ -62,7 +62,7 @@ describe('chat commands', () => {
62
62
  )
63
63
  })
64
64
 
65
- test('listAction lists user chats with the requested state filter', async () => {
65
+ it('listAction lists user chats with the requested state filter', async () => {
66
66
  const result = await listAction({ state: 'closed', limit: '5' })
67
67
 
68
68
  expect(mockListUserChats).toHaveBeenCalledWith('ws-1', { state: 'closed', limit: 5 })
@@ -78,7 +78,7 @@ describe('chat commands', () => {
78
78
  ])
79
79
  })
80
80
 
81
- test('getAction gets a specific user chat', async () => {
81
+ it('getAction gets a specific user chat', async () => {
82
82
  const result = await getAction('chat-1')
83
83
 
84
84
  expect(mockGetUserChat).toHaveBeenCalledWith('ws-1', 'chat-1')
@@ -1,4 +1,4 @@
1
- import { beforeEach, describe, expect, mock, test } from 'bun:test'
1
+ import { beforeEach, describe, expect, mock, it } from 'bun:test'
2
2
 
3
3
  const mockListGroups = mock(() =>
4
4
  Promise.resolve([
@@ -103,7 +103,7 @@ describe('group commands', () => {
103
103
  )
104
104
  })
105
105
 
106
- test('listAction lists groups', async () => {
106
+ it('listAction lists groups', async () => {
107
107
  const result = await listAction({ limit: '3' })
108
108
 
109
109
  expect(mockListGroups).toHaveBeenCalledWith('ws-1', { limit: 3 })
@@ -121,7 +121,7 @@ describe('group commands', () => {
121
121
  ])
122
122
  })
123
123
 
124
- test('getAction gets a specific group', async () => {
124
+ it('getAction gets a specific group', async () => {
125
125
  const result = await getAction('grp-1')
126
126
 
127
127
  expect(mockGetGroup).toHaveBeenCalledWith('ws-1', 'grp-1')
@@ -137,7 +137,7 @@ describe('group commands', () => {
137
137
  })
138
138
  })
139
139
 
140
- test('messagesAction gets group messages with limit and sort', async () => {
140
+ it('messagesAction gets group messages with limit and sort', async () => {
141
141
  const result = await messagesAction('grp-1', { limit: '7', sort: 'asc' })
142
142
 
143
143
  expect(mockGetGroupMessages).toHaveBeenCalledWith('ws-1', 'grp-1', { limit: 7, sortOrder: 'asc' })
@@ -1,4 +1,4 @@
1
- import { beforeEach, describe, expect, mock, test } from 'bun:test'
1
+ import { beforeEach, describe, expect, mock, it } from 'bun:test'
2
2
 
3
3
  const mockListManagers = mock(() =>
4
4
  Promise.resolve([
@@ -43,7 +43,7 @@ describe('manager commands', () => {
43
43
  )
44
44
  })
45
45
 
46
- test('listAction lists managers', async () => {
46
+ it('listAction lists managers', async () => {
47
47
  const result = await listAction({ limit: '12' })
48
48
 
49
49
  expect(mockListManagers).toHaveBeenCalledWith('ws-1', { limit: 12 })