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,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 { DiscordBotClient } from './client'
4
4
  import { DiscordBotError } from './types'
@@ -48,19 +48,19 @@ describe('DiscordBotClient', () => {
48
48
  }
49
49
 
50
50
  describe('constructor', () => {
51
- test('requires token', async () => {
51
+ it('requires token', async () => {
52
52
  await expect(new DiscordBotClient().login({ token: '' })).rejects.toThrow(DiscordBotError)
53
53
  await expect(new DiscordBotClient().login({ token: '' })).rejects.toThrow('Token is required')
54
54
  })
55
55
 
56
- test('accepts valid token', async () => {
56
+ it('accepts valid token', async () => {
57
57
  const client = await new DiscordBotClient().login({ token: 'bot-test-token' })
58
58
  expect(client).toBeInstanceOf(DiscordBotClient)
59
59
  })
60
60
  })
61
61
 
62
62
  describe('testAuth', () => {
63
- test('returns current user and uses Bot auth header', async () => {
63
+ it('returns current user and uses Bot auth header', async () => {
64
64
  mockResponse({
65
65
  id: '123456789',
66
66
  username: 'testbot',
@@ -81,7 +81,7 @@ describe('DiscordBotClient', () => {
81
81
  expect(headers['User-Agent']).toContain('DiscordBot')
82
82
  })
83
83
 
84
- test('throws DiscordBotError on API error', async () => {
84
+ it('throws DiscordBotError on API error', async () => {
85
85
  mockResponse({ message: 'Unauthorized', code: 401 }, 401)
86
86
 
87
87
  const client = await new DiscordBotClient().login({ token: 'bad-token' })
@@ -90,7 +90,7 @@ describe('DiscordBotClient', () => {
90
90
  })
91
91
 
92
92
  describe('listGuilds', () => {
93
- test('returns list of guilds', async () => {
93
+ it('returns list of guilds', async () => {
94
94
  mockResponse([
95
95
  { id: '111', name: 'Guild One' },
96
96
  { id: '222', name: 'Guild Two' },
@@ -106,7 +106,7 @@ describe('DiscordBotClient', () => {
106
106
  })
107
107
 
108
108
  describe('getGuild', () => {
109
- test('returns guild info', async () => {
109
+ it('returns guild info', async () => {
110
110
  mockResponse({ id: '111', name: 'Test Guild' })
111
111
 
112
112
  const client = await new DiscordBotClient().login({ token: 'bot-token' })
@@ -119,7 +119,7 @@ describe('DiscordBotClient', () => {
119
119
  })
120
120
 
121
121
  describe('listChannels', () => {
122
- test('returns channels for guild', async () => {
122
+ it('returns channels for guild', async () => {
123
123
  mockResponse([
124
124
  { id: 'ch1', guild_id: '111', name: 'general', type: 0 },
125
125
  { id: 'ch2', guild_id: '111', name: 'random', type: 0 },
@@ -135,7 +135,7 @@ describe('DiscordBotClient', () => {
135
135
  })
136
136
 
137
137
  describe('sendMessage', () => {
138
- test('sends message to channel', async () => {
138
+ it('sends message to channel', async () => {
139
139
  mockResponse({
140
140
  id: 'msg1',
141
141
  channel_id: 'ch1',
@@ -153,7 +153,7 @@ describe('DiscordBotClient', () => {
153
153
  expect(fetchCalls[0].options?.body).toBe(JSON.stringify({ content: 'Hello world' }))
154
154
  })
155
155
 
156
- test('includes thread_id when provided', async () => {
156
+ it('includes thread_id when provided', async () => {
157
157
  mockResponse({
158
158
  id: 'msg1',
159
159
  channel_id: 'ch1',
@@ -170,7 +170,7 @@ describe('DiscordBotClient', () => {
170
170
  })
171
171
 
172
172
  describe('editMessage', () => {
173
- test('edits message with PATCH', async () => {
173
+ it('edits message with PATCH', async () => {
174
174
  mockResponse({
175
175
  id: 'msg1',
176
176
  channel_id: 'ch1',
@@ -191,7 +191,7 @@ describe('DiscordBotClient', () => {
191
191
  })
192
192
 
193
193
  describe('deleteMessage', () => {
194
- test('deletes message and returns void', async () => {
194
+ it('deletes message and returns void', async () => {
195
195
  mockResponse(null, 204)
196
196
 
197
197
  const client = await new DiscordBotClient().login({ token: 'bot-token' })
@@ -204,7 +204,7 @@ describe('DiscordBotClient', () => {
204
204
  })
205
205
 
206
206
  describe('addReaction', () => {
207
- test('adds reaction with encoded emoji', async () => {
207
+ it('adds reaction with encoded emoji', async () => {
208
208
  mockResponse(null, 204)
209
209
 
210
210
  const client = await new DiscordBotClient().login({ token: 'bot-token' })
@@ -218,7 +218,7 @@ describe('DiscordBotClient', () => {
218
218
  })
219
219
 
220
220
  describe('removeReaction', () => {
221
- test('removes reaction with DELETE', async () => {
221
+ it('removes reaction with DELETE', async () => {
222
222
  mockResponse(null, 204)
223
223
 
224
224
  const client = await new DiscordBotClient().login({ token: 'bot-token' })
@@ -232,7 +232,7 @@ describe('DiscordBotClient', () => {
232
232
  })
233
233
 
234
234
  describe('listUsers', () => {
235
- test('maps guild members to users', async () => {
235
+ it('maps guild members to users', async () => {
236
236
  mockResponse([{ user: { id: 'u1', username: 'user1' } }, { user: { id: 'u2', username: 'user2' } }])
237
237
 
238
238
  const client = await new DiscordBotClient().login({ token: 'bot-token' })
@@ -245,7 +245,7 @@ describe('DiscordBotClient', () => {
245
245
  })
246
246
 
247
247
  describe('getUser', () => {
248
- test('returns user info', async () => {
248
+ it('returns user info', async () => {
249
249
  mockResponse({ id: 'u1', username: 'testuser' })
250
250
 
251
251
  const client = await new DiscordBotClient().login({ token: 'bot-token' })
@@ -258,7 +258,7 @@ describe('DiscordBotClient', () => {
258
258
  })
259
259
 
260
260
  describe('uploadFile', () => {
261
- test('uploads file to channel', async () => {
261
+ it('uploads file to channel', async () => {
262
262
  const { tmpdir } = await import('node:os')
263
263
  const { join } = await import('node:path')
264
264
  const tempFile = join(tmpdir(), 'test-discordbot-upload.txt')
@@ -293,7 +293,7 @@ describe('DiscordBotClient', () => {
293
293
  })
294
294
 
295
295
  describe('listFiles', () => {
296
- test('returns files from recent messages', async () => {
296
+ it('returns files from recent messages', async () => {
297
297
  mockResponse([
298
298
  {
299
299
  id: 'msg1',
@@ -322,7 +322,7 @@ describe('DiscordBotClient', () => {
322
322
  })
323
323
 
324
324
  describe('createThread', () => {
325
- test('creates thread in channel', async () => {
325
+ it('creates thread in channel', async () => {
326
326
  mockResponse({
327
327
  id: 'thread1',
328
328
  guild_id: '111',
@@ -342,7 +342,7 @@ describe('DiscordBotClient', () => {
342
342
  })
343
343
 
344
344
  describe('archiveThread', () => {
345
- test('archives thread with PATCH', async () => {
345
+ it('archives thread with PATCH', async () => {
346
346
  mockResponse({
347
347
  id: 'thread1',
348
348
  guild_id: '111',
@@ -361,7 +361,7 @@ describe('DiscordBotClient', () => {
361
361
  })
362
362
 
363
363
  describe('resolveChannel', () => {
364
- test('returns channel ID directly if all digits', async () => {
364
+ it('returns channel ID directly if all digits', async () => {
365
365
  const client = await new DiscordBotClient().login({ token: 'bot-token' })
366
366
  const id = await client.resolveChannel('111', '123456789')
367
367
 
@@ -369,7 +369,7 @@ describe('DiscordBotClient', () => {
369
369
  expect(fetchCalls.length).toBe(0)
370
370
  })
371
371
 
372
- test('looks up channel by name', async () => {
372
+ it('looks up channel by name', async () => {
373
373
  mockResponse([
374
374
  { id: 'ch1', guild_id: '111', name: 'general', type: 0 },
375
375
  { id: 'ch2', guild_id: '111', name: 'random', type: 0 },
@@ -381,7 +381,7 @@ describe('DiscordBotClient', () => {
381
381
  expect(id).toBe('ch2')
382
382
  })
383
383
 
384
- test('strips # prefix when looking up by name', async () => {
384
+ it('strips # prefix when looking up by name', async () => {
385
385
  mockResponse([{ id: 'ch1', guild_id: '111', name: 'general', type: 0 }])
386
386
 
387
387
  const client = await new DiscordBotClient().login({ token: 'bot-token' })
@@ -390,7 +390,7 @@ describe('DiscordBotClient', () => {
390
390
  expect(id).toBe('ch1')
391
391
  })
392
392
 
393
- test('throws when channel name not found', async () => {
393
+ it('throws when channel name not found', async () => {
394
394
  mockResponse([{ id: 'ch1', guild_id: '111', name: 'general', type: 0 }])
395
395
 
396
396
  const client = await new DiscordBotClient().login({ token: 'bot-token' })
@@ -406,7 +406,7 @@ describe('DiscordBotClient', () => {
406
406
  })
407
407
 
408
408
  describe('rate limiting', () => {
409
- test('waits when bucket is exhausted', async () => {
409
+ it('waits when bucket is exhausted', async () => {
410
410
  mockResponse({ id: '1', username: 'bot' }, 200, {
411
411
  'X-RateLimit-Remaining': '0',
412
412
  'X-RateLimit-Reset': String(Date.now() / 1000 + 0.1),
@@ -429,7 +429,7 @@ describe('DiscordBotClient', () => {
429
429
  expect(fetchCalls.length).toBe(2)
430
430
  })
431
431
 
432
- test('retries on 429 with Retry-After header', async () => {
432
+ it('retries on 429 with Retry-After header', async () => {
433
433
  mockResponse({ message: 'Rate limited', retry_after: 0.1 }, 429, { 'Retry-After': '0.1' })
434
434
  mockResponse({ id: '123', username: 'bot' })
435
435
 
@@ -440,7 +440,7 @@ describe('DiscordBotClient', () => {
440
440
  expect(fetchCalls.length).toBe(2)
441
441
  })
442
442
 
443
- test('handles global rate limit', async () => {
443
+ it('handles global rate limit', async () => {
444
444
  mockResponse({ message: 'Global rate limited', global: true }, 429, {
445
445
  'Retry-After': '0.1',
446
446
  'X-RateLimit-Global': 'true',
@@ -454,7 +454,7 @@ describe('DiscordBotClient', () => {
454
454
  expect(fetchCalls.length).toBe(2)
455
455
  })
456
456
 
457
- test('throws after max retries exceeded', async () => {
457
+ it('throws after max retries exceeded', async () => {
458
458
  for (let i = 0; i <= 3; i++) {
459
459
  mockResponse({ message: 'Rate limited' }, 429, { 'Retry-After': '0.01' })
460
460
  }
@@ -466,7 +466,7 @@ describe('DiscordBotClient', () => {
466
466
  })
467
467
 
468
468
  describe('retry logic', () => {
469
- test('retries on 500 server error', async () => {
469
+ it('retries on 500 server error', async () => {
470
470
  mockResponse({ message: 'Internal Server Error' }, 500)
471
471
  mockResponse({ id: '123', username: 'bot' })
472
472
 
@@ -477,7 +477,7 @@ describe('DiscordBotClient', () => {
477
477
  expect(fetchCalls.length).toBe(2)
478
478
  })
479
479
 
480
- test('does not retry on 4xx client errors (except 429)', async () => {
480
+ it('does not retry on 4xx client errors (except 429)', async () => {
481
481
  mockResponse({ message: 'Not Found' }, 404)
482
482
 
483
483
  const client = await new DiscordBotClient().login({ token: 'bot-token' })
@@ -485,7 +485,7 @@ describe('DiscordBotClient', () => {
485
485
  expect(fetchCalls.length).toBe(1)
486
486
  })
487
487
 
488
- test('exponential backoff increases delay', async () => {
488
+ it('exponential backoff increases delay', async () => {
489
489
  mockResponse({ message: 'Error' }, 500)
490
490
  mockResponse({ message: 'Error' }, 500)
491
491
  mockResponse({ id: '123', username: 'bot' })
@@ -1,4 +1,4 @@
1
- import { afterEach, beforeEach, describe, expect, mock, test } from 'bun:test'
1
+ import { afterEach, beforeEach, describe, expect, mock, it } from 'bun:test'
2
2
  import { existsSync, rmSync } from 'node:fs'
3
3
  import { mkdir } from 'node:fs/promises'
4
4
  import { tmpdir } from 'node:os'
@@ -55,7 +55,7 @@ describe('auth commands', () => {
55
55
  })
56
56
 
57
57
  describe('setAction', () => {
58
- test('validates and stores bot token with default bot_id from auth', async () => {
58
+ it('validates and stores bot token with default bot_id from auth', async () => {
59
59
  const manager = new DiscordBotCredentialManager(tempDir)
60
60
 
61
61
  const result = await setAction('token123', { _credManager: manager })
@@ -71,7 +71,7 @@ describe('auth commands', () => {
71
71
  expect(creds?.bot_id).toBe('bot123')
72
72
  })
73
73
 
74
- test('uses --bot flag as bot_id', async () => {
74
+ it('uses --bot flag as bot_id', async () => {
75
75
  const manager = new DiscordBotCredentialManager(tempDir)
76
76
 
77
77
  const result = await setAction('token123', { bot: 'mybot', _credManager: manager })
@@ -81,7 +81,7 @@ describe('auth commands', () => {
81
81
  expect(creds?.token).toBe('token123')
82
82
  })
83
83
 
84
- test('rejects user tokens (bot: false)', async () => {
84
+ it('rejects user tokens (bot: false)', async () => {
85
85
  mockTestAuth.mockImplementationOnce(() =>
86
86
  Promise.resolve({
87
87
  id: 'user123',
@@ -98,7 +98,7 @@ describe('auth commands', () => {
98
98
  expect(result.error).toContain('not a bot token')
99
99
  })
100
100
 
101
- test('rejects user tokens (bot: undefined)', async () => {
101
+ it('rejects user tokens (bot: undefined)', async () => {
102
102
  mockTestAuth.mockImplementationOnce(() =>
103
103
  Promise.resolve({
104
104
  id: 'user123',
@@ -114,7 +114,7 @@ describe('auth commands', () => {
114
114
  expect(result.error).toContain('not a bot token')
115
115
  })
116
116
 
117
- test('handles client errors', async () => {
117
+ it('handles client errors', async () => {
118
118
  mockTestAuth.mockImplementationOnce(() => Promise.reject(new Error('Invalid token')))
119
119
 
120
120
  const manager = new DiscordBotCredentialManager(tempDir)
@@ -127,7 +127,7 @@ describe('auth commands', () => {
127
127
  })
128
128
 
129
129
  describe('clearAction', () => {
130
- test('removes all stored credentials', async () => {
130
+ it('removes all stored credentials', async () => {
131
131
  const manager = new DiscordBotCredentialManager(tempDir)
132
132
  await manager.setCredentials({
133
133
  token: 'token123',
@@ -143,7 +143,7 @@ describe('auth commands', () => {
143
143
  })
144
144
 
145
145
  describe('statusAction', () => {
146
- test('returns no credentials when none set', async () => {
146
+ it('returns no credentials when none set', async () => {
147
147
  const manager = new DiscordBotCredentialManager(tempDir)
148
148
 
149
149
  const result = await statusAction({ _credManager: manager })
@@ -152,7 +152,7 @@ describe('auth commands', () => {
152
152
  expect(result.error).toBeDefined()
153
153
  })
154
154
 
155
- test('returns valid status for current bot', async () => {
155
+ it('returns valid status for current bot', async () => {
156
156
  const manager = new DiscordBotCredentialManager(tempDir)
157
157
  await manager.setCredentials({
158
158
  token: 'token123',
@@ -169,7 +169,7 @@ describe('auth commands', () => {
169
169
  expect(result.bot_name).toBe('testbot')
170
170
  })
171
171
 
172
- test('returns status for specific --bot', async () => {
172
+ it('returns status for specific --bot', async () => {
173
173
  const manager = new DiscordBotCredentialManager(tempDir)
174
174
  await manager.setCredentials({
175
175
  token: 'token1',
@@ -188,7 +188,7 @@ describe('auth commands', () => {
188
188
  expect(result.bot_id).toBe('bot123')
189
189
  })
190
190
 
191
- test('returns invalid when token test fails', async () => {
191
+ it('returns invalid when token test fails', async () => {
192
192
  mockTestAuth.mockImplementationOnce(() => Promise.reject(new Error('Unauthorized')))
193
193
 
194
194
  const manager = new DiscordBotCredentialManager(tempDir)
@@ -203,7 +203,7 @@ describe('auth commands', () => {
203
203
  expect(result.valid).toBe(false)
204
204
  })
205
205
 
206
- test('returns invalid when bot field is false', async () => {
206
+ it('returns invalid when bot field is false', async () => {
207
207
  mockTestAuth.mockImplementationOnce(() =>
208
208
  Promise.resolve({
209
209
  id: 'user123',
@@ -226,7 +226,7 @@ describe('auth commands', () => {
226
226
  })
227
227
 
228
228
  describe('listAction', () => {
229
- test('returns all stored bots', async () => {
229
+ it('returns all stored bots', async () => {
230
230
  const manager = new DiscordBotCredentialManager(tempDir)
231
231
  await manager.setCredentials({
232
232
  token: 'token1',
@@ -245,7 +245,7 @@ describe('auth commands', () => {
245
245
  expect(result.bots?.find((b) => b.bot_id === 'bot2')?.is_current).toBe(true)
246
246
  })
247
247
 
248
- test('returns empty list when no bots stored', async () => {
248
+ it('returns empty list when no bots stored', async () => {
249
249
  const manager = new DiscordBotCredentialManager(tempDir)
250
250
 
251
251
  const result = await listAction({ _credManager: manager })
@@ -255,7 +255,7 @@ describe('auth commands', () => {
255
255
  })
256
256
 
257
257
  describe('useAction', () => {
258
- test('switches current bot', async () => {
258
+ it('switches current bot', async () => {
259
259
  const manager = new DiscordBotCredentialManager(tempDir)
260
260
  await manager.setCredentials({
261
261
  token: 'token1',
@@ -274,7 +274,7 @@ describe('auth commands', () => {
274
274
  expect(result.bot_id).toBe('bot1')
275
275
  })
276
276
 
277
- test('returns error for unknown bot', async () => {
277
+ it('returns error for unknown bot', async () => {
278
278
  const manager = new DiscordBotCredentialManager(tempDir)
279
279
 
280
280
  const result = await useAction('nonexistent', { _credManager: manager })
@@ -284,7 +284,7 @@ describe('auth commands', () => {
284
284
  })
285
285
 
286
286
  describe('removeAction', () => {
287
- test('removes a stored bot', async () => {
287
+ it('removes a stored bot', async () => {
288
288
  const manager = new DiscordBotCredentialManager(tempDir)
289
289
  await manager.setCredentials({
290
290
  token: 'token1',
@@ -298,7 +298,7 @@ describe('auth commands', () => {
298
298
  expect(await manager.getCredentials('bot1')).toBeNull()
299
299
  })
300
300
 
301
- test('returns error for unknown bot', async () => {
301
+ it('returns error for unknown bot', async () => {
302
302
  const manager = new DiscordBotCredentialManager(tempDir)
303
303
 
304
304
  const result = await removeAction('nonexistent', { _credManager: manager })
@@ -1,4 +1,4 @@
1
- import { afterEach, beforeEach, describe, expect, mock, test } from 'bun:test'
1
+ import { afterEach, beforeEach, describe, expect, mock, it } from 'bun:test'
2
2
  import { existsSync, rmSync } from 'node:fs'
3
3
  import { mkdir } from 'node:fs/promises'
4
4
  import { tmpdir } from 'node:os'
@@ -66,7 +66,7 @@ describe('channel commands', () => {
66
66
  })
67
67
 
68
68
  describe('listAction', () => {
69
- test('lists text channels from current server', async () => {
69
+ it('lists text channels from current server', async () => {
70
70
  const manager = new DiscordBotCredentialManager(tempDir)
71
71
  await manager.setCredentials({
72
72
  token: 'token123',
@@ -90,7 +90,7 @@ describe('channel commands', () => {
90
90
  })
91
91
  })
92
92
 
93
- test('filters out non-text channels', async () => {
93
+ it('filters out non-text channels', async () => {
94
94
  const manager = new DiscordBotCredentialManager(tempDir)
95
95
  await manager.setCredentials({
96
96
  token: 'token123',
@@ -105,7 +105,7 @@ describe('channel commands', () => {
105
105
  expect(hasVoiceChannel).toBe(false)
106
106
  })
107
107
 
108
- test('returns error when no server set', async () => {
108
+ it('returns error when no server set', async () => {
109
109
  const manager = new DiscordBotCredentialManager(tempDir)
110
110
  await manager.setCredentials({
111
111
  token: 'token123',
@@ -119,7 +119,7 @@ describe('channel commands', () => {
119
119
  expect(result.error).toContain('No server set')
120
120
  })
121
121
 
122
- test('handles client errors', async () => {
122
+ it('handles client errors', async () => {
123
123
  mockListChannels.mockImplementationOnce(() => Promise.reject(new Error('API Error')))
124
124
 
125
125
  const manager = new DiscordBotCredentialManager(tempDir)
@@ -138,7 +138,7 @@ describe('channel commands', () => {
138
138
  })
139
139
 
140
140
  describe('infoAction', () => {
141
- test('returns channel info by ID', async () => {
141
+ it('returns channel info by ID', async () => {
142
142
  const manager = new DiscordBotCredentialManager(tempDir)
143
143
  await manager.setCredentials({
144
144
  token: 'token123',
@@ -156,7 +156,7 @@ describe('channel commands', () => {
156
156
  expect(result.guild_id).toBe('guild1')
157
157
  })
158
158
 
159
- test('resolves channel by name', async () => {
159
+ it('resolves channel by name', async () => {
160
160
  const manager = new DiscordBotCredentialManager(tempDir)
161
161
  await manager.setCredentials({
162
162
  token: 'token123',
@@ -171,7 +171,7 @@ describe('channel commands', () => {
171
171
  expect(result.name).toBe('general')
172
172
  })
173
173
 
174
- test('resolves channel by name with hash prefix', async () => {
174
+ it('resolves channel by name with hash prefix', async () => {
175
175
  const manager = new DiscordBotCredentialManager(tempDir)
176
176
  await manager.setCredentials({
177
177
  token: 'token123',
@@ -186,7 +186,7 @@ describe('channel commands', () => {
186
186
  expect(result.name).toBe('announcements')
187
187
  })
188
188
 
189
- test('returns error for nonexistent channel', async () => {
189
+ it('returns error for nonexistent channel', async () => {
190
190
  const manager = new DiscordBotCredentialManager(tempDir)
191
191
  await manager.setCredentials({
192
192
  token: 'token123',
@@ -201,7 +201,7 @@ describe('channel commands', () => {
201
201
  expect(result.error).toContain('Channel not found')
202
202
  })
203
203
 
204
- test('returns error when no server set', async () => {
204
+ it('returns error when no server set', async () => {
205
205
  const manager = new DiscordBotCredentialManager(tempDir)
206
206
  await manager.setCredentials({
207
207
  token: 'token123',
@@ -215,7 +215,7 @@ describe('channel commands', () => {
215
215
  expect(result.error).toContain('No server set')
216
216
  })
217
217
 
218
- test('handles client errors', async () => {
218
+ it('handles client errors', async () => {
219
219
  mockGetChannel.mockImplementationOnce(() => Promise.reject(new Error('Channel not found')))
220
220
 
221
221
  const manager = new DiscordBotCredentialManager(tempDir)
@@ -71,7 +71,7 @@ describe('file commands', () => {
71
71
  })
72
72
 
73
73
  describe('uploadAction', () => {
74
- it('should upload file successfully', async () => {
74
+ it('uploads file successfully', async () => {
75
75
  const result = await uploadAction('general', './test.txt', {
76
76
  ...options,
77
77
  _credManager: mockCredManager,
@@ -80,12 +80,12 @@ describe('file commands', () => {
80
80
  expect(result).toBeDefined()
81
81
  })
82
82
 
83
- it('should return error when channel resolution fails', async () => {
83
+ it('returns error when channel resolution fails', async () => {
84
84
  const result = await uploadAction('nonexistent', './test.txt', options)
85
85
  expect(result.error).toBeDefined()
86
86
  })
87
87
 
88
- it('should return error when file does not exist', async () => {
88
+ it('returns error when file does not exist', async () => {
89
89
  const result = await uploadAction('general', '/nonexistent/file.txt', {
90
90
  ...options,
91
91
  _credManager: mockCredManager,
@@ -95,7 +95,7 @@ describe('file commands', () => {
95
95
  })
96
96
 
97
97
  describe('listAction', () => {
98
- it('should list files successfully', async () => {
98
+ it('lists files successfully', async () => {
99
99
  const result = await listAction('general', {
100
100
  ...options,
101
101
  _credManager: mockCredManager,
@@ -104,14 +104,14 @@ describe('file commands', () => {
104
104
  expect(result).toBeDefined()
105
105
  })
106
106
 
107
- it('should return error when channel resolution fails', async () => {
107
+ it('returns error when channel resolution fails', async () => {
108
108
  const result = await listAction('nonexistent', options)
109
109
  expect(result.error).toBeDefined()
110
110
  })
111
111
  })
112
112
 
113
113
  describe('action result structure', () => {
114
- it('uploadAction should return success result with file info', async () => {
114
+ it('returns success result with file info for uploadAction', async () => {
115
115
  const result = await uploadAction('general', './test.txt', {
116
116
  ...options,
117
117
  _credManager: mockCredManager,
@@ -129,7 +129,7 @@ describe('file commands', () => {
129
129
  }
130
130
  })
131
131
 
132
- it('listAction should return success result with files array', async () => {
132
+ it('returns success result with files array for listAction', async () => {
133
133
  const result = await listAction('general', {
134
134
  ...options,
135
135
  _credManager: mockCredManager,